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

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

Issue 2322423002: Disable QUIC for 5 miuntes, subject to exponential backoff, when (Closed)
Patch Set: Rebase 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 89487b0f6a22c593aca71a82c7460985c2f7a6a0..fd2d9f4035f5c5eea141748e3b63bdb7b9fe8ae0 100644
--- a/net/quic/chromium/quic_stream_factory_test.cc
+++ b/net/quic/chromium/quic_stream_factory_test.cc
@@ -3336,6 +3336,196 @@ TEST_P(QuicStreamFactoryTest, DisableQuicWhenTimeoutsWithOpenStreams) {
EXPECT_TRUE(socket_data.AllWriteDataConsumed());
}
+TEST_P(QuicStreamFactoryTest,
+ DisableQuicWhenTimeoutsWithOpenStreamsExponentialBackoff) {
+ disable_disk_cache_ = true;
+ disable_quic_on_timeout_with_open_streams_ = true;
+ Initialize();
+ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
ianswett 2016/09/14 20:10:14 Any reason you're adding the ProofVerifyDetails tw
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
+ QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
+
+ EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
+
+ 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_);
+
+ 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", "");
+
+ // Test first timeouts with open streams will disable QUIC.
+ 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_);
+
+ 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."
+ << "Will disable QUIC.";
+ session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
+ ConnectionCloseBehavior::SILENT_CLOSE);
+ EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
+
+ ASSERT_EQ(1u, runner_->GetPostedTasks().size());
+ ASSERT_EQ(clock_->NowInTicks() + base::TimeDelta::FromMinutes(5),
+ runner_->GetPostedTasks()[0].GetTimeToRun());
+ runner_->RunNextTask();
+
+ // Need to spin the loop now to ensure that
+ // QuicStreamFactory::OnSessionClosed() runs.
+ base::RunLoop run_loop;
+ run_loop.RunUntilIdle();
+
+ EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
+
+ ASSERT_TRUE(runner_->GetPostedTasks().empty());
+
+ // Create a new session which will cause a task to be posted to
+ // clear the exponential backoff.
+ QuicStreamRequest request2(factory_.get());
+ EXPECT_EQ(OK, request2.Request(host_port_pair_, privacy_mode_,
+ /*cert_verify_flags=*/0, url_, "GET", net_log_,
+ callback_.callback()));
+ QuicChromiumClientSession* session2 = GetActiveSession(host_port_pair_);
+ std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
+ EXPECT_TRUE(stream2.get());
+ HttpRequestInfo request_info2;
+ EXPECT_EQ(OK, stream2->InitializeStream(&request_info2, DEFAULT_PRIORITY,
+ net_log_, CompletionCallback()));
+
+ // Check that the clear task has been posted.
+ ASSERT_EQ(1u, runner_->GetPostedTasks().size());
+ ASSERT_EQ(clock_->NowInTicks() + base::TimeDelta::FromMinutes(5),
+ runner_->GetPostedTasks()[0].GetTimeToRun());
+
+ session2->connection()->CloseConnection(
+ QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
+ EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
+
+ ASSERT_EQ(2u, runner_->GetPostedTasks().size());
+ ASSERT_EQ(clock_->NowInTicks() + base::TimeDelta::FromMinutes(10),
+ runner_->GetPostedTasks()[1].GetTimeToRun());
+ runner_->RunNextTask();
+
+ EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
+
+ EXPECT_TRUE(socket_data.AllReadDataConsumed());
+ EXPECT_TRUE(socket_data.AllWriteDataConsumed());
+}
+
+TEST_P(QuicStreamFactoryTest,
+ DisableQuicWhenTimeoutsWithOpenStreamsExponentialBackoffReset) {
+ disable_disk_cache_ = true;
+ disable_quic_on_timeout_with_open_streams_ = true;
+ 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()));
+
+ 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_);
+
+ 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", "");
+
+ // Test first timeouts with open streams will disable QUIC.
+ 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_);
+
+ 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."
+ << "Will disable QUIC.";
+ session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
+ ConnectionCloseBehavior::SILENT_CLOSE);
+ EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
+
+ ASSERT_EQ(1u, runner_->GetPostedTasks().size());
+ ASSERT_EQ(clock_->NowInTicks() + base::TimeDelta::FromMinutes(5),
+ runner_->GetPostedTasks()[0].GetTimeToRun());
+ runner_->RunNextTask();
+
+ // Need to spin the loop now to ensure that
+ // QuicStreamFactory::OnSessionClosed() runs.
+ base::RunLoop run_loop;
+ run_loop.RunUntilIdle();
+
+ EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
+
+ ASSERT_TRUE(runner_->GetPostedTasks().empty());
+
+ // Create a new session which will cause a task to be posted to
+ // clear the exponential backoff.
+ QuicStreamRequest request2(factory_.get());
+ EXPECT_EQ(OK, request2.Request(host_port_pair_, privacy_mode_,
+ /*cert_verify_flags=*/0, url_, "GET", net_log_,
+ callback_.callback()));
+ QuicChromiumClientSession* session2 = GetActiveSession(host_port_pair_);
+ std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
+ EXPECT_TRUE(stream2.get());
+ HttpRequestInfo request_info2;
+ EXPECT_EQ(OK, stream2->InitializeStream(&request_info2, DEFAULT_PRIORITY,
+ net_log_, CompletionCallback()));
+
+ // Run the clear task and verify that the next disabling is
+ // back to the default timeout.
+ runner_->RunNextTask();
+
+ // QUIC should still be enabled.
+ EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
+
+ session2->connection()->CloseConnection(
+ QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
+ EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
+
+ ASSERT_EQ(1u, runner_->GetPostedTasks().size());
+ ASSERT_EQ(clock_->NowInTicks() + base::TimeDelta::FromMinutes(5),
+ runner_->GetPostedTasks()[0].GetTimeToRun());
+ runner_->RunNextTask();
+
+ EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
+
+ EXPECT_TRUE(socket_data.AllReadDataConsumed());
+ EXPECT_TRUE(socket_data.AllWriteDataConsumed());
+}
+
TEST_P(QuicStreamFactoryTest, EnableDelayTcpRace) {
Initialize();
ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
« net/quic/chromium/quic_stream_factory.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