Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(476)

Side by Side Diff: net/quic/quic_stream_factory_test.cc

Issue 1327923002: Migrates QUIC sessions to a new network when old network is (about to be) disconnected. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@home
Patch Set: More tests added and some fixes. Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 28 matching lines...) Expand all
39 #include "net/ssl/default_channel_id_store.h" 39 #include "net/ssl/default_channel_id_store.h"
40 #include "net/test/cert_test_util.h" 40 #include "net/test/cert_test_util.h"
41 #include "testing/gtest/include/gtest/gtest.h" 41 #include "testing/gtest/include/gtest/gtest.h"
42 42
43 using base::StringPiece; 43 using base::StringPiece;
44 using std::ostream; 44 using std::ostream;
45 using std::string; 45 using std::string;
46 using std::vector; 46 using std::vector;
47 47
48 namespace net { 48 namespace net {
49
50 extern NetworkChangeNotifier::NetworkHandle kDefaultNetworkForTests;
Ryan Hamilton 2015/12/29 05:29:36 Is this coming from socket_test_utils.cc? If so, I
Jana 2016/01/06 23:01:17 Done.
51 extern NetworkChangeNotifier::NetworkHandle kNewNetworkForTests;
52
49 namespace test { 53 namespace test {
50 54
51 namespace { 55 namespace {
52 const char kDefaultServerHostName[] = "www.google.com"; 56 const char kDefaultServerHostName[] = "www.google.com";
53 const int kDefaultServerPort = 443; 57 const int kDefaultServerPort = 443;
54 58
55 // Run all tests with all the combinations of versions and 59 // Run all tests with all the combinations of versions and
56 // enable_connection_racing. 60 // enable_connection_racing.
57 struct TestParams { 61 struct TestParams {
58 TestParams(const QuicVersion version, bool enable_connection_racing) 62 TestParams(const QuicVersion version, bool enable_connection_racing)
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 class MockQuicServerInfoFactory : public QuicServerInfoFactory { 113 class MockQuicServerInfoFactory : public QuicServerInfoFactory {
110 public: 114 public:
111 MockQuicServerInfoFactory() {} 115 MockQuicServerInfoFactory() {}
112 ~MockQuicServerInfoFactory() override {} 116 ~MockQuicServerInfoFactory() override {}
113 117
114 QuicServerInfo* GetForServer(const QuicServerId& server_id) override { 118 QuicServerInfo* GetForServer(const QuicServerId& server_id) override {
115 return new MockQuicServerInfo(server_id); 119 return new MockQuicServerInfo(server_id);
116 } 120 }
117 }; 121 };
118 122
123 class MockNetworkChangeNotifier : public NetworkChangeNotifier {
124 public:
125 MockNetworkChangeNotifier() : force_network_handles_supported_(false) {}
126
127 ConnectionType GetCurrentConnectionType() const override {
128 return CONNECTION_UNKNOWN;
129 }
130
131 void ForceNetworkHandlesSupported() {
132 force_network_handles_supported_ = true;
133 }
134
135 bool AreNetworkHandlesCurrentlySupported() const override {
136 return force_network_handles_supported_;
137 }
138
139 void SetConnectedNetworksList(NetworkList network_list) {
Ryan Hamilton 2015/12/29 21:18:55 nit: const &
Jana 2016/01/06 23:01:17 Done.
140 connected_networks_ = network_list;
141 }
142
143 void GetCurrentConnectedNetworks(NetworkList* network_list) const override {
144 network_list->clear();
145 *network_list = connected_networks_;
146 }
147
148 private:
149 bool force_network_handles_supported_;
150 NetworkChangeNotifier::NetworkList connected_networks_;
151 };
152
153 // Class to replace existing NetworkChangeNotifier singleton with a
154 // MockNetworkChangeNotifier for a test. To use, simply create a
155 // ScopedMockNetworkChangeNotifier object in the test.
156 class ScopedMockNetworkChangeNotifier {
157 public:
158 ScopedMockNetworkChangeNotifier()
159 : disable_network_change_notifier_for_tests_(
160 new NetworkChangeNotifier::DisableForTest()),
161 mock_network_change_notifier_(new MockNetworkChangeNotifier()) {}
162
163 MockNetworkChangeNotifier* mock_network_change_notifier() {
164 return mock_network_change_notifier_.get();
165 }
166
167 private:
168 scoped_ptr<NetworkChangeNotifier::DisableForTest>
169 disable_network_change_notifier_for_tests_;
170 scoped_ptr<MockNetworkChangeNotifier> mock_network_change_notifier_;
171 };
172
119 class QuicStreamFactoryTest : public ::testing::TestWithParam<TestParams> { 173 class QuicStreamFactoryTest : public ::testing::TestWithParam<TestParams> {
120 protected: 174 protected:
121 QuicStreamFactoryTest() 175 QuicStreamFactoryTest()
122 : random_generator_(0), 176 : random_generator_(0),
123 clock_(new MockClock()), 177 clock_(new MockClock()),
124 runner_(new TestTaskRunner(clock_)), 178 runner_(new TestTaskRunner(clock_)),
125 maker_(GetParam().version, 0, clock_, kDefaultServerHostName), 179 maker_(GetParam().version, 0, clock_, kDefaultServerHostName),
126 cert_verifier_(CertVerifier::CreateDefault()), 180 cert_verifier_(CertVerifier::CreateDefault()),
127 channel_id_service_( 181 channel_id_service_(
128 new ChannelIDService(new DefaultChannelIDStore(nullptr), 182 new ChannelIDService(new DefaultChannelIDStore(nullptr),
129 base::ThreadTaskRunnerHandle::Get())), 183 base::ThreadTaskRunnerHandle::Get())),
130 cert_transparency_verifier_(new MultiLogCTVerifier()), 184 cert_transparency_verifier_(new MultiLogCTVerifier()),
185 scoped_mock_network_change_notifier_(nullptr),
131 factory_(nullptr), 186 factory_(nullptr),
132 host_port_pair_(kDefaultServerHostName, kDefaultServerPort), 187 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
133 privacy_mode_(PRIVACY_MODE_DISABLED), 188 privacy_mode_(PRIVACY_MODE_DISABLED),
134 enable_port_selection_(true), 189 enable_port_selection_(true),
135 always_require_handshake_confirmation_(false), 190 always_require_handshake_confirmation_(false),
136 disable_connection_pooling_(false), 191 disable_connection_pooling_(false),
137 load_server_info_timeout_srtt_multiplier_(0.0f), 192 load_server_info_timeout_srtt_multiplier_(0.0f),
138 enable_connection_racing_(true), 193 enable_connection_racing_(true),
139 enable_non_blocking_io_(true), 194 enable_non_blocking_io_(true),
140 disable_disk_cache_(false), 195 disable_disk_cache_(false),
141 prefer_aes_(false), 196 prefer_aes_(false),
142 max_number_of_lossy_connections_(0), 197 max_number_of_lossy_connections_(0),
143 packet_loss_threshold_(1.0f), 198 packet_loss_threshold_(1.0f),
144 max_disabled_reasons_(3), 199 max_disabled_reasons_(3),
145 threshold_timeouts_with_open_streams_(2), 200 threshold_timeouts_with_open_streams_(2),
146 threshold_public_resets_post_handshake_(2), 201 threshold_public_resets_post_handshake_(2),
147 receive_buffer_size_(0), 202 receive_buffer_size_(0),
148 delay_tcp_race_(false), 203 delay_tcp_race_(false),
149 store_server_configs_in_properties_(false), 204 store_server_configs_in_properties_(false),
150 close_sessions_on_ip_change_(false), 205 close_sessions_on_ip_change_(false),
151 idle_connection_timeout_seconds_(kIdleConnectionTimeoutSeconds) { 206 idle_connection_timeout_seconds_(kIdleConnectionTimeoutSeconds),
207 migrate_sessions_on_network_change_(false) {
152 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1)); 208 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
153 } 209 }
154 210
155 void Initialize() { 211 void Initialize() {
156 factory_.reset(new QuicStreamFactory( 212 factory_.reset(new QuicStreamFactory(
157 &host_resolver_, &socket_factory_, http_server_properties_.GetWeakPtr(), 213 &host_resolver_, &socket_factory_, http_server_properties_.GetWeakPtr(),
158 cert_verifier_.get(), nullptr, channel_id_service_.get(), 214 cert_verifier_.get(), nullptr, channel_id_service_.get(),
159 &transport_security_state_, cert_transparency_verifier_.get(), 215 &transport_security_state_, cert_transparency_verifier_.get(),
160 /*SocketPerformanceWatcherFactory*/ nullptr, 216 /*SocketPerformanceWatcherFactory*/ nullptr,
161 &crypto_client_stream_factory_, &random_generator_, clock_, 217 &crypto_client_stream_factory_, &random_generator_, clock_,
162 kDefaultMaxPacketSize, std::string(), 218 kDefaultMaxPacketSize, std::string(),
163 SupportedVersions(GetParam().version), enable_port_selection_, 219 SupportedVersions(GetParam().version), enable_port_selection_,
164 always_require_handshake_confirmation_, disable_connection_pooling_, 220 always_require_handshake_confirmation_, disable_connection_pooling_,
165 load_server_info_timeout_srtt_multiplier_, enable_connection_racing_, 221 load_server_info_timeout_srtt_multiplier_, enable_connection_racing_,
166 enable_non_blocking_io_, disable_disk_cache_, prefer_aes_, 222 enable_non_blocking_io_, disable_disk_cache_, prefer_aes_,
167 max_number_of_lossy_connections_, packet_loss_threshold_, 223 max_number_of_lossy_connections_, packet_loss_threshold_,
168 max_disabled_reasons_, threshold_timeouts_with_open_streams_, 224 max_disabled_reasons_, threshold_timeouts_with_open_streams_,
169 threshold_public_resets_post_handshake_, receive_buffer_size_, 225 threshold_public_resets_post_handshake_, receive_buffer_size_,
170 delay_tcp_race_, store_server_configs_in_properties_, 226 delay_tcp_race_, store_server_configs_in_properties_,
171 close_sessions_on_ip_change_, idle_connection_timeout_seconds_, 227 close_sessions_on_ip_change_, idle_connection_timeout_seconds_,
172 QuicTagVector())); 228 migrate_sessions_on_network_change_, QuicTagVector()));
173 factory_->set_require_confirmation(false); 229 factory_->set_require_confirmation(false);
174 factory_->set_quic_server_info_factory(new MockQuicServerInfoFactory()); 230 factory_->set_quic_server_info_factory(new MockQuicServerInfoFactory());
175 } 231 }
176 232
233 void InitializeConnectionMigrationTest(
234 NetworkChangeNotifier::NetworkList connected_networks) {
235 scoped_mock_network_change_notifier_.reset(
236 new ScopedMockNetworkChangeNotifier());
237 MockNetworkChangeNotifier* mock_ncn =
238 scoped_mock_network_change_notifier_->mock_network_change_notifier();
239 mock_ncn->ForceNetworkHandlesSupported();
240 mock_ncn->SetConnectedNetworksList(connected_networks);
241 migrate_sessions_on_network_change_ = true;
242 Initialize();
243 }
244
177 bool HasActiveSession(const HostPortPair& host_port_pair) { 245 bool HasActiveSession(const HostPortPair& host_port_pair) {
178 return QuicStreamFactoryPeer::HasActiveSession(factory_.get(), 246 return QuicStreamFactoryPeer::HasActiveSession(factory_.get(),
179 host_port_pair); 247 host_port_pair);
180 } 248 }
181 249
182 scoped_ptr<QuicHttpStream> CreateFromSession( 250 scoped_ptr<QuicHttpStream> CreateFromSession(
183 const HostPortPair& host_port_pair) { 251 const HostPortPair& host_port_pair) {
184 QuicChromiumClientSession* session = 252 QuicChromiumClientSession* session =
185 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair); 253 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair);
186 return QuicStreamFactoryPeer::CreateFromSession(factory_.get(), session); 254 return QuicStreamFactoryPeer::CreateFromSession(factory_.get(), session);
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
254 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem")); 322 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
255 EXPECT_TRUE(test_cert.get()); 323 EXPECT_TRUE(test_cert.get());
256 ProofVerifyDetailsChromium verify_details; 324 ProofVerifyDetailsChromium verify_details;
257 verify_details.cert_verify_result.verified_cert = test_cert; 325 verify_details.cert_verify_result.verified_cert = test_cert;
258 verify_details.cert_verify_result.is_issued_by_known_root = true; 326 verify_details.cert_verify_result.is_issued_by_known_root = true;
259 return verify_details; 327 return verify_details;
260 } 328 }
261 329
262 void NotifyIPAddressChanged() { 330 void NotifyIPAddressChanged() {
263 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); 331 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
264 // For thread safety, the NCN queues tasks to do the actual notifications, 332 // Spin the message loop so the notification is delivered.
265 // so we need to spin the message loop so the notification is delivered.
266 base::MessageLoop::current()->RunUntilIdle(); 333 base::MessageLoop::current()->RunUntilIdle();
267 } 334 }
268 335
336 void NotifySpecificNetworkChange(
337 NetworkChangeNotifier::NetworkChangeType type,
338 NetworkChangeNotifier::NetworkHandle network) {
339 NetworkChangeNotifier::NotifyObserversOfSpecificNetworkChangeForTests(
340 type, network);
341 // Spin the message loop so the notification is delivered.
342 base::MessageLoop::current()->RunUntilIdle();
343 }
344
269 MockHostResolver host_resolver_; 345 MockHostResolver host_resolver_;
270 MockClientSocketFactory socket_factory_; 346 MockClientSocketFactory socket_factory_;
271 MockCryptoClientStreamFactory crypto_client_stream_factory_; 347 MockCryptoClientStreamFactory crypto_client_stream_factory_;
272 MockRandom random_generator_; 348 MockRandom random_generator_;
273 MockClock* clock_; // Owned by factory_. 349 MockClock* clock_; // Owned by factory_.
274 scoped_refptr<TestTaskRunner> runner_; 350 scoped_refptr<TestTaskRunner> runner_;
275 QuicTestPacketMaker maker_; 351 QuicTestPacketMaker maker_;
276 HttpServerPropertiesImpl http_server_properties_; 352 HttpServerPropertiesImpl http_server_properties_;
277 scoped_ptr<CertVerifier> cert_verifier_; 353 scoped_ptr<CertVerifier> cert_verifier_;
278 scoped_ptr<ChannelIDService> channel_id_service_; 354 scoped_ptr<ChannelIDService> channel_id_service_;
279 TransportSecurityState transport_security_state_; 355 TransportSecurityState transport_security_state_;
280 scoped_ptr<CTVerifier> cert_transparency_verifier_; 356 scoped_ptr<CTVerifier> cert_transparency_verifier_;
357 scoped_ptr<ScopedMockNetworkChangeNotifier>
358 scoped_mock_network_change_notifier_;
281 scoped_ptr<QuicStreamFactory> factory_; 359 scoped_ptr<QuicStreamFactory> factory_;
282 HostPortPair host_port_pair_; 360 HostPortPair host_port_pair_;
283 PrivacyMode privacy_mode_; 361 PrivacyMode privacy_mode_;
284 BoundNetLog net_log_; 362 BoundNetLog net_log_;
285 TestCompletionCallback callback_; 363 TestCompletionCallback callback_;
286 364
287 // Variables to configure QuicStreamFactory. 365 // Variables to configure QuicStreamFactory.
288 bool enable_port_selection_; 366 bool enable_port_selection_;
289 bool always_require_handshake_confirmation_; 367 bool always_require_handshake_confirmation_;
290 bool disable_connection_pooling_; 368 bool disable_connection_pooling_;
291 double load_server_info_timeout_srtt_multiplier_; 369 double load_server_info_timeout_srtt_multiplier_;
292 bool enable_connection_racing_; 370 bool enable_connection_racing_;
293 bool enable_non_blocking_io_; 371 bool enable_non_blocking_io_;
294 bool disable_disk_cache_; 372 bool disable_disk_cache_;
295 bool prefer_aes_; 373 bool prefer_aes_;
296 int max_number_of_lossy_connections_; 374 int max_number_of_lossy_connections_;
297 double packet_loss_threshold_; 375 double packet_loss_threshold_;
298 int max_disabled_reasons_; 376 int max_disabled_reasons_;
299 int threshold_timeouts_with_open_streams_; 377 int threshold_timeouts_with_open_streams_;
300 int threshold_public_resets_post_handshake_; 378 int threshold_public_resets_post_handshake_;
301 int receive_buffer_size_; 379 int receive_buffer_size_;
302 bool delay_tcp_race_; 380 bool delay_tcp_race_;
303 bool store_server_configs_in_properties_; 381 bool store_server_configs_in_properties_;
304 bool close_sessions_on_ip_change_; 382 bool close_sessions_on_ip_change_;
305 int idle_connection_timeout_seconds_; 383 int idle_connection_timeout_seconds_;
384 bool migrate_sessions_on_network_change_;
306 }; 385 };
307 386
308 INSTANTIATE_TEST_CASE_P(Version, 387 INSTANTIATE_TEST_CASE_P(Version,
309 QuicStreamFactoryTest, 388 QuicStreamFactoryTest,
310 ::testing::ValuesIn(GetTestParams())); 389 ::testing::ValuesIn(GetTestParams()));
311 390
312 TEST_P(QuicStreamFactoryTest, Create) { 391 TEST_P(QuicStreamFactoryTest, Create) {
313 Initialize(); 392 Initialize();
314 393
315 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; 394 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
(...skipping 810 matching lines...) Expand 10 before | Expand all | Expand 10 after
1126 /*cert_verify_flags=*/0, host_port_pair_.host(), 1205 /*cert_verify_flags=*/0, host_port_pair_.host(),
1127 "GET", net_log_, callback_.callback())); 1206 "GET", net_log_, callback_.callback()));
1128 1207
1129 EXPECT_EQ(OK, callback_.WaitForResult()); 1208 EXPECT_EQ(OK, callback_.WaitForResult());
1130 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 1209 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1131 HttpRequestInfo request_info; 1210 HttpRequestInfo request_info;
1132 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, 1211 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1133 net_log_, CompletionCallback())); 1212 net_log_, CompletionCallback()));
1134 1213
1135 // Close the session and verify that stream saw the error. 1214 // Close the session and verify that stream saw the error.
1136 factory_->CloseAllSessions(ERR_INTERNET_DISCONNECTED); 1215 factory_->CloseAllSessions(ERR_INTERNET_DISCONNECTED, QUIC_INTERNAL_ERROR);
1137 EXPECT_EQ(ERR_INTERNET_DISCONNECTED, 1216 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1138 stream->ReadResponseHeaders(callback_.callback())); 1217 stream->ReadResponseHeaders(callback_.callback()));
1139 1218
1140 // Now attempting to request a stream to the same origin should create 1219 // Now attempting to request a stream to the same origin should create
1141 // a new session. 1220 // a new session.
1142 1221
1143 QuicStreamRequest request2(factory_.get()); 1222 QuicStreamRequest request2(factory_.get());
1144 EXPECT_EQ(ERR_IO_PENDING, 1223 EXPECT_EQ(ERR_IO_PENDING,
1145 request2.Request(host_port_pair_, privacy_mode_, 1224 request2.Request(host_port_pair_, privacy_mode_,
1146 /*cert_verify_flags=*/0, host_port_pair_.host(), 1225 /*cert_verify_flags=*/0, host_port_pair_.host(),
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1203 EXPECT_EQ(OK, callback_.WaitForResult()); 1282 EXPECT_EQ(OK, callback_.WaitForResult());
1204 stream = request2.ReleaseStream(); 1283 stream = request2.ReleaseStream();
1205 stream.reset(); // Will reset stream 3. 1284 stream.reset(); // Will reset stream 3.
1206 1285
1207 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 1286 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1208 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 1287 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1209 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); 1288 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1210 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); 1289 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1211 } 1290 }
1212 1291
1292 TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnect) {
1293 InitializeConnectionMigrationTest(
1294 {kDefaultNetworkForTests, kNewNetworkForTests});
1295
1296 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1297 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1298 socket_factory_.AddSocketDataProvider(&socket_data);
1299
1300 // Create request and QuicHttpStream.
1301 QuicStreamRequest request(factory_.get());
1302 EXPECT_EQ(ERR_IO_PENDING,
1303 request.Request(host_port_pair_, privacy_mode_,
1304 /*cert_verify_flags=*/0, host_port_pair_.host(),
1305 "GET", net_log_, callback_.callback()));
1306 EXPECT_EQ(OK, callback_.WaitForResult());
1307 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1308 EXPECT_TRUE(stream.get());
1309
1310 // Cause QUIC stream to be created.
1311 HttpRequestInfo request_info;
1312 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1313 net_log_, CompletionCallback()));
1314
1315 // Ensure that session is alive and active.
1316 QuicChromiumClientSession* session =
1317 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1318 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1319 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1320
1321 // Set up second socket data provider that is used after migration.
1322 MockRead reads1[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1323 scoped_ptr<QuicEncryptedPacket> ping(
1324 maker_.MakePingPacket(1, /*include_version=*/true));
1325 MockWrite writes1[] = {
1326 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 1)};
1327 SequencedSocketData socket_data1(reads1, arraysize(reads1), writes1,
1328 arraysize(writes1));
1329 socket_factory_.AddSocketDataProvider(&socket_data1);
1330
1331 // Cause connection migration to happen. This should cause a PING frame
1332 // to be emitted.
1333 NotifySpecificNetworkChange(NetworkChangeNotifier::SOON_TO_DISCONNECT,
1334 kDefaultNetworkForTests);
1335
1336 // The session should now be marked as going away. Ensure that
1337 // while it is still alive, it is no longer active.
1338 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1339 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1340 EXPECT_EQ(1u, session->GetNumActiveStreams());
1341
1342 // Create a new request for the same destination and verify that a
1343 // new session is created.
1344 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1345 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1346 socket_factory_.AddSocketDataProvider(&socket_data2);
1347
1348 QuicStreamRequest request2(factory_.get());
1349 EXPECT_EQ(ERR_IO_PENDING,
1350 request2.Request(host_port_pair_, privacy_mode_,
1351 /*cert_verify_flags=*/0, host_port_pair_.host(),
1352 "GET", net_log_, callback_.callback()));
1353 EXPECT_EQ(OK, callback_.WaitForResult());
1354 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1355 EXPECT_TRUE(stream2.get());
1356
1357 EXPECT_TRUE(
1358 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
1359 EXPECT_NE(session, QuicStreamFactoryPeer::GetActiveSession(factory_.get(),
1360 host_port_pair_));
1361
1362 // On a DISCONNECTED notification, nothing happens to the migrated session.
1363 NotifySpecificNetworkChange(NetworkChangeNotifier::DISCONNECTED,
1364 kDefaultNetworkForTests);
1365 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1366 EXPECT_EQ(1u, session->GetNumActiveStreams());
1367
1368 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1369 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1370 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1371 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1372 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1373 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1374 }
1375
1376 TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnected) {
1377 InitializeConnectionMigrationTest(
1378 {kDefaultNetworkForTests, kNewNetworkForTests});
1379
1380 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1381 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1382 socket_factory_.AddSocketDataProvider(&socket_data);
1383
1384 // Create request and QuicHttpStream.
1385 QuicStreamRequest request(factory_.get());
1386 EXPECT_EQ(ERR_IO_PENDING,
1387 request.Request(host_port_pair_, privacy_mode_,
1388 /*cert_verify_flags=*/0, host_port_pair_.host(),
1389 "GET", net_log_, callback_.callback()));
1390 EXPECT_EQ(OK, callback_.WaitForResult());
1391 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1392 EXPECT_TRUE(stream.get());
1393
1394 // Cause QUIC stream to be created.
1395 HttpRequestInfo request_info;
1396 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1397 net_log_, CompletionCallback()));
1398
1399 // Ensure that session is alive and active.
1400 QuicChromiumClientSession* session =
1401 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1402 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1403 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1404
1405 // Set up second socket data provider that is used after migration.
1406 MockRead reads1[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1407 scoped_ptr<QuicEncryptedPacket> ping(
1408 maker_.MakePingPacket(1, /*include_version=*/true));
1409 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
1410 2, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1411 MockWrite writes1[] = {
1412 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 1),
1413 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 2)};
1414 SequencedSocketData socket_data1(reads1, arraysize(reads1), writes1,
1415 arraysize(writes1));
1416 socket_factory_.AddSocketDataProvider(&socket_data1);
1417
1418 // Cause connection migration to happen. This should cause a PING frame
1419 // to be emitted.
1420 NotifySpecificNetworkChange(NetworkChangeNotifier::DISCONNECTED,
1421 kDefaultNetworkForTests);
1422
1423 // The session should now be marked as going away. Ensure that
1424 // while it is still alive, it is no longer active.
1425 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1426 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1427 EXPECT_EQ(1u, session->GetNumActiveStreams());
1428
1429 // Create a new request for the same destination and verify that a
1430 // new session is created.
1431 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1432 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1433 socket_factory_.AddSocketDataProvider(&socket_data2);
1434
1435 QuicStreamRequest request2(factory_.get());
1436 EXPECT_EQ(ERR_IO_PENDING,
1437 request2.Request(host_port_pair_, privacy_mode_,
1438 /*cert_verify_flags=*/0, host_port_pair_.host(),
1439 "GET", net_log_, callback_.callback()));
1440 EXPECT_EQ(OK, callback_.WaitForResult());
1441 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1442 EXPECT_TRUE(stream2.get());
1443
1444 EXPECT_TRUE(
1445 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
1446 EXPECT_NE(session, QuicStreamFactoryPeer::GetActiveSession(factory_.get(),
1447 host_port_pair_));
1448 EXPECT_EQ(true,
1449 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1450
1451 stream.reset();
1452 stream2.reset();
1453
1454 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1455 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1456 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1457 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1458 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1459 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1460 }
1461
1462 TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoNetworks) {
1463 NetworkChangeNotifier::NetworkList no_networks(0);
1464 InitializeConnectionMigrationTest(no_networks);
1465
1466 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1467 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
1468 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1469 MockWrite writes[] = {
1470 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1471 };
1472 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1473 arraysize(writes));
1474 socket_factory_.AddSocketDataProvider(&socket_data);
1475
1476 // Create request and QuicHttpStream.
1477 QuicStreamRequest request(factory_.get());
1478 EXPECT_EQ(ERR_IO_PENDING,
1479 request.Request(host_port_pair_, privacy_mode_,
1480 /*cert_verify_flags=*/0, host_port_pair_.host(),
1481 "GET", net_log_, callback_.callback()));
1482 EXPECT_EQ(OK, callback_.WaitForResult());
1483 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1484 EXPECT_TRUE(stream.get());
1485
1486 // Cause QUIC stream to be created.
1487 HttpRequestInfo request_info;
1488 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1489 net_log_, CompletionCallback()));
1490
1491 // Ensure that session is alive and active.
1492 QuicChromiumClientSession* session =
1493 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1494 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1495 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1496 EXPECT_EQ(1u, session->GetNumActiveStreams());
1497
1498 // Cause connection migration to happen. Since there are no networks
1499 // to migrate to, this should cause the session to continue on the same
1500 // socket, but be marked as going away.
1501 NotifySpecificNetworkChange(NetworkChangeNotifier::SOON_TO_DISCONNECT,
1502 kDefaultNetworkForTests);
1503
1504 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1505 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1506 EXPECT_EQ(1u, session->GetNumActiveStreams());
1507
1508 stream.reset();
1509
1510 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1511 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1512 }
1513
1514 TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoNetworks) {
1515 NetworkChangeNotifier::NetworkList no_networks(0);
1516 InitializeConnectionMigrationTest(no_networks);
1517
1518 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1519 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
1520 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1521 MockWrite writes[] = {
1522 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
1523 };
1524 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1525 arraysize(writes));
1526 socket_factory_.AddSocketDataProvider(&socket_data);
1527
1528 // Create request and QuicHttpStream.
1529 QuicStreamRequest request(factory_.get());
1530 EXPECT_EQ(ERR_IO_PENDING,
1531 request.Request(host_port_pair_, privacy_mode_,
1532 /*cert_verify_flags=*/0, host_port_pair_.host(),
1533 "GET", net_log_, callback_.callback()));
1534 EXPECT_EQ(OK, callback_.WaitForResult());
1535 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1536 EXPECT_TRUE(stream.get());
1537
1538 // Cause QUIC stream to be created.
1539 HttpRequestInfo request_info;
1540 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1541 net_log_, CompletionCallback()));
1542
1543 // Ensure that session is alive and active.
1544 QuicChromiumClientSession* session =
1545 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1546 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1547 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1548
1549 // Cause connection migration to happen. Since there are no networks
1550 // to migrate to, this should cause a RST_STREAM frame to be emitted
1551 // and the session to be closed.
1552 NotifySpecificNetworkChange(NetworkChangeNotifier::DISCONNECTED,
1553 kDefaultNetworkForTests);
1554
1555 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1556 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1557
1558 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1559 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1560 }
1561
1562 TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoNewNetwork) {
1563 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
1564
1565 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1566 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
1567 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1568 MockWrite writes[] = {
1569 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1570 };
1571 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1572 arraysize(writes));
1573 socket_factory_.AddSocketDataProvider(&socket_data);
1574
1575 // Create request and QuicHttpStream.
1576 QuicStreamRequest request(factory_.get());
1577 EXPECT_EQ(ERR_IO_PENDING,
1578 request.Request(host_port_pair_, privacy_mode_,
1579 /*cert_verify_flags=*/0, host_port_pair_.host(),
1580 "GET", net_log_, callback_.callback()));
1581 EXPECT_EQ(OK, callback_.WaitForResult());
1582 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1583 EXPECT_TRUE(stream.get());
1584
1585 // Cause QUIC stream to be created.
1586 HttpRequestInfo request_info;
1587 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1588 net_log_, CompletionCallback()));
1589
1590 // Ensure that session is alive and active.
1591 QuicChromiumClientSession* session =
1592 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1593 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1594 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1595
1596 // Cause connection migration to happen. Since there are no networks
1597 // to migrate to, this should cause session to be continue but be marked as
1598 // going away.
1599 NotifySpecificNetworkChange(NetworkChangeNotifier::SOON_TO_DISCONNECT,
1600 kDefaultNetworkForTests);
1601
1602 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1603 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1604 EXPECT_EQ(1u, session->GetNumActiveStreams());
1605
1606 stream.reset();
1607
1608 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1609 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1610 }
1611
1612 TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoNewNetwork) {
1613 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
1614
1615 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1616 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
1617 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1618 MockWrite writes[] = {
1619 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
1620 };
1621 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1622 arraysize(writes));
1623 socket_factory_.AddSocketDataProvider(&socket_data);
1624
1625 // Create request and QuicHttpStream.
1626 QuicStreamRequest request(factory_.get());
1627 EXPECT_EQ(ERR_IO_PENDING,
1628 request.Request(host_port_pair_, privacy_mode_,
1629 /*cert_verify_flags=*/0, host_port_pair_.host(),
1630 "GET", net_log_, callback_.callback()));
1631 EXPECT_EQ(OK, callback_.WaitForResult());
1632 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1633 EXPECT_TRUE(stream.get());
1634
1635 // Cause QUIC stream to be created.
1636 HttpRequestInfo request_info;
1637 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1638 net_log_, CompletionCallback()));
1639
1640 // Ensure that session is alive and active.
1641 QuicChromiumClientSession* session =
1642 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1643 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1644 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1645
1646 // Cause connection migration to happen. Since there are no networks
1647 // to migrate to, this should cause a RST_STREAM frame to be emitted
1648 // with QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed.
1649 NotifySpecificNetworkChange(NetworkChangeNotifier::DISCONNECTED,
1650 kDefaultNetworkForTests);
1651
1652 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1653 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1654
1655 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1656 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1657 }
1658
1659 TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoOpenStreams) {
1660 InitializeConnectionMigrationTest(
1661 {kDefaultNetworkForTests, kNewNetworkForTests});
1662
1663 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1664 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0u);
1665 socket_factory_.AddSocketDataProvider(&socket_data);
1666
1667 // Create request and QuicHttpStream.
1668 QuicStreamRequest request(factory_.get());
1669 EXPECT_EQ(ERR_IO_PENDING,
1670 request.Request(host_port_pair_, privacy_mode_,
1671 /*cert_verify_flags=*/0, host_port_pair_.host(),
1672 "GET", net_log_, callback_.callback()));
1673 EXPECT_EQ(OK, callback_.WaitForResult());
1674 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1675 EXPECT_TRUE(stream.get());
1676
1677 // Ensure that session is alive and active.
1678 QuicChromiumClientSession* session =
1679 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1680 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1681 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1682
1683 // Cause connection migration to happen. Since there are no active streams,
1684 // the session will be closed.
1685 NotifySpecificNetworkChange(NetworkChangeNotifier::DISCONNECTED,
1686 kDefaultNetworkForTests);
1687
1688 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1689 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1690
1691 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1692 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1693 }
1694
1695 TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoOpenStreams) {
1696 InitializeConnectionMigrationTest(
1697 {kDefaultNetworkForTests, kNewNetworkForTests});
1698
1699 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1700 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0u);
1701 socket_factory_.AddSocketDataProvider(&socket_data);
1702
1703 // Create request and QuicHttpStream.
1704 QuicStreamRequest request(factory_.get());
1705 EXPECT_EQ(ERR_IO_PENDING,
1706 request.Request(host_port_pair_, privacy_mode_,
1707 /*cert_verify_flags=*/0, host_port_pair_.host(),
1708 "GET", net_log_, callback_.callback()));
1709 EXPECT_EQ(OK, callback_.WaitForResult());
1710 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1711 EXPECT_TRUE(stream.get());
1712
1713 // Ensure that session is alive and active.
1714 QuicChromiumClientSession* session =
1715 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1716 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1717 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1718
1719 // Cause connection migration to happen. Since there are no active streams,
1720 // the session will be closed.
1721 NotifySpecificNetworkChange(NetworkChangeNotifier::DISCONNECTED,
1722 kDefaultNetworkForTests);
1723
1724 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1725 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1726
1727 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1728 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1729 }
1730
1213 TEST_P(QuicStreamFactoryTest, OnSSLConfigChanged) { 1731 TEST_P(QuicStreamFactoryTest, OnSSLConfigChanged) {
1214 Initialize(); 1732 Initialize();
1215 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; 1733 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1216 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket()); 1734 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1217 std::vector<MockWrite> writes; 1735 std::vector<MockWrite> writes;
1218 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1)); 1736 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
1219 SequencedSocketData socket_data(reads, arraysize(reads), 1737 SequencedSocketData socket_data(reads, arraysize(reads),
1220 writes.empty() ? nullptr : &writes[0], 1738 writes.empty() ? nullptr : &writes[0],
1221 writes.size()); 1739 writes.size());
1222 socket_factory_.AddSocketDataProvider(&socket_data); 1740 socket_factory_.AddSocketDataProvider(&socket_data);
(...skipping 1356 matching lines...) Expand 10 before | Expand all | Expand 10 after
2579 EXPECT_EQ(1u, observer.executed_count()); 3097 EXPECT_EQ(1u, observer.executed_count());
2580 3098
2581 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 3099 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2582 EXPECT_TRUE(stream.get()); 3100 EXPECT_TRUE(stream.get());
2583 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 3101 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2584 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 3102 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2585 } 3103 }
2586 3104
2587 } // namespace test 3105 } // namespace test
2588 } // namespace net 3106 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698