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/quic_stream_factory.h" | 5 #include "net/quic/quic_stream_factory.h" |
6 | 6 |
7 #include "base/run_loop.h" | 7 #include "base/run_loop.h" |
8 #include "base/strings/string_util.h" | 8 #include "base/strings/string_util.h" |
9 #include "base/thread_task_runner_handle.h" | 9 #include "base/thread_task_runner_handle.h" |
10 #include "net/base/test_data_directory.h" | 10 #include "net/base/test_data_directory.h" |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
109 class MockQuicServerInfoFactory : public QuicServerInfoFactory { | 109 class MockQuicServerInfoFactory : public QuicServerInfoFactory { |
110 public: | 110 public: |
111 MockQuicServerInfoFactory() {} | 111 MockQuicServerInfoFactory() {} |
112 ~MockQuicServerInfoFactory() override {} | 112 ~MockQuicServerInfoFactory() override {} |
113 | 113 |
114 QuicServerInfo* GetForServer(const QuicServerId& server_id) override { | 114 QuicServerInfo* GetForServer(const QuicServerId& server_id) override { |
115 return new MockQuicServerInfo(server_id); | 115 return new MockQuicServerInfo(server_id); |
116 } | 116 } |
117 }; | 117 }; |
118 | 118 |
119 class MockNetworkChangeNotifier : public NetworkChangeNotifier { | |
120 public: | |
121 MockNetworkChangeNotifier() : force_network_handles_supported_(false) {} | |
122 | |
123 ConnectionType GetCurrentConnectionType() const override { | |
124 return CONNECTION_UNKNOWN; | |
125 } | |
126 | |
127 void ForceNetworkHandlesSupported() { | |
128 force_network_handles_supported_ = true; | |
129 } | |
130 | |
131 bool AreNetworkHandlesCurrentlySupported() const override { | |
132 return force_network_handles_supported_; | |
133 } | |
134 | |
135 void SetConnectedNetworksList(NetworkList network_list) { | |
136 connected_networks_ = network_list; | |
137 } | |
138 | |
139 void GetCurrentConnectedNetworks(NetworkList* network_list) const override { | |
140 network_list->clear(); | |
141 *network_list = connected_networks_; | |
142 } | |
143 | |
144 private: | |
145 bool force_network_handles_supported_; | |
146 NetworkChangeNotifier::NetworkList connected_networks_; | |
147 }; | |
148 | |
149 // Class to replace existing NetworkChangeNotifier singleton with a | |
150 // MockNetworkChangeNotifier for a test. To use, simply create a | |
151 // ScopedMockNetworkChangeNotifier object in the test. | |
152 class ScopedMockNetworkChangeNotifier { | |
153 public: | |
154 ScopedMockNetworkChangeNotifier() | |
155 : mock_network_change_notifier_(nullptr), | |
156 disable_network_change_notifier_for_tests_(nullptr) { | |
157 // Disable existing NetworkChangeNotifier first, then create mock. | |
158 disable_network_change_notifier_for_tests_ = | |
159 new NetworkChangeNotifier::DisableForTest(); | |
160 mock_network_change_notifier_ = new MockNetworkChangeNotifier(); | |
Ryan Hamilton
2015/12/18 22:00:19
I think you can initialize these in the initialize
Jana
2015/12/21 23:10:19
Done.
| |
161 } | |
162 | |
163 ~ScopedMockNetworkChangeNotifier() { | |
164 delete mock_network_change_notifier_; | |
165 delete disable_network_change_notifier_for_tests_; | |
Ryan Hamilton
2015/12/18 22:00:19
Can you use a scoped_ptr<> instead of needing to e
Jana
2015/12/21 23:10:19
Done.
| |
166 } | |
167 | |
168 MockNetworkChangeNotifier* mock_network_change_notifier() { | |
169 return mock_network_change_notifier_; | |
170 } | |
171 | |
172 private: | |
173 MockNetworkChangeNotifier* mock_network_change_notifier_; | |
174 NetworkChangeNotifier::DisableForTest* | |
175 disable_network_change_notifier_for_tests_; | |
176 }; | |
177 | |
119 class QuicStreamFactoryTest : public ::testing::TestWithParam<TestParams> { | 178 class QuicStreamFactoryTest : public ::testing::TestWithParam<TestParams> { |
120 protected: | 179 protected: |
121 QuicStreamFactoryTest() | 180 QuicStreamFactoryTest() |
122 : random_generator_(0), | 181 : random_generator_(0), |
123 clock_(new MockClock()), | 182 clock_(new MockClock()), |
124 runner_(new TestTaskRunner(clock_)), | 183 runner_(new TestTaskRunner(clock_)), |
125 maker_(GetParam().version, 0, clock_, kDefaultServerHostName), | 184 maker_(GetParam().version, 0, clock_, kDefaultServerHostName), |
126 cert_verifier_(CertVerifier::CreateDefault()), | 185 cert_verifier_(CertVerifier::CreateDefault()), |
127 channel_id_service_( | 186 channel_id_service_( |
128 new ChannelIDService(new DefaultChannelIDStore(nullptr), | 187 new ChannelIDService(new DefaultChannelIDStore(nullptr), |
(...skipping 12 matching lines...) Expand all Loading... | |
141 prefer_aes_(false), | 200 prefer_aes_(false), |
142 max_number_of_lossy_connections_(0), | 201 max_number_of_lossy_connections_(0), |
143 packet_loss_threshold_(1.0f), | 202 packet_loss_threshold_(1.0f), |
144 max_disabled_reasons_(3), | 203 max_disabled_reasons_(3), |
145 threshold_timeouts_with_open_streams_(2), | 204 threshold_timeouts_with_open_streams_(2), |
146 threshold_public_resets_post_handshake_(2), | 205 threshold_public_resets_post_handshake_(2), |
147 receive_buffer_size_(0), | 206 receive_buffer_size_(0), |
148 delay_tcp_race_(false), | 207 delay_tcp_race_(false), |
149 store_server_configs_in_properties_(false), | 208 store_server_configs_in_properties_(false), |
150 close_sessions_on_ip_change_(false), | 209 close_sessions_on_ip_change_(false), |
151 idle_connection_timeout_seconds_(kIdleConnectionTimeoutSeconds) { | 210 idle_connection_timeout_seconds_(kIdleConnectionTimeoutSeconds), |
211 migrate_sessions_on_network_change_(false) { | |
152 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 212 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
153 } | 213 } |
154 | 214 |
155 void Initialize() { | 215 void Initialize() { |
156 factory_.reset(new QuicStreamFactory( | 216 factory_.reset(new QuicStreamFactory( |
157 &host_resolver_, &socket_factory_, http_server_properties_.GetWeakPtr(), | 217 &host_resolver_, &socket_factory_, http_server_properties_.GetWeakPtr(), |
158 cert_verifier_.get(), nullptr, channel_id_service_.get(), | 218 cert_verifier_.get(), nullptr, channel_id_service_.get(), |
159 &transport_security_state_, cert_transparency_verifier_.get(), | 219 &transport_security_state_, cert_transparency_verifier_.get(), |
160 /*SocketPerformanceWatcherFactory*/ nullptr, | 220 /*SocketPerformanceWatcherFactory*/ nullptr, |
161 &crypto_client_stream_factory_, &random_generator_, clock_, | 221 &crypto_client_stream_factory_, &random_generator_, clock_, |
162 kDefaultMaxPacketSize, std::string(), | 222 kDefaultMaxPacketSize, std::string(), |
163 SupportedVersions(GetParam().version), enable_port_selection_, | 223 SupportedVersions(GetParam().version), enable_port_selection_, |
164 always_require_handshake_confirmation_, disable_connection_pooling_, | 224 always_require_handshake_confirmation_, disable_connection_pooling_, |
165 load_server_info_timeout_srtt_multiplier_, enable_connection_racing_, | 225 load_server_info_timeout_srtt_multiplier_, enable_connection_racing_, |
166 enable_non_blocking_io_, disable_disk_cache_, prefer_aes_, | 226 enable_non_blocking_io_, disable_disk_cache_, prefer_aes_, |
167 max_number_of_lossy_connections_, packet_loss_threshold_, | 227 max_number_of_lossy_connections_, packet_loss_threshold_, |
168 max_disabled_reasons_, threshold_timeouts_with_open_streams_, | 228 max_disabled_reasons_, threshold_timeouts_with_open_streams_, |
169 threshold_public_resets_post_handshake_, receive_buffer_size_, | 229 threshold_public_resets_post_handshake_, receive_buffer_size_, |
170 delay_tcp_race_, store_server_configs_in_properties_, | 230 delay_tcp_race_, store_server_configs_in_properties_, |
171 close_sessions_on_ip_change_, idle_connection_timeout_seconds_, | 231 close_sessions_on_ip_change_, idle_connection_timeout_seconds_, |
172 QuicTagVector())); | 232 migrate_sessions_on_network_change_, QuicTagVector())); |
173 factory_->set_require_confirmation(false); | 233 factory_->set_require_confirmation(false); |
174 factory_->set_quic_server_info_factory(new MockQuicServerInfoFactory()); | 234 factory_->set_quic_server_info_factory(new MockQuicServerInfoFactory()); |
175 } | 235 } |
176 | 236 |
177 bool HasActiveSession(const HostPortPair& host_port_pair) { | 237 bool HasActiveSession(const HostPortPair& host_port_pair) { |
178 return QuicStreamFactoryPeer::HasActiveSession(factory_.get(), | 238 return QuicStreamFactoryPeer::HasActiveSession(factory_.get(), |
179 host_port_pair); | 239 host_port_pair); |
180 } | 240 } |
181 | 241 |
182 scoped_ptr<QuicHttpStream> CreateFromSession( | 242 scoped_ptr<QuicHttpStream> CreateFromSession( |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
267 return verify_details; | 327 return verify_details; |
268 } | 328 } |
269 | 329 |
270 void NotifyIPAddressChanged() { | 330 void NotifyIPAddressChanged() { |
271 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 331 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
272 // For thread safety, the NCN queues tasks to do the actual notifications, | 332 // For thread safety, the NCN queues tasks to do the actual notifications, |
273 // so we need to spin the message loop so the notification is delivered. | 333 // so we need to spin the message loop so the notification is delivered. |
274 base::MessageLoop::current()->RunUntilIdle(); | 334 base::MessageLoop::current()->RunUntilIdle(); |
275 } | 335 } |
276 | 336 |
337 void NotifySpecificNetworkChange( | |
338 NetworkChangeNotifier::NetworkChangeType type, | |
339 NetworkChangeNotifier::NetworkHandle network) { | |
340 NetworkChangeNotifier::NotifyObserversOfSpecificNetworkChangeForTests( | |
341 type, network); | |
342 // For thread safety, the NCN queues tasks to do the actual notifications, | |
Ryan Hamilton
2015/12/18 22:00:19
I'd remove the first part of this (about thread sa
Jana
2015/12/21 23:10:19
I'm following the same pattern as is done with del
| |
343 // so we need to spin the message loop so the notification is delivered. | |
344 base::MessageLoop::current()->RunUntilIdle(); | |
345 } | |
346 | |
277 MockHostResolver host_resolver_; | 347 MockHostResolver host_resolver_; |
278 DeterministicMockClientSocketFactory socket_factory_; | 348 DeterministicMockClientSocketFactory socket_factory_; |
279 MockCryptoClientStreamFactory crypto_client_stream_factory_; | 349 MockCryptoClientStreamFactory crypto_client_stream_factory_; |
280 MockRandom random_generator_; | 350 MockRandom random_generator_; |
281 MockClock* clock_; // Owned by factory_. | 351 MockClock* clock_; // Owned by factory_. |
282 scoped_refptr<TestTaskRunner> runner_; | 352 scoped_refptr<TestTaskRunner> runner_; |
283 QuicTestPacketMaker maker_; | 353 QuicTestPacketMaker maker_; |
284 HttpServerPropertiesImpl http_server_properties_; | 354 HttpServerPropertiesImpl http_server_properties_; |
285 scoped_ptr<CertVerifier> cert_verifier_; | 355 scoped_ptr<CertVerifier> cert_verifier_; |
286 scoped_ptr<ChannelIDService> channel_id_service_; | 356 scoped_ptr<ChannelIDService> channel_id_service_; |
(...skipping 17 matching lines...) Expand all Loading... | |
304 int max_number_of_lossy_connections_; | 374 int max_number_of_lossy_connections_; |
305 double packet_loss_threshold_; | 375 double packet_loss_threshold_; |
306 int max_disabled_reasons_; | 376 int max_disabled_reasons_; |
307 int threshold_timeouts_with_open_streams_; | 377 int threshold_timeouts_with_open_streams_; |
308 int threshold_public_resets_post_handshake_; | 378 int threshold_public_resets_post_handshake_; |
309 int receive_buffer_size_; | 379 int receive_buffer_size_; |
310 bool delay_tcp_race_; | 380 bool delay_tcp_race_; |
311 bool store_server_configs_in_properties_; | 381 bool store_server_configs_in_properties_; |
312 bool close_sessions_on_ip_change_; | 382 bool close_sessions_on_ip_change_; |
313 int idle_connection_timeout_seconds_; | 383 int idle_connection_timeout_seconds_; |
384 bool migrate_sessions_on_network_change_; | |
314 }; | 385 }; |
315 | 386 |
316 INSTANTIATE_TEST_CASE_P(Version, | 387 INSTANTIATE_TEST_CASE_P(Version, |
317 QuicStreamFactoryTest, | 388 QuicStreamFactoryTest, |
318 ::testing::ValuesIn(GetTestParams())); | 389 ::testing::ValuesIn(GetTestParams())); |
319 | 390 |
320 TEST_P(QuicStreamFactoryTest, Create) { | 391 TEST_P(QuicStreamFactoryTest, Create) { |
321 Initialize(); | 392 Initialize(); |
322 | 393 |
323 MockRead reads[] = { | 394 MockRead reads[] = { |
(...skipping 962 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1286 EXPECT_EQ(OK, callback_.WaitForResult()); | 1357 EXPECT_EQ(OK, callback_.WaitForResult()); |
1287 stream = request2.ReleaseStream(); | 1358 stream = request2.ReleaseStream(); |
1288 stream.reset(); // Will reset stream 3. | 1359 stream.reset(); // Will reset stream 3. |
1289 | 1360 |
1290 EXPECT_TRUE(socket_data.AllReadDataConsumed()); | 1361 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
1291 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); | 1362 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
1292 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); | 1363 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); |
1293 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); | 1364 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); |
1294 } | 1365 } |
1295 | 1366 |
1367 TEST_P(QuicStreamFactoryTest, OnNetworkChange) { | |
Ryan Hamilton
2015/12/18 22:00:19
Does this test all of the various combinations? Ac
Jana
2015/12/21 23:10:19
No it doesn't. I had meant to add them before send
| |
1368 ScopedMockNetworkChangeNotifier scoped_mock_ncn; | |
1369 MockNetworkChangeNotifier* mock_ncn = | |
1370 scoped_mock_ncn.mock_network_change_notifier(); | |
1371 mock_ncn->ForceNetworkHandlesSupported(); | |
1372 NetworkChangeNotifier::NetworkList connected_networks = {1, 2}; | |
1373 mock_ncn->SetConnectedNetworksList(connected_networks); | |
1374 | |
1375 migrate_sessions_on_network_change_ = true; | |
1376 Initialize(); | |
1377 | |
1378 // Set up first socket data provider | |
1379 MockRead reads[] = { | |
1380 MockRead(ASYNC, OK, 0) // EOF | |
1381 }; | |
1382 | |
1383 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0); | |
1384 socket_data.StopAfter(1); | |
1385 socket_factory_.AddSocketDataProvider(&socket_data); | |
1386 | |
1387 // Set up second socket data provider that is used after migration. | |
1388 MockRead reads1[] = { | |
1389 MockRead(ASYNC, OK, 0) // EOF | |
1390 }; | |
1391 scoped_ptr<QuicEncryptedPacket> ping( | |
1392 maker_.MakePingPacket(1, /*include_version=*/true)); | |
1393 MockWrite writes1[] = { | |
1394 MockWrite(ASYNC, ping->data(), ping->length(), 1), | |
1395 }; | |
1396 DeterministicSocketData socket_data1(reads1, arraysize(reads1), writes1, | |
1397 arraysize(writes1)); | |
1398 socket_data1.StopAfter(1); | |
1399 socket_factory_.AddSocketDataProvider(&socket_data1); | |
1400 | |
1401 // Create request and QuicHttpStream. | |
1402 QuicStreamRequest request(factory_.get()); | |
1403 EXPECT_EQ(ERR_IO_PENDING, | |
1404 request.Request(host_port_pair_, privacy_mode_, | |
1405 /*cert_verify_flags=*/0, host_port_pair_.host(), | |
1406 "GET", net_log_, callback_.callback())); | |
1407 | |
1408 EXPECT_EQ(OK, callback_.WaitForResult()); | |
1409 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | |
1410 EXPECT_TRUE(stream.get()); | |
1411 | |
1412 // Cause QUIC stream to be created. | |
1413 HttpRequestInfo request_info; | |
1414 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, | |
1415 net_log_, CompletionCallback())); | |
1416 | |
1417 // Ensure that session is alive and active. | |
1418 QuicChromiumClientSession* session = | |
1419 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_); | |
1420 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | |
1421 EXPECT_TRUE(HasActiveSession(host_port_pair_)); | |
1422 | |
1423 // Cause connection migration to happen. This should cause a PING frame | |
1424 // to be emitted. | |
1425 NotifySpecificNetworkChange(NetworkChangeNotifier::SOON_TO_DISCONNECT, 1); | |
1426 | |
1427 // The session should now be marked as going away. Ensure that | |
1428 // while it is still alive, it is no longer active. | |
1429 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | |
1430 EXPECT_FALSE(HasActiveSession(host_port_pair_)); | |
1431 EXPECT_EQ(1u, session->GetNumActiveStreams()); | |
1432 | |
1433 // Create a new request for the same destination and verify that a | |
1434 // new session is created. | |
1435 MockRead reads2[] = { | |
1436 MockRead(ASYNC, OK, 0) // EOF | |
1437 }; | |
1438 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0); | |
1439 socket_data2.StopAfter(1); | |
1440 socket_factory_.AddSocketDataProvider(&socket_data2); | |
1441 QuicStreamRequest request2(factory_.get()); | |
1442 EXPECT_EQ(ERR_IO_PENDING, | |
1443 request2.Request(host_port_pair_, privacy_mode_, | |
1444 /*cert_verify_flags=*/0, host_port_pair_.host(), | |
1445 "GET", net_log_, callback_.callback())); | |
1446 EXPECT_EQ(OK, callback_.WaitForResult()); | |
1447 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); | |
1448 EXPECT_TRUE(stream2.get()); | |
1449 | |
1450 EXPECT_TRUE( | |
1451 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_)); | |
1452 EXPECT_NE(session, QuicStreamFactoryPeer::GetActiveSession(factory_.get(), | |
1453 host_port_pair_)); | |
1454 EXPECT_EQ(true, | |
1455 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | |
1456 | |
1457 EXPECT_TRUE(socket_data.AllReadDataConsumed()); | |
1458 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); | |
1459 EXPECT_TRUE(socket_data1.AllReadDataConsumed()); | |
1460 EXPECT_TRUE(socket_data1.AllWriteDataConsumed()); | |
1461 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); | |
1462 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); | |
1463 } | |
1464 | |
1296 TEST_P(QuicStreamFactoryTest, OnSSLConfigChanged) { | 1465 TEST_P(QuicStreamFactoryTest, OnSSLConfigChanged) { |
1297 Initialize(); | 1466 Initialize(); |
1298 MockRead reads[] = { | 1467 MockRead reads[] = { |
1299 MockRead(ASYNC, 0, 0) // EOF | 1468 MockRead(ASYNC, 0, 0) // EOF |
1300 }; | 1469 }; |
1301 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket()); | 1470 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket()); |
1302 std::vector<MockWrite> writes; | 1471 std::vector<MockWrite> writes; |
1303 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1)); | 1472 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1)); |
1304 DeterministicSocketData socket_data(reads, arraysize(reads), | 1473 DeterministicSocketData socket_data(reads, arraysize(reads), |
1305 writes.empty() ? nullptr : &writes[0], | 1474 writes.empty() ? nullptr : &writes[0], |
(...skipping 1426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2732 EXPECT_EQ(1u, observer.executed_count()); | 2901 EXPECT_EQ(1u, observer.executed_count()); |
2733 | 2902 |
2734 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | 2903 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); |
2735 EXPECT_TRUE(stream.get()); | 2904 EXPECT_TRUE(stream.get()); |
2736 EXPECT_TRUE(socket_data.AllReadDataConsumed()); | 2905 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
2737 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); | 2906 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
2738 } | 2907 } |
2739 | 2908 |
2740 } // namespace test | 2909 } // namespace test |
2741 } // namespace net | 2910 } // namespace net |
OLD | NEW |