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