OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |