| 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 2ca8dbe9f779857174a7f32dec655cf4b8cc3dba..89487b0f6a22c593aca71a82c7460985c2f7a6a0 100644
|
| --- a/net/quic/chromium/quic_stream_factory_test.cc
|
| +++ b/net/quic/chromium/quic_stream_factory_test.cc
|
| @@ -90,8 +90,6 @@ enum DestinationType {
|
|
|
| const char kDefaultServerHostName[] = "www.example.org";
|
| const char kServer2HostName[] = "mail.example.org";
|
| -const char kServer3HostName[] = "docs.example.org";
|
| -const char kServer4HostName[] = "images.example.org";
|
| const char kDifferentHostname[] = "different.example.com";
|
| const int kDefaultServerPort = 443;
|
| const char kDefaultUrl[] = "https://www.example.org/";
|
| @@ -249,11 +247,6 @@ class QuicStreamFactoryTestBase {
|
| enable_non_blocking_io_(true),
|
| disable_disk_cache_(false),
|
| prefer_aes_(false),
|
| - max_number_of_lossy_connections_(0),
|
| - packet_loss_threshold_(1.0f),
|
| - max_disabled_reasons_(3),
|
| - threshold_timeouts_with_open_streams_(2),
|
| - threshold_public_resets_post_handshake_(2),
|
| receive_buffer_size_(0),
|
| delay_tcp_race_(true),
|
| close_sessions_on_ip_change_(false),
|
| @@ -290,10 +283,8 @@ class QuicStreamFactoryTestBase {
|
| enable_port_selection_, always_require_handshake_confirmation_,
|
| disable_connection_pooling_, load_server_info_timeout_srtt_multiplier_,
|
| enable_connection_racing_, enable_non_blocking_io_, disable_disk_cache_,
|
| - prefer_aes_, max_number_of_lossy_connections_, packet_loss_threshold_,
|
| - max_disabled_reasons_, threshold_timeouts_with_open_streams_,
|
| - threshold_public_resets_post_handshake_, receive_buffer_size_,
|
| - delay_tcp_race_, /*max_server_configs_stored_in_properties*/ 0,
|
| + prefer_aes_, receive_buffer_size_, 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_, reduced_ping_timeout_seconds_,
|
| @@ -545,11 +536,6 @@ class QuicStreamFactoryTestBase {
|
| bool enable_non_blocking_io_;
|
| bool disable_disk_cache_;
|
| bool prefer_aes_;
|
| - int max_number_of_lossy_connections_;
|
| - double packet_loss_threshold_;
|
| - int max_disabled_reasons_;
|
| - int threshold_timeouts_with_open_streams_;
|
| - int threshold_public_resets_post_handshake_;
|
| int receive_buffer_size_;
|
| bool delay_tcp_race_;
|
| bool close_sessions_on_ip_change_;
|
| @@ -3200,591 +3186,16 @@ TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) {
|
| EXPECT_TRUE(socket_data.AllWriteDataConsumed());
|
| }
|
|
|
| -TEST_P(QuicStreamFactoryTest, BadPacketLoss) {
|
| - disable_disk_cache_ = false;
|
| - max_number_of_lossy_connections_ = 2;
|
| - Initialize();
|
| - ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
|
| - crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
|
| - crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
|
| - 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.AddSocketDataToFactory(&socket_factory_);
|
| -
|
| - MockQuicData socket_data3;
|
| - socket_data3.AddSocketDataToFactory(&socket_factory_);
|
| -
|
| - MockQuicData socket_data4;
|
| - socket_data4.AddSocketDataToFactory(&socket_factory_);
|
| -
|
| - HostPortPair server2(kServer2HostName, kDefaultServerPort);
|
| - HostPortPair server3(kServer3HostName, kDefaultServerPort);
|
| - HostPortPair server4(kServer4HostName, kDefaultServerPort);
|
| -
|
| - crypto_client_stream_factory_.set_handshake_mode(
|
| - MockCryptoClientStream::ZERO_RTT);
|
| - 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", "");
|
| - host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
|
| - host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
|
| -
|
| - 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_);
|
| -
|
| - DVLOG(1) << "Create 1st session and test packet loss";
|
| -
|
| - // Set packet_loss_rate to a lower value than packet_loss_threshold.
|
| - EXPECT_FALSE(
|
| - factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/0.9f));
|
| - EXPECT_TRUE(session->connection()->connected());
|
| - EXPECT_TRUE(HasActiveSession(host_port_pair_));
|
| - EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
|
| - host_port_pair_.port()));
|
| - EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
|
| - factory_.get(), host_port_pair_.port()));
|
| -
|
| - // Set packet_loss_rate to a higher value than packet_loss_threshold only once
|
| - // and that shouldn't close the session and it shouldn't disable QUIC.
|
| - EXPECT_FALSE(
|
| - factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/1.0f));
|
| - EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
|
| - factory_.get(), host_port_pair_.port()));
|
| - EXPECT_TRUE(session->connection()->connected());
|
| - EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
|
| - host_port_pair_.port()));
|
| - EXPECT_TRUE(HasActiveSession(host_port_pair_));
|
| -
|
| - // Test N-in-a-row high packet loss connections.
|
| -
|
| - DVLOG(1) << "Create 2nd session and test packet loss";
|
| -
|
| - 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);
|
| -
|
| - // If there is no packet loss during handshake confirmation, number of lossy
|
| - // connections for the port should be 0.
|
| - EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
|
| - factory_.get(), server2.port()));
|
| - EXPECT_FALSE(
|
| - factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/0.9f));
|
| - EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
|
| - factory_.get(), server2.port()));
|
| - EXPECT_FALSE(
|
| - QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
|
| -
|
| - // Set packet_loss_rate to a higher value than packet_loss_threshold only once
|
| - // and that shouldn't close the session and it shouldn't disable QUIC.
|
| - EXPECT_FALSE(
|
| - factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/1.0f));
|
| - EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
|
| - factory_.get(), server2.port()));
|
| - EXPECT_TRUE(session2->connection()->connected());
|
| - EXPECT_FALSE(
|
| - QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
|
| - EXPECT_TRUE(HasActiveSession(server2));
|
| -
|
| - DVLOG(1) << "Create 3rd session which also has packet loss";
|
| -
|
| - TestCompletionCallback callback3;
|
| - QuicStreamRequest request3(factory_.get());
|
| - EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
|
| - /*cert_verify_flags=*/0, url3_, "GET",
|
| - net_log_, callback3.callback()));
|
| - QuicChromiumClientSession* session3 = GetActiveSession(server3);
|
| -
|
| - DVLOG(1) << "Create 4th session with packet loss and test IsQuicDisabled()";
|
| - TestCompletionCallback callback4;
|
| - QuicStreamRequest request4(factory_.get());
|
| - EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
|
| - /*cert_verify_flags=*/0, url4_, "GET",
|
| - net_log_, callback4.callback()));
|
| - QuicChromiumClientSession* session4 = GetActiveSession(server4);
|
| -
|
| - // Set packet_loss_rate to higher value than packet_loss_threshold 2nd time in
|
| - // a row and that should close the session and disable QUIC.
|
| - EXPECT_TRUE(
|
| - factory_->OnHandshakeConfirmed(session3, /*packet_loss_rate=*/1.0f));
|
| - EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
|
| - factory_.get(), server3.port()));
|
| - EXPECT_FALSE(session3->connection()->connected());
|
| - EXPECT_TRUE(
|
| - QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server3.port()));
|
| - EXPECT_FALSE(HasActiveSession(server3));
|
| -
|
| - // Set packet_loss_rate to higher value than packet_loss_threshold 3rd time in
|
| - // a row and IsQuicDisabled() should close the session.
|
| - EXPECT_TRUE(
|
| - factory_->OnHandshakeConfirmed(session4, /*packet_loss_rate=*/1.0f));
|
| - EXPECT_EQ(3, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
|
| - factory_.get(), server4.port()));
|
| - EXPECT_FALSE(session4->connection()->connected());
|
| - EXPECT_TRUE(
|
| - QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server4.port()));
|
| - EXPECT_FALSE(HasActiveSession(server4));
|
| -
|
| - std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
|
| - EXPECT_TRUE(stream.get());
|
| - std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
|
| - EXPECT_TRUE(stream2.get());
|
| - std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
|
| - EXPECT_TRUE(stream3.get());
|
| - std::unique_ptr<QuicHttpStream> stream4 = request4.CreateStream();
|
| - EXPECT_TRUE(stream4.get());
|
| - EXPECT_TRUE(socket_data.AllReadDataConsumed());
|
| - EXPECT_TRUE(socket_data.AllWriteDataConsumed());
|
| - EXPECT_TRUE(socket_data2.AllReadDataConsumed());
|
| - EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
|
| - EXPECT_TRUE(socket_data3.AllReadDataConsumed());
|
| - EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
|
| - EXPECT_TRUE(socket_data4.AllReadDataConsumed());
|
| - EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfTwo) {
|
| - disable_disk_cache_ = false;
|
| - threshold_public_resets_post_handshake_ = 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", "");
|
| -
|
| - 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_);
|
| -
|
| - DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
|
| - session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "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::GetNumPublicResetsPostHandshake(
|
| - factory_.get()));
|
| - EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
|
| - host_port_pair_.port()));
|
| -
|
| - // Test two-in-a-row public reset post handshakes..
|
| - DVLOG(1) << "Create 2nd session and trigger public reset post handshake";
|
| - 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);
|
| -
|
| - session2->connection()->CloseConnection(
|
| - QUIC_PUBLIC_RESET, "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::GetNumPublicResetsPostHandshake(
|
| - factory_.get()));
|
| - EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
|
| - host_port_pair_.port()));
|
| - EXPECT_EQ(
|
| - QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
|
| - factory_->QuicDisabledReason(host_port_pair_.port()));
|
| -
|
| - std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
|
| - EXPECT_FALSE(stream.get()); // Session is already closed.
|
| - std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
|
| - EXPECT_FALSE(stream2.get()); // Session is already closed.
|
| - EXPECT_TRUE(socket_data.AllReadDataConsumed());
|
| - EXPECT_TRUE(socket_data.AllWriteDataConsumed());
|
| - EXPECT_TRUE(socket_data2.AllReadDataConsumed());
|
| - EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfTwo) {
|
| - 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", "");
|
| -
|
| - 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";
|
| - 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()));
|
| -
|
| - // 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);
|
| -
|
| - 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, 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;
|
| - Initialize();
|
| - ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
|
| - crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
|
| - crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
|
| - crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
|
| -
|
| - 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_);
|
| -
|
| - MockQuicData socket_data3;
|
| - socket_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
|
| - socket_data3.AddSocketDataToFactory(&socket_factory_);
|
| -
|
| - HostPortPair server2(kServer2HostName, kDefaultServerPort);
|
| - HostPortPair server3(kServer3HostName, 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", "");
|
| - host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
|
| -
|
| - // Test first and third out of three public reset post handshakes.
|
| - 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_);
|
| -
|
| - DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
|
| - session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "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::GetNumPublicResetsPostHandshake(
|
| - factory_.get()));
|
| - EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
|
| - host_port_pair_.port()));
|
| -
|
| - DVLOG(1) << "Create 2nd session without disable trigger";
|
| - 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);
|
| -
|
| - session2->connection()->CloseConnection(
|
| - QUIC_NO_ERROR, "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(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
|
| - factory_.get()));
|
| - EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
|
| - host_port_pair_.port()));
|
| -
|
| - DVLOG(1) << "Create 3rd session with public reset post handshake,"
|
| - << " will disable QUIC";
|
| - TestCompletionCallback callback3;
|
| - QuicStreamRequest request3(factory_.get());
|
| - EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
|
| - /*cert_verify_flags=*/0, url3_, "GET",
|
| - net_log_, callback3.callback()));
|
| - QuicChromiumClientSession* session3 = GetActiveSession(server3);
|
| -
|
| - session3->connection()->CloseConnection(
|
| - QUIC_PUBLIC_RESET, "test", ConnectionCloseBehavior::SILENT_CLOSE);
|
| - // Need to spin the loop now to ensure that
|
| - // QuicStreamFactory::OnSessionClosed() runs.
|
| - base::RunLoop run_loop3;
|
| - run_loop3.RunUntilIdle();
|
| - EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
|
| - factory_.get()));
|
| - EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
|
| - host_port_pair_.port()));
|
| - EXPECT_EQ(
|
| - QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
|
| - factory_->QuicDisabledReason(host_port_pair_.port()));
|
| -
|
| - std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
|
| - EXPECT_FALSE(stream.get()); // Session is already closed.
|
| - std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
|
| - EXPECT_FALSE(stream2.get()); // Session is already closed.
|
| - std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
|
| - EXPECT_FALSE(stream3.get()); // Session is already closed.
|
| -
|
| - EXPECT_TRUE(socket_data.AllReadDataConsumed());
|
| - EXPECT_TRUE(socket_data.AllWriteDataConsumed());
|
| - EXPECT_TRUE(socket_data2.AllReadDataConsumed());
|
| - EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
|
| - EXPECT_TRUE(socket_data3.AllReadDataConsumed());
|
| - EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfThree) {
|
| +TEST_P(QuicStreamFactoryTest, ReducePingTimeoutOnConnectionTimeOutOpenStreams) {
|
| + reduced_ping_timeout_seconds_ = 10;
|
| disable_disk_cache_ = true;
|
| - threshold_public_resets_post_handshake_ = 2;
|
| Initialize();
|
| ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
|
| crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
|
| 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()));
|
| + QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
|
| + EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
|
|
|
| MockQuicData socket_data;
|
| socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
|
| @@ -3794,12 +3205,7 @@ TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfThree) {
|
| socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
|
| socket_data2.AddSocketDataToFactory(&socket_factory_);
|
|
|
| - MockQuicData socket_data3;
|
| - socket_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
|
| - socket_data3.AddSocketDataToFactory(&socket_factory_);
|
| -
|
| HostPortPair server2(kServer2HostName, kDefaultServerPort);
|
| - HostPortPair server3(kServer3HostName, kDefaultServerPort);
|
|
|
| crypto_client_stream_factory_.set_handshake_mode(
|
| MockCryptoClientStream::CONFIRM_HANDSHAKE);
|
| @@ -3807,15 +3213,19 @@ TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfThree) {
|
| host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
|
| "192.168.0.1", "");
|
| host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
|
| - host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
|
|
|
| - // Test first and third out of three timeouts with open streams.
|
| + // 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());
|
| @@ -3832,74 +3242,40 @@ TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfThree) {
|
| base::RunLoop run_loop;
|
| run_loop.RunUntilIdle();
|
|
|
| - EXPECT_EQ(
|
| - 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
|
| - EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
|
| - host_port_pair_.port()));
|
| + EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
|
| +
|
| + // 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 without timeout";
|
| + 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_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
|
| + 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(
|
| - 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
|
| - EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
|
| - host_port_pair_.port()));
|
| -
|
| - DVLOG(1) << "Create 3rd session with timeout with open streams,"
|
| - << " will disable QUIC";
|
| -
|
| - TestCompletionCallback callback3;
|
| - QuicStreamRequest request3(factory_.get());
|
| - EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
|
| - /*cert_verify_flags=*/0, url3_, "GET",
|
| - net_log_, callback3.callback()));
|
| - QuicChromiumClientSession* session3 = GetActiveSession(server3);
|
| -
|
| - std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
|
| - EXPECT_TRUE(stream3.get());
|
| - EXPECT_EQ(OK, stream3->InitializeStream(&request_info, DEFAULT_PRIORITY,
|
| - net_log_, CompletionCallback()));
|
| - session3->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_loop3;
|
| - run_loop3.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()));
|
| -
|
| - std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
|
| - EXPECT_FALSE(stream2.get()); // Session is already closed.
|
| -
|
| - // Verify that QUIC is un-disabled after a network change.
|
| - factory_->OnIPAddressChanged();
|
| - EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
|
| - host_port_pair_.port()));
|
| - EXPECT_EQ(
|
| - 0, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
|
| + EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
|
|
|
| EXPECT_TRUE(socket_data.AllReadDataConsumed());
|
| EXPECT_TRUE(socket_data.AllWriteDataConsumed());
|
| EXPECT_TRUE(socket_data2.AllReadDataConsumed());
|
| EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
|
| - EXPECT_TRUE(socket_data3.AllReadDataConsumed());
|
| - EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
|
| }
|
|
|
| TEST_P(QuicStreamFactoryTest, DisableQuicWhenTimeoutsWithOpenStreams) {
|
| @@ -3910,10 +3286,7 @@ TEST_P(QuicStreamFactoryTest, DisableQuicWhenTimeoutsWithOpenStreams) {
|
| 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()));
|
| + EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
|
|
|
| MockQuicData socket_data;
|
| socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
|
| @@ -3949,318 +3322,18 @@ TEST_P(QuicStreamFactoryTest, DisableQuicWhenTimeoutsWithOpenStreams) {
|
| base::RunLoop run_loop;
|
| run_loop.RunUntilIdle();
|
|
|
| - EXPECT_EQ(
|
| - 1, 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()));
|
| + EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
|
|
|
| // Verify that QUIC is fully disabled after a TCP job succeeds.
|
| factory_->OnTcpJobCompleted(/*succeeded=*/true);
|
| - EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
|
| - host_port_pair_.port()));
|
| + EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
|
|
|
| // Verify that QUIC stays disabled after a TCP job succeeds.
|
| factory_->OnTcpJobCompleted(/*succeeded=*/false);
|
| - EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
|
| - host_port_pair_.port()));
|
| -
|
| - EXPECT_TRUE(socket_data.AllReadDataConsumed());
|
| - EXPECT_TRUE(socket_data.AllWriteDataConsumed());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfFour) {
|
| - disable_disk_cache_ = true;
|
| - threshold_public_resets_post_handshake_ = 2;
|
| - Initialize();
|
| - ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
|
| - crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
|
| - crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
|
| - 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_);
|
| -
|
| - MockQuicData socket_data3;
|
| - socket_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
|
| - socket_data3.AddSocketDataToFactory(&socket_factory_);
|
| -
|
| - MockQuicData socket_data4;
|
| - socket_data4.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
|
| - socket_data4.AddSocketDataToFactory(&socket_factory_);
|
| -
|
| - HostPortPair server2(kServer2HostName, kDefaultServerPort);
|
| - HostPortPair server3(kServer3HostName, kDefaultServerPort);
|
| - HostPortPair server4(kServer4HostName, 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", "");
|
| - host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
|
| - host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
|
| -
|
| - // Test first and fourth out of four public reset post handshakes.
|
| - 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_);
|
| -
|
| - DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
|
| - session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "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::GetNumPublicResetsPostHandshake(
|
| - factory_.get()));
|
| - EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
|
| - host_port_pair_.port()));
|
| -
|
| - DVLOG(1) << "Create 2nd and 3rd sessions without disable trigger";
|
| - 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);
|
| -
|
| - session2->connection()->CloseConnection(
|
| - QUIC_NO_ERROR, "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(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
|
| - factory_.get()));
|
| - EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
|
| - host_port_pair_.port()));
|
| -
|
| - TestCompletionCallback callback3;
|
| - QuicStreamRequest request3(factory_.get());
|
| - EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
|
| - /*cert_verify_flags=*/0, url3_, "GET",
|
| - net_log_, callback3.callback()));
|
| - QuicChromiumClientSession* session3 = GetActiveSession(server3);
|
| -
|
| - session3->connection()->CloseConnection(
|
| - QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
|
| - // Need to spin the loop now to ensure that
|
| - // QuicStreamFactory::OnSessionClosed() runs.
|
| - base::RunLoop run_loop3;
|
| - run_loop3.RunUntilIdle();
|
| - EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
|
| - factory_.get()));
|
| - EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
|
| - host_port_pair_.port()));
|
| -
|
| - DVLOG(1) << "Create 4rd session with public reset post handshake,"
|
| - << " will not disable QUIC";
|
| - TestCompletionCallback callback4;
|
| - QuicStreamRequest request4(factory_.get());
|
| - EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
|
| - /*cert_verify_flags=*/0, url4_, "GET",
|
| - net_log_, callback4.callback()));
|
| - QuicChromiumClientSession* session4 = GetActiveSession(server4);
|
| -
|
| - session4->connection()->CloseConnection(
|
| - QUIC_PUBLIC_RESET, "test", ConnectionCloseBehavior::SILENT_CLOSE);
|
| - // Need to spin the loop now to ensure that
|
| - // QuicStreamFactory::OnSessionClosed() runs.
|
| - base::RunLoop run_loop4;
|
| - run_loop4.RunUntilIdle();
|
| - EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
|
| - factory_.get()));
|
| - EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
|
| - host_port_pair_.port()));
|
| -
|
| - std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
|
| - EXPECT_FALSE(stream.get()); // Session is already closed.
|
| - std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
|
| - EXPECT_FALSE(stream2.get()); // Session is already closed.
|
| - std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
|
| - EXPECT_FALSE(stream3.get()); // Session is already closed.
|
| - std::unique_ptr<QuicHttpStream> stream4 = request4.CreateStream();
|
| - EXPECT_FALSE(stream4.get()); // Session is already closed.
|
| -
|
| - EXPECT_TRUE(socket_data.AllReadDataConsumed());
|
| - EXPECT_TRUE(socket_data.AllWriteDataConsumed());
|
| - EXPECT_TRUE(socket_data2.AllReadDataConsumed());
|
| - EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
|
| - EXPECT_TRUE(socket_data3.AllReadDataConsumed());
|
| - EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
|
| - EXPECT_TRUE(socket_data4.AllReadDataConsumed());
|
| - EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfFour) {
|
| - disable_disk_cache_ = true;
|
| - threshold_public_resets_post_handshake_ = 2;
|
| - Initialize();
|
| - ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
|
| - crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
|
| - crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
|
| - 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_);
|
| -
|
| - MockQuicData socket_data3;
|
| - socket_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
|
| - socket_data3.AddSocketDataToFactory(&socket_factory_);
|
| -
|
| - MockQuicData socket_data4;
|
| - socket_data4.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
|
| - socket_data4.AddSocketDataToFactory(&socket_factory_);
|
| -
|
| - HostPortPair server2(kServer2HostName, kDefaultServerPort);
|
| - HostPortPair server3(kServer3HostName, kDefaultServerPort);
|
| - HostPortPair server4(kServer4HostName, 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", "");
|
| - host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
|
| - host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
|
| -
|
| - // Test first and fourth out of three timeouts with open streams.
|
| - 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";
|
| - 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()));
|
| -
|
| - DVLOG(1) << "Create 2nd and 3rd sessions without timeout";
|
| - 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);
|
| -
|
| - session2->connection()->CloseConnection(
|
| - QUIC_NO_ERROR, "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(
|
| - 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
|
| - EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
|
| - host_port_pair_.port()));
|
| -
|
| - TestCompletionCallback callback3;
|
| - QuicStreamRequest request3(factory_.get());
|
| - EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
|
| - /*cert_verify_flags=*/0, url3_, "GET",
|
| - net_log_, callback3.callback()));
|
| - QuicChromiumClientSession* session3 = GetActiveSession(server3);
|
| -
|
| - session3->connection()->CloseConnection(
|
| - QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
|
| - // Need to spin the loop now to ensure that
|
| - // QuicStreamFactory::OnSessionClosed() runs.
|
| - base::RunLoop run_loop3;
|
| - run_loop3.RunUntilIdle();
|
| - EXPECT_EQ(
|
| - 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
|
| - EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
|
| - host_port_pair_.port()));
|
| -
|
| - DVLOG(1) << "Create 4th session with timeout with open streams,"
|
| - << " will not disable QUIC";
|
| -
|
| - TestCompletionCallback callback4;
|
| - QuicStreamRequest request4(factory_.get());
|
| - EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
|
| - /*cert_verify_flags=*/0, url4_, "GET",
|
| - net_log_, callback4.callback()));
|
| - QuicChromiumClientSession* session4 = GetActiveSession(server4);
|
| -
|
| - std::unique_ptr<QuicHttpStream> stream4 = request4.CreateStream();
|
| - EXPECT_TRUE(stream4.get());
|
| - EXPECT_EQ(OK, stream4->InitializeStream(&request_info, DEFAULT_PRIORITY,
|
| - net_log_, CompletionCallback()));
|
| - session4->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_loop4;
|
| - run_loop4.RunUntilIdle();
|
| - EXPECT_EQ(
|
| - 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
|
| - EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
|
| - host_port_pair_.port()));
|
| -
|
| - std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
|
| - EXPECT_FALSE(stream2.get()); // Session is already closed.
|
| - std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
|
| - EXPECT_FALSE(stream3.get()); // Session is already closed.
|
| + EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
|
|
|
| EXPECT_TRUE(socket_data.AllReadDataConsumed());
|
| EXPECT_TRUE(socket_data.AllWriteDataConsumed());
|
| - EXPECT_TRUE(socket_data2.AllReadDataConsumed());
|
| - EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
|
| - EXPECT_TRUE(socket_data3.AllReadDataConsumed());
|
| - EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
|
| - EXPECT_TRUE(socket_data4.AllReadDataConsumed());
|
| - EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
|
| }
|
|
|
| TEST_P(QuicStreamFactoryTest, EnableDelayTcpRace) {
|
|
|