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().size() > 0) | |
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 MigrateSessionOnWriteErrorPauseBeforeConnected(IoMode write_error_mode); | |
527 void OnNetworkDisconnectedWithNetworkList( | |
528 NetworkChangeNotifier::NetworkList network_list); | |
521 | 529 |
522 MockHostResolver host_resolver_; | 530 MockHostResolver host_resolver_; |
523 scoped_refptr<SSLConfigService> ssl_config_service_; | 531 scoped_refptr<SSLConfigService> ssl_config_service_; |
524 MockClientSocketFactory socket_factory_; | 532 MockClientSocketFactory socket_factory_; |
525 MockCryptoClientStreamFactory crypto_client_stream_factory_; | 533 MockCryptoClientStreamFactory crypto_client_stream_factory_; |
526 MockRandom random_generator_; | 534 MockRandom random_generator_; |
527 MockClock* clock_; // Owned by |factory_| once created. | 535 MockClock* clock_; // Owned by |factory_| once created. |
528 scoped_refptr<TestTaskRunner> runner_; | 536 scoped_refptr<TestTaskRunner> runner_; |
529 QuicVersion version_; | 537 QuicVersion version_; |
530 QuicTestPacketMaker client_maker_; | 538 QuicTestPacketMaker client_maker_; |
(...skipping 1173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1704 EXPECT_TRUE(socket_data.AllReadDataConsumed()); | 1712 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
1705 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); | 1713 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
1706 EXPECT_TRUE(socket_data1.AllReadDataConsumed()); | 1714 EXPECT_TRUE(socket_data1.AllReadDataConsumed()); |
1707 EXPECT_TRUE(socket_data1.AllWriteDataConsumed()); | 1715 EXPECT_TRUE(socket_data1.AllWriteDataConsumed()); |
1708 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); | 1716 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); |
1709 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); | 1717 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); |
1710 } | 1718 } |
1711 | 1719 |
1712 TEST_P(QuicStreamFactoryTest, OnNetworkDisconnectedNoNetworks) { | 1720 TEST_P(QuicStreamFactoryTest, OnNetworkDisconnectedNoNetworks) { |
1713 NetworkChangeNotifier::NetworkList no_networks(0); | 1721 NetworkChangeNotifier::NetworkList no_networks(0); |
1714 InitializeConnectionMigrationTest(no_networks); | 1722 OnNetworkDisconnectedWithNetworkList(no_networks); |
1723 } | |
1724 | |
1725 TEST_P(QuicStreamFactoryTest, OnNetworkDisconnectedNoNewNetwork) { | |
1726 OnNetworkDisconnectedWithNetworkList({kDefaultNetworkForTests}); | |
1727 } | |
1728 | |
1729 void QuicStreamFactoryTestBase::OnNetworkDisconnectedWithNetworkList( | |
1730 NetworkChangeNotifier::NetworkList network_list) { | |
1731 InitializeConnectionMigrationTest(network_list); | |
1715 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | 1732 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
1716 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 1733 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
1717 | 1734 |
1735 // Use the test task runner, to force the migration alarm timeout later. | |
1736 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get()); | |
1737 | |
1718 MockQuicData socket_data; | 1738 MockQuicData socket_data; |
1719 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); | 1739 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_); | 1740 socket_data.AddSocketDataToFactory(&socket_factory_); |
1723 | 1741 |
1724 // Create request and QuicHttpStream. | 1742 // 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()); | 1743 QuicStreamRequest request(factory_.get()); |
1770 EXPECT_EQ(ERR_IO_PENDING, | 1744 EXPECT_EQ(ERR_IO_PENDING, |
1771 request.Request(host_port_pair_, privacy_mode_, | 1745 request.Request(host_port_pair_, privacy_mode_, |
1772 /*cert_verify_flags=*/0, url_, "GET", net_log_, | 1746 /*cert_verify_flags=*/0, url_, "GET", net_log_, |
1773 callback_.callback())); | 1747 callback_.callback())); |
1774 EXPECT_THAT(callback_.WaitForResult(), IsOk()); | 1748 EXPECT_THAT(callback_.WaitForResult(), IsOk()); |
1775 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); | 1749 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); |
1776 EXPECT_TRUE(stream.get()); | 1750 EXPECT_TRUE(stream.get()); |
1777 | 1751 |
1778 // Cause QUIC stream to be created. | 1752 // Cause QUIC stream to be created. |
1779 HttpRequestInfo request_info; | 1753 HttpRequestInfo request_info; |
1780 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, | 1754 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, |
1781 net_log_, CompletionCallback())); | 1755 net_log_, CompletionCallback())); |
1782 | 1756 |
1783 // Ensure that session is alive and active. | 1757 // Ensure that session is alive and active. |
1784 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); | 1758 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); |
1785 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | 1759 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
1786 EXPECT_TRUE(HasActiveSession(host_port_pair_)); | 1760 EXPECT_TRUE(HasActiveSession(host_port_pair_)); |
1787 | 1761 |
1788 // Trigger connection migration. Since there are no networks | 1762 // Trigger connection migration. Since there are no networks |
1789 // to migrate to, this should cause a RST_STREAM frame to be emitted | 1763 // 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() | 1764 scoped_mock_network_change_notifier_->mock_network_change_notifier() |
1792 ->NotifyNetworkDisconnected(kDefaultNetworkForTests); | 1765 ->NotifyNetworkDisconnected(kDefaultNetworkForTests); |
1793 | 1766 |
1767 // The migration will not fail until the migration alarm timeout. | |
1768 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | |
1769 EXPECT_FALSE(HasActiveSession(host_port_pair_)); | |
1770 EXPECT_EQ(1u, session->GetNumActiveStreams()); | |
1771 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback())); | |
1772 EXPECT_EQ(true, session->connection()->writer()->IsWriteBlocked()); | |
1773 | |
1774 // Force the migration alarm timeout to run. | |
1775 RunTestLoopUntilIdle(); | |
1776 | |
1777 // The connection should now be closed. A request for response | |
1778 // headers should fail. | |
1794 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | 1779 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
1795 EXPECT_FALSE(HasActiveSession(host_port_pair_)); | 1780 EXPECT_FALSE(HasActiveSession(host_port_pair_)); |
1781 EXPECT_EQ(ERR_NETWORK_CHANGED, callback_.WaitForResult()); | |
1796 | 1782 |
1797 EXPECT_TRUE(socket_data.AllReadDataConsumed()); | 1783 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
1798 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); | 1784 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
1799 } | 1785 } |
1800 | 1786 |
1801 TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultNonMigratableStream) { | 1787 TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultNonMigratableStream) { |
1802 InitializeConnectionMigrationTest( | 1788 InitializeConnectionMigrationTest( |
1803 {kDefaultNetworkForTests, kNewNetworkForTests}); | 1789 {kDefaultNetworkForTests, kNewNetworkForTests}); |
1804 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | 1790 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
1805 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 1791 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() | 2046 scoped_mock_network_change_notifier_->mock_network_change_notifier() |
2061 ->NotifyNetworkDisconnected(kDefaultNetworkForTests); | 2047 ->NotifyNetworkDisconnected(kDefaultNetworkForTests); |
2062 | 2048 |
2063 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | 2049 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
2064 EXPECT_FALSE(HasActiveSession(host_port_pair_)); | 2050 EXPECT_FALSE(HasActiveSession(host_port_pair_)); |
2065 | 2051 |
2066 EXPECT_TRUE(socket_data.AllReadDataConsumed()); | 2052 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
2067 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); | 2053 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
2068 } | 2054 } |
2069 | 2055 |
2056 TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedPauseBeforeConnected) { | |
2057 InitializeConnectionMigrationTest({kDefaultNetworkForTests}); | |
2058 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | |
2059 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | |
2060 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | |
2061 | |
2062 // Use the test task runner, to force the migration alarm timeout later. | |
2063 // QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get()); | |
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 | |
2168 // @@@ add a test to (i) cause write error with no new network, | |
2169 // causing pause, (ii) new network gets added, but no new network | |
2170 // notification, (iii) onnetworkdisconected issued, causing migration | |
2171 // to finish, (iv) onnetworkconnected issued, which is a nop. | |
2172 | |
2070 TEST_P(QuicStreamFactoryTest, MigrateSessionEarly) { | 2173 TEST_P(QuicStreamFactoryTest, MigrateSessionEarly) { |
2071 InitializeConnectionMigrationTest( | 2174 InitializeConnectionMigrationTest( |
2072 {kDefaultNetworkForTests, kNewNetworkForTests}); | 2175 {kDefaultNetworkForTests, kNewNetworkForTests}); |
2073 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | 2176 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
2074 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 2177 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
2075 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 2178 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
2076 | 2179 |
2077 MockQuicData socket_data; | 2180 MockQuicData socket_data; |
2078 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); | 2181 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
2079 socket_data.AddWrite( | 2182 socket_data.AddWrite( |
(...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2545 TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorAsync) { | 2648 TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorAsync) { |
2546 TestMigrationOnWriteError(ASYNC); | 2649 TestMigrationOnWriteError(ASYNC); |
2547 } | 2650 } |
2548 | 2651 |
2549 void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorNoNewNetwork( | 2652 void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorNoNewNetwork( |
2550 IoMode write_error_mode) { | 2653 IoMode write_error_mode) { |
2551 InitializeConnectionMigrationTest({kDefaultNetworkForTests}); | 2654 InitializeConnectionMigrationTest({kDefaultNetworkForTests}); |
2552 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | 2655 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
2553 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 2656 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
2554 | 2657 |
2658 // Use the test task runner, to force the migration alarm timeout later. | |
2659 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get()); | |
2660 | |
2555 MockQuicData socket_data; | 2661 MockQuicData socket_data; |
2556 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); | 2662 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
2557 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE); | 2663 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE); |
2558 socket_data.AddSocketDataToFactory(&socket_factory_); | 2664 socket_data.AddSocketDataToFactory(&socket_factory_); |
2559 | 2665 |
2560 // Create request and QuicHttpStream. | 2666 // Create request and QuicHttpStream. |
2561 QuicStreamRequest request(factory_.get()); | 2667 QuicStreamRequest request(factory_.get()); |
2562 EXPECT_EQ(ERR_IO_PENDING, | 2668 EXPECT_EQ(ERR_IO_PENDING, |
2563 request.Request(host_port_pair_, privacy_mode_, | 2669 request.Request(host_port_pair_, privacy_mode_, |
2564 /*cert_verify_flags=*/0, url_, "GET", net_log_, | 2670 /*cert_verify_flags=*/0, url_, "GET", net_log_, |
2565 callback_.callback())); | 2671 callback_.callback())); |
2566 EXPECT_EQ(OK, callback_.WaitForResult()); | 2672 EXPECT_EQ(OK, callback_.WaitForResult()); |
2567 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); | 2673 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); |
2568 EXPECT_TRUE(stream.get()); | 2674 EXPECT_TRUE(stream.get()); |
2569 | 2675 |
2570 // Cause QUIC stream to be created. | 2676 // Cause QUIC stream to be created. |
2571 HttpRequestInfo request_info; | 2677 HttpRequestInfo request_info; |
2572 request_info.method = "GET"; | 2678 request_info.method = "GET"; |
2573 request_info.url = GURL("https://www.example.org/"); | 2679 request_info.url = GURL("https://www.example.org/"); |
2574 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, | 2680 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, |
2575 net_log_, CompletionCallback())); | 2681 net_log_, CompletionCallback())); |
2576 | 2682 |
2577 // Ensure that session is alive and active. | 2683 // Ensure that session is alive and active. |
2578 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); | 2684 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); |
2579 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | 2685 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
2580 EXPECT_TRUE(HasActiveSession(host_port_pair_)); | 2686 EXPECT_TRUE(HasActiveSession(host_port_pair_)); |
2581 | 2687 |
2582 // Send GET request on stream. This should cause a write error, which triggers | 2688 // Send GET request on stream. This causes a write error, which triggers |
2583 // a connection migration attempt. | 2689 // a connection migration attempt. Since there are no networks |
2690 // to migrate to, this causes the session to wait for a new network. | |
2584 HttpResponseInfo response; | 2691 HttpResponseInfo response; |
2585 HttpRequestHeaders request_headers; | 2692 HttpRequestHeaders request_headers; |
2586 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response, | 2693 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response, |
2587 callback_.callback())); | 2694 callback_.callback())); |
2588 // Run message loop to execute migration attempt. | 2695 |
2589 base::RunLoop().RunUntilIdle(); | 2696 // Complete any pending writes. |
2590 // Migration fails, and session is closed and deleted. | 2697 if (write_error_mode == ASYNC) |
2698 runner_->RunNextTask(); | |
2699 | |
2700 // Migration has not yet failed. The session should be alive and active. | |
2701 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | |
2702 EXPECT_TRUE(HasActiveSession(host_port_pair_)); | |
2703 EXPECT_EQ(1u, session->GetNumActiveStreams()); | |
2704 EXPECT_TRUE(session->connection()->writer()->IsWriteBlocked()); | |
2705 | |
2706 // The migration will not fail until the migration alarm timeout. | |
2707 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | |
2708 EXPECT_TRUE(HasActiveSession(host_port_pair_)); | |
2709 EXPECT_EQ(1u, session->GetNumActiveStreams()); | |
2710 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback())); | |
2711 | |
2712 // Force migration alarm timeout to run. | |
2713 RunTestLoopUntilIdle(); | |
2714 | |
2715 // The connection should be closed. A request for response headers | |
2716 // should fail. | |
2591 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | 2717 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
2592 EXPECT_FALSE(HasActiveSession(host_port_pair_)); | 2718 EXPECT_FALSE(HasActiveSession(host_port_pair_)); |
2719 EXPECT_EQ(ERR_NETWORK_CHANGED, callback_.WaitForResult()); | |
2720 EXPECT_EQ(ERR_NETWORK_CHANGED, | |
2721 stream->ReadResponseHeaders(callback_.callback())); | |
2593 | 2722 |
2594 EXPECT_TRUE(socket_data.AllReadDataConsumed()); | 2723 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
2595 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); | 2724 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
2596 } | 2725 } |
2597 | 2726 |
2598 TEST_P(QuicStreamFactoryTest, | 2727 TEST_P(QuicStreamFactoryTest, |
2599 MigrateSessionOnWriteErrorNoNewNetworkSynchronous) { | 2728 MigrateSessionOnWriteErrorNoNewNetworkSynchronous) { |
2600 TestMigrationOnWriteErrorNoNewNetwork(SYNCHRONOUS); | 2729 TestMigrationOnWriteErrorNoNewNetwork(SYNCHRONOUS); |
2601 } | 2730 } |
2602 | 2731 |
2603 TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorNoNewNetworkAsync) { | 2732 TEST_P(QuicStreamFactoryTest, |
2733 DISABLED_MigrateSessionOnWriteErrorNoNewNetworkAsync) { | |
Ryan Hamilton
2016/09/13 00:33:18
Let's get this test working.
Jana
2016/09/13 01:12:19
Done.
| |
2604 TestMigrationOnWriteErrorNoNewNetwork(ASYNC); | 2734 TestMigrationOnWriteErrorNoNewNetwork(ASYNC); |
2605 } | 2735 } |
2606 | 2736 |
2607 void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorNonMigratableStream( | 2737 void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorNonMigratableStream( |
2608 IoMode write_error_mode) { | 2738 IoMode write_error_mode) { |
2609 DVLOG(1) << "Mode: " | 2739 DVLOG(1) << "Mode: " |
2610 << ((write_error_mode == SYNCHRONOUS) ? "SYNCHRONOUS" : "ASYNC"); | 2740 << ((write_error_mode == SYNCHRONOUS) ? "SYNCHRONOUS" : "ASYNC"); |
2611 InitializeConnectionMigrationTest( | 2741 InitializeConnectionMigrationTest( |
2612 {kDefaultNetworkForTests, kNewNetworkForTests}); | 2742 {kDefaultNetworkForTests, kNewNetworkForTests}); |
2613 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | 2743 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
(...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3004 TEST_P(QuicStreamFactoryTest, | 3134 TEST_P(QuicStreamFactoryTest, |
3005 MigrateSessionOnNetworkDisconnectedWithWriteErrorQueued) { | 3135 MigrateSessionOnNetworkDisconnectedWithWriteErrorQueued) { |
3006 TestMigrationOnNotificationWithWriteErrorQueued(/*disconnected=*/true); | 3136 TestMigrationOnNotificationWithWriteErrorQueued(/*disconnected=*/true); |
3007 } | 3137 } |
3008 | 3138 |
3009 TEST_P(QuicStreamFactoryTest, | 3139 TEST_P(QuicStreamFactoryTest, |
3010 MigrateSessionOnNetworkMadeDefaultWithWriteErrorQueued) { | 3140 MigrateSessionOnNetworkMadeDefaultWithWriteErrorQueued) { |
3011 TestMigrationOnNotificationWithWriteErrorQueued(/*disconnected=*/true); | 3141 TestMigrationOnNotificationWithWriteErrorQueued(/*disconnected=*/true); |
3012 } | 3142 } |
3013 | 3143 |
3144 void QuicStreamFactoryTestBase::MigrateSessionOnWriteErrorPauseBeforeConnected( | |
3145 IoMode write_error_mode) { | |
3146 InitializeConnectionMigrationTest({kDefaultNetworkForTests}); | |
3147 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | |
3148 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | |
3149 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | |
3150 | |
3151 MockQuicData socket_data; | |
3152 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); | |
3153 socket_data.AddWrite(SYNCHRONOUS, ERR_FAILED); | |
3154 socket_data.AddSocketDataToFactory(&socket_factory_); | |
3155 | |
3156 // Create request and QuicHttpStream. | |
3157 QuicStreamRequest request(factory_.get()); | |
3158 EXPECT_EQ(ERR_IO_PENDING, | |
3159 request.Request(host_port_pair_, privacy_mode_, | |
3160 /*cert_verify_flags=*/0, url_, "GET", net_log_, | |
3161 callback_.callback())); | |
3162 EXPECT_EQ(OK, callback_.WaitForResult()); | |
3163 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); | |
3164 EXPECT_TRUE(stream.get()); | |
3165 | |
3166 // Cause QUIC stream to be created. | |
3167 HttpRequestInfo request_info; | |
3168 request_info.method = "GET"; | |
3169 request_info.url = GURL("https://www.example.org/"); | |
3170 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, | |
3171 net_log_, CompletionCallback())); | |
3172 | |
3173 // Ensure that session is alive and active. | |
3174 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); | |
3175 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | |
3176 EXPECT_TRUE(HasActiveSession(host_port_pair_)); | |
3177 | |
3178 // Send GET request on stream. This should cause a write error, which triggers | |
3179 // a connection migration attempt. | |
3180 HttpResponseInfo response; | |
3181 HttpRequestHeaders request_headers; | |
3182 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response, | |
3183 callback_.callback())); | |
3184 | |
3185 // Run the message loop so that data queued in the new socket is read by the | |
3186 // packet reader. | |
3187 base::RunLoop().RunUntilIdle(); | |
3188 | |
3189 // In this particular code path, the network will not yet be marked | |
3190 // as going away and the session will still be alive. | |
3191 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | |
3192 EXPECT_TRUE(HasActiveSession(host_port_pair_)); | |
3193 EXPECT_EQ(1u, session->GetNumActiveStreams()); | |
3194 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback())); | |
3195 | |
3196 // On a DISCONNECTED notification, nothing happens. | |
3197 scoped_mock_network_change_notifier_->mock_network_change_notifier() | |
3198 ->NotifyNetworkDisconnected(kDefaultNetworkForTests); | |
3199 | |
3200 // Set up second socket data provider that is used after | |
3201 // migration. The request is rewritten to this new socket, and the | |
3202 // response to the request is read on this new socket. | |
3203 MockQuicData socket_data1; | |
3204 socket_data1.AddWrite( | |
3205 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true)); | |
3206 socket_data1.AddRead( | |
3207 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false)); | |
3208 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); | |
3209 socket_data1.AddWrite(client_maker_.MakeAckAndRstPacket( | |
3210 2, false, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 1, 1, 1, true)); | |
3211 socket_data1.AddSocketDataToFactory(&socket_factory_); | |
3212 | |
3213 scoped_mock_network_change_notifier_->mock_network_change_notifier() | |
3214 ->SetConnectedNetworksList({kNewNetworkForTests}); | |
3215 scoped_mock_network_change_notifier_->mock_network_change_notifier() | |
3216 ->NotifyNetworkConnected(kNewNetworkForTests); | |
3217 | |
3218 // The session should now be marked as going away. Ensure that | |
3219 // while it is still alive, it is no longer active. | |
3220 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | |
3221 EXPECT_FALSE(HasActiveSession(host_port_pair_)); | |
3222 EXPECT_EQ(1u, session->GetNumActiveStreams()); | |
3223 | |
3224 // This is the callback for the response headers that returned | |
3225 // pending previously, because no result was available. Check that | |
3226 // the result is now available due to the successful migration. | |
3227 EXPECT_THAT(callback_.WaitForResult(), IsOk()); | |
3228 EXPECT_EQ(200, response.headers->response_code()); | |
3229 | |
3230 // Create a new request for the same destination and verify that a | |
3231 // new session is created. | |
3232 MockQuicData socket_data2; | |
3233 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); | |
3234 socket_data2.AddSocketDataToFactory(&socket_factory_); | |
3235 | |
3236 QuicStreamRequest request2(factory_.get()); | |
3237 EXPECT_EQ(ERR_IO_PENDING, | |
3238 request2.Request(host_port_pair_, privacy_mode_, | |
3239 /*cert_verify_flags=*/0, url_, "GET", net_log_, | |
3240 callback_.callback())); | |
3241 EXPECT_THAT(callback_.WaitForResult(), IsOk()); | |
3242 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream(); | |
3243 EXPECT_TRUE(stream2.get()); | |
3244 | |
3245 EXPECT_TRUE(HasActiveSession(host_port_pair_)); | |
3246 QuicChromiumClientSession* new_session = GetActiveSession(host_port_pair_); | |
3247 EXPECT_NE(session, new_session); | |
3248 | |
3249 stream.reset(); | |
3250 stream2.reset(); | |
3251 | |
3252 EXPECT_TRUE(socket_data.AllReadDataConsumed()); | |
3253 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); | |
3254 EXPECT_TRUE(socket_data1.AllReadDataConsumed()); | |
3255 EXPECT_TRUE(socket_data1.AllWriteDataConsumed()); | |
3256 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); | |
3257 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); | |
3258 } | |
3259 | |
3260 TEST_P(QuicStreamFactoryTest, | |
3261 MigrateSessionOnWriteErrorPauseBeforeConnectedSync) { | |
3262 MigrateSessionOnWriteErrorPauseBeforeConnected(SYNCHRONOUS); | |
3263 } | |
3264 | |
3265 TEST_P(QuicStreamFactoryTest, | |
3266 MigrateSessionOnWriteErrorPauseBeforeConnectedAsync) { | |
3267 MigrateSessionOnWriteErrorPauseBeforeConnected(ASYNC); | |
3268 } | |
3269 | |
3014 TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyToBadSocket) { | 3270 TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyToBadSocket) { |
3015 // This simulates the case where we attempt to migrate to a new | 3271 // 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. | 3272 // socket but the socket is unusable, such as an ipv4/ipv6 mismatch. |
3017 InitializeConnectionMigrationTest( | 3273 InitializeConnectionMigrationTest( |
3018 {kDefaultNetworkForTests, kNewNetworkForTests}); | 3274 {kDefaultNetworkForTests, kNewNetworkForTests}); |
3019 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | 3275 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
3020 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 3276 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
3021 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 3277 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
3022 | 3278 |
3023 MockQuicData socket_data; | 3279 MockQuicData socket_data; |
(...skipping 2485 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5509 // Clear all cached states. | 5765 // Clear all cached states. |
5510 factory_->ClearCachedStatesInCryptoConfig( | 5766 factory_->ClearCachedStatesInCryptoConfig( |
5511 base::Callback<bool(const GURL&)>()); | 5767 base::Callback<bool(const GURL&)>()); |
5512 EXPECT_TRUE(test_cases[0].state->certs().empty()); | 5768 EXPECT_TRUE(test_cases[0].state->certs().empty()); |
5513 EXPECT_TRUE(test_cases[1].state->certs().empty()); | 5769 EXPECT_TRUE(test_cases[1].state->certs().empty()); |
5514 EXPECT_TRUE(test_cases[2].state->certs().empty()); | 5770 EXPECT_TRUE(test_cases[2].state->certs().empty()); |
5515 } | 5771 } |
5516 | 5772 |
5517 } // namespace test | 5773 } // namespace test |
5518 } // namespace net | 5774 } // namespace net |
OLD | NEW |