| 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 | 8 |
| 9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
| 10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 | 147 |
| 148 void SetAlternativeService(const HttpRequestInfo& request_info, | 148 void SetAlternativeService(const HttpRequestInfo& request_info, |
| 149 AlternativeService alternative_service) { | 149 AlternativeService alternative_service) { |
| 150 HostPortPair host_port_pair = HostPortPair::FromURL(request_info.url); | 150 HostPortPair host_port_pair = HostPortPair::FromURL(request_info.url); |
| 151 url::SchemeHostPort server(request_info.url); | 151 url::SchemeHostPort server(request_info.url); |
| 152 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); | 152 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
| 153 session_->http_server_properties()->SetAlternativeService( | 153 session_->http_server_properties()->SetAlternativeService( |
| 154 server, alternative_service, expiration); | 154 server, alternative_service, expiration); |
| 155 } | 155 } |
| 156 | 156 |
| 157 void VerifyBrokenAlternateProtocolMapping(const HttpRequestInfo& request_info, |
| 158 bool should_mark_broken) { |
| 159 const url::SchemeHostPort server(request_info.url); |
| 160 const AlternativeServiceVector alternative_service_vector = |
| 161 session_->http_server_properties()->GetAlternativeServices(server); |
| 162 EXPECT_EQ(1u, alternative_service_vector.size()); |
| 163 EXPECT_EQ(should_mark_broken, |
| 164 session_->http_server_properties()->IsAlternativeServiceBroken( |
| 165 alternative_service_vector[0])); |
| 166 } |
| 167 |
| 157 // Not owned by |this|. | 168 // Not owned by |this|. |
| 158 TestProxyDelegate* test_proxy_delegate_; | 169 TestProxyDelegate* test_proxy_delegate_; |
| 159 TestJobFactory job_factory_; | 170 TestJobFactory job_factory_; |
| 160 MockHttpStreamRequestDelegate request_delegate_; | 171 MockHttpStreamRequestDelegate request_delegate_; |
| 161 SpdySessionDependencies session_deps_; | 172 SpdySessionDependencies session_deps_; |
| 162 std::unique_ptr<HttpNetworkSession> session_; | 173 std::unique_ptr<HttpNetworkSession> session_; |
| 163 HttpStreamFactoryImpl* factory_; | 174 HttpStreamFactoryImpl* factory_; |
| 164 HttpStreamFactoryImpl::JobController* job_controller_; | 175 HttpStreamFactoryImpl::JobController* job_controller_; |
| 165 std::unique_ptr<HttpStreamFactoryImpl::Request> request_; | 176 std::unique_ptr<HttpStreamFactoryImpl::Request> request_; |
| 166 | 177 |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 255 job_controller_->Start(request_info, &request_delegate_, nullptr, | 266 job_controller_->Start(request_info, &request_delegate_, nullptr, |
| 256 BoundNetLog(), HttpStreamRequest::HTTP_STREAM, | 267 BoundNetLog(), HttpStreamRequest::HTTP_STREAM, |
| 257 DEFAULT_PRIORITY, SSLConfig(), SSLConfig())); | 268 DEFAULT_PRIORITY, SSLConfig(), SSLConfig())); |
| 258 EXPECT_TRUE(job_controller_->main_job()); | 269 EXPECT_TRUE(job_controller_->main_job()); |
| 259 EXPECT_TRUE(job_controller_->alternative_job()); | 270 EXPECT_TRUE(job_controller_->alternative_job()); |
| 260 | 271 |
| 261 // Reset the Request will cancel all the Jobs since there's no Job determined | 272 // Reset the Request will cancel all the Jobs since there's no Job determined |
| 262 // to serve Request yet and JobController will notify the factory to delete | 273 // to serve Request yet and JobController will notify the factory to delete |
| 263 // itself upon completion. | 274 // itself upon completion. |
| 264 request_.reset(); | 275 request_.reset(); |
| 276 VerifyBrokenAlternateProtocolMapping(request_info, false); |
| 265 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); | 277 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); |
| 266 } | 278 } |
| 267 | 279 |
| 268 TEST_F(HttpStreamFactoryImplJobControllerTest, OnStreamFailedForBothJobs) { | 280 TEST_F(HttpStreamFactoryImplJobControllerTest, OnStreamFailedForBothJobs) { |
| 269 ProxyConfig proxy_config; | 281 ProxyConfig proxy_config; |
| 270 proxy_config.set_auto_detect(true); | 282 proxy_config.set_auto_detect(true); |
| 271 // Use asynchronous proxy resolver. | 283 // Use asynchronous proxy resolver. |
| 272 MockAsyncProxyResolverFactory* proxy_resolver_factory = | 284 MockAsyncProxyResolverFactory* proxy_resolver_factory = |
| 273 new MockAsyncProxyResolverFactory(false); | 285 new MockAsyncProxyResolverFactory(false); |
| 274 session_deps_.proxy_service.reset( | 286 session_deps_.proxy_service.reset( |
| (...skipping 13 matching lines...) Expand all Loading... |
| 288 job_controller_->Start(request_info, &request_delegate_, nullptr, | 300 job_controller_->Start(request_info, &request_delegate_, nullptr, |
| 289 BoundNetLog(), HttpStreamRequest::HTTP_STREAM, | 301 BoundNetLog(), HttpStreamRequest::HTTP_STREAM, |
| 290 DEFAULT_PRIORITY, SSLConfig(), SSLConfig())); | 302 DEFAULT_PRIORITY, SSLConfig(), SSLConfig())); |
| 291 EXPECT_TRUE(job_controller_->main_job()); | 303 EXPECT_TRUE(job_controller_->main_job()); |
| 292 EXPECT_TRUE(job_controller_->alternative_job()); | 304 EXPECT_TRUE(job_controller_->alternative_job()); |
| 293 | 305 |
| 294 // We have the main job with unknown status when the alternative job is failed | 306 // We have the main job with unknown status when the alternative job is failed |
| 295 // thus should not notify Request of the alternative job's failure. But should | 307 // thus should not notify Request of the alternative job's failure. But should |
| 296 // notify the main job to mark the alternative job failed. | 308 // notify the main job to mark the alternative job failed. |
| 297 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(0); | 309 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(0); |
| 298 EXPECT_CALL(*job_factory_.main_job(), MarkOtherJobComplete(_)).Times(1); | |
| 299 job_controller_->OnStreamFailed(job_factory_.alternative_job(), ERR_FAILED, | 310 job_controller_->OnStreamFailed(job_factory_.alternative_job(), ERR_FAILED, |
| 300 SSLConfig()); | 311 SSLConfig()); |
| 301 EXPECT_TRUE(!job_controller_->alternative_job()); | 312 EXPECT_TRUE(!job_controller_->alternative_job()); |
| 302 EXPECT_TRUE(job_controller_->main_job()); | 313 EXPECT_TRUE(job_controller_->main_job()); |
| 303 | 314 |
| 304 // The failure of second Job should be reported to Request as there's no more | 315 // The failure of second Job should be reported to Request as there's no more |
| 305 // pending Job to serve the Request. | 316 // pending Job to serve the Request. |
| 306 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(1); | 317 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(1); |
| 307 job_controller_->OnStreamFailed(job_factory_.main_job(), ERR_FAILED, | 318 job_controller_->OnStreamFailed(job_factory_.main_job(), ERR_FAILED, |
| 308 SSLConfig()); | 319 SSLConfig()); |
| 320 VerifyBrokenAlternateProtocolMapping(request_info, false); |
| 309 } | 321 } |
| 310 | 322 |
| 311 TEST_F(HttpStreamFactoryImplJobControllerTest, | 323 TEST_F(HttpStreamFactoryImplJobControllerTest, |
| 312 SecondJobFailsAfterFirstJobSucceeds) { | 324 AltJobFailsAfterMainJobSucceeds) { |
| 313 ProxyConfig proxy_config; | 325 ProxyConfig proxy_config; |
| 314 proxy_config.set_auto_detect(true); | 326 proxy_config.set_auto_detect(true); |
| 315 // Use asynchronous proxy resolver. | 327 // Use asynchronous proxy resolver. |
| 316 MockAsyncProxyResolverFactory* proxy_resolver_factory = | 328 MockAsyncProxyResolverFactory* proxy_resolver_factory = |
| 317 new MockAsyncProxyResolverFactory(false); | 329 new MockAsyncProxyResolverFactory(false); |
| 318 session_deps_.proxy_service.reset( | 330 session_deps_.proxy_service.reset( |
| 319 new ProxyService(base::MakeUnique<ProxyConfigServiceFixed>(proxy_config), | 331 new ProxyService(base::MakeUnique<ProxyConfigServiceFixed>(proxy_config), |
| 320 base::WrapUnique(proxy_resolver_factory), nullptr)); | 332 base::WrapUnique(proxy_resolver_factory), nullptr)); |
| 321 Initialize(false); | 333 Initialize(false); |
| 322 | 334 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 337 | 349 |
| 338 // Main job succeeds, starts serving Request and it should report status | 350 // Main job succeeds, starts serving Request and it should report status |
| 339 // to Request. The alternative job will mark the main job complete and gets | 351 // to Request. The alternative job will mark the main job complete and gets |
| 340 // orphaned. | 352 // orphaned. |
| 341 HttpStream* http_stream = | 353 HttpStream* http_stream = |
| 342 new HttpBasicStream(base::MakeUnique<ClientSocketHandle>(), false, false); | 354 new HttpBasicStream(base::MakeUnique<ClientSocketHandle>(), false, false); |
| 343 job_factory_.main_job()->SetStream(http_stream); | 355 job_factory_.main_job()->SetStream(http_stream); |
| 344 | 356 |
| 345 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, http_stream)) | 357 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, http_stream)) |
| 346 .WillOnce(Invoke(DeleteHttpStreamPointer)); | 358 .WillOnce(Invoke(DeleteHttpStreamPointer)); |
| 347 EXPECT_CALL(*job_factory_.alternative_job(), MarkOtherJobComplete(_)) | |
| 348 .Times(1); | |
| 349 job_controller_->OnStreamReady(job_factory_.main_job(), SSLConfig(), | 359 job_controller_->OnStreamReady(job_factory_.main_job(), SSLConfig(), |
| 350 ProxyInfo()); | 360 ProxyInfo()); |
| 351 | 361 |
| 352 // JobController shouldn't report the status of second job as request | 362 // JobController shouldn't report the status of second job as request |
| 353 // is already successfully served. | 363 // is already successfully served. |
| 354 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(0); | 364 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(0); |
| 355 job_controller_->OnStreamFailed(job_factory_.alternative_job(), ERR_FAILED, | 365 job_controller_->OnStreamFailed(job_factory_.alternative_job(), ERR_FAILED, |
| 356 SSLConfig()); | 366 SSLConfig()); |
| 357 | 367 |
| 368 VerifyBrokenAlternateProtocolMapping(request_info, true); |
| 358 // Reset the request as it's been successfully served. | 369 // Reset the request as it's been successfully served. |
| 359 request_.reset(); | 370 request_.reset(); |
| 360 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); | 371 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); |
| 361 } | 372 } |
| 362 | 373 |
| 363 TEST_F(HttpStreamFactoryImplJobControllerTest, | 374 TEST_F(HttpStreamFactoryImplJobControllerTest, |
| 364 SecondJobSucceedsAfterFirstJobFailed) { | 375 AltJobSucceedsAfterMainJobFailed) { |
| 365 ProxyConfig proxy_config; | 376 ProxyConfig proxy_config; |
| 366 proxy_config.set_auto_detect(true); | 377 proxy_config.set_auto_detect(true); |
| 367 // Use asynchronous proxy resolver. | 378 // Use asynchronous proxy resolver. |
| 368 MockAsyncProxyResolverFactory* proxy_resolver_factory = | 379 MockAsyncProxyResolverFactory* proxy_resolver_factory = |
| 369 new MockAsyncProxyResolverFactory(false); | 380 new MockAsyncProxyResolverFactory(false); |
| 370 session_deps_.proxy_service.reset( | 381 session_deps_.proxy_service.reset( |
| 371 new ProxyService(base::MakeUnique<ProxyConfigServiceFixed>(proxy_config), | 382 new ProxyService(base::MakeUnique<ProxyConfigServiceFixed>(proxy_config), |
| 372 base::WrapUnique(proxy_resolver_factory), nullptr)); | 383 base::WrapUnique(proxy_resolver_factory), nullptr)); |
| 373 Initialize(false); | 384 Initialize(false); |
| 374 | 385 |
| 375 HttpRequestInfo request_info; | 386 HttpRequestInfo request_info; |
| 376 request_info.method = "GET"; | 387 request_info.method = "GET"; |
| 377 request_info.url = GURL("https://www.google.com"); | 388 request_info.url = GURL("https://www.google.com"); |
| 378 | 389 |
| 379 url::SchemeHostPort server(request_info.url); | 390 url::SchemeHostPort server(request_info.url); |
| 380 AlternativeService alternative_service(QUIC, server.host(), 443); | 391 AlternativeService alternative_service(QUIC, server.host(), 443); |
| 381 SetAlternativeService(request_info, alternative_service); | 392 SetAlternativeService(request_info, alternative_service); |
| 382 | 393 |
| 383 request_.reset( | 394 request_.reset( |
| 384 job_controller_->Start(request_info, &request_delegate_, nullptr, | 395 job_controller_->Start(request_info, &request_delegate_, nullptr, |
| 385 BoundNetLog(), HttpStreamRequest::HTTP_STREAM, | 396 BoundNetLog(), HttpStreamRequest::HTTP_STREAM, |
| 386 DEFAULT_PRIORITY, SSLConfig(), SSLConfig())); | 397 DEFAULT_PRIORITY, SSLConfig(), SSLConfig())); |
| 387 EXPECT_TRUE(job_controller_->main_job()); | 398 EXPECT_TRUE(job_controller_->main_job()); |
| 388 EXPECT_TRUE(job_controller_->alternative_job()); | 399 EXPECT_TRUE(job_controller_->alternative_job()); |
| 389 | 400 |
| 390 // |main_job| fails but should not report status to Request. | 401 // |main_job| fails but should not report status to Request. |
| 391 // The alternative job will mark the main job complete. | |
| 392 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(0); | 402 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(0); |
| 393 EXPECT_CALL(*job_factory_.alternative_job(), MarkOtherJobComplete(_)) | |
| 394 .Times(1); | |
| 395 | 403 |
| 396 job_controller_->OnStreamFailed(job_factory_.main_job(), ERR_FAILED, | 404 job_controller_->OnStreamFailed(job_factory_.main_job(), ERR_FAILED, |
| 397 SSLConfig()); | 405 SSLConfig()); |
| 398 | 406 |
| 399 // |alternative_job| succeeds and should report status to Request. | 407 // |alternative_job| succeeds and should report status to Request. |
| 400 HttpStream* http_stream = | 408 HttpStream* http_stream = |
| 401 new HttpBasicStream(base::MakeUnique<ClientSocketHandle>(), false, false); | 409 new HttpBasicStream(base::MakeUnique<ClientSocketHandle>(), false, false); |
| 402 job_factory_.alternative_job()->SetStream(http_stream); | 410 job_factory_.alternative_job()->SetStream(http_stream); |
| 403 | 411 |
| 404 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, http_stream)) | 412 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, http_stream)) |
| 405 .WillOnce(Invoke(DeleteHttpStreamPointer)); | 413 .WillOnce(Invoke(DeleteHttpStreamPointer)); |
| 406 job_controller_->OnStreamReady(job_factory_.alternative_job(), SSLConfig(), | 414 job_controller_->OnStreamReady(job_factory_.alternative_job(), SSLConfig(), |
| 407 ProxyInfo()); | 415 ProxyInfo()); |
| 416 VerifyBrokenAlternateProtocolMapping(request_info, false); |
| 417 } |
| 418 |
| 419 TEST_F(HttpStreamFactoryImplJobControllerTest, |
| 420 MainJobSucceedsAfterAltJobFailed) { |
| 421 ProxyConfig proxy_config; |
| 422 proxy_config.set_auto_detect(true); |
| 423 // Use asynchronous proxy resolver. |
| 424 MockAsyncProxyResolverFactory* proxy_resolver_factory = |
| 425 new MockAsyncProxyResolverFactory(false); |
| 426 session_deps_.proxy_service.reset( |
| 427 new ProxyService(base::MakeUnique<ProxyConfigServiceFixed>(proxy_config), |
| 428 base::WrapUnique(proxy_resolver_factory), nullptr)); |
| 429 Initialize(false); |
| 430 |
| 431 HttpRequestInfo request_info; |
| 432 request_info.method = "GET"; |
| 433 request_info.url = GURL("https://www.google.com"); |
| 434 |
| 435 url::SchemeHostPort server(request_info.url); |
| 436 AlternativeService alternative_service(QUIC, server.host(), 443); |
| 437 SetAlternativeService(request_info, alternative_service); |
| 438 |
| 439 request_.reset( |
| 440 job_controller_->Start(request_info, &request_delegate_, nullptr, |
| 441 BoundNetLog(), HttpStreamRequest::HTTP_STREAM, |
| 442 DEFAULT_PRIORITY, SSLConfig(), SSLConfig())); |
| 443 EXPECT_TRUE(job_controller_->main_job()); |
| 444 EXPECT_TRUE(job_controller_->alternative_job()); |
| 445 |
| 446 // |alternative_job| fails but should not report status to Request. |
| 447 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(0); |
| 448 |
| 449 job_controller_->OnStreamFailed(job_factory_.alternative_job(), ERR_FAILED, |
| 450 SSLConfig()); |
| 451 |
| 452 // |main_job| succeeds and should report status to Request. |
| 453 HttpStream* http_stream = |
| 454 new HttpBasicStream(base::MakeUnique<ClientSocketHandle>(), false, false); |
| 455 job_factory_.main_job()->SetStream(http_stream); |
| 456 |
| 457 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, http_stream)) |
| 458 .WillOnce(Invoke(DeleteHttpStreamPointer)); |
| 459 job_controller_->OnStreamReady(job_factory_.main_job(), SSLConfig(), |
| 460 ProxyInfo()); |
| 461 |
| 462 VerifyBrokenAlternateProtocolMapping(request_info, true); |
| 408 } | 463 } |
| 409 | 464 |
| 410 // Regression test for crbug/621069. | 465 // Regression test for crbug/621069. |
| 411 // Get load state after main job fails and before alternative job succeeds. | 466 // Get load state after main job fails and before alternative job succeeds. |
| 412 TEST_F(HttpStreamFactoryImplJobControllerTest, GetLoadStateAfterMainJobFailed) { | 467 TEST_F(HttpStreamFactoryImplJobControllerTest, GetLoadStateAfterMainJobFailed) { |
| 413 ProxyConfig proxy_config; | 468 ProxyConfig proxy_config; |
| 414 proxy_config.set_auto_detect(true); | 469 proxy_config.set_auto_detect(true); |
| 415 // Use asynchronous proxy resolver. | 470 // Use asynchronous proxy resolver. |
| 416 MockAsyncProxyResolverFactory* proxy_resolver_factory = | 471 MockAsyncProxyResolverFactory* proxy_resolver_factory = |
| 417 new MockAsyncProxyResolverFactory(false); | 472 new MockAsyncProxyResolverFactory(false); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 431 request_.reset( | 486 request_.reset( |
| 432 job_controller_->Start(request_info, &request_delegate_, nullptr, | 487 job_controller_->Start(request_info, &request_delegate_, nullptr, |
| 433 BoundNetLog(), HttpStreamRequest::HTTP_STREAM, | 488 BoundNetLog(), HttpStreamRequest::HTTP_STREAM, |
| 434 DEFAULT_PRIORITY, SSLConfig(), SSLConfig())); | 489 DEFAULT_PRIORITY, SSLConfig(), SSLConfig())); |
| 435 EXPECT_TRUE(job_controller_->main_job()); | 490 EXPECT_TRUE(job_controller_->main_job()); |
| 436 EXPECT_TRUE(job_controller_->alternative_job()); | 491 EXPECT_TRUE(job_controller_->alternative_job()); |
| 437 | 492 |
| 438 // |main_job| fails but should not report status to Request. | 493 // |main_job| fails but should not report status to Request. |
| 439 // The alternative job will mark the main job complete. | 494 // The alternative job will mark the main job complete. |
| 440 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(0); | 495 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(0); |
| 441 EXPECT_CALL(*job_factory_.alternative_job(), MarkOtherJobComplete(_)) | |
| 442 .Times(1); | |
| 443 | 496 |
| 444 job_controller_->OnStreamFailed(job_factory_.main_job(), ERR_FAILED, | 497 job_controller_->OnStreamFailed(job_factory_.main_job(), ERR_FAILED, |
| 445 SSLConfig()); | 498 SSLConfig()); |
| 446 | 499 |
| 447 // Controller should use alternative job to get load state. | 500 // Controller should use alternative job to get load state. |
| 448 job_controller_->GetLoadState(); | 501 job_controller_->GetLoadState(); |
| 449 | 502 |
| 450 // |alternative_job| succeeds and should report status to Request. | 503 // |alternative_job| succeeds and should report status to Request. |
| 451 HttpStream* http_stream = | 504 HttpStream* http_stream = |
| 452 new HttpBasicStream(base::MakeUnique<ClientSocketHandle>(), false, false); | 505 new HttpBasicStream(base::MakeUnique<ClientSocketHandle>(), false, false); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 481 | 534 |
| 482 request_.reset( | 535 request_.reset( |
| 483 job_controller_->Start(request_info, &request_delegate_, nullptr, | 536 job_controller_->Start(request_info, &request_delegate_, nullptr, |
| 484 BoundNetLog(), HttpStreamRequest::HTTP_STREAM, | 537 BoundNetLog(), HttpStreamRequest::HTTP_STREAM, |
| 485 DEFAULT_PRIORITY, SSLConfig(), SSLConfig())); | 538 DEFAULT_PRIORITY, SSLConfig(), SSLConfig())); |
| 486 EXPECT_TRUE(job_controller_->main_job()); | 539 EXPECT_TRUE(job_controller_->main_job()); |
| 487 EXPECT_TRUE(job_controller_->alternative_job()); | 540 EXPECT_TRUE(job_controller_->alternative_job()); |
| 488 | 541 |
| 489 // Wait until OnStreamFailedCallback is executed on the alternative job. | 542 // Wait until OnStreamFailedCallback is executed on the alternative job. |
| 490 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(1); | 543 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(1); |
| 491 EXPECT_CALL(*job_factory_.main_job(), MarkOtherJobComplete(_)).Times(1); | |
| 492 base::RunLoop().RunUntilIdle(); | 544 base::RunLoop().RunUntilIdle(); |
| 493 } | 545 } |
| 494 | 546 |
| 495 TEST_F(HttpStreamFactoryImplJobControllerTest, InvalidPortForQuic) { | 547 TEST_F(HttpStreamFactoryImplJobControllerTest, InvalidPortForQuic) { |
| 496 // Using a restricted port 101 for QUIC should fail and the alternative job | 548 // Using a restricted port 101 for QUIC should fail and the alternative job |
| 497 // should post OnStreamFailedCall on the controller to resume the main job. | 549 // should post OnStreamFailedCall on the controller to resume the main job. |
| 498 Initialize(false); | 550 Initialize(false); |
| 499 | 551 |
| 500 HttpRequestInfo request_info; | 552 HttpRequestInfo request_info; |
| 501 request_info.method = "GET"; | 553 request_info.method = "GET"; |
| 502 request_info.url = GURL("https://www.google.com"); | 554 request_info.url = GURL("https://www.google.com"); |
| 503 | 555 |
| 504 url::SchemeHostPort server(request_info.url); | 556 url::SchemeHostPort server(request_info.url); |
| 505 AlternativeService alternative_service(QUIC, server.host(), 101); | 557 AlternativeService alternative_service(QUIC, server.host(), 101); |
| 506 SetAlternativeService(request_info, alternative_service); | 558 SetAlternativeService(request_info, alternative_service); |
| 507 | 559 |
| 508 request_.reset( | 560 request_.reset( |
| 509 job_controller_->Start(request_info, &request_delegate_, nullptr, | 561 job_controller_->Start(request_info, &request_delegate_, nullptr, |
| 510 BoundNetLog(), HttpStreamRequest::HTTP_STREAM, | 562 BoundNetLog(), HttpStreamRequest::HTTP_STREAM, |
| 511 DEFAULT_PRIORITY, SSLConfig(), SSLConfig())); | 563 DEFAULT_PRIORITY, SSLConfig(), SSLConfig())); |
| 512 | 564 |
| 513 EXPECT_TRUE(job_factory_.main_job()->is_waiting()); | 565 EXPECT_TRUE(job_factory_.main_job()->is_waiting()); |
| 514 | 566 |
| 515 // Wait until OnStreamFailedCallback is executed on the alternative job. | 567 // Wait until OnStreamFailedCallback is executed on the alternative job. |
| 516 EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(1); | 568 EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(1); |
| 517 EXPECT_CALL(*job_factory_.main_job(), MarkOtherJobComplete(_)).Times(1); | |
| 518 base::RunLoop().RunUntilIdle(); | 569 base::RunLoop().RunUntilIdle(); |
| 519 } | 570 } |
| 520 | 571 |
| 521 TEST_F(HttpStreamFactoryImplJobControllerTest, | 572 TEST_F(HttpStreamFactoryImplJobControllerTest, |
| 522 NoAvailableSpdySessionToResumeMainJob) { | 573 NoAvailableSpdySessionToResumeMainJob) { |
| 523 // Test the alternative job is not resumed when the alternative job is | 574 // Test the alternative job is not resumed when the alternative job is |
| 524 // IO_PENDING for proxy resolution. Once all the proxy resolution succeeds, | 575 // IO_PENDING for proxy resolution. Once all the proxy resolution succeeds, |
| 525 // the latter part of this test tests controller resumes the main job | 576 // the latter part of this test tests controller resumes the main job |
| 526 // when there's no SPDY session for the alternative job. | 577 // when there's no SPDY session for the alternative job. |
| 527 ProxyConfig proxy_config; | 578 ProxyConfig proxy_config; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 573 resolver.pending_requests()[main_job_request_id]->CompleteNow(net::OK); | 624 resolver.pending_requests()[main_job_request_id]->CompleteNow(net::OK); |
| 574 EXPECT_TRUE(job_controller_->main_job()->is_waiting()); | 625 EXPECT_TRUE(job_controller_->main_job()->is_waiting()); |
| 575 | 626 |
| 576 // Resolve proxy for the alternative job to proceed to create a connection. | 627 // Resolve proxy for the alternative job to proceed to create a connection. |
| 577 // Use hanging HostResolver to fail creation of a SPDY session for the | 628 // Use hanging HostResolver to fail creation of a SPDY session for the |
| 578 // alternative job. The alternative job will be IO_PENDING thus should resume | 629 // alternative job. The alternative job will be IO_PENDING thus should resume |
| 579 // the main job. | 630 // the main job. |
| 580 resolver.pending_requests()[0]->CompleteNow(net::OK); | 631 resolver.pending_requests()[0]->CompleteNow(net::OK); |
| 581 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(0); | 632 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(0); |
| 582 EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(1); | 633 EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(1); |
| 583 EXPECT_CALL(*job_factory_.main_job(), MarkOtherJobComplete(_)).Times(1); | |
| 584 | 634 |
| 585 base::RunLoop().RunUntilIdle(); | 635 base::RunLoop().RunUntilIdle(); |
| 586 } | 636 } |
| 587 | 637 |
| 588 TEST_F(HttpStreamFactoryImplJobControllerTest, | 638 TEST_F(HttpStreamFactoryImplJobControllerTest, |
| 589 NoAvailableQuicSessionToResumeMainJob) { | 639 NoAvailableQuicSessionToResumeMainJob) { |
| 590 // Use failing HostResolver which is unable to resolve the host name for QUIC. | 640 // Use failing HostResolver which is unable to resolve the host name for QUIC. |
| 591 // No QUIC session is created and thus should resume the main job. | 641 // No QUIC session is created and thus should resume the main job. |
| 592 FailingHostResolver* host_resolver = new FailingHostResolver(); | 642 FailingHostResolver* host_resolver = new FailingHostResolver(); |
| 593 session_deps_.host_resolver.reset(host_resolver); | 643 session_deps_.host_resolver.reset(host_resolver); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 638 // Resolve proxy for the alternative job to proceed to create a connection. | 688 // Resolve proxy for the alternative job to proceed to create a connection. |
| 639 // Use failing HostResolver to fail creation of a QUIC session for the | 689 // Use failing HostResolver to fail creation of a QUIC session for the |
| 640 // alternative job. The alternative job will thus resume the main job. | 690 // alternative job. The alternative job will thus resume the main job. |
| 641 resolver.pending_requests()[0]->results()->UseNamedProxy("result1:80"); | 691 resolver.pending_requests()[0]->results()->UseNamedProxy("result1:80"); |
| 642 resolver.pending_requests()[0]->CompleteNow(net::OK); | 692 resolver.pending_requests()[0]->CompleteNow(net::OK); |
| 643 | 693 |
| 644 // Wait until OnStreamFailedCallback is executed on the alternative job. | 694 // Wait until OnStreamFailedCallback is executed on the alternative job. |
| 645 // Request shouldn't be notified as the main job is still pending status. | 695 // Request shouldn't be notified as the main job is still pending status. |
| 646 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(0); | 696 EXPECT_CALL(request_delegate_, OnStreamFailed(_, _)).Times(0); |
| 647 EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(1); | 697 EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(1); |
| 648 EXPECT_CALL(*job_factory_.main_job(), MarkOtherJobComplete(_)).Times(1); | |
| 649 | 698 |
| 650 base::RunLoop().RunUntilIdle(); | 699 base::RunLoop().RunUntilIdle(); |
| 651 } | 700 } |
| 652 | 701 |
| 653 TEST_F(HttpStreamFactoryImplJobControllerTest, DelayedTCP) { | 702 TEST_F(HttpStreamFactoryImplJobControllerTest, DelayedTCP) { |
| 654 HangingResolver* resolver = new HangingResolver(); | 703 HangingResolver* resolver = new HangingResolver(); |
| 655 session_deps_.host_resolver.reset(resolver); | 704 session_deps_.host_resolver.reset(resolver); |
| 656 | 705 |
| 657 Initialize(false); | 706 Initialize(false); |
| 658 | 707 |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 832 request_info.url = GURL("http://mail.example.org/"); | 881 request_info.url = GURL("http://mail.example.org/"); |
| 833 | 882 |
| 834 request_.reset( | 883 request_.reset( |
| 835 job_controller_->Start(request_info, &request_delegate_, nullptr, | 884 job_controller_->Start(request_info, &request_delegate_, nullptr, |
| 836 BoundNetLog(), HttpStreamRequest::HTTP_STREAM, | 885 BoundNetLog(), HttpStreamRequest::HTTP_STREAM, |
| 837 DEFAULT_PRIORITY, SSLConfig(), SSLConfig())); | 886 DEFAULT_PRIORITY, SSLConfig(), SSLConfig())); |
| 838 EXPECT_TRUE(job_controller_->main_job()->is_waiting()); | 887 EXPECT_TRUE(job_controller_->main_job()->is_waiting()); |
| 839 EXPECT_TRUE(job_controller_->alternative_job()); | 888 EXPECT_TRUE(job_controller_->alternative_job()); |
| 840 | 889 |
| 841 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, _)).Times(0); | 890 EXPECT_CALL(request_delegate_, OnStreamReady(_, _, _)).Times(0); |
| 842 EXPECT_CALL(*job_factory_.main_job(), MarkOtherJobComplete(_)).Times(1); | |
| 843 | 891 |
| 844 // Since the alternative proxy server job is started in the next message loop, | 892 // Since the alternative proxy server job is started in the next message loop, |
| 845 // the main job would remain blocked until the alternative proxy starts, and | 893 // the main job would remain blocked until the alternative proxy starts, and |
| 846 // fails. | 894 // fails. |
| 847 EXPECT_CALL(*job_factory_.main_job(), Resume()) | 895 EXPECT_CALL(*job_factory_.main_job(), Resume()) |
| 848 .WillOnce(Invoke(testing::CreateFunctor( | 896 .WillOnce(Invoke(testing::CreateFunctor( |
| 849 &JobControllerPeer::VerifyWaitingTimeForMainJob, job_controller_, | 897 &JobControllerPeer::VerifyWaitingTimeForMainJob, job_controller_, |
| 850 base::TimeDelta::FromMicroseconds(0)))); | 898 base::TimeDelta::FromMicroseconds(0)))); |
| 851 | 899 |
| 852 base::RunLoop().RunUntilIdle(); | 900 base::RunLoop().RunUntilIdle(); |
| 853 EXPECT_FALSE(job_controller_->alternative_job()); | 901 EXPECT_FALSE(job_controller_->alternative_job()); |
| 854 EXPECT_TRUE(job_controller_->main_job()->is_waiting()); | 902 EXPECT_TRUE(job_controller_->main_job()->is_waiting()); |
| 855 // Since the main job did not complete successfully, the alternative proxy | 903 // Since the main job did not complete successfully, the alternative proxy |
| 856 // server should not be marked as bad. | 904 // server should not be marked as bad. |
| 857 EXPECT_TRUE(test_proxy_delegate()->alternative_proxy_server().is_valid()); | 905 EXPECT_TRUE(test_proxy_delegate()->alternative_proxy_server().is_valid()); |
| 858 EXPECT_EQ(1, test_proxy_delegate()->get_alternative_proxy_invocations()); | 906 EXPECT_EQ(1, test_proxy_delegate()->get_alternative_proxy_invocations()); |
| 859 } | 907 } |
| 860 | 908 |
| 861 } // namespace net | 909 } // namespace net |
| OLD | NEW |