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(); |