OLD | NEW |
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 Loading... |
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().empty()) |
| 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 TestMigrationOnWriteErrorNonMigratableStream(IoMode write_error_mode); | 516 void TestMigrationOnWriteErrorNonMigratableStream(IoMode write_error_mode); |
512 void TestMigrationOnWriteErrorMigrationDisabled(IoMode write_error_mode); | 517 void TestMigrationOnWriteErrorMigrationDisabled(IoMode write_error_mode); |
513 void TestMigrationOnWriteError(IoMode write_error_mode); | 518 void TestMigrationOnWriteError(IoMode write_error_mode); |
514 void TestMigrationOnWriteErrorNoNewNetwork(IoMode write_error_mode); | 519 void TestMigrationOnWriteErrorNoNewNetwork(IoMode write_error_mode); |
515 void TestMigrationOnMultipleWriteErrors(IoMode first_write_error_mode, | 520 void TestMigrationOnMultipleWriteErrors(IoMode first_write_error_mode, |
516 IoMode second_write_error_mode); | 521 IoMode second_write_error_mode); |
517 void TestMigrationOnWriteErrorWithNotificationQueued(bool disconnected); | 522 void TestMigrationOnWriteErrorWithNotificationQueued(bool disconnected); |
518 void TestMigrationOnNotificationWithWriteErrorQueued(bool disconnected); | 523 void TestMigrationOnNotificationWithWriteErrorQueued(bool disconnected); |
519 void OnNetworkDisconnected(bool async_write_before); | 524 void OnNetworkDisconnected(bool async_write_before); |
520 void OnNetworkMadeDefault(bool async_write_before); | 525 void OnNetworkMadeDefault(bool async_write_before); |
| 526 void TestMigrationOnWriteErrorPauseBeforeConnected(IoMode write_error_mode); |
| 527 void OnNetworkDisconnectedWithNetworkList( |
| 528 NetworkChangeNotifier::NetworkList network_list); |
| 529 void TestMigrationOnWriteErrorWithNetworkAddedBeforeNotification( |
| 530 IoMode write_error_mode, |
| 531 bool disconnected); |
521 | 532 |
522 MockHostResolver host_resolver_; | 533 MockHostResolver host_resolver_; |
523 scoped_refptr<SSLConfigService> ssl_config_service_; | 534 scoped_refptr<SSLConfigService> ssl_config_service_; |
524 MockClientSocketFactory socket_factory_; | 535 MockClientSocketFactory socket_factory_; |
525 MockCryptoClientStreamFactory crypto_client_stream_factory_; | 536 MockCryptoClientStreamFactory crypto_client_stream_factory_; |
526 MockRandom random_generator_; | 537 MockRandom random_generator_; |
527 MockClock* clock_; // Owned by |factory_| once created. | 538 MockClock* clock_; // Owned by |factory_| once created. |
528 scoped_refptr<TestTaskRunner> runner_; | 539 scoped_refptr<TestTaskRunner> runner_; |
529 QuicVersion version_; | 540 QuicVersion version_; |
530 QuicTestPacketMaker client_maker_; | 541 QuicTestPacketMaker client_maker_; |
(...skipping 1173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1704 EXPECT_TRUE(socket_data.AllReadDataConsumed()); | 1715 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
1705 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); | 1716 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
1706 EXPECT_TRUE(socket_data1.AllReadDataConsumed()); | 1717 EXPECT_TRUE(socket_data1.AllReadDataConsumed()); |
1707 EXPECT_TRUE(socket_data1.AllWriteDataConsumed()); | 1718 EXPECT_TRUE(socket_data1.AllWriteDataConsumed()); |
1708 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); | 1719 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); |
1709 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); | 1720 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); |
1710 } | 1721 } |
1711 | 1722 |
1712 TEST_P(QuicStreamFactoryTest, OnNetworkDisconnectedNoNetworks) { | 1723 TEST_P(QuicStreamFactoryTest, OnNetworkDisconnectedNoNetworks) { |
1713 NetworkChangeNotifier::NetworkList no_networks(0); | 1724 NetworkChangeNotifier::NetworkList no_networks(0); |
1714 InitializeConnectionMigrationTest(no_networks); | 1725 OnNetworkDisconnectedWithNetworkList(no_networks); |
| 1726 } |
| 1727 |
| 1728 TEST_P(QuicStreamFactoryTest, OnNetworkDisconnectedNoNewNetwork) { |
| 1729 OnNetworkDisconnectedWithNetworkList({kDefaultNetworkForTests}); |
| 1730 } |
| 1731 |
| 1732 void QuicStreamFactoryTestBase::OnNetworkDisconnectedWithNetworkList( |
| 1733 NetworkChangeNotifier::NetworkList network_list) { |
| 1734 InitializeConnectionMigrationTest(network_list); |
1715 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | 1735 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
1716 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 1736 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
1717 | 1737 |
| 1738 // Use the test task runner, to force the migration alarm timeout later. |
| 1739 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get()); |
| 1740 |
1718 MockQuicData socket_data; | 1741 MockQuicData socket_data; |
1719 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); | 1742 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
1720 socket_data.AddWrite(client_maker_.MakeRstPacket( | |
1721 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT)); | |
1722 socket_data.AddSocketDataToFactory(&socket_factory_); | 1743 socket_data.AddSocketDataToFactory(&socket_factory_); |
1723 | 1744 |
1724 // Create request and QuicHttpStream. | 1745 // Create request and QuicHttpStream. |
1725 QuicStreamRequest request(factory_.get()); | |
1726 EXPECT_EQ(ERR_IO_PENDING, | |
1727 request.Request(host_port_pair_, privacy_mode_, | |
1728 /*cert_verify_flags=*/0, url_, "GET", net_log_, | |
1729 callback_.callback())); | |
1730 EXPECT_THAT(callback_.WaitForResult(), IsOk()); | |
1731 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); | |
1732 EXPECT_TRUE(stream.get()); | |
1733 | |
1734 // Cause QUIC stream to be created. | |
1735 HttpRequestInfo request_info; | |
1736 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, | |
1737 net_log_, CompletionCallback())); | |
1738 | |
1739 // Ensure that session is alive and active. | |
1740 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); | |
1741 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | |
1742 EXPECT_TRUE(HasActiveSession(host_port_pair_)); | |
1743 | |
1744 // Trigger connection migration. Since there are no networks | |
1745 // to migrate to, this should cause a RST_STREAM frame to be emitted | |
1746 // and the session to be closed. | |
1747 scoped_mock_network_change_notifier_->mock_network_change_notifier() | |
1748 ->NotifyNetworkDisconnected(kDefaultNetworkForTests); | |
1749 | |
1750 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | |
1751 EXPECT_FALSE(HasActiveSession(host_port_pair_)); | |
1752 | |
1753 EXPECT_TRUE(socket_data.AllReadDataConsumed()); | |
1754 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); | |
1755 } | |
1756 | |
1757 TEST_P(QuicStreamFactoryTest, OnNetworkDisconnectedNoNewNetwork) { | |
1758 InitializeConnectionMigrationTest({kDefaultNetworkForTests}); | |
1759 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | |
1760 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | |
1761 | |
1762 MockQuicData socket_data; | |
1763 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); | |
1764 socket_data.AddWrite(client_maker_.MakeRstPacket( | |
1765 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT)); | |
1766 socket_data.AddSocketDataToFactory(&socket_factory_); | |
1767 | |
1768 // Create request and QuicHttpStream. | |
1769 QuicStreamRequest request(factory_.get()); | 1746 QuicStreamRequest request(factory_.get()); |
1770 EXPECT_EQ(ERR_IO_PENDING, | 1747 EXPECT_EQ(ERR_IO_PENDING, |
1771 request.Request(host_port_pair_, privacy_mode_, | 1748 request.Request(host_port_pair_, privacy_mode_, |
1772 /*cert_verify_flags=*/0, url_, "GET", net_log_, | 1749 /*cert_verify_flags=*/0, url_, "GET", net_log_, |
1773 callback_.callback())); | 1750 callback_.callback())); |
1774 EXPECT_THAT(callback_.WaitForResult(), IsOk()); | 1751 EXPECT_THAT(callback_.WaitForResult(), IsOk()); |
1775 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); | 1752 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); |
1776 EXPECT_TRUE(stream.get()); | 1753 EXPECT_TRUE(stream.get()); |
1777 | 1754 |
1778 // Cause QUIC stream to be created. | 1755 // Cause QUIC stream to be created. |
1779 HttpRequestInfo request_info; | 1756 HttpRequestInfo request_info; |
1780 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, | 1757 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, |
1781 net_log_, CompletionCallback())); | 1758 net_log_, CompletionCallback())); |
1782 | 1759 |
1783 // Ensure that session is alive and active. | 1760 // Ensure that session is alive and active. |
1784 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); | 1761 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); |
1785 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | 1762 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
1786 EXPECT_TRUE(HasActiveSession(host_port_pair_)); | 1763 EXPECT_TRUE(HasActiveSession(host_port_pair_)); |
1787 | 1764 |
1788 // Trigger connection migration. Since there are no networks | 1765 // Trigger connection migration. Since there are no networks |
1789 // to migrate to, this should cause a RST_STREAM frame to be emitted | 1766 // to migrate to, this should cause the session to wait for a new network. |
1790 // with QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed. | |
1791 scoped_mock_network_change_notifier_->mock_network_change_notifier() | 1767 scoped_mock_network_change_notifier_->mock_network_change_notifier() |
1792 ->NotifyNetworkDisconnected(kDefaultNetworkForTests); | 1768 ->NotifyNetworkDisconnected(kDefaultNetworkForTests); |
1793 | 1769 |
| 1770 // The migration will not fail until the migration alarm timeout. |
| 1771 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
| 1772 EXPECT_FALSE(HasActiveSession(host_port_pair_)); |
| 1773 EXPECT_EQ(1u, session->GetNumActiveStreams()); |
| 1774 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback())); |
| 1775 EXPECT_EQ(true, session->connection()->writer()->IsWriteBlocked()); |
| 1776 |
| 1777 // Force the migration alarm timeout to run. |
| 1778 RunTestLoopUntilIdle(); |
| 1779 |
| 1780 // The connection should now be closed. A request for response |
| 1781 // headers should fail. |
1794 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | 1782 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
1795 EXPECT_FALSE(HasActiveSession(host_port_pair_)); | 1783 EXPECT_FALSE(HasActiveSession(host_port_pair_)); |
| 1784 EXPECT_EQ(ERR_NETWORK_CHANGED, callback_.WaitForResult()); |
1796 | 1785 |
1797 EXPECT_TRUE(socket_data.AllReadDataConsumed()); | 1786 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
1798 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); | 1787 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
1799 } | 1788 } |
1800 | 1789 |
1801 TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultNonMigratableStream) { | 1790 TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultNonMigratableStream) { |
1802 InitializeConnectionMigrationTest( | 1791 InitializeConnectionMigrationTest( |
1803 {kDefaultNetworkForTests, kNewNetworkForTests}); | 1792 {kDefaultNetworkForTests, kNewNetworkForTests}); |
1804 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | 1793 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
1805 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 1794 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2060 scoped_mock_network_change_notifier_->mock_network_change_notifier() | 2049 scoped_mock_network_change_notifier_->mock_network_change_notifier() |
2061 ->NotifyNetworkDisconnected(kDefaultNetworkForTests); | 2050 ->NotifyNetworkDisconnected(kDefaultNetworkForTests); |
2062 | 2051 |
2063 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | 2052 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
2064 EXPECT_FALSE(HasActiveSession(host_port_pair_)); | 2053 EXPECT_FALSE(HasActiveSession(host_port_pair_)); |
2065 | 2054 |
2066 EXPECT_TRUE(socket_data.AllReadDataConsumed()); | 2055 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
2067 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); | 2056 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
2068 } | 2057 } |
2069 | 2058 |
| 2059 TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedPauseBeforeConnected) { |
| 2060 InitializeConnectionMigrationTest({kDefaultNetworkForTests}); |
| 2061 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
| 2062 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
| 2063 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
| 2064 |
| 2065 MockQuicData socket_data; |
| 2066 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
| 2067 socket_data.AddWrite( |
| 2068 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true)); |
| 2069 socket_data.AddSocketDataToFactory(&socket_factory_); |
| 2070 |
| 2071 // Create request and QuicHttpStream. |
| 2072 QuicStreamRequest request(factory_.get()); |
| 2073 EXPECT_EQ(ERR_IO_PENDING, |
| 2074 request.Request(host_port_pair_, privacy_mode_, |
| 2075 /*cert_verify_flags=*/0, url_, "GET", net_log_, |
| 2076 callback_.callback())); |
| 2077 EXPECT_THAT(callback_.WaitForResult(), IsOk()); |
| 2078 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); |
| 2079 EXPECT_TRUE(stream.get()); |
| 2080 |
| 2081 // Cause QUIC stream to be created. |
| 2082 HttpRequestInfo request_info; |
| 2083 request_info.method = "GET"; |
| 2084 request_info.url = url_; |
| 2085 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, |
| 2086 net_log_, CompletionCallback())); |
| 2087 |
| 2088 // Ensure that session is alive and active. |
| 2089 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); |
| 2090 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
| 2091 EXPECT_TRUE(HasActiveSession(host_port_pair_)); |
| 2092 |
| 2093 // Send GET request on stream. |
| 2094 HttpResponseInfo response; |
| 2095 HttpRequestHeaders request_headers; |
| 2096 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response, |
| 2097 callback_.callback())); |
| 2098 |
| 2099 // Trigger connection migration. Since there are no networks |
| 2100 // to migrate to, this should cause the session to wait for a new network. |
| 2101 scoped_mock_network_change_notifier_->mock_network_change_notifier() |
| 2102 ->NotifyNetworkDisconnected(kDefaultNetworkForTests); |
| 2103 |
| 2104 // The connection should still be alive, but marked as going away. |
| 2105 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
| 2106 EXPECT_FALSE(HasActiveSession(host_port_pair_)); |
| 2107 EXPECT_EQ(1u, session->GetNumActiveStreams()); |
| 2108 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback())); |
| 2109 |
| 2110 // Set up second socket data provider that is used after migration. |
| 2111 // The response to the earlier request is read on this new socket. |
| 2112 MockQuicData socket_data1; |
| 2113 socket_data1.AddWrite( |
| 2114 client_maker_.MakePingPacket(2, /*include_version=*/true)); |
| 2115 socket_data1.AddRead( |
| 2116 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false)); |
| 2117 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
| 2118 socket_data1.AddWrite(client_maker_.MakeAckAndRstPacket( |
| 2119 3, false, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 1, 1, 1, true)); |
| 2120 socket_data1.AddSocketDataToFactory(&socket_factory_); |
| 2121 |
| 2122 // Add a new network and notify the stream factory of a new connected network. |
| 2123 // This causes a PING packet to be sent over the new network. |
| 2124 scoped_mock_network_change_notifier_->mock_network_change_notifier() |
| 2125 ->SetConnectedNetworksList({kNewNetworkForTests}); |
| 2126 scoped_mock_network_change_notifier_->mock_network_change_notifier() |
| 2127 ->NotifyNetworkConnected(kNewNetworkForTests); |
| 2128 |
| 2129 // Ensure that the session is still alive. |
| 2130 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
| 2131 EXPECT_FALSE(HasActiveSession(host_port_pair_)); |
| 2132 EXPECT_EQ(1u, session->GetNumActiveStreams()); |
| 2133 |
| 2134 // Run the message loop so that data queued in the new socket is read by the |
| 2135 // packet reader. |
| 2136 base::RunLoop().RunUntilIdle(); |
| 2137 |
| 2138 // Response headers are received over the new network. |
| 2139 EXPECT_THAT(callback_.WaitForResult(), IsOk()); |
| 2140 EXPECT_EQ(200, response.headers->response_code()); |
| 2141 |
| 2142 // Create a new request and verify that a new session is created. |
| 2143 MockQuicData socket_data2; |
| 2144 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
| 2145 socket_data2.AddSocketDataToFactory(&socket_factory_); |
| 2146 QuicStreamRequest request2(factory_.get()); |
| 2147 EXPECT_EQ(ERR_IO_PENDING, |
| 2148 request2.Request(host_port_pair_, privacy_mode_, |
| 2149 /*cert_verify_flags=*/0, url_, "GET", net_log_, |
| 2150 callback_.callback())); |
| 2151 EXPECT_THAT(callback_.WaitForResult(), IsOk()); |
| 2152 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream(); |
| 2153 EXPECT_TRUE(stream2.get()); |
| 2154 |
| 2155 EXPECT_TRUE(HasActiveSession(host_port_pair_)); |
| 2156 EXPECT_NE(session, GetActiveSession(host_port_pair_)); |
| 2157 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
| 2158 |
| 2159 stream.reset(); |
| 2160 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
| 2161 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
| 2162 EXPECT_TRUE(socket_data1.AllReadDataConsumed()); |
| 2163 EXPECT_TRUE(socket_data1.AllWriteDataConsumed()); |
| 2164 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); |
| 2165 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); |
| 2166 } |
| 2167 |
2070 TEST_P(QuicStreamFactoryTest, MigrateSessionEarly) { | 2168 TEST_P(QuicStreamFactoryTest, MigrateSessionEarly) { |
2071 InitializeConnectionMigrationTest( | 2169 InitializeConnectionMigrationTest( |
2072 {kDefaultNetworkForTests, kNewNetworkForTests}); | 2170 {kDefaultNetworkForTests, kNewNetworkForTests}); |
2073 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | 2171 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
2074 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 2172 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
2075 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 2173 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
2076 | 2174 |
2077 MockQuicData socket_data; | 2175 MockQuicData socket_data; |
2078 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); | 2176 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
2079 socket_data.AddWrite( | 2177 socket_data.AddWrite( |
(...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2545 TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorAsync) { | 2643 TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorAsync) { |
2546 TestMigrationOnWriteError(ASYNC); | 2644 TestMigrationOnWriteError(ASYNC); |
2547 } | 2645 } |
2548 | 2646 |
2549 void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorNoNewNetwork( | 2647 void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorNoNewNetwork( |
2550 IoMode write_error_mode) { | 2648 IoMode write_error_mode) { |
2551 InitializeConnectionMigrationTest({kDefaultNetworkForTests}); | 2649 InitializeConnectionMigrationTest({kDefaultNetworkForTests}); |
2552 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | 2650 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
2553 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 2651 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
2554 | 2652 |
| 2653 // Use the test task runner, to force the migration alarm timeout later. |
| 2654 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get()); |
| 2655 |
2555 MockQuicData socket_data; | 2656 MockQuicData socket_data; |
2556 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); | 2657 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
2557 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE); | 2658 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE); |
2558 socket_data.AddSocketDataToFactory(&socket_factory_); | 2659 socket_data.AddSocketDataToFactory(&socket_factory_); |
2559 | 2660 |
2560 // Create request and QuicHttpStream. | 2661 // Create request and QuicHttpStream. |
2561 QuicStreamRequest request(factory_.get()); | 2662 QuicStreamRequest request(factory_.get()); |
2562 EXPECT_EQ(ERR_IO_PENDING, | 2663 EXPECT_EQ(ERR_IO_PENDING, |
2563 request.Request(host_port_pair_, privacy_mode_, | 2664 request.Request(host_port_pair_, privacy_mode_, |
2564 /*cert_verify_flags=*/0, url_, "GET", net_log_, | 2665 /*cert_verify_flags=*/0, url_, "GET", net_log_, |
2565 callback_.callback())); | 2666 callback_.callback())); |
2566 EXPECT_EQ(OK, callback_.WaitForResult()); | 2667 EXPECT_EQ(OK, callback_.WaitForResult()); |
2567 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); | 2668 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); |
2568 EXPECT_TRUE(stream.get()); | 2669 EXPECT_TRUE(stream.get()); |
2569 | 2670 |
2570 // Cause QUIC stream to be created. | 2671 // Cause QUIC stream to be created. |
2571 HttpRequestInfo request_info; | 2672 HttpRequestInfo request_info; |
2572 request_info.method = "GET"; | 2673 request_info.method = "GET"; |
2573 request_info.url = GURL("https://www.example.org/"); | 2674 request_info.url = GURL("https://www.example.org/"); |
2574 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, | 2675 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, |
2575 net_log_, CompletionCallback())); | 2676 net_log_, CompletionCallback())); |
2576 | 2677 |
2577 // Ensure that session is alive and active. | 2678 // Ensure that session is alive and active. |
2578 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); | 2679 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); |
2579 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | 2680 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
2580 EXPECT_TRUE(HasActiveSession(host_port_pair_)); | 2681 EXPECT_TRUE(HasActiveSession(host_port_pair_)); |
2581 | 2682 |
2582 // Send GET request on stream. This should cause a write error, which triggers | 2683 // Send GET request on stream. This causes a write error, which triggers |
2583 // a connection migration attempt. | 2684 // a connection migration attempt. Since there are no networks |
| 2685 // to migrate to, this causes the session to wait for a new network. |
2584 HttpResponseInfo response; | 2686 HttpResponseInfo response; |
2585 HttpRequestHeaders request_headers; | 2687 HttpRequestHeaders request_headers; |
2586 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response, | 2688 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response, |
2587 callback_.callback())); | 2689 callback_.callback())); |
2588 // Run message loop to execute migration attempt. | 2690 |
| 2691 // Complete any pending writes. Pending async MockQuicData writes |
| 2692 // are run on the message loop, not on the test runner. |
2589 base::RunLoop().RunUntilIdle(); | 2693 base::RunLoop().RunUntilIdle(); |
2590 // Migration fails, and session is closed and deleted. | 2694 |
| 2695 // Write error causes migration task to be posted. Spin the loop. |
| 2696 if (write_error_mode == ASYNC) |
| 2697 runner_->RunNextTask(); |
| 2698 |
| 2699 // Migration has not yet failed. The session should be alive and active. |
| 2700 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
| 2701 EXPECT_TRUE(HasActiveSession(host_port_pair_)); |
| 2702 EXPECT_EQ(1u, session->GetNumActiveStreams()); |
| 2703 EXPECT_TRUE(session->connection()->writer()->IsWriteBlocked()); |
| 2704 |
| 2705 // The migration will not fail until the migration alarm timeout. |
| 2706 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
| 2707 EXPECT_TRUE(HasActiveSession(host_port_pair_)); |
| 2708 EXPECT_EQ(1u, session->GetNumActiveStreams()); |
| 2709 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback())); |
| 2710 |
| 2711 // Force migration alarm timeout to run. |
| 2712 RunTestLoopUntilIdle(); |
| 2713 |
| 2714 // The connection should be closed. A request for response headers |
| 2715 // should fail. |
2591 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | 2716 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
2592 EXPECT_FALSE(HasActiveSession(host_port_pair_)); | 2717 EXPECT_FALSE(HasActiveSession(host_port_pair_)); |
| 2718 EXPECT_EQ(ERR_NETWORK_CHANGED, callback_.WaitForResult()); |
| 2719 EXPECT_EQ(ERR_NETWORK_CHANGED, |
| 2720 stream->ReadResponseHeaders(callback_.callback())); |
2593 | 2721 |
2594 EXPECT_TRUE(socket_data.AllReadDataConsumed()); | 2722 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
2595 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); | 2723 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
2596 } | 2724 } |
2597 | 2725 |
2598 TEST_P(QuicStreamFactoryTest, | 2726 TEST_P(QuicStreamFactoryTest, |
2599 MigrateSessionOnWriteErrorNoNewNetworkSynchronous) { | 2727 MigrateSessionOnWriteErrorNoNewNetworkSynchronous) { |
2600 TestMigrationOnWriteErrorNoNewNetwork(SYNCHRONOUS); | 2728 TestMigrationOnWriteErrorNoNewNetwork(SYNCHRONOUS); |
2601 } | 2729 } |
2602 | 2730 |
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3004 TEST_P(QuicStreamFactoryTest, | 3132 TEST_P(QuicStreamFactoryTest, |
3005 MigrateSessionOnNetworkDisconnectedWithWriteErrorQueued) { | 3133 MigrateSessionOnNetworkDisconnectedWithWriteErrorQueued) { |
3006 TestMigrationOnNotificationWithWriteErrorQueued(/*disconnected=*/true); | 3134 TestMigrationOnNotificationWithWriteErrorQueued(/*disconnected=*/true); |
3007 } | 3135 } |
3008 | 3136 |
3009 TEST_P(QuicStreamFactoryTest, | 3137 TEST_P(QuicStreamFactoryTest, |
3010 MigrateSessionOnNetworkMadeDefaultWithWriteErrorQueued) { | 3138 MigrateSessionOnNetworkMadeDefaultWithWriteErrorQueued) { |
3011 TestMigrationOnNotificationWithWriteErrorQueued(/*disconnected=*/true); | 3139 TestMigrationOnNotificationWithWriteErrorQueued(/*disconnected=*/true); |
3012 } | 3140 } |
3013 | 3141 |
| 3142 void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorPauseBeforeConnected( |
| 3143 IoMode write_error_mode) { |
| 3144 InitializeConnectionMigrationTest({kDefaultNetworkForTests}); |
| 3145 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
| 3146 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
| 3147 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
| 3148 |
| 3149 MockQuicData socket_data; |
| 3150 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
| 3151 socket_data.AddWrite(SYNCHRONOUS, ERR_FAILED); |
| 3152 socket_data.AddSocketDataToFactory(&socket_factory_); |
| 3153 |
| 3154 // Create request and QuicHttpStream. |
| 3155 QuicStreamRequest request(factory_.get()); |
| 3156 EXPECT_EQ(ERR_IO_PENDING, |
| 3157 request.Request(host_port_pair_, privacy_mode_, |
| 3158 /*cert_verify_flags=*/0, url_, "GET", net_log_, |
| 3159 callback_.callback())); |
| 3160 EXPECT_EQ(OK, callback_.WaitForResult()); |
| 3161 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); |
| 3162 EXPECT_TRUE(stream.get()); |
| 3163 |
| 3164 // Cause QUIC stream to be created. |
| 3165 HttpRequestInfo request_info; |
| 3166 request_info.method = "GET"; |
| 3167 request_info.url = GURL("https://www.example.org/"); |
| 3168 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, |
| 3169 net_log_, CompletionCallback())); |
| 3170 |
| 3171 // Ensure that session is alive and active. |
| 3172 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); |
| 3173 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
| 3174 EXPECT_TRUE(HasActiveSession(host_port_pair_)); |
| 3175 |
| 3176 // Send GET request on stream. This should cause a write error, which triggers |
| 3177 // a connection migration attempt. |
| 3178 HttpResponseInfo response; |
| 3179 HttpRequestHeaders request_headers; |
| 3180 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response, |
| 3181 callback_.callback())); |
| 3182 |
| 3183 // Run the message loop so that data queued in the new socket is read by the |
| 3184 // packet reader. |
| 3185 base::RunLoop().RunUntilIdle(); |
| 3186 |
| 3187 // In this particular code path, the network will not yet be marked |
| 3188 // as going away and the session will still be alive. |
| 3189 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
| 3190 EXPECT_TRUE(HasActiveSession(host_port_pair_)); |
| 3191 EXPECT_EQ(1u, session->GetNumActiveStreams()); |
| 3192 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback())); |
| 3193 |
| 3194 // On a DISCONNECTED notification, nothing happens. |
| 3195 scoped_mock_network_change_notifier_->mock_network_change_notifier() |
| 3196 ->NotifyNetworkDisconnected(kDefaultNetworkForTests); |
| 3197 |
| 3198 // Set up second socket data provider that is used after |
| 3199 // migration. The request is rewritten to this new socket, and the |
| 3200 // response to the request is read on this new socket. |
| 3201 MockQuicData socket_data1; |
| 3202 socket_data1.AddWrite( |
| 3203 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true)); |
| 3204 socket_data1.AddRead( |
| 3205 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false)); |
| 3206 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
| 3207 socket_data1.AddWrite(client_maker_.MakeAckAndRstPacket( |
| 3208 2, false, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 1, 1, 1, true)); |
| 3209 socket_data1.AddSocketDataToFactory(&socket_factory_); |
| 3210 |
| 3211 scoped_mock_network_change_notifier_->mock_network_change_notifier() |
| 3212 ->SetConnectedNetworksList({kNewNetworkForTests}); |
| 3213 scoped_mock_network_change_notifier_->mock_network_change_notifier() |
| 3214 ->NotifyNetworkConnected(kNewNetworkForTests); |
| 3215 |
| 3216 // The session should now be marked as going away. Ensure that |
| 3217 // while it is still alive, it is no longer active. |
| 3218 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
| 3219 EXPECT_FALSE(HasActiveSession(host_port_pair_)); |
| 3220 EXPECT_EQ(1u, session->GetNumActiveStreams()); |
| 3221 |
| 3222 // This is the callback for the response headers that returned |
| 3223 // pending previously, because no result was available. Check that |
| 3224 // the result is now available due to the successful migration. |
| 3225 EXPECT_THAT(callback_.WaitForResult(), IsOk()); |
| 3226 EXPECT_EQ(200, response.headers->response_code()); |
| 3227 |
| 3228 // Create a new request for the same destination and verify that a |
| 3229 // new session is created. |
| 3230 MockQuicData socket_data2; |
| 3231 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
| 3232 socket_data2.AddSocketDataToFactory(&socket_factory_); |
| 3233 |
| 3234 QuicStreamRequest request2(factory_.get()); |
| 3235 EXPECT_EQ(ERR_IO_PENDING, |
| 3236 request2.Request(host_port_pair_, privacy_mode_, |
| 3237 /*cert_verify_flags=*/0, url_, "GET", net_log_, |
| 3238 callback_.callback())); |
| 3239 EXPECT_THAT(callback_.WaitForResult(), IsOk()); |
| 3240 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream(); |
| 3241 EXPECT_TRUE(stream2.get()); |
| 3242 |
| 3243 EXPECT_TRUE(HasActiveSession(host_port_pair_)); |
| 3244 QuicChromiumClientSession* new_session = GetActiveSession(host_port_pair_); |
| 3245 EXPECT_NE(session, new_session); |
| 3246 |
| 3247 stream.reset(); |
| 3248 stream2.reset(); |
| 3249 |
| 3250 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
| 3251 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
| 3252 EXPECT_TRUE(socket_data1.AllReadDataConsumed()); |
| 3253 EXPECT_TRUE(socket_data1.AllWriteDataConsumed()); |
| 3254 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); |
| 3255 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); |
| 3256 } |
| 3257 |
| 3258 TEST_P(QuicStreamFactoryTest, |
| 3259 MigrateSessionOnWriteErrorPauseBeforeConnectedSync) { |
| 3260 TestMigrationOnWriteErrorPauseBeforeConnected(SYNCHRONOUS); |
| 3261 } |
| 3262 |
| 3263 TEST_P(QuicStreamFactoryTest, |
| 3264 MigrateSessionOnWriteErrorPauseBeforeConnectedAsync) { |
| 3265 TestMigrationOnWriteErrorPauseBeforeConnected(ASYNC); |
| 3266 } |
| 3267 |
| 3268 void QuicStreamFactoryTestBase:: |
| 3269 TestMigrationOnWriteErrorWithNetworkAddedBeforeNotification( |
| 3270 IoMode write_error_mode, |
| 3271 bool disconnected) { |
| 3272 InitializeConnectionMigrationTest({kDefaultNetworkForTests}); |
| 3273 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
| 3274 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
| 3275 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
| 3276 |
| 3277 MockQuicData socket_data; |
| 3278 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
| 3279 socket_data.AddWrite(SYNCHRONOUS, ERR_FAILED); |
| 3280 socket_data.AddSocketDataToFactory(&socket_factory_); |
| 3281 |
| 3282 // Create request and QuicHttpStream. |
| 3283 QuicStreamRequest request(factory_.get()); |
| 3284 EXPECT_EQ(ERR_IO_PENDING, |
| 3285 request.Request(host_port_pair_, privacy_mode_, |
| 3286 /*cert_verify_flags=*/0, url_, "GET", net_log_, |
| 3287 callback_.callback())); |
| 3288 EXPECT_EQ(OK, callback_.WaitForResult()); |
| 3289 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); |
| 3290 EXPECT_TRUE(stream.get()); |
| 3291 |
| 3292 // Cause QUIC stream to be created. |
| 3293 HttpRequestInfo request_info; |
| 3294 request_info.method = "GET"; |
| 3295 request_info.url = GURL("https://www.example.org/"); |
| 3296 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, |
| 3297 net_log_, CompletionCallback())); |
| 3298 |
| 3299 // Ensure that session is alive and active. |
| 3300 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); |
| 3301 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
| 3302 EXPECT_TRUE(HasActiveSession(host_port_pair_)); |
| 3303 |
| 3304 // Send GET request on stream. This should cause a write error, which triggers |
| 3305 // a connection migration attempt. |
| 3306 HttpResponseInfo response; |
| 3307 HttpRequestHeaders request_headers; |
| 3308 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response, |
| 3309 callback_.callback())); |
| 3310 |
| 3311 // Run the message loop so that data queued in the new socket is read by the |
| 3312 // packet reader. |
| 3313 base::RunLoop().RunUntilIdle(); |
| 3314 |
| 3315 // In this particular code path, the network will not yet be marked |
| 3316 // as going away and the session will still be alive. |
| 3317 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
| 3318 EXPECT_TRUE(HasActiveSession(host_port_pair_)); |
| 3319 EXPECT_EQ(1u, session->GetNumActiveStreams()); |
| 3320 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback())); |
| 3321 |
| 3322 // Set up second socket data provider that is used after |
| 3323 // migration. The request is rewritten to this new socket, and the |
| 3324 // response to the request is read on this new socket. |
| 3325 MockQuicData socket_data1; |
| 3326 socket_data1.AddWrite( |
| 3327 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true)); |
| 3328 socket_data1.AddRead( |
| 3329 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false)); |
| 3330 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
| 3331 socket_data1.AddWrite(client_maker_.MakeAckAndRstPacket( |
| 3332 2, false, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 1, 1, 1, true)); |
| 3333 socket_data1.AddSocketDataToFactory(&socket_factory_); |
| 3334 |
| 3335 scoped_mock_network_change_notifier_->mock_network_change_notifier() |
| 3336 ->SetConnectedNetworksList( |
| 3337 {kDefaultNetworkForTests, kNewNetworkForTests}); |
| 3338 |
| 3339 // A notification triggers and completes migration. |
| 3340 if (disconnected) { |
| 3341 scoped_mock_network_change_notifier_->mock_network_change_notifier() |
| 3342 ->NotifyNetworkDisconnected(kDefaultNetworkForTests); |
| 3343 } else { |
| 3344 scoped_mock_network_change_notifier_->mock_network_change_notifier() |
| 3345 ->NotifyNetworkMadeDefault(kNewNetworkForTests); |
| 3346 } |
| 3347 // The session should now be marked as going away. Ensure that |
| 3348 // while it is still alive, it is no longer active. |
| 3349 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
| 3350 EXPECT_FALSE(HasActiveSession(host_port_pair_)); |
| 3351 EXPECT_EQ(1u, session->GetNumActiveStreams()); |
| 3352 |
| 3353 // This is the callback for the response headers that returned |
| 3354 // pending previously, because no result was available. Check that |
| 3355 // the result is now available due to the successful migration. |
| 3356 EXPECT_THAT(callback_.WaitForResult(), IsOk()); |
| 3357 EXPECT_EQ(200, response.headers->response_code()); |
| 3358 |
| 3359 // Now deliver a CONNECTED notification. Nothing happens since |
| 3360 // migration was already finished earlier. |
| 3361 scoped_mock_network_change_notifier_->mock_network_change_notifier() |
| 3362 ->NotifyNetworkConnected(kNewNetworkForTests); |
| 3363 |
| 3364 // Create a new request for the same destination and verify that a |
| 3365 // new session is created. |
| 3366 MockQuicData socket_data2; |
| 3367 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
| 3368 socket_data2.AddSocketDataToFactory(&socket_factory_); |
| 3369 |
| 3370 QuicStreamRequest request2(factory_.get()); |
| 3371 EXPECT_EQ(ERR_IO_PENDING, |
| 3372 request2.Request(host_port_pair_, privacy_mode_, |
| 3373 /*cert_verify_flags=*/0, url_, "GET", net_log_, |
| 3374 callback_.callback())); |
| 3375 EXPECT_THAT(callback_.WaitForResult(), IsOk()); |
| 3376 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream(); |
| 3377 EXPECT_TRUE(stream2.get()); |
| 3378 |
| 3379 EXPECT_TRUE(HasActiveSession(host_port_pair_)); |
| 3380 QuicChromiumClientSession* new_session = GetActiveSession(host_port_pair_); |
| 3381 EXPECT_NE(session, new_session); |
| 3382 |
| 3383 stream.reset(); |
| 3384 stream2.reset(); |
| 3385 |
| 3386 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
| 3387 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
| 3388 EXPECT_TRUE(socket_data1.AllReadDataConsumed()); |
| 3389 EXPECT_TRUE(socket_data1.AllWriteDataConsumed()); |
| 3390 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); |
| 3391 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); |
| 3392 } |
| 3393 |
| 3394 TEST_P(QuicStreamFactoryTest, |
| 3395 MigrateSessionOnWriteErrorWithNetworkAddedBeforeDisconnectedSync) { |
| 3396 TestMigrationOnWriteErrorWithNetworkAddedBeforeNotification(SYNCHRONOUS, |
| 3397 true); |
| 3398 } |
| 3399 |
| 3400 TEST_P(QuicStreamFactoryTest, |
| 3401 MigrateSessionOnWriteErrorWithNetworkAddedBeforeDisconnectedAsync) { |
| 3402 TestMigrationOnWriteErrorWithNetworkAddedBeforeNotification(ASYNC, true); |
| 3403 } |
| 3404 |
| 3405 TEST_P(QuicStreamFactoryTest, |
| 3406 MigrateSessionOnWriteErrorWithNetworkAddedBeforeMadeDefaultSync) { |
| 3407 TestMigrationOnWriteErrorWithNetworkAddedBeforeNotification(SYNCHRONOUS, |
| 3408 false); |
| 3409 } |
| 3410 |
| 3411 TEST_P(QuicStreamFactoryTest, |
| 3412 MigrateSessionOnWriteErrorWithNetworkAddedBeforeMadeDefaultAsync) { |
| 3413 TestMigrationOnWriteErrorWithNetworkAddedBeforeNotification(ASYNC, false); |
| 3414 } |
| 3415 |
3014 TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyToBadSocket) { | 3416 TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyToBadSocket) { |
3015 // This simulates the case where we attempt to migrate to a new | 3417 // This simulates the case where we attempt to migrate to a new |
3016 // socket but the socket is unusable, such as an ipv4/ipv6 mismatch. | 3418 // socket but the socket is unusable, such as an ipv4/ipv6 mismatch. |
3017 InitializeConnectionMigrationTest( | 3419 InitializeConnectionMigrationTest( |
3018 {kDefaultNetworkForTests, kNewNetworkForTests}); | 3420 {kDefaultNetworkForTests, kNewNetworkForTests}); |
3019 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | 3421 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
3020 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 3422 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
3021 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 3423 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
3022 | 3424 |
3023 MockQuicData socket_data; | 3425 MockQuicData socket_data; |
(...skipping 2485 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5509 // Clear all cached states. | 5911 // Clear all cached states. |
5510 factory_->ClearCachedStatesInCryptoConfig( | 5912 factory_->ClearCachedStatesInCryptoConfig( |
5511 base::Callback<bool(const GURL&)>()); | 5913 base::Callback<bool(const GURL&)>()); |
5512 EXPECT_TRUE(test_cases[0].state->certs().empty()); | 5914 EXPECT_TRUE(test_cases[0].state->certs().empty()); |
5513 EXPECT_TRUE(test_cases[1].state->certs().empty()); | 5915 EXPECT_TRUE(test_cases[1].state->certs().empty()); |
5514 EXPECT_TRUE(test_cases[2].state->certs().empty()); | 5916 EXPECT_TRUE(test_cases[2].state->certs().empty()); |
5515 } | 5917 } |
5516 | 5918 |
5517 } // namespace test | 5919 } // namespace test |
5518 } // namespace net | 5920 } // namespace net |
OLD | NEW |