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 |