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