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 |