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

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: sync 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)
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
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
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
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
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
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
OLDNEW
« net/quic/chromium/quic_chromium_client_session.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