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

Side by Side Diff: content/browser/loader/resource_dispatcher_host_unittest.cc

Issue 129173002: Adds the new URLRequest::OnBeforeNetworkStart hook to the (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@defer_1_net
Patch Set: Created 6 years, 11 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 <vector> 5 #include <vector>
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/files/file_path.h" 8 #include "base/files/file_path.h"
9 #include "base/memory/scoped_vector.h" 9 #include "base/memory/scoped_vector.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 *resource_context = resource_context_; 203 *resource_context = resource_context_;
204 *request_context = resource_context_->GetRequestContext(); 204 *request_context = resource_context_->GetRequestContext();
205 } 205 }
206 206
207 IPC::Sender* dest_; 207 IPC::Sender* dest_;
208 ResourceContext* resource_context_; 208 ResourceContext* resource_context_;
209 209
210 DISALLOW_COPY_AND_ASSIGN(ForwardingFilter); 210 DISALLOW_COPY_AND_ASSIGN(ForwardingFilter);
211 }; 211 };
212 212
213 // This class is a variation on URLRequestTestJob that will call
214 // URLRequest::OnBeforeNetworkStart before starting.
215 class URLRequestTestDelayedNetworkJob : public net::URLRequestTestJob {
216 public:
217 URLRequestTestDelayedNetworkJob(net::URLRequest* request,
218 net::NetworkDelegate* network_delegate)
219 : net::URLRequestTestJob(request, network_delegate) {}
220
221 // Only start if not deferred for network start.
222 virtual void Start() OVERRIDE {
223 bool defer = false;
224 NotifyBeforeNetworkStart(&defer);
225 if (defer)
226 return;
227 net::URLRequestTestJob::Start();
228 }
229
230 virtual void ResumeNetworkStart() OVERRIDE {
231 net::URLRequestTestJob::StartAsync();
232 }
233
234 private:
235 virtual ~URLRequestTestDelayedNetworkJob() {}
236
237 DISALLOW_COPY_AND_ASSIGN(URLRequestTestDelayedNetworkJob);
238 };
239
213 // This class is a variation on URLRequestTestJob in that it does 240 // This class is a variation on URLRequestTestJob in that it does
214 // not complete start upon entry, only when specifically told to. 241 // not complete start upon entry, only when specifically told to.
215 class URLRequestTestDelayedStartJob : public net::URLRequestTestJob { 242 class URLRequestTestDelayedStartJob : public net::URLRequestTestJob {
216 public: 243 public:
217 URLRequestTestDelayedStartJob(net::URLRequest* request, 244 URLRequestTestDelayedStartJob(net::URLRequest* request,
218 net::NetworkDelegate* network_delegate) 245 net::NetworkDelegate* network_delegate)
219 : net::URLRequestTestJob(request, network_delegate) { 246 : net::URLRequestTestJob(request, network_delegate) {
220 Init(); 247 Init();
221 } 248 }
222 URLRequestTestDelayedStartJob(net::URLRequest* request, 249 URLRequestTestDelayedStartJob(net::URLRequest* request,
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
387 const GURL& current_url, 414 const GURL& current_url,
388 const GURL& new_url) OVERRIDE { 415 const GURL& new_url) OVERRIDE {
389 return true; 416 return true;
390 } 417 }
391 }; 418 };
392 419
393 enum GenericResourceThrottleFlags { 420 enum GenericResourceThrottleFlags {
394 NONE = 0, 421 NONE = 0,
395 DEFER_STARTING_REQUEST = 1 << 0, 422 DEFER_STARTING_REQUEST = 1 << 0,
396 DEFER_PROCESSING_RESPONSE = 1 << 1, 423 DEFER_PROCESSING_RESPONSE = 1 << 1,
397 CANCEL_BEFORE_START = 1 << 2 424 CANCEL_BEFORE_START = 1 << 2,
425 DEFER_NETWORK_START = 1 << 3
398 }; 426 };
399 427
400 // Throttle that tracks the current throttle blocking a request. Only one 428 // Throttle that tracks the current throttle blocking a request. Only one
401 // can throttle any request at a time. 429 // can throttle any request at a time.
402 class GenericResourceThrottle : public ResourceThrottle { 430 class GenericResourceThrottle : public ResourceThrottle {
403 public: 431 public:
404 // The value is used to indicate that the throttle should not provide 432 // The value is used to indicate that the throttle should not provide
405 // a error code when cancelling a request. net::OK is used, because this 433 // a error code when cancelling a request. net::OK is used, because this
406 // is not an error code. 434 // is not an error code.
407 static const int USE_DEFAULT_CANCEL_ERROR_CODE = net::OK; 435 static const int USE_DEFAULT_CANCEL_ERROR_CODE = net::OK;
(...skipping 26 matching lines...) Expand all
434 } 462 }
435 463
436 virtual void WillProcessResponse(bool* defer) OVERRIDE { 464 virtual void WillProcessResponse(bool* defer) OVERRIDE {
437 ASSERT_EQ(NULL, active_throttle_); 465 ASSERT_EQ(NULL, active_throttle_);
438 if (flags_ & DEFER_PROCESSING_RESPONSE) { 466 if (flags_ & DEFER_PROCESSING_RESPONSE) {
439 active_throttle_ = this; 467 active_throttle_ = this;
440 *defer = true; 468 *defer = true;
441 } 469 }
442 } 470 }
443 471
472 virtual void OnBeforeNetworkStart(bool* defer) OVERRIDE {
473 ASSERT_EQ(NULL, active_throttle_);
474
475 if (flags_ & DEFER_NETWORK_START) {
476 active_throttle_ = this;
477 *defer = true;
478 }
479 }
480
444 virtual const char* GetNameForLogging() const OVERRIDE { 481 virtual const char* GetNameForLogging() const OVERRIDE {
445 return "GenericResourceThrottle"; 482 return "GenericResourceThrottle";
446 } 483 }
447 484
448 void Resume() { 485 void Resume() {
449 ASSERT_TRUE(this == active_throttle_); 486 ASSERT_TRUE(this == active_throttle_);
450 active_throttle_ = NULL; 487 active_throttle_ = NULL;
451 controller()->Resume(); 488 controller()->Resume();
452 } 489 }
453 490
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
566 virtual void SetUp() { 603 virtual void SetUp() {
567 DCHECK(!test_fixture_); 604 DCHECK(!test_fixture_);
568 test_fixture_ = this; 605 test_fixture_ = this;
569 ChildProcessSecurityPolicyImpl::GetInstance()->Add(0); 606 ChildProcessSecurityPolicyImpl::GetInstance()->Add(0);
570 net::URLRequest::Deprecated::RegisterProtocolFactory( 607 net::URLRequest::Deprecated::RegisterProtocolFactory(
571 "test", 608 "test",
572 &ResourceDispatcherHostTest::Factory); 609 &ResourceDispatcherHostTest::Factory);
573 EnsureTestSchemeIsAllowed(); 610 EnsureTestSchemeIsAllowed();
574 delay_start_ = false; 611 delay_start_ = false;
575 delay_complete_ = false; 612 delay_complete_ = false;
613 network_start_notification_ = false;
576 url_request_jobs_created_count_ = 0; 614 url_request_jobs_created_count_ = 0;
577 } 615 }
578 616
579 virtual void TearDown() { 617 virtual void TearDown() {
580 net::URLRequest::Deprecated::RegisterProtocolFactory("test", NULL); 618 net::URLRequest::Deprecated::RegisterProtocolFactory("test", NULL);
581 if (!scheme_.empty()) 619 if (!scheme_.empty())
582 net::URLRequest::Deprecated::RegisterProtocolFactory( 620 net::URLRequest::Deprecated::RegisterProtocolFactory(
583 scheme_, old_factory_); 621 scheme_, old_factory_);
584 622
585 EXPECT_TRUE(URLRequestTestDelayedStartJob::DelayedStartQueueEmpty()); 623 EXPECT_TRUE(URLRequestTestDelayedStartJob::DelayedStartQueueEmpty());
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
663 static net::URLRequestJob* Factory(net::URLRequest* request, 701 static net::URLRequestJob* Factory(net::URLRequest* request,
664 net::NetworkDelegate* network_delegate, 702 net::NetworkDelegate* network_delegate,
665 const std::string& scheme) { 703 const std::string& scheme) {
666 url_request_jobs_created_count_++; 704 url_request_jobs_created_count_++;
667 if (test_fixture_->response_headers_.empty()) { 705 if (test_fixture_->response_headers_.empty()) {
668 if (delay_start_) { 706 if (delay_start_) {
669 return new URLRequestTestDelayedStartJob(request, network_delegate); 707 return new URLRequestTestDelayedStartJob(request, network_delegate);
670 } else if (delay_complete_) { 708 } else if (delay_complete_) {
671 return new URLRequestTestDelayedCompletionJob(request, 709 return new URLRequestTestDelayedCompletionJob(request,
672 network_delegate); 710 network_delegate);
711 } else if (network_start_notification_) {
712 return new URLRequestTestDelayedNetworkJob(request, network_delegate);
673 } else if (scheme == "big-job") { 713 } else if (scheme == "big-job") {
674 return new URLRequestBigJob(request, network_delegate); 714 return new URLRequestBigJob(request, network_delegate);
675 } else { 715 } else {
676 return new net::URLRequestTestJob(request, network_delegate); 716 return new net::URLRequestTestJob(request, network_delegate);
677 } 717 }
678 } else { 718 } else {
679 if (delay_start_) { 719 if (delay_start_) {
680 return new URLRequestTestDelayedStartJob( 720 return new URLRequestTestDelayedStartJob(
681 request, network_delegate, 721 request, network_delegate,
682 test_fixture_->response_headers_, test_fixture_->response_data_, 722 test_fixture_->response_headers_, test_fixture_->response_data_,
(...skipping 13 matching lines...) Expand all
696 } 736 }
697 737
698 void SetDelayedStartJobGeneration(bool delay_job_start) { 738 void SetDelayedStartJobGeneration(bool delay_job_start) {
699 delay_start_ = delay_job_start; 739 delay_start_ = delay_job_start;
700 } 740 }
701 741
702 void SetDelayedCompleteJobGeneration(bool delay_job_complete) { 742 void SetDelayedCompleteJobGeneration(bool delay_job_complete) {
703 delay_complete_ = delay_job_complete; 743 delay_complete_ = delay_job_complete;
704 } 744 }
705 745
746 void SetNetworkStartNotificationJobGeneration(bool notification) {
747 network_start_notification_ = notification;
748 }
749
706 void GenerateDataReceivedACK(const IPC::Message& msg) { 750 void GenerateDataReceivedACK(const IPC::Message& msg) {
707 EXPECT_EQ(ResourceMsg_DataReceived::ID, msg.type()); 751 EXPECT_EQ(ResourceMsg_DataReceived::ID, msg.type());
708 752
709 int request_id = -1; 753 int request_id = -1;
710 bool result = PickleIterator(msg).ReadInt(&request_id); 754 bool result = PickleIterator(msg).ReadInt(&request_id);
711 DCHECK(result); 755 DCHECK(result);
712 scoped_ptr<IPC::Message> ack( 756 scoped_ptr<IPC::Message> ack(
713 new ResourceHostMsg_DataReceived_ACK(request_id)); 757 new ResourceHostMsg_DataReceived_ACK(request_id));
714 758
715 base::MessageLoop::current()->PostTask( 759 base::MessageLoop::current()->PostTask(
(...skipping 13 matching lines...) Expand all
729 ResourceIPCAccumulator accum_; 773 ResourceIPCAccumulator accum_;
730 std::string response_headers_; 774 std::string response_headers_;
731 std::string response_data_; 775 std::string response_data_;
732 std::string scheme_; 776 std::string scheme_;
733 net::URLRequest::ProtocolFactory* old_factory_; 777 net::URLRequest::ProtocolFactory* old_factory_;
734 bool send_data_received_acks_; 778 bool send_data_received_acks_;
735 std::set<int> child_ids_; 779 std::set<int> child_ids_;
736 static ResourceDispatcherHostTest* test_fixture_; 780 static ResourceDispatcherHostTest* test_fixture_;
737 static bool delay_start_; 781 static bool delay_start_;
738 static bool delay_complete_; 782 static bool delay_complete_;
783 static bool network_start_notification_;
739 static int url_request_jobs_created_count_; 784 static int url_request_jobs_created_count_;
740 }; 785 };
741 // Static. 786 // Static.
742 ResourceDispatcherHostTest* ResourceDispatcherHostTest::test_fixture_ = NULL; 787 ResourceDispatcherHostTest* ResourceDispatcherHostTest::test_fixture_ = NULL;
743 bool ResourceDispatcherHostTest::delay_start_ = false; 788 bool ResourceDispatcherHostTest::delay_start_ = false;
744 bool ResourceDispatcherHostTest::delay_complete_ = false; 789 bool ResourceDispatcherHostTest::delay_complete_ = false;
790 bool ResourceDispatcherHostTest::network_start_notification_ = false;
745 int ResourceDispatcherHostTest::url_request_jobs_created_count_ = 0; 791 int ResourceDispatcherHostTest::url_request_jobs_created_count_ = 0;
746 792
747 void ResourceDispatcherHostTest::MakeTestRequest(int render_view_id, 793 void ResourceDispatcherHostTest::MakeTestRequest(int render_view_id,
748 int request_id, 794 int request_id,
749 const GURL& url) { 795 const GURL& url) {
750 MakeTestRequestWithResourceType(filter_.get(), render_view_id, request_id, 796 MakeTestRequestWithResourceType(filter_.get(), render_view_id, request_id,
751 url, ResourceType::SUB_RESOURCE); 797 url, ResourceType::SUB_RESOURCE);
752 } 798 }
753 799
754 void ResourceDispatcherHostTest::MakeTestRequestWithResourceType( 800 void ResourceDispatcherHostTest::MakeTestRequestWithResourceType(
(...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after
1221 MakeTestRequest(0, 1, net::URLRequestTestJob::test_url_error()); 1267 MakeTestRequest(0, 1, net::URLRequestTestJob::test_url_error());
1222 CompleteStartRequest(1); 1268 CompleteStartRequest(1);
1223 1269
1224 // flush all the pending requests 1270 // flush all the pending requests
1225 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {} 1271 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {}
1226 base::MessageLoop::current()->RunUntilIdle(); 1272 base::MessageLoop::current()->RunUntilIdle();
1227 1273
1228 EXPECT_EQ(0, host_.pending_requests()); 1274 EXPECT_EQ(0, host_.pending_requests());
1229 } 1275 }
1230 1276
1277 // Test the OnBeforeNetworkStart throttle.
1278 TEST_F(ResourceDispatcherHostTest, ThrottleNetworkStart) {
1279 // Arrange to have requests deferred before processing response headers.
1280 TestResourceDispatcherHostDelegate delegate;
1281 delegate.set_flags(DEFER_NETWORK_START);
1282 host_.SetDelegate(&delegate);
1283
1284 SetNetworkStartNotificationJobGeneration(true);
1285 MakeTestRequest(0, 1, net::URLRequestTestJob::test_url_2());
1286
1287 // Should have deferred for network start.
1288 GenericResourceThrottle* first_throttle =
1289 GenericResourceThrottle::active_throttle();
1290 ASSERT_TRUE(first_throttle);
1291 EXPECT_EQ(0, network_delegate()->completed_requests());
1292 EXPECT_EQ(1, host_.pending_requests());
1293
1294 first_throttle->Resume();
1295
1296 // Flush all the pending requests.
1297 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {}
1298 base::MessageLoop::current()->RunUntilIdle();
1299
1300 EXPECT_EQ(1, network_delegate()->completed_requests());
1301 EXPECT_EQ(0, host_.pending_requests());
1302 }
1303
1231 TEST_F(ResourceDispatcherHostTest, ThrottleAndResumeTwice) { 1304 TEST_F(ResourceDispatcherHostTest, ThrottleAndResumeTwice) {
1232 // Arrange to have requests deferred before starting. 1305 // Arrange to have requests deferred before starting.
1233 TestResourceDispatcherHostDelegate delegate; 1306 TestResourceDispatcherHostDelegate delegate;
1234 delegate.set_flags(DEFER_STARTING_REQUEST); 1307 delegate.set_flags(DEFER_STARTING_REQUEST);
1235 delegate.set_create_two_throttles(true); 1308 delegate.set_create_two_throttles(true);
1236 host_.SetDelegate(&delegate); 1309 host_.SetDelegate(&delegate);
1237 1310
1238 // Make sure the first throttle blocked the request, and then resume. 1311 // Make sure the first throttle blocked the request, and then resume.
1239 MakeTestRequest(0, 1, net::URLRequestTestJob::test_url_1()); 1312 MakeTestRequest(0, 1, net::URLRequestTestJob::test_url_1());
1240 GenericResourceThrottle* first_throttle = 1313 GenericResourceThrottle* first_throttle =
(...skipping 1361 matching lines...) Expand 10 before | Expand all | Expand 10 after
2602 } 2675 }
2603 2676
2604 base::MessageLoop::current()->RunUntilIdle(); 2677 base::MessageLoop::current()->RunUntilIdle();
2605 2678
2606 msgs.clear(); 2679 msgs.clear();
2607 accum_.GetClassifiedMessages(&msgs); 2680 accum_.GetClassifiedMessages(&msgs);
2608 } 2681 }
2609 } 2682 }
2610 2683
2611 } // namespace content 2684 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698