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

Side by Side Diff: chrome/browser/renderer_host/resource_dispatcher_host_unittest.cc

Issue 5874002: Create a ResourceMessageFilter to filter resource related IPCs. This gets ri... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 <vector> 5 #include <vector>
6 6
7 #include "base/file_path.h" 7 #include "base/file_path.h"
8 #include "base/message_loop.h" 8 #include "base/message_loop.h"
9 #include "base/process_util.h" 9 #include "base/process_util.h"
10 #include "chrome/browser/browser_thread.h" 10 #include "chrome/browser/browser_thread.h"
11 #include "chrome/browser/child_process_security_policy.h" 11 #include "chrome/browser/child_process_security_policy.h"
12 #include "chrome/browser/renderer_host/resource_dispatcher_host.h" 12 #include "chrome/browser/renderer_host/resource_dispatcher_host.h"
13 #include "chrome/browser/renderer_host/resource_dispatcher_host_request_info.h" 13 #include "chrome/browser/renderer_host/resource_dispatcher_host_request_info.h"
14 #include "chrome/browser/renderer_host/resource_handler.h" 14 #include "chrome/browser/renderer_host/resource_handler.h"
15 #include "chrome/browser/renderer_host/resource_message_filter.h"
15 #include "chrome/common/chrome_plugin_lib.h" 16 #include "chrome/common/chrome_plugin_lib.h"
16 #include "chrome/common/render_messages.h" 17 #include "chrome/common/render_messages.h"
17 #include "chrome/common/render_messages_params.h" 18 #include "chrome/common/render_messages_params.h"
18 #include "chrome/common/resource_response.h" 19 #include "chrome/common/resource_response.h"
19 #include "net/base/net_errors.h" 20 #include "net/base/net_errors.h"
20 #include "net/base/upload_data.h" 21 #include "net/base/upload_data.h"
21 #include "net/http/http_util.h" 22 #include "net/http/http_util.h"
22 #include "net/url_request/url_request.h" 23 #include "net/url_request/url_request.h"
23 #include "net/url_request/url_request_job.h" 24 #include "net/url_request/url_request_job.h"
24 #include "net/url_request/url_request_test_job.h" 25 #include "net/url_request/url_request_test_job.h"
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 messages_.erase(messages_.begin() + i); 121 messages_.erase(messages_.begin() + i);
121 i--; 122 i--;
122 } 123 }
123 } 124 }
124 messages_.erase(messages_.begin()); 125 messages_.erase(messages_.begin());
125 msgs->push_back(cur_requests); 126 msgs->push_back(cur_requests);
126 } 127 }
127 } 128 }
128 129
129 // This class forwards the incoming messages to the ResourceDispatcherHostTest. 130 // This class forwards the incoming messages to the ResourceDispatcherHostTest.
130 // This is used to emulate different sub-procseses, since this receiver will 131 // This is used to emulate different sub-processes, since this filter will
131 // have a different ID than the original. For the test, we want all the incoming 132 // have a different ID than the original. For the test, we want all the incoming
132 // messages to go to the same place, which is why this forwards. 133 // messages to go to the same place, which is why this forwards.
133 class ForwardingReceiver : public ResourceDispatcherHost::Receiver { 134 class ForwardingFilter : public ResourceMessageFilter {
134 public: 135 public:
135 explicit ForwardingReceiver(ResourceDispatcherHost::Receiver* dest) 136 explicit ForwardingFilter(IPC::Message::Sender* dest)
136 : ResourceDispatcherHost::Receiver(dest->type(), -1), 137 : ResourceMessageFilter(ChildProcessInfo::GenerateChildProcessUniqueId(),
138 ChildProcessInfo::RENDER_PROCESS,
139 NULL),
137 dest_(dest) { 140 dest_(dest) {
138 set_handle(dest->handle()); 141 OnChannelConnected(base::GetCurrentProcId());
139 } 142 }
140 143
141 // ResourceDispatcherHost::Receiver implementation 144 // ResourceMessageFilter override
142 virtual bool Send(IPC::Message* msg) { 145 virtual bool Send(IPC::Message* msg) {
146 if (!dest_)
147 return false;
143 return dest_->Send(msg); 148 return dest_->Send(msg);
144 } 149 }
145 URLRequestContext* GetRequestContext(
146 uint32 request_id,
147 const ViewHostMsg_Resource_Request& request_data) {
148 return dest_->GetRequestContext(request_id, request_data);
149 }
150 150
151 private: 151 private:
152 ResourceDispatcherHost::Receiver* dest_; 152 IPC::Message::Sender* dest_;
153 153
154 DISALLOW_COPY_AND_ASSIGN(ForwardingReceiver); 154 DISALLOW_COPY_AND_ASSIGN(ForwardingFilter);
155 }; 155 };
156 156
157 class ResourceDispatcherHostTest : public testing::Test, 157 class ResourceDispatcherHostTest : public testing::Test,
158 public ResourceDispatcherHost::Receiver { 158 public IPC::Message::Sender {
159 public: 159 public:
160 ResourceDispatcherHostTest() 160 ResourceDispatcherHostTest()
161 : Receiver(ChildProcessInfo::RENDER_PROCESS, -1), 161 : ALLOW_THIS_IN_INITIALIZER_LIST(filter_(new ForwardingFilter(this))),
162 ui_thread_(BrowserThread::UI, &message_loop_), 162 ui_thread_(BrowserThread::UI, &message_loop_),
163 io_thread_(BrowserThread::IO, &message_loop_), 163 io_thread_(BrowserThread::IO, &message_loop_),
164 old_factory_(NULL), 164 old_factory_(NULL),
165 resource_type_(ResourceType::SUB_RESOURCE) { 165 resource_type_(ResourceType::SUB_RESOURCE) {
166 set_handle(base::GetCurrentProcessHandle());
167 } 166 }
168 // ResourceDispatcherHost::Receiver implementation 167 // IPC::Message::Sender implementation
169 virtual bool Send(IPC::Message* msg) { 168 virtual bool Send(IPC::Message* msg) {
170 accum_.AddMessage(*msg); 169 accum_.AddMessage(*msg);
171 delete msg; 170 delete msg;
172 return true; 171 return true;
173 } 172 }
174 173
175 URLRequestContext* GetRequestContext(
176 uint32 request_id,
177 const ViewHostMsg_Resource_Request& request_data) {
178 return NULL;
179 }
180
181 protected: 174 protected:
182 // testing::Test 175 // testing::Test
183 virtual void SetUp() { 176 virtual void SetUp() {
184 DCHECK(!test_fixture_); 177 DCHECK(!test_fixture_);
185 test_fixture_ = this; 178 test_fixture_ = this;
186 ChildProcessSecurityPolicy::GetInstance()->Add(0); 179 ChildProcessSecurityPolicy::GetInstance()->Add(0);
187 net::URLRequest::RegisterProtocolFactory( 180 net::URLRequest::RegisterProtocolFactory(
188 "test", 181 "test",
189 &ResourceDispatcherHostTest::Factory); 182 &ResourceDispatcherHostTest::Factory);
190 EnsureTestSchemeIsAllowed(); 183 EnsureTestSchemeIsAllowed();
(...skipping 12 matching lines...) Expand all
203 ChildProcessSecurityPolicy::GetInstance()->Remove(0); 196 ChildProcessSecurityPolicy::GetInstance()->Remove(0);
204 197
205 // The plugin lib is automatically loaded during these test 198 // The plugin lib is automatically loaded during these test
206 // and we want a clean environment for other tests. 199 // and we want a clean environment for other tests.
207 ChromePluginLib::UnloadAllPlugins(); 200 ChromePluginLib::UnloadAllPlugins();
208 201
209 // Flush the message loop to make Purify happy. 202 // Flush the message loop to make Purify happy.
210 message_loop_.RunAllPending(); 203 message_loop_.RunAllPending();
211 } 204 }
212 205
213 // Creates a request using the current test object as the receiver. 206 // Creates a request using the current test object as the filter.
214 void MakeTestRequest(int render_view_id, 207 void MakeTestRequest(int render_view_id,
215 int request_id, 208 int request_id,
216 const GURL& url); 209 const GURL& url);
217 210
218 // Generates a request using the given receiver. This will probably be a 211 // Generates a request using the given filter. This will probably be a
219 // ForwardingReceiver. 212 // ForwardingFilter.
220 void MakeTestRequest(ResourceDispatcherHost::Receiver* receiver, 213 void MakeTestRequest(ResourceMessageFilter* filter,
221 int render_view_id, 214 int render_view_id,
222 int request_id, 215 int request_id,
223 const GURL& url); 216 const GURL& url);
224 217
225 void MakeCancelRequest(int request_id); 218 void MakeCancelRequest(int request_id);
226 219
227 void EnsureTestSchemeIsAllowed() { 220 void EnsureTestSchemeIsAllowed() {
228 static bool have_white_listed_test_scheme = false; 221 static bool have_white_listed_test_scheme = false;
229 222
230 if (!have_white_listed_test_scheme) { 223 if (!have_white_listed_test_scheme) {
(...skipping 28 matching lines...) Expand all
259 static net::URLRequestJob* Factory(net::URLRequest* request, 252 static net::URLRequestJob* Factory(net::URLRequest* request,
260 const std::string& scheme) { 253 const std::string& scheme) {
261 if (test_fixture_->response_headers_.empty()) { 254 if (test_fixture_->response_headers_.empty()) {
262 return new URLRequestTestJob(request); 255 return new URLRequestTestJob(request);
263 } else { 256 } else {
264 return new URLRequestTestJob(request, test_fixture_->response_headers_, 257 return new URLRequestTestJob(request, test_fixture_->response_headers_,
265 test_fixture_->response_data_, false); 258 test_fixture_->response_data_, false);
266 } 259 }
267 } 260 }
268 261
262 scoped_refptr<ForwardingFilter> filter_;
269 MessageLoopForIO message_loop_; 263 MessageLoopForIO message_loop_;
270 BrowserThread ui_thread_; 264 BrowserThread ui_thread_;
271 BrowserThread io_thread_; 265 BrowserThread io_thread_;
272 ResourceDispatcherHost host_; 266 ResourceDispatcherHost host_;
273 ResourceIPCAccumulator accum_; 267 ResourceIPCAccumulator accum_;
274 std::string response_headers_; 268 std::string response_headers_;
275 std::string response_data_; 269 std::string response_data_;
276 std::string scheme_; 270 std::string scheme_;
277 net::URLRequest::ProtocolFactory* old_factory_; 271 net::URLRequest::ProtocolFactory* old_factory_;
278 ResourceType::Type resource_type_; 272 ResourceType::Type resource_type_;
279 static ResourceDispatcherHostTest* test_fixture_; 273 static ResourceDispatcherHostTest* test_fixture_;
280 }; 274 };
281 // Static. 275 // Static.
282 ResourceDispatcherHostTest* ResourceDispatcherHostTest::test_fixture_ = NULL; 276 ResourceDispatcherHostTest* ResourceDispatcherHostTest::test_fixture_ = NULL;
283 277
284 void ResourceDispatcherHostTest::MakeTestRequest(int render_view_id, 278 void ResourceDispatcherHostTest::MakeTestRequest(int render_view_id,
285 int request_id, 279 int request_id,
286 const GURL& url) { 280 const GURL& url) {
287 MakeTestRequest(this, render_view_id, request_id, url); 281 MakeTestRequest(filter_.get(), render_view_id, request_id, url);
288 } 282 }
289 283
290 void ResourceDispatcherHostTest::MakeTestRequest( 284 void ResourceDispatcherHostTest::MakeTestRequest(
291 ResourceDispatcherHost::Receiver* receiver, 285 ResourceMessageFilter* filter,
292 int render_view_id, 286 int render_view_id,
293 int request_id, 287 int request_id,
294 const GURL& url) { 288 const GURL& url) {
295 ViewHostMsg_Resource_Request request = 289 ViewHostMsg_Resource_Request request =
296 CreateResourceRequest("GET", resource_type_, url); 290 CreateResourceRequest("GET", resource_type_, url);
297 ViewHostMsg_RequestResource msg(render_view_id, request_id, request); 291 ViewHostMsg_RequestResource msg(render_view_id, request_id, request);
298 bool msg_was_ok; 292 bool msg_was_ok;
299 host_.OnMessageReceived(msg, receiver, &msg_was_ok); 293 host_.OnMessageReceived(msg, filter, &msg_was_ok);
300 KickOffRequest(); 294 KickOffRequest();
301 } 295 }
302 296
303 void ResourceDispatcherHostTest::MakeCancelRequest(int request_id) { 297 void ResourceDispatcherHostTest::MakeCancelRequest(int request_id) {
304 host_.CancelRequest(id(), request_id, false); 298 host_.CancelRequest(filter_->child_id(), request_id, false);
305 } 299 }
306 300
307 void CheckSuccessfulRequest(const std::vector<IPC::Message>& messages, 301 void CheckSuccessfulRequest(const std::vector<IPC::Message>& messages,
308 const std::string& reference_data) { 302 const std::string& reference_data) {
309 // A successful request will have received 4 messages: 303 // A successful request will have received 4 messages:
310 // ReceivedResponse (indicates headers received) 304 // ReceivedResponse (indicates headers received)
311 // DataReceived (data) 305 // DataReceived (data)
312 // XXX DataReceived (0 bytes remaining from a read) 306 // XXX DataReceived (0 bytes remaining from a read)
313 // RequestComplete (request is done) 307 // RequestComplete (request is done)
314 // 308 //
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
402 int request_id; 396 int request_id;
403 URLRequestStatus status; 397 URLRequestStatus status;
404 398
405 void* iter = NULL; 399 void* iter = NULL;
406 ASSERT_TRUE(IPC::ReadParam(&msgs[1][1], &iter, &request_id)); 400 ASSERT_TRUE(IPC::ReadParam(&msgs[1][1], &iter, &request_id));
407 ASSERT_TRUE(IPC::ReadParam(&msgs[1][1], &iter, &status)); 401 ASSERT_TRUE(IPC::ReadParam(&msgs[1][1], &iter, &status));
408 402
409 EXPECT_EQ(URLRequestStatus::CANCELED, status.status()); 403 EXPECT_EQ(URLRequestStatus::CANCELED, status.status());
410 } 404 }
411 405
406 // the host delegate acts as a second one so we can have some requests
brettw 2010/12/15 21:31:10 Style nit: can you capitalize this?
jam 2010/12/15 21:41:04 Done.
407 // pending and some canceled
408 class TestFilter : public ForwardingFilter {
409 public:
410 TestFilter()
411 : ForwardingFilter(NULL),
412 has_canceled_(false), received_after_canceled_(0) {
brettw 2010/12/15 21:31:10 Style nit: can you move the last initializer to it
jam 2010/12/15 21:41:04 Done.
413 }
414
415 // ForwardingFilter override
416 virtual bool Send(IPC::Message* msg) {
417 // no messages should be received when the process has been canceled
418 if (has_canceled_)
419 received_after_canceled_++;
420 delete msg;
421 return true;
422 }
423 bool has_canceled_;
424 int received_after_canceled_;
425 };
426
412 // Tests CancelRequestsForProcess 427 // Tests CancelRequestsForProcess
413 TEST_F(ResourceDispatcherHostTest, TestProcessCancel) { 428 TEST_F(ResourceDispatcherHostTest, TestProcessCancel) {
414 // the host delegate acts as a second one so we can have some requests 429 scoped_refptr<TestFilter> test_filter = new TestFilter();
415 // pending and some canceled
416 class TestReceiver : public ResourceDispatcherHost::Receiver {
417 public:
418 TestReceiver()
419 : Receiver(ChildProcessInfo::RENDER_PROCESS, -1),
420 has_canceled_(false),
421 received_after_canceled_(0) {
422 }
423
424 // ResourceDispatcherHost::Receiver implementation
425 virtual bool Send(IPC::Message* msg) {
426 // no messages should be received when the process has been canceled
427 if (has_canceled_)
428 received_after_canceled_++;
429 delete msg;
430 return true;
431 }
432 URLRequestContext* GetRequestContext(
433 uint32 request_id,
434 const ViewHostMsg_Resource_Request& request_data) {
435 return NULL;
436 }
437 bool has_canceled_;
438 int received_after_canceled_;
439 };
440 TestReceiver test_receiver;
441 430
442 // request 1 goes to the test delegate 431 // request 1 goes to the test delegate
443 ViewHostMsg_Resource_Request request = CreateResourceRequest( 432 ViewHostMsg_Resource_Request request = CreateResourceRequest(
444 "GET", ResourceType::SUB_RESOURCE, URLRequestTestJob::test_url_1()); 433 "GET", ResourceType::SUB_RESOURCE, URLRequestTestJob::test_url_1());
445 434
446 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(0)); 435 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(0));
447 436
448 MakeTestRequest(&test_receiver, 0, 1, URLRequestTestJob::test_url_1()); 437 MakeTestRequest(test_filter.get(), 0, 1, URLRequestTestJob::test_url_1());
449 438
450 // request 2 goes to us 439 // request 2 goes to us
451 MakeTestRequest(0, 2, URLRequestTestJob::test_url_2()); 440 MakeTestRequest(0, 2, URLRequestTestJob::test_url_2());
452 441
453 // request 3 goes to the test delegate 442 // request 3 goes to the test delegate
454 MakeTestRequest(&test_receiver, 0, 3, URLRequestTestJob::test_url_3()); 443 MakeTestRequest(test_filter.get(), 0, 3, URLRequestTestJob::test_url_3());
455 444
456 // TODO(mbelshe): 445 // TODO(mbelshe):
457 // Now that the async IO path is in place, the IO always completes on the 446 // Now that the async IO path is in place, the IO always completes on the
458 // initial call; so the requests have already completed. This basically 447 // initial call; so the requests have already completed. This basically
459 // breaks the whole test. 448 // breaks the whole test.
460 //EXPECT_EQ(3, host_.pending_requests()); 449 //EXPECT_EQ(3, host_.pending_requests());
461 450
462 // Process each request for one level so one callback is called. 451 // Process each request for one level so one callback is called.
463 for (int i = 0; i < 3; i++) 452 for (int i = 0; i < 3; i++)
464 EXPECT_TRUE(URLRequestTestJob::ProcessOnePendingMessage()); 453 EXPECT_TRUE(URLRequestTestJob::ProcessOnePendingMessage());
465 454
466 // Cancel the requests to the test process. 455 // Cancel the requests to the test process.
467 host_.CancelRequestsForProcess(id()); 456 host_.CancelRequestsForProcess(filter_->child_id());
468 test_receiver.has_canceled_ = true; 457 test_filter->has_canceled_ = true;
469 458
470 // Flush all the pending requests. 459 // Flush all the pending requests.
471 while (URLRequestTestJob::ProcessOnePendingMessage()) {} 460 while (URLRequestTestJob::ProcessOnePendingMessage()) {}
472 461
473 EXPECT_EQ(0, host_.pending_requests()); 462 EXPECT_EQ(0, host_.pending_requests());
474 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost( 463 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(filter_->child_id()));
475 id()));
476 464
477 // The test delegate should not have gotten any messages after being canceled. 465 // The test delegate should not have gotten any messages after being canceled.
478 ASSERT_EQ(0, test_receiver.received_after_canceled_); 466 ASSERT_EQ(0, test_filter->received_after_canceled_);
479 467
480 // We should have gotten exactly one result. 468 // We should have gotten exactly one result.
481 ResourceIPCAccumulator::ClassifiedMessages msgs; 469 ResourceIPCAccumulator::ClassifiedMessages msgs;
482 accum_.GetClassifiedMessages(&msgs); 470 accum_.GetClassifiedMessages(&msgs);
483 ASSERT_EQ(1U, msgs.size()); 471 ASSERT_EQ(1U, msgs.size());
484 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_2()); 472 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_2());
485 } 473 }
486 474
487 // Tests blocking and resuming requests. 475 // Tests blocking and resuming requests.
488 TEST_F(ResourceDispatcherHostTest, TestBlockingResumingRequests) { 476 TEST_F(ResourceDispatcherHostTest, TestBlockingResumingRequests) {
489 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost( 477 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(filter_->child_id()));
490 id()));
491 478
492 host_.BlockRequestsForRoute(id(), 1); 479 host_.BlockRequestsForRoute(filter_->child_id(), 1);
493 host_.BlockRequestsForRoute(id(), 2); 480 host_.BlockRequestsForRoute(filter_->child_id(), 2);
494 host_.BlockRequestsForRoute(id(), 3); 481 host_.BlockRequestsForRoute(filter_->child_id(), 3);
495 482
496 MakeTestRequest(0, 1, URLRequestTestJob::test_url_1()); 483 MakeTestRequest(0, 1, URLRequestTestJob::test_url_1());
497 MakeTestRequest(1, 2, URLRequestTestJob::test_url_2()); 484 MakeTestRequest(1, 2, URLRequestTestJob::test_url_2());
498 MakeTestRequest(0, 3, URLRequestTestJob::test_url_3()); 485 MakeTestRequest(0, 3, URLRequestTestJob::test_url_3());
499 MakeTestRequest(1, 4, URLRequestTestJob::test_url_1()); 486 MakeTestRequest(1, 4, URLRequestTestJob::test_url_1());
500 MakeTestRequest(2, 5, URLRequestTestJob::test_url_2()); 487 MakeTestRequest(2, 5, URLRequestTestJob::test_url_2());
501 MakeTestRequest(3, 6, URLRequestTestJob::test_url_3()); 488 MakeTestRequest(3, 6, URLRequestTestJob::test_url_3());
502 489
503 // Flush all the pending requests 490 // Flush all the pending requests
504 while (URLRequestTestJob::ProcessOnePendingMessage()) {} 491 while (URLRequestTestJob::ProcessOnePendingMessage()) {}
505 492
506 // Sort out all the messages we saw by request 493 // Sort out all the messages we saw by request
507 ResourceIPCAccumulator::ClassifiedMessages msgs; 494 ResourceIPCAccumulator::ClassifiedMessages msgs;
508 accum_.GetClassifiedMessages(&msgs); 495 accum_.GetClassifiedMessages(&msgs);
509 496
510 // All requests but the 2 for the RVH 0 should have been blocked. 497 // All requests but the 2 for the RVH 0 should have been blocked.
511 ASSERT_EQ(2U, msgs.size()); 498 ASSERT_EQ(2U, msgs.size());
512 499
513 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_1()); 500 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_1());
514 CheckSuccessfulRequest(msgs[1], URLRequestTestJob::test_data_3()); 501 CheckSuccessfulRequest(msgs[1], URLRequestTestJob::test_data_3());
515 502
516 // Resume requests for RVH 1 and flush pending requests. 503 // Resume requests for RVH 1 and flush pending requests.
517 host_.ResumeBlockedRequestsForRoute(id(), 1); 504 host_.ResumeBlockedRequestsForRoute(filter_->child_id(), 1);
518 KickOffRequest(); 505 KickOffRequest();
519 while (URLRequestTestJob::ProcessOnePendingMessage()) {} 506 while (URLRequestTestJob::ProcessOnePendingMessage()) {}
520 507
521 msgs.clear(); 508 msgs.clear();
522 accum_.GetClassifiedMessages(&msgs); 509 accum_.GetClassifiedMessages(&msgs);
523 ASSERT_EQ(2U, msgs.size()); 510 ASSERT_EQ(2U, msgs.size());
524 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_2()); 511 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_2());
525 CheckSuccessfulRequest(msgs[1], URLRequestTestJob::test_data_1()); 512 CheckSuccessfulRequest(msgs[1], URLRequestTestJob::test_data_1());
526 513
527 // Test that new requests are not blocked for RVH 1. 514 // Test that new requests are not blocked for RVH 1.
528 MakeTestRequest(1, 7, URLRequestTestJob::test_url_1()); 515 MakeTestRequest(1, 7, URLRequestTestJob::test_url_1());
529 while (URLRequestTestJob::ProcessOnePendingMessage()) {} 516 while (URLRequestTestJob::ProcessOnePendingMessage()) {}
530 msgs.clear(); 517 msgs.clear();
531 accum_.GetClassifiedMessages(&msgs); 518 accum_.GetClassifiedMessages(&msgs);
532 ASSERT_EQ(1U, msgs.size()); 519 ASSERT_EQ(1U, msgs.size());
533 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_1()); 520 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_1());
534 521
535 // Now resumes requests for all RVH (2 and 3). 522 // Now resumes requests for all RVH (2 and 3).
536 host_.ResumeBlockedRequestsForRoute(id(), 2); 523 host_.ResumeBlockedRequestsForRoute(filter_->child_id(), 2);
537 host_.ResumeBlockedRequestsForRoute(id(), 3); 524 host_.ResumeBlockedRequestsForRoute(filter_->child_id(), 3);
538 KickOffRequest(); 525 KickOffRequest();
539 while (URLRequestTestJob::ProcessOnePendingMessage()) {} 526 while (URLRequestTestJob::ProcessOnePendingMessage()) {}
540 527
541 EXPECT_EQ(0, 528 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(filter_->child_id()));
542 host_.GetOutstandingRequestsMemoryCost(id()));
543 529
544 msgs.clear(); 530 msgs.clear();
545 accum_.GetClassifiedMessages(&msgs); 531 accum_.GetClassifiedMessages(&msgs);
546 ASSERT_EQ(2U, msgs.size()); 532 ASSERT_EQ(2U, msgs.size());
547 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_2()); 533 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_2());
548 CheckSuccessfulRequest(msgs[1], URLRequestTestJob::test_data_3()); 534 CheckSuccessfulRequest(msgs[1], URLRequestTestJob::test_data_3());
549 } 535 }
550 536
551 // Tests blocking and canceling requests. 537 // Tests blocking and canceling requests.
552 TEST_F(ResourceDispatcherHostTest, TestBlockingCancelingRequests) { 538 TEST_F(ResourceDispatcherHostTest, TestBlockingCancelingRequests) {
553 EXPECT_EQ(0, 539 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(filter_->child_id()));
554 host_.GetOutstandingRequestsMemoryCost(id()));
555 540
556 host_.BlockRequestsForRoute(id(), 1); 541 host_.BlockRequestsForRoute(filter_->child_id(), 1);
557 542
558 MakeTestRequest(0, 1, URLRequestTestJob::test_url_1()); 543 MakeTestRequest(0, 1, URLRequestTestJob::test_url_1());
559 MakeTestRequest(1, 2, URLRequestTestJob::test_url_2()); 544 MakeTestRequest(1, 2, URLRequestTestJob::test_url_2());
560 MakeTestRequest(0, 3, URLRequestTestJob::test_url_3()); 545 MakeTestRequest(0, 3, URLRequestTestJob::test_url_3());
561 MakeTestRequest(1, 4, URLRequestTestJob::test_url_1()); 546 MakeTestRequest(1, 4, URLRequestTestJob::test_url_1());
562 547
563 // Flush all the pending requests. 548 // Flush all the pending requests.
564 while (URLRequestTestJob::ProcessOnePendingMessage()) {} 549 while (URLRequestTestJob::ProcessOnePendingMessage()) {}
565 550
566 // Sort out all the messages we saw by request. 551 // Sort out all the messages we saw by request.
567 ResourceIPCAccumulator::ClassifiedMessages msgs; 552 ResourceIPCAccumulator::ClassifiedMessages msgs;
568 accum_.GetClassifiedMessages(&msgs); 553 accum_.GetClassifiedMessages(&msgs);
569 554
570 // The 2 requests for the RVH 0 should have been processed. 555 // The 2 requests for the RVH 0 should have been processed.
571 ASSERT_EQ(2U, msgs.size()); 556 ASSERT_EQ(2U, msgs.size());
572 557
573 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_1()); 558 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_1());
574 CheckSuccessfulRequest(msgs[1], URLRequestTestJob::test_data_3()); 559 CheckSuccessfulRequest(msgs[1], URLRequestTestJob::test_data_3());
575 560
576 // Cancel requests for RVH 1. 561 // Cancel requests for RVH 1.
577 host_.CancelBlockedRequestsForRoute(id(), 1); 562 host_.CancelBlockedRequestsForRoute(filter_->child_id(), 1);
578 KickOffRequest(); 563 KickOffRequest();
579 while (URLRequestTestJob::ProcessOnePendingMessage()) {} 564 while (URLRequestTestJob::ProcessOnePendingMessage()) {}
580 565
581 EXPECT_EQ(0, 566 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(filter_->child_id()));
582 host_.GetOutstandingRequestsMemoryCost(id()));
583 567
584 msgs.clear(); 568 msgs.clear();
585 accum_.GetClassifiedMessages(&msgs); 569 accum_.GetClassifiedMessages(&msgs);
586 ASSERT_EQ(0U, msgs.size()); 570 ASSERT_EQ(0U, msgs.size());
587 } 571 }
588 572
589 // Tests that blocked requests are canceled if their associated process dies. 573 // Tests that blocked requests are canceled if their associated process dies.
590 TEST_F(ResourceDispatcherHostTest, TestBlockedRequestsProcessDies) { 574 TEST_F(ResourceDispatcherHostTest, TestBlockedRequestsProcessDies) {
591 // This second receiver is used to emulate a second process. 575 // This second filter is used to emulate a second process.
592 ForwardingReceiver second_receiver(this); 576 scoped_refptr<ForwardingFilter> second_filter = new ForwardingFilter(this);
593 577
594 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost( 578 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(filter_->child_id()));
595 id())); 579 EXPECT_EQ(0,
596 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost( 580 host_.GetOutstandingRequestsMemoryCost(second_filter->child_id()));
597 second_receiver.id()));
598 581
599 host_.BlockRequestsForRoute(second_receiver.id(), 0); 582 host_.BlockRequestsForRoute(second_filter->child_id(), 0);
600 583
601 MakeTestRequest(this, 0, 1, URLRequestTestJob::test_url_1()); 584 MakeTestRequest(filter_.get(), 0, 1, URLRequestTestJob::test_url_1());
602 MakeTestRequest(&second_receiver, 0, 2, URLRequestTestJob::test_url_2()); 585 MakeTestRequest(second_filter.get(), 0, 2, URLRequestTestJob::test_url_2());
603 MakeTestRequest(this, 0, 3, URLRequestTestJob::test_url_3()); 586 MakeTestRequest(filter_.get(), 0, 3, URLRequestTestJob::test_url_3());
604 MakeTestRequest(&second_receiver, 0, 4, URLRequestTestJob::test_url_1()); 587 MakeTestRequest(second_filter.get(), 0, 4, URLRequestTestJob::test_url_1());
605 588
606 // Simulate process death. 589 // Simulate process death.
607 host_.CancelRequestsForProcess(second_receiver.id()); 590 host_.CancelRequestsForProcess(second_filter->child_id());
608 591
609 // Flush all the pending requests. 592 // Flush all the pending requests.
610 while (URLRequestTestJob::ProcessOnePendingMessage()) {} 593 while (URLRequestTestJob::ProcessOnePendingMessage()) {}
611 594
612 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost( 595 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(filter_->child_id()));
613 id())); 596 EXPECT_EQ(0,
614 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost( 597 host_.GetOutstandingRequestsMemoryCost(second_filter->child_id()));
615 second_receiver.id()));
616 598
617 // Sort out all the messages we saw by request. 599 // Sort out all the messages we saw by request.
618 ResourceIPCAccumulator::ClassifiedMessages msgs; 600 ResourceIPCAccumulator::ClassifiedMessages msgs;
619 accum_.GetClassifiedMessages(&msgs); 601 accum_.GetClassifiedMessages(&msgs);
620 602
621 // The 2 requests for the RVH 0 should have been processed. 603 // The 2 requests for the RVH 0 should have been processed.
622 ASSERT_EQ(2U, msgs.size()); 604 ASSERT_EQ(2U, msgs.size());
623 605
624 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_1()); 606 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_1());
625 CheckSuccessfulRequest(msgs[1], URLRequestTestJob::test_data_3()); 607 CheckSuccessfulRequest(msgs[1], URLRequestTestJob::test_data_3());
626 608
627 EXPECT_TRUE(host_.blocked_requests_map_.empty()); 609 EXPECT_TRUE(host_.blocked_requests_map_.empty());
628 } 610 }
629 611
630 // Tests that blocked requests don't leak when the ResourceDispatcherHost goes 612 // Tests that blocked requests don't leak when the ResourceDispatcherHost goes
631 // away. Note that we rely on Purify for finding the leaks if any. 613 // away. Note that we rely on Purify for finding the leaks if any.
632 // If this test turns the Purify bot red, check the ResourceDispatcherHost 614 // If this test turns the Purify bot red, check the ResourceDispatcherHost
633 // destructor to make sure the blocked requests are deleted. 615 // destructor to make sure the blocked requests are deleted.
634 TEST_F(ResourceDispatcherHostTest, TestBlockedRequestsDontLeak) { 616 TEST_F(ResourceDispatcherHostTest, TestBlockedRequestsDontLeak) {
635 // This second receiver is used to emulate a second process. 617 // This second filter is used to emulate a second process.
636 ForwardingReceiver second_receiver(this); 618 scoped_refptr<ForwardingFilter> second_filter = new ForwardingFilter(this);
637 619
638 host_.BlockRequestsForRoute(id(), 1); 620 host_.BlockRequestsForRoute(filter_->child_id(), 1);
639 host_.BlockRequestsForRoute(id(), 2); 621 host_.BlockRequestsForRoute(filter_->child_id(), 2);
640 host_.BlockRequestsForRoute(second_receiver.id(), 1); 622 host_.BlockRequestsForRoute(second_filter->child_id(), 1);
641 623
642 MakeTestRequest(this, 0, 1, URLRequestTestJob::test_url_1()); 624 MakeTestRequest(filter_.get(), 0, 1, URLRequestTestJob::test_url_1());
643 MakeTestRequest(this, 1, 2, URLRequestTestJob::test_url_2()); 625 MakeTestRequest(filter_.get(), 1, 2, URLRequestTestJob::test_url_2());
644 MakeTestRequest(this, 0, 3, URLRequestTestJob::test_url_3()); 626 MakeTestRequest(filter_.get(), 0, 3, URLRequestTestJob::test_url_3());
645 MakeTestRequest(&second_receiver, 1, 4, URLRequestTestJob::test_url_1()); 627 MakeTestRequest(second_filter.get(), 1, 4, URLRequestTestJob::test_url_1());
646 MakeTestRequest(this, 2, 5, URLRequestTestJob::test_url_2()); 628 MakeTestRequest(filter_.get(), 2, 5, URLRequestTestJob::test_url_2());
647 MakeTestRequest(this, 2, 6, URLRequestTestJob::test_url_3()); 629 MakeTestRequest(filter_.get(), 2, 6, URLRequestTestJob::test_url_3());
648 630
649 // Flush all the pending requests. 631 // Flush all the pending requests.
650 while (URLRequestTestJob::ProcessOnePendingMessage()) {} 632 while (URLRequestTestJob::ProcessOnePendingMessage()) {}
651 } 633 }
652 634
653 // Test the private helper method "CalculateApproximateMemoryCost()". 635 // Test the private helper method "CalculateApproximateMemoryCost()".
654 TEST_F(ResourceDispatcherHostTest, CalculateApproximateMemoryCost) { 636 TEST_F(ResourceDispatcherHostTest, CalculateApproximateMemoryCost) {
655 net::URLRequest req(GURL("http://www.google.com"), NULL); 637 net::URLRequest req(GURL("http://www.google.com"), NULL);
656 EXPECT_EQ(4427, ResourceDispatcherHost::CalculateApproximateMemoryCost(&req)); 638 EXPECT_EQ(4427, ResourceDispatcherHost::CalculateApproximateMemoryCost(&req));
657 639
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
702 // When an entry reaches 0, it should be deleted. 684 // When an entry reaches 0, it should be deleted.
703 EXPECT_TRUE(host_.outstanding_requests_memory_cost_map_.end() == 685 EXPECT_TRUE(host_.outstanding_requests_memory_cost_map_.end() ==
704 host_.outstanding_requests_memory_cost_map_.find(7)); 686 host_.outstanding_requests_memory_cost_map_.find(7));
705 EXPECT_TRUE(host_.outstanding_requests_memory_cost_map_.end() == 687 EXPECT_TRUE(host_.outstanding_requests_memory_cost_map_.end() ==
706 host_.outstanding_requests_memory_cost_map_.find(3)); 688 host_.outstanding_requests_memory_cost_map_.find(3));
707 } 689 }
708 690
709 // Test that when too many requests are outstanding for a particular 691 // Test that when too many requests are outstanding for a particular
710 // render_process_host_id, any subsequent request from it fails. 692 // render_process_host_id, any subsequent request from it fails.
711 TEST_F(ResourceDispatcherHostTest, TooManyOutstandingRequests) { 693 TEST_F(ResourceDispatcherHostTest, TooManyOutstandingRequests) {
712 EXPECT_EQ(0, 694 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(filter_->child_id()));
713 host_.GetOutstandingRequestsMemoryCost(id()));
714 695
715 // Expected cost of each request as measured by 696 // Expected cost of each request as measured by
716 // ResourceDispatcherHost::CalculateApproximateMemoryCost(). 697 // ResourceDispatcherHost::CalculateApproximateMemoryCost().
717 int kMemoryCostOfTest2Req = 698 int kMemoryCostOfTest2Req =
718 ResourceDispatcherHost::kAvgBytesPerOutstandingRequest + 699 ResourceDispatcherHost::kAvgBytesPerOutstandingRequest +
719 std::string("GET").size() + 700 std::string("GET").size() +
720 URLRequestTestJob::test_url_2().spec().size(); 701 URLRequestTestJob::test_url_2().spec().size();
721 702
722 // Tighten the bound on the ResourceDispatcherHost, to speed things up. 703 // Tighten the bound on the ResourceDispatcherHost, to speed things up.
723 int kMaxCostPerProcess = 440000; 704 int kMaxCostPerProcess = 440000;
724 host_.set_max_outstanding_requests_cost_per_process(kMaxCostPerProcess); 705 host_.set_max_outstanding_requests_cost_per_process(kMaxCostPerProcess);
725 706
726 // Determine how many instance of test_url_2() we can request before 707 // Determine how many instance of test_url_2() we can request before
727 // throttling kicks in. 708 // throttling kicks in.
728 size_t kMaxRequests = kMaxCostPerProcess / kMemoryCostOfTest2Req; 709 size_t kMaxRequests = kMaxCostPerProcess / kMemoryCostOfTest2Req;
729 710
730 // This second receiver is used to emulate a second process. 711 // This second filter is used to emulate a second process.
731 ForwardingReceiver second_receiver(this); 712 scoped_refptr<ForwardingFilter> second_filter = new ForwardingFilter(this);
732 713
733 // Saturate the number of outstanding requests for our process. 714 // Saturate the number of outstanding requests for our process.
734 for (size_t i = 0; i < kMaxRequests; ++i) 715 for (size_t i = 0; i < kMaxRequests; ++i)
735 MakeTestRequest(this, 0, i + 1, URLRequestTestJob::test_url_2()); 716 MakeTestRequest(filter_.get(), 0, i + 1, URLRequestTestJob::test_url_2());
736 717
737 // Issue two more requests for our process -- these should fail immediately. 718 // Issue two more requests for our process -- these should fail immediately.
738 MakeTestRequest(this, 0, kMaxRequests + 1, URLRequestTestJob::test_url_2()); 719 MakeTestRequest(filter_.get(), 0, kMaxRequests + 1,
739 MakeTestRequest(this, 0, kMaxRequests + 2, URLRequestTestJob::test_url_2()); 720 URLRequestTestJob::test_url_2());
721 MakeTestRequest(filter_.get(), 0, kMaxRequests + 2,
722 URLRequestTestJob::test_url_2());
740 723
741 // Issue two requests for the second process -- these should succeed since 724 // Issue two requests for the second process -- these should succeed since
742 // it is just process 0 that is saturated. 725 // it is just process 0 that is saturated.
743 MakeTestRequest(&second_receiver, 0, kMaxRequests + 3, 726 MakeTestRequest(second_filter.get(), 0, kMaxRequests + 3,
744 URLRequestTestJob::test_url_2()); 727 URLRequestTestJob::test_url_2());
745 MakeTestRequest(&second_receiver, 0, kMaxRequests + 4, 728 MakeTestRequest(second_filter.get(), 0, kMaxRequests + 4,
746 URLRequestTestJob::test_url_2()); 729 URLRequestTestJob::test_url_2());
747 730
748 // Flush all the pending requests. 731 // Flush all the pending requests.
749 while (URLRequestTestJob::ProcessOnePendingMessage()) {} 732 while (URLRequestTestJob::ProcessOnePendingMessage()) {}
750 MessageLoop::current()->RunAllPending(); 733 MessageLoop::current()->RunAllPending();
751 734
752 EXPECT_EQ(0, 735 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(filter_->child_id()));
753 host_.GetOutstandingRequestsMemoryCost(id()));
754 736
755 // Sorts out all the messages we saw by request. 737 // Sorts out all the messages we saw by request.
756 ResourceIPCAccumulator::ClassifiedMessages msgs; 738 ResourceIPCAccumulator::ClassifiedMessages msgs;
757 accum_.GetClassifiedMessages(&msgs); 739 accum_.GetClassifiedMessages(&msgs);
758 740
759 // We issued (kMaxRequests + 4) total requests. 741 // We issued (kMaxRequests + 4) total requests.
760 ASSERT_EQ(kMaxRequests + 4, msgs.size()); 742 ASSERT_EQ(kMaxRequests + 4, msgs.size());
761 743
762 // Check that the first kMaxRequests succeeded. 744 // Check that the first kMaxRequests succeeded.
763 for (size_t i = 0; i < kMaxRequests; ++i) 745 for (size_t i = 0; i < kMaxRequests; ++i)
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
1027 EXPECT_TRUE(request_info_->replace_extension_localization_templates()); 1009 EXPECT_TRUE(request_info_->replace_extension_localization_templates());
1028 } 1010 }
1029 1011
1030 TEST_F(ApplyExtensionLocalizationFilterTest, GoodSchemeWrongResourceType) { 1012 TEST_F(ApplyExtensionLocalizationFilterTest, GoodSchemeWrongResourceType) {
1031 resource_type_ = ResourceType::MAIN_FRAME; 1013 resource_type_ = ResourceType::MAIN_FRAME;
1032 ResourceDispatcherHost::ApplyExtensionLocalizationFilter(*url_, 1014 ResourceDispatcherHost::ApplyExtensionLocalizationFilter(*url_,
1033 resource_type_, request_info_.get()); 1015 resource_type_, request_info_.get());
1034 1016
1035 EXPECT_FALSE(request_info_->replace_extension_localization_templates()); 1017 EXPECT_FALSE(request_info_->replace_extension_localization_templates());
1036 } 1018 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698