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

Side by Side Diff: net/quic/chromium/quic_stream_factory_test.cc

Issue 2318053004: Remove obsolete QUIC disabling code. (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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/chromium/quic_stream_factory.h" 5 #include "net/quic/chromium/quic_stream_factory.h"
6 6
7 #include <ostream> 7 #include <ostream>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 enum DestinationType { 83 enum DestinationType {
84 // In pooling tests with two requests for different origins to the same 84 // In pooling tests with two requests for different origins to the same
85 // destination, the destination should be 85 // destination, the destination should be
86 SAME_AS_FIRST, // the same as the first origin, 86 SAME_AS_FIRST, // the same as the first origin,
87 SAME_AS_SECOND, // the same as the second origin, or 87 SAME_AS_SECOND, // the same as the second origin, or
88 DIFFERENT, // different from both. 88 DIFFERENT, // different from both.
89 }; 89 };
90 90
91 const char kDefaultServerHostName[] = "www.example.org"; 91 const char kDefaultServerHostName[] = "www.example.org";
92 const char kServer2HostName[] = "mail.example.org"; 92 const char kServer2HostName[] = "mail.example.org";
93 const char kServer3HostName[] = "docs.example.org";
94 const char kServer4HostName[] = "images.example.org";
95 const char kDifferentHostname[] = "different.example.com"; 93 const char kDifferentHostname[] = "different.example.com";
96 const int kDefaultServerPort = 443; 94 const int kDefaultServerPort = 443;
97 const char kDefaultUrl[] = "https://www.example.org/"; 95 const char kDefaultUrl[] = "https://www.example.org/";
98 const char kServer2Url[] = "https://mail.example.org/"; 96 const char kServer2Url[] = "https://mail.example.org/";
99 const char kServer3Url[] = "https://docs.example.org/"; 97 const char kServer3Url[] = "https://docs.example.org/";
100 const char kServer4Url[] = "https://images.example.org/"; 98 const char kServer4Url[] = "https://images.example.org/";
101 99
102 // Run QuicStreamFactoryTest instances with all value combinations of version 100 // Run QuicStreamFactoryTest instances with all value combinations of version
103 // and enable_connection_racting. 101 // and enable_connection_racting.
104 struct TestParams { 102 struct TestParams {
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 url4_(kServer4Url), 240 url4_(kServer4Url),
243 privacy_mode_(PRIVACY_MODE_DISABLED), 241 privacy_mode_(PRIVACY_MODE_DISABLED),
244 enable_port_selection_(true), 242 enable_port_selection_(true),
245 always_require_handshake_confirmation_(false), 243 always_require_handshake_confirmation_(false),
246 disable_connection_pooling_(false), 244 disable_connection_pooling_(false),
247 load_server_info_timeout_srtt_multiplier_(0.0f), 245 load_server_info_timeout_srtt_multiplier_(0.0f),
248 enable_connection_racing_(enable_connection_racing), 246 enable_connection_racing_(enable_connection_racing),
249 enable_non_blocking_io_(true), 247 enable_non_blocking_io_(true),
250 disable_disk_cache_(false), 248 disable_disk_cache_(false),
251 prefer_aes_(false), 249 prefer_aes_(false),
252 max_number_of_lossy_connections_(0),
253 packet_loss_threshold_(1.0f),
254 max_disabled_reasons_(3),
255 threshold_timeouts_with_open_streams_(2),
256 threshold_public_resets_post_handshake_(2),
257 receive_buffer_size_(0), 250 receive_buffer_size_(0),
258 delay_tcp_race_(true), 251 delay_tcp_race_(true),
259 close_sessions_on_ip_change_(false), 252 close_sessions_on_ip_change_(false),
260 disable_quic_on_timeout_with_open_streams_(false), 253 disable_quic_on_timeout_with_open_streams_(false),
261 idle_connection_timeout_seconds_(kIdleConnectionTimeoutSeconds), 254 idle_connection_timeout_seconds_(kIdleConnectionTimeoutSeconds),
262 reduced_ping_timeout_seconds_(kPingTimeoutSecs), 255 reduced_ping_timeout_seconds_(kPingTimeoutSecs),
263 packet_reader_yield_after_duration_milliseconds_( 256 packet_reader_yield_after_duration_milliseconds_(
264 kQuicYieldAfterDurationMilliseconds), 257 kQuicYieldAfterDurationMilliseconds),
265 migrate_sessions_on_network_change_(false), 258 migrate_sessions_on_network_change_(false),
266 migrate_sessions_early_(false), 259 migrate_sessions_early_(false),
(...skipping 16 matching lines...) Expand all
283 net_log_.net_log(), &host_resolver_, ssl_config_service_.get(), 276 net_log_.net_log(), &host_resolver_, ssl_config_service_.get(),
284 &socket_factory_, &http_server_properties_, cert_verifier_.get(), 277 &socket_factory_, &http_server_properties_, cert_verifier_.get(),
285 &ct_policy_enforcer_, channel_id_service_.get(), 278 &ct_policy_enforcer_, channel_id_service_.get(),
286 &transport_security_state_, cert_transparency_verifier_.get(), 279 &transport_security_state_, cert_transparency_verifier_.get(),
287 /*SocketPerformanceWatcherFactory*/ nullptr, 280 /*SocketPerformanceWatcherFactory*/ nullptr,
288 &crypto_client_stream_factory_, &random_generator_, clock_, 281 &crypto_client_stream_factory_, &random_generator_, clock_,
289 kDefaultMaxPacketSize, string(), SupportedVersions(version_), 282 kDefaultMaxPacketSize, string(), SupportedVersions(version_),
290 enable_port_selection_, always_require_handshake_confirmation_, 283 enable_port_selection_, always_require_handshake_confirmation_,
291 disable_connection_pooling_, load_server_info_timeout_srtt_multiplier_, 284 disable_connection_pooling_, load_server_info_timeout_srtt_multiplier_,
292 enable_connection_racing_, enable_non_blocking_io_, disable_disk_cache_, 285 enable_connection_racing_, enable_non_blocking_io_, disable_disk_cache_,
293 prefer_aes_, max_number_of_lossy_connections_, packet_loss_threshold_, 286 prefer_aes_, receive_buffer_size_, delay_tcp_race_,
294 max_disabled_reasons_, threshold_timeouts_with_open_streams_, 287 /*max_server_configs_stored_in_properties*/ 0,
295 threshold_public_resets_post_handshake_, receive_buffer_size_,
296 delay_tcp_race_, /*max_server_configs_stored_in_properties*/ 0,
297 close_sessions_on_ip_change_, 288 close_sessions_on_ip_change_,
298 disable_quic_on_timeout_with_open_streams_, 289 disable_quic_on_timeout_with_open_streams_,
299 idle_connection_timeout_seconds_, reduced_ping_timeout_seconds_, 290 idle_connection_timeout_seconds_, reduced_ping_timeout_seconds_,
300 packet_reader_yield_after_duration_milliseconds_, 291 packet_reader_yield_after_duration_milliseconds_,
301 migrate_sessions_on_network_change_, migrate_sessions_early_, 292 migrate_sessions_on_network_change_, migrate_sessions_early_,
302 allow_server_migration_, force_hol_blocking_, race_cert_verification_, 293 allow_server_migration_, force_hol_blocking_, race_cert_verification_,
303 /*do_not_fragment*/ true, QuicTagVector(), 294 /*do_not_fragment*/ true, QuicTagVector(),
304 /*enable_token_binding*/ false)); 295 /*enable_token_binding*/ false));
305 factory_->set_require_confirmation(false); 296 factory_->set_require_confirmation(false);
306 EXPECT_FALSE(factory_->has_quic_server_info_factory()); 297 EXPECT_FALSE(factory_->has_quic_server_info_factory());
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 552
562 // Variables to configure QuicStreamFactory. 553 // Variables to configure QuicStreamFactory.
563 bool enable_port_selection_; 554 bool enable_port_selection_;
564 bool always_require_handshake_confirmation_; 555 bool always_require_handshake_confirmation_;
565 bool disable_connection_pooling_; 556 bool disable_connection_pooling_;
566 double load_server_info_timeout_srtt_multiplier_; 557 double load_server_info_timeout_srtt_multiplier_;
567 bool enable_connection_racing_; 558 bool enable_connection_racing_;
568 bool enable_non_blocking_io_; 559 bool enable_non_blocking_io_;
569 bool disable_disk_cache_; 560 bool disable_disk_cache_;
570 bool prefer_aes_; 561 bool prefer_aes_;
571 int max_number_of_lossy_connections_;
572 double packet_loss_threshold_;
573 int max_disabled_reasons_;
574 int threshold_timeouts_with_open_streams_;
575 int threshold_public_resets_post_handshake_;
576 int receive_buffer_size_; 562 int receive_buffer_size_;
577 bool delay_tcp_race_; 563 bool delay_tcp_race_;
578 bool close_sessions_on_ip_change_; 564 bool close_sessions_on_ip_change_;
579 bool disable_quic_on_timeout_with_open_streams_; 565 bool disable_quic_on_timeout_with_open_streams_;
580 int idle_connection_timeout_seconds_; 566 int idle_connection_timeout_seconds_;
581 int reduced_ping_timeout_seconds_; 567 int reduced_ping_timeout_seconds_;
582 int packet_reader_yield_after_duration_milliseconds_; 568 int packet_reader_yield_after_duration_milliseconds_;
583 bool migrate_sessions_on_network_change_; 569 bool migrate_sessions_on_network_change_;
584 bool migrate_sessions_early_; 570 bool migrate_sessions_early_;
585 bool allow_server_migration_; 571 bool allow_server_migration_;
(...skipping 3383 matching lines...) Expand 10 before | Expand all | Expand 10 after
3969 // If we are waiting for disk cache, we would have posted a task. Verify that 3955 // If we are waiting for disk cache, we would have posted a task. Verify that
3970 // the CancelWaitForDataReady task hasn't been posted. 3956 // the CancelWaitForDataReady task hasn't been posted.
3971 ASSERT_EQ(0u, runner_->GetPostedTasks().size()); 3957 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
3972 3958
3973 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); 3959 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
3974 EXPECT_TRUE(stream.get()); 3960 EXPECT_TRUE(stream.get());
3975 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 3961 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3976 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 3962 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3977 } 3963 }
3978 3964
3979 TEST_P(QuicStreamFactoryTest, BadPacketLoss) { 3965 TEST_P(QuicStreamFactoryTest, ReducePingTimeoutOnConnectionTimeOutOpenStreams) {
3980 disable_disk_cache_ = false; 3966 reduced_ping_timeout_seconds_ = 10;
3981 max_number_of_lossy_connections_ = 2;
3982 Initialize();
3983 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3984 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3985 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3986 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3987 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3988
3989 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3990
3991 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3992 host_port_pair_.port()));
3993 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
3994 factory_.get(), host_port_pair_.port()));
3995
3996 MockQuicData socket_data;
3997 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3998 socket_data.AddSocketDataToFactory(&socket_factory_);
3999
4000 MockQuicData socket_data2;
4001 socket_data2.AddSocketDataToFactory(&socket_factory_);
4002
4003 MockQuicData socket_data3;
4004 socket_data3.AddSocketDataToFactory(&socket_factory_);
4005
4006 MockQuicData socket_data4;
4007 socket_data4.AddSocketDataToFactory(&socket_factory_);
4008
4009 HostPortPair server2(kServer2HostName, kDefaultServerPort);
4010 HostPortPair server3(kServer3HostName, kDefaultServerPort);
4011 HostPortPair server4(kServer4HostName, kDefaultServerPort);
4012
4013 crypto_client_stream_factory_.set_handshake_mode(
4014 MockCryptoClientStream::ZERO_RTT);
4015 host_resolver_.set_synchronous_mode(true);
4016 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
4017 "192.168.0.1", "");
4018 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
4019 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
4020 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
4021
4022 QuicStreamRequest request(factory_.get());
4023 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
4024 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4025 callback_.callback()));
4026
4027 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4028
4029 DVLOG(1) << "Create 1st session and test packet loss";
4030
4031 // Set packet_loss_rate to a lower value than packet_loss_threshold.
4032 EXPECT_FALSE(
4033 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/0.9f));
4034 EXPECT_TRUE(session->connection()->connected());
4035 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4036 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4037 host_port_pair_.port()));
4038 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
4039 factory_.get(), host_port_pair_.port()));
4040
4041 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
4042 // and that shouldn't close the session and it shouldn't disable QUIC.
4043 EXPECT_FALSE(
4044 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/1.0f));
4045 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
4046 factory_.get(), host_port_pair_.port()));
4047 EXPECT_TRUE(session->connection()->connected());
4048 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4049 host_port_pair_.port()));
4050 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4051
4052 // Test N-in-a-row high packet loss connections.
4053
4054 DVLOG(1) << "Create 2nd session and test packet loss";
4055
4056 TestCompletionCallback callback2;
4057 QuicStreamRequest request2(factory_.get());
4058 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
4059 /*cert_verify_flags=*/0, url2_, "GET",
4060 net_log_, callback2.callback()));
4061 QuicChromiumClientSession* session2 = GetActiveSession(server2);
4062
4063 // If there is no packet loss during handshake confirmation, number of lossy
4064 // connections for the port should be 0.
4065 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
4066 factory_.get(), server2.port()));
4067 EXPECT_FALSE(
4068 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/0.9f));
4069 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
4070 factory_.get(), server2.port()));
4071 EXPECT_FALSE(
4072 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
4073
4074 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
4075 // and that shouldn't close the session and it shouldn't disable QUIC.
4076 EXPECT_FALSE(
4077 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/1.0f));
4078 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
4079 factory_.get(), server2.port()));
4080 EXPECT_TRUE(session2->connection()->connected());
4081 EXPECT_FALSE(
4082 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
4083 EXPECT_TRUE(HasActiveSession(server2));
4084
4085 DVLOG(1) << "Create 3rd session which also has packet loss";
4086
4087 TestCompletionCallback callback3;
4088 QuicStreamRequest request3(factory_.get());
4089 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
4090 /*cert_verify_flags=*/0, url3_, "GET",
4091 net_log_, callback3.callback()));
4092 QuicChromiumClientSession* session3 = GetActiveSession(server3);
4093
4094 DVLOG(1) << "Create 4th session with packet loss and test IsQuicDisabled()";
4095 TestCompletionCallback callback4;
4096 QuicStreamRequest request4(factory_.get());
4097 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
4098 /*cert_verify_flags=*/0, url4_, "GET",
4099 net_log_, callback4.callback()));
4100 QuicChromiumClientSession* session4 = GetActiveSession(server4);
4101
4102 // Set packet_loss_rate to higher value than packet_loss_threshold 2nd time in
4103 // a row and that should close the session and disable QUIC.
4104 EXPECT_TRUE(
4105 factory_->OnHandshakeConfirmed(session3, /*packet_loss_rate=*/1.0f));
4106 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
4107 factory_.get(), server3.port()));
4108 EXPECT_FALSE(session3->connection()->connected());
4109 EXPECT_TRUE(
4110 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server3.port()));
4111 EXPECT_FALSE(HasActiveSession(server3));
4112
4113 // Set packet_loss_rate to higher value than packet_loss_threshold 3rd time in
4114 // a row and IsQuicDisabled() should close the session.
4115 EXPECT_TRUE(
4116 factory_->OnHandshakeConfirmed(session4, /*packet_loss_rate=*/1.0f));
4117 EXPECT_EQ(3, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
4118 factory_.get(), server4.port()));
4119 EXPECT_FALSE(session4->connection()->connected());
4120 EXPECT_TRUE(
4121 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server4.port()));
4122 EXPECT_FALSE(HasActiveSession(server4));
4123
4124 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
4125 EXPECT_TRUE(stream.get());
4126 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
4127 EXPECT_TRUE(stream2.get());
4128 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
4129 EXPECT_TRUE(stream3.get());
4130 std::unique_ptr<QuicHttpStream> stream4 = request4.CreateStream();
4131 EXPECT_TRUE(stream4.get());
4132 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4133 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4134 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
4135 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
4136 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
4137 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
4138 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
4139 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
4140 }
4141
4142 TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfTwo) {
4143 disable_disk_cache_ = false;
4144 threshold_public_resets_post_handshake_ = 2;
4145 Initialize();
4146 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4147 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4148 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4149 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
4150
4151 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4152 host_port_pair_.port()));
4153 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
4154 factory_.get(), host_port_pair_.port()));
4155
4156 MockQuicData socket_data;
4157 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4158 socket_data.AddSocketDataToFactory(&socket_factory_);
4159
4160 MockQuicData socket_data2;
4161 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4162 socket_data2.AddSocketDataToFactory(&socket_factory_);
4163
4164 HostPortPair server2(kServer2HostName, kDefaultServerPort);
4165
4166 crypto_client_stream_factory_.set_handshake_mode(
4167 MockCryptoClientStream::CONFIRM_HANDSHAKE);
4168 host_resolver_.set_synchronous_mode(true);
4169 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
4170 "192.168.0.1", "");
4171 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
4172
4173 QuicStreamRequest request(factory_.get());
4174 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
4175 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4176 callback_.callback()));
4177
4178 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4179
4180 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
4181 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
4182 ConnectionCloseBehavior::SILENT_CLOSE);
4183 // Need to spin the loop now to ensure that
4184 // QuicStreamFactory::OnSessionClosed() runs.
4185 base::RunLoop run_loop;
4186 run_loop.RunUntilIdle();
4187
4188 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
4189 factory_.get()));
4190 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4191 host_port_pair_.port()));
4192
4193 // Test two-in-a-row public reset post handshakes..
4194 DVLOG(1) << "Create 2nd session and trigger public reset post handshake";
4195 TestCompletionCallback callback2;
4196 QuicStreamRequest request2(factory_.get());
4197 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
4198 /*cert_verify_flags=*/0, url2_, "GET",
4199 net_log_, callback2.callback()));
4200 QuicChromiumClientSession* session2 = GetActiveSession(server2);
4201
4202 session2->connection()->CloseConnection(
4203 QUIC_PUBLIC_RESET, "test", ConnectionCloseBehavior::SILENT_CLOSE);
4204 // Need to spin the loop now to ensure that
4205 // QuicStreamFactory::OnSessionClosed() runs.
4206 base::RunLoop run_loop2;
4207 run_loop2.RunUntilIdle();
4208 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
4209 factory_.get()));
4210 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4211 host_port_pair_.port()));
4212 EXPECT_EQ(
4213 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
4214 factory_->QuicDisabledReason(host_port_pair_.port()));
4215
4216 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
4217 EXPECT_FALSE(stream.get()); // Session is already closed.
4218 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
4219 EXPECT_FALSE(stream2.get()); // Session is already closed.
4220 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4221 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4222 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
4223 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
4224 }
4225
4226 TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfTwo) {
4227 disable_disk_cache_ = true; 3967 disable_disk_cache_ = true;
4228 threshold_timeouts_with_open_streams_ = 2;
4229 Initialize(); 3968 Initialize();
4230 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 3969 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4231 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 3970 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4232 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 3971 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4233 3972
4234 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get()); 3973 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
4235 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), 3974 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
4236 host_port_pair_.port()));
4237 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
4238 factory_.get(), host_port_pair_.port()));
4239 3975
4240 MockQuicData socket_data; 3976 MockQuicData socket_data;
4241 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 3977 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4242 socket_data.AddSocketDataToFactory(&socket_factory_);
4243
4244 MockQuicData socket_data2;
4245 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4246 socket_data2.AddSocketDataToFactory(&socket_factory_);
4247
4248 HostPortPair server2(kServer2HostName, kDefaultServerPort);
4249
4250 crypto_client_stream_factory_.set_handshake_mode(
4251 MockCryptoClientStream::CONFIRM_HANDSHAKE);
4252 host_resolver_.set_synchronous_mode(true);
4253 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
4254 "192.168.0.1", "");
4255 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
4256
4257 QuicStreamRequest request(factory_.get());
4258 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
4259 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4260 callback_.callback()));
4261
4262 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4263
4264 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
4265 EXPECT_TRUE(stream.get());
4266 HttpRequestInfo request_info;
4267 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
4268 net_log_, CompletionCallback()));
4269
4270 DVLOG(1)
4271 << "Created 1st session and initialized a stream. Now trigger timeout";
4272 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
4273 ConnectionCloseBehavior::SILENT_CLOSE);
4274 // Need to spin the loop now to ensure that
4275 // QuicStreamFactory::OnSessionClosed() runs.
4276 base::RunLoop run_loop;
4277 run_loop.RunUntilIdle();
4278
4279 EXPECT_EQ(
4280 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
4281 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4282 host_port_pair_.port()));
4283
4284 // Test two-in-a-row timeouts with open streams.
4285 DVLOG(1) << "Create 2nd session and timeout with open stream";
4286 TestCompletionCallback callback2;
4287 QuicStreamRequest request2(factory_.get());
4288 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
4289 /*cert_verify_flags=*/0, url2_, "GET",
4290 net_log_, callback2.callback()));
4291 QuicChromiumClientSession* session2 = GetActiveSession(server2);
4292
4293 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
4294 EXPECT_TRUE(stream2.get());
4295 EXPECT_EQ(OK, stream2->InitializeStream(&request_info, DEFAULT_PRIORITY,
4296 net_log_, CompletionCallback()));
4297
4298 session2->connection()->CloseConnection(
4299 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
4300 // Need to spin the loop now to ensure that
4301 // QuicStreamFactory::OnSessionClosed() runs.
4302 base::RunLoop run_loop2;
4303 run_loop2.RunUntilIdle();
4304 EXPECT_EQ(
4305 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
4306 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4307 host_port_pair_.port()));
4308 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
4309 factory_->QuicDisabledReason(host_port_pair_.port()));
4310
4311 // Verify that QUIC is un-disabled after a TCP job fails.
4312 factory_->OnTcpJobCompleted(/*succeeded=*/false);
4313 EXPECT_EQ(
4314 0, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
4315 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4316 host_port_pair_.port()));
4317
4318 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4319 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4320 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
4321 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
4322 }
4323
4324 TEST_P(QuicStreamFactoryTest, ReducePingTimeoutOnConnectionTimeOutOpenStreams) {
4325 reduced_ping_timeout_seconds_ = 10;
4326 disable_disk_cache_ = true;
4327 threshold_timeouts_with_open_streams_ = 2;
4328 Initialize();
4329 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4330 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4331 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4332
4333 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
4334 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4335 host_port_pair_.port()));
4336 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
4337 factory_.get(), host_port_pair_.port()));
4338
4339 MockQuicData socket_data;
4340 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4341 socket_data.AddSocketDataToFactory(&socket_factory_); 3978 socket_data.AddSocketDataToFactory(&socket_factory_);
4342 3979
4343 MockQuicData socket_data2; 3980 MockQuicData socket_data2;
4344 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 3981 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4345 socket_data2.AddSocketDataToFactory(&socket_factory_); 3982 socket_data2.AddSocketDataToFactory(&socket_factory_);
4346 3983
4347 HostPortPair server2(kServer2HostName, kDefaultServerPort); 3984 HostPortPair server2(kServer2HostName, kDefaultServerPort);
4348 3985
4349 crypto_client_stream_factory_.set_handshake_mode( 3986 crypto_client_stream_factory_.set_handshake_mode(
4350 MockCryptoClientStream::CONFIRM_HANDSHAKE); 3987 MockCryptoClientStream::CONFIRM_HANDSHAKE);
(...skipping 23 matching lines...) Expand all
4374 4011
4375 DVLOG(1) 4012 DVLOG(1)
4376 << "Created 1st session and initialized a stream. Now trigger timeout"; 4013 << "Created 1st session and initialized a stream. Now trigger timeout";
4377 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test", 4014 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
4378 ConnectionCloseBehavior::SILENT_CLOSE); 4015 ConnectionCloseBehavior::SILENT_CLOSE);
4379 // Need to spin the loop now to ensure that 4016 // Need to spin the loop now to ensure that
4380 // QuicStreamFactory::OnSessionClosed() runs. 4017 // QuicStreamFactory::OnSessionClosed() runs.
4381 base::RunLoop run_loop; 4018 base::RunLoop run_loop;
4382 run_loop.RunUntilIdle(); 4019 run_loop.RunUntilIdle();
4383 4020
4384 EXPECT_EQ( 4021 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
4385 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
4386 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4387 host_port_pair_.port()));
4388 4022
4389 // The first connection times out with open stream, QUIC should reduce initial 4023 // The first connection times out with open stream, QUIC should reduce initial
4390 // PING time for subsequent connections. 4024 // PING time for subsequent connections.
4391 EXPECT_EQ(QuicTime::Delta::FromSeconds(10), 4025 EXPECT_EQ(QuicTime::Delta::FromSeconds(10),
4392 QuicStreamFactoryPeer::GetPingTimeout(factory_.get())); 4026 QuicStreamFactoryPeer::GetPingTimeout(factory_.get()));
4393 4027
4394 // Test two-in-a-row timeouts with open streams. 4028 // Test two-in-a-row timeouts with open streams.
4395 DVLOG(1) << "Create 2nd session and timeout with open stream"; 4029 DVLOG(1) << "Create 2nd session and timeout with open stream";
4396 TestCompletionCallback callback2; 4030 TestCompletionCallback callback2;
4397 QuicStreamRequest request2(factory_.get()); 4031 QuicStreamRequest request2(factory_.get());
4398 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_, 4032 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
4399 /*cert_verify_flags=*/0, url2_, "GET", 4033 /*cert_verify_flags=*/0, url2_, "GET",
4400 net_log_, callback2.callback())); 4034 net_log_, callback2.callback()));
4401 QuicChromiumClientSession* session2 = GetActiveSession(server2); 4035 QuicChromiumClientSession* session2 = GetActiveSession(server2);
4402 EXPECT_EQ(QuicTime::Delta::FromSeconds(10), 4036 EXPECT_EQ(QuicTime::Delta::FromSeconds(10),
4403 session2->connection()->ping_timeout()); 4037 session2->connection()->ping_timeout());
4404 4038
4405 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream(); 4039 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
4406 EXPECT_TRUE(stream2.get()); 4040 EXPECT_TRUE(stream2.get());
4407 EXPECT_EQ(OK, stream2->InitializeStream(&request_info, DEFAULT_PRIORITY, 4041 EXPECT_EQ(OK, stream2->InitializeStream(&request_info, DEFAULT_PRIORITY,
4408 net_log_, CompletionCallback())); 4042 net_log_, CompletionCallback()));
4409 session2->connection()->CloseConnection( 4043 session2->connection()->CloseConnection(
4410 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE); 4044 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
4411 // Need to spin the loop now to ensure that 4045 // Need to spin the loop now to ensure that
4412 // QuicStreamFactory::OnSessionClosed() runs. 4046 // QuicStreamFactory::OnSessionClosed() runs.
4413 base::RunLoop run_loop2; 4047 base::RunLoop run_loop2;
4414 run_loop2.RunUntilIdle(); 4048 run_loop2.RunUntilIdle();
4415 EXPECT_EQ( 4049 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
4416 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
4417 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4418 host_port_pair_.port()));
4419 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
4420 factory_->QuicDisabledReason(host_port_pair_.port()));
4421
4422 // Verify that QUIC is un-disabled after a TCP job fails.
4423 factory_->OnTcpJobCompleted(/*succeeded=*/false);
4424 EXPECT_EQ(
4425 0, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
4426 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4427 host_port_pair_.port()));
4428 4050
4429 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 4051 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4430 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 4052 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4431 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); 4053 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
4432 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); 4054 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
4433 } 4055 }
4434 4056
4435 TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfThree) { 4057 TEST_P(QuicStreamFactoryTest, DisableQuicWhenTimeoutsWithOpenStreams) {
4436 disable_disk_cache_ = true; 4058 disable_disk_cache_ = true;
4437 threshold_public_resets_post_handshake_ = 2; 4059 disable_quic_on_timeout_with_open_streams_ = true;
4438 Initialize(); 4060 Initialize();
4439 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 4061 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4440 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 4062 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4441 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 4063 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
4442 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4443 4064
4444 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), 4065 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
4445 host_port_pair_.port()));
4446 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
4447 factory_.get(), host_port_pair_.port()));
4448 4066
4449 MockQuicData socket_data; 4067 MockQuicData socket_data;
4450 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 4068 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4451 socket_data.AddSocketDataToFactory(&socket_factory_); 4069 socket_data.AddSocketDataToFactory(&socket_factory_);
4452 4070
4453 MockQuicData socket_data2;
4454 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4455 socket_data2.AddSocketDataToFactory(&socket_factory_);
4456
4457 MockQuicData socket_data3;
4458 socket_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4459 socket_data3.AddSocketDataToFactory(&socket_factory_);
4460
4461 HostPortPair server2(kServer2HostName, kDefaultServerPort);
4462 HostPortPair server3(kServer3HostName, kDefaultServerPort);
4463
4464 crypto_client_stream_factory_.set_handshake_mode( 4071 crypto_client_stream_factory_.set_handshake_mode(
4465 MockCryptoClientStream::CONFIRM_HANDSHAKE); 4072 MockCryptoClientStream::CONFIRM_HANDSHAKE);
4466 host_resolver_.set_synchronous_mode(true); 4073 host_resolver_.set_synchronous_mode(true);
4467 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(), 4074 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
4468 "192.168.0.1", ""); 4075 "192.168.0.1", "");
4469 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
4470 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
4471 4076
4472 // Test first and third out of three public reset post handshakes. 4077 // Test first timeouts with open streams will disable QUIC.
4473 QuicStreamRequest request(factory_.get()); 4078 QuicStreamRequest request(factory_.get());
4474 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_, 4079 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
4475 /*cert_verify_flags=*/0, url_, "GET", net_log_, 4080 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4476 callback_.callback())); 4081 callback_.callback()));
4477 4082
4478 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); 4083 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4479 4084
4480 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
4481 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
4482 ConnectionCloseBehavior::SILENT_CLOSE);
4483 // Need to spin the loop now to ensure that
4484 // QuicStreamFactory::OnSessionClosed() runs.
4485 base::RunLoop run_loop;
4486 run_loop.RunUntilIdle();
4487
4488 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
4489 factory_.get()));
4490 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4491 host_port_pair_.port()));
4492
4493 DVLOG(1) << "Create 2nd session without disable trigger";
4494 TestCompletionCallback callback2;
4495 QuicStreamRequest request2(factory_.get());
4496 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
4497 /*cert_verify_flags=*/0, url2_, "GET",
4498 net_log_, callback2.callback()));
4499 QuicChromiumClientSession* session2 = GetActiveSession(server2);
4500
4501 session2->connection()->CloseConnection(
4502 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
4503 // Need to spin the loop now to ensure that
4504 // QuicStreamFactory::OnSessionClosed() runs.
4505 base::RunLoop run_loop2;
4506 run_loop2.RunUntilIdle();
4507 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
4508 factory_.get()));
4509 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4510 host_port_pair_.port()));
4511
4512 DVLOG(1) << "Create 3rd session with public reset post handshake,"
4513 << " will disable QUIC";
4514 TestCompletionCallback callback3;
4515 QuicStreamRequest request3(factory_.get());
4516 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
4517 /*cert_verify_flags=*/0, url3_, "GET",
4518 net_log_, callback3.callback()));
4519 QuicChromiumClientSession* session3 = GetActiveSession(server3);
4520
4521 session3->connection()->CloseConnection(
4522 QUIC_PUBLIC_RESET, "test", ConnectionCloseBehavior::SILENT_CLOSE);
4523 // Need to spin the loop now to ensure that
4524 // QuicStreamFactory::OnSessionClosed() runs.
4525 base::RunLoop run_loop3;
4526 run_loop3.RunUntilIdle();
4527 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
4528 factory_.get()));
4529 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4530 host_port_pair_.port()));
4531 EXPECT_EQ(
4532 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
4533 factory_->QuicDisabledReason(host_port_pair_.port()));
4534
4535 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
4536 EXPECT_FALSE(stream.get()); // Session is already closed.
4537 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
4538 EXPECT_FALSE(stream2.get()); // Session is already closed.
4539 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
4540 EXPECT_FALSE(stream3.get()); // Session is already closed.
4541
4542 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4543 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4544 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
4545 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
4546 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
4547 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
4548 }
4549
4550 TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfThree) {
4551 disable_disk_cache_ = true;
4552 threshold_public_resets_post_handshake_ = 2;
4553 Initialize();
4554 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4555 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4556 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4557 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4558 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
4559
4560 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4561 host_port_pair_.port()));
4562 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
4563 factory_.get(), host_port_pair_.port()));
4564
4565 MockQuicData socket_data;
4566 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4567 socket_data.AddSocketDataToFactory(&socket_factory_);
4568
4569 MockQuicData socket_data2;
4570 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4571 socket_data2.AddSocketDataToFactory(&socket_factory_);
4572
4573 MockQuicData socket_data3;
4574 socket_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4575 socket_data3.AddSocketDataToFactory(&socket_factory_);
4576
4577 HostPortPair server2(kServer2HostName, kDefaultServerPort);
4578 HostPortPair server3(kServer3HostName, kDefaultServerPort);
4579
4580 crypto_client_stream_factory_.set_handshake_mode(
4581 MockCryptoClientStream::CONFIRM_HANDSHAKE);
4582 host_resolver_.set_synchronous_mode(true);
4583 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
4584 "192.168.0.1", "");
4585 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
4586 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
4587
4588 // Test first and third out of three timeouts with open streams.
4589 QuicStreamRequest request(factory_.get());
4590 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
4591 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4592 callback_.callback()));
4593
4594 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4595
4596 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
4597 EXPECT_TRUE(stream.get());
4598 HttpRequestInfo request_info;
4599 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
4600 net_log_, CompletionCallback()));
4601
4602 DVLOG(1)
4603 << "Created 1st session and initialized a stream. Now trigger timeout";
4604 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
4605 ConnectionCloseBehavior::SILENT_CLOSE);
4606 // Need to spin the loop now to ensure that
4607 // QuicStreamFactory::OnSessionClosed() runs.
4608 base::RunLoop run_loop;
4609 run_loop.RunUntilIdle();
4610
4611 EXPECT_EQ(
4612 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
4613 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4614 host_port_pair_.port()));
4615
4616 // Test two-in-a-row timeouts with open streams.
4617 DVLOG(1) << "Create 2nd session without timeout";
4618 TestCompletionCallback callback2;
4619 QuicStreamRequest request2(factory_.get());
4620 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
4621 /*cert_verify_flags=*/0, url2_, "GET",
4622 net_log_, callback2.callback()));
4623 QuicChromiumClientSession* session2 = GetActiveSession(server2);
4624
4625 session2->connection()->CloseConnection(
4626 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
4627 // Need to spin the loop now to ensure that
4628 // QuicStreamFactory::OnSessionClosed() runs.
4629 base::RunLoop run_loop2;
4630 run_loop2.RunUntilIdle();
4631 EXPECT_EQ(
4632 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
4633 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4634 host_port_pair_.port()));
4635
4636 DVLOG(1) << "Create 3rd session with timeout with open streams,"
4637 << " will disable QUIC";
4638
4639 TestCompletionCallback callback3;
4640 QuicStreamRequest request3(factory_.get());
4641 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
4642 /*cert_verify_flags=*/0, url3_, "GET",
4643 net_log_, callback3.callback()));
4644 QuicChromiumClientSession* session3 = GetActiveSession(server3);
4645
4646 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
4647 EXPECT_TRUE(stream3.get());
4648 EXPECT_EQ(OK, stream3->InitializeStream(&request_info, DEFAULT_PRIORITY,
4649 net_log_, CompletionCallback()));
4650 session3->connection()->CloseConnection(
4651 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
4652 // Need to spin the loop now to ensure that
4653 // QuicStreamFactory::OnSessionClosed() runs.
4654 base::RunLoop run_loop3;
4655 run_loop3.RunUntilIdle();
4656 EXPECT_EQ(
4657 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
4658 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4659 host_port_pair_.port()));
4660 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
4661 factory_->QuicDisabledReason(host_port_pair_.port()));
4662
4663 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
4664 EXPECT_FALSE(stream2.get()); // Session is already closed.
4665
4666 // Verify that QUIC is un-disabled after a network change.
4667 factory_->OnIPAddressChanged();
4668 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4669 host_port_pair_.port()));
4670 EXPECT_EQ(
4671 0, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
4672
4673 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4674 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4675 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
4676 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
4677 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
4678 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
4679 }
4680
4681 TEST_P(QuicStreamFactoryTest, DisableQuicWhenTimeoutsWithOpenStreams) {
4682 disable_disk_cache_ = true;
4683 disable_quic_on_timeout_with_open_streams_ = true;
4684 Initialize();
4685 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4686 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4687 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
4688
4689 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4690 host_port_pair_.port()));
4691 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
4692 factory_.get(), host_port_pair_.port()));
4693
4694 MockQuicData socket_data;
4695 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4696 socket_data.AddSocketDataToFactory(&socket_factory_);
4697
4698 crypto_client_stream_factory_.set_handshake_mode(
4699 MockCryptoClientStream::CONFIRM_HANDSHAKE);
4700 host_resolver_.set_synchronous_mode(true);
4701 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
4702 "192.168.0.1", "");
4703
4704 // Test first timeouts with open streams will disable QUIC.
4705 QuicStreamRequest request(factory_.get());
4706 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
4707 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4708 callback_.callback()));
4709
4710 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4711
4712 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); 4085 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
4713 EXPECT_TRUE(stream.get()); 4086 EXPECT_TRUE(stream.get());
4714 HttpRequestInfo request_info; 4087 HttpRequestInfo request_info;
4715 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, 4088 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
4716 net_log_, CompletionCallback())); 4089 net_log_, CompletionCallback()));
4717 4090
4718 DVLOG(1) 4091 DVLOG(1)
4719 << "Created 1st session and initialized a stream. Now trigger timeout." 4092 << "Created 1st session and initialized a stream. Now trigger timeout."
4720 << "Will disable QUIC."; 4093 << "Will disable QUIC.";
4721 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test", 4094 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
4722 ConnectionCloseBehavior::SILENT_CLOSE); 4095 ConnectionCloseBehavior::SILENT_CLOSE);
4723 // Need to spin the loop now to ensure that 4096 // Need to spin the loop now to ensure that
4724 // QuicStreamFactory::OnSessionClosed() runs. 4097 // QuicStreamFactory::OnSessionClosed() runs.
4725 base::RunLoop run_loop; 4098 base::RunLoop run_loop;
4726 run_loop.RunUntilIdle(); 4099 run_loop.RunUntilIdle();
4727 4100
4728 EXPECT_EQ( 4101 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
4729 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
4730 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4731 host_port_pair_.port()));
4732
4733 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
4734 factory_->QuicDisabledReason(host_port_pair_.port()));
4735 4102
4736 // Verify that QUIC is fully disabled after a TCP job succeeds. 4103 // Verify that QUIC is fully disabled after a TCP job succeeds.
4737 factory_->OnTcpJobCompleted(/*succeeded=*/true); 4104 factory_->OnTcpJobCompleted(/*succeeded=*/true);
4738 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), 4105 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
4739 host_port_pair_.port()));
4740 4106
4741 // Verify that QUIC stays disabled after a TCP job succeeds. 4107 // Verify that QUIC stays disabled after a TCP job succeeds.
4742 factory_->OnTcpJobCompleted(/*succeeded=*/false); 4108 factory_->OnTcpJobCompleted(/*succeeded=*/false);
4743 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), 4109 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
4744 host_port_pair_.port()));
4745 4110
4746 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 4111 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4747 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 4112 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4748 } 4113 }
4749 4114
4750 TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfFour) {
4751 disable_disk_cache_ = true;
4752 threshold_public_resets_post_handshake_ = 2;
4753 Initialize();
4754 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4755 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4756 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4757 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4758 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4759 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
4760
4761 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4762 host_port_pair_.port()));
4763 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
4764 factory_.get(), host_port_pair_.port()));
4765
4766 MockQuicData socket_data;
4767 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4768 socket_data.AddSocketDataToFactory(&socket_factory_);
4769
4770 MockQuicData socket_data2;
4771 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4772 socket_data2.AddSocketDataToFactory(&socket_factory_);
4773
4774 MockQuicData socket_data3;
4775 socket_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4776 socket_data3.AddSocketDataToFactory(&socket_factory_);
4777
4778 MockQuicData socket_data4;
4779 socket_data4.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4780 socket_data4.AddSocketDataToFactory(&socket_factory_);
4781
4782 HostPortPair server2(kServer2HostName, kDefaultServerPort);
4783 HostPortPair server3(kServer3HostName, kDefaultServerPort);
4784 HostPortPair server4(kServer4HostName, kDefaultServerPort);
4785
4786 crypto_client_stream_factory_.set_handshake_mode(
4787 MockCryptoClientStream::CONFIRM_HANDSHAKE);
4788 host_resolver_.set_synchronous_mode(true);
4789 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
4790 "192.168.0.1", "");
4791 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
4792 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
4793 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
4794
4795 // Test first and fourth out of four public reset post handshakes.
4796 QuicStreamRequest request(factory_.get());
4797 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
4798 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4799 callback_.callback()));
4800
4801 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4802
4803 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
4804 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
4805 ConnectionCloseBehavior::SILENT_CLOSE);
4806 // Need to spin the loop now to ensure that
4807 // QuicStreamFactory::OnSessionClosed() runs.
4808 base::RunLoop run_loop;
4809 run_loop.RunUntilIdle();
4810
4811 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
4812 factory_.get()));
4813 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4814 host_port_pair_.port()));
4815
4816 DVLOG(1) << "Create 2nd and 3rd sessions without disable trigger";
4817 TestCompletionCallback callback2;
4818 QuicStreamRequest request2(factory_.get());
4819 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
4820 /*cert_verify_flags=*/0, url2_, "GET",
4821 net_log_, callback2.callback()));
4822 QuicChromiumClientSession* session2 = GetActiveSession(server2);
4823
4824 session2->connection()->CloseConnection(
4825 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
4826 // Need to spin the loop now to ensure that
4827 // QuicStreamFactory::OnSessionClosed() runs.
4828 base::RunLoop run_loop2;
4829 run_loop2.RunUntilIdle();
4830 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
4831 factory_.get()));
4832 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4833 host_port_pair_.port()));
4834
4835 TestCompletionCallback callback3;
4836 QuicStreamRequest request3(factory_.get());
4837 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
4838 /*cert_verify_flags=*/0, url3_, "GET",
4839 net_log_, callback3.callback()));
4840 QuicChromiumClientSession* session3 = GetActiveSession(server3);
4841
4842 session3->connection()->CloseConnection(
4843 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
4844 // Need to spin the loop now to ensure that
4845 // QuicStreamFactory::OnSessionClosed() runs.
4846 base::RunLoop run_loop3;
4847 run_loop3.RunUntilIdle();
4848 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
4849 factory_.get()));
4850 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4851 host_port_pair_.port()));
4852
4853 DVLOG(1) << "Create 4rd session with public reset post handshake,"
4854 << " will not disable QUIC";
4855 TestCompletionCallback callback4;
4856 QuicStreamRequest request4(factory_.get());
4857 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
4858 /*cert_verify_flags=*/0, url4_, "GET",
4859 net_log_, callback4.callback()));
4860 QuicChromiumClientSession* session4 = GetActiveSession(server4);
4861
4862 session4->connection()->CloseConnection(
4863 QUIC_PUBLIC_RESET, "test", ConnectionCloseBehavior::SILENT_CLOSE);
4864 // Need to spin the loop now to ensure that
4865 // QuicStreamFactory::OnSessionClosed() runs.
4866 base::RunLoop run_loop4;
4867 run_loop4.RunUntilIdle();
4868 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
4869 factory_.get()));
4870 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4871 host_port_pair_.port()));
4872
4873 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
4874 EXPECT_FALSE(stream.get()); // Session is already closed.
4875 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
4876 EXPECT_FALSE(stream2.get()); // Session is already closed.
4877 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
4878 EXPECT_FALSE(stream3.get()); // Session is already closed.
4879 std::unique_ptr<QuicHttpStream> stream4 = request4.CreateStream();
4880 EXPECT_FALSE(stream4.get()); // Session is already closed.
4881
4882 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4883 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4884 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
4885 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
4886 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
4887 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
4888 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
4889 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
4890 }
4891
4892 TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfFour) {
4893 disable_disk_cache_ = true;
4894 threshold_public_resets_post_handshake_ = 2;
4895 Initialize();
4896 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4897 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4898 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4899 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4900 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4901 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
4902
4903 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4904 host_port_pair_.port()));
4905 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
4906 factory_.get(), host_port_pair_.port()));
4907
4908 MockQuicData socket_data;
4909 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4910 socket_data.AddSocketDataToFactory(&socket_factory_);
4911
4912 MockQuicData socket_data2;
4913 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4914 socket_data2.AddSocketDataToFactory(&socket_factory_);
4915
4916 MockQuicData socket_data3;
4917 socket_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4918 socket_data3.AddSocketDataToFactory(&socket_factory_);
4919
4920 MockQuicData socket_data4;
4921 socket_data4.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4922 socket_data4.AddSocketDataToFactory(&socket_factory_);
4923
4924 HostPortPair server2(kServer2HostName, kDefaultServerPort);
4925 HostPortPair server3(kServer3HostName, kDefaultServerPort);
4926 HostPortPair server4(kServer4HostName, kDefaultServerPort);
4927
4928 crypto_client_stream_factory_.set_handshake_mode(
4929 MockCryptoClientStream::CONFIRM_HANDSHAKE);
4930 host_resolver_.set_synchronous_mode(true);
4931 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
4932 "192.168.0.1", "");
4933 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
4934 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
4935 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
4936
4937 // Test first and fourth out of three timeouts with open streams.
4938 QuicStreamRequest request(factory_.get());
4939 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
4940 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4941 callback_.callback()));
4942
4943 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4944
4945 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
4946 EXPECT_TRUE(stream.get());
4947 HttpRequestInfo request_info;
4948 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
4949 net_log_, CompletionCallback()));
4950
4951 DVLOG(1)
4952 << "Created 1st session and initialized a stream. Now trigger timeout";
4953 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
4954 ConnectionCloseBehavior::SILENT_CLOSE);
4955 // Need to spin the loop now to ensure that
4956 // QuicStreamFactory::OnSessionClosed() runs.
4957 base::RunLoop run_loop;
4958 run_loop.RunUntilIdle();
4959
4960 EXPECT_EQ(
4961 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
4962 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4963 host_port_pair_.port()));
4964
4965 DVLOG(1) << "Create 2nd and 3rd sessions without timeout";
4966 TestCompletionCallback callback2;
4967 QuicStreamRequest request2(factory_.get());
4968 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
4969 /*cert_verify_flags=*/0, url2_, "GET",
4970 net_log_, callback2.callback()));
4971 QuicChromiumClientSession* session2 = GetActiveSession(server2);
4972
4973 session2->connection()->CloseConnection(
4974 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
4975 // Need to spin the loop now to ensure that
4976 // QuicStreamFactory::OnSessionClosed() runs.
4977 base::RunLoop run_loop2;
4978 run_loop2.RunUntilIdle();
4979 EXPECT_EQ(
4980 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
4981 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4982 host_port_pair_.port()));
4983
4984 TestCompletionCallback callback3;
4985 QuicStreamRequest request3(factory_.get());
4986 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
4987 /*cert_verify_flags=*/0, url3_, "GET",
4988 net_log_, callback3.callback()));
4989 QuicChromiumClientSession* session3 = GetActiveSession(server3);
4990
4991 session3->connection()->CloseConnection(
4992 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
4993 // Need to spin the loop now to ensure that
4994 // QuicStreamFactory::OnSessionClosed() runs.
4995 base::RunLoop run_loop3;
4996 run_loop3.RunUntilIdle();
4997 EXPECT_EQ(
4998 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
4999 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
5000 host_port_pair_.port()));
5001
5002 DVLOG(1) << "Create 4th session with timeout with open streams,"
5003 << " will not disable QUIC";
5004
5005 TestCompletionCallback callback4;
5006 QuicStreamRequest request4(factory_.get());
5007 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
5008 /*cert_verify_flags=*/0, url4_, "GET",
5009 net_log_, callback4.callback()));
5010 QuicChromiumClientSession* session4 = GetActiveSession(server4);
5011
5012 std::unique_ptr<QuicHttpStream> stream4 = request4.CreateStream();
5013 EXPECT_TRUE(stream4.get());
5014 EXPECT_EQ(OK, stream4->InitializeStream(&request_info, DEFAULT_PRIORITY,
5015 net_log_, CompletionCallback()));
5016 session4->connection()->CloseConnection(
5017 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
5018 // Need to spin the loop now to ensure that
5019 // QuicStreamFactory::OnSessionClosed() runs.
5020 base::RunLoop run_loop4;
5021 run_loop4.RunUntilIdle();
5022 EXPECT_EQ(
5023 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
5024 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
5025 host_port_pair_.port()));
5026
5027 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
5028 EXPECT_FALSE(stream2.get()); // Session is already closed.
5029 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
5030 EXPECT_FALSE(stream3.get()); // Session is already closed.
5031
5032 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5033 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5034 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
5035 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
5036 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
5037 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
5038 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
5039 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
5040 }
5041
5042 TEST_P(QuicStreamFactoryTest, EnableDelayTcpRace) { 4115 TEST_P(QuicStreamFactoryTest, EnableDelayTcpRace) {
5043 Initialize(); 4116 Initialize();
5044 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 4117 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5045 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 4118 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5046 bool delay_tcp_race = QuicStreamFactoryPeer::GetDelayTcpRace(factory_.get()); 4119 bool delay_tcp_race = QuicStreamFactoryPeer::GetDelayTcpRace(factory_.get());
5047 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), false); 4120 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), false);
5048 MockQuicData socket_data; 4121 MockQuicData socket_data;
5049 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 4122 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5050 socket_data.AddSocketDataToFactory(&socket_factory_); 4123 socket_data.AddSocketDataToFactory(&socket_factory_);
5051 4124
(...skipping 859 matching lines...) Expand 10 before | Expand all | Expand 10 after
5911 // Clear all cached states. 4984 // Clear all cached states.
5912 factory_->ClearCachedStatesInCryptoConfig( 4985 factory_->ClearCachedStatesInCryptoConfig(
5913 base::Callback<bool(const GURL&)>()); 4986 base::Callback<bool(const GURL&)>());
5914 EXPECT_TRUE(test_cases[0].state->certs().empty()); 4987 EXPECT_TRUE(test_cases[0].state->certs().empty());
5915 EXPECT_TRUE(test_cases[1].state->certs().empty()); 4988 EXPECT_TRUE(test_cases[1].state->certs().empty());
5916 EXPECT_TRUE(test_cases[2].state->certs().empty()); 4989 EXPECT_TRUE(test_cases[2].state->certs().empty());
5917 } 4990 }
5918 4991
5919 } // namespace test 4992 } // namespace test
5920 } // namespace net 4993 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/chromium/quic_stream_factory.cc ('k') | net/quic/test_tools/quic_stream_factory_peer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698