Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(454)

Side by Side Diff: chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute_unittest.cc

Issue 501163002: Make URLRequest's constructor private, and make URLRequestContext a friend class. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Merge yet again Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/files/file_path.h" 8 #include "base/files/file_path.h"
9 #include "base/memory/scoped_ptr.h"
9 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
10 #include "base/values.h" 11 #include "base/values.h"
11 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_condit ion.h" 12 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_condit ion.h"
12 #include "content/public/browser/resource_request_info.h" 13 #include "content/public/browser/resource_request_info.h"
13 #include "extensions/browser/api/declarative_webrequest/webrequest_constants.h" 14 #include "extensions/browser/api/declarative_webrequest/webrequest_constants.h"
14 #include "net/base/request_priority.h" 15 #include "net/base/request_priority.h"
15 #include "net/test/embedded_test_server/embedded_test_server.h" 16 #include "net/test/embedded_test_server/embedded_test_server.h"
17 #include "net/url_request/url_request.h"
16 #include "net/url_request/url_request_test_util.h" 18 #include "net/url_request/url_request_test_util.h"
17 #include "testing/gtest/include/gtest/gtest.h" 19 #include "testing/gtest/include/gtest/gtest.h"
18 20
19 using base::DictionaryValue; 21 using base::DictionaryValue;
20 using base::FundamentalValue; 22 using base::FundamentalValue;
21 using base::ListValue; 23 using base::ListValue;
22 using base::StringValue; 24 using base::StringValue;
23 using base::Value; 25 using base::Value;
24 using content::ResourceType; 26 using content::ResourceType;
25 27
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 resource_types.Append(new base::StringValue("sub_frame")); 90 resource_types.Append(new base::StringValue("sub_frame"));
89 91
90 scoped_refptr<const WebRequestConditionAttribute> attribute = 92 scoped_refptr<const WebRequestConditionAttribute> attribute =
91 WebRequestConditionAttribute::Create( 93 WebRequestConditionAttribute::Create(
92 keys::kResourceTypeKey, &resource_types, &error); 94 keys::kResourceTypeKey, &resource_types, &error);
93 EXPECT_EQ("", error); 95 EXPECT_EQ("", error);
94 ASSERT_TRUE(attribute.get()); 96 ASSERT_TRUE(attribute.get());
95 EXPECT_EQ(std::string(keys::kResourceTypeKey), attribute->GetName()); 97 EXPECT_EQ(std::string(keys::kResourceTypeKey), attribute->GetName());
96 98
97 net::TestURLRequestContext context; 99 net::TestURLRequestContext context;
98 net::TestURLRequest url_request_ok( 100 scoped_ptr<net::URLRequest> url_request_ok(context.CreateRequest(
99 GURL("http://www.example.com"), net::DEFAULT_PRIORITY, NULL, &context); 101 GURL("http://www.example.com"), net::DEFAULT_PRIORITY, NULL, NULL));
100 content::ResourceRequestInfo::AllocateForTesting( 102 content::ResourceRequestInfo::AllocateForTesting(
101 &url_request_ok, 103 url_request_ok.get(),
102 content::RESOURCE_TYPE_SUB_FRAME, 104 content::RESOURCE_TYPE_SUB_FRAME,
103 NULL, 105 NULL,
104 -1, 106 -1,
105 -1, 107 -1,
106 -1, 108 -1,
107 false); 109 false);
108 EXPECT_TRUE(attribute->IsFulfilled(WebRequestData(&url_request_ok, 110 EXPECT_TRUE(attribute->IsFulfilled(WebRequestData(url_request_ok.get(),
109 ON_BEFORE_REQUEST))); 111 ON_BEFORE_REQUEST)));
110 112
111 net::TestURLRequest url_request_fail( 113 scoped_ptr<net::URLRequest> url_request_fail(context.CreateRequest(
112 GURL("http://www.example.com"), net::DEFAULT_PRIORITY, NULL, &context); 114 GURL("http://www.example.com"), net::DEFAULT_PRIORITY, NULL, NULL));
113 content::ResourceRequestInfo::AllocateForTesting( 115 content::ResourceRequestInfo::AllocateForTesting(
114 &url_request_fail, 116 url_request_fail.get(),
115 content::RESOURCE_TYPE_MAIN_FRAME, 117 content::RESOURCE_TYPE_MAIN_FRAME,
116 NULL, 118 NULL,
117 -1, 119 -1,
118 -1, 120 -1,
119 -1, 121 -1,
120 false); 122 false);
121 EXPECT_FALSE(attribute->IsFulfilled(WebRequestData(&url_request_fail, 123 EXPECT_FALSE(attribute->IsFulfilled(WebRequestData(url_request_fail.get(),
122 ON_BEFORE_REQUEST))); 124 ON_BEFORE_REQUEST)));
123 } 125 }
124 126
125 TEST(WebRequestConditionAttributeTest, ContentType) { 127 TEST(WebRequestConditionAttributeTest, ContentType) {
126 // Necessary for TestURLRequest. 128 // Necessary for TestURLRequest.
127 base::MessageLoopForIO message_loop; 129 base::MessageLoopForIO message_loop;
128 130
129 std::string error; 131 std::string error;
130 scoped_refptr<const WebRequestConditionAttribute> result; 132 scoped_refptr<const WebRequestConditionAttribute> result;
131 133
132 net::test_server::EmbeddedTestServer test_server; 134 net::test_server::EmbeddedTestServer test_server;
133 test_server.ServeFilesFromDirectory(TestDataPath( 135 test_server.ServeFilesFromDirectory(TestDataPath(
134 "chrome/test/data/extensions/api_test/webrequest/declarative")); 136 "chrome/test/data/extensions/api_test/webrequest/declarative"));
135 ASSERT_TRUE(test_server.InitializeAndWaitUntilReady()); 137 ASSERT_TRUE(test_server.InitializeAndWaitUntilReady());
136 138
137 net::TestURLRequestContext context; 139 net::TestURLRequestContext context;
138 net::TestDelegate delegate; 140 net::TestDelegate delegate;
139 net::TestURLRequest url_request(test_server.GetURL("/headers.html"), 141 scoped_ptr<net::URLRequest> url_request(
140 net::DEFAULT_PRIORITY, 142 context.CreateRequest(test_server.GetURL("/headers.html"),
141 &delegate, 143 net::DEFAULT_PRIORITY,
142 &context); 144 &delegate,
143 url_request.Start(); 145 NULL));
146 url_request->Start();
144 base::MessageLoop::current()->Run(); 147 base::MessageLoop::current()->Run();
145 148
146 base::ListValue content_types; 149 base::ListValue content_types;
147 content_types.Append(new base::StringValue("text/plain")); 150 content_types.Append(new base::StringValue("text/plain"));
148 scoped_refptr<const WebRequestConditionAttribute> attribute_include = 151 scoped_refptr<const WebRequestConditionAttribute> attribute_include =
149 WebRequestConditionAttribute::Create( 152 WebRequestConditionAttribute::Create(
150 keys::kContentTypeKey, &content_types, &error); 153 keys::kContentTypeKey, &content_types, &error);
151 EXPECT_EQ("", error); 154 EXPECT_EQ("", error);
152 ASSERT_TRUE(attribute_include.get()); 155 ASSERT_TRUE(attribute_include.get());
153 EXPECT_FALSE(attribute_include->IsFulfilled( 156 EXPECT_FALSE(attribute_include->IsFulfilled(
154 WebRequestData(&url_request, ON_BEFORE_REQUEST, 157 WebRequestData(url_request.get(), ON_BEFORE_REQUEST,
155 url_request.response_headers()))); 158 url_request->response_headers())));
156 EXPECT_TRUE(attribute_include->IsFulfilled( 159 EXPECT_TRUE(attribute_include->IsFulfilled(
157 WebRequestData(&url_request, ON_HEADERS_RECEIVED, 160 WebRequestData(url_request.get(), ON_HEADERS_RECEIVED,
158 url_request.response_headers()))); 161 url_request->response_headers())));
159 EXPECT_EQ(std::string(keys::kContentTypeKey), attribute_include->GetName()); 162 EXPECT_EQ(std::string(keys::kContentTypeKey), attribute_include->GetName());
160 163
161 scoped_refptr<const WebRequestConditionAttribute> attribute_exclude = 164 scoped_refptr<const WebRequestConditionAttribute> attribute_exclude =
162 WebRequestConditionAttribute::Create( 165 WebRequestConditionAttribute::Create(
163 keys::kExcludeContentTypeKey, &content_types, &error); 166 keys::kExcludeContentTypeKey, &content_types, &error);
164 EXPECT_EQ("", error); 167 EXPECT_EQ("", error);
165 ASSERT_TRUE(attribute_exclude.get()); 168 ASSERT_TRUE(attribute_exclude.get());
166 EXPECT_FALSE(attribute_exclude->IsFulfilled( 169 EXPECT_FALSE(attribute_exclude->IsFulfilled(
167 WebRequestData(&url_request, ON_HEADERS_RECEIVED, 170 WebRequestData(url_request.get(), ON_HEADERS_RECEIVED,
168 url_request.response_headers()))); 171 url_request->response_headers())));
169 172
170 content_types.Clear(); 173 content_types.Clear();
171 content_types.Append(new base::StringValue("something/invalid")); 174 content_types.Append(new base::StringValue("something/invalid"));
172 scoped_refptr<const WebRequestConditionAttribute> attribute_unincluded = 175 scoped_refptr<const WebRequestConditionAttribute> attribute_unincluded =
173 WebRequestConditionAttribute::Create( 176 WebRequestConditionAttribute::Create(
174 keys::kContentTypeKey, &content_types, &error); 177 keys::kContentTypeKey, &content_types, &error);
175 EXPECT_EQ("", error); 178 EXPECT_EQ("", error);
176 ASSERT_TRUE(attribute_unincluded.get()); 179 ASSERT_TRUE(attribute_unincluded.get());
177 EXPECT_FALSE(attribute_unincluded->IsFulfilled( 180 EXPECT_FALSE(attribute_unincluded->IsFulfilled(
178 WebRequestData(&url_request, ON_HEADERS_RECEIVED, 181 WebRequestData(url_request.get(), ON_HEADERS_RECEIVED,
179 url_request.response_headers()))); 182 url_request->response_headers())));
180 183
181 scoped_refptr<const WebRequestConditionAttribute> attribute_unexcluded = 184 scoped_refptr<const WebRequestConditionAttribute> attribute_unexcluded =
182 WebRequestConditionAttribute::Create( 185 WebRequestConditionAttribute::Create(
183 keys::kExcludeContentTypeKey, &content_types, &error); 186 keys::kExcludeContentTypeKey, &content_types, &error);
184 EXPECT_EQ("", error); 187 EXPECT_EQ("", error);
185 ASSERT_TRUE(attribute_unexcluded.get()); 188 ASSERT_TRUE(attribute_unexcluded.get());
186 EXPECT_TRUE(attribute_unexcluded->IsFulfilled( 189 EXPECT_TRUE(attribute_unexcluded->IsFulfilled(
187 WebRequestData(&url_request, ON_HEADERS_RECEIVED, 190 WebRequestData(url_request.get(), ON_HEADERS_RECEIVED,
188 url_request.response_headers()))); 191 url_request->response_headers())));
189 EXPECT_EQ(std::string(keys::kExcludeContentTypeKey), 192 EXPECT_EQ(std::string(keys::kExcludeContentTypeKey),
190 attribute_unexcluded->GetName()); 193 attribute_unexcluded->GetName());
191 } 194 }
192 195
193 // Testing WebRequestConditionAttributeThirdParty. 196 // Testing WebRequestConditionAttributeThirdParty.
194 TEST(WebRequestConditionAttributeTest, ThirdParty) { 197 TEST(WebRequestConditionAttributeTest, ThirdParty) {
195 // Necessary for TestURLRequest. 198 // Necessary for TestURLRequest.
196 base::MessageLoopForIO message_loop; 199 base::MessageLoopForIO message_loop;
197 200
198 std::string error; 201 std::string error;
(...skipping 16 matching lines...) Expand all
215 ASSERT_EQ("", error); 218 ASSERT_EQ("", error);
216 ASSERT_TRUE(first_party_attribute.get()); 219 ASSERT_TRUE(first_party_attribute.get());
217 EXPECT_EQ(std::string(keys::kThirdPartyKey), 220 EXPECT_EQ(std::string(keys::kThirdPartyKey),
218 first_party_attribute->GetName()); 221 first_party_attribute->GetName());
219 222
220 const GURL url_empty; 223 const GURL url_empty;
221 const GURL url_a("http://a.com"); 224 const GURL url_a("http://a.com");
222 const GURL url_b("http://b.com"); 225 const GURL url_b("http://b.com");
223 net::TestURLRequestContext context; 226 net::TestURLRequestContext context;
224 net::TestDelegate delegate; 227 net::TestDelegate delegate;
225 net::TestURLRequest url_request( 228 scoped_ptr<net::URLRequest> url_request(
226 url_a, net::DEFAULT_PRIORITY, &delegate, &context); 229 context.CreateRequest(url_a, net::DEFAULT_PRIORITY, &delegate, NULL));
227 230
228 for (unsigned int i = 1; i <= kLastActiveStage; i <<= 1) { 231 for (unsigned int i = 1; i <= kLastActiveStage; i <<= 1) {
229 if (!(kActiveStages & i)) 232 if (!(kActiveStages & i))
230 continue; 233 continue;
231 const RequestStage stage = static_cast<RequestStage>(i); 234 const RequestStage stage = static_cast<RequestStage>(i);
232 url_request.set_first_party_for_cookies(url_empty); 235 url_request->set_first_party_for_cookies(url_empty);
233 EXPECT_FALSE(third_party_attribute->IsFulfilled(WebRequestData(&url_request, 236 EXPECT_FALSE(third_party_attribute->IsFulfilled(
234 stage))); 237 WebRequestData(url_request.get(), stage)));
235 EXPECT_TRUE(first_party_attribute->IsFulfilled(WebRequestData(&url_request, 238 EXPECT_TRUE(first_party_attribute->IsFulfilled(
236 stage))); 239 WebRequestData(url_request.get(), stage)));
237 240
238 url_request.set_first_party_for_cookies(url_b); 241 url_request->set_first_party_for_cookies(url_b);
239 EXPECT_TRUE(third_party_attribute->IsFulfilled(WebRequestData(&url_request, 242 EXPECT_TRUE(third_party_attribute->IsFulfilled(
240 stage))); 243 WebRequestData(url_request.get(), stage)));
241 EXPECT_FALSE(first_party_attribute->IsFulfilled(WebRequestData(&url_request, 244 EXPECT_FALSE(first_party_attribute->IsFulfilled(
242 stage))); 245 WebRequestData(url_request.get(), stage)));
243 246
244 url_request.set_first_party_for_cookies(url_a); 247 url_request->set_first_party_for_cookies(url_a);
245 EXPECT_FALSE(third_party_attribute->IsFulfilled(WebRequestData(&url_request, 248 EXPECT_FALSE(third_party_attribute->IsFulfilled(
246 stage))); 249 WebRequestData(url_request.get(), stage)));
247 EXPECT_TRUE(first_party_attribute->IsFulfilled(WebRequestData(&url_request, 250 EXPECT_TRUE(first_party_attribute->IsFulfilled(
248 stage))); 251 WebRequestData(url_request.get(), stage)));
249 } 252 }
250 } 253 }
251 254
252 // Testing WebRequestConditionAttributeStages. This iterates over all stages, 255 // Testing WebRequestConditionAttributeStages. This iterates over all stages,
253 // and tests a couple of "stage" attributes -- one created with an empty set of 256 // and tests a couple of "stage" attributes -- one created with an empty set of
254 // applicable stages, one for each stage applicable for that stage, and one 257 // applicable stages, one for each stage applicable for that stage, and one
255 // applicable in all stages. 258 // applicable in all stages.
256 TEST(WebRequestConditionAttributeTest, Stages) { 259 TEST(WebRequestConditionAttributeTest, Stages) {
257 // Necessary for TestURLRequest. 260 // Necessary for TestURLRequest.
258 base::MessageLoopForIO message_loop; 261 base::MessageLoopForIO message_loop;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
306 WebRequestConditionAttribute::Create(keys::kStagesKey, 309 WebRequestConditionAttribute::Create(keys::kStagesKey,
307 &single_stage_list, 310 &single_stage_list,
308 &error)); 311 &error));
309 EXPECT_EQ("", error); 312 EXPECT_EQ("", error);
310 ASSERT_TRUE(one_stage_attributes.back().get() != NULL); 313 ASSERT_TRUE(one_stage_attributes.back().get() != NULL);
311 } 314 }
312 315
313 const GURL url_empty; 316 const GURL url_empty;
314 net::TestURLRequestContext context; 317 net::TestURLRequestContext context;
315 net::TestDelegate delegate; 318 net::TestDelegate delegate;
316 net::TestURLRequest url_request( 319 scoped_ptr<net::URLRequest> url_request(
317 url_empty, net::DEFAULT_PRIORITY, &delegate, &context); 320 context.CreateRequest(url_empty, net::DEFAULT_PRIORITY, &delegate, NULL));
318 321
319 for (size_t i = 0; i < arraysize(active_stages); ++i) { 322 for (size_t i = 0; i < arraysize(active_stages); ++i) {
320 EXPECT_FALSE(empty_attribute->IsFulfilled( 323 EXPECT_FALSE(empty_attribute->IsFulfilled(
321 WebRequestData(&url_request, active_stages[i].first))); 324 WebRequestData(url_request.get(), active_stages[i].first)));
322 325
323 for (size_t j = 0; j < one_stage_attributes.size(); ++j) { 326 for (size_t j = 0; j < one_stage_attributes.size(); ++j) {
324 EXPECT_EQ(i == j, 327 EXPECT_EQ(i == j,
325 one_stage_attributes[j]->IsFulfilled( 328 one_stage_attributes[j]->IsFulfilled(
326 WebRequestData(&url_request, active_stages[i].first))); 329 WebRequestData(url_request.get(), active_stages[i].first)));
327 } 330 }
328 331
329 EXPECT_TRUE(attribute_with_all->IsFulfilled( 332 EXPECT_TRUE(attribute_with_all->IsFulfilled(
330 WebRequestData(&url_request, active_stages[i].first))); 333 WebRequestData(url_request.get(), active_stages[i].first)));
331 } 334 }
332 } 335 }
333 336
334 namespace { 337 namespace {
335 338
336 // Builds a vector of vectors of string pointers from an array of strings. 339 // Builds a vector of vectors of string pointers from an array of strings.
337 // |array| is in fact a sequence of arrays. The array |sizes| captures the sizes 340 // |array| is in fact a sequence of arrays. The array |sizes| captures the sizes
338 // of all parts of |array|, and |size| is the length of |sizes| itself. 341 // of all parts of |array|, and |size| is the length of |sizes| itself.
339 // Example (this is pseudo-code, not C++): 342 // Example (this is pseudo-code, not C++):
340 // array = { "a", "b", "c", "d", "e", "f" } 343 // array = { "a", "b", "c", "d", "e", "f" }
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
431 // Here we test WebRequestConditionAttributeRequestHeaders for matching 434 // Here we test WebRequestConditionAttributeRequestHeaders for matching
432 // correctly against request headers. This test is not as extensive as 435 // correctly against request headers. This test is not as extensive as
433 // "ResponseHeaders" (below), because the header-matching code is shared 436 // "ResponseHeaders" (below), because the header-matching code is shared
434 // by both types of condition attributes, so it is enough to test it once. 437 // by both types of condition attributes, so it is enough to test it once.
435 TEST(WebRequestConditionAttributeTest, RequestHeaders) { 438 TEST(WebRequestConditionAttributeTest, RequestHeaders) {
436 // Necessary for TestURLRequest. 439 // Necessary for TestURLRequest.
437 base::MessageLoopForIO message_loop; 440 base::MessageLoopForIO message_loop;
438 441
439 net::TestURLRequestContext context; 442 net::TestURLRequestContext context;
440 net::TestDelegate delegate; 443 net::TestDelegate delegate;
441 net::TestURLRequest url_request(GURL("http://example.com"), // Dummy URL. 444 scoped_ptr<net::URLRequest> url_request(
442 net::DEFAULT_PRIORITY, 445 context.CreateRequest(GURL("http://example.com"), // Dummy URL.
443 &delegate, 446 net::DEFAULT_PRIORITY,
444 &context); 447 &delegate,
445 url_request.SetExtraRequestHeaderByName( 448 NULL));
449 url_request->SetExtraRequestHeaderByName(
446 "Custom-header", "custom/value", true /* overwrite */); 450 "Custom-header", "custom/value", true /* overwrite */);
447 url_request.Start(); 451 url_request->Start();
448 base::MessageLoop::current()->Run(); 452 base::MessageLoop::current()->Run();
449 453
450 std::vector<std::vector<const std::string*> > tests; 454 std::vector<std::vector<const std::string*> > tests;
451 bool result = false; 455 bool result = false;
452 456
453 const RequestStage stage = ON_BEFORE_SEND_HEADERS; 457 const RequestStage stage = ON_BEFORE_SEND_HEADERS;
454 458
455 // First set of test data -- passing conjunction. 459 // First set of test data -- passing conjunction.
456 const std::string kPassingCondition[] = { 460 const std::string kPassingCondition[] = {
457 keys::kNameContainsKey, "CuStOm", // Header names are case insensitive. 461 keys::kNameContainsKey, "CuStOm", // Header names are case insensitive.
458 keys::kNameEqualsKey, "custom-header", 462 keys::kNameEqualsKey, "custom-header",
459 keys::kValueSuffixKey, "alue", 463 keys::kValueSuffixKey, "alue",
460 keys::kValuePrefixKey, "custom/value" 464 keys::kValuePrefixKey, "custom/value"
461 }; 465 };
462 const size_t kPassingConditionSizes[] = { arraysize(kPassingCondition) }; 466 const size_t kPassingConditionSizes[] = { arraysize(kPassingCondition) };
463 GetArrayAsVector(kPassingCondition, kPassingConditionSizes, 1u, &tests); 467 GetArrayAsVector(kPassingCondition, kPassingConditionSizes, 1u, &tests);
464 // Positive filter, passing (conjunction of tests). 468 // Positive filter, passing (conjunction of tests).
465 MatchAndCheck(tests, keys::kRequestHeadersKey, stage, &url_request, &result); 469 MatchAndCheck(
470 tests, keys::kRequestHeadersKey, stage, url_request.get(), &result);
466 EXPECT_TRUE(result); 471 EXPECT_TRUE(result);
467 // Negative filter, failing (conjunction of tests). 472 // Negative filter, failing (conjunction of tests).
468 MatchAndCheck( 473 MatchAndCheck(tests, keys::kExcludeRequestHeadersKey, stage,
469 tests, keys::kExcludeRequestHeadersKey, stage, &url_request, &result); 474 url_request.get(), &result);
470 EXPECT_FALSE(result); 475 EXPECT_FALSE(result);
471 476
472 // Second set of test data -- failing disjunction. 477 // Second set of test data -- failing disjunction.
473 const std::string kFailCondition[] = { 478 const std::string kFailCondition[] = {
474 keys::kNameSuffixKey, "Custom", // Test 1. 479 keys::kNameSuffixKey, "Custom", // Test 1.
475 keys::kNameEqualsKey, "ustom-valu", // Test 2. 480 keys::kNameEqualsKey, "ustom-valu", // Test 2.
476 keys::kValuePrefixKey, "custom ", // Test 3. 481 keys::kValuePrefixKey, "custom ", // Test 3.
477 keys::kValueContainsKey, " value" // Test 4. 482 keys::kValueContainsKey, " value" // Test 4.
478 }; 483 };
479 const size_t kFailConditionSizes[] = { 2u, 2u, 2u, 2u }; 484 const size_t kFailConditionSizes[] = { 2u, 2u, 2u, 2u };
480 GetArrayAsVector(kFailCondition, kFailConditionSizes, 4u, &tests); 485 GetArrayAsVector(kFailCondition, kFailConditionSizes, 4u, &tests);
481 // Positive filter, failing (disjunction of tests). 486 // Positive filter, failing (disjunction of tests).
482 MatchAndCheck(tests, keys::kRequestHeadersKey, stage, &url_request, &result); 487 MatchAndCheck(tests, keys::kRequestHeadersKey, stage, url_request.get(),
488 &result);
483 EXPECT_FALSE(result); 489 EXPECT_FALSE(result);
484 // Negative filter, passing (disjunction of tests). 490 // Negative filter, passing (disjunction of tests).
485 MatchAndCheck( 491 MatchAndCheck(tests, keys::kExcludeRequestHeadersKey, stage,
486 tests, keys::kExcludeRequestHeadersKey, stage, &url_request, &result); 492 url_request.get(), &result);
487 EXPECT_TRUE(result); 493 EXPECT_TRUE(result);
488 494
489 // Third set of test data, corner case -- empty disjunction. 495 // Third set of test data, corner case -- empty disjunction.
490 GetArrayAsVector(NULL, NULL, 0u, &tests); 496 GetArrayAsVector(NULL, NULL, 0u, &tests);
491 // Positive filter, failing (no test to pass). 497 // Positive filter, failing (no test to pass).
492 MatchAndCheck(tests, keys::kRequestHeadersKey, stage, &url_request, &result); 498 MatchAndCheck(tests, keys::kRequestHeadersKey, stage, url_request.get(),
499 &result);
493 EXPECT_FALSE(result); 500 EXPECT_FALSE(result);
494 // Negative filter, passing (no test to fail). 501 // Negative filter, passing (no test to fail).
495 MatchAndCheck( 502 MatchAndCheck(tests, keys::kExcludeRequestHeadersKey, stage,
496 tests, keys::kExcludeRequestHeadersKey, stage, &url_request, &result); 503 url_request.get(), &result);
497 EXPECT_TRUE(result); 504 EXPECT_TRUE(result);
498 505
499 // Fourth set of test data, corner case -- empty conjunction. 506 // Fourth set of test data, corner case -- empty conjunction.
500 const size_t kEmptyConjunctionSizes[] = { 0u }; 507 const size_t kEmptyConjunctionSizes[] = { 0u };
501 GetArrayAsVector(NULL, kEmptyConjunctionSizes, 1u, &tests); 508 GetArrayAsVector(NULL, kEmptyConjunctionSizes, 1u, &tests);
502 // Positive filter, passing (trivial test). 509 // Positive filter, passing (trivial test).
503 MatchAndCheck(tests, keys::kRequestHeadersKey, stage, &url_request, &result); 510 MatchAndCheck(tests, keys::kRequestHeadersKey, stage, url_request.get(),
511 &result);
504 EXPECT_TRUE(result); 512 EXPECT_TRUE(result);
505 // Negative filter, failing. 513 // Negative filter, failing.
506 MatchAndCheck( 514 MatchAndCheck(tests, keys::kExcludeRequestHeadersKey, stage,
507 tests, keys::kExcludeRequestHeadersKey, stage, &url_request, &result); 515 url_request.get(), &result);
508 EXPECT_FALSE(result); 516 EXPECT_FALSE(result);
509 } 517 }
510 518
511 // Here we test WebRequestConditionAttributeResponseHeaders for: 519 // Here we test WebRequestConditionAttributeResponseHeaders for:
512 // 1. Correct implementation of prefix/suffix/contains/equals matching. 520 // 1. Correct implementation of prefix/suffix/contains/equals matching.
513 // 2. Performing logical disjunction (||) between multiple specifications. 521 // 2. Performing logical disjunction (||) between multiple specifications.
514 // 3. Negating the match in case of 'doesNotContainHeaders'. 522 // 3. Negating the match in case of 'doesNotContainHeaders'.
515 TEST(WebRequestConditionAttributeTest, ResponseHeaders) { 523 TEST(WebRequestConditionAttributeTest, ResponseHeaders) {
516 // Necessary for TestURLRequest. 524 // Necessary for TestURLRequest.
517 base::MessageLoopForIO message_loop; 525 base::MessageLoopForIO message_loop;
518 526
519 net::test_server::EmbeddedTestServer test_server; 527 net::test_server::EmbeddedTestServer test_server;
520 test_server.ServeFilesFromDirectory(TestDataPath( 528 test_server.ServeFilesFromDirectory(TestDataPath(
521 "chrome/test/data/extensions/api_test/webrequest/declarative")); 529 "chrome/test/data/extensions/api_test/webrequest/declarative"));
522 ASSERT_TRUE(test_server.InitializeAndWaitUntilReady()); 530 ASSERT_TRUE(test_server.InitializeAndWaitUntilReady());
523 531
524 net::TestURLRequestContext context; 532 net::TestURLRequestContext context;
525 net::TestDelegate delegate; 533 net::TestDelegate delegate;
526 net::TestURLRequest url_request(test_server.GetURL("/headers.html"), 534 scoped_ptr<net::URLRequest> url_request(
527 net::DEFAULT_PRIORITY, 535 context.CreateRequest(test_server.GetURL("/headers.html"),
528 &delegate, 536 net::DEFAULT_PRIORITY,
529 &context); 537 &delegate,
530 url_request.Start(); 538 NULL));
539 url_request->Start();
531 base::MessageLoop::current()->Run(); 540 base::MessageLoop::current()->Run();
532 541
533 // In all the tests below we assume that the server includes the headers 542 // In all the tests below we assume that the server includes the headers
534 // Custom-Header: custom/value 543 // Custom-Header: custom/value
535 // Custom-Header-B: valueA 544 // Custom-Header-B: valueA
536 // Custom-Header-B: valueB 545 // Custom-Header-B: valueB
537 // Custom-Header-C: valueC, valueD 546 // Custom-Header-C: valueC, valueD
538 // Custom-Header-D: 547 // Custom-Header-D:
539 // in the response, but does not include "Non-existing: void". 548 // in the response, but does not include "Non-existing: void".
540 549
541 std::vector< std::vector<const std::string*> > tests; 550 std::vector< std::vector<const std::string*> > tests;
542 bool result; 551 bool result;
543 552
544 const RequestStage stage = ON_HEADERS_RECEIVED; 553 const RequestStage stage = ON_HEADERS_RECEIVED;
545 554
546 // 1.a. -- All these tests should pass. 555 // 1.a. -- All these tests should pass.
547 const std::string kPassingCondition[] = { 556 const std::string kPassingCondition[] = {
548 keys::kNamePrefixKey, "Custom", 557 keys::kNamePrefixKey, "Custom",
549 keys::kNameSuffixKey, "m-header", // Header names are case insensitive. 558 keys::kNameSuffixKey, "m-header", // Header names are case insensitive.
550 keys::kValueContainsKey, "alu", 559 keys::kValueContainsKey, "alu",
551 keys::kValueEqualsKey, "custom/value" 560 keys::kValueEqualsKey, "custom/value"
552 }; 561 };
553 const size_t kPassingConditionSizes[] = { arraysize(kPassingCondition) }; 562 const size_t kPassingConditionSizes[] = { arraysize(kPassingCondition) };
554 GetArrayAsVector(kPassingCondition, kPassingConditionSizes, 1u, &tests); 563 GetArrayAsVector(kPassingCondition, kPassingConditionSizes, 1u, &tests);
555 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); 564 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
565 &result);
556 EXPECT_TRUE(result); 566 EXPECT_TRUE(result);
557 567
558 // 1.b. -- None of the following tests in the discjunction should pass. 568 // 1.b. -- None of the following tests in the discjunction should pass.
559 const std::string kFailCondition[] = { 569 const std::string kFailCondition[] = {
560 keys::kNamePrefixKey, " Custom", // Test 1. 570 keys::kNamePrefixKey, " Custom", // Test 1.
561 keys::kNameContainsKey, " -", // Test 2. 571 keys::kNameContainsKey, " -", // Test 2.
562 keys::kValueSuffixKey, "alu", // Test 3. 572 keys::kValueSuffixKey, "alu", // Test 3.
563 keys::kValueEqualsKey, "custom" // Test 4. 573 keys::kValueEqualsKey, "custom" // Test 4.
564 }; 574 };
565 const size_t kFailConditionSizes[] = { 2u, 2u, 2u, 2u }; 575 const size_t kFailConditionSizes[] = { 2u, 2u, 2u, 2u };
566 GetArrayAsVector(kFailCondition, kFailConditionSizes, 4u, &tests); 576 GetArrayAsVector(kFailCondition, kFailConditionSizes, 4u, &tests);
567 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); 577 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
578 &result);
568 EXPECT_FALSE(result); 579 EXPECT_FALSE(result);
569 580
570 // 1.c. -- This should fail (mixing name and value from different headers) 581 // 1.c. -- This should fail (mixing name and value from different headers)
571 const std::string kMixingCondition[] = { 582 const std::string kMixingCondition[] = {
572 keys::kNameSuffixKey, "Header-B", 583 keys::kNameSuffixKey, "Header-B",
573 keys::kValueEqualsKey, "custom/value" 584 keys::kValueEqualsKey, "custom/value"
574 }; 585 };
575 const size_t kMixingConditionSizes[] = { arraysize(kMixingCondition) }; 586 const size_t kMixingConditionSizes[] = { arraysize(kMixingCondition) };
576 GetArrayAsVector(kMixingCondition, kMixingConditionSizes, 1u, &tests); 587 GetArrayAsVector(kMixingCondition, kMixingConditionSizes, 1u, &tests);
577 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); 588 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
589 &result);
578 EXPECT_FALSE(result); 590 EXPECT_FALSE(result);
579 591
580 // 1.d. -- Test handling multiple values for one header (both should pass). 592 // 1.d. -- Test handling multiple values for one header (both should pass).
581 const std::string kMoreValues1[] = { 593 const std::string kMoreValues1[] = {
582 keys::kNameEqualsKey, "Custom-header-b", 594 keys::kNameEqualsKey, "Custom-header-b",
583 keys::kValueEqualsKey, "valueA" 595 keys::kValueEqualsKey, "valueA"
584 }; 596 };
585 const size_t kMoreValues1Sizes[] = { arraysize(kMoreValues1) }; 597 const size_t kMoreValues1Sizes[] = { arraysize(kMoreValues1) };
586 GetArrayAsVector(kMoreValues1, kMoreValues1Sizes, 1u, &tests); 598 GetArrayAsVector(kMoreValues1, kMoreValues1Sizes, 1u, &tests);
587 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); 599 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
600 &result);
588 EXPECT_TRUE(result); 601 EXPECT_TRUE(result);
589 const std::string kMoreValues2[] = { 602 const std::string kMoreValues2[] = {
590 keys::kNameEqualsKey, "Custom-header-b", 603 keys::kNameEqualsKey, "Custom-header-b",
591 keys::kValueEqualsKey, "valueB" 604 keys::kValueEqualsKey, "valueB"
592 }; 605 };
593 const size_t kMoreValues2Sizes[] = { arraysize(kMoreValues2) }; 606 const size_t kMoreValues2Sizes[] = { arraysize(kMoreValues2) };
594 GetArrayAsVector(kMoreValues2, kMoreValues2Sizes, 1u, &tests); 607 GetArrayAsVector(kMoreValues2, kMoreValues2Sizes, 1u, &tests);
595 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); 608 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
609 &result);
596 EXPECT_TRUE(result); 610 EXPECT_TRUE(result);
597 611
598 // 1.e. -- This should fail as conjunction but pass as disjunction. 612 // 1.e. -- This should fail as conjunction but pass as disjunction.
599 const std::string kConflict[] = { 613 const std::string kConflict[] = {
600 keys::kNameSuffixKey, "Header", // True for some header. 614 keys::kNameSuffixKey, "Header", // True for some header.
601 keys::kNameContainsKey, "Header-B" // True for a different header. 615 keys::kNameContainsKey, "Header-B" // True for a different header.
602 }; 616 };
603 // First disjunction, no conflict. 617 // First disjunction, no conflict.
604 const size_t kNoConflictSizes[] = { 2u, 2u }; 618 const size_t kNoConflictSizes[] = { 2u, 2u };
605 GetArrayAsVector(kConflict, kNoConflictSizes, 2u, &tests); 619 GetArrayAsVector(kConflict, kNoConflictSizes, 2u, &tests);
606 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); 620 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
621 &result);
607 EXPECT_TRUE(result); 622 EXPECT_TRUE(result);
608 // Then conjunction, conflict. 623 // Then conjunction, conflict.
609 const size_t kConflictSizes[] = { arraysize(kConflict) }; 624 const size_t kConflictSizes[] = { arraysize(kConflict) };
610 GetArrayAsVector(kConflict, kConflictSizes, 1u, &tests); 625 GetArrayAsVector(kConflict, kConflictSizes, 1u, &tests);
611 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); 626 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
627 &result);
612 EXPECT_FALSE(result); 628 EXPECT_FALSE(result);
613 629
614 // 1.f. -- This should pass, checking for correct treatment of ',' in values. 630 // 1.f. -- This should pass, checking for correct treatment of ',' in values.
615 const std::string kComma[] = { 631 const std::string kComma[] = {
616 keys::kNameSuffixKey, "Header-C", 632 keys::kNameSuffixKey, "Header-C",
617 keys::kValueEqualsKey, "valueC, valueD" 633 keys::kValueEqualsKey, "valueC, valueD"
618 }; 634 };
619 const size_t kCommaSizes[] = { arraysize(kComma) }; 635 const size_t kCommaSizes[] = { arraysize(kComma) };
620 GetArrayAsVector(kComma, kCommaSizes, 1u, &tests); 636 GetArrayAsVector(kComma, kCommaSizes, 1u, &tests);
621 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); 637 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
638 &result);
622 EXPECT_TRUE(result); 639 EXPECT_TRUE(result);
623 640
624 // 1.g. -- This should pass, empty values are values as well. 641 // 1.g. -- This should pass, empty values are values as well.
625 const std::string kEmpty[] = { 642 const std::string kEmpty[] = {
626 keys::kNameEqualsKey, "custom-header-d", 643 keys::kNameEqualsKey, "custom-header-d",
627 keys::kValueEqualsKey, "" 644 keys::kValueEqualsKey, ""
628 }; 645 };
629 const size_t kEmptySizes[] = { arraysize(kEmpty) }; 646 const size_t kEmptySizes[] = { arraysize(kEmpty) };
630 GetArrayAsVector(kEmpty, kEmptySizes, 1u, &tests); 647 GetArrayAsVector(kEmpty, kEmptySizes, 1u, &tests);
631 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); 648 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
649 &result);
632 EXPECT_TRUE(result); 650 EXPECT_TRUE(result);
633 651
634 // 1.h. -- Values are case-sensitive, this should fail. 652 // 1.h. -- Values are case-sensitive, this should fail.
635 const std::string kLowercase[] = { 653 const std::string kLowercase[] = {
636 keys::kNameEqualsKey, "Custom-header-b", 654 keys::kNameEqualsKey, "Custom-header-b",
637 keys::kValuePrefixKey, "valueb", // valueb != valueB 655 keys::kValuePrefixKey, "valueb", // valueb != valueB
638 keys::kNameEqualsKey, "Custom-header-b", 656 keys::kNameEqualsKey, "Custom-header-b",
639 keys::kValueSuffixKey, "valueb", 657 keys::kValueSuffixKey, "valueb",
640 keys::kNameEqualsKey, "Custom-header-b", 658 keys::kNameEqualsKey, "Custom-header-b",
641 keys::kValueContainsKey, "valueb", 659 keys::kValueContainsKey, "valueb",
642 keys::kNameEqualsKey, "Custom-header-b", 660 keys::kNameEqualsKey, "Custom-header-b",
643 keys::kValueEqualsKey, "valueb" 661 keys::kValueEqualsKey, "valueb"
644 }; 662 };
645 const size_t kLowercaseSizes[] = { 4u, 4u, 4u, 4u }; // As disjunction. 663 const size_t kLowercaseSizes[] = { 4u, 4u, 4u, 4u }; // As disjunction.
646 GetArrayAsVector(kLowercase, kLowercaseSizes, 4u, &tests); 664 GetArrayAsVector(kLowercase, kLowercaseSizes, 4u, &tests);
647 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); 665 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
666 &result);
648 EXPECT_FALSE(result); 667 EXPECT_FALSE(result);
649 668
650 // 1.i. -- Names are case-insensitive, this should pass. 669 // 1.i. -- Names are case-insensitive, this should pass.
651 const std::string kUppercase[] = { 670 const std::string kUppercase[] = {
652 keys::kNamePrefixKey, "CUSTOM-HEADER-B", 671 keys::kNamePrefixKey, "CUSTOM-HEADER-B",
653 keys::kNameSuffixKey, "CUSTOM-HEADER-B", 672 keys::kNameSuffixKey, "CUSTOM-HEADER-B",
654 keys::kNameEqualsKey, "CUSTOM-HEADER-B", 673 keys::kNameEqualsKey, "CUSTOM-HEADER-B",
655 keys::kNameContainsKey, "CUSTOM-HEADER-B" 674 keys::kNameContainsKey, "CUSTOM-HEADER-B"
656 }; 675 };
657 const size_t kUppercaseSizes[] = { arraysize(kUppercase) }; // Conjunction. 676 const size_t kUppercaseSizes[] = { arraysize(kUppercase) }; // Conjunction.
658 GetArrayAsVector(kUppercase, kUppercaseSizes, 1u, &tests); 677 GetArrayAsVector(kUppercase, kUppercaseSizes, 1u, &tests);
659 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); 678 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
679 &result);
660 EXPECT_TRUE(result); 680 EXPECT_TRUE(result);
661 681
662 // 2.a. -- This should pass as disjunction, because one of the tests passes. 682 // 2.a. -- This should pass as disjunction, because one of the tests passes.
663 const std::string kDisjunction[] = { 683 const std::string kDisjunction[] = {
664 keys::kNamePrefixKey, "Non-existing", // This one fails. 684 keys::kNamePrefixKey, "Non-existing", // This one fails.
665 keys::kNameSuffixKey, "Non-existing", // This one fails. 685 keys::kNameSuffixKey, "Non-existing", // This one fails.
666 keys::kValueEqualsKey, "void", // This one fails. 686 keys::kValueEqualsKey, "void", // This one fails.
667 keys::kValueContainsKey, "alu" // This passes. 687 keys::kValueContainsKey, "alu" // This passes.
668 }; 688 };
669 const size_t kDisjunctionSizes[] = { 2u, 2u, 2u, 2u }; 689 const size_t kDisjunctionSizes[] = { 2u, 2u, 2u, 2u };
670 GetArrayAsVector(kDisjunction, kDisjunctionSizes, 4u, &tests); 690 GetArrayAsVector(kDisjunction, kDisjunctionSizes, 4u, &tests);
671 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); 691 MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
692 &result);
672 EXPECT_TRUE(result); 693 EXPECT_TRUE(result);
673 694
674 // 3.a. -- This should pass. 695 // 3.a. -- This should pass.
675 const std::string kNonExistent[] = { 696 const std::string kNonExistent[] = {
676 keys::kNameEqualsKey, "Non-existing", 697 keys::kNameEqualsKey, "Non-existing",
677 keys::kValueEqualsKey, "void" 698 keys::kValueEqualsKey, "void"
678 }; 699 };
679 const size_t kNonExistentSizes[] = { arraysize(kNonExistent) }; 700 const size_t kNonExistentSizes[] = { arraysize(kNonExistent) };
680 GetArrayAsVector(kNonExistent, kNonExistentSizes, 1u, &tests); 701 GetArrayAsVector(kNonExistent, kNonExistentSizes, 1u, &tests);
681 MatchAndCheck( 702 MatchAndCheck(tests, keys::kExcludeResponseHeadersKey, stage,
682 tests, keys::kExcludeResponseHeadersKey, stage, &url_request, &result); 703 url_request.get(), &result);
683 EXPECT_TRUE(result); 704 EXPECT_TRUE(result);
684 705
685 // 3.b. -- This should fail. 706 // 3.b. -- This should fail.
686 const std::string kExisting[] = { 707 const std::string kExisting[] = {
687 keys::kNameEqualsKey, "custom-header-b", 708 keys::kNameEqualsKey, "custom-header-b",
688 keys::kValueEqualsKey, "valueB" 709 keys::kValueEqualsKey, "valueB"
689 }; 710 };
690 const size_t kExistingSize[] = { arraysize(kExisting) }; 711 const size_t kExistingSize[] = { arraysize(kExisting) };
691 GetArrayAsVector(kExisting, kExistingSize, 1u, &tests); 712 GetArrayAsVector(kExisting, kExistingSize, 1u, &tests);
692 MatchAndCheck( 713 MatchAndCheck(tests, keys::kExcludeResponseHeadersKey, stage,
693 tests, keys::kExcludeResponseHeadersKey, stage, &url_request, &result); 714 url_request.get(), &result);
694 EXPECT_FALSE(result); 715 EXPECT_FALSE(result);
695 } 716 }
696 717
697 } // namespace 718 } // namespace
698 } // namespace extensions 719 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698