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

Unified Diff: net/quic/chromium/quic_stream_factory_test.cc

Issue 2301453002: Quic use reduced PING timeout when previous connection times out with open streams (Closed)
Patch Set: address rch's comments 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 side-by-side diff with in-line comments
Download patch
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;

Powered by Google App Engine
This is Rietveld 408576698