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

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

Issue 2318053004: Remove obsolete QUIC disabling code. (Closed)
Patch Set: fix 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 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 529
539 // Variables to configure QuicStreamFactory. 530 // Variables to configure QuicStreamFactory.
540 bool enable_port_selection_; 531 bool enable_port_selection_;
541 bool always_require_handshake_confirmation_; 532 bool always_require_handshake_confirmation_;
542 bool disable_connection_pooling_; 533 bool disable_connection_pooling_;
543 double load_server_info_timeout_srtt_multiplier_; 534 double load_server_info_timeout_srtt_multiplier_;
544 bool enable_connection_racing_; 535 bool enable_connection_racing_;
545 bool enable_non_blocking_io_; 536 bool enable_non_blocking_io_;
546 bool disable_disk_cache_; 537 bool disable_disk_cache_;
547 bool prefer_aes_; 538 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_;
553 int receive_buffer_size_; 539 int receive_buffer_size_;
554 bool delay_tcp_race_; 540 bool delay_tcp_race_;
555 bool close_sessions_on_ip_change_; 541 bool close_sessions_on_ip_change_;
556 bool disable_quic_on_timeout_with_open_streams_; 542 bool disable_quic_on_timeout_with_open_streams_;
557 int idle_connection_timeout_seconds_; 543 int idle_connection_timeout_seconds_;
558 int reduced_ping_timeout_seconds_; 544 int reduced_ping_timeout_seconds_;
559 int packet_reader_yield_after_duration_milliseconds_; 545 int packet_reader_yield_after_duration_milliseconds_;
560 bool migrate_sessions_on_network_change_; 546 bool migrate_sessions_on_network_change_;
561 bool migrate_sessions_early_; 547 bool migrate_sessions_early_;
562 bool allow_server_migration_; 548 bool allow_server_migration_;
(...skipping 2630 matching lines...) Expand 10 before | Expand all | Expand 10 after
3193 // If we are waiting for disk cache, we would have posted a task. Verify that 3179 // If we are waiting for disk cache, we would have posted a task. Verify that
3194 // the CancelWaitForDataReady task hasn't been posted. 3180 // the CancelWaitForDataReady task hasn't been posted.
3195 ASSERT_EQ(0u, runner_->GetPostedTasks().size()); 3181 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
3196 3182
3197 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); 3183 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
3198 EXPECT_TRUE(stream.get()); 3184 EXPECT_TRUE(stream.get());
3199 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 3185 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3200 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 3186 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3201 } 3187 }
3202 3188
3203 TEST_P(QuicStreamFactoryTest, BadPacketLoss) { 3189 TEST_P(QuicStreamFactoryTest, ReducePingTimeoutOnConnectionTimeOutOpenStreams) {
3204 disable_disk_cache_ = false; 3190 reduced_ping_timeout_seconds_ = 10;
3205 max_number_of_lossy_connections_ = 2;
3206 Initialize();
3207 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3208 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);
3212
3213 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.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()));
3219
3220 MockQuicData socket_data;
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);
3382 socket_data.AddSocketDataToFactory(&socket_factory_);
3383
3384 MockQuicData socket_data2;
3385 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3386 socket_data2.AddSocketDataToFactory(&socket_factory_);
3387
3388 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3389
3390 crypto_client_stream_factory_.set_handshake_mode(
3391 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3392 host_resolver_.set_synchronous_mode(true);
3393 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3394 "192.168.0.1", "");
3395 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3396
3397 QuicStreamRequest request(factory_.get());
3398 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
3399 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3400 callback_.callback()));
3401
3402 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3403
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; 3191 disable_disk_cache_ = true;
3452 threshold_timeouts_with_open_streams_ = 2;
3453 Initialize(); 3192 Initialize();
3454 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 3193 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3455 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 3194 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3456 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 3195 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3457 3196
3458 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get()); 3197 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3459 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), 3198 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 3199
3464 MockQuicData socket_data; 3200 MockQuicData socket_data;
3465 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 3201 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_);
3487
3488 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
3489 EXPECT_TRUE(stream.get());
3490 HttpRequestInfo request_info;
3491 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3492 net_log_, CompletionCallback()));
3493
3494 DVLOG(1)
3495 << "Created 1st session and initialized a stream. Now trigger timeout";
3496 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
3497 ConnectionCloseBehavior::SILENT_CLOSE);
3498 // Need to spin the loop now to ensure that
3499 // QuicStreamFactory::OnSessionClosed() runs.
3500 base::RunLoop run_loop;
3501 run_loop.RunUntilIdle();
3502
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()));
3612
3613 // The first connection times out with open stream, QUIC should reduce initial
3614 // PING time for subsequent connections.
3615 EXPECT_EQ(QuicTime::Delta::FromSeconds(10),
3616 QuicStreamFactoryPeer::GetPingTimeout(factory_.get()));
3617
3618 // Test two-in-a-row timeouts with open streams.
3619 DVLOG(1) << "Create 2nd session and timeout with open stream";
3620 TestCompletionCallback callback2;
3621 QuicStreamRequest request2(factory_.get());
3622 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
3623 /*cert_verify_flags=*/0, url2_, "GET",
3624 net_log_, callback2.callback()));
3625 QuicChromiumClientSession* session2 = GetActiveSession(server2);
3626 EXPECT_EQ(QuicTime::Delta::FromSeconds(10),
3627 session2->connection()->ping_timeout());
3628
3629 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
3630 EXPECT_TRUE(stream2.get());
3631 EXPECT_EQ(OK, stream2->InitializeStream(&request_info, DEFAULT_PRIORITY,
3632 net_log_, CompletionCallback()));
3633 session2->connection()->CloseConnection(
3634 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
3635 // Need to spin the loop now to ensure that
3636 // QuicStreamFactory::OnSessionClosed() runs.
3637 base::RunLoop run_loop2;
3638 run_loop2.RunUntilIdle();
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()));
3652
3653 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3654 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3655 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3656 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3657 }
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_); 3202 socket_data.AddSocketDataToFactory(&socket_factory_);
3792 3203
3793 MockQuicData socket_data2; 3204 MockQuicData socket_data2;
3794 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 3205 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3795 socket_data2.AddSocketDataToFactory(&socket_factory_); 3206 socket_data2.AddSocketDataToFactory(&socket_factory_);
3796 3207
3797 MockQuicData socket_data3;
3798 socket_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3799 socket_data3.AddSocketDataToFactory(&socket_factory_);
3800
3801 HostPortPair server2(kServer2HostName, kDefaultServerPort); 3208 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3802 HostPortPair server3(kServer3HostName, kDefaultServerPort);
3803 3209
3804 crypto_client_stream_factory_.set_handshake_mode( 3210 crypto_client_stream_factory_.set_handshake_mode(
3805 MockCryptoClientStream::CONFIRM_HANDSHAKE); 3211 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3806 host_resolver_.set_synchronous_mode(true); 3212 host_resolver_.set_synchronous_mode(true);
3807 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(), 3213 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3808 "192.168.0.1", ""); 3214 "192.168.0.1", "");
3809 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); 3215 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3810 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3811 3216
3812 // Test first and third out of three timeouts with open streams. 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()));
3813 QuicStreamRequest request(factory_.get()); 3221 QuicStreamRequest request(factory_.get());
3814 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_, 3222 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
3815 /*cert_verify_flags=*/0, url_, "GET", net_log_, 3223 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3816 callback_.callback())); 3224 callback_.callback()));
3817 3225
3818 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); 3226 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3227 EXPECT_EQ(QuicTime::Delta::FromSeconds(kPingTimeoutSecs),
3228 session->connection()->ping_timeout());
3819 3229
3820 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); 3230 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
3821 EXPECT_TRUE(stream.get()); 3231 EXPECT_TRUE(stream.get());
3822 HttpRequestInfo request_info; 3232 HttpRequestInfo request_info;
3823 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, 3233 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3824 net_log_, CompletionCallback())); 3234 net_log_, CompletionCallback()));
3825 3235
3826 DVLOG(1) 3236 DVLOG(1)
3827 << "Created 1st session and initialized a stream. Now trigger timeout"; 3237 << "Created 1st session and initialized a stream. Now trigger timeout";
3828 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test", 3238 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
3829 ConnectionCloseBehavior::SILENT_CLOSE); 3239 ConnectionCloseBehavior::SILENT_CLOSE);
3830 // Need to spin the loop now to ensure that 3240 // Need to spin the loop now to ensure that
3831 // QuicStreamFactory::OnSessionClosed() runs. 3241 // QuicStreamFactory::OnSessionClosed() runs.
3832 base::RunLoop run_loop; 3242 base::RunLoop run_loop;
3833 run_loop.RunUntilIdle(); 3243 run_loop.RunUntilIdle();
3834 3244
3835 EXPECT_EQ( 3245 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
3836 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get())); 3246
3837 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), 3247 // The first connection times out with open stream, QUIC should reduce initial
3838 host_port_pair_.port())); 3248 // PING time for subsequent connections.
3249 EXPECT_EQ(QuicTime::Delta::FromSeconds(10),
3250 QuicStreamFactoryPeer::GetPingTimeout(factory_.get()));
3839 3251
3840 // Test two-in-a-row timeouts with open streams. 3252 // Test two-in-a-row timeouts with open streams.
3841 DVLOG(1) << "Create 2nd session without timeout"; 3253 DVLOG(1) << "Create 2nd session and timeout with open stream";
3842 TestCompletionCallback callback2; 3254 TestCompletionCallback callback2;
3843 QuicStreamRequest request2(factory_.get()); 3255 QuicStreamRequest request2(factory_.get());
3844 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_, 3256 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
3845 /*cert_verify_flags=*/0, url2_, "GET", 3257 /*cert_verify_flags=*/0, url2_, "GET",
3846 net_log_, callback2.callback())); 3258 net_log_, callback2.callback()));
3847 QuicChromiumClientSession* session2 = GetActiveSession(server2); 3259 QuicChromiumClientSession* session2 = GetActiveSession(server2);
3260 EXPECT_EQ(QuicTime::Delta::FromSeconds(10),
3261 session2->connection()->ping_timeout());
3848 3262
3263 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
3264 EXPECT_TRUE(stream2.get());
3265 EXPECT_EQ(OK, stream2->InitializeStream(&request_info, DEFAULT_PRIORITY,
3266 net_log_, CompletionCallback()));
3849 session2->connection()->CloseConnection( 3267 session2->connection()->CloseConnection(
3850 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE); 3268 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
3851 // Need to spin the loop now to ensure that 3269 // Need to spin the loop now to ensure that
3852 // QuicStreamFactory::OnSessionClosed() runs. 3270 // QuicStreamFactory::OnSessionClosed() runs.
3853 base::RunLoop run_loop2; 3271 base::RunLoop run_loop2;
3854 run_loop2.RunUntilIdle(); 3272 run_loop2.RunUntilIdle();
3855 EXPECT_EQ( 3273 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
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 3274
3897 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 3275 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3898 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 3276 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3899 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); 3277 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3900 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); 3278 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3901 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3902 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3903 } 3279 }
3904 3280
3905 TEST_P(QuicStreamFactoryTest, DisableQuicWhenTimeoutsWithOpenStreams) { 3281 TEST_P(QuicStreamFactoryTest, DisableQuicWhenTimeoutsWithOpenStreams) {
3906 disable_disk_cache_ = true; 3282 disable_disk_cache_ = true;
3907 disable_quic_on_timeout_with_open_streams_ = true; 3283 disable_quic_on_timeout_with_open_streams_ = true;
3908 Initialize(); 3284 Initialize();
3909 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 3285 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3910 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 3286 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3911 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get()); 3287 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3912 3288
3913 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), 3289 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
3914 host_port_pair_.port()));
3915 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
3916 factory_.get(), host_port_pair_.port()));
3917 3290
3918 MockQuicData socket_data; 3291 MockQuicData socket_data;
3919 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 3292 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3920 socket_data.AddSocketDataToFactory(&socket_factory_); 3293 socket_data.AddSocketDataToFactory(&socket_factory_);
3921 3294
3922 crypto_client_stream_factory_.set_handshake_mode( 3295 crypto_client_stream_factory_.set_handshake_mode(
3923 MockCryptoClientStream::CONFIRM_HANDSHAKE); 3296 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3924 host_resolver_.set_synchronous_mode(true); 3297 host_resolver_.set_synchronous_mode(true);
3925 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(), 3298 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3926 "192.168.0.1", ""); 3299 "192.168.0.1", "");
(...skipping 15 matching lines...) Expand all
3942 DVLOG(1) 3315 DVLOG(1)
3943 << "Created 1st session and initialized a stream. Now trigger timeout." 3316 << "Created 1st session and initialized a stream. Now trigger timeout."
3944 << "Will disable QUIC."; 3317 << "Will disable QUIC.";
3945 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test", 3318 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
3946 ConnectionCloseBehavior::SILENT_CLOSE); 3319 ConnectionCloseBehavior::SILENT_CLOSE);
3947 // Need to spin the loop now to ensure that 3320 // Need to spin the loop now to ensure that
3948 // QuicStreamFactory::OnSessionClosed() runs. 3321 // QuicStreamFactory::OnSessionClosed() runs.
3949 base::RunLoop run_loop; 3322 base::RunLoop run_loop;
3950 run_loop.RunUntilIdle(); 3323 run_loop.RunUntilIdle();
3951 3324
3952 EXPECT_EQ( 3325 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
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()));
3959 3326
3960 // Verify that QUIC is fully disabled after a TCP job succeeds. 3327 // Verify that QUIC is fully disabled after a TCP job succeeds.
3961 factory_->OnTcpJobCompleted(/*succeeded=*/true); 3328 factory_->OnTcpJobCompleted(/*succeeded=*/true);
3962 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), 3329 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
3963 host_port_pair_.port()));
3964 3330
3965 // Verify that QUIC stays disabled after a TCP job succeeds. 3331 // Verify that QUIC stays disabled after a TCP job succeeds.
3966 factory_->OnTcpJobCompleted(/*succeeded=*/false); 3332 factory_->OnTcpJobCompleted(/*succeeded=*/false);
3967 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), 3333 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get()));
3968 host_port_pair_.port()));
3969 3334
3970 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 3335 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3971 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 3336 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3972 } 3337 }
3973 3338
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
4266 TEST_P(QuicStreamFactoryTest, EnableDelayTcpRace) { 3339 TEST_P(QuicStreamFactoryTest, EnableDelayTcpRace) {
4267 Initialize(); 3340 Initialize();
4268 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 3341 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4269 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 3342 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4270 bool delay_tcp_race = QuicStreamFactoryPeer::GetDelayTcpRace(factory_.get()); 3343 bool delay_tcp_race = QuicStreamFactoryPeer::GetDelayTcpRace(factory_.get());
4271 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), false); 3344 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), false);
4272 MockQuicData socket_data; 3345 MockQuicData socket_data;
4273 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 3346 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4274 socket_data.AddSocketDataToFactory(&socket_factory_); 3347 socket_data.AddSocketDataToFactory(&socket_factory_);
4275 3348
(...skipping 859 matching lines...) Expand 10 before | Expand all | Expand 10 after
5135 // Clear all cached states. 4208 // Clear all cached states.
5136 factory_->ClearCachedStatesInCryptoConfig( 4209 factory_->ClearCachedStatesInCryptoConfig(
5137 base::Callback<bool(const GURL&)>()); 4210 base::Callback<bool(const GURL&)>());
5138 EXPECT_TRUE(test_cases[0].state->certs().empty()); 4211 EXPECT_TRUE(test_cases[0].state->certs().empty());
5139 EXPECT_TRUE(test_cases[1].state->certs().empty()); 4212 EXPECT_TRUE(test_cases[1].state->certs().empty());
5140 EXPECT_TRUE(test_cases[2].state->certs().empty()); 4213 EXPECT_TRUE(test_cases[2].state->certs().empty());
5141 } 4214 }
5142 4215
5143 } // namespace test 4216 } // namespace test
5144 } // namespace net 4217 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698