| OLD | NEW |
| 1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2016 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 "net/http/http_stream_factory_impl_job_controller.h" | 5 #include "net/http/http_stream_factory_impl_job_controller.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <string> | |
| 9 #include <utility> | |
| 10 #include <vector> | 8 #include <vector> |
| 11 | 9 |
| 12 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| 13 #include "base/run_loop.h" | 11 #include "base/run_loop.h" |
| 14 #include "base/test/histogram_tester.h" | 12 #include "base/test/histogram_tester.h" |
| 15 #include "base/test/scoped_feature_list.h" | 13 #include "base/test/scoped_feature_list.h" |
| 16 #include "base/test/scoped_mock_time_message_loop_task_runner.h" | 14 #include "base/test/scoped_mock_time_message_loop_task_runner.h" |
| 17 #include "base/threading/platform_thread.h" | 15 #include "base/threading/platform_thread.h" |
| 18 #include "net/base/test_proxy_delegate.h" | 16 #include "net/base/test_proxy_delegate.h" |
| 19 #include "net/dns/mock_host_resolver.h" | 17 #include "net/dns/mock_host_resolver.h" |
| (...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 302 base::WrapUnique(new FailingProxyResolverFactory), nullptr)); | 300 base::WrapUnique(new FailingProxyResolverFactory), nullptr)); |
| 303 HttpRequestInfo request_info; | 301 HttpRequestInfo request_info; |
| 304 request_info.method = "GET"; | 302 request_info.method = "GET"; |
| 305 request_info.url = GURL("http://www.google.com"); | 303 request_info.url = GURL("http://www.google.com"); |
| 306 | 304 |
| 307 Initialize(request_info); | 305 Initialize(request_info); |
| 308 | 306 |
| 309 EXPECT_CALL(request_delegate_, | 307 EXPECT_CALL(request_delegate_, |
| 310 OnStreamFailed(ERR_MANDATORY_PROXY_CONFIGURATION_FAILED, _)) | 308 OnStreamFailed(ERR_MANDATORY_PROXY_CONFIGURATION_FAILED, _)) |
| 311 .Times(1); | 309 .Times(1); |
| 312 request_ = | 310 request_.reset( |
| 313 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), | 311 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), |
| 314 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 312 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 315 | 313 |
| 316 EXPECT_FALSE(job_controller_->main_job()); | 314 EXPECT_FALSE(job_controller_->main_job()); |
| 317 EXPECT_FALSE(job_controller_->alternative_job()); | 315 EXPECT_FALSE(job_controller_->alternative_job()); |
| 318 | 316 |
| 319 base::RunLoop().RunUntilIdle(); | 317 base::RunLoop().RunUntilIdle(); |
| 320 request_.reset(); | 318 request_.reset(); |
| 321 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); | 319 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); |
| 322 } | 320 } |
| 323 | 321 |
| 324 TEST_F(HttpStreamFactoryImplJobControllerTest, ProxyResolutionFailsAsync) { | 322 TEST_F(HttpStreamFactoryImplJobControllerTest, ProxyResolutionFailsAsync) { |
| 325 ProxyConfig proxy_config; | 323 ProxyConfig proxy_config; |
| 326 proxy_config.set_pac_url(GURL("http://fooproxyurl")); | 324 proxy_config.set_pac_url(GURL("http://fooproxyurl")); |
| 327 proxy_config.set_pac_mandatory(true); | 325 proxy_config.set_pac_mandatory(true); |
| 328 MockAsyncProxyResolverFactory* proxy_resolver_factory = | 326 MockAsyncProxyResolverFactory* proxy_resolver_factory = |
| 329 new MockAsyncProxyResolverFactory(false); | 327 new MockAsyncProxyResolverFactory(false); |
| 330 MockAsyncProxyResolver resolver; | 328 MockAsyncProxyResolver resolver; |
| 331 session_deps_.proxy_service.reset( | 329 session_deps_.proxy_service.reset( |
| 332 new ProxyService(base::MakeUnique<ProxyConfigServiceFixed>(proxy_config), | 330 new ProxyService(base::MakeUnique<ProxyConfigServiceFixed>(proxy_config), |
| 333 base::WrapUnique(proxy_resolver_factory), nullptr)); | 331 base::WrapUnique(proxy_resolver_factory), nullptr)); |
| 334 HttpRequestInfo request_info; | 332 HttpRequestInfo request_info; |
| 335 request_info.method = "GET"; | 333 request_info.method = "GET"; |
| 336 request_info.url = GURL("http://www.google.com"); | 334 request_info.url = GURL("http://www.google.com"); |
| 337 | 335 |
| 338 Initialize(request_info); | 336 Initialize(request_info); |
| 339 | 337 |
| 340 request_ = | 338 request_.reset( |
| 341 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), | 339 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), |
| 342 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 340 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 343 | 341 |
| 344 EXPECT_FALSE(job_controller_->main_job()); | 342 EXPECT_FALSE(job_controller_->main_job()); |
| 345 EXPECT_FALSE(job_controller_->alternative_job()); | 343 EXPECT_FALSE(job_controller_->alternative_job()); |
| 346 | 344 |
| 347 EXPECT_CALL(request_delegate_, | 345 EXPECT_CALL(request_delegate_, |
| 348 OnStreamFailed(ERR_MANDATORY_PROXY_CONFIGURATION_FAILED, _)) | 346 OnStreamFailed(ERR_MANDATORY_PROXY_CONFIGURATION_FAILED, _)) |
| 349 .Times(1); | 347 .Times(1); |
| 350 proxy_resolver_factory->pending_requests()[0]->CompleteNowWithForwarder( | 348 proxy_resolver_factory->pending_requests()[0]->CompleteNowWithForwarder( |
| 351 ERR_FAILED, &resolver); | 349 ERR_FAILED, &resolver); |
| 352 base::RunLoop().RunUntilIdle(); | 350 base::RunLoop().RunUntilIdle(); |
| 353 request_.reset(); | 351 request_.reset(); |
| 354 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); | 352 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); |
| 355 } | 353 } |
| 356 | 354 |
| 357 TEST_F(HttpStreamFactoryImplJobControllerTest, NoSupportedProxies) { | 355 TEST_F(HttpStreamFactoryImplJobControllerTest, NoSupportedProxies) { |
| 358 session_deps_.proxy_service = | 356 session_deps_.proxy_service = |
| 359 ProxyService::CreateFixedFromPacResult("QUIC myproxy.org:443"); | 357 ProxyService::CreateFixedFromPacResult("QUIC myproxy.org:443"); |
| 360 session_deps_.enable_quic = false; | 358 session_deps_.enable_quic = false; |
| 361 HttpRequestInfo request_info; | 359 HttpRequestInfo request_info; |
| 362 request_info.method = "GET"; | 360 request_info.method = "GET"; |
| 363 request_info.url = GURL("http://www.google.com"); | 361 request_info.url = GURL("http://www.google.com"); |
| 364 | 362 |
| 365 Initialize(request_info); | 363 Initialize(request_info); |
| 366 | 364 |
| 367 EXPECT_CALL(request_delegate_, OnStreamFailed(ERR_NO_SUPPORTED_PROXIES, _)) | 365 EXPECT_CALL(request_delegate_, OnStreamFailed(ERR_NO_SUPPORTED_PROXIES, _)) |
| 368 .Times(1); | 366 .Times(1); |
| 369 request_ = | 367 request_.reset( |
| 370 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), | 368 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), |
| 371 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 369 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 372 | 370 |
| 373 EXPECT_FALSE(job_controller_->main_job()); | 371 EXPECT_FALSE(job_controller_->main_job()); |
| 374 EXPECT_FALSE(job_controller_->alternative_job()); | 372 EXPECT_FALSE(job_controller_->alternative_job()); |
| 375 | 373 |
| 376 base::RunLoop().RunUntilIdle(); | 374 base::RunLoop().RunUntilIdle(); |
| 377 request_.reset(); | 375 request_.reset(); |
| 378 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); | 376 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); |
| 379 } | 377 } |
| 380 | 378 |
| 381 class JobControllerReconsiderProxyAfterErrorTest | 379 class JobControllerReconsiderProxyAfterErrorTest |
| (...skipping 12 matching lines...) Expand all Loading... |
| 394 } | 392 } |
| 395 | 393 |
| 396 std::unique_ptr<HttpStreamRequest> CreateJobController( | 394 std::unique_ptr<HttpStreamRequest> CreateJobController( |
| 397 const HttpRequestInfo& request_info) { | 395 const HttpRequestInfo& request_info) { |
| 398 HttpStreamFactoryImpl::JobController* job_controller = | 396 HttpStreamFactoryImpl::JobController* job_controller = |
| 399 new HttpStreamFactoryImpl::JobController( | 397 new HttpStreamFactoryImpl::JobController( |
| 400 factory_, &request_delegate_, session_.get(), &default_job_factory_, | 398 factory_, &request_delegate_, session_.get(), &default_job_factory_, |
| 401 request_info, is_preconnect_, enable_ip_based_pooling_, | 399 request_info, is_preconnect_, enable_ip_based_pooling_, |
| 402 enable_alternative_services_, SSLConfig(), SSLConfig()); | 400 enable_alternative_services_, SSLConfig(), SSLConfig()); |
| 403 HttpStreamFactoryImplPeer::AddJobController(factory_, job_controller); | 401 HttpStreamFactoryImplPeer::AddJobController(factory_, job_controller); |
| 404 return job_controller->Start( | 402 return base::WrapUnique(job_controller->Start( |
| 405 &request_delegate_, nullptr, NetLogWithSource(), | 403 &request_delegate_, nullptr, NetLogWithSource(), |
| 406 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 404 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 407 } | 405 } |
| 408 | 406 |
| 409 private: | 407 private: |
| 410 // Use real Jobs so that Job::Resume() is not mocked out. When main job is | 408 // Use real Jobs so that Job::Resume() is not mocked out. When main job is |
| 411 // resumed it will use mock socket data. | 409 // resumed it will use mock socket data. |
| 412 HttpStreamFactoryImpl::JobFactory default_job_factory_; | 410 HttpStreamFactoryImpl::JobFactory default_job_factory_; |
| 413 }; | 411 }; |
| 414 | 412 |
| 415 INSTANTIATE_TEST_CASE_P( | 413 INSTANTIATE_TEST_CASE_P( |
| 416 /* no prefix */, | 414 /* no prefix */, |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 533 OnStreamFailedWithNoAlternativeJob) { | 531 OnStreamFailedWithNoAlternativeJob) { |
| 534 tcp_data_ = base::MakeUnique<SequencedSocketData>(nullptr, 0, nullptr, 0); | 532 tcp_data_ = base::MakeUnique<SequencedSocketData>(nullptr, 0, nullptr, 0); |
| 535 tcp_data_->set_connect_data(MockConnect(ASYNC, ERR_FAILED)); | 533 tcp_data_->set_connect_data(MockConnect(ASYNC, ERR_FAILED)); |
| 536 | 534 |
| 537 HttpRequestInfo request_info; | 535 HttpRequestInfo request_info; |
| 538 request_info.method = "GET"; | 536 request_info.method = "GET"; |
| 539 request_info.url = GURL("http://www.google.com"); | 537 request_info.url = GURL("http://www.google.com"); |
| 540 | 538 |
| 541 Initialize(request_info); | 539 Initialize(request_info); |
| 542 | 540 |
| 543 request_ = | 541 request_.reset( |
| 544 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), | 542 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), |
| 545 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 543 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 546 | 544 |
| 547 EXPECT_TRUE(job_controller_->main_job()); | 545 EXPECT_TRUE(job_controller_->main_job()); |
| 548 EXPECT_FALSE(job_controller_->alternative_job()); | 546 EXPECT_FALSE(job_controller_->alternative_job()); |
| 549 | 547 |
| 550 // There's no other alternative job. Thus when stream failed, it should | 548 // There's no other alternative job. Thus when stream failed, it should |
| 551 // notify Request of the stream failure. | 549 // notify Request of the stream failure. |
| 552 EXPECT_CALL(request_delegate_, OnStreamFailed(ERR_FAILED, _)).Times(1); | 550 EXPECT_CALL(request_delegate_, OnStreamFailed(ERR_FAILED, _)).Times(1); |
| 553 base::RunLoop().RunUntilIdle(); | 551 base::RunLoop().RunUntilIdle(); |
| 554 } | 552 } |
| 555 | 553 |
| 556 TEST_F(HttpStreamFactoryImplJobControllerTest, | 554 TEST_F(HttpStreamFactoryImplJobControllerTest, |
| 557 OnStreamReadyWithNoAlternativeJob) { | 555 OnStreamReadyWithNoAlternativeJob) { |
| 558 tcp_data_ = base::MakeUnique<SequencedSocketData>(nullptr, 0, nullptr, 0); | 556 tcp_data_ = base::MakeUnique<SequencedSocketData>(nullptr, 0, nullptr, 0); |
| 559 tcp_data_->set_connect_data(MockConnect(ASYNC, OK)); | 557 tcp_data_->set_connect_data(MockConnect(ASYNC, OK)); |
| 560 | 558 |
| 561 HttpRequestInfo request_info; | 559 HttpRequestInfo request_info; |
| 562 request_info.method = "GET"; | 560 request_info.method = "GET"; |
| 563 request_info.url = GURL("http://www.google.com"); | 561 request_info.url = GURL("http://www.google.com"); |
| 564 | 562 |
| 565 Initialize(request_info); | 563 Initialize(request_info); |
| 566 | 564 |
| 567 request_ = | 565 request_.reset( |
| 568 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), | 566 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), |
| 569 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 567 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 570 | 568 |
| 571 // There's no other alternative job. Thus when a stream is ready, it should | 569 // There's no other alternative job. Thus when a stream is ready, it should |
| 572 // notify Request. | 570 // notify Request. |
| 573 EXPECT_TRUE(job_controller_->main_job()); | 571 EXPECT_TRUE(job_controller_->main_job()); |
| 574 | 572 |
| 575 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, _)) | 573 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, _)) |
| 576 .WillOnce(Invoke(DeleteHttpStreamPointer)); | 574 .WillOnce(Invoke(DeleteHttpStreamPointer)); |
| 577 base::RunLoop().RunUntilIdle(); | 575 base::RunLoop().RunUntilIdle(); |
| 578 } | 576 } |
| 579 | 577 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 590 tcp_data_->set_connect_data(MockConnect(ASYNC, OK)); | 588 tcp_data_->set_connect_data(MockConnect(ASYNC, OK)); |
| 591 HttpRequestInfo request_info; | 589 HttpRequestInfo request_info; |
| 592 request_info.method = "GET"; | 590 request_info.method = "GET"; |
| 593 request_info.url = GURL("https://www.google.com"); | 591 request_info.url = GURL("https://www.google.com"); |
| 594 | 592 |
| 595 Initialize(request_info); | 593 Initialize(request_info); |
| 596 url::SchemeHostPort server(request_info.url); | 594 url::SchemeHostPort server(request_info.url); |
| 597 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); | 595 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); |
| 598 SetAlternativeService(request_info, alternative_service); | 596 SetAlternativeService(request_info, alternative_service); |
| 599 | 597 |
| 600 request_ = | 598 request_.reset( |
| 601 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), | 599 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), |
| 602 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 600 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 603 EXPECT_TRUE(job_controller_->main_job()); | 601 EXPECT_TRUE(job_controller_->main_job()); |
| 604 EXPECT_TRUE(job_controller_->alternative_job()); | 602 EXPECT_TRUE(job_controller_->alternative_job()); |
| 605 | 603 |
| 606 // Reset the Request will cancel all the Jobs since there's no Job determined | 604 // Reset the Request will cancel all the Jobs since there's no Job determined |
| 607 // to serve Request yet and JobController will notify the factory to delete | 605 // to serve Request yet and JobController will notify the factory to delete |
| 608 // itself upon completion. | 606 // itself upon completion. |
| 609 request_.reset(); | 607 request_.reset(); |
| 610 VerifyBrokenAlternateProtocolMapping(request_info, false); | 608 VerifyBrokenAlternateProtocolMapping(request_info, false); |
| 611 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); | 609 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); |
| 612 } | 610 } |
| 613 | 611 |
| 614 TEST_F(HttpStreamFactoryImplJobControllerTest, OnStreamFailedForBothJobs) { | 612 TEST_F(HttpStreamFactoryImplJobControllerTest, OnStreamFailedForBothJobs) { |
| 615 quic_data_ = base::MakeUnique<test::MockQuicData>(); | 613 quic_data_ = base::MakeUnique<test::MockQuicData>(); |
| 616 quic_data_->AddConnect(ASYNC, ERR_FAILED); | 614 quic_data_->AddConnect(ASYNC, ERR_FAILED); |
| 617 tcp_data_ = base::MakeUnique<SequencedSocketData>(nullptr, 0, nullptr, 0); | 615 tcp_data_ = base::MakeUnique<SequencedSocketData>(nullptr, 0, nullptr, 0); |
| 618 tcp_data_->set_connect_data(MockConnect(ASYNC, ERR_FAILED)); | 616 tcp_data_->set_connect_data(MockConnect(ASYNC, ERR_FAILED)); |
| 619 | 617 |
| 620 HttpRequestInfo request_info; | 618 HttpRequestInfo request_info; |
| 621 request_info.method = "GET"; | 619 request_info.method = "GET"; |
| 622 request_info.url = GURL("https://www.google.com"); | 620 request_info.url = GURL("https://www.google.com"); |
| 623 | 621 |
| 624 Initialize(request_info); | 622 Initialize(request_info); |
| 625 url::SchemeHostPort server(request_info.url); | 623 url::SchemeHostPort server(request_info.url); |
| 626 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); | 624 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); |
| 627 SetAlternativeService(request_info, alternative_service); | 625 SetAlternativeService(request_info, alternative_service); |
| 628 | 626 |
| 629 request_ = | 627 request_.reset( |
| 630 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), | 628 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), |
| 631 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 629 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 632 EXPECT_TRUE(job_controller_->main_job()); | 630 EXPECT_TRUE(job_controller_->main_job()); |
| 633 EXPECT_TRUE(job_controller_->alternative_job()); | 631 EXPECT_TRUE(job_controller_->alternative_job()); |
| 634 | 632 |
| 635 // The failure of second Job should be reported to Request as there's no more | 633 // The failure of second Job should be reported to Request as there's no more |
| 636 // pending Job to serve the Request. | 634 // pending Job to serve the Request. |
| 637 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(1); | 635 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(1); |
| 638 base::RunLoop().RunUntilIdle(); | 636 base::RunLoop().RunUntilIdle(); |
| 639 VerifyBrokenAlternateProtocolMapping(request_info, false); | 637 VerifyBrokenAlternateProtocolMapping(request_info, false); |
| 640 request_.reset(); | 638 request_.reset(); |
| 641 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); | 639 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 655 | 653 |
| 656 HttpRequestInfo request_info; | 654 HttpRequestInfo request_info; |
| 657 request_info.method = "GET"; | 655 request_info.method = "GET"; |
| 658 request_info.url = GURL("https://www.google.com"); | 656 request_info.url = GURL("https://www.google.com"); |
| 659 | 657 |
| 660 Initialize(request_info); | 658 Initialize(request_info); |
| 661 url::SchemeHostPort server(request_info.url); | 659 url::SchemeHostPort server(request_info.url); |
| 662 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); | 660 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); |
| 663 SetAlternativeService(request_info, alternative_service); | 661 SetAlternativeService(request_info, alternative_service); |
| 664 | 662 |
| 665 request_ = | 663 request_.reset( |
| 666 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), | 664 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), |
| 667 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 665 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 668 EXPECT_TRUE(job_controller_->main_job()); | 666 EXPECT_TRUE(job_controller_->main_job()); |
| 669 EXPECT_TRUE(job_controller_->alternative_job()); | 667 EXPECT_TRUE(job_controller_->alternative_job()); |
| 670 | 668 |
| 671 // Main job succeeds, starts serving Request and it should report status | 669 // Main job succeeds, starts serving Request and it should report status |
| 672 // to Request. The alternative job will mark the main job complete and gets | 670 // to Request. The alternative job will mark the main job complete and gets |
| 673 // orphaned. | 671 // orphaned. |
| 674 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, _)) | 672 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, _)) |
| 675 .WillOnce(Invoke(DeleteHttpStreamPointer)); | 673 .WillOnce(Invoke(DeleteHttpStreamPointer)); |
| 676 // JobController shouldn't report the status of second job as request | 674 // JobController shouldn't report the status of second job as request |
| 677 // is already successfully served. | 675 // is already successfully served. |
| (...skipping 18 matching lines...) Expand all Loading... |
| 696 | 694 |
| 697 HttpRequestInfo request_info; | 695 HttpRequestInfo request_info; |
| 698 request_info.method = "GET"; | 696 request_info.method = "GET"; |
| 699 request_info.url = GURL("https://www.google.com"); | 697 request_info.url = GURL("https://www.google.com"); |
| 700 | 698 |
| 701 Initialize(request_info); | 699 Initialize(request_info); |
| 702 | 700 |
| 703 url::SchemeHostPort server(request_info.url); | 701 url::SchemeHostPort server(request_info.url); |
| 704 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); | 702 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); |
| 705 SetAlternativeService(request_info, alternative_service); | 703 SetAlternativeService(request_info, alternative_service); |
| 706 request_ = | 704 request_.reset( |
| 707 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), | 705 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), |
| 708 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 706 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 709 EXPECT_TRUE(job_controller_->main_job()); | 707 EXPECT_TRUE(job_controller_->main_job()); |
| 710 EXPECT_TRUE(job_controller_->alternative_job()); | 708 EXPECT_TRUE(job_controller_->alternative_job()); |
| 711 EXPECT_TRUE(JobControllerPeer::main_job_is_blocked(job_controller_)); | 709 EXPECT_TRUE(JobControllerPeer::main_job_is_blocked(job_controller_)); |
| 712 | 710 |
| 713 // |alternative_job| succeeds and should report status to |request_delegate_|. | 711 // |alternative_job| succeeds and should report status to |request_delegate_|. |
| 714 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, _)) | 712 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, _)) |
| 715 .WillOnce(Invoke(DeleteHttpStreamPointer)); | 713 .WillOnce(Invoke(DeleteHttpStreamPointer)); |
| 716 | 714 |
| 717 base::RunLoop().RunUntilIdle(); | 715 base::RunLoop().RunUntilIdle(); |
| 718 | 716 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 745 HttpRequestInfo request_info; | 743 HttpRequestInfo request_info; |
| 746 request_info.method = "GET"; | 744 request_info.method = "GET"; |
| 747 request_info.url = GURL("https://www.google.com"); | 745 request_info.url = GURL("https://www.google.com"); |
| 748 | 746 |
| 749 Initialize(request_info); | 747 Initialize(request_info); |
| 750 | 748 |
| 751 url::SchemeHostPort server(request_info.url); | 749 url::SchemeHostPort server(request_info.url); |
| 752 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); | 750 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); |
| 753 SetAlternativeService(request_info, alternative_service); | 751 SetAlternativeService(request_info, alternative_service); |
| 754 | 752 |
| 755 request_ = | 753 request_.reset( |
| 756 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), | 754 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), |
| 757 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 755 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 758 EXPECT_TRUE(job_controller_->main_job()); | 756 EXPECT_TRUE(job_controller_->main_job()); |
| 759 EXPECT_TRUE(job_controller_->alternative_job()); | 757 EXPECT_TRUE(job_controller_->alternative_job()); |
| 760 // main job should not be blocked because alt job returned ERR_IO_PENDING. | 758 // main job should not be blocked because alt job returned ERR_IO_PENDING. |
| 761 EXPECT_FALSE(JobControllerPeer::main_job_is_blocked(job_controller_)); | 759 EXPECT_FALSE(JobControllerPeer::main_job_is_blocked(job_controller_)); |
| 762 | 760 |
| 763 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, _)) | 761 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, _)) |
| 764 .WillOnce(Invoke(DeleteHttpStreamPointer)); | 762 .WillOnce(Invoke(DeleteHttpStreamPointer)); |
| 765 | 763 |
| 766 // Complete main job now. | 764 // Complete main job now. |
| 767 base::RunLoop().RunUntilIdle(); | 765 base::RunLoop().RunUntilIdle(); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 801 | 799 |
| 802 Initialize(request_info); | 800 Initialize(request_info); |
| 803 | 801 |
| 804 url::SchemeHostPort server(request_info.url); | 802 url::SchemeHostPort server(request_info.url); |
| 805 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); | 803 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); |
| 806 SetAlternativeService(request_info, alternative_service); | 804 SetAlternativeService(request_info, alternative_service); |
| 807 | 805 |
| 808 // |main_job| fails but should not report status to Request. | 806 // |main_job| fails but should not report status to Request. |
| 809 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(0); | 807 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(0); |
| 810 | 808 |
| 811 request_ = | 809 request_.reset( |
| 812 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), | 810 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), |
| 813 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 811 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 814 EXPECT_TRUE(job_controller_->main_job()); | 812 EXPECT_TRUE(job_controller_->main_job()); |
| 815 EXPECT_TRUE(job_controller_->alternative_job()); | 813 EXPECT_TRUE(job_controller_->alternative_job()); |
| 816 | 814 |
| 817 base::RunLoop().RunUntilIdle(); | 815 base::RunLoop().RunUntilIdle(); |
| 818 | 816 |
| 819 // Make |alternative_job| succeed. | 817 // Make |alternative_job| succeed. |
| 820 HttpStream* http_stream = | 818 HttpStream* http_stream = |
| 821 new HttpBasicStream(base::MakeUnique<ClientSocketHandle>(), false, false); | 819 new HttpBasicStream(base::MakeUnique<ClientSocketHandle>(), false, false); |
| 822 | 820 |
| 823 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, http_stream)) | 821 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, http_stream)) |
| (...skipping 22 matching lines...) Expand all Loading... |
| 846 HttpRequestInfo request_info; | 844 HttpRequestInfo request_info; |
| 847 request_info.method = "GET"; | 845 request_info.method = "GET"; |
| 848 request_info.url = GURL("https://www.google.com"); | 846 request_info.url = GURL("https://www.google.com"); |
| 849 | 847 |
| 850 Initialize(request_info); | 848 Initialize(request_info); |
| 851 | 849 |
| 852 url::SchemeHostPort server(request_info.url); | 850 url::SchemeHostPort server(request_info.url); |
| 853 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); | 851 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); |
| 854 SetAlternativeService(request_info, alternative_service); | 852 SetAlternativeService(request_info, alternative_service); |
| 855 | 853 |
| 856 request_ = | 854 request_.reset( |
| 857 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), | 855 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), |
| 858 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 856 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 859 EXPECT_TRUE(job_controller_->main_job()); | 857 EXPECT_TRUE(job_controller_->main_job()); |
| 860 EXPECT_TRUE(job_controller_->alternative_job()); | 858 EXPECT_TRUE(job_controller_->alternative_job()); |
| 861 | 859 |
| 862 // |alternative_job| fails but should not report status to Request. | 860 // |alternative_job| fails but should not report status to Request. |
| 863 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(0); | 861 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(0); |
| 864 // |main_job| succeeds and should report status to Request. | 862 // |main_job| succeeds and should report status to Request. |
| 865 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, _)) | 863 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, _)) |
| 866 .WillOnce(Invoke(DeleteHttpStreamPointer)); | 864 .WillOnce(Invoke(DeleteHttpStreamPointer)); |
| 867 | 865 |
| 868 base::RunLoop().RunUntilIdle(); | 866 base::RunLoop().RunUntilIdle(); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 890 | 888 |
| 891 HttpRequestInfo request_info; | 889 HttpRequestInfo request_info; |
| 892 request_info.method = "GET"; | 890 request_info.method = "GET"; |
| 893 request_info.url = GURL("https://www.google.com"); | 891 request_info.url = GURL("https://www.google.com"); |
| 894 Initialize(request_info); | 892 Initialize(request_info); |
| 895 | 893 |
| 896 url::SchemeHostPort server(request_info.url); | 894 url::SchemeHostPort server(request_info.url); |
| 897 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); | 895 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); |
| 898 SetAlternativeService(request_info, alternative_service); | 896 SetAlternativeService(request_info, alternative_service); |
| 899 | 897 |
| 900 request_ = | 898 request_.reset( |
| 901 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), | 899 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), |
| 902 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 900 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 903 EXPECT_TRUE(job_controller_->main_job()); | 901 EXPECT_TRUE(job_controller_->main_job()); |
| 904 EXPECT_TRUE(job_controller_->alternative_job()); | 902 EXPECT_TRUE(job_controller_->alternative_job()); |
| 905 | 903 |
| 906 // |alternative_job| fails but should not report status to Request. | 904 // |alternative_job| fails but should not report status to Request. |
| 907 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(0); | 905 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(0); |
| 908 // |main_job| succeeds and should report status to Request. | 906 // |main_job| succeeds and should report status to Request. |
| 909 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, _)) | 907 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, _)) |
| 910 .WillOnce(Invoke(DeleteHttpStreamPointer)); | 908 .WillOnce(Invoke(DeleteHttpStreamPointer)); |
| 911 base::RunLoop().RunUntilIdle(); | 909 base::RunLoop().RunUntilIdle(); |
| 912 | 910 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 932 | 930 |
| 933 HttpRequestInfo request_info; | 931 HttpRequestInfo request_info; |
| 934 request_info.method = "GET"; | 932 request_info.method = "GET"; |
| 935 request_info.url = GURL("https://www.google.com"); | 933 request_info.url = GURL("https://www.google.com"); |
| 936 | 934 |
| 937 Initialize(request_info); | 935 Initialize(request_info); |
| 938 url::SchemeHostPort server(request_info.url); | 936 url::SchemeHostPort server(request_info.url); |
| 939 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); | 937 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); |
| 940 SetAlternativeService(request_info, alternative_service); | 938 SetAlternativeService(request_info, alternative_service); |
| 941 | 939 |
| 942 request_ = | 940 request_.reset( |
| 943 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), | 941 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), |
| 944 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 942 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 945 EXPECT_TRUE(job_controller_->main_job()); | 943 EXPECT_TRUE(job_controller_->main_job()); |
| 946 EXPECT_TRUE(job_controller_->alternative_job()); | 944 EXPECT_TRUE(job_controller_->alternative_job()); |
| 947 | 945 |
| 948 // |main_job| fails but should not report status to Request. | 946 // |main_job| fails but should not report status to Request. |
| 949 // The alternative job will mark the main job complete. | 947 // The alternative job will mark the main job complete. |
| 950 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(0); | 948 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(0); |
| 951 | 949 |
| 952 base::RunLoop().RunUntilIdle(); | 950 base::RunLoop().RunUntilIdle(); |
| 953 | 951 |
| 954 // Controller should use alternative job to get load state. | 952 // Controller should use alternative job to get load state. |
| (...skipping 25 matching lines...) Expand all Loading... |
| 980 | 978 |
| 981 HttpRequestInfo request_info; | 979 HttpRequestInfo request_info; |
| 982 request_info.method = "GET"; | 980 request_info.method = "GET"; |
| 983 request_info.url = GURL("https://www.google.com"); | 981 request_info.url = GURL("https://www.google.com"); |
| 984 | 982 |
| 985 Initialize(request_info); | 983 Initialize(request_info); |
| 986 url::SchemeHostPort server(request_info.url); | 984 url::SchemeHostPort server(request_info.url); |
| 987 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); | 985 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); |
| 988 SetAlternativeService(request_info, alternative_service); | 986 SetAlternativeService(request_info, alternative_service); |
| 989 | 987 |
| 990 request_ = | 988 request_.reset( |
| 991 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), | 989 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), |
| 992 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 990 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 993 EXPECT_TRUE(job_controller_->main_job()); | 991 EXPECT_TRUE(job_controller_->main_job()); |
| 994 EXPECT_TRUE(job_controller_->alternative_job()); | 992 EXPECT_TRUE(job_controller_->alternative_job()); |
| 995 | 993 |
| 996 // Alt job is stalled and main job should complete successfully. | 994 // Alt job is stalled and main job should complete successfully. |
| 997 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, _)) | 995 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, _)) |
| 998 .WillOnce(Invoke(DeleteHttpStreamPointer)); | 996 .WillOnce(Invoke(DeleteHttpStreamPointer)); |
| 999 | 997 |
| 1000 base::RunLoop().RunUntilIdle(); | 998 base::RunLoop().RunUntilIdle(); |
| 1001 } | 999 } |
| 1002 | 1000 |
| 1003 TEST_F(HttpStreamFactoryImplJobControllerTest, InvalidPortForQuic) { | 1001 TEST_F(HttpStreamFactoryImplJobControllerTest, InvalidPortForQuic) { |
| 1004 HttpRequestInfo request_info; | 1002 HttpRequestInfo request_info; |
| 1005 request_info.method = "GET"; | 1003 request_info.method = "GET"; |
| 1006 request_info.url = GURL("https://www.google.com"); | 1004 request_info.url = GURL("https://www.google.com"); |
| 1007 | 1005 |
| 1008 // Using a restricted port 101 for QUIC should fail and the alternative job | 1006 // Using a restricted port 101 for QUIC should fail and the alternative job |
| 1009 // should post OnStreamFailedCall on the controller to resume the main job. | 1007 // should post OnStreamFailedCall on the controller to resume the main job. |
| 1010 Initialize(request_info); | 1008 Initialize(request_info); |
| 1011 | 1009 |
| 1012 url::SchemeHostPort server(request_info.url); | 1010 url::SchemeHostPort server(request_info.url); |
| 1013 AlternativeService alternative_service(kProtoQUIC, server.host(), 101); | 1011 AlternativeService alternative_service(kProtoQUIC, server.host(), 101); |
| 1014 SetAlternativeService(request_info, alternative_service); | 1012 SetAlternativeService(request_info, alternative_service); |
| 1015 | 1013 |
| 1016 request_ = | 1014 request_.reset( |
| 1017 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), | 1015 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), |
| 1018 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 1016 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 1019 | 1017 |
| 1020 EXPECT_TRUE(job_factory_.main_job()->is_waiting()); | 1018 EXPECT_TRUE(job_factory_.main_job()->is_waiting()); |
| 1021 | 1019 |
| 1022 // Wait until OnStreamFailedCallback is executed on the alternative job. | 1020 // Wait until OnStreamFailedCallback is executed on the alternative job. |
| 1023 EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(1); | 1021 EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(1); |
| 1024 base::RunLoop().RunUntilIdle(); | 1022 base::RunLoop().RunUntilIdle(); |
| 1025 } | 1023 } |
| 1026 | 1024 |
| 1027 TEST_F(HttpStreamFactoryImplJobControllerTest, DelayedTCP) { | 1025 TEST_F(HttpStreamFactoryImplJobControllerTest, DelayedTCP) { |
| 1028 base::ScopedMockTimeMessageLoopTaskRunner test_task_runner; | 1026 base::ScopedMockTimeMessageLoopTaskRunner test_task_runner; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1042 quic_stream_factory->set_require_confirmation(false); | 1040 quic_stream_factory->set_require_confirmation(false); |
| 1043 ServerNetworkStats stats1; | 1041 ServerNetworkStats stats1; |
| 1044 stats1.srtt = base::TimeDelta::FromMicroseconds(10); | 1042 stats1.srtt = base::TimeDelta::FromMicroseconds(10); |
| 1045 session_->http_server_properties()->SetServerNetworkStats( | 1043 session_->http_server_properties()->SetServerNetworkStats( |
| 1046 url::SchemeHostPort(GURL("https://www.google.com")), stats1); | 1044 url::SchemeHostPort(GURL("https://www.google.com")), stats1); |
| 1047 | 1045 |
| 1048 url::SchemeHostPort server(request_info.url); | 1046 url::SchemeHostPort server(request_info.url); |
| 1049 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); | 1047 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); |
| 1050 SetAlternativeService(request_info, alternative_service); | 1048 SetAlternativeService(request_info, alternative_service); |
| 1051 | 1049 |
| 1052 request_ = | 1050 request_.reset( |
| 1053 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), | 1051 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), |
| 1054 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 1052 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 1055 EXPECT_TRUE(job_controller_->main_job()); | 1053 EXPECT_TRUE(job_controller_->main_job()); |
| 1056 EXPECT_TRUE(job_controller_->alternative_job()); | 1054 EXPECT_TRUE(job_controller_->alternative_job()); |
| 1057 EXPECT_TRUE(job_controller_->main_job()->is_waiting()); | 1055 EXPECT_TRUE(job_controller_->main_job()->is_waiting()); |
| 1058 | 1056 |
| 1059 // The alternative job stalls as host resolution hangs when creating the QUIC | 1057 // The alternative job stalls as host resolution hangs when creating the QUIC |
| 1060 // request and controller should resume the main job after delay. | 1058 // request and controller should resume the main job after delay. |
| 1061 EXPECT_TRUE(test_task_runner->HasPendingTask()); | 1059 EXPECT_TRUE(test_task_runner->HasPendingTask()); |
| 1062 EXPECT_EQ(1u, test_task_runner->GetPendingTaskCount()); | 1060 EXPECT_EQ(1u, test_task_runner->GetPendingTaskCount()); |
| 1063 EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(1); | 1061 EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(1); |
| 1064 test_task_runner->FastForwardBy(base::TimeDelta::FromMicroseconds(15)); | 1062 test_task_runner->FastForwardBy(base::TimeDelta::FromMicroseconds(15)); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1109 ServerNetworkStats stats1; | 1107 ServerNetworkStats stats1; |
| 1110 stats1.srtt = base::TimeDelta::FromSeconds(100); | 1108 stats1.srtt = base::TimeDelta::FromSeconds(100); |
| 1111 session_->http_server_properties()->SetServerNetworkStats( | 1109 session_->http_server_properties()->SetServerNetworkStats( |
| 1112 url::SchemeHostPort(GURL("https://www.google.com")), stats1); | 1110 url::SchemeHostPort(GURL("https://www.google.com")), stats1); |
| 1113 | 1111 |
| 1114 // Set a SPDY alternative service for the server. | 1112 // Set a SPDY alternative service for the server. |
| 1115 url::SchemeHostPort server(request_info.url); | 1113 url::SchemeHostPort server(request_info.url); |
| 1116 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); | 1114 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); |
| 1117 SetAlternativeService(request_info, alternative_service); | 1115 SetAlternativeService(request_info, alternative_service); |
| 1118 | 1116 |
| 1119 request_ = | 1117 request_.reset( |
| 1120 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), | 1118 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), |
| 1121 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 1119 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 1122 EXPECT_TRUE(job_controller_->main_job()); | 1120 EXPECT_TRUE(job_controller_->main_job()); |
| 1123 EXPECT_TRUE(job_controller_->alternative_job()); | 1121 EXPECT_TRUE(job_controller_->alternative_job()); |
| 1124 EXPECT_TRUE(job_controller_->main_job()->is_waiting()); | 1122 EXPECT_TRUE(job_controller_->main_job()->is_waiting()); |
| 1125 | 1123 |
| 1126 // The alternative job stalls as host resolution hangs when creating the QUIC | 1124 // The alternative job stalls as host resolution hangs when creating the QUIC |
| 1127 // request and controller should resume the main job after delay. | 1125 // request and controller should resume the main job after delay. |
| 1128 EXPECT_TRUE(test_task_runner->HasPendingTask()); | 1126 EXPECT_TRUE(test_task_runner->HasPendingTask()); |
| 1129 EXPECT_EQ(1u, test_task_runner->GetPendingTaskCount()); | 1127 EXPECT_EQ(1u, test_task_runner->GetPendingTaskCount()); |
| 1130 | 1128 |
| 1131 EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(1); | 1129 EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(1); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1168 url::SchemeHostPort(GURL("https://www.google.com")), stats1); | 1166 url::SchemeHostPort(GURL("https://www.google.com")), stats1); |
| 1169 | 1167 |
| 1170 // Set a SPDY alternative service for the server. | 1168 // Set a SPDY alternative service for the server. |
| 1171 url::SchemeHostPort server(request_info.url); | 1169 url::SchemeHostPort server(request_info.url); |
| 1172 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); | 1170 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); |
| 1173 SetAlternativeService(request_info, alternative_service); | 1171 SetAlternativeService(request_info, alternative_service); |
| 1174 | 1172 |
| 1175 // The alternative job stalls as host resolution hangs when creating the QUIC | 1173 // The alternative job stalls as host resolution hangs when creating the QUIC |
| 1176 // request and controller should resume the main job with delay. | 1174 // request and controller should resume the main job with delay. |
| 1177 // OnStreamFailed should resume the main job immediately. | 1175 // OnStreamFailed should resume the main job immediately. |
| 1178 request_ = | 1176 request_.reset( |
| 1179 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), | 1177 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), |
| 1180 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 1178 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 1181 EXPECT_TRUE(job_controller_->main_job()); | 1179 EXPECT_TRUE(job_controller_->main_job()); |
| 1182 EXPECT_TRUE(job_controller_->alternative_job()); | 1180 EXPECT_TRUE(job_controller_->alternative_job()); |
| 1183 EXPECT_TRUE(job_controller_->main_job()->is_waiting()); | 1181 EXPECT_TRUE(job_controller_->main_job()->is_waiting()); |
| 1184 | 1182 |
| 1185 EXPECT_TRUE(test_task_runner->HasPendingTask()); | 1183 EXPECT_TRUE(test_task_runner->HasPendingTask()); |
| 1186 EXPECT_EQ(1u, test_task_runner->GetPendingTaskCount()); | 1184 EXPECT_EQ(1u, test_task_runner->GetPendingTaskCount()); |
| 1187 | 1185 |
| 1188 // |alternative_job| fails but should not report status to Request. | 1186 // |alternative_job| fails but should not report status to Request. |
| 1189 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(0); | 1187 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(0); |
| 1190 // Now unblock Resolver to fail the alternate job. | 1188 // Now unblock Resolver to fail the alternate job. |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1213 // Using hanging resolver will cause the alternative job to hang indefinitely. | 1211 // Using hanging resolver will cause the alternative job to hang indefinitely. |
| 1214 HangingResolver* resolver = new HangingResolver(); | 1212 HangingResolver* resolver = new HangingResolver(); |
| 1215 session_deps_.host_resolver.reset(resolver); | 1213 session_deps_.host_resolver.reset(resolver); |
| 1216 | 1214 |
| 1217 HttpRequestInfo request_info; | 1215 HttpRequestInfo request_info; |
| 1218 request_info.method = "GET"; | 1216 request_info.method = "GET"; |
| 1219 request_info.url = GURL("https://mail.example.org/"); | 1217 request_info.url = GURL("https://mail.example.org/"); |
| 1220 Initialize(request_info); | 1218 Initialize(request_info); |
| 1221 EXPECT_TRUE(test_proxy_delegate()->alternative_proxy_server().is_quic()); | 1219 EXPECT_TRUE(test_proxy_delegate()->alternative_proxy_server().is_quic()); |
| 1222 | 1220 |
| 1223 request_ = | 1221 request_.reset( |
| 1224 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), | 1222 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), |
| 1225 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 1223 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 1226 EXPECT_TRUE(job_controller_->main_job()); | 1224 EXPECT_TRUE(job_controller_->main_job()); |
| 1227 EXPECT_FALSE(job_controller_->main_job()->is_waiting()); | 1225 EXPECT_FALSE(job_controller_->main_job()->is_waiting()); |
| 1228 EXPECT_FALSE(job_controller_->alternative_job()); | 1226 EXPECT_FALSE(job_controller_->alternative_job()); |
| 1229 | 1227 |
| 1230 EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(0); | 1228 EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(0); |
| 1231 base::RunLoop().RunUntilIdle(); | 1229 base::RunLoop().RunUntilIdle(); |
| 1232 EXPECT_EQ(0, test_proxy_delegate()->get_alternative_proxy_invocations()); | 1230 EXPECT_EQ(0, test_proxy_delegate()->get_alternative_proxy_invocations()); |
| 1233 } | 1231 } |
| 1234 | 1232 |
| 1235 // Verifies that the alternative proxy server job is not created if the main job | 1233 // Verifies that the alternative proxy server job is not created if the main job |
| 1236 // does not fetch the resource through a proxy. | 1234 // does not fetch the resource through a proxy. |
| 1237 TEST_F(HttpStreamFactoryImplJobControllerTest, HttpURLWithNoProxy) { | 1235 TEST_F(HttpStreamFactoryImplJobControllerTest, HttpURLWithNoProxy) { |
| 1238 // Using hanging resolver will cause the alternative job to hang indefinitely. | 1236 // Using hanging resolver will cause the alternative job to hang indefinitely. |
| 1239 HangingResolver* resolver = new HangingResolver(); | 1237 HangingResolver* resolver = new HangingResolver(); |
| 1240 session_deps_.host_resolver.reset(resolver); | 1238 session_deps_.host_resolver.reset(resolver); |
| 1241 | 1239 |
| 1242 HttpRequestInfo request_info; | 1240 HttpRequestInfo request_info; |
| 1243 request_info.method = "GET"; | 1241 request_info.method = "GET"; |
| 1244 request_info.url = GURL("http://mail.example.org/"); | 1242 request_info.url = GURL("http://mail.example.org/"); |
| 1245 | 1243 |
| 1246 Initialize(request_info); | 1244 Initialize(request_info); |
| 1247 EXPECT_TRUE(test_proxy_delegate()->alternative_proxy_server().is_quic()); | 1245 EXPECT_TRUE(test_proxy_delegate()->alternative_proxy_server().is_quic()); |
| 1248 | 1246 |
| 1249 request_ = | 1247 request_.reset( |
| 1250 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), | 1248 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), |
| 1251 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 1249 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 1252 EXPECT_TRUE(job_controller_->main_job()); | 1250 EXPECT_TRUE(job_controller_->main_job()); |
| 1253 EXPECT_FALSE(job_controller_->main_job()->is_waiting()); | 1251 EXPECT_FALSE(job_controller_->main_job()->is_waiting()); |
| 1254 EXPECT_FALSE(job_controller_->alternative_job()); | 1252 EXPECT_FALSE(job_controller_->alternative_job()); |
| 1255 | 1253 |
| 1256 EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(0); | 1254 EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(0); |
| 1257 base::RunLoop().RunUntilIdle(); | 1255 base::RunLoop().RunUntilIdle(); |
| 1258 | 1256 |
| 1259 EXPECT_EQ(0, test_proxy_delegate()->get_alternative_proxy_invocations()); | 1257 EXPECT_EQ(0, test_proxy_delegate()->get_alternative_proxy_invocations()); |
| 1260 } | 1258 } |
| 1261 | 1259 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1281 EXPECT_TRUE(test_proxy_delegate()->alternative_proxy_server().is_quic()); | 1279 EXPECT_TRUE(test_proxy_delegate()->alternative_proxy_server().is_quic()); |
| 1282 | 1280 |
| 1283 // Enable delayed TCP and set time delay for waiting job. | 1281 // Enable delayed TCP and set time delay for waiting job. |
| 1284 QuicStreamFactory* quic_stream_factory = session_->quic_stream_factory(); | 1282 QuicStreamFactory* quic_stream_factory = session_->quic_stream_factory(); |
| 1285 quic_stream_factory->set_require_confirmation(false); | 1283 quic_stream_factory->set_require_confirmation(false); |
| 1286 ServerNetworkStats stats1; | 1284 ServerNetworkStats stats1; |
| 1287 stats1.srtt = base::TimeDelta::FromMicroseconds(10); | 1285 stats1.srtt = base::TimeDelta::FromMicroseconds(10); |
| 1288 session_->http_server_properties()->SetServerNetworkStats( | 1286 session_->http_server_properties()->SetServerNetworkStats( |
| 1289 url::SchemeHostPort(GURL("https://myproxy.org")), stats1); | 1287 url::SchemeHostPort(GURL("https://myproxy.org")), stats1); |
| 1290 | 1288 |
| 1291 request_ = | 1289 request_.reset( |
| 1292 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), | 1290 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), |
| 1293 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 1291 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 1294 EXPECT_TRUE(job_controller_->main_job()); | 1292 EXPECT_TRUE(job_controller_->main_job()); |
| 1295 EXPECT_TRUE(job_controller_->main_job()->is_waiting()); | 1293 EXPECT_TRUE(job_controller_->main_job()->is_waiting()); |
| 1296 EXPECT_TRUE(job_controller_->alternative_job()); | 1294 EXPECT_TRUE(job_controller_->alternative_job()); |
| 1297 // The main job is unblocked but is resumed one message loop iteration later. | 1295 // The main job is unblocked but is resumed one message loop iteration later. |
| 1298 EXPECT_FALSE(JobControllerPeer::main_job_is_blocked(job_controller_)); | 1296 EXPECT_FALSE(JobControllerPeer::main_job_is_blocked(job_controller_)); |
| 1299 EXPECT_FALSE(JobControllerPeer::main_job_is_resumed(job_controller_)); | 1297 EXPECT_FALSE(JobControllerPeer::main_job_is_resumed(job_controller_)); |
| 1300 EXPECT_EQ(1u, test_task_runner->GetPendingTaskCount()); | 1298 EXPECT_EQ(1u, test_task_runner->GetPendingTaskCount()); |
| 1301 | 1299 |
| 1302 // Move forward the delay and verify the main job is resumed. | 1300 // Move forward the delay and verify the main job is resumed. |
| 1303 EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(1); | 1301 EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(1); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1337 EXPECT_TRUE(test_proxy_delegate()->alternative_proxy_server().is_quic()); | 1335 EXPECT_TRUE(test_proxy_delegate()->alternative_proxy_server().is_quic()); |
| 1338 | 1336 |
| 1339 // Enable delayed TCP and set time delay for waiting job. | 1337 // Enable delayed TCP and set time delay for waiting job. |
| 1340 QuicStreamFactory* quic_stream_factory = session_->quic_stream_factory(); | 1338 QuicStreamFactory* quic_stream_factory = session_->quic_stream_factory(); |
| 1341 quic_stream_factory->set_require_confirmation(false); | 1339 quic_stream_factory->set_require_confirmation(false); |
| 1342 ServerNetworkStats stats1; | 1340 ServerNetworkStats stats1; |
| 1343 stats1.srtt = base::TimeDelta::FromMicroseconds(300 * 1000); | 1341 stats1.srtt = base::TimeDelta::FromMicroseconds(300 * 1000); |
| 1344 session_->http_server_properties()->SetServerNetworkStats( | 1342 session_->http_server_properties()->SetServerNetworkStats( |
| 1345 url::SchemeHostPort(GURL("https://myproxy.org")), stats1); | 1343 url::SchemeHostPort(GURL("https://myproxy.org")), stats1); |
| 1346 | 1344 |
| 1347 request_ = | 1345 request_.reset( |
| 1348 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), | 1346 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), |
| 1349 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 1347 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 1350 EXPECT_TRUE(job_controller_->main_job()); | 1348 EXPECT_TRUE(job_controller_->main_job()); |
| 1351 EXPECT_TRUE(job_controller_->alternative_job()); | 1349 EXPECT_TRUE(job_controller_->alternative_job()); |
| 1352 | 1350 |
| 1353 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, _)) | 1351 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, _)) |
| 1354 .WillOnce(Invoke(DeleteHttpStreamPointer)); | 1352 .WillOnce(Invoke(DeleteHttpStreamPointer)); |
| 1355 | 1353 |
| 1356 base::RunLoop().RunUntilIdle(); | 1354 base::RunLoop().RunUntilIdle(); |
| 1357 | 1355 |
| 1358 EXPECT_FALSE(job_controller_->alternative_job()); | 1356 EXPECT_FALSE(job_controller_->alternative_job()); |
| 1359 EXPECT_TRUE(job_controller_->main_job()); | 1357 EXPECT_TRUE(job_controller_->main_job()); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1381 | 1379 |
| 1382 UseAlternativeProxy(); | 1380 UseAlternativeProxy(); |
| 1383 | 1381 |
| 1384 HttpRequestInfo request_info; | 1382 HttpRequestInfo request_info; |
| 1385 request_info.method = "GET"; | 1383 request_info.method = "GET"; |
| 1386 request_info.url = GURL("http://www.google.com"); | 1384 request_info.url = GURL("http://www.google.com"); |
| 1387 Initialize(request_info); | 1385 Initialize(request_info); |
| 1388 | 1386 |
| 1389 url::SchemeHostPort server(request_info.url); | 1387 url::SchemeHostPort server(request_info.url); |
| 1390 | 1388 |
| 1391 request_ = | 1389 request_.reset( |
| 1392 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), | 1390 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), |
| 1393 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 1391 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 1394 EXPECT_TRUE(job_controller_->main_job()); | 1392 EXPECT_TRUE(job_controller_->main_job()); |
| 1395 EXPECT_TRUE(job_controller_->alternative_job()); | 1393 EXPECT_TRUE(job_controller_->alternative_job()); |
| 1396 | 1394 |
| 1397 // Main job succeeds, starts serving Request and it should report status | 1395 // Main job succeeds, starts serving Request and it should report status |
| 1398 // to Request. The alternative job will mark the main job complete and gets | 1396 // to Request. The alternative job will mark the main job complete and gets |
| 1399 // orphaned. | 1397 // orphaned. |
| 1400 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, _)) | 1398 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, _)) |
| 1401 .WillOnce(Invoke(DeleteHttpStreamPointer)); | 1399 .WillOnce(Invoke(DeleteHttpStreamPointer)); |
| 1402 | 1400 |
| 1403 base::RunLoop().RunUntilIdle(); | 1401 base::RunLoop().RunUntilIdle(); |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1481 DisableIPBasedPooling(); | 1479 DisableIPBasedPooling(); |
| 1482 if (!enable_alternative_services) | 1480 if (!enable_alternative_services) |
| 1483 DisableAlternativeServices(); | 1481 DisableAlternativeServices(); |
| 1484 | 1482 |
| 1485 Initialize(request_info); | 1483 Initialize(request_info); |
| 1486 | 1484 |
| 1487 url::SchemeHostPort server(request_info.url); | 1485 url::SchemeHostPort server(request_info.url); |
| 1488 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); | 1486 AlternativeService alternative_service(kProtoQUIC, server.host(), 443); |
| 1489 SetAlternativeService(request_info, alternative_service); | 1487 SetAlternativeService(request_info, alternative_service); |
| 1490 | 1488 |
| 1491 request_ = | 1489 request_.reset( |
| 1492 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), | 1490 job_controller_->Start(&request_delegate_, nullptr, NetLogWithSource(), |
| 1493 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | 1491 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY)); |
| 1494 EXPECT_TRUE(job_controller_->main_job()); | 1492 EXPECT_TRUE(job_controller_->main_job()); |
| 1495 if (enable_alternative_services) { | 1493 if (enable_alternative_services) { |
| 1496 EXPECT_TRUE(job_controller_->alternative_job()); | 1494 EXPECT_TRUE(job_controller_->alternative_job()); |
| 1497 } else { | 1495 } else { |
| 1498 EXPECT_FALSE(job_controller_->alternative_job()); | 1496 EXPECT_FALSE(job_controller_->alternative_job()); |
| 1499 } | 1497 } |
| 1500 | 1498 |
| 1501 // |main_job| succeeds and should report status to Request. | 1499 // |main_job| succeeds and should report status to Request. |
| 1502 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, _)) | 1500 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, _)) |
| 1503 .WillOnce(Invoke(DeleteHttpStreamPointer)); | 1501 .WillOnce(Invoke(DeleteHttpStreamPointer)); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1570 Preconnect(kNumPreconects); | 1568 Preconnect(kNumPreconects); |
| 1571 // If experiment is enabled, only 1 stream is requested. | 1569 // If experiment is enabled, only 1 stream is requested. |
| 1572 EXPECT_EQ( | 1570 EXPECT_EQ( |
| 1573 (int)actual_num_connects, | 1571 (int)actual_num_connects, |
| 1574 HttpStreamFactoryImplJobPeer::GetNumStreams(job_controller_->main_job())); | 1572 HttpStreamFactoryImplJobPeer::GetNumStreams(job_controller_->main_job())); |
| 1575 base::RunLoop().RunUntilIdle(); | 1573 base::RunLoop().RunUntilIdle(); |
| 1576 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); | 1574 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); |
| 1577 } | 1575 } |
| 1578 | 1576 |
| 1579 } // namespace net | 1577 } // namespace net |
| OLD | NEW |