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

Side by Side Diff: net/http/http_stream_factory_impl_job_controller_unittest.cc

Issue 2332193003: JobController3: Move MarkAlternativeServiceBroken to job controller (Closed)
Patch Set: nit Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698