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 0f2755ea5ab9e2fd5e1338137c068780e7c7bbea..4fa92dab8f9847b08e0b0a1fd2ade230973dfd16 100644 |
--- a/net/quic/chromium/quic_stream_factory_test.cc |
+++ b/net/quic/chromium/quic_stream_factory_test.cc |
@@ -512,8 +512,6 @@ class QuicStreamFactoryTestBase { |
ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
- crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
- |
crypto_client_stream_factory_.SetConfig(config); |
// Set up first socket data provider. |
@@ -521,16 +519,21 @@ class QuicStreamFactoryTestBase { |
SequencedSocketData socket_data1(reads1, arraysize(reads1), nullptr, 0); |
socket_factory_.AddSocketDataProvider(&socket_data1); |
- // Set up second socket data provider that is used after |
- // migration. |
- std::unique_ptr<QuicEncryptedPacket> ping( |
+ // Set up second socket data provider that is used after migration. |
+ std::unique_ptr<QuicEncryptedPacket> sendping( |
client_maker_.MakePingPacket(1, /*include_version=*/true)); |
- std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket( |
- 2, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED)); |
+ std::unique_ptr<QuicEncryptedPacket> client_rst( |
+ client_maker_.MakeAckAndRstPacket(2, false, kClientDataStreamId1, |
+ QUIC_STREAM_CANCELLED, 1, 1, 1, |
+ true)); |
MockWrite writes2[] = { |
- MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 1), |
- MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 2)}; |
- MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
+ MockWrite(SYNCHRONOUS, sendping->data(), sendping->length(), 0), |
+ MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 3)}; |
+ std::unique_ptr<QuicEncryptedPacket> recvping( |
+ client_maker_.MakePingPacket(1, /*include_version=*/false)); |
+ MockRead reads2[] = { |
+ MockRead(ASYNC, recvping->data(), recvping->length(), 1), |
+ MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)}; |
SequencedSocketData socket_data2(reads2, arraysize(reads2), writes2, |
arraysize(writes2)); |
socket_factory_.AddSocketDataProvider(&socket_data2); |
@@ -551,7 +554,6 @@ class QuicStreamFactoryTestBase { |
request_info.url = GURL("https://www.example.org/"); |
EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, |
net_log_, CompletionCallback())); |
- |
// Ensure that session is alive and active. |
QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); |
EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
@@ -829,6 +831,49 @@ TEST_P(QuicStreamFactoryTest, Pooling) { |
EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
} |
+TEST_P(QuicStreamFactoryTest, PoolingWithServerMigration) { |
+ // Set up session to migrate. |
+ host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(), |
+ "192.168.0.1", ""); |
+ IPEndPoint alt_address = IPEndPoint(IPAddress(1, 2, 3, 4), 443); |
+ QuicConfig config; |
+ config.SetAlternateServerAddressToSend(alt_address); |
+ |
+ VerifyServerMigration(config, alt_address); |
+ |
+ // Close server-migrated session. |
+ QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); |
+ session->CloseSessionOnError(0u, QUIC_NO_ERROR); |
+ |
+ // Set up server IP, socket, proof, and config for new session. |
+ HostPortPair server2(kServer2HostName, kDefaultServerPort); |
+ host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); |
+ |
+ MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
+ SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0); |
+ socket_factory_.AddSocketDataProvider(&socket_data); |
+ |
+ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
+ QuicConfig config2; |
+ crypto_client_stream_factory_.SetConfig(config2); |
+ |
+ // Create new request to cause new session creation. |
+ TestCompletionCallback callback; |
+ QuicStreamRequest request2(factory_.get()); |
+ EXPECT_EQ(ERR_IO_PENDING, |
+ request2.Request(server2, privacy_mode_, |
+ /*cert_verify_flags=*/0, url2_, "GET", net_log_, |
+ callback.callback())); |
+ EXPECT_EQ(OK, callback.WaitForResult()); |
+ std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream(); |
+ EXPECT_TRUE(stream2.get()); |
+ |
+ EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
+ EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
+ // EXPECT_EQ(GetActiveSession(host_port_pair_), GetActiveSession(server2)); |
+} |
+ |
TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) { |
disable_connection_pooling_ = true; |
Initialize(); |