Index: net/quic/chromium/quic_stream_factory_test.cc |
diff --git a/net/quic/chromium/quic_stream_factory_test.cc b/net/quic/chromium/quic_stream_factory_test.cc |
index 545f4ece653c767e68f84b03746577648e7ceb3e..efb09d149eb3720a96177c95fc473b97f3442889 100644 |
--- a/net/quic/chromium/quic_stream_factory_test.cc |
+++ b/net/quic/chromium/quic_stream_factory_test.cc |
@@ -2151,6 +2151,107 @@ TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedPauseBeforeConnected) { |
EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); |
} |
+TEST_P(QuicStreamFactoryTest, |
+ OnNetworkChangeDisconnectedPauseBeforeConnectedMultipleSessions) { |
+ InitializeConnectionMigrationTest({kDefaultNetworkForTests}); |
+ |
+ MockQuicData socket_data1; |
+ socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
+ socket_data1.AddWrite(ASYNC, OK); |
+ socket_data1.AddSocketDataToFactory(&socket_factory_); |
+ MockQuicData socket_data2; |
+ socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
+ |
+ socket_data2.AddWrite(ASYNC, OK); |
+ socket_data2.AddSocketDataToFactory(&socket_factory_); |
+ |
+ HostPortPair server1(kDefaultServerHostName, 443); |
+ HostPortPair server2(kServer2HostName, 443); |
+ |
+ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
+ |
+ host_resolver_.set_synchronous_mode(true); |
+ host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", ""); |
+ host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.2", ""); |
+ |
+ // Create request and QuicHttpStream to create session1. |
+ QuicStreamRequest request1(factory_.get()); |
+ EXPECT_EQ(OK, request1.Request(server1, privacy_mode_, |
+ /*cert_verify_flags=*/0, url_, "GET", net_log_, |
+ callback_.callback())); |
+ std::unique_ptr<QuicHttpStream> stream1 = request1.CreateStream(); |
+ EXPECT_TRUE(stream1.get()); |
+ |
+ // Create request and QuicHttpStream to create session2. |
+ QuicStreamRequest request2(factory_.get()); |
+ EXPECT_EQ(OK, request2.Request(server2, privacy_mode_, |
+ /*cert_verify_flags=*/0, url2_, "GET", |
+ net_log_, callback_.callback())); |
+ std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream(); |
+ EXPECT_TRUE(stream2.get()); |
+ |
+ QuicChromiumClientSession* session1 = GetActiveSession(server1); |
+ QuicChromiumClientSession* session2 = GetActiveSession(server2); |
+ EXPECT_NE(session1, session2); |
+ |
+ // Cause QUIC stream to be created and send GET so session1 has an open |
+ // stream. |
+ HttpRequestInfo request_info1; |
+ request_info1.method = "GET"; |
+ request_info1.url = url_; |
+ EXPECT_EQ(OK, stream1->InitializeStream(&request_info1, DEFAULT_PRIORITY, |
+ net_log_, CompletionCallback())); |
+ HttpResponseInfo response1; |
+ HttpRequestHeaders request_headers1; |
+ EXPECT_EQ(OK, stream1->SendRequest(request_headers1, &response1, |
+ callback_.callback())); |
+ |
+ // Cause QUIC stream to be created and send GET so session2 has an open |
+ // stream. |
+ HttpRequestInfo request_info2; |
+ request_info2.method = "GET"; |
+ request_info2.url = url_; |
+ EXPECT_EQ(OK, stream2->InitializeStream(&request_info2, DEFAULT_PRIORITY, |
+ net_log_, CompletionCallback())); |
+ HttpResponseInfo response2; |
+ HttpRequestHeaders request_headers2; |
+ EXPECT_EQ(OK, stream2->SendRequest(request_headers2, &response2, |
+ callback_.callback())); |
+ |
+ // Cause both sessions to be paused due to DISCONNECTED. |
+ scoped_mock_network_change_notifier_->mock_network_change_notifier() |
+ ->NotifyNetworkDisconnected(kDefaultNetworkForTests); |
+ |
+ // Ensure that both sessions are paused but alive. |
+ EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session1)); |
+ EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2)); |
+ |
+ // Add new sockets to use post migration. |
+ MockConnect connect_result = |
+ MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED); |
+ SequencedSocketData socket_data3(connect_result, nullptr, 0, nullptr, 0); |
+ socket_factory_.AddSocketDataProvider(&socket_data3); |
+ SequencedSocketData socket_data4(connect_result, nullptr, 0, nullptr, 0); |
+ socket_factory_.AddSocketDataProvider(&socket_data4); |
+ |
+ // Add a new network and cause migration to bad sockets, causing sessions to |
+ // close. |
+ scoped_mock_network_change_notifier_->mock_network_change_notifier() |
+ ->SetConnectedNetworksList({kNewNetworkForTests}); |
+ scoped_mock_network_change_notifier_->mock_network_change_notifier() |
+ ->NotifyNetworkConnected(kNewNetworkForTests); |
+ |
+ EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session1)); |
+ EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2)); |
+ |
+ EXPECT_TRUE(socket_data1.AllReadDataConsumed()); |
+ EXPECT_TRUE(socket_data1.AllWriteDataConsumed()); |
+ EXPECT_TRUE(socket_data2.AllReadDataConsumed()); |
+ EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); |
+} |
+ |
TEST_P(QuicStreamFactoryTest, MigrateSessionEarly) { |
InitializeConnectionMigrationTest( |
{kDefaultNetworkForTests, kNewNetworkForTests}); |