Index: chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute_unittest.cc |
diff --git a/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute_unittest.cc b/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute_unittest.cc |
index 1f3e26b9a69ebc19eba57c99cfd07ea57a7f1515..479cfeb8acc84769c76f923d2d39c2eb07cc6a10 100644 |
--- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute_unittest.cc |
+++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute_unittest.cc |
@@ -234,6 +234,7 @@ scoped_ptr<DictionaryValue> GetDictionaryFromArray( |
// doesNotContainHeaders. |
void MatchAndCheck(const std::vector< std::vector<const std::string*> >& tests, |
const std::string& key, |
+ RequestStage stage, |
net::URLRequest* url_request, |
bool* result) { |
ListValue contains_headers; |
@@ -250,16 +251,94 @@ void MatchAndCheck(const std::vector< std::vector<const std::string*> >& tests, |
ASSERT_TRUE(attribute.get() != NULL); |
*result = attribute->IsFulfilled(WebRequestRule::RequestData( |
- url_request, ON_HEADERS_RECEIVED, url_request->response_headers())); |
+ url_request, stage, url_request->response_headers())); |
} |
} // namespace |
+// Here we test WebRequestConditionAttributeRequestHeaders for matching |
+// correctly against request headers. This test is not as extensive as |
+// "ResponseHeaders" (below), because the header-matching code is shared |
+// by both types of condition attributes, so it is enough to test it once. |
+TEST(WebRequestConditionAttributeTest, RequestHeaders) { |
+ // Necessary for TestURLRequest. |
+ MessageLoop message_loop(MessageLoop::TYPE_IO); |
+ |
+ TestURLRequestContext context; |
+ TestDelegate delegate; |
+ TestURLRequest url_request(GURL("http://example.com"), // Dummy URL. |
+ &delegate, &context); |
+ url_request.SetExtraRequestHeaderByName( |
+ "Custom-header", "custom/value", true /* overwrite */); |
+ url_request.Start(); |
+ MessageLoop::current()->Run(); |
+ |
+ std::vector<std::vector<const std::string*> > tests; |
+ bool result = false; |
+ |
+ const RequestStage stage = ON_BEFORE_SEND_HEADERS; |
+ |
+ // First set of test data -- passing conjunction. |
+ const std::string kPassingCondition[] = { |
+ keys::kNameContainsKey, "CuStOm", // Header names are case insensitive. |
+ keys::kNameEqualsKey, "custom-header", |
+ keys::kValueSuffixKey, "alue", |
+ keys::kValuePrefixKey, "custom/value" |
+ }; |
+ const size_t kPassingConditionSizes[] = { arraysize(kPassingCondition) }; |
+ GetArrayAsVector(kPassingCondition, kPassingConditionSizes, 1u, &tests); |
+ // Positive filter, passing (conjunction of tests). |
+ MatchAndCheck(tests, keys::kRequestHeadersKey, stage, &url_request, &result); |
+ EXPECT_TRUE(result); |
+ // Negative filter, failing (conjunction of tests). |
+ MatchAndCheck( |
+ tests, keys::kExcludeRequestHeadersKey, stage, &url_request, &result); |
+ EXPECT_FALSE(result); |
+ |
+ // Second set of test data -- failing disjunction. |
+ const std::string kFailCondition[] = { |
+ keys::kNameSuffixKey, "Custom", // Test 1. |
+ keys::kNameEqualsKey, "ustom-valu", // Test 2. |
+ keys::kValuePrefixKey, "custom ", // Test 3. |
+ keys::kValueContainsKey, " value" // Test 4. |
+ }; |
+ const size_t kFailConditionSizes[] = { 2u, 2u, 2u, 2u }; |
+ GetArrayAsVector(kFailCondition, kFailConditionSizes, 4u, &tests); |
+ // Positive filter, failing (disjunction of tests). |
+ MatchAndCheck(tests, keys::kRequestHeadersKey, stage, &url_request, &result); |
+ EXPECT_FALSE(result); |
+ // Negative filter, passing (disjunction of tests). |
+ MatchAndCheck( |
+ tests, keys::kExcludeRequestHeadersKey, stage, &url_request, &result); |
+ EXPECT_TRUE(result); |
+ |
+ // Third set of test data, corner case -- empty disjunction. |
+ GetArrayAsVector(NULL, NULL, 0u, &tests); |
+ // Positive filter, failing (no test to pass). |
+ MatchAndCheck(tests, keys::kRequestHeadersKey, stage, &url_request, &result); |
+ EXPECT_FALSE(result); |
+ // Negative filter, passing (no test to fail). |
+ MatchAndCheck( |
+ tests, keys::kExcludeRequestHeadersKey, stage, &url_request, &result); |
+ EXPECT_TRUE(result); |
+ |
+ // Fourth set of test data, corner case -- empty conjunction. |
+ const size_t kEmptyConjunctionSizes[] = { 0u }; |
+ GetArrayAsVector(NULL, kEmptyConjunctionSizes, 1u, &tests); |
+ // Positive filter, passing (trivial test). |
+ MatchAndCheck(tests, keys::kRequestHeadersKey, stage, &url_request, &result); |
+ EXPECT_TRUE(result); |
+ // Negative filter, failing. |
+ MatchAndCheck( |
+ tests, keys::kExcludeRequestHeadersKey, stage, &url_request, &result); |
+ EXPECT_FALSE(result); |
+} |
+ |
// Here we test WebRequestConditionAttributeResponseHeaders for: |
// 1. Correct implementation of prefix/suffix/contains/equals matching. |
// 2. Performing logical disjunction (||) between multiple specifications. |
// 3. Negating the match in case of 'doesNotContainHeaders'. |
-TEST(WebRequestConditionAttributeTest, Headers) { |
+TEST(WebRequestConditionAttributeTest, ResponseHeaders) { |
// Necessary for TestURLRequest. |
MessageLoop message_loop(MessageLoop::TYPE_IO); |
@@ -288,6 +367,8 @@ TEST(WebRequestConditionAttributeTest, Headers) { |
std::vector< std::vector<const std::string*> > tests; |
bool result; |
+ const RequestStage stage = ON_HEADERS_RECEIVED; |
+ |
// 1.a. -- All these tests should pass. |
const std::string kPassingCondition[] = { |
keys::kNamePrefixKey, "Custom", |
@@ -297,7 +378,7 @@ TEST(WebRequestConditionAttributeTest, Headers) { |
}; |
const size_t kPassingConditionSizes[] = { arraysize(kPassingCondition) }; |
GetArrayAsVector(kPassingCondition, kPassingConditionSizes, 1u, &tests); |
- MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); |
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); |
EXPECT_TRUE(result); |
// 1.b. -- None of the following tests in the discjunction should pass. |
@@ -309,7 +390,7 @@ TEST(WebRequestConditionAttributeTest, Headers) { |
}; |
const size_t kFailConditionSizes[] = { 2u, 2u, 2u, 2u }; |
GetArrayAsVector(kFailCondition, kFailConditionSizes, 4u, &tests); |
- MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); |
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); |
EXPECT_FALSE(result); |
// 1.c. -- This should fail (mixing name and value from different headers) |
@@ -319,7 +400,7 @@ TEST(WebRequestConditionAttributeTest, Headers) { |
}; |
const size_t kMixingConditionSizes[] = { arraysize(kMixingCondition) }; |
GetArrayAsVector(kMixingCondition, kMixingConditionSizes, 1u, &tests); |
- MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); |
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); |
EXPECT_FALSE(result); |
// 1.d. -- Test handling multiple values for one header (both should pass). |
@@ -329,7 +410,7 @@ TEST(WebRequestConditionAttributeTest, Headers) { |
}; |
const size_t kMoreValues1Sizes[] = { arraysize(kMoreValues1) }; |
GetArrayAsVector(kMoreValues1, kMoreValues1Sizes, 1u, &tests); |
- MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); |
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); |
EXPECT_TRUE(result); |
const std::string kMoreValues2[] = { |
keys::kNameEqualsKey, "Custom-header-b", |
@@ -337,7 +418,7 @@ TEST(WebRequestConditionAttributeTest, Headers) { |
}; |
const size_t kMoreValues2Sizes[] = { arraysize(kMoreValues2) }; |
GetArrayAsVector(kMoreValues2, kMoreValues2Sizes, 1u, &tests); |
- MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); |
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); |
EXPECT_TRUE(result); |
// 1.e. -- This should fail as conjunction but pass as disjunction. |
@@ -348,12 +429,12 @@ TEST(WebRequestConditionAttributeTest, Headers) { |
// First disjunction, no conflict. |
const size_t kNoConflictSizes[] = { 2u, 2u }; |
GetArrayAsVector(kConflict, kNoConflictSizes, 2u, &tests); |
- MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); |
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); |
EXPECT_TRUE(result); |
// Then conjunction, conflict. |
const size_t kConflictSizes[] = { arraysize(kConflict) }; |
GetArrayAsVector(kConflict, kConflictSizes, 1u, &tests); |
- MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); |
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); |
EXPECT_FALSE(result); |
// 1.f. -- This should pass, checking for correct treatment of ',' in values. |
@@ -363,7 +444,7 @@ TEST(WebRequestConditionAttributeTest, Headers) { |
}; |
const size_t kCommaSizes[] = { arraysize(kComma) }; |
GetArrayAsVector(kComma, kCommaSizes, 1u, &tests); |
- MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); |
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); |
EXPECT_TRUE(result); |
// 1.g. -- This should pass, empty values are values as well. |
@@ -373,7 +454,7 @@ TEST(WebRequestConditionAttributeTest, Headers) { |
}; |
const size_t kEmptySizes[] = { arraysize(kEmpty) }; |
GetArrayAsVector(kEmpty, kEmptySizes, 1u, &tests); |
- MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); |
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); |
EXPECT_TRUE(result); |
// 1.h. -- Values are case-sensitive, this should fail. |
@@ -389,7 +470,7 @@ TEST(WebRequestConditionAttributeTest, Headers) { |
}; |
const size_t kLowercaseSizes[] = { 4u, 4u, 4u, 4u }; // As disjunction. |
GetArrayAsVector(kLowercase, kLowercaseSizes, 4u, &tests); |
- MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); |
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); |
EXPECT_FALSE(result); |
// 1.i. -- Names are case-insensitive, this should pass. |
@@ -401,7 +482,7 @@ TEST(WebRequestConditionAttributeTest, Headers) { |
}; |
const size_t kUppercaseSizes[] = { arraysize(kUppercase) }; // Conjunction. |
GetArrayAsVector(kUppercase, kUppercaseSizes, 1u, &tests); |
- MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); |
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); |
EXPECT_TRUE(result); |
// 2.a. -- This should pass as disjunction, because one of the tests passes. |
@@ -413,7 +494,7 @@ TEST(WebRequestConditionAttributeTest, Headers) { |
}; |
const size_t kDisjunctionSizes[] = { 2u, 2u, 2u, 2u }; |
GetArrayAsVector(kDisjunction, kDisjunctionSizes, 4u, &tests); |
- MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); |
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); |
EXPECT_TRUE(result); |
// 3.a. -- This should pass. |
@@ -423,7 +504,8 @@ TEST(WebRequestConditionAttributeTest, Headers) { |
}; |
const size_t kNonExistentSizes[] = { arraysize(kNonExistent) }; |
GetArrayAsVector(kNonExistent, kNonExistentSizes, 1u, &tests); |
- MatchAndCheck(tests, keys::kExcludeResponseHeadersKey, &url_request, &result); |
+ MatchAndCheck( |
+ tests, keys::kExcludeResponseHeadersKey, stage, &url_request, &result); |
EXPECT_TRUE(result); |
// 3.b. -- This should fail. |
@@ -433,7 +515,8 @@ TEST(WebRequestConditionAttributeTest, Headers) { |
}; |
const size_t kExistingSize[] = { arraysize(kExisting) }; |
GetArrayAsVector(kExisting, kExistingSize, 1u, &tests); |
- MatchAndCheck(tests, keys::kExcludeResponseHeadersKey, &url_request, &result); |
+ MatchAndCheck( |
+ tests, keys::kExcludeResponseHeadersKey, stage, &url_request, &result); |
EXPECT_FALSE(result); |
} |