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 fa60f63a0f41d96a7a7232ae955703c6ef709311..ffc43002cfc8d59d802e99fd9e1c88f4864d3cee 100644 |
--- a/net/quic/chromium/quic_stream_factory_test.cc |
+++ b/net/quic/chromium/quic_stream_factory_test.cc |
@@ -322,6 +322,7 @@ class QuicStreamFactoryTestBase { |
close_sessions_on_ip_change_(false), |
disable_quic_on_timeout_with_open_streams_(false), |
idle_connection_timeout_seconds_(kIdleConnectionTimeoutSeconds), |
+ reduced_ping_timeout_seconds_(kPingTimeoutSecs), |
packet_reader_yield_after_duration_milliseconds_( |
kQuicYieldAfterDurationMilliseconds), |
migrate_sessions_on_network_change_(false), |
@@ -358,7 +359,7 @@ class QuicStreamFactoryTestBase { |
delay_tcp_race_, /*max_server_configs_stored_in_properties*/ 0, |
close_sessions_on_ip_change_, |
disable_quic_on_timeout_with_open_streams_, |
- idle_connection_timeout_seconds_, |
+ idle_connection_timeout_seconds_, reduced_ping_timeout_seconds_, |
packet_reader_yield_after_duration_milliseconds_, |
migrate_sessions_on_network_change_, migrate_sessions_early_, |
allow_server_migration_, force_hol_blocking_, race_cert_verification_, |
@@ -617,6 +618,7 @@ class QuicStreamFactoryTestBase { |
bool close_sessions_on_ip_change_; |
bool disable_quic_on_timeout_with_open_streams_; |
int idle_connection_timeout_seconds_; |
+ int reduced_ping_timeout_seconds_; |
int packet_reader_yield_after_duration_milliseconds_; |
bool migrate_sessions_on_network_change_; |
bool migrate_sessions_early_; |
@@ -3606,6 +3608,117 @@ TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfTwo) { |
EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); |
} |
+TEST_P(QuicStreamFactoryTest, ReducePingTimeoutOnConnectionTimeOutOpenStreams) { |
+ reduced_ping_timeout_seconds_ = 10; |
+ disable_disk_cache_ = true; |
+ threshold_timeouts_with_open_streams_ = 2; |
+ Initialize(); |
+ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
+ |
+ QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get()); |
+ EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), |
+ host_port_pair_.port())); |
+ EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections( |
+ factory_.get(), host_port_pair_.port())); |
+ |
+ MockQuicData socket_data; |
+ socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
+ socket_data.AddSocketDataToFactory(&socket_factory_); |
+ |
+ MockQuicData socket_data2; |
+ socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
+ socket_data2.AddSocketDataToFactory(&socket_factory_); |
+ |
+ HostPortPair server2(kServer2HostName, kDefaultServerPort); |
+ |
+ crypto_client_stream_factory_.set_handshake_mode( |
+ MockCryptoClientStream::CONFIRM_HANDSHAKE); |
+ host_resolver_.set_synchronous_mode(true); |
+ host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(), |
+ "192.168.0.1", ""); |
+ host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); |
+ |
+ // Quic should use default PING timeout when no previous connection times out |
+ // with open stream. |
+ EXPECT_EQ(QuicTime::Delta::FromSeconds(kPingTimeoutSecs), |
+ QuicStreamFactoryPeer::GetPingTimeout(factory_.get())); |
+ QuicStreamRequest request(factory_.get()); |
+ EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_, |
+ /*cert_verify_flags=*/0, url_, "GET", net_log_, |
+ callback_.callback())); |
+ |
+ QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); |
+ EXPECT_EQ(QuicTime::Delta::FromSeconds(kPingTimeoutSecs), |
+ session->connection()->ping_timeout()); |
+ |
+ std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); |
+ EXPECT_TRUE(stream.get()); |
+ HttpRequestInfo request_info; |
+ EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, |
+ net_log_, CompletionCallback())); |
+ |
+ DVLOG(1) |
+ << "Created 1st session and initialized a stream. Now trigger timeout"; |
+ session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test", |
+ ConnectionCloseBehavior::SILENT_CLOSE); |
+ // Need to spin the loop now to ensure that |
+ // QuicStreamFactory::OnSessionClosed() runs. |
+ base::RunLoop run_loop; |
+ run_loop.RunUntilIdle(); |
+ |
+ EXPECT_EQ( |
+ 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get())); |
+ EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), |
+ host_port_pair_.port())); |
+ |
+ // The first connection times out with open stream, QUIC should reduce initial |
+ // PING time for subsequent connections. |
+ EXPECT_EQ(QuicTime::Delta::FromSeconds(10), |
+ QuicStreamFactoryPeer::GetPingTimeout(factory_.get())); |
+ |
+ // Test two-in-a-row timeouts with open streams. |
+ DVLOG(1) << "Create 2nd session and timeout with open stream"; |
+ TestCompletionCallback callback2; |
+ QuicStreamRequest request2(factory_.get()); |
+ EXPECT_EQ(OK, request2.Request(server2, privacy_mode_, |
+ /*cert_verify_flags=*/0, url2_, "GET", |
+ net_log_, callback2.callback())); |
+ QuicChromiumClientSession* session2 = GetActiveSession(server2); |
+ EXPECT_EQ(QuicTime::Delta::FromSeconds(10), |
+ session2->connection()->ping_timeout()); |
+ |
+ std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream(); |
+ EXPECT_TRUE(stream2.get()); |
+ EXPECT_EQ(OK, stream2->InitializeStream(&request_info, DEFAULT_PRIORITY, |
+ net_log_, CompletionCallback())); |
+ session2->connection()->CloseConnection( |
+ QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE); |
+ // Need to spin the loop now to ensure that |
+ // QuicStreamFactory::OnSessionClosed() runs. |
+ base::RunLoop run_loop2; |
+ run_loop2.RunUntilIdle(); |
+ EXPECT_EQ( |
+ 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get())); |
+ EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), |
+ host_port_pair_.port())); |
+ EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS, |
+ factory_->QuicDisabledReason(host_port_pair_.port())); |
+ |
+ // Verify that QUIC is un-disabled after a TCP job fails. |
+ factory_->OnTcpJobCompleted(/*succeeded=*/false); |
+ EXPECT_EQ( |
+ 0, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get())); |
+ EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), |
+ host_port_pair_.port())); |
+ |
+ EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
+ EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
+ EXPECT_TRUE(socket_data2.AllReadDataConsumed()); |
+ EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); |
+} |
+ |
TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfThree) { |
disable_disk_cache_ = true; |
threshold_public_resets_post_handshake_ = 2; |