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

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

Issue 2320313003: Revert of Remove obsolete QUIC disabling code. (Closed)
Patch Set: 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";
93 const char kDifferentHostname[] = "different.example.com"; 95 const char kDifferentHostname[] = "different.example.com";
94 const int kDefaultServerPort = 443; 96 const int kDefaultServerPort = 443;
95 const char kDefaultUrl[] = "https://www.example.org/"; 97 const char kDefaultUrl[] = "https://www.example.org/";
96 const char kServer2Url[] = "https://mail.example.org/"; 98 const char kServer2Url[] = "https://mail.example.org/";
97 const char kServer3Url[] = "https://docs.example.org/"; 99 const char kServer3Url[] = "https://docs.example.org/";
98 const char kServer4Url[] = "https://images.example.org/"; 100 const char kServer4Url[] = "https://images.example.org/";
99 101
100 // Run QuicStreamFactoryTest instances with all value combinations of version 102 // Run QuicStreamFactoryTest instances with all value combinations of version
101 // and enable_connection_racting. 103 // and enable_connection_racting.
102 struct TestParams { 104 struct TestParams {
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 url4_(kServer4Url), 242 url4_(kServer4Url),
241 privacy_mode_(PRIVACY_MODE_DISABLED), 243 privacy_mode_(PRIVACY_MODE_DISABLED),
242 enable_port_selection_(true), 244 enable_port_selection_(true),
243 always_require_handshake_confirmation_(false), 245 always_require_handshake_confirmation_(false),
244 disable_connection_pooling_(false), 246 disable_connection_pooling_(false),
245 load_server_info_timeout_srtt_multiplier_(0.0f), 247 load_server_info_timeout_srtt_multiplier_(0.0f),
246 enable_connection_racing_(enable_connection_racing), 248 enable_connection_racing_(enable_connection_racing),
247 enable_non_blocking_io_(true), 249 enable_non_blocking_io_(true),
248 disable_disk_cache_(false), 250 disable_disk_cache_(false),
249 prefer_aes_(false), 251 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),
250 receive_buffer_size_(0), 257 receive_buffer_size_(0),
251 delay_tcp_race_(true), 258 delay_tcp_race_(true),
252 close_sessions_on_ip_change_(false), 259 close_sessions_on_ip_change_(false),
253 disable_quic_on_timeout_with_open_streams_(false), 260 disable_quic_on_timeout_with_open_streams_(false),
254 idle_connection_timeout_seconds_(kIdleConnectionTimeoutSeconds), 261 idle_connection_timeout_seconds_(kIdleConnectionTimeoutSeconds),
255 reduced_ping_timeout_seconds_(kPingTimeoutSecs), 262 reduced_ping_timeout_seconds_(kPingTimeoutSecs),
256 packet_reader_yield_after_duration_milliseconds_( 263 packet_reader_yield_after_duration_milliseconds_(
257 kQuicYieldAfterDurationMilliseconds), 264 kQuicYieldAfterDurationMilliseconds),
258 migrate_sessions_on_network_change_(false), 265 migrate_sessions_on_network_change_(false),
259 migrate_sessions_early_(false), 266 migrate_sessions_early_(false),
(...skipping 16 matching lines...) Expand all
276 net_log_.net_log(), &host_resolver_, ssl_config_service_.get(), 283 net_log_.net_log(), &host_resolver_, ssl_config_service_.get(),
277 &socket_factory_, &http_server_properties_, cert_verifier_.get(), 284 &socket_factory_, &http_server_properties_, cert_verifier_.get(),
278 &ct_policy_enforcer_, channel_id_service_.get(), 285 &ct_policy_enforcer_, channel_id_service_.get(),
279 &transport_security_state_, cert_transparency_verifier_.get(), 286 &transport_security_state_, cert_transparency_verifier_.get(),
280 /*SocketPerformanceWatcherFactory*/ nullptr, 287 /*SocketPerformanceWatcherFactory*/ nullptr,
281 &crypto_client_stream_factory_, &random_generator_, clock_, 288 &crypto_client_stream_factory_, &random_generator_, clock_,
282 kDefaultMaxPacketSize, string(), SupportedVersions(version_), 289 kDefaultMaxPacketSize, string(), SupportedVersions(version_),
283 enable_port_selection_, always_require_handshake_confirmation_, 290 enable_port_selection_, always_require_handshake_confirmation_,
284 disable_connection_pooling_, load_server_info_timeout_srtt_multiplier_, 291 disable_connection_pooling_, load_server_info_timeout_srtt_multiplier_,
285 enable_connection_racing_, enable_non_blocking_io_, disable_disk_cache_, 292 enable_connection_racing_, enable_non_blocking_io_, disable_disk_cache_,
286 prefer_aes_, receive_buffer_size_, delay_tcp_race_, 293 prefer_aes_, max_number_of_lossy_connections_, packet_loss_threshold_,
287 /*max_server_configs_stored_in_properties*/ 0, 294 max_disabled_reasons_, threshold_timeouts_with_open_streams_,
295 threshold_public_resets_post_handshake_, receive_buffer_size_,
296 delay_tcp_race_, /*max_server_configs_stored_in_properties*/ 0,
288 close_sessions_on_ip_change_, 297 close_sessions_on_ip_change_,
289 disable_quic_on_timeout_with_open_streams_, 298 disable_quic_on_timeout_with_open_streams_,
290 idle_connection_timeout_seconds_, reduced_ping_timeout_seconds_, 299 idle_connection_timeout_seconds_, reduced_ping_timeout_seconds_,
291 packet_reader_yield_after_duration_milliseconds_, 300 packet_reader_yield_after_duration_milliseconds_,
292 migrate_sessions_on_network_change_, migrate_sessions_early_, 301 migrate_sessions_on_network_change_, migrate_sessions_early_,
293 allow_server_migration_, force_hol_blocking_, race_cert_verification_, 302 allow_server_migration_, force_hol_blocking_, race_cert_verification_,
294 /*do_not_fragment*/ true, QuicTagVector(), 303 /*do_not_fragment*/ true, QuicTagVector(),
295 /*enable_token_binding*/ false)); 304 /*enable_token_binding*/ false));
296 factory_->set_require_confirmation(false); 305 factory_->set_require_confirmation(false);
297 EXPECT_FALSE(factory_->has_quic_server_info_factory()); 306 EXPECT_FALSE(factory_->has_quic_server_info_factory());
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
529 538
530 // Variables to configure QuicStreamFactory. 539 // Variables to configure QuicStreamFactory.
531 bool enable_port_selection_; 540 bool enable_port_selection_;
532 bool always_require_handshake_confirmation_; 541 bool always_require_handshake_confirmation_;
533 bool disable_connection_pooling_; 542 bool disable_connection_pooling_;
534 double load_server_info_timeout_srtt_multiplier_; 543 double load_server_info_timeout_srtt_multiplier_;
535 bool enable_connection_racing_; 544 bool enable_connection_racing_;
536 bool enable_non_blocking_io_; 545 bool enable_non_blocking_io_;
537 bool disable_disk_cache_; 546 bool disable_disk_cache_;
538 bool prefer_aes_; 547 bool prefer_aes_;
548 int max_number_of_lossy_connections_;
549 double packet_loss_threshold_;
550 int max_disabled_reasons_;
551 int threshold_timeouts_with_open_streams_;
552 int threshold_public_resets_post_handshake_;
539 int receive_buffer_size_; 553 int receive_buffer_size_;
540 bool delay_tcp_race_; 554 bool delay_tcp_race_;
541 bool close_sessions_on_ip_change_; 555 bool close_sessions_on_ip_change_;
542 bool disable_quic_on_timeout_with_open_streams_; 556 bool disable_quic_on_timeout_with_open_streams_;
543 int idle_connection_timeout_seconds_; 557 int idle_connection_timeout_seconds_;
544 int reduced_ping_timeout_seconds_; 558 int reduced_ping_timeout_seconds_;
545 int packet_reader_yield_after_duration_milliseconds_; 559 int packet_reader_yield_after_duration_milliseconds_;
546 bool migrate_sessions_on_network_change_; 560 bool migrate_sessions_on_network_change_;
547 bool migrate_sessions_early_; 561 bool migrate_sessions_early_;
548 bool allow_server_migration_; 562 bool allow_server_migration_;
(...skipping 2630 matching lines...) Expand 10 before | Expand all | Expand 10 after
3179 // If we are waiting for disk cache, we would have posted a task. Verify that 3193 // If we are waiting for disk cache, we would have posted a task. Verify that
3180 // the CancelWaitForDataReady task hasn't been posted. 3194 // the CancelWaitForDataReady task hasn't been posted.
3181 ASSERT_EQ(0u, runner_->GetPostedTasks().size()); 3195 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
3182 3196
3183 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); 3197 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
3184 EXPECT_TRUE(stream.get()); 3198 EXPECT_TRUE(stream.get());
3185 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 3199 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3186 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 3200 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3187 } 3201 }
3188 3202
3189 TEST_P(QuicStreamFactoryTest, ReducePingTimeoutOnConnectionTimeOutOpenStreams) { 3203 TEST_P(QuicStreamFactoryTest, BadPacketLoss) {
3190 reduced_ping_timeout_seconds_ = 10; 3204 disable_disk_cache_ = false;
3191 disable_disk_cache_ = true; 3205 max_number_of_lossy_connections_ = 2;
3192 Initialize(); 3206 Initialize();
3193 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 3207 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3194 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 3208 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3195 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 3209 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3210 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3211 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3196 3212
3197 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get()); 3213 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3198 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get())); 3214
3215 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3216 host_port_pair_.port()));
3217 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
3218 factory_.get(), host_port_pair_.port()));
3199 3219
3200 MockQuicData socket_data; 3220 MockQuicData socket_data;
3201 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 3221 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3222 socket_data.AddSocketDataToFactory(&socket_factory_);
3223
3224 MockQuicData socket_data2;
3225 socket_data2.AddSocketDataToFactory(&socket_factory_);
3226
3227 MockQuicData socket_data3;
3228 socket_data3.AddSocketDataToFactory(&socket_factory_);
3229
3230 MockQuicData socket_data4;
3231 socket_data4.AddSocketDataToFactory(&socket_factory_);
3232
3233 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3234 HostPortPair server3(kServer3HostName, kDefaultServerPort);
3235 HostPortPair server4(kServer4HostName, kDefaultServerPort);
3236
3237 crypto_client_stream_factory_.set_handshake_mode(
3238 MockCryptoClientStream::ZERO_RTT);
3239 host_resolver_.set_synchronous_mode(true);
3240 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3241 "192.168.0.1", "");
3242 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3243 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3244 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
3245
3246 QuicStreamRequest request(factory_.get());
3247 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
3248 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3249 callback_.callback()));
3250
3251 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3252
3253 DVLOG(1) << "Create 1st session and test packet loss";
3254
3255 // Set packet_loss_rate to a lower value than packet_loss_threshold.
3256 EXPECT_FALSE(
3257 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/0.9f));
3258 EXPECT_TRUE(session->connection()->connected());
3259 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3260 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3261 host_port_pair_.port()));
3262 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
3263 factory_.get(), host_port_pair_.port()));
3264
3265 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
3266 // and that shouldn't close the session and it shouldn't disable QUIC.
3267 EXPECT_FALSE(
3268 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/1.0f));
3269 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
3270 factory_.get(), host_port_pair_.port()));
3271 EXPECT_TRUE(session->connection()->connected());
3272 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3273 host_port_pair_.port()));
3274 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3275
3276 // Test N-in-a-row high packet loss connections.
3277
3278 DVLOG(1) << "Create 2nd session and test packet loss";
3279
3280 TestCompletionCallback callback2;
3281 QuicStreamRequest request2(factory_.get());
3282 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
3283 /*cert_verify_flags=*/0, url2_, "GET",
3284 net_log_, callback2.callback()));
3285 QuicChromiumClientSession* session2 = GetActiveSession(server2);
3286
3287 // If there is no packet loss during handshake confirmation, number of lossy
3288 // connections for the port should be 0.
3289 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
3290 factory_.get(), server2.port()));
3291 EXPECT_FALSE(
3292 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/0.9f));
3293 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
3294 factory_.get(), server2.port()));
3295 EXPECT_FALSE(
3296 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
3297
3298 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
3299 // and that shouldn't close the session and it shouldn't disable QUIC.
3300 EXPECT_FALSE(
3301 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/1.0f));
3302 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
3303 factory_.get(), server2.port()));
3304 EXPECT_TRUE(session2->connection()->connected());
3305 EXPECT_FALSE(
3306 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
3307 EXPECT_TRUE(HasActiveSession(server2));
3308
3309 DVLOG(1) << "Create 3rd session which also has packet loss";
3310
3311 TestCompletionCallback callback3;
3312 QuicStreamRequest request3(factory_.get());
3313 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
3314 /*cert_verify_flags=*/0, url3_, "GET",
3315 net_log_, callback3.callback()));
3316 QuicChromiumClientSession* session3 = GetActiveSession(server3);
3317
3318 DVLOG(1) << "Create 4th session with packet loss and test IsQuicDisabled()";
3319 TestCompletionCallback callback4;
3320 QuicStreamRequest request4(factory_.get());
3321 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
3322 /*cert_verify_flags=*/0, url4_, "GET",
3323 net_log_, callback4.callback()));
3324 QuicChromiumClientSession* session4 = GetActiveSession(server4);
3325
3326 // Set packet_loss_rate to higher value than packet_loss_threshold 2nd time in
3327 // a row and that should close the session and disable QUIC.
3328 EXPECT_TRUE(
3329 factory_->OnHandshakeConfirmed(session3, /*packet_loss_rate=*/1.0f));
3330 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
3331 factory_.get(), server3.port()));
3332 EXPECT_FALSE(session3->connection()->connected());
3333 EXPECT_TRUE(
3334 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server3.port()));
3335 EXPECT_FALSE(HasActiveSession(server3));
3336
3337 // Set packet_loss_rate to higher value than packet_loss_threshold 3rd time in
3338 // a row and IsQuicDisabled() should close the session.
3339 EXPECT_TRUE(
3340 factory_->OnHandshakeConfirmed(session4, /*packet_loss_rate=*/1.0f));
3341 EXPECT_EQ(3, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
3342 factory_.get(), server4.port()));
3343 EXPECT_FALSE(session4->connection()->connected());
3344 EXPECT_TRUE(
3345 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server4.port()));
3346 EXPECT_FALSE(HasActiveSession(server4));
3347
3348 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
3349 EXPECT_TRUE(stream.get());
3350 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
3351 EXPECT_TRUE(stream2.get());
3352 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
3353 EXPECT_TRUE(stream3.get());
3354 std::unique_ptr<QuicHttpStream> stream4 = request4.CreateStream();
3355 EXPECT_TRUE(stream4.get());
3356 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3357 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3358 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3359 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3360 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3361 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3362 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
3363 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
3364 }
3365
3366 TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfTwo) {
3367 disable_disk_cache_ = false;
3368 threshold_public_resets_post_handshake_ = 2;
3369 Initialize();
3370 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3371 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3372 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3373 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3374
3375 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3376 host_port_pair_.port()));
3377 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
3378 factory_.get(), host_port_pair_.port()));
3379
3380 MockQuicData socket_data;
3381 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3202 socket_data.AddSocketDataToFactory(&socket_factory_); 3382 socket_data.AddSocketDataToFactory(&socket_factory_);
3203 3383
3204 MockQuicData socket_data2; 3384 MockQuicData socket_data2;
3205 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 3385 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3206 socket_data2.AddSocketDataToFactory(&socket_factory_); 3386 socket_data2.AddSocketDataToFactory(&socket_factory_);
3207 3387
3208 HostPortPair server2(kServer2HostName, kDefaultServerPort); 3388 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3209 3389
3210 crypto_client_stream_factory_.set_handshake_mode( 3390 crypto_client_stream_factory_.set_handshake_mode(
3211 MockCryptoClientStream::CONFIRM_HANDSHAKE); 3391 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3212 host_resolver_.set_synchronous_mode(true); 3392 host_resolver_.set_synchronous_mode(true);
3213 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(), 3393 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3214 "192.168.0.1", ""); 3394 "192.168.0.1", "");
3215 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); 3395 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3216 3396
3217 // Quic should use default PING timeout when no previous connection times out
3218 // with open stream.
3219 EXPECT_EQ(QuicTime::Delta::FromSeconds(kPingTimeoutSecs),
3220 QuicStreamFactoryPeer::GetPingTimeout(factory_.get()));
3221 QuicStreamRequest request(factory_.get()); 3397 QuicStreamRequest request(factory_.get());
3222 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_, 3398 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
3223 /*cert_verify_flags=*/0, url_, "GET", net_log_, 3399 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3224 callback_.callback())); 3400 callback_.callback()));
3225 3401
3226 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); 3402 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3227 EXPECT_EQ(QuicTime::Delta::FromSeconds(kPingTimeoutSecs), 3403
3228 session->connection()->ping_timeout()); 3404 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
3405 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
3406 ConnectionCloseBehavior::SILENT_CLOSE);
3407 // Need to spin the loop now to ensure that
3408 // QuicStreamFactory::OnSessionClosed() runs.
3409 base::RunLoop run_loop;
3410 run_loop.RunUntilIdle();
3411
3412 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3413 factory_.get()));
3414 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3415 host_port_pair_.port()));
3416
3417 // Test two-in-a-row public reset post handshakes..
3418 DVLOG(1) << "Create 2nd session and trigger public reset post handshake";
3419 TestCompletionCallback callback2;
3420 QuicStreamRequest request2(factory_.get());
3421 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
3422 /*cert_verify_flags=*/0, url2_, "GET",
3423 net_log_, callback2.callback()));
3424 QuicChromiumClientSession* session2 = GetActiveSession(server2);
3425
3426 session2->connection()->CloseConnection(
3427 QUIC_PUBLIC_RESET, "test", ConnectionCloseBehavior::SILENT_CLOSE);
3428 // Need to spin the loop now to ensure that
3429 // QuicStreamFactory::OnSessionClosed() runs.
3430 base::RunLoop run_loop2;
3431 run_loop2.RunUntilIdle();
3432 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3433 factory_.get()));
3434 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3435 host_port_pair_.port()));
3436 EXPECT_EQ(
3437 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
3438 factory_->QuicDisabledReason(host_port_pair_.port()));
3439
3440 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
3441 EXPECT_FALSE(stream.get()); // Session is already closed.
3442 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
3443 EXPECT_FALSE(stream2.get()); // Session is already closed.
3444 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3445 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3446 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3447 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3448 }
3449
3450 TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfTwo) {
3451 disable_disk_cache_ = true;
3452 threshold_timeouts_with_open_streams_ = 2;
3453 Initialize();
3454 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3455 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3456 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3457
3458 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3459 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3460 host_port_pair_.port()));
3461 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
3462 factory_.get(), host_port_pair_.port()));
3463
3464 MockQuicData socket_data;
3465 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3466 socket_data.AddSocketDataToFactory(&socket_factory_);
3467
3468 MockQuicData socket_data2;
3469 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3470 socket_data2.AddSocketDataToFactory(&socket_factory_);
3471
3472 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3473
3474 crypto_client_stream_factory_.set_handshake_mode(
3475 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3476 host_resolver_.set_synchronous_mode(true);
3477 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3478 "192.168.0.1", "");
3479 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3480
3481 QuicStreamRequest request(factory_.get());
3482 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
3483 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3484 callback_.callback()));
3485
3486 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3229 3487
3230 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); 3488 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
3231 EXPECT_TRUE(stream.get()); 3489 EXPECT_TRUE(stream.get());
3232 HttpRequestInfo request_info; 3490 HttpRequestInfo request_info;
3233 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, 3491 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3234 net_log_, CompletionCallback())); 3492 net_log_, CompletionCallback()));
3235 3493
3236 DVLOG(1) 3494 DVLOG(1)
3237 << "Created 1st session and initialized a stream. Now trigger timeout"; 3495 << "Created 1st session and initialized a stream. Now trigger timeout";
3238 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test", 3496 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
3239 ConnectionCloseBehavior::SILENT_CLOSE); 3497 ConnectionCloseBehavior::SILENT_CLOSE);
3240 // Need to spin the loop now to ensure that 3498 // Need to spin the loop now to ensure that
3241 // QuicStreamFactory::OnSessionClosed() runs. 3499 // QuicStreamFactory::OnSessionClosed() runs.
3242 base::RunLoop run_loop; 3500 base::RunLoop run_loop;
3243 run_loop.RunUntilIdle(); 3501 run_loop.RunUntilIdle();
3244 3502
3245 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get())); 3503 EXPECT_EQ(
3504 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3505 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3506 host_port_pair_.port()));
3507
3508 // Test two-in-a-row timeouts with open streams.
3509 DVLOG(1) << "Create 2nd session and timeout with open stream";
3510 TestCompletionCallback callback2;
3511 QuicStreamRequest request2(factory_.get());
3512 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
3513 /*cert_verify_flags=*/0, url2_, "GET",
3514 net_log_, callback2.callback()));
3515 QuicChromiumClientSession* session2 = GetActiveSession(server2);
3516
3517 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
3518 EXPECT_TRUE(stream2.get());
3519 EXPECT_EQ(OK, stream2->InitializeStream(&request_info, DEFAULT_PRIORITY,
3520 net_log_, CompletionCallback()));
3521
3522 session2->connection()->CloseConnection(
3523 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
3524 // Need to spin the loop now to ensure that
3525 // QuicStreamFactory::OnSessionClosed() runs.
3526 base::RunLoop run_loop2;
3527 run_loop2.RunUntilIdle();
3528 EXPECT_EQ(
3529 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3530 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3531 host_port_pair_.port()));
3532 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
3533 factory_->QuicDisabledReason(host_port_pair_.port()));
3534
3535 // Verify that QUIC is un-disabled after a TCP job fails.
3536 factory_->OnTcpJobCompleted(/*succeeded=*/false);
3537 EXPECT_EQ(
3538 0, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3539 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3540 host_port_pair_.port()));
3541
3542 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3543 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3544 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3545 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3546 }
3547
3548 TEST_P(QuicStreamFactoryTest, ReducePingTimeoutOnConnectionTimeOutOpenStreams) {
3549 reduced_ping_timeout_seconds_ = 10;
3550 disable_disk_cache_ = true;
3551 threshold_timeouts_with_open_streams_ = 2;
3552 Initialize();
3553 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3554 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3555 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3556
3557 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3558 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3559 host_port_pair_.port()));
3560 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
3561 factory_.get(), host_port_pair_.port()));
3562
3563 MockQuicData socket_data;
3564 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3565 socket_data.AddSocketDataToFactory(&socket_factory_);
3566
3567 MockQuicData socket_data2;
3568 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3569 socket_data2.AddSocketDataToFactory(&socket_factory_);
3570
3571 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3572
3573 crypto_client_stream_factory_.set_handshake_mode(
3574 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3575 host_resolver_.set_synchronous_mode(true);
3576 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3577 "192.168.0.1", "");
3578 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3579
3580 // Quic should use default PING timeout when no previous connection times out
3581 // with open stream.
3582 EXPECT_EQ(QuicTime::Delta::FromSeconds(kPingTimeoutSecs),
3583 QuicStreamFactoryPeer::GetPingTimeout(factory_.get()));
3584 QuicStreamRequest request(factory_.get());
3585 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
3586 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3587 callback_.callback()));
3588
3589 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3590 EXPECT_EQ(QuicTime::Delta::FromSeconds(kPingTimeoutSecs),
3591 session->connection()->ping_timeout());
3592
3593 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
3594 EXPECT_TRUE(stream.get());
3595 HttpRequestInfo request_info;
3596 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3597 net_log_, CompletionCallback()));
3598
3599 DVLOG(1)
3600 << "Created 1st session and initialized a stream. Now trigger timeout";
3601 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
3602 ConnectionCloseBehavior::SILENT_CLOSE);
3603 // Need to spin the loop now to ensure that
3604 // QuicStreamFactory::OnSessionClosed() runs.
3605 base::RunLoop run_loop;
3606 run_loop.RunUntilIdle();
3607
3608 EXPECT_EQ(
3609 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3610 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3611 host_port_pair_.port()));
3246 3612
3247 // The first connection times out with open stream, QUIC should reduce initial 3613 // The first connection times out with open stream, QUIC should reduce initial
3248 // PING time for subsequent connections. 3614 // PING time for subsequent connections.
3249 EXPECT_EQ(QuicTime::Delta::FromSeconds(10), 3615 EXPECT_EQ(QuicTime::Delta::FromSeconds(10),
3250 QuicStreamFactoryPeer::GetPingTimeout(factory_.get())); 3616 QuicStreamFactoryPeer::GetPingTimeout(factory_.get()));
3251 3617
3252 // Test two-in-a-row timeouts with open streams. 3618 // Test two-in-a-row timeouts with open streams.
3253 DVLOG(1) << "Create 2nd session and timeout with open stream"; 3619 DVLOG(1) << "Create 2nd session and timeout with open stream";
3254 TestCompletionCallback callback2; 3620 TestCompletionCallback callback2;
3255 QuicStreamRequest request2(factory_.get()); 3621 QuicStreamRequest request2(factory_.get());
3256 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_, 3622 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
3257 /*cert_verify_flags=*/0, url2_, "GET", 3623 /*cert_verify_flags=*/0, url2_, "GET",
3258 net_log_, callback2.callback())); 3624 net_log_, callback2.callback()));
3259 QuicChromiumClientSession* session2 = GetActiveSession(server2); 3625 QuicChromiumClientSession* session2 = GetActiveSession(server2);
3260 EXPECT_EQ(QuicTime::Delta::FromSeconds(10), 3626 EXPECT_EQ(QuicTime::Delta::FromSeconds(10),
3261 session2->connection()->ping_timeout()); 3627 session2->connection()->ping_timeout());
3262 3628
3263 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream(); 3629 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
3264 EXPECT_TRUE(stream2.get()); 3630 EXPECT_TRUE(stream2.get());
3265 EXPECT_EQ(OK, stream2->InitializeStream(&request_info, DEFAULT_PRIORITY, 3631 EXPECT_EQ(OK, stream2->InitializeStream(&request_info, DEFAULT_PRIORITY,
3266 net_log_, CompletionCallback())); 3632 net_log_, CompletionCallback()));
3267 session2->connection()->CloseConnection( 3633 session2->connection()->CloseConnection(
3268 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE); 3634 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
3269 // Need to spin the loop now to ensure that 3635 // Need to spin the loop now to ensure that
3270 // QuicStreamFactory::OnSessionClosed() runs. 3636 // QuicStreamFactory::OnSessionClosed() runs.
3271 base::RunLoop run_loop2; 3637 base::RunLoop run_loop2;
3272 run_loop2.RunUntilIdle(); 3638 run_loop2.RunUntilIdle();
3273 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get())); 3639 EXPECT_EQ(
3640 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3641 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3642 host_port_pair_.port()));
3643 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
3644 factory_->QuicDisabledReason(host_port_pair_.port()));
3645
3646 // Verify that QUIC is un-disabled after a TCP job fails.
3647 factory_->OnTcpJobCompleted(/*succeeded=*/false);
3648 EXPECT_EQ(
3649 0, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3650 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3651 host_port_pair_.port()));
3274 3652
3275 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 3653 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3276 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 3654 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3277 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); 3655 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3278 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); 3656 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3279 } 3657 }
3280 3658
3659 TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfThree) {
3660 disable_disk_cache_ = true;
3661 threshold_public_resets_post_handshake_ = 2;
3662 Initialize();
3663 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3664 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3665 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3666 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3667
3668 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3669 host_port_pair_.port()));
3670 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
3671 factory_.get(), host_port_pair_.port()));
3672
3673 MockQuicData socket_data;
3674 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3675 socket_data.AddSocketDataToFactory(&socket_factory_);
3676
3677 MockQuicData socket_data2;
3678 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3679 socket_data2.AddSocketDataToFactory(&socket_factory_);
3680
3681 MockQuicData socket_data3;
3682 socket_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3683 socket_data3.AddSocketDataToFactory(&socket_factory_);
3684
3685 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3686 HostPortPair server3(kServer3HostName, kDefaultServerPort);
3687
3688 crypto_client_stream_factory_.set_handshake_mode(
3689 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3690 host_resolver_.set_synchronous_mode(true);
3691 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3692 "192.168.0.1", "");
3693 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3694 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3695
3696 // Test first and third out of three public reset post handshakes.
3697 QuicStreamRequest request(factory_.get());
3698 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
3699 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3700 callback_.callback()));
3701
3702 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3703
3704 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
3705 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
3706 ConnectionCloseBehavior::SILENT_CLOSE);
3707 // Need to spin the loop now to ensure that
3708 // QuicStreamFactory::OnSessionClosed() runs.
3709 base::RunLoop run_loop;
3710 run_loop.RunUntilIdle();
3711
3712 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3713 factory_.get()));
3714 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3715 host_port_pair_.port()));
3716
3717 DVLOG(1) << "Create 2nd session without disable trigger";
3718 TestCompletionCallback callback2;
3719 QuicStreamRequest request2(factory_.get());
3720 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
3721 /*cert_verify_flags=*/0, url2_, "GET",
3722 net_log_, callback2.callback()));
3723 QuicChromiumClientSession* session2 = GetActiveSession(server2);
3724
3725 session2->connection()->CloseConnection(
3726 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
3727 // Need to spin the loop now to ensure that
3728 // QuicStreamFactory::OnSessionClosed() runs.
3729 base::RunLoop run_loop2;
3730 run_loop2.RunUntilIdle();
3731 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3732 factory_.get()));
3733 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3734 host_port_pair_.port()));
3735
3736 DVLOG(1) << "Create 3rd session with public reset post handshake,"
3737 << " will disable QUIC";
3738 TestCompletionCallback callback3;
3739 QuicStreamRequest request3(factory_.get());
3740 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
3741 /*cert_verify_flags=*/0, url3_, "GET",
3742 net_log_, callback3.callback()));
3743 QuicChromiumClientSession* session3 = GetActiveSession(server3);
3744
3745 session3->connection()->CloseConnection(
3746 QUIC_PUBLIC_RESET, "test", ConnectionCloseBehavior::SILENT_CLOSE);
3747 // Need to spin the loop now to ensure that
3748 // QuicStreamFactory::OnSessionClosed() runs.
3749 base::RunLoop run_loop3;
3750 run_loop3.RunUntilIdle();
3751 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3752 factory_.get()));
3753 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3754 host_port_pair_.port()));
3755 EXPECT_EQ(
3756 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
3757 factory_->QuicDisabledReason(host_port_pair_.port()));
3758
3759 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
3760 EXPECT_FALSE(stream.get()); // Session is already closed.
3761 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
3762 EXPECT_FALSE(stream2.get()); // Session is already closed.
3763 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
3764 EXPECT_FALSE(stream3.get()); // Session is already closed.
3765
3766 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3767 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3768 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3769 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3770 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3771 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3772 }
3773
3774 TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfThree) {
3775 disable_disk_cache_ = true;
3776 threshold_public_resets_post_handshake_ = 2;
3777 Initialize();
3778 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3779 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3780 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3781 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3782 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3783
3784 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3785 host_port_pair_.port()));
3786 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
3787 factory_.get(), host_port_pair_.port()));
3788
3789 MockQuicData socket_data;
3790 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3791 socket_data.AddSocketDataToFactory(&socket_factory_);
3792
3793 MockQuicData socket_data2;
3794 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3795 socket_data2.AddSocketDataToFactory(&socket_factory_);
3796
3797 MockQuicData socket_data3;
3798 socket_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3799 socket_data3.AddSocketDataToFactory(&socket_factory_);
3800
3801 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3802 HostPortPair server3(kServer3HostName, kDefaultServerPort);
3803
3804 crypto_client_stream_factory_.set_handshake_mode(
3805 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3806 host_resolver_.set_synchronous_mode(true);
3807 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3808 "192.168.0.1", "");
3809 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3810 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3811
3812 // Test first and third out of three timeouts with open streams.
3813 QuicStreamRequest request(factory_.get());
3814 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
3815 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3816 callback_.callback()));
3817
3818 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3819
3820 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
3821 EXPECT_TRUE(stream.get());
3822 HttpRequestInfo request_info;
3823 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3824 net_log_, CompletionCallback()));
3825
3826 DVLOG(1)
3827 << "Created 1st session and initialized a stream. Now trigger timeout";
3828 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
3829 ConnectionCloseBehavior::SILENT_CLOSE);
3830 // Need to spin the loop now to ensure that
3831 // QuicStreamFactory::OnSessionClosed() runs.
3832 base::RunLoop run_loop;
3833 run_loop.RunUntilIdle();
3834
3835 EXPECT_EQ(
3836 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3837 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3838 host_port_pair_.port()));
3839
3840 // Test two-in-a-row timeouts with open streams.
3841 DVLOG(1) << "Create 2nd session without timeout";
3842 TestCompletionCallback callback2;
3843 QuicStreamRequest request2(factory_.get());
3844 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
3845 /*cert_verify_flags=*/0, url2_, "GET",
3846 net_log_, callback2.callback()));
3847 QuicChromiumClientSession* session2 = GetActiveSession(server2);
3848
3849 session2->connection()->CloseConnection(
3850 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
3851 // Need to spin the loop now to ensure that
3852 // QuicStreamFactory::OnSessionClosed() runs.
3853 base::RunLoop run_loop2;
3854 run_loop2.RunUntilIdle();
3855 EXPECT_EQ(
3856 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3857 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3858 host_port_pair_.port()));
3859
3860 DVLOG(1) << "Create 3rd session with timeout with open streams,"
3861 << " will disable QUIC";
3862
3863 TestCompletionCallback callback3;
3864 QuicStreamRequest request3(factory_.get());
3865 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
3866 /*cert_verify_flags=*/0, url3_, "GET",
3867 net_log_, callback3.callback()));
3868 QuicChromiumClientSession* session3 = GetActiveSession(server3);
3869
3870 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
3871 EXPECT_TRUE(stream3.get());
3872 EXPECT_EQ(OK, stream3->InitializeStream(&request_info, DEFAULT_PRIORITY,
3873 net_log_, CompletionCallback()));
3874 session3->connection()->CloseConnection(
3875 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
3876 // Need to spin the loop now to ensure that
3877 // QuicStreamFactory::OnSessionClosed() runs.
3878 base::RunLoop run_loop3;
3879 run_loop3.RunUntilIdle();
3880 EXPECT_EQ(
3881 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3882 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3883 host_port_pair_.port()));
3884 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
3885 factory_->QuicDisabledReason(host_port_pair_.port()));
3886
3887 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
3888 EXPECT_FALSE(stream2.get()); // Session is already closed.
3889
3890 // Verify that QUIC is un-disabled after a network change.
3891 factory_->OnIPAddressChanged();
3892 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3893 host_port_pair_.port()));
3894 EXPECT_EQ(
3895 0, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3896
3897 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3898 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3899 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3900 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3901 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3902 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3903 }
3904
3281 TEST_P(QuicStreamFactoryTest, DisableQuicWhenTimeoutsWithOpenStreams) { 3905 TEST_P(QuicStreamFactoryTest, DisableQuicWhenTimeoutsWithOpenStreams) {
3282 disable_disk_cache_ = true; 3906 disable_disk_cache_ = true;
3283 disable_quic_on_timeout_with_open_streams_ = true; 3907 disable_quic_on_timeout_with_open_streams_ = true;
3284 Initialize(); 3908 Initialize();
3285 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 3909 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3286 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 3910 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3287 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get()); 3911 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3288 3912
3289 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get())); 3913 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3914 host_port_pair_.port()));
3915 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
3916 factory_.get(), host_port_pair_.port()));
3290 3917
3291 MockQuicData socket_data; 3918 MockQuicData socket_data;
3292 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 3919 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3293 socket_data.AddSocketDataToFactory(&socket_factory_); 3920 socket_data.AddSocketDataToFactory(&socket_factory_);
3294 3921
3295 crypto_client_stream_factory_.set_handshake_mode( 3922 crypto_client_stream_factory_.set_handshake_mode(
3296 MockCryptoClientStream::CONFIRM_HANDSHAKE); 3923 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3297 host_resolver_.set_synchronous_mode(true); 3924 host_resolver_.set_synchronous_mode(true);
3298 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(), 3925 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3299 "192.168.0.1", ""); 3926 "192.168.0.1", "");
(...skipping 15 matching lines...) Expand all
3315 DVLOG(1) 3942 DVLOG(1)
3316 << "Created 1st session and initialized a stream. Now trigger timeout." 3943 << "Created 1st session and initialized a stream. Now trigger timeout."
3317 << "Will disable QUIC."; 3944 << "Will disable QUIC.";
3318 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test", 3945 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
3319 ConnectionCloseBehavior::SILENT_CLOSE); 3946 ConnectionCloseBehavior::SILENT_CLOSE);
3320 // Need to spin the loop now to ensure that 3947 // Need to spin the loop now to ensure that
3321 // QuicStreamFactory::OnSessionClosed() runs. 3948 // QuicStreamFactory::OnSessionClosed() runs.
3322 base::RunLoop run_loop; 3949 base::RunLoop run_loop;
3323 run_loop.RunUntilIdle(); 3950 run_loop.RunUntilIdle();
3324 3951
3325 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get())); 3952 EXPECT_EQ(
3953 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3954 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3955 host_port_pair_.port()));
3956
3957 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
3958 factory_->QuicDisabledReason(host_port_pair_.port()));
3326 3959
3327 // Verify that QUIC is fully disabled after a TCP job succeeds. 3960 // Verify that QUIC is fully disabled after a TCP job succeeds.
3328 factory_->OnTcpJobCompleted(/*succeeded=*/true); 3961 factory_->OnTcpJobCompleted(/*succeeded=*/true);
3329 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get())); 3962 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3963 host_port_pair_.port()));
3330 3964
3331 // Verify that QUIC stays disabled after a TCP job succeeds. 3965 // Verify that QUIC stays disabled after a TCP job succeeds.
3332 factory_->OnTcpJobCompleted(/*succeeded=*/false); 3966 factory_->OnTcpJobCompleted(/*succeeded=*/false);
3333 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get())); 3967 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3968 host_port_pair_.port()));
3334 3969
3335 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 3970 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3336 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 3971 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3337 } 3972 }
3338 3973
3974 TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfFour) {
3975 disable_disk_cache_ = true;
3976 threshold_public_resets_post_handshake_ = 2;
3977 Initialize();
3978 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3979 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3980 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3981 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3982 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3983 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3984
3985 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3986 host_port_pair_.port()));
3987 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
3988 factory_.get(), host_port_pair_.port()));
3989
3990 MockQuicData socket_data;
3991 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3992 socket_data.AddSocketDataToFactory(&socket_factory_);
3993
3994 MockQuicData socket_data2;
3995 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3996 socket_data2.AddSocketDataToFactory(&socket_factory_);
3997
3998 MockQuicData socket_data3;
3999 socket_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4000 socket_data3.AddSocketDataToFactory(&socket_factory_);
4001
4002 MockQuicData socket_data4;
4003 socket_data4.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4004 socket_data4.AddSocketDataToFactory(&socket_factory_);
4005
4006 HostPortPair server2(kServer2HostName, kDefaultServerPort);
4007 HostPortPair server3(kServer3HostName, kDefaultServerPort);
4008 HostPortPair server4(kServer4HostName, kDefaultServerPort);
4009
4010 crypto_client_stream_factory_.set_handshake_mode(
4011 MockCryptoClientStream::CONFIRM_HANDSHAKE);
4012 host_resolver_.set_synchronous_mode(true);
4013 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
4014 "192.168.0.1", "");
4015 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
4016 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
4017 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
4018
4019 // Test first and fourth out of four public reset post handshakes.
4020 QuicStreamRequest request(factory_.get());
4021 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
4022 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4023 callback_.callback()));
4024
4025 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4026
4027 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
4028 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
4029 ConnectionCloseBehavior::SILENT_CLOSE);
4030 // Need to spin the loop now to ensure that
4031 // QuicStreamFactory::OnSessionClosed() runs.
4032 base::RunLoop run_loop;
4033 run_loop.RunUntilIdle();
4034
4035 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
4036 factory_.get()));
4037 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4038 host_port_pair_.port()));
4039
4040 DVLOG(1) << "Create 2nd and 3rd sessions without disable trigger";
4041 TestCompletionCallback callback2;
4042 QuicStreamRequest request2(factory_.get());
4043 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
4044 /*cert_verify_flags=*/0, url2_, "GET",
4045 net_log_, callback2.callback()));
4046 QuicChromiumClientSession* session2 = GetActiveSession(server2);
4047
4048 session2->connection()->CloseConnection(
4049 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
4050 // Need to spin the loop now to ensure that
4051 // QuicStreamFactory::OnSessionClosed() runs.
4052 base::RunLoop run_loop2;
4053 run_loop2.RunUntilIdle();
4054 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
4055 factory_.get()));
4056 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4057 host_port_pair_.port()));
4058
4059 TestCompletionCallback callback3;
4060 QuicStreamRequest request3(factory_.get());
4061 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
4062 /*cert_verify_flags=*/0, url3_, "GET",
4063 net_log_, callback3.callback()));
4064 QuicChromiumClientSession* session3 = GetActiveSession(server3);
4065
4066 session3->connection()->CloseConnection(
4067 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
4068 // Need to spin the loop now to ensure that
4069 // QuicStreamFactory::OnSessionClosed() runs.
4070 base::RunLoop run_loop3;
4071 run_loop3.RunUntilIdle();
4072 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
4073 factory_.get()));
4074 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4075 host_port_pair_.port()));
4076
4077 DVLOG(1) << "Create 4rd session with public reset post handshake,"
4078 << " will not disable QUIC";
4079 TestCompletionCallback callback4;
4080 QuicStreamRequest request4(factory_.get());
4081 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
4082 /*cert_verify_flags=*/0, url4_, "GET",
4083 net_log_, callback4.callback()));
4084 QuicChromiumClientSession* session4 = GetActiveSession(server4);
4085
4086 session4->connection()->CloseConnection(
4087 QUIC_PUBLIC_RESET, "test", ConnectionCloseBehavior::SILENT_CLOSE);
4088 // Need to spin the loop now to ensure that
4089 // QuicStreamFactory::OnSessionClosed() runs.
4090 base::RunLoop run_loop4;
4091 run_loop4.RunUntilIdle();
4092 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
4093 factory_.get()));
4094 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4095 host_port_pair_.port()));
4096
4097 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
4098 EXPECT_FALSE(stream.get()); // Session is already closed.
4099 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
4100 EXPECT_FALSE(stream2.get()); // Session is already closed.
4101 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
4102 EXPECT_FALSE(stream3.get()); // Session is already closed.
4103 std::unique_ptr<QuicHttpStream> stream4 = request4.CreateStream();
4104 EXPECT_FALSE(stream4.get()); // Session is already closed.
4105
4106 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4107 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4108 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
4109 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
4110 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
4111 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
4112 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
4113 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
4114 }
4115
4116 TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfFour) {
4117 disable_disk_cache_ = true;
4118 threshold_public_resets_post_handshake_ = 2;
4119 Initialize();
4120 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4121 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4122 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4123 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4124 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4125 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
4126
4127 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4128 host_port_pair_.port()));
4129 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
4130 factory_.get(), host_port_pair_.port()));
4131
4132 MockQuicData socket_data;
4133 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4134 socket_data.AddSocketDataToFactory(&socket_factory_);
4135
4136 MockQuicData socket_data2;
4137 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4138 socket_data2.AddSocketDataToFactory(&socket_factory_);
4139
4140 MockQuicData socket_data3;
4141 socket_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4142 socket_data3.AddSocketDataToFactory(&socket_factory_);
4143
4144 MockQuicData socket_data4;
4145 socket_data4.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4146 socket_data4.AddSocketDataToFactory(&socket_factory_);
4147
4148 HostPortPair server2(kServer2HostName, kDefaultServerPort);
4149 HostPortPair server3(kServer3HostName, kDefaultServerPort);
4150 HostPortPair server4(kServer4HostName, kDefaultServerPort);
4151
4152 crypto_client_stream_factory_.set_handshake_mode(
4153 MockCryptoClientStream::CONFIRM_HANDSHAKE);
4154 host_resolver_.set_synchronous_mode(true);
4155 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
4156 "192.168.0.1", "");
4157 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
4158 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
4159 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
4160
4161 // Test first and fourth out of three timeouts with open streams.
4162 QuicStreamRequest request(factory_.get());
4163 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
4164 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4165 callback_.callback()));
4166
4167 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4168
4169 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
4170 EXPECT_TRUE(stream.get());
4171 HttpRequestInfo request_info;
4172 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
4173 net_log_, CompletionCallback()));
4174
4175 DVLOG(1)
4176 << "Created 1st session and initialized a stream. Now trigger timeout";
4177 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
4178 ConnectionCloseBehavior::SILENT_CLOSE);
4179 // Need to spin the loop now to ensure that
4180 // QuicStreamFactory::OnSessionClosed() runs.
4181 base::RunLoop run_loop;
4182 run_loop.RunUntilIdle();
4183
4184 EXPECT_EQ(
4185 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
4186 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4187 host_port_pair_.port()));
4188
4189 DVLOG(1) << "Create 2nd and 3rd sessions without timeout";
4190 TestCompletionCallback callback2;
4191 QuicStreamRequest request2(factory_.get());
4192 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
4193 /*cert_verify_flags=*/0, url2_, "GET",
4194 net_log_, callback2.callback()));
4195 QuicChromiumClientSession* session2 = GetActiveSession(server2);
4196
4197 session2->connection()->CloseConnection(
4198 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
4199 // Need to spin the loop now to ensure that
4200 // QuicStreamFactory::OnSessionClosed() runs.
4201 base::RunLoop run_loop2;
4202 run_loop2.RunUntilIdle();
4203 EXPECT_EQ(
4204 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
4205 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4206 host_port_pair_.port()));
4207
4208 TestCompletionCallback callback3;
4209 QuicStreamRequest request3(factory_.get());
4210 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
4211 /*cert_verify_flags=*/0, url3_, "GET",
4212 net_log_, callback3.callback()));
4213 QuicChromiumClientSession* session3 = GetActiveSession(server3);
4214
4215 session3->connection()->CloseConnection(
4216 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
4217 // Need to spin the loop now to ensure that
4218 // QuicStreamFactory::OnSessionClosed() runs.
4219 base::RunLoop run_loop3;
4220 run_loop3.RunUntilIdle();
4221 EXPECT_EQ(
4222 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
4223 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4224 host_port_pair_.port()));
4225
4226 DVLOG(1) << "Create 4th session with timeout with open streams,"
4227 << " will not disable QUIC";
4228
4229 TestCompletionCallback callback4;
4230 QuicStreamRequest request4(factory_.get());
4231 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
4232 /*cert_verify_flags=*/0, url4_, "GET",
4233 net_log_, callback4.callback()));
4234 QuicChromiumClientSession* session4 = GetActiveSession(server4);
4235
4236 std::unique_ptr<QuicHttpStream> stream4 = request4.CreateStream();
4237 EXPECT_TRUE(stream4.get());
4238 EXPECT_EQ(OK, stream4->InitializeStream(&request_info, DEFAULT_PRIORITY,
4239 net_log_, CompletionCallback()));
4240 session4->connection()->CloseConnection(
4241 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
4242 // Need to spin the loop now to ensure that
4243 // QuicStreamFactory::OnSessionClosed() runs.
4244 base::RunLoop run_loop4;
4245 run_loop4.RunUntilIdle();
4246 EXPECT_EQ(
4247 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
4248 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
4249 host_port_pair_.port()));
4250
4251 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
4252 EXPECT_FALSE(stream2.get()); // Session is already closed.
4253 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
4254 EXPECT_FALSE(stream3.get()); // Session is already closed.
4255
4256 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4257 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4258 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
4259 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
4260 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
4261 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
4262 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
4263 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
4264 }
4265
3339 TEST_P(QuicStreamFactoryTest, EnableDelayTcpRace) { 4266 TEST_P(QuicStreamFactoryTest, EnableDelayTcpRace) {
3340 Initialize(); 4267 Initialize();
3341 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 4268 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3342 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 4269 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3343 bool delay_tcp_race = QuicStreamFactoryPeer::GetDelayTcpRace(factory_.get()); 4270 bool delay_tcp_race = QuicStreamFactoryPeer::GetDelayTcpRace(factory_.get());
3344 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), false); 4271 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), false);
3345 MockQuicData socket_data; 4272 MockQuicData socket_data;
3346 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 4273 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3347 socket_data.AddSocketDataToFactory(&socket_factory_); 4274 socket_data.AddSocketDataToFactory(&socket_factory_);
3348 4275
(...skipping 859 matching lines...) Expand 10 before | Expand all | Expand 10 after
4208 // Clear all cached states. 5135 // Clear all cached states.
4209 factory_->ClearCachedStatesInCryptoConfig( 5136 factory_->ClearCachedStatesInCryptoConfig(
4210 base::Callback<bool(const GURL&)>()); 5137 base::Callback<bool(const GURL&)>());
4211 EXPECT_TRUE(test_cases[0].state->certs().empty()); 5138 EXPECT_TRUE(test_cases[0].state->certs().empty());
4212 EXPECT_TRUE(test_cases[1].state->certs().empty()); 5139 EXPECT_TRUE(test_cases[1].state->certs().empty());
4213 EXPECT_TRUE(test_cases[2].state->certs().empty()); 5140 EXPECT_TRUE(test_cases[2].state->certs().empty());
4214 } 5141 }
4215 5142
4216 } // namespace test 5143 } // namespace test
4217 } // namespace net 5144 } // 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