OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/spdy/spdy_session_pool.h" | 5 #include "net/spdy/spdy_session_pool.h" |
6 | 6 |
7 #include <cstddef> | 7 #include <cstddef> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
(...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
503 | 503 |
504 TEST_P(SpdySessionPoolTest, IPPoolingCloseIdleSessions) { | 504 TEST_P(SpdySessionPoolTest, IPPoolingCloseIdleSessions) { |
505 RunIPPoolingTest(SPDY_POOL_CLOSE_IDLE_SESSIONS); | 505 RunIPPoolingTest(SPDY_POOL_CLOSE_IDLE_SESSIONS); |
506 } | 506 } |
507 | 507 |
508 // Construct a Pool with SpdySessions in various availability states. Simulate | 508 // Construct a Pool with SpdySessions in various availability states. Simulate |
509 // an IP address change. Ensure sessions gracefully shut down. Regression test | 509 // an IP address change. Ensure sessions gracefully shut down. Regression test |
510 // for crbug.com/379469. | 510 // for crbug.com/379469. |
511 TEST_P(SpdySessionPoolTest, IPAddressChanged) { | 511 TEST_P(SpdySessionPoolTest, IPAddressChanged) { |
512 MockConnect connect_data(SYNCHRONOUS, OK); | 512 MockConnect connect_data(SYNCHRONOUS, OK); |
| 513 session_deps_.host_resolver->set_synchronous_mode(true); |
| 514 SpdyTestUtil spdy_util(GetParam()); |
| 515 |
513 MockRead reads[] = { | 516 MockRead reads[] = { |
514 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | 517 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. |
515 }; | 518 }; |
516 session_deps_.host_resolver->set_synchronous_mode(true); | 519 scoped_ptr<SpdyFrame> req( |
| 520 spdy_util.ConstructSpdyGet("http://www.a.com", false, 1, MEDIUM)); |
| 521 MockWrite writes[] = {CreateMockWrite(*req, 1)}; |
517 | 522 |
518 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); | 523 DelayedSocketData data(1, reads, arraysize(reads), writes, arraysize(writes)); |
519 data.set_connect_data(connect_data); | 524 data.set_connect_data(connect_data); |
520 session_deps_.socket_factory->AddSocketDataProvider(&data); | 525 session_deps_.socket_factory->AddSocketDataProvider(&data); |
521 | 526 |
522 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); | 527 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); |
523 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 528 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
524 | 529 |
525 CreateNetworkSession(); | 530 CreateNetworkSession(); |
526 | 531 |
527 // Set up session 1: Available, but idle. | 532 // Set up session A: Going away, but with an active stream. |
528 const std::string kTestHost1("http://www.a.com"); | |
529 HostPortPair test_host_port_pair1(kTestHost1, 80); | |
530 SpdySessionKey key1( | |
531 test_host_port_pair1, ProxyServer::Direct(), PRIVACY_MODE_DISABLED); | |
532 base::WeakPtr<SpdySession> session1 = | |
533 CreateInsecureSpdySession(http_session_, key1, BoundNetLog()); | |
534 EXPECT_TRUE(session1->IsAvailable()); | |
535 | |
536 // Set up session 2: Going away, but with an active stream. | |
537 session_deps_.socket_factory->AddSocketDataProvider(&data); | 533 session_deps_.socket_factory->AddSocketDataProvider(&data); |
538 const std::string kTestHost2("http://www.b.com"); | 534 const std::string kTestHostA("http://www.a.com"); |
539 HostPortPair test_host_port_pair2(kTestHost2, 80); | 535 HostPortPair test_host_port_pairA(kTestHostA, 80); |
540 SpdySessionKey key2( | 536 SpdySessionKey keyA( |
541 test_host_port_pair2, ProxyServer::Direct(), PRIVACY_MODE_DISABLED); | 537 test_host_port_pairA, ProxyServer::Direct(), PRIVACY_MODE_DISABLED); |
542 base::WeakPtr<SpdySession> session2 = | 538 base::WeakPtr<SpdySession> sessionA = |
543 CreateInsecureSpdySession(http_session_, key2, BoundNetLog()); | 539 CreateInsecureSpdySession(http_session_, keyA, BoundNetLog()); |
544 GURL url2(kTestHost2); | 540 GURL urlA(kTestHostA); |
545 base::WeakPtr<SpdyStream> spdy_stream2 = CreateStreamSynchronously( | 541 base::WeakPtr<SpdyStream> spdy_streamA = CreateStreamSynchronously( |
546 SPDY_BIDIRECTIONAL_STREAM, session2, url2, MEDIUM, BoundNetLog()); | 542 SPDY_BIDIRECTIONAL_STREAM, sessionA, urlA, MEDIUM, BoundNetLog()); |
547 test::StreamDelegateDoNothing delegate2(spdy_stream2); | 543 test::StreamDelegateDoNothing delegateA(spdy_streamA); |
548 spdy_stream2->SetDelegate(&delegate2); | 544 spdy_streamA->SetDelegate(&delegateA); |
549 | 545 |
550 scoped_ptr<SpdyHeaderBlock> headers( | 546 scoped_ptr<SpdyHeaderBlock> headers( |
551 SpdyTestUtil(GetParam()).ConstructGetHeaderBlock(url2.spec())); | 547 spdy_util.ConstructGetHeaderBlock(urlA.spec())); |
552 spdy_stream2->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); | 548 spdy_streamA->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); |
553 EXPECT_TRUE(spdy_stream2->HasUrlFromHeaders()); | 549 EXPECT_TRUE(spdy_streamA->HasUrlFromHeaders()); |
554 | 550 |
555 session2->MakeUnavailable(); | 551 base::MessageLoop::current()->RunUntilIdle(); // Allow headers to write. |
556 EXPECT_TRUE(session2->IsGoingAway()); | 552 EXPECT_TRUE(delegateA.send_headers_completed()); |
557 | 553 |
558 // Set up session 3: Draining. | 554 sessionA->MakeUnavailable(); |
| 555 EXPECT_TRUE(sessionA->IsGoingAway()); |
| 556 EXPECT_FALSE(delegateA.StreamIsClosed()); |
| 557 |
| 558 // Set up session B: Available, but idle. |
| 559 const std::string kTestHostB("http://www.b.com"); |
| 560 HostPortPair test_host_port_pairB(kTestHostB, 80); |
| 561 SpdySessionKey keyB( |
| 562 test_host_port_pairB, ProxyServer::Direct(), PRIVACY_MODE_DISABLED); |
| 563 base::WeakPtr<SpdySession> sessionB = |
| 564 CreateInsecureSpdySession(http_session_, keyB, BoundNetLog()); |
| 565 EXPECT_TRUE(sessionB->IsAvailable()); |
| 566 |
| 567 // Set up session C: Draining. |
559 session_deps_.socket_factory->AddSocketDataProvider(&data); | 568 session_deps_.socket_factory->AddSocketDataProvider(&data); |
560 const std::string kTestHost3("http://www.c.com"); | 569 const std::string kTestHostC("http://www.c.com"); |
561 HostPortPair test_host_port_pair3(kTestHost3, 80); | 570 HostPortPair test_host_port_pairC(kTestHostC, 80); |
562 SpdySessionKey key3( | 571 SpdySessionKey keyC( |
563 test_host_port_pair3, ProxyServer::Direct(), PRIVACY_MODE_DISABLED); | 572 test_host_port_pairC, ProxyServer::Direct(), PRIVACY_MODE_DISABLED); |
564 base::WeakPtr<SpdySession> session3 = | 573 base::WeakPtr<SpdySession> sessionC = |
565 CreateInsecureSpdySession(http_session_, key3, BoundNetLog()); | 574 CreateInsecureSpdySession(http_session_, keyC, BoundNetLog()); |
566 | 575 |
567 session3->CloseSessionOnError(ERR_SPDY_PROTOCOL_ERROR, "Error!"); | 576 sessionC->CloseSessionOnError(ERR_SPDY_PROTOCOL_ERROR, "Error!"); |
568 EXPECT_TRUE(session3->IsDraining()); | 577 EXPECT_TRUE(sessionC->IsDraining()); |
569 | 578 |
570 spdy_session_pool_->OnIPAddressChanged(); | 579 spdy_session_pool_->OnIPAddressChanged(); |
571 | 580 |
572 #if defined(OS_ANDROID) || defined(OS_WIN) || defined(OS_IOS) | 581 #if defined(OS_ANDROID) || defined(OS_WIN) || defined(OS_IOS) |
573 // TODO(jgraettinger): This should be draining when crbug.com/324653 is fixed. | 582 EXPECT_TRUE(sessionA->IsGoingAway()); |
574 EXPECT_TRUE(session1->IsGoingAway()); | 583 EXPECT_TRUE(sessionB->IsDraining()); |
575 EXPECT_TRUE(session2->IsGoingAway()); | 584 EXPECT_TRUE(sessionC->IsDraining()); |
576 EXPECT_TRUE(session3->IsDraining()); | |
577 | 585 |
578 EXPECT_FALSE(delegate2.StreamIsClosed()); | 586 EXPECT_EQ(1u, sessionA->num_active_streams()); // Stream is still active. |
| 587 EXPECT_FALSE(delegateA.StreamIsClosed()); |
579 | 588 |
580 session1->CloseSessionOnError(ERR_ABORTED, "Closing"); | 589 sessionA->CloseSessionOnError(ERR_ABORTED, "Closing"); |
581 session2->CloseSessionOnError(ERR_ABORTED, "Closing"); | 590 sessionB->CloseSessionOnError(ERR_ABORTED, "Closing"); |
582 | 591 |
583 EXPECT_TRUE(delegate2.StreamIsClosed()); | 592 EXPECT_TRUE(delegateA.StreamIsClosed()); |
584 EXPECT_EQ(ERR_ABORTED, delegate2.WaitForClose()); | 593 EXPECT_EQ(ERR_ABORTED, delegateA.WaitForClose()); |
585 #else | 594 #else |
586 EXPECT_TRUE(session1->IsDraining()); | 595 EXPECT_TRUE(sessionA->IsDraining()); |
587 EXPECT_TRUE(session2->IsDraining()); | 596 EXPECT_TRUE(sessionB->IsDraining()); |
588 EXPECT_TRUE(session3->IsDraining()); | 597 EXPECT_TRUE(sessionC->IsDraining()); |
589 | 598 |
590 EXPECT_TRUE(delegate2.StreamIsClosed()); | 599 EXPECT_TRUE(delegateA.StreamIsClosed()); |
591 EXPECT_EQ(ERR_NETWORK_CHANGED, delegate2.WaitForClose()); | 600 EXPECT_EQ(ERR_NETWORK_CHANGED, delegateA.WaitForClose()); |
592 #endif // defined(OS_ANDROID) || defined(OS_WIN) || defined(OS_IOS) | 601 #endif // defined(OS_ANDROID) || defined(OS_WIN) || defined(OS_IOS) |
593 } | 602 } |
594 | 603 |
595 } // namespace | 604 } // namespace |
596 | 605 |
597 } // namespace net | 606 } // namespace net |
OLD | NEW |