| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_condit
ion_attribute.h" | 5 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_condit
ion_attribute.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/file_path.h" | 8 #include "base/file_path.h" |
| 9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
| 10 #include "base/values.h" | 10 #include "base/values.h" |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 291 return dictionary.Pass(); | 291 return dictionary.Pass(); |
| 292 } | 292 } |
| 293 | 293 |
| 294 // Returns whether the response headers from |url_request| satisfy the match | 294 // Returns whether the response headers from |url_request| satisfy the match |
| 295 // criteria given in |tests|. For at least one |i| all tests from |tests[i]| | 295 // criteria given in |tests|. For at least one |i| all tests from |tests[i]| |
| 296 // must pass. If |positive_test| is true, the dictionary is interpreted as the | 296 // must pass. If |positive_test| is true, the dictionary is interpreted as the |
| 297 // containsHeaders property of a RequestMatcher, otherwise as | 297 // containsHeaders property of a RequestMatcher, otherwise as |
| 298 // doesNotContainHeaders. | 298 // doesNotContainHeaders. |
| 299 void MatchAndCheck(const std::vector< std::vector<const std::string*> >& tests, | 299 void MatchAndCheck(const std::vector< std::vector<const std::string*> >& tests, |
| 300 const std::string& key, | 300 const std::string& key, |
| 301 RequestStage stage, |
| 301 net::URLRequest* url_request, | 302 net::URLRequest* url_request, |
| 302 bool* result) { | 303 bool* result) { |
| 303 ListValue contains_headers; | 304 ListValue contains_headers; |
| 304 for (size_t i = 0; i < tests.size(); ++i) { | 305 for (size_t i = 0; i < tests.size(); ++i) { |
| 305 scoped_ptr<DictionaryValue> temp(GetDictionaryFromArray(tests[i])); | 306 scoped_ptr<DictionaryValue> temp(GetDictionaryFromArray(tests[i])); |
| 306 ASSERT_TRUE(temp.get() != NULL); | 307 ASSERT_TRUE(temp.get() != NULL); |
| 307 contains_headers.Append(temp.release()); | 308 contains_headers.Append(temp.release()); |
| 308 } | 309 } |
| 309 | 310 |
| 310 std::string error; | 311 std::string error; |
| 311 scoped_ptr<WebRequestConditionAttribute> attribute = | 312 scoped_ptr<WebRequestConditionAttribute> attribute = |
| 312 WebRequestConditionAttribute::Create(key, &contains_headers, &error); | 313 WebRequestConditionAttribute::Create(key, &contains_headers, &error); |
| 313 ASSERT_EQ("", error); | 314 ASSERT_EQ("", error); |
| 314 ASSERT_TRUE(attribute.get() != NULL); | 315 ASSERT_TRUE(attribute.get() != NULL); |
| 315 | 316 |
| 316 *result = attribute->IsFulfilled(WebRequestRule::RequestData( | 317 *result = attribute->IsFulfilled(WebRequestRule::RequestData( |
| 317 url_request, ON_HEADERS_RECEIVED, url_request->response_headers())); | 318 url_request, stage, url_request->response_headers())); |
| 318 } | 319 } |
| 319 | 320 |
| 320 } // namespace | 321 } // namespace |
| 321 | 322 |
| 323 // Here we test WebRequestConditionAttributeRequestHeaders for matching |
| 324 // correctly against request headers. This test is not as extensive as |
| 325 // "ResponseHeaders" (below), because the header-matching code is shared |
| 326 // by both types of condition attributes, so it is enough to test it once. |
| 327 TEST(WebRequestConditionAttributeTest, RequestHeaders) { |
| 328 // Necessary for TestURLRequest. |
| 329 MessageLoop message_loop(MessageLoop::TYPE_IO); |
| 330 |
| 331 TestURLRequestContext context; |
| 332 TestDelegate delegate; |
| 333 TestURLRequest url_request(GURL("http://example.com"), // Dummy URL. |
| 334 &delegate, &context); |
| 335 url_request.SetExtraRequestHeaderByName( |
| 336 "Custom-header", "custom/value", true /* overwrite */); |
| 337 url_request.Start(); |
| 338 MessageLoop::current()->Run(); |
| 339 |
| 340 std::vector<std::vector<const std::string*> > tests; |
| 341 bool result = false; |
| 342 |
| 343 const RequestStage stage = ON_BEFORE_SEND_HEADERS; |
| 344 |
| 345 // First set of test data -- passing conjunction. |
| 346 const std::string kPassingCondition[] = { |
| 347 keys::kNameContainsKey, "CuStOm", // Header names are case insensitive. |
| 348 keys::kNameEqualsKey, "custom-header", |
| 349 keys::kValueSuffixKey, "alue", |
| 350 keys::kValuePrefixKey, "custom/value" |
| 351 }; |
| 352 const size_t kPassingConditionSizes[] = { arraysize(kPassingCondition) }; |
| 353 GetArrayAsVector(kPassingCondition, kPassingConditionSizes, 1u, &tests); |
| 354 // Positive filter, passing (conjunction of tests). |
| 355 MatchAndCheck(tests, keys::kRequestHeadersKey, stage, &url_request, &result); |
| 356 EXPECT_TRUE(result); |
| 357 // Negative filter, failing (conjunction of tests). |
| 358 MatchAndCheck( |
| 359 tests, keys::kExcludeRequestHeadersKey, stage, &url_request, &result); |
| 360 EXPECT_FALSE(result); |
| 361 |
| 362 // Second set of test data -- failing disjunction. |
| 363 const std::string kFailCondition[] = { |
| 364 keys::kNameSuffixKey, "Custom", // Test 1. |
| 365 keys::kNameEqualsKey, "ustom-valu", // Test 2. |
| 366 keys::kValuePrefixKey, "custom ", // Test 3. |
| 367 keys::kValueContainsKey, " value" // Test 4. |
| 368 }; |
| 369 const size_t kFailConditionSizes[] = { 2u, 2u, 2u, 2u }; |
| 370 GetArrayAsVector(kFailCondition, kFailConditionSizes, 4u, &tests); |
| 371 // Positive filter, failing (disjunction of tests). |
| 372 MatchAndCheck(tests, keys::kRequestHeadersKey, stage, &url_request, &result); |
| 373 EXPECT_FALSE(result); |
| 374 // Negative filter, passing (disjunction of tests). |
| 375 MatchAndCheck( |
| 376 tests, keys::kExcludeRequestHeadersKey, stage, &url_request, &result); |
| 377 EXPECT_TRUE(result); |
| 378 |
| 379 // Third set of test data, corner case -- empty disjunction. |
| 380 GetArrayAsVector(NULL, NULL, 0u, &tests); |
| 381 // Positive filter, failing (no test to pass). |
| 382 MatchAndCheck(tests, keys::kRequestHeadersKey, stage, &url_request, &result); |
| 383 EXPECT_FALSE(result); |
| 384 // Negative filter, passing (no test to fail). |
| 385 MatchAndCheck( |
| 386 tests, keys::kExcludeRequestHeadersKey, stage, &url_request, &result); |
| 387 EXPECT_TRUE(result); |
| 388 |
| 389 // Fourth set of test data, corner case -- empty conjunction. |
| 390 const size_t kEmptyConjunctionSizes[] = { 0u }; |
| 391 GetArrayAsVector(NULL, kEmptyConjunctionSizes, 1u, &tests); |
| 392 // Positive filter, passing (trivial test). |
| 393 MatchAndCheck(tests, keys::kRequestHeadersKey, stage, &url_request, &result); |
| 394 EXPECT_TRUE(result); |
| 395 // Negative filter, failing. |
| 396 MatchAndCheck( |
| 397 tests, keys::kExcludeRequestHeadersKey, stage, &url_request, &result); |
| 398 EXPECT_FALSE(result); |
| 399 } |
| 400 |
| 322 // Here we test WebRequestConditionAttributeResponseHeaders for: | 401 // Here we test WebRequestConditionAttributeResponseHeaders for: |
| 323 // 1. Correct implementation of prefix/suffix/contains/equals matching. | 402 // 1. Correct implementation of prefix/suffix/contains/equals matching. |
| 324 // 2. Performing logical disjunction (||) between multiple specifications. | 403 // 2. Performing logical disjunction (||) between multiple specifications. |
| 325 // 3. Negating the match in case of 'doesNotContainHeaders'. | 404 // 3. Negating the match in case of 'doesNotContainHeaders'. |
| 326 TEST(WebRequestConditionAttributeTest, Headers) { | 405 TEST(WebRequestConditionAttributeTest, ResponseHeaders) { |
| 327 // Necessary for TestURLRequest. | 406 // Necessary for TestURLRequest. |
| 328 MessageLoop message_loop(MessageLoop::TYPE_IO); | 407 MessageLoop message_loop(MessageLoop::TYPE_IO); |
| 329 | 408 |
| 330 net::TestServer test_server( | 409 net::TestServer test_server( |
| 331 net::TestServer::TYPE_HTTP, | 410 net::TestServer::TYPE_HTTP, |
| 332 net::TestServer::kLocalhost, | 411 net::TestServer::kLocalhost, |
| 333 FilePath(FILE_PATH_LITERAL( | 412 FilePath(FILE_PATH_LITERAL( |
| 334 "chrome/test/data/extensions/api_test/webrequest/declarative"))); | 413 "chrome/test/data/extensions/api_test/webrequest/declarative"))); |
| 335 ASSERT_TRUE(test_server.Start()); | 414 ASSERT_TRUE(test_server.Start()); |
| 336 | 415 |
| 337 TestURLRequestContext context; | 416 TestURLRequestContext context; |
| 338 TestDelegate delegate; | 417 TestDelegate delegate; |
| 339 TestURLRequest url_request(test_server.GetURL("files/headers.html"), | 418 TestURLRequest url_request(test_server.GetURL("files/headers.html"), |
| 340 &delegate, &context); | 419 &delegate, &context); |
| 341 url_request.Start(); | 420 url_request.Start(); |
| 342 MessageLoop::current()->Run(); | 421 MessageLoop::current()->Run(); |
| 343 | 422 |
| 344 // In all the tests below we assume that the server includes the headers | 423 // In all the tests below we assume that the server includes the headers |
| 345 // Custom-Header: custom/value | 424 // Custom-Header: custom/value |
| 346 // Custom-Header-B: valueA | 425 // Custom-Header-B: valueA |
| 347 // Custom-Header-B: valueB | 426 // Custom-Header-B: valueB |
| 348 // Custom-Header-C: valueC, valueD | 427 // Custom-Header-C: valueC, valueD |
| 349 // Custom-Header-D: | 428 // Custom-Header-D: |
| 350 // in the response, but does not include "Non-existing: void". | 429 // in the response, but does not include "Non-existing: void". |
| 351 | 430 |
| 352 std::vector< std::vector<const std::string*> > tests; | 431 std::vector< std::vector<const std::string*> > tests; |
| 353 bool result; | 432 bool result; |
| 354 | 433 |
| 434 const RequestStage stage = ON_HEADERS_RECEIVED; |
| 435 |
| 355 // 1.a. -- All these tests should pass. | 436 // 1.a. -- All these tests should pass. |
| 356 const std::string kPassingCondition[] = { | 437 const std::string kPassingCondition[] = { |
| 357 keys::kNamePrefixKey, "Custom", | 438 keys::kNamePrefixKey, "Custom", |
| 358 keys::kNameSuffixKey, "m-header", // Header names are case insensitive. | 439 keys::kNameSuffixKey, "m-header", // Header names are case insensitive. |
| 359 keys::kValueContainsKey, "alu", | 440 keys::kValueContainsKey, "alu", |
| 360 keys::kValueEqualsKey, "custom/value" | 441 keys::kValueEqualsKey, "custom/value" |
| 361 }; | 442 }; |
| 362 const size_t kPassingConditionSizes[] = { arraysize(kPassingCondition) }; | 443 const size_t kPassingConditionSizes[] = { arraysize(kPassingCondition) }; |
| 363 GetArrayAsVector(kPassingCondition, kPassingConditionSizes, 1u, &tests); | 444 GetArrayAsVector(kPassingCondition, kPassingConditionSizes, 1u, &tests); |
| 364 MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); | 445 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); |
| 365 EXPECT_TRUE(result); | 446 EXPECT_TRUE(result); |
| 366 | 447 |
| 367 // 1.b. -- None of the following tests in the discjunction should pass. | 448 // 1.b. -- None of the following tests in the discjunction should pass. |
| 368 const std::string kFailCondition[] = { | 449 const std::string kFailCondition[] = { |
| 369 keys::kNamePrefixKey, " Custom", // Test 1. | 450 keys::kNamePrefixKey, " Custom", // Test 1. |
| 370 keys::kNameContainsKey, " -", // Test 2. | 451 keys::kNameContainsKey, " -", // Test 2. |
| 371 keys::kValueSuffixKey, "alu", // Test 3. | 452 keys::kValueSuffixKey, "alu", // Test 3. |
| 372 keys::kValueEqualsKey, "custom" // Test 4. | 453 keys::kValueEqualsKey, "custom" // Test 4. |
| 373 }; | 454 }; |
| 374 const size_t kFailConditionSizes[] = { 2u, 2u, 2u, 2u }; | 455 const size_t kFailConditionSizes[] = { 2u, 2u, 2u, 2u }; |
| 375 GetArrayAsVector(kFailCondition, kFailConditionSizes, 4u, &tests); | 456 GetArrayAsVector(kFailCondition, kFailConditionSizes, 4u, &tests); |
| 376 MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); | 457 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); |
| 377 EXPECT_FALSE(result); | 458 EXPECT_FALSE(result); |
| 378 | 459 |
| 379 // 1.c. -- This should fail (mixing name and value from different headers) | 460 // 1.c. -- This should fail (mixing name and value from different headers) |
| 380 const std::string kMixingCondition[] = { | 461 const std::string kMixingCondition[] = { |
| 381 keys::kNameSuffixKey, "Header-B", | 462 keys::kNameSuffixKey, "Header-B", |
| 382 keys::kValueEqualsKey, "custom/value" | 463 keys::kValueEqualsKey, "custom/value" |
| 383 }; | 464 }; |
| 384 const size_t kMixingConditionSizes[] = { arraysize(kMixingCondition) }; | 465 const size_t kMixingConditionSizes[] = { arraysize(kMixingCondition) }; |
| 385 GetArrayAsVector(kMixingCondition, kMixingConditionSizes, 1u, &tests); | 466 GetArrayAsVector(kMixingCondition, kMixingConditionSizes, 1u, &tests); |
| 386 MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); | 467 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); |
| 387 EXPECT_FALSE(result); | 468 EXPECT_FALSE(result); |
| 388 | 469 |
| 389 // 1.d. -- Test handling multiple values for one header (both should pass). | 470 // 1.d. -- Test handling multiple values for one header (both should pass). |
| 390 const std::string kMoreValues1[] = { | 471 const std::string kMoreValues1[] = { |
| 391 keys::kNameEqualsKey, "Custom-header-b", | 472 keys::kNameEqualsKey, "Custom-header-b", |
| 392 keys::kValueEqualsKey, "valueA" | 473 keys::kValueEqualsKey, "valueA" |
| 393 }; | 474 }; |
| 394 const size_t kMoreValues1Sizes[] = { arraysize(kMoreValues1) }; | 475 const size_t kMoreValues1Sizes[] = { arraysize(kMoreValues1) }; |
| 395 GetArrayAsVector(kMoreValues1, kMoreValues1Sizes, 1u, &tests); | 476 GetArrayAsVector(kMoreValues1, kMoreValues1Sizes, 1u, &tests); |
| 396 MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); | 477 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); |
| 397 EXPECT_TRUE(result); | 478 EXPECT_TRUE(result); |
| 398 const std::string kMoreValues2[] = { | 479 const std::string kMoreValues2[] = { |
| 399 keys::kNameEqualsKey, "Custom-header-b", | 480 keys::kNameEqualsKey, "Custom-header-b", |
| 400 keys::kValueEqualsKey, "valueB" | 481 keys::kValueEqualsKey, "valueB" |
| 401 }; | 482 }; |
| 402 const size_t kMoreValues2Sizes[] = { arraysize(kMoreValues2) }; | 483 const size_t kMoreValues2Sizes[] = { arraysize(kMoreValues2) }; |
| 403 GetArrayAsVector(kMoreValues2, kMoreValues2Sizes, 1u, &tests); | 484 GetArrayAsVector(kMoreValues2, kMoreValues2Sizes, 1u, &tests); |
| 404 MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); | 485 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); |
| 405 EXPECT_TRUE(result); | 486 EXPECT_TRUE(result); |
| 406 | 487 |
| 407 // 1.e. -- This should fail as conjunction but pass as disjunction. | 488 // 1.e. -- This should fail as conjunction but pass as disjunction. |
| 408 const std::string kConflict[] = { | 489 const std::string kConflict[] = { |
| 409 keys::kNameSuffixKey, "Header", // True for some header. | 490 keys::kNameSuffixKey, "Header", // True for some header. |
| 410 keys::kNameContainsKey, "Header-B" // True for a different header. | 491 keys::kNameContainsKey, "Header-B" // True for a different header. |
| 411 }; | 492 }; |
| 412 // First disjunction, no conflict. | 493 // First disjunction, no conflict. |
| 413 const size_t kNoConflictSizes[] = { 2u, 2u }; | 494 const size_t kNoConflictSizes[] = { 2u, 2u }; |
| 414 GetArrayAsVector(kConflict, kNoConflictSizes, 2u, &tests); | 495 GetArrayAsVector(kConflict, kNoConflictSizes, 2u, &tests); |
| 415 MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); | 496 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); |
| 416 EXPECT_TRUE(result); | 497 EXPECT_TRUE(result); |
| 417 // Then conjunction, conflict. | 498 // Then conjunction, conflict. |
| 418 const size_t kConflictSizes[] = { arraysize(kConflict) }; | 499 const size_t kConflictSizes[] = { arraysize(kConflict) }; |
| 419 GetArrayAsVector(kConflict, kConflictSizes, 1u, &tests); | 500 GetArrayAsVector(kConflict, kConflictSizes, 1u, &tests); |
| 420 MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); | 501 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); |
| 421 EXPECT_FALSE(result); | 502 EXPECT_FALSE(result); |
| 422 | 503 |
| 423 // 1.f. -- This should pass, checking for correct treatment of ',' in values. | 504 // 1.f. -- This should pass, checking for correct treatment of ',' in values. |
| 424 const std::string kComma[] = { | 505 const std::string kComma[] = { |
| 425 keys::kNameSuffixKey, "Header-C", | 506 keys::kNameSuffixKey, "Header-C", |
| 426 keys::kValueEqualsKey, "valueC, valueD" | 507 keys::kValueEqualsKey, "valueC, valueD" |
| 427 }; | 508 }; |
| 428 const size_t kCommaSizes[] = { arraysize(kComma) }; | 509 const size_t kCommaSizes[] = { arraysize(kComma) }; |
| 429 GetArrayAsVector(kComma, kCommaSizes, 1u, &tests); | 510 GetArrayAsVector(kComma, kCommaSizes, 1u, &tests); |
| 430 MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); | 511 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); |
| 431 EXPECT_TRUE(result); | 512 EXPECT_TRUE(result); |
| 432 | 513 |
| 433 // 1.g. -- This should pass, empty values are values as well. | 514 // 1.g. -- This should pass, empty values are values as well. |
| 434 const std::string kEmpty[] = { | 515 const std::string kEmpty[] = { |
| 435 keys::kNameEqualsKey, "custom-header-d", | 516 keys::kNameEqualsKey, "custom-header-d", |
| 436 keys::kValueEqualsKey, "" | 517 keys::kValueEqualsKey, "" |
| 437 }; | 518 }; |
| 438 const size_t kEmptySizes[] = { arraysize(kEmpty) }; | 519 const size_t kEmptySizes[] = { arraysize(kEmpty) }; |
| 439 GetArrayAsVector(kEmpty, kEmptySizes, 1u, &tests); | 520 GetArrayAsVector(kEmpty, kEmptySizes, 1u, &tests); |
| 440 MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); | 521 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); |
| 441 EXPECT_TRUE(result); | 522 EXPECT_TRUE(result); |
| 442 | 523 |
| 443 // 1.h. -- Values are case-sensitive, this should fail. | 524 // 1.h. -- Values are case-sensitive, this should fail. |
| 444 const std::string kLowercase[] = { | 525 const std::string kLowercase[] = { |
| 445 keys::kNameEqualsKey, "Custom-header-b", | 526 keys::kNameEqualsKey, "Custom-header-b", |
| 446 keys::kValuePrefixKey, "valueb", // valueb != valueB | 527 keys::kValuePrefixKey, "valueb", // valueb != valueB |
| 447 keys::kNameEqualsKey, "Custom-header-b", | 528 keys::kNameEqualsKey, "Custom-header-b", |
| 448 keys::kValueSuffixKey, "valueb", | 529 keys::kValueSuffixKey, "valueb", |
| 449 keys::kNameEqualsKey, "Custom-header-b", | 530 keys::kNameEqualsKey, "Custom-header-b", |
| 450 keys::kValueContainsKey, "valueb", | 531 keys::kValueContainsKey, "valueb", |
| 451 keys::kNameEqualsKey, "Custom-header-b", | 532 keys::kNameEqualsKey, "Custom-header-b", |
| 452 keys::kValueEqualsKey, "valueb" | 533 keys::kValueEqualsKey, "valueb" |
| 453 }; | 534 }; |
| 454 const size_t kLowercaseSizes[] = { 4u, 4u, 4u, 4u }; // As disjunction. | 535 const size_t kLowercaseSizes[] = { 4u, 4u, 4u, 4u }; // As disjunction. |
| 455 GetArrayAsVector(kLowercase, kLowercaseSizes, 4u, &tests); | 536 GetArrayAsVector(kLowercase, kLowercaseSizes, 4u, &tests); |
| 456 MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); | 537 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); |
| 457 EXPECT_FALSE(result); | 538 EXPECT_FALSE(result); |
| 458 | 539 |
| 459 // 1.i. -- Names are case-insensitive, this should pass. | 540 // 1.i. -- Names are case-insensitive, this should pass. |
| 460 const std::string kUppercase[] = { | 541 const std::string kUppercase[] = { |
| 461 keys::kNamePrefixKey, "CUSTOM-HEADER-B", | 542 keys::kNamePrefixKey, "CUSTOM-HEADER-B", |
| 462 keys::kNameSuffixKey, "CUSTOM-HEADER-B", | 543 keys::kNameSuffixKey, "CUSTOM-HEADER-B", |
| 463 keys::kNameEqualsKey, "CUSTOM-HEADER-B", | 544 keys::kNameEqualsKey, "CUSTOM-HEADER-B", |
| 464 keys::kNameContainsKey, "CUSTOM-HEADER-B" | 545 keys::kNameContainsKey, "CUSTOM-HEADER-B" |
| 465 }; | 546 }; |
| 466 const size_t kUppercaseSizes[] = { arraysize(kUppercase) }; // Conjunction. | 547 const size_t kUppercaseSizes[] = { arraysize(kUppercase) }; // Conjunction. |
| 467 GetArrayAsVector(kUppercase, kUppercaseSizes, 1u, &tests); | 548 GetArrayAsVector(kUppercase, kUppercaseSizes, 1u, &tests); |
| 468 MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); | 549 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); |
| 469 EXPECT_TRUE(result); | 550 EXPECT_TRUE(result); |
| 470 | 551 |
| 471 // 2.a. -- This should pass as disjunction, because one of the tests passes. | 552 // 2.a. -- This should pass as disjunction, because one of the tests passes. |
| 472 const std::string kDisjunction[] = { | 553 const std::string kDisjunction[] = { |
| 473 keys::kNamePrefixKey, "Non-existing", // This one fails. | 554 keys::kNamePrefixKey, "Non-existing", // This one fails. |
| 474 keys::kNameSuffixKey, "Non-existing", // This one fails. | 555 keys::kNameSuffixKey, "Non-existing", // This one fails. |
| 475 keys::kValueEqualsKey, "void", // This one fails. | 556 keys::kValueEqualsKey, "void", // This one fails. |
| 476 keys::kValueContainsKey, "alu" // This passes. | 557 keys::kValueContainsKey, "alu" // This passes. |
| 477 }; | 558 }; |
| 478 const size_t kDisjunctionSizes[] = { 2u, 2u, 2u, 2u }; | 559 const size_t kDisjunctionSizes[] = { 2u, 2u, 2u, 2u }; |
| 479 GetArrayAsVector(kDisjunction, kDisjunctionSizes, 4u, &tests); | 560 GetArrayAsVector(kDisjunction, kDisjunctionSizes, 4u, &tests); |
| 480 MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); | 561 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); |
| 481 EXPECT_TRUE(result); | 562 EXPECT_TRUE(result); |
| 482 | 563 |
| 483 // 3.a. -- This should pass. | 564 // 3.a. -- This should pass. |
| 484 const std::string kNonExistent[] = { | 565 const std::string kNonExistent[] = { |
| 485 keys::kNameEqualsKey, "Non-existing", | 566 keys::kNameEqualsKey, "Non-existing", |
| 486 keys::kValueEqualsKey, "void" | 567 keys::kValueEqualsKey, "void" |
| 487 }; | 568 }; |
| 488 const size_t kNonExistentSizes[] = { arraysize(kNonExistent) }; | 569 const size_t kNonExistentSizes[] = { arraysize(kNonExistent) }; |
| 489 GetArrayAsVector(kNonExistent, kNonExistentSizes, 1u, &tests); | 570 GetArrayAsVector(kNonExistent, kNonExistentSizes, 1u, &tests); |
| 490 MatchAndCheck(tests, keys::kExcludeResponseHeadersKey, &url_request, &result); | 571 MatchAndCheck( |
| 572 tests, keys::kExcludeResponseHeadersKey, stage, &url_request, &result); |
| 491 EXPECT_TRUE(result); | 573 EXPECT_TRUE(result); |
| 492 | 574 |
| 493 // 3.b. -- This should fail. | 575 // 3.b. -- This should fail. |
| 494 const std::string kExisting[] = { | 576 const std::string kExisting[] = { |
| 495 keys::kNameEqualsKey, "custom-header-b", | 577 keys::kNameEqualsKey, "custom-header-b", |
| 496 keys::kValueEqualsKey, "valueB" | 578 keys::kValueEqualsKey, "valueB" |
| 497 }; | 579 }; |
| 498 const size_t kExistingSize[] = { arraysize(kExisting) }; | 580 const size_t kExistingSize[] = { arraysize(kExisting) }; |
| 499 GetArrayAsVector(kExisting, kExistingSize, 1u, &tests); | 581 GetArrayAsVector(kExisting, kExistingSize, 1u, &tests); |
| 500 MatchAndCheck(tests, keys::kExcludeResponseHeadersKey, &url_request, &result); | 582 MatchAndCheck( |
| 583 tests, keys::kExcludeResponseHeadersKey, stage, &url_request, &result); |
| 501 EXPECT_FALSE(result); | 584 EXPECT_FALSE(result); |
| 502 } | 585 } |
| 503 | 586 |
| 504 } // namespace extensions | 587 } // namespace extensions |
| OLD | NEW |