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

Side by Side Diff: net/quic/chromium/quic_stream_factory_test.cc

Issue 2329853002: Introduces ability for session to wait on a migration trigger for a new (Closed)
Patch Set: network notifications handled 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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/quic/chromium/quic_stream_factory.h" 5 #include "net/quic/chromium/quic_stream_factory.h"
6 6
7 #include <ostream> 7 #include <ostream>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 489 matching lines...) Expand 10 before | Expand all | Expand 10 after
500 << " " << actual_address.port(); 500 << " " << actual_address.port();
501 DVLOG(1) << "Expected address: " << expected_address.address().ToString() 501 DVLOG(1) << "Expected address: " << expected_address.address().ToString()
502 << " " << expected_address.port(); 502 << " " << expected_address.port();
503 503
504 stream.reset(); 504 stream.reset();
505 EXPECT_TRUE(socket_data1.AllReadDataConsumed()); 505 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
506 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); 506 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
507 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); 507 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
508 } 508 }
509 509
510 void RunTestLoopUntilIdle() {
511 while (runner_->GetPostedTasks().size() > 0)
Ryan Hamilton 2016/09/12 03:42:01 nit: instead of size() > 0, !empty()
Ryan Hamilton 2016/09/13 00:33:18 ping
Jana 2016/09/13 01:12:18 Done.
512 runner_->RunNextTask();
513 }
514
510 // Helper methods for tests of connection migration on write error. 515 // Helper methods for tests of connection migration on write error.
511 void MigrateSessionOnWriteErrorNonMigratableStream(IoMode mode); 516 void MigrateSessionOnWriteErrorNonMigratableStream(IoMode mode);
512 void MigrateSessionOnWriteErrorMigrationDisabled(IoMode mode); 517 void MigrateSessionOnWriteErrorMigrationDisabled(IoMode mode);
513 void MigrateSessionOnWriteError(IoMode mode); 518 void MigrateSessionOnWriteError(IoMode mode);
514 void MigrateSessionOnWriteErrorNoNewNetwork(IoMode mode); 519 void MigrateSessionOnWriteErrorNoNewNetwork(IoMode mode);
520 void MigrateSessionOnWriteErrorPauseBeforeConnected(IoMode mode);
515 void MigrateSessionOnMultipleWriteErrors(IoMode mode1, IoMode mode2); 521 void MigrateSessionOnMultipleWriteErrors(IoMode mode1, IoMode mode2);
516 void MigrateSessionOnWriteErrorWithNotificationQueued(bool disconnected); 522 void MigrateSessionOnWriteErrorWithNotificationQueued(bool disconnected);
517 void MigrateSessionOnNotificationWithWriteErrorQueued(bool disconnected); 523 void MigrateSessionOnNotificationWithWriteErrorQueued(bool disconnected);
518 void OnNetworkDisconnected(bool async_write_before); 524 void OnNetworkDisconnected(bool async_write_before);
519 void OnNetworkMadeDefault(bool async_write_before); 525 void OnNetworkMadeDefault(bool async_write_before);
520 526
521 MockHostResolver host_resolver_; 527 MockHostResolver host_resolver_;
522 scoped_refptr<SSLConfigService> ssl_config_service_; 528 scoped_refptr<SSLConfigService> ssl_config_service_;
523 MockClientSocketFactory socket_factory_; 529 MockClientSocketFactory socket_factory_;
524 MockCryptoClientStreamFactory crypto_client_stream_factory_; 530 MockCryptoClientStreamFactory crypto_client_stream_factory_;
(...skipping 1226 matching lines...) Expand 10 before | Expand all | Expand 10 after
1751 1757
1752 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 1758 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1753 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 1759 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1754 } 1760 }
1755 1761
1756 TEST_P(QuicStreamFactoryTest, OnNetworkDisconnectedNoNewNetwork) { 1762 TEST_P(QuicStreamFactoryTest, OnNetworkDisconnectedNoNewNetwork) {
1757 InitializeConnectionMigrationTest({kDefaultNetworkForTests}); 1763 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
1758 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 1764 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1759 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 1765 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1760 1766
1767 // Use the test task runner, to force the migration alarm timeout later.
1768 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
1769
1761 MockQuicData socket_data; 1770 MockQuicData socket_data;
1762 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 1771 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1763 socket_data.AddWrite(client_maker_.MakeRstPacket( 1772 socket_data.AddWrite(client_maker_.MakeRstPacket(
1764 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT)); 1773 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1765 socket_data.AddSocketDataToFactory(&socket_factory_); 1774 socket_data.AddSocketDataToFactory(&socket_factory_);
1766 1775
1767 // Create request and QuicHttpStream. 1776 // Create request and QuicHttpStream.
1768 QuicStreamRequest request(factory_.get()); 1777 QuicStreamRequest request(factory_.get());
1769 EXPECT_EQ(ERR_IO_PENDING, 1778 EXPECT_EQ(ERR_IO_PENDING,
1770 request.Request(host_port_pair_, privacy_mode_, 1779 request.Request(host_port_pair_, privacy_mode_,
1771 /*cert_verify_flags=*/0, url_, "GET", net_log_, 1780 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1772 callback_.callback())); 1781 callback_.callback()));
1773 EXPECT_THAT(callback_.WaitForResult(), IsOk()); 1782 EXPECT_THAT(callback_.WaitForResult(), IsOk());
1774 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); 1783 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
1775 EXPECT_TRUE(stream.get()); 1784 EXPECT_TRUE(stream.get());
1776 1785
1777 // Cause QUIC stream to be created. 1786 // Cause QUIC stream to be created.
1778 HttpRequestInfo request_info; 1787 HttpRequestInfo request_info;
1779 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, 1788 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1780 net_log_, CompletionCallback())); 1789 net_log_, CompletionCallback()));
1781 1790
1782 // Ensure that session is alive and active. 1791 // Ensure that session is alive and active.
1783 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); 1792 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1784 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); 1793 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1785 EXPECT_TRUE(HasActiveSession(host_port_pair_)); 1794 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1786 1795
1787 // Trigger connection migration. Since there are no networks 1796 // Trigger connection migration. Since there are no networks
1788 // to migrate to, this should cause a RST_STREAM frame to be emitted 1797 // to migrate to, this should cause the session to wait for a new network.
1789 // with QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed.
1790 scoped_mock_network_change_notifier_->mock_network_change_notifier() 1798 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1791 ->NotifyNetworkDisconnected(kDefaultNetworkForTests); 1799 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1792 1800
1801 // The migration will not fail until the migration alarm timeout.
1802 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1803 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1804 EXPECT_EQ(1u, session->GetNumActiveStreams());
1805 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
1806 EXPECT_EQ(true, session->connection()->writer()->IsWriteBlocked());
1807
1808 // Force the migration alarm timeout to run.
1809 RunTestLoopUntilIdle();
1810
1811 // The connection should now be closed. A request for response
1812 // headers should fail.
1793 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); 1813 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1794 EXPECT_FALSE(HasActiveSession(host_port_pair_)); 1814 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1815 EXPECT_EQ(ERR_NETWORK_CHANGED, callback_.WaitForResult());
1795 1816
1796 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 1817 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1797 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 1818 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1798 } 1819 }
1799 1820
1800 TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultNonMigratableStream) { 1821 TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultNonMigratableStream) {
1801 InitializeConnectionMigrationTest( 1822 InitializeConnectionMigrationTest(
1802 {kDefaultNetworkForTests, kNewNetworkForTests}); 1823 {kDefaultNetworkForTests, kNewNetworkForTests});
1803 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 1824 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1804 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 1825 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
(...skipping 737 matching lines...) Expand 10 before | Expand all | Expand 10 after
2542 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 2563 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2543 EXPECT_TRUE(socket_data1.AllReadDataConsumed()); 2564 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
2544 EXPECT_TRUE(socket_data1.AllWriteDataConsumed()); 2565 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
2545 } 2566 }
2546 2567
2547 TEST_P(QuicStreamFactoryTest, 2568 TEST_P(QuicStreamFactoryTest,
2548 MigrateSessionOnWriteErrorNoNewNetworkSynchronous) { 2569 MigrateSessionOnWriteErrorNoNewNetworkSynchronous) {
2549 MigrateSessionOnWriteErrorNoNewNetwork(SYNCHRONOUS); 2570 MigrateSessionOnWriteErrorNoNewNetwork(SYNCHRONOUS);
2550 } 2571 }
2551 2572
2552 TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorNoNewNetworkAsync) { 2573 TEST_P(QuicStreamFactoryTest,
2574 DISABLED_MigrateSessionOnWriteErrorNoNewNetworkAsync) {
2553 MigrateSessionOnWriteErrorNoNewNetwork(ASYNC); 2575 MigrateSessionOnWriteErrorNoNewNetwork(ASYNC);
2554 } 2576 }
2555 2577
2556 void QuicStreamFactoryTestBase::MigrateSessionOnWriteErrorNoNewNetwork( 2578 void QuicStreamFactoryTestBase::MigrateSessionOnWriteErrorNoNewNetwork(
2557 IoMode mode) { 2579 IoMode mode) {
2558 InitializeConnectionMigrationTest({kDefaultNetworkForTests}); 2580 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
2559 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 2581 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2560 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 2582 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2561 2583
2584 // Use the test task runner, to force the migration alarm timeout later.
2585 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2586
2562 MockQuicData socket_data; 2587 MockQuicData socket_data;
2563 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 2588 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
2564 socket_data.AddWrite(mode, ERR_ADDRESS_UNREACHABLE); 2589 socket_data.AddWrite(mode, ERR_ADDRESS_UNREACHABLE);
2565 socket_data.AddSocketDataToFactory(&socket_factory_); 2590 socket_data.AddSocketDataToFactory(&socket_factory_);
2566 2591
2567 // Create request and QuicHttpStream. 2592 // Create request and QuicHttpStream.
2568 QuicStreamRequest request(factory_.get()); 2593 QuicStreamRequest request(factory_.get());
2569 EXPECT_EQ(ERR_IO_PENDING, 2594 EXPECT_EQ(ERR_IO_PENDING,
2570 request.Request(host_port_pair_, privacy_mode_, 2595 request.Request(host_port_pair_, privacy_mode_,
2571 /*cert_verify_flags=*/0, url_, "GET", net_log_, 2596 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2572 callback_.callback())); 2597 callback_.callback()));
2573 EXPECT_EQ(OK, callback_.WaitForResult()); 2598 EXPECT_EQ(OK, callback_.WaitForResult());
2574 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); 2599 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
2575 EXPECT_TRUE(stream.get()); 2600 EXPECT_TRUE(stream.get());
2576 2601
2577 // Cause QUIC stream to be created. 2602 // Cause QUIC stream to be created.
2578 HttpRequestInfo request_info; 2603 HttpRequestInfo request_info;
2579 request_info.method = "GET"; 2604 request_info.method = "GET";
2580 request_info.url = GURL("https://www.example.org/"); 2605 request_info.url = GURL("https://www.example.org/");
2581 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, 2606 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2582 net_log_, CompletionCallback())); 2607 net_log_, CompletionCallback()));
2583 2608
2584 // Ensure that session is alive and active. 2609 // Ensure that session is alive and active.
2585 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); 2610 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2586 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); 2611 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2587 EXPECT_TRUE(HasActiveSession(host_port_pair_)); 2612 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2588 2613
2614 // Send GET request on stream. This causes a write error, which triggers
2615 // a connection migration attempt. Since there are no networks
2616 // to migrate to, this causes the session to wait for a new network.
2617 HttpResponseInfo response;
2618 HttpRequestHeaders request_headers;
2619 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2620 callback_.callback()));
2621
2622 // Complete any pending writes.
2623 if (mode == ASYNC)
2624 runner_->RunNextTask();
2625
2626 // Migration has not yet failed. The session should be alive and active.
2627 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2628 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2629 EXPECT_EQ(1u, session->GetNumActiveStreams());
2630 EXPECT_TRUE(session->connection()->writer()->IsWriteBlocked());
2631
2632 // The migration will not fail until the migration alarm timeout.
2633 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2634 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2635 EXPECT_EQ(1u, session->GetNumActiveStreams());
2636 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
2637
2638 // Force migration alarm timeout to run.
2639 RunTestLoopUntilIdle();
2640
2641 // The connection should be closed. A request for response headers
2642 // should fail.
2643 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2644 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2645 EXPECT_EQ(ERR_NETWORK_CHANGED, callback_.WaitForResult());
2646 EXPECT_EQ(ERR_NETWORK_CHANGED,
2647 stream->ReadResponseHeaders(callback_.callback()));
2648
2649 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2650 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2651 }
2652
2653 TEST_P(QuicStreamFactoryTest,
2654 MigrateSessionOnWriteErrorPauseBeforeConnectedSync) {
2655 MigrateSessionOnWriteErrorPauseBeforeConnected(SYNCHRONOUS);
2656 }
2657 TEST_P(QuicStreamFactoryTest,
2658 MigrateSessionOnWriteErrorPauseBeforeConnectedAsync) {
2659 MigrateSessionOnWriteErrorPauseBeforeConnected(ASYNC);
2660 }
2661
2662 void QuicStreamFactoryTestBase::MigrateSessionOnWriteErrorPauseBeforeConnected(
2663 IoMode mode) {
2664 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
2665 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2666 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2667 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2668
2669 MockQuicData socket_data;
2670 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
2671 socket_data.AddWrite(SYNCHRONOUS, ERR_FAILED);
2672 socket_data.AddSocketDataToFactory(&socket_factory_);
2673
2674 // Create request and QuicHttpStream.
2675 QuicStreamRequest request(factory_.get());
2676 EXPECT_EQ(ERR_IO_PENDING,
2677 request.Request(host_port_pair_, privacy_mode_,
2678 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2679 callback_.callback()));
2680 EXPECT_EQ(OK, callback_.WaitForResult());
2681 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
2682 EXPECT_TRUE(stream.get());
2683
2684 // Cause QUIC stream to be created.
2685 HttpRequestInfo request_info;
2686 request_info.method = "GET";
2687 request_info.url = GURL("https://www.example.org/");
2688 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2689 net_log_, CompletionCallback()));
2690
2691 // Ensure that session is alive and active.
2692 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2693 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2694 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2695
2589 // Send GET request on stream. This should cause a write error, which triggers 2696 // Send GET request on stream. This should cause a write error, which triggers
2590 // a connection migration attempt. 2697 // a connection migration attempt.
2591 HttpResponseInfo response; 2698 HttpResponseInfo response;
2592 HttpRequestHeaders request_headers; 2699 HttpRequestHeaders request_headers;
2593 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response, 2700 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2594 callback_.callback())); 2701 callback_.callback()));
2595 // Run message loop to execute migration attempt. 2702
2703 // Run the message loop so that data queued in the new socket is read by the
2704 // packet reader.
2596 base::RunLoop().RunUntilIdle(); 2705 base::RunLoop().RunUntilIdle();
2597 // Migration fails, and session is closed and deleted. 2706
2598 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); 2707 // In this particular code path, the network will not yet be marked
2708 // as going away and the session will still be alive.
2709 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2710 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2711 EXPECT_EQ(1u, session->GetNumActiveStreams());
2712 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
2713
2714 // On a DISCONNECTED notification, nothing happens.
2715 // @@@ uncomment after NCN migrations are handled.
2716 // scoped_mock_network_change_notifier_->mock_network_change_notifier()
2717 // ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2718
2719 // Set up second socket data provider that is used after
2720 // migration. The request is rewritten to this new socket, and the
2721 // response to the request is read on this new socket.
2722 MockQuicData socket_data1;
2723 socket_data1.AddWrite(
2724 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true));
2725 socket_data1.AddRead(
2726 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
2727 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
2728 socket_data1.AddWrite(client_maker_.MakeAckAndRstPacket(
2729 2, false, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 1, 1, 1, true));
2730 socket_data1.AddSocketDataToFactory(&socket_factory_);
2731
2732 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2733 ->SetConnectedNetworksList({kNewNetworkForTests});
2734 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2735 ->NotifyNetworkConnected(kNewNetworkForTests);
2736
2737 // The session should now be marked as going away. Ensure that
2738 // while it is still alive, it is no longer active.
2739 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2599 EXPECT_FALSE(HasActiveSession(host_port_pair_)); 2740 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2741 EXPECT_EQ(1u, session->GetNumActiveStreams());
2742
2743 // This is the callback for the response headers that returned
2744 // pending previously, because no result was available. Check that
2745 // the result is now available due to the successful migration.
2746 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2747 EXPECT_EQ(200, response.headers->response_code());
2748
2749 // Create a new request for the same destination and verify that a
2750 // new session is created.
2751 MockQuicData socket_data2;
2752 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
2753 socket_data2.AddSocketDataToFactory(&socket_factory_);
2754
2755 QuicStreamRequest request2(factory_.get());
2756 EXPECT_EQ(ERR_IO_PENDING,
2757 request2.Request(host_port_pair_, privacy_mode_,
2758 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2759 callback_.callback()));
2760 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2761 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
2762 EXPECT_TRUE(stream2.get());
2763
2764 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2765 QuicChromiumClientSession* new_session = GetActiveSession(host_port_pair_);
2766 EXPECT_NE(session, new_session);
2767
2768 stream.reset();
2769 stream2.reset();
2600 2770
2601 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 2771 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2602 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 2772 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2773 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
2774 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
2775 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2776 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2603 } 2777 }
2604 2778
2605 TEST_P(QuicStreamFactoryTest, 2779 TEST_P(QuicStreamFactoryTest,
2606 MigrateSessionOnWriteErrorNonMigratableStreamSynchronous) { 2780 MigrateSessionOnWriteErrorNonMigratableStreamSynchronous) {
2607 MigrateSessionOnWriteErrorNonMigratableStream(SYNCHRONOUS); 2781 MigrateSessionOnWriteErrorNonMigratableStream(SYNCHRONOUS);
2608 } 2782 }
2609 2783
2610 TEST_P(QuicStreamFactoryTest, 2784 TEST_P(QuicStreamFactoryTest,
2611 MigrateSessionOnWriteErrorNonMigratableStreamAsync) { 2785 MigrateSessionOnWriteErrorNonMigratableStreamAsync) {
2612 MigrateSessionOnWriteErrorNonMigratableStream(ASYNC); 2786 MigrateSessionOnWriteErrorNonMigratableStream(ASYNC);
(...skipping 2894 matching lines...) Expand 10 before | Expand all | Expand 10 after
5507 // Clear all cached states. 5681 // Clear all cached states.
5508 factory_->ClearCachedStatesInCryptoConfig( 5682 factory_->ClearCachedStatesInCryptoConfig(
5509 base::Callback<bool(const GURL&)>()); 5683 base::Callback<bool(const GURL&)>());
5510 EXPECT_TRUE(test_cases[0].state->certs().empty()); 5684 EXPECT_TRUE(test_cases[0].state->certs().empty());
5511 EXPECT_TRUE(test_cases[1].state->certs().empty()); 5685 EXPECT_TRUE(test_cases[1].state->certs().empty());
5512 EXPECT_TRUE(test_cases[2].state->certs().empty()); 5686 EXPECT_TRUE(test_cases[2].state->certs().empty());
5513 } 5687 }
5514 5688
5515 } // namespace test 5689 } // namespace test
5516 } // namespace net 5690 } // namespace net
OLDNEW
« net/quic/chromium/quic_stream_factory.cc ('K') | « net/quic/chromium/quic_stream_factory.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698