blob: ef056be66ec7a0d81f4edd1dc298276f71a7f718 [file] [log] [blame]
[email protected]e13201d82012-12-12 05:00:321// 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
3// found in the LICENSE file.
4
5#include "net/quic/quic_stream_factory.h"
6
bnc359ed2a2016-04-29 20:43:457#include <ostream>
bnc086b39e12016-06-24 13:05:268#include <utility>
bnc359ed2a2016-04-29 20:43:459
[email protected]e13201d82012-12-12 05:00:3210#include "base/run_loop.h"
[email protected]fc9be5802013-06-11 10:56:5111#include "base/strings/string_util.h"
gabf767595f2016-05-11 18:50:3512#include "base/threading/thread_task_runner_handle.h"
[email protected]6d1b4ed2013-07-10 03:57:5413#include "net/cert/cert_verifier.h"
rsleevid6de8302016-06-21 01:33:2014#include "net/cert/ct_policy_enforcer.h"
rtenneti052774e2015-11-24 21:00:1215#include "net/cert/multi_log_ct_verifier.h"
[email protected]f2cb3cf2013-03-21 01:40:5316#include "net/dns/mock_host_resolver.h"
[email protected]e13201d82012-12-12 05:00:3217#include "net/http/http_response_headers.h"
18#include "net/http/http_response_info.h"
rtenneti8332ba52015-09-17 19:33:4119#include "net/http/http_server_properties_impl.h"
[email protected]e13201d82012-12-12 05:00:3220#include "net/http/http_util.h"
[email protected]080b77932014-08-04 01:22:4621#include "net/http/transport_security_state.h"
[email protected]c49ff182013-09-28 08:33:2622#include "net/quic/crypto/crypto_handshake.h"
[email protected]b694e48c2014-03-18 17:10:1323#include "net/quic/crypto/proof_verifier_chromium.h"
rtenneticd2aaa15b2015-10-10 20:29:3324#include "net/quic/crypto/properties_based_quic_server_info.h"
25#include "net/quic/crypto/quic_crypto_client_config.h"
[email protected]4df69842013-02-27 06:32:1626#include "net/quic/crypto/quic_decrypter.h"
27#include "net/quic/crypto/quic_encrypter.h"
rtenneti38f5cd52014-10-28 20:28:2828#include "net/quic/crypto/quic_server_info.h"
ckrasic3865ee0f2016-02-29 22:04:5629#include "net/quic/quic_client_promised_info.h"
jri7e636642016-01-14 06:57:0830#include "net/quic/quic_http_utils.h"
[email protected]e13201d82012-12-12 05:00:3231#include "net/quic/test_tools/mock_clock.h"
[email protected]e8ff26842013-03-22 21:02:0532#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
[email protected]9558c5d32012-12-22 00:08:1433#include "net/quic/test_tools/mock_random.h"
jri9c541572016-03-29 17:51:4834#include "net/quic/test_tools/quic_config_peer.h"
rtennetid2e74caa2015-12-09 00:51:5735#include "net/quic/test_tools/quic_stream_factory_peer.h"
[email protected]1e960032013-12-20 19:00:2036#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]e13201d82012-12-12 05:00:3237#include "net/quic/test_tools/quic_test_utils.h"
rtenneti38f5cd52014-10-28 20:28:2838#include "net/quic/test_tools/test_task_runner.h"
[email protected]e13201d82012-12-12 05:00:3239#include "net/socket/socket_test_util.h"
rtenneti1cd3b162015-09-29 02:58:2840#include "net/spdy/spdy_session_test_util.h"
[email protected]5db452202014-08-19 05:22:1541#include "net/spdy/spdy_test_utils.h"
[email protected]6b8a3c742014-07-25 00:25:3542#include "net/ssl/channel_id_service.h"
43#include "net/ssl/default_channel_id_store.h"
[email protected]eed749f92013-12-23 18:57:3844#include "net/test/cert_test_util.h"
robpercival214763f2016-07-01 23:27:0145#include "net/test/gtest_util.h"
rsleevia69c79a2016-06-22 03:28:4346#include "net/test/test_data_directory.h"
robpercival214763f2016-07-01 23:27:0147#include "testing/gmock/include/gmock/gmock.h"
[email protected]e13201d82012-12-12 05:00:3248#include "testing/gtest/include/gtest/gtest.h"
49
robpercival214763f2016-07-01 23:27:0150using net::test::IsError;
51using net::test::IsOk;
52
[email protected]6e12d702013-11-13 00:17:1753using std::string;
54using std::vector;
55
[email protected]e13201d82012-12-12 05:00:3256namespace net {
jri7e636642016-01-14 06:57:0857
nharper642ae4b2016-06-30 00:40:3658namespace {
59
60class MockSSLConfigService : public SSLConfigService {
61 public:
62 MockSSLConfigService() {}
63
64 void GetSSLConfig(SSLConfig* config) override { *config = config_; }
65
66 private:
67 ~MockSSLConfigService() override {}
68
69 SSLConfig config_;
70};
71
72} // namespace
73
[email protected]e13201d82012-12-12 05:00:3274namespace test {
75
[email protected]3c772402013-12-18 21:38:1176namespace {
bnc359ed2a2016-04-29 20:43:4577
78enum DestinationType {
79 // In pooling tests with two requests for different origins to the same
80 // destination, the destination should be
81 SAME_AS_FIRST, // the same as the first origin,
82 SAME_AS_SECOND, // the same as the second origin, or
83 DIFFERENT, // different from both.
84};
85
rch6faa4d42016-01-05 20:48:4386const char kDefaultServerHostName[] = "www.example.org";
87const char kServer2HostName[] = "mail.example.org";
88const char kServer3HostName[] = "docs.example.org";
89const char kServer4HostName[] = "images.example.org";
bnc359ed2a2016-04-29 20:43:4590const char kDifferentHostname[] = "different.example.com";
[email protected]3c772402013-12-18 21:38:1191const int kDefaultServerPort = 443;
ckrasic3865ee0f2016-02-29 22:04:5692const char kDefaultUrl[] = "https://www.example.org/";
93const char kServer2Url[] = "https://mail.example.org/";
94const char kServer3Url[] = "https://docs.example.org/";
95const char kServer4Url[] = "https://images.example.org/";
rtenneti14abd312015-02-06 21:56:0196
bnc359ed2a2016-04-29 20:43:4597// Run QuicStreamFactoryTest instances with all value combinations of version
98// and enable_connection_racting.
rtenneti14abd312015-02-06 21:56:0199struct TestParams {
bnc359ed2a2016-04-29 20:43:45100 friend std::ostream& operator<<(std::ostream& os, const TestParams& p) {
101 os << "{ version: " << QuicVersionToString(p.version)
102 << ", enable_connection_racing: "
103 << (p.enable_connection_racing ? "true" : "false") << " }";
rtenneti14abd312015-02-06 21:56:01104 return os;
105 }
106
107 QuicVersion version;
108 bool enable_connection_racing;
109};
110
bnc5fdc07162016-05-23 17:36:03111vector<TestParams> GetTestParams() {
112 vector<TestParams> params;
rtenneti14abd312015-02-06 21:56:01113 QuicVersionVector all_supported_versions = QuicSupportedVersions();
114 for (const QuicVersion version : all_supported_versions) {
bnc359ed2a2016-04-29 20:43:45115 params.push_back(TestParams{version, false});
116 params.push_back(TestParams{version, true});
117 }
118 return params;
119}
120
121// Run QuicStreamFactoryWithDestinationTest instances with all value
122// combinations of version, enable_connection_racting, and destination_type.
123struct PoolingTestParams {
124 friend std::ostream& operator<<(std::ostream& os,
125 const PoolingTestParams& p) {
126 os << "{ version: " << QuicVersionToString(p.version)
127 << ", enable_connection_racing: "
128 << (p.enable_connection_racing ? "true" : "false")
129 << ", destination_type: ";
130 switch (p.destination_type) {
131 case SAME_AS_FIRST:
132 os << "SAME_AS_FIRST";
133 break;
134 case SAME_AS_SECOND:
135 os << "SAME_AS_SECOND";
136 break;
137 case DIFFERENT:
138 os << "DIFFERENT";
139 break;
140 }
141 os << " }";
142 return os;
143 }
144
145 QuicVersion version;
146 bool enable_connection_racing;
147 DestinationType destination_type;
148};
149
bnc5fdc07162016-05-23 17:36:03150vector<PoolingTestParams> GetPoolingTestParams() {
151 vector<PoolingTestParams> params;
bnc359ed2a2016-04-29 20:43:45152 QuicVersionVector all_supported_versions = QuicSupportedVersions();
153 for (const QuicVersion version : all_supported_versions) {
154 params.push_back(PoolingTestParams{version, false, SAME_AS_FIRST});
155 params.push_back(PoolingTestParams{version, false, SAME_AS_SECOND});
156 params.push_back(PoolingTestParams{version, false, DIFFERENT});
157 params.push_back(PoolingTestParams{version, true, SAME_AS_FIRST});
158 params.push_back(PoolingTestParams{version, true, SAME_AS_SECOND});
159 params.push_back(PoolingTestParams{version, true, DIFFERENT});
rtenneti14abd312015-02-06 21:56:01160 }
161 return params;
162}
163
bnc912a04b2016-04-20 14:19:50164} // namespace
[email protected]3c772402013-12-18 21:38:11165
bnc359ed2a2016-04-29 20:43:45166class QuicHttpStreamPeer {
167 public:
168 static QuicChromiumClientSession* GetSession(QuicHttpStream* stream) {
169 return stream->session_.get();
170 }
171};
172
rtenneti38f5cd52014-10-28 20:28:28173class MockQuicServerInfo : public QuicServerInfo {
174 public:
bnc912a04b2016-04-20 14:19:50175 explicit MockQuicServerInfo(const QuicServerId& server_id)
rtenneti38f5cd52014-10-28 20:28:28176 : QuicServerInfo(server_id) {}
dcheng2339883c2014-12-23 00:23:05177 ~MockQuicServerInfo() override {}
rtenneti38f5cd52014-10-28 20:28:28178
dcheng2339883c2014-12-23 00:23:05179 void Start() override {}
rtenneti38f5cd52014-10-28 20:28:28180
dcheng2339883c2014-12-23 00:23:05181 int WaitForDataReady(const CompletionCallback& callback) override {
rtenneti38f5cd52014-10-28 20:28:28182 return ERR_IO_PENDING;
183 }
184
rtenneti170f36a2015-02-10 19:13:45185 void ResetWaitForDataReadyCallback() override {}
186
dcheng2339883c2014-12-23 00:23:05187 void CancelWaitForDataReadyCallback() override {}
rtenneti38f5cd52014-10-28 20:28:28188
dcheng2339883c2014-12-23 00:23:05189 bool IsDataReady() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28190
dcheng2339883c2014-12-23 00:23:05191 bool IsReadyToPersist() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28192
dcheng2339883c2014-12-23 00:23:05193 void Persist() override {}
rtennetif0b832b2014-11-07 02:32:30194
dcheng2339883c2014-12-23 00:23:05195 void OnExternalCacheHit() override {}
rtenneti38f5cd52014-10-28 20:28:28196};
197
198class MockQuicServerInfoFactory : public QuicServerInfoFactory {
199 public:
200 MockQuicServerInfoFactory() {}
dcheng2339883c2014-12-23 00:23:05201 ~MockQuicServerInfoFactory() override {}
rtenneti38f5cd52014-10-28 20:28:28202
dcheng2339883c2014-12-23 00:23:05203 QuicServerInfo* GetForServer(const QuicServerId& server_id) override {
rtenneti38f5cd52014-10-28 20:28:28204 return new MockQuicServerInfo(server_id);
205 }
206};
207
jri7e636642016-01-14 06:57:08208class MockNetworkChangeNotifier : public NetworkChangeNotifier {
209 public:
210 MockNetworkChangeNotifier() : force_network_handles_supported_(false) {}
211
212 ConnectionType GetCurrentConnectionType() const override {
213 return CONNECTION_UNKNOWN;
214 }
215
216 void ForceNetworkHandlesSupported() {
217 force_network_handles_supported_ = true;
218 }
219
220 bool AreNetworkHandlesCurrentlySupported() const override {
221 return force_network_handles_supported_;
222 }
223
224 void SetConnectedNetworksList(const NetworkList& network_list) {
225 connected_networks_ = network_list;
226 }
227
228 void GetCurrentConnectedNetworks(NetworkList* network_list) const override {
229 network_list->clear();
230 *network_list = connected_networks_;
231 }
232
233 void NotifyNetworkSoonToDisconnect(
234 NetworkChangeNotifier::NetworkHandle network) {
235 NetworkChangeNotifier::NotifyObserversOfSpecificNetworkChange(
236 NetworkChangeNotifier::SOON_TO_DISCONNECT, network);
237 // Spin the message loop so the notification is delivered.
fdoray92e35a72016-06-10 15:54:55238 base::RunLoop().RunUntilIdle();
jri7e636642016-01-14 06:57:08239 }
240
241 void NotifyNetworkDisconnected(NetworkChangeNotifier::NetworkHandle network) {
242 NetworkChangeNotifier::NotifyObserversOfSpecificNetworkChange(
243 NetworkChangeNotifier::DISCONNECTED, network);
244 // Spin the message loop so the notification is delivered.
fdoray92e35a72016-06-10 15:54:55245 base::RunLoop().RunUntilIdle();
jri7e636642016-01-14 06:57:08246 }
247
248 private:
249 bool force_network_handles_supported_;
250 NetworkChangeNotifier::NetworkList connected_networks_;
251};
252
253// Class to replace existing NetworkChangeNotifier singleton with a
254// MockNetworkChangeNotifier for a test. To use, simply create a
255// ScopedMockNetworkChangeNotifier object in the test.
256class ScopedMockNetworkChangeNotifier {
257 public:
258 ScopedMockNetworkChangeNotifier()
259 : disable_network_change_notifier_for_tests_(
260 new NetworkChangeNotifier::DisableForTest()),
261 mock_network_change_notifier_(new MockNetworkChangeNotifier()) {}
262
263 MockNetworkChangeNotifier* mock_network_change_notifier() {
264 return mock_network_change_notifier_.get();
265 }
266
267 private:
danakjad1777e2016-04-16 00:56:42268 std::unique_ptr<NetworkChangeNotifier::DisableForTest>
jri7e636642016-01-14 06:57:08269 disable_network_change_notifier_for_tests_;
danakjad1777e2016-04-16 00:56:42270 std::unique_ptr<MockNetworkChangeNotifier> mock_network_change_notifier_;
jri7e636642016-01-14 06:57:08271};
272
bnc359ed2a2016-04-29 20:43:45273class QuicStreamFactoryTestBase {
[email protected]e13201d82012-12-12 05:00:32274 protected:
bnc359ed2a2016-04-29 20:43:45275 QuicStreamFactoryTestBase(QuicVersion version, bool enable_connection_racing)
nharper642ae4b2016-06-30 00:40:36276 : ssl_config_service_(new MockSSLConfigService),
277 random_generator_(0),
[email protected]457d6952013-12-13 09:24:58278 clock_(new MockClock()),
rtenneti38f5cd52014-10-28 20:28:28279 runner_(new TestTaskRunner(clock_)),
bnc359ed2a2016-04-29 20:43:45280 version_(version),
alyssar2adf3ac2016-05-03 17:12:58281 client_maker_(version_,
282 0,
283 clock_,
284 kDefaultServerHostName,
285 Perspective::IS_CLIENT),
286 server_maker_(version_,
287 0,
288 clock_,
289 kDefaultServerHostName,
290 Perspective::IS_SERVER),
[email protected]59c0bbd2014-03-22 04:08:12291 cert_verifier_(CertVerifier::CreateDefault()),
jri2b966f22014-09-02 22:25:36292 channel_id_service_(
rtennetibe635732014-10-02 22:51:42293 new ChannelIDService(new DefaultChannelIDStore(nullptr),
skyostil4891b25b2015-06-11 11:43:45294 base::ThreadTaskRunnerHandle::Get())),
rtenneti052774e2015-11-24 21:00:12295 cert_transparency_verifier_(new MultiLogCTVerifier()),
jri7e636642016-01-14 06:57:08296 scoped_mock_network_change_notifier_(nullptr),
jri7046038f2015-10-22 00:29:26297 factory_(nullptr),
[email protected]bf4ea2f2014-03-10 22:57:53298 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
ckrasic3865ee0f2016-02-29 22:04:56299 url_(kDefaultUrl),
300 url2_(kServer2Url),
301 url3_(kServer3Url),
302 url4_(kServer4Url),
jri7046038f2015-10-22 00:29:26303 privacy_mode_(PRIVACY_MODE_DISABLED),
304 enable_port_selection_(true),
305 always_require_handshake_confirmation_(false),
306 disable_connection_pooling_(false),
307 load_server_info_timeout_srtt_multiplier_(0.0f),
bnc359ed2a2016-04-29 20:43:45308 enable_connection_racing_(enable_connection_racing),
jri7046038f2015-10-22 00:29:26309 enable_non_blocking_io_(true),
310 disable_disk_cache_(false),
311 prefer_aes_(false),
312 max_number_of_lossy_connections_(0),
313 packet_loss_threshold_(1.0f),
314 max_disabled_reasons_(3),
315 threshold_timeouts_with_open_streams_(2),
316 threshold_public_resets_post_handshake_(2),
317 receive_buffer_size_(0),
rtennetiafccbc062016-05-16 18:21:14318 delay_tcp_race_(true),
rtenneti41c09992015-11-30 18:24:01319 close_sessions_on_ip_change_(false),
zhongyi89649c32016-01-22 00:14:01320 disable_quic_on_timeout_with_open_streams_(false),
jri7e636642016-01-14 06:57:08321 idle_connection_timeout_seconds_(kIdleConnectionTimeoutSeconds),
jrid36ada62016-02-06 02:42:08322 migrate_sessions_on_network_change_(false),
323 migrate_sessions_early_(false) {
[email protected]ca4e0d92014-08-22 16:33:22324 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
jri7046038f2015-10-22 00:29:26325 }
326
bnc359ed2a2016-04-29 20:43:45327 ~QuicStreamFactoryTestBase() {
328 // If |factory_| was initialized, then it took over ownership of |clock_|.
329 // If |factory_| was not initialized, then |clock_| needs to be destroyed.
330 if (!factory_) {
331 delete clock_;
332 }
333 }
334
jri7046038f2015-10-22 00:29:26335 void Initialize() {
bnc359ed2a2016-04-29 20:43:45336 DCHECK(!factory_);
jri7046038f2015-10-22 00:29:26337 factory_.reset(new QuicStreamFactory(
nharper642ae4b2016-06-30 00:40:36338 net_log_.net_log(), &host_resolver_, ssl_config_service_.get(),
339 &socket_factory_, &http_server_properties_, cert_verifier_.get(),
340 &ct_policy_enforcer_, channel_id_service_.get(),
341 &transport_security_state_, cert_transparency_verifier_.get(),
jri7046038f2015-10-22 00:29:26342 /*SocketPerformanceWatcherFactory*/ nullptr,
343 &crypto_client_stream_factory_, &random_generator_, clock_,
bnc5fdc07162016-05-23 17:36:03344 kDefaultMaxPacketSize, string(), SupportedVersions(version_),
bnc359ed2a2016-04-29 20:43:45345 enable_port_selection_, always_require_handshake_confirmation_,
346 disable_connection_pooling_, load_server_info_timeout_srtt_multiplier_,
347 enable_connection_racing_, enable_non_blocking_io_, disable_disk_cache_,
348 prefer_aes_, max_number_of_lossy_connections_, packet_loss_threshold_,
jri7046038f2015-10-22 00:29:26349 max_disabled_reasons_, threshold_timeouts_with_open_streams_,
350 threshold_public_resets_post_handshake_, receive_buffer_size_,
rtennetib8e80fb2016-05-16 00:12:09351 delay_tcp_race_, /*max_server_configs_stored_in_properties*/ 0,
zhongyi89649c32016-01-22 00:14:01352 close_sessions_on_ip_change_,
353 disable_quic_on_timeout_with_open_streams_,
354 idle_connection_timeout_seconds_, migrate_sessions_on_network_change_,
nharperd5cddca2016-02-27 03:37:52355 migrate_sessions_early_, QuicTagVector(),
356 /*enable_token_binding*/ false));
jri7046038f2015-10-22 00:29:26357 factory_->set_require_confirmation(false);
rtenneti6971c172016-01-15 20:12:10358 EXPECT_FALSE(factory_->has_quic_server_info_factory());
jri7046038f2015-10-22 00:29:26359 factory_->set_quic_server_info_factory(new MockQuicServerInfoFactory());
rtenneti6971c172016-01-15 20:12:10360 EXPECT_TRUE(factory_->has_quic_server_info_factory());
[email protected]e13201d82012-12-12 05:00:32361 }
362
jri7e636642016-01-14 06:57:08363 void InitializeConnectionMigrationTest(
364 NetworkChangeNotifier::NetworkList connected_networks) {
365 scoped_mock_network_change_notifier_.reset(
366 new ScopedMockNetworkChangeNotifier());
367 MockNetworkChangeNotifier* mock_ncn =
368 scoped_mock_network_change_notifier_->mock_network_change_notifier();
369 mock_ncn->ForceNetworkHandlesSupported();
370 mock_ncn->SetConnectedNetworksList(connected_networks);
371 migrate_sessions_on_network_change_ = true;
jrid36ada62016-02-06 02:42:08372 migrate_sessions_early_ = true;
jri7e636642016-01-14 06:57:08373 Initialize();
374 }
375
bnccb7ff3c2015-05-21 20:51:55376 bool HasActiveSession(const HostPortPair& host_port_pair) {
bnc5fdc07162016-05-23 17:36:03377 QuicServerId server_id(host_port_pair, PRIVACY_MODE_DISABLED);
378 return QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server_id);
bnccb7ff3c2015-05-21 20:51:55379 }
380
bnc912a04b2016-04-20 14:19:50381 QuicChromiumClientSession* GetActiveSession(
382 const HostPortPair& host_port_pair) {
bnc5fdc07162016-05-23 17:36:03383 QuicServerId server_id(host_port_pair, PRIVACY_MODE_DISABLED);
384 return QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server_id);
bnc912a04b2016-04-20 14:19:50385 }
386
danakjad1777e2016-04-16 00:56:42387 std::unique_ptr<QuicHttpStream> CreateFromSession(
bnccb7ff3c2015-05-21 20:51:55388 const HostPortPair& host_port_pair) {
bnc912a04b2016-04-20 14:19:50389 QuicChromiumClientSession* session = GetActiveSession(host_port_pair);
jri7046038f2015-10-22 00:29:26390 return QuicStreamFactoryPeer::CreateFromSession(factory_.get(), session);
[email protected]df157d9d2014-03-10 07:27:27391 }
[email protected]e13201d82012-12-12 05:00:32392
[email protected]bf4ea2f2014-03-10 22:57:53393 int GetSourcePortForNewSession(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10394 return GetSourcePortForNewSessionInner(destination, false);
395 }
396
rjshaded5ced072015-12-18 19:26:02397 int GetSourcePortForNewSessionAndGoAway(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10398 return GetSourcePortForNewSessionInner(destination, true);
399 }
400
[email protected]bf4ea2f2014-03-10 22:57:53401 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
[email protected]d8e2abf82014-03-06 10:30:10402 bool goaway_received) {
[email protected]3c772402013-12-18 21:38:11403 // Should only be called if there is no active session for this destination.
bnccb7ff3c2015-05-21 20:51:55404 EXPECT_FALSE(HasActiveSession(destination));
mmenke651bae7f2015-12-18 21:26:45405 size_t socket_count = socket_factory_.udp_client_socket_ports().size();
[email protected]3c772402013-12-18 21:38:11406
mmenke651bae7f2015-12-18 21:26:45407 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
408 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]3c772402013-12-18 21:38:11409 socket_factory_.AddSocketDataProvider(&socket_data);
410
jri7046038f2015-10-22 00:29:26411 QuicStreamRequest request(factory_.get());
ckrasic3865ee0f2016-02-29 22:04:56412 GURL url("https://" + destination.host() + "/");
[email protected]974849d2014-02-06 01:32:59413 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56414 request.Request(destination, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56415 /*cert_verify_flags=*/0, url, "GET", net_log_,
416 callback_.callback()));
[email protected]3c772402013-12-18 21:38:11417
robpercival214763f2016-07-01 23:27:01418 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:42419 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]3c772402013-12-18 21:38:11420 EXPECT_TRUE(stream.get());
421 stream.reset();
422
bnc912a04b2016-04-20 14:19:50423 QuicChromiumClientSession* session = GetActiveSession(destination);
[email protected]3c772402013-12-18 21:38:11424
mmenke651bae7f2015-12-18 21:26:45425 if (socket_count + 1 != socket_factory_.udp_client_socket_ports().size()) {
426 ADD_FAILURE();
[email protected]3c772402013-12-18 21:38:11427 return 0;
428 }
429
[email protected]d8e2abf82014-03-06 10:30:10430 if (goaway_received) {
431 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, "");
rtenneti9bd5d4b2015-08-21 05:44:52432 session->connection()->OnGoAwayFrame(goaway);
[email protected]d8e2abf82014-03-06 10:30:10433 }
[email protected]3c772402013-12-18 21:38:11434
jri7046038f2015-10-22 00:29:26435 factory_->OnSessionClosed(session);
bnccb7ff3c2015-05-21 20:51:55436 EXPECT_FALSE(HasActiveSession(destination));
rch37de576c2015-05-17 20:28:17437 EXPECT_TRUE(socket_data.AllReadDataConsumed());
438 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:45439 return socket_factory_.udp_client_socket_ports()[socket_count];
[email protected]3c772402013-12-18 21:38:11440 }
441
alyssar2adf3ac2016-05-03 17:12:58442 std::unique_ptr<QuicEncryptedPacket> ConstructClientConnectionClosePacket(
rtenneti1cd3b162015-09-29 02:58:28443 QuicPacketNumber num) {
alyssar2adf3ac2016-05-03 17:12:58444 return client_maker_.MakeConnectionClosePacket(num);
rtenneti1cd3b162015-09-29 02:58:28445 }
446
alyssar2adf3ac2016-05-03 17:12:58447 std::unique_ptr<QuicEncryptedPacket> ConstructClientRstPacket() {
[email protected]66ae5962014-05-22 11:13:05448 QuicStreamId stream_id = kClientDataStreamId1;
alyssar2adf3ac2016-05-03 17:12:58449 return client_maker_.MakeRstPacket(
[email protected]51cc1342014-04-18 23:44:37450 1, true, stream_id,
bnc359ed2a2016-04-29 20:43:45451 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, version_));
[email protected]459a7402014-02-10 12:58:52452 }
453
bncf8bf0722015-05-19 20:04:13454 static ProofVerifyDetailsChromium DefaultProofVerifyDetails() {
rch6faa4d42016-01-05 20:48:43455 // Load a certificate that is valid for *.example.org
bncf8bf0722015-05-19 20:04:13456 scoped_refptr<X509Certificate> test_cert(
rch6faa4d42016-01-05 20:48:43457 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bncf8bf0722015-05-19 20:04:13458 EXPECT_TRUE(test_cert.get());
459 ProofVerifyDetailsChromium verify_details;
460 verify_details.cert_verify_result.verified_cert = test_cert;
461 verify_details.cert_verify_result.is_issued_by_known_root = true;
462 return verify_details;
463 }
464
jri8c44d692015-10-23 23:53:41465 void NotifyIPAddressChanged() {
466 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
jri7e636642016-01-14 06:57:08467 // Spin the message loop so the notification is delivered.
fdoray92e35a72016-06-10 15:54:55468 base::RunLoop().RunUntilIdle();
jri8c44d692015-10-23 23:53:41469 }
470
danakjad1777e2016-04-16 00:56:42471 std::unique_ptr<QuicEncryptedPacket> ConstructGetRequestPacket(
jri7e636642016-01-14 06:57:08472 QuicPacketNumber packet_number,
473 QuicStreamId stream_id,
474 bool should_include_version,
475 bool fin) {
alyssar2adf3ac2016-05-03 17:12:58476 SpdyHeaderBlock headers =
477 client_maker_.GetRequestHeaders("GET", "https", "/");
jri7e636642016-01-14 06:57:08478 SpdyPriority priority =
479 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
480 size_t spdy_headers_frame_len;
alyssar2adf3ac2016-05-03 17:12:58481 return client_maker_.MakeRequestHeadersPacket(
jri7e636642016-01-14 06:57:08482 packet_number, stream_id, should_include_version, fin, priority,
bnc086b39e12016-06-24 13:05:26483 std::move(headers), &spdy_headers_frame_len);
jri7e636642016-01-14 06:57:08484 }
485
danakjad1777e2016-04-16 00:56:42486 std::unique_ptr<QuicEncryptedPacket> ConstructOkResponsePacket(
jri7e636642016-01-14 06:57:08487 QuicPacketNumber packet_number,
488 QuicStreamId stream_id,
489 bool should_include_version,
490 bool fin) {
alyssar2adf3ac2016-05-03 17:12:58491 SpdyHeaderBlock headers = server_maker_.GetResponseHeaders("200 OK");
jri7e636642016-01-14 06:57:08492 size_t spdy_headers_frame_len;
alyssar2adf3ac2016-05-03 17:12:58493 return server_maker_.MakeResponseHeadersPacket(
bnc086b39e12016-06-24 13:05:26494 packet_number, stream_id, should_include_version, fin,
495 std::move(headers), &spdy_headers_frame_len);
jri7e636642016-01-14 06:57:08496 }
497
[email protected]e13201d82012-12-12 05:00:32498 MockHostResolver host_resolver_;
nharper642ae4b2016-06-30 00:40:36499 scoped_refptr<SSLConfigService> ssl_config_service_;
mmenke651bae7f2015-12-18 21:26:45500 MockClientSocketFactory socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05501 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]9558c5d32012-12-22 00:08:14502 MockRandom random_generator_;
bnc359ed2a2016-04-29 20:43:45503 MockClock* clock_; // Owned by |factory_| once created.
rtenneti38f5cd52014-10-28 20:28:28504 scoped_refptr<TestTaskRunner> runner_;
bnc359ed2a2016-04-29 20:43:45505 QuicVersion version_;
alyssar2adf3ac2016-05-03 17:12:58506 QuicTestPacketMaker client_maker_;
507 QuicTestPacketMaker server_maker_;
rtenneticcab42b2015-10-09 06:38:16508 HttpServerPropertiesImpl http_server_properties_;
danakjad1777e2016-04-16 00:56:42509 std::unique_ptr<CertVerifier> cert_verifier_;
510 std::unique_ptr<ChannelIDService> channel_id_service_;
[email protected]080b77932014-08-04 01:22:46511 TransportSecurityState transport_security_state_;
danakjad1777e2016-04-16 00:56:42512 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
rsleevid6de8302016-06-21 01:33:20513 CTPolicyEnforcer ct_policy_enforcer_;
danakjad1777e2016-04-16 00:56:42514 std::unique_ptr<ScopedMockNetworkChangeNotifier>
jri7e636642016-01-14 06:57:08515 scoped_mock_network_change_notifier_;
danakjad1777e2016-04-16 00:56:42516 std::unique_ptr<QuicStreamFactory> factory_;
[email protected]bf4ea2f2014-03-10 22:57:53517 HostPortPair host_port_pair_;
ckrasic3865ee0f2016-02-29 22:04:56518 GURL url_;
519 GURL url2_;
520 GURL url3_;
521 GURL url4_;
522
[email protected]9dd3ff0f2014-03-26 09:51:28523 PrivacyMode privacy_mode_;
[email protected]e13201d82012-12-12 05:00:32524 BoundNetLog net_log_;
525 TestCompletionCallback callback_;
jri7046038f2015-10-22 00:29:26526
527 // Variables to configure QuicStreamFactory.
528 bool enable_port_selection_;
529 bool always_require_handshake_confirmation_;
530 bool disable_connection_pooling_;
531 double load_server_info_timeout_srtt_multiplier_;
532 bool enable_connection_racing_;
533 bool enable_non_blocking_io_;
534 bool disable_disk_cache_;
535 bool prefer_aes_;
536 int max_number_of_lossy_connections_;
537 double packet_loss_threshold_;
538 int max_disabled_reasons_;
539 int threshold_timeouts_with_open_streams_;
540 int threshold_public_resets_post_handshake_;
541 int receive_buffer_size_;
rtennetib8e80fb2016-05-16 00:12:09542 bool delay_tcp_race_;
jri8c44d692015-10-23 23:53:41543 bool close_sessions_on_ip_change_;
zhongyi89649c32016-01-22 00:14:01544 bool disable_quic_on_timeout_with_open_streams_;
rtenneti41c09992015-11-30 18:24:01545 int idle_connection_timeout_seconds_;
jri7e636642016-01-14 06:57:08546 bool migrate_sessions_on_network_change_;
jrid36ada62016-02-06 02:42:08547 bool migrate_sessions_early_;
[email protected]e13201d82012-12-12 05:00:32548};
549
bnc359ed2a2016-04-29 20:43:45550class QuicStreamFactoryTest : public QuicStreamFactoryTestBase,
551 public ::testing::TestWithParam<TestParams> {
552 protected:
553 QuicStreamFactoryTest()
554 : QuicStreamFactoryTestBase(GetParam().version,
555 GetParam().enable_connection_racing) {}
556};
557
rtenneti14abd312015-02-06 21:56:01558INSTANTIATE_TEST_CASE_P(Version,
559 QuicStreamFactoryTest,
560 ::testing::ValuesIn(GetTestParams()));
[email protected]1e960032013-12-20 19:00:20561
[email protected]1e960032013-12-20 19:00:20562TEST_P(QuicStreamFactoryTest, Create) {
jri7046038f2015-10-22 00:29:26563 Initialize();
rch6faa4d42016-01-05 20:48:43564 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
565 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26566
mmenke651bae7f2015-12-18 21:26:45567 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
568 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:32569 socket_factory_.AddSocketDataProvider(&socket_data);
570
jri7046038f2015-10-22 00:29:26571 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:59572 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56573 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56574 /*cert_verify_flags=*/0, url_, "GET", net_log_,
575 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32576
robpercival214763f2016-07-01 23:27:01577 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:42578 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]0edce6a2013-05-08 18:02:40579 EXPECT_TRUE(stream.get());
[email protected]e13201d82012-12-12 05:00:32580
581 // Will reset stream 3.
bnccb7ff3c2015-05-21 20:51:55582 stream = CreateFromSession(host_port_pair_);
[email protected]e13201d82012-12-12 05:00:32583 EXPECT_TRUE(stream.get());
584
[email protected]6d1b4ed2013-07-10 03:57:54585 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
586 // in streams on different sessions.
jri7046038f2015-10-22 00:29:26587 QuicStreamRequest request2(factory_.get());
ckrasic3865ee0f2016-02-29 22:04:56588 EXPECT_EQ(OK, request2.Request(host_port_pair_, privacy_mode_,
589 /*cert_verify_flags=*/0, url_, "GET", net_log_,
590 callback_.callback()));
xunjieli2608f9b2016-03-14 13:39:23591 stream = request2.CreateStream(); // Will reset stream 5.
rjshaded5ced072015-12-18 19:26:02592 stream.reset(); // Will reset stream 7.
[email protected]e13201d82012-12-12 05:00:32593
rch37de576c2015-05-17 20:28:17594 EXPECT_TRUE(socket_data.AllReadDataConsumed());
595 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:32596}
597
[email protected]8bd2b812014-03-26 04:01:17598TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
jri7046038f2015-10-22 00:29:26599 Initialize();
rch6faa4d42016-01-05 20:48:43600 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
601 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26602
mmenke651bae7f2015-12-18 21:26:45603 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
604 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17605 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]8bd2b812014-03-26 04:01:17606
607 crypto_client_stream_factory_.set_handshake_mode(
608 MockCryptoClientStream::ZERO_RTT);
609 host_resolver_.set_synchronous_mode(true);
610 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
611 "192.168.0.1", "");
612
jri7046038f2015-10-22 00:29:26613 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56614 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56615 /*cert_verify_flags=*/0, url_, "GET", net_log_,
616 callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17617
danakjad1777e2016-04-16 00:56:42618 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]8bd2b812014-03-26 04:01:17619 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17620 EXPECT_TRUE(socket_data.AllReadDataConsumed());
621 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17622}
623
624TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
jri7046038f2015-10-22 00:29:26625 Initialize();
rch6faa4d42016-01-05 20:48:43626 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
627 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26628
mmenke651bae7f2015-12-18 21:26:45629 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
630 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17631 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]8bd2b812014-03-26 04:01:17632
633 crypto_client_stream_factory_.set_handshake_mode(
634 MockCryptoClientStream::ZERO_RTT);
635 host_resolver_.set_synchronous_mode(true);
636 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
637 "192.168.0.1", "");
638
jri7046038f2015-10-22 00:29:26639 QuicStreamRequest request(factory_.get());
rchcb1d6bde2016-06-18 00:33:07640 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
641 /*cert_verify_flags=*/0, url_, "POST", net_log_,
642 callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17643
danakjad1777e2016-04-16 00:56:42644 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]8bd2b812014-03-26 04:01:17645 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17646 EXPECT_TRUE(socket_data.AllReadDataConsumed());
647 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17648}
649
rch68955482015-09-24 00:14:39650TEST_P(QuicStreamFactoryTest, GoAway) {
jri7046038f2015-10-22 00:29:26651 Initialize();
rch6faa4d42016-01-05 20:48:43652 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
653 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26654
mmenke651bae7f2015-12-18 21:26:45655 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
656 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rch68955482015-09-24 00:14:39657 socket_factory_.AddSocketDataProvider(&socket_data);
rch68955482015-09-24 00:14:39658
jri7046038f2015-10-22 00:29:26659 QuicStreamRequest request(factory_.get());
rch68955482015-09-24 00:14:39660 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56661 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56662 /*cert_verify_flags=*/0, url_, "GET", net_log_,
663 callback_.callback()));
rch68955482015-09-24 00:14:39664
robpercival214763f2016-07-01 23:27:01665 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:42666 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rch68955482015-09-24 00:14:39667 EXPECT_TRUE(stream.get());
668
bnc912a04b2016-04-20 14:19:50669 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
rch68955482015-09-24 00:14:39670
671 session->OnGoAway(QuicGoAwayFrame());
672
bnc912a04b2016-04-20 14:19:50673 EXPECT_FALSE(HasActiveSession(host_port_pair_));
rch68955482015-09-24 00:14:39674
675 EXPECT_TRUE(socket_data.AllReadDataConsumed());
676 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
677}
678
zhongyi6b5a3892016-03-12 04:46:20679TEST_P(QuicStreamFactoryTest, GoAwayForConnectionMigrationWithPortOnly) {
680 Initialize();
681 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
682 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
683
684 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
685 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
686 socket_factory_.AddSocketDataProvider(&socket_data);
687
688 QuicStreamRequest request(factory_.get());
689 EXPECT_EQ(ERR_IO_PENDING,
690 request.Request(host_port_pair_, privacy_mode_,
691 /*cert_verify_flags=*/0, url_, "GET", net_log_,
692 callback_.callback()));
693
robpercival214763f2016-07-01 23:27:01694 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:42695 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
zhongyi6b5a3892016-03-12 04:46:20696 EXPECT_TRUE(stream.get());
697
bnc912a04b2016-04-20 14:19:50698 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
zhongyi6b5a3892016-03-12 04:46:20699
700 session->OnGoAway(
701 QuicGoAwayFrame(QUIC_ERROR_MIGRATING_PORT, 0,
702 "peer connection migration due to port change only"));
703 NetErrorDetails details;
704 EXPECT_FALSE(details.quic_port_migration_detected);
705 session->PopulateNetErrorDetails(&details);
706 EXPECT_TRUE(details.quic_port_migration_detected);
707 details.quic_port_migration_detected = false;
708 stream->PopulateNetErrorDetails(&details);
709 EXPECT_TRUE(details.quic_port_migration_detected);
710
bnc912a04b2016-04-20 14:19:50711 EXPECT_FALSE(HasActiveSession(host_port_pair_));
zhongyi6b5a3892016-03-12 04:46:20712
713 EXPECT_TRUE(socket_data.AllReadDataConsumed());
714 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
715}
716
[email protected]5db452202014-08-19 05:22:15717TEST_P(QuicStreamFactoryTest, Pooling) {
jri7046038f2015-10-22 00:29:26718 Initialize();
rch6faa4d42016-01-05 20:48:43719 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
720 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26721
mmenke651bae7f2015-12-18 21:26:45722 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
723 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38724 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]eed749f92013-12-23 18:57:38725
rch6faa4d42016-01-05 20:48:43726 HostPortPair server2(kServer2HostName, kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38727 host_resolver_.set_synchronous_mode(true);
rch6faa4d42016-01-05 20:48:43728 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
rjshaded5ced072015-12-18 19:26:02729 "192.168.0.1", "");
rch6faa4d42016-01-05 20:48:43730 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38731
jri7046038f2015-10-22 00:29:26732 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56733 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56734 /*cert_verify_flags=*/0, url_, "GET", net_log_,
735 callback_.callback()));
danakjad1777e2016-04-16 00:56:42736 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]eed749f92013-12-23 18:57:38737 EXPECT_TRUE(stream.get());
738
739 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26740 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56741 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56742 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50743 net_log_, callback.callback()));
danakjad1777e2016-04-16 00:56:42744 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]eed749f92013-12-23 18:57:38745 EXPECT_TRUE(stream2.get());
746
bnc912a04b2016-04-20 14:19:50747 EXPECT_EQ(GetActiveSession(host_port_pair_), GetActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:38748
rch37de576c2015-05-17 20:28:17749 EXPECT_TRUE(socket_data.AllReadDataConsumed());
750 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38751}
752
jri584002d12014-09-09 00:51:28753TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) {
jri7046038f2015-10-22 00:29:26754 disable_connection_pooling_ = true;
755 Initialize();
rch6faa4d42016-01-05 20:48:43756 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
757 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
758 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26759
mmenke651bae7f2015-12-18 21:26:45760 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
761 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
762 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28763 socket_factory_.AddSocketDataProvider(&socket_data1);
764 socket_factory_.AddSocketDataProvider(&socket_data2);
jri584002d12014-09-09 00:51:28765
rch6faa4d42016-01-05 20:48:43766 HostPortPair server2(kServer2HostName, kDefaultServerPort);
jri584002d12014-09-09 00:51:28767 host_resolver_.set_synchronous_mode(true);
rch6faa4d42016-01-05 20:48:43768 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
rjshaded5ced072015-12-18 19:26:02769 "192.168.0.1", "");
rch6faa4d42016-01-05 20:48:43770 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
jri584002d12014-09-09 00:51:28771
jri7046038f2015-10-22 00:29:26772 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56773 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56774 /*cert_verify_flags=*/0, url_, "GET", net_log_,
775 callback_.callback()));
danakjad1777e2016-04-16 00:56:42776 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri584002d12014-09-09 00:51:28777 EXPECT_TRUE(stream.get());
778
779 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26780 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56781 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56782 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50783 net_log_, callback.callback()));
danakjad1777e2016-04-16 00:56:42784 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jri584002d12014-09-09 00:51:28785 EXPECT_TRUE(stream2.get());
786
bnc912a04b2016-04-20 14:19:50787 EXPECT_NE(GetActiveSession(host_port_pair_), GetActiveSession(server2));
jri584002d12014-09-09 00:51:28788
rch37de576c2015-05-17 20:28:17789 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
790 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
791 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
792 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28793}
794
[email protected]eed749f92013-12-23 18:57:38795TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
jri7046038f2015-10-22 00:29:26796 Initialize();
rch6faa4d42016-01-05 20:48:43797 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
798 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
799 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26800
mmenke651bae7f2015-12-18 21:26:45801 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
802 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
803 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38804 socket_factory_.AddSocketDataProvider(&socket_data1);
805 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]eed749f92013-12-23 18:57:38806
rch6faa4d42016-01-05 20:48:43807 HostPortPair server2(kServer2HostName, kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38808 host_resolver_.set_synchronous_mode(true);
rch6faa4d42016-01-05 20:48:43809 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
rjshaded5ced072015-12-18 19:26:02810 "192.168.0.1", "");
rch6faa4d42016-01-05 20:48:43811 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38812
jri7046038f2015-10-22 00:29:26813 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56814 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56815 /*cert_verify_flags=*/0, url_, "GET", net_log_,
816 callback_.callback()));
danakjad1777e2016-04-16 00:56:42817 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]eed749f92013-12-23 18:57:38818 EXPECT_TRUE(stream.get());
819
820 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26821 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56822 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56823 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50824 net_log_, callback.callback()));
danakjad1777e2016-04-16 00:56:42825 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]eed749f92013-12-23 18:57:38826 EXPECT_TRUE(stream2.get());
827
bnc912a04b2016-04-20 14:19:50828 factory_->OnSessionGoingAway(GetActiveSession(host_port_pair_));
829 EXPECT_FALSE(HasActiveSession(host_port_pair_));
830 EXPECT_FALSE(HasActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:38831
832 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:26833 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:56834 EXPECT_EQ(OK, request3.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56835 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50836 net_log_, callback3.callback()));
danakjad1777e2016-04-16 00:56:42837 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
[email protected]eed749f92013-12-23 18:57:38838 EXPECT_TRUE(stream3.get());
839
bnc912a04b2016-04-20 14:19:50840 EXPECT_TRUE(HasActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:38841
rch37de576c2015-05-17 20:28:17842 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
843 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
844 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
845 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38846}
847
[email protected]5db452202014-08-19 05:22:15848TEST_P(QuicStreamFactoryTest, HttpsPooling) {
jri7046038f2015-10-22 00:29:26849 Initialize();
rch6faa4d42016-01-05 20:48:43850
mmenke651bae7f2015-12-18 21:26:45851 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
852 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38853 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]eed749f92013-12-23 18:57:38854
rch6faa4d42016-01-05 20:48:43855 HostPortPair server1(kDefaultServerHostName, 443);
856 HostPortPair server2(kServer2HostName, 443);
[email protected]eed749f92013-12-23 18:57:38857
bncf8bf0722015-05-19 20:04:13858 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01859 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38860
861 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53862 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
863 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38864
jri7046038f2015-10-22 00:29:26865 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56866 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56867 /*cert_verify_flags=*/0, url_, "GET", net_log_,
868 callback_.callback()));
danakjad1777e2016-04-16 00:56:42869 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]eed749f92013-12-23 18:57:38870 EXPECT_TRUE(stream.get());
871
872 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26873 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56874 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56875 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50876 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:42877 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]eed749f92013-12-23 18:57:38878 EXPECT_TRUE(stream2.get());
879
bnc912a04b2016-04-20 14:19:50880 EXPECT_EQ(GetActiveSession(server1), GetActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:38881
rch37de576c2015-05-17 20:28:17882 EXPECT_TRUE(socket_data.AllReadDataConsumed());
883 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38884}
885
jri584002d12014-09-09 00:51:28886TEST_P(QuicStreamFactoryTest, NoHttpsPoolingIfDisabled) {
jri7046038f2015-10-22 00:29:26887 disable_connection_pooling_ = true;
888 Initialize();
889
mmenke651bae7f2015-12-18 21:26:45890 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
891 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
892 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28893 socket_factory_.AddSocketDataProvider(&socket_data1);
894 socket_factory_.AddSocketDataProvider(&socket_data2);
jri584002d12014-09-09 00:51:28895
rch6faa4d42016-01-05 20:48:43896 HostPortPair server1(kDefaultServerHostName, 443);
897 HostPortPair server2(kServer2HostName, 443);
jri584002d12014-09-09 00:51:28898
bncf8bf0722015-05-19 20:04:13899 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01900 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rch6faa4d42016-01-05 20:48:43901 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28902
903 host_resolver_.set_synchronous_mode(true);
904 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
905 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
906
jri7046038f2015-10-22 00:29:26907 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56908 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56909 /*cert_verify_flags=*/0, url_, "GET", net_log_,
910 callback_.callback()));
danakjad1777e2016-04-16 00:56:42911 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri584002d12014-09-09 00:51:28912 EXPECT_TRUE(stream.get());
913
914 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26915 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56916 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56917 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50918 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:42919 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jri584002d12014-09-09 00:51:28920 EXPECT_TRUE(stream2.get());
921
bnc912a04b2016-04-20 14:19:50922 EXPECT_NE(GetActiveSession(server1), GetActiveSession(server2));
jri584002d12014-09-09 00:51:28923
rch37de576c2015-05-17 20:28:17924 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
925 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
926 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
927 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28928}
929
[email protected]5db452202014-08-19 05:22:15930TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
jri7046038f2015-10-22 00:29:26931 Initialize();
mmenke651bae7f2015-12-18 21:26:45932 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
933 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15934 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]5db452202014-08-19 05:22:15935
rch6faa4d42016-01-05 20:48:43936 HostPortPair server1(kDefaultServerHostName, 443);
937 HostPortPair server2(kServer2HostName, 443);
Avi Drissman13fc8932015-12-20 04:40:46938 uint8_t primary_pin = 1;
939 uint8_t backup_pin = 2;
rch6faa4d42016-01-05 20:48:43940 test::AddPin(&transport_security_state_, kServer2HostName, primary_pin,
[email protected]5db452202014-08-19 05:22:15941 backup_pin);
942
bncf8bf0722015-05-19 20:04:13943 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
[email protected]5db452202014-08-19 05:22:15944 verify_details.cert_verify_result.public_key_hashes.push_back(
945 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01946 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]5db452202014-08-19 05:22:15947
948 host_resolver_.set_synchronous_mode(true);
949 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
950 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
951
jri7046038f2015-10-22 00:29:26952 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56953 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56954 /*cert_verify_flags=*/0, url_, "GET", net_log_,
955 callback_.callback()));
danakjad1777e2016-04-16 00:56:42956 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]5db452202014-08-19 05:22:15957 EXPECT_TRUE(stream.get());
958
959 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26960 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56961 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56962 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50963 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:42964 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]5db452202014-08-19 05:22:15965 EXPECT_TRUE(stream2.get());
966
bnc912a04b2016-04-20 14:19:50967 EXPECT_EQ(GetActiveSession(server1), GetActiveSession(server2));
[email protected]5db452202014-08-19 05:22:15968
rch37de576c2015-05-17 20:28:17969 EXPECT_TRUE(socket_data.AllReadDataConsumed());
970 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:15971}
972
jri584002d12014-09-09 00:51:28973TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithMatchingPinsIfDisabled) {
jri7046038f2015-10-22 00:29:26974 disable_connection_pooling_ = true;
975 Initialize();
976
mmenke651bae7f2015-12-18 21:26:45977 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
978 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
979 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28980 socket_factory_.AddSocketDataProvider(&socket_data1);
981 socket_factory_.AddSocketDataProvider(&socket_data2);
jri584002d12014-09-09 00:51:28982
rch6faa4d42016-01-05 20:48:43983 HostPortPair server1(kDefaultServerHostName, 443);
984 HostPortPair server2(kServer2HostName, 443);
Avi Drissman13fc8932015-12-20 04:40:46985 uint8_t primary_pin = 1;
986 uint8_t backup_pin = 2;
rch6faa4d42016-01-05 20:48:43987 test::AddPin(&transport_security_state_, kServer2HostName, primary_pin,
jri584002d12014-09-09 00:51:28988 backup_pin);
989
bncf8bf0722015-05-19 20:04:13990 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
jri584002d12014-09-09 00:51:28991 verify_details.cert_verify_result.public_key_hashes.push_back(
992 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01993 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rch6faa4d42016-01-05 20:48:43994 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28995
996 host_resolver_.set_synchronous_mode(true);
997 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
998 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
999
jri7046038f2015-10-22 00:29:261000 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561001 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561002 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1003 callback_.callback()));
danakjad1777e2016-04-16 00:56:421004 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri584002d12014-09-09 00:51:281005 EXPECT_TRUE(stream.get());
1006
1007 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:261008 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:561009 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561010 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:501011 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:421012 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jri584002d12014-09-09 00:51:281013 EXPECT_TRUE(stream2.get());
1014
bnc912a04b2016-04-20 14:19:501015 EXPECT_NE(GetActiveSession(server1), GetActiveSession(server2));
jri584002d12014-09-09 00:51:281016
rch37de576c2015-05-17 20:28:171017 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1018 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1019 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1020 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:281021}
1022
[email protected]5db452202014-08-19 05:22:151023TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
jri7046038f2015-10-22 00:29:261024 Initialize();
mmenke651bae7f2015-12-18 21:26:451025 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1026 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
1027 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:151028 socket_factory_.AddSocketDataProvider(&socket_data1);
1029 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]5db452202014-08-19 05:22:151030
rch6faa4d42016-01-05 20:48:431031 HostPortPair server1(kDefaultServerHostName, 443);
1032 HostPortPair server2(kServer2HostName, 443);
Avi Drissman13fc8932015-12-20 04:40:461033 uint8_t primary_pin = 1;
1034 uint8_t backup_pin = 2;
1035 uint8_t bad_pin = 3;
rch6faa4d42016-01-05 20:48:431036 test::AddPin(&transport_security_state_, kServer2HostName, primary_pin,
[email protected]5db452202014-08-19 05:22:151037 backup_pin);
1038
bncf8bf0722015-05-19 20:04:131039 ProofVerifyDetailsChromium verify_details1 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011040 verify_details1.cert_verify_result.public_key_hashes.push_back(
1041 test::GetTestHashValue(bad_pin));
1042 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
1043
bncf8bf0722015-05-19 20:04:131044 ProofVerifyDetailsChromium verify_details2 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011045 verify_details2.cert_verify_result.public_key_hashes.push_back(
1046 test::GetTestHashValue(primary_pin));
1047 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
[email protected]5db452202014-08-19 05:22:151048
1049 host_resolver_.set_synchronous_mode(true);
1050 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1051 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1052
jri7046038f2015-10-22 00:29:261053 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561054 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561055 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1056 callback_.callback()));
danakjad1777e2016-04-16 00:56:421057 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]5db452202014-08-19 05:22:151058 EXPECT_TRUE(stream.get());
1059
1060 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:261061 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:561062 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561063 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:501064 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:421065 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]5db452202014-08-19 05:22:151066 EXPECT_TRUE(stream2.get());
1067
bnc912a04b2016-04-20 14:19:501068 EXPECT_NE(GetActiveSession(server1), GetActiveSession(server2));
[email protected]5db452202014-08-19 05:22:151069
rch37de576c2015-05-17 20:28:171070 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1071 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1072 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1073 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:151074}
1075
[email protected]1e960032013-12-20 19:00:201076TEST_P(QuicStreamFactoryTest, Goaway) {
jri7046038f2015-10-22 00:29:261077 Initialize();
rch6faa4d42016-01-05 20:48:431078 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1079 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1080 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1081
mmenke651bae7f2015-12-18 21:26:451082 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1083 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271084 socket_factory_.AddSocketDataProvider(&socket_data);
mmenke651bae7f2015-12-18 21:26:451085 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271086 socket_factory_.AddSocketDataProvider(&socket_data2);
1087
jri7046038f2015-10-22 00:29:261088 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591089 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561090 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561091 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1092 callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271093
robpercival214763f2016-07-01 23:27:011094 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:421095 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]4d283b32013-10-17 12:57:271096 EXPECT_TRUE(stream.get());
1097
1098 // Mark the session as going away. Ensure that while it is still alive
1099 // that it is no longer active.
bnc912a04b2016-04-20 14:19:501100 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7046038f2015-10-22 00:29:261101 factory_->OnSessionGoingAway(session);
1102 EXPECT_EQ(true,
1103 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
bnc912a04b2016-04-20 14:19:501104 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]4d283b32013-10-17 12:57:271105
1106 // Create a new request for the same destination and verify that a
1107 // new session is created.
jri7046038f2015-10-22 00:29:261108 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591109 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561110 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561111 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1112 callback_.callback()));
robpercival214763f2016-07-01 23:27:011113 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:421114 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]4d283b32013-10-17 12:57:271115 EXPECT_TRUE(stream2.get());
1116
bnc912a04b2016-04-20 14:19:501117 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1118 EXPECT_NE(session, GetActiveSession(host_port_pair_));
jri7046038f2015-10-22 00:29:261119 EXPECT_EQ(true,
1120 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
[email protected]4d283b32013-10-17 12:57:271121
1122 stream2.reset();
1123 stream.reset();
1124
rch37de576c2015-05-17 20:28:171125 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1126 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1127 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1128 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]4d283b32013-10-17 12:57:271129}
1130
[email protected]1e960032013-12-20 19:00:201131TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
jri7046038f2015-10-22 00:29:261132 Initialize();
rch6faa4d42016-01-05 20:48:431133 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1134 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1135
[email protected]66ae5962014-05-22 11:13:051136 QuicStreamId stream_id = kClientDataStreamId1;
danakjad1777e2016-04-16 00:56:421137 std::unique_ptr<QuicEncryptedPacket> client_rst(
alyssar2adf3ac2016-05-03 17:12:581138 client_maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
[email protected]06ff5152013-08-29 01:03:051139 MockWrite writes[] = {
ckrasicea295fe2015-10-31 05:03:271140 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 0),
1141 };
danakjad1777e2016-04-16 00:56:421142 std::unique_ptr<QuicEncryptedPacket> server_rst(
alyssar2adf3ac2016-05-03 17:12:581143 server_maker_.MakeRstPacket(1, false, stream_id, QUIC_STREAM_CANCELLED));
ckrasicea295fe2015-10-31 05:03:271144 MockRead reads[] = {
1145 MockRead(ASYNC, server_rst->data(), server_rst->length(), 1),
mmenke651bae7f2015-12-18 21:26:451146 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
1147 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1148 arraysize(writes));
[email protected]0b2294d32013-08-02 00:46:361149 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0b2294d32013-08-02 00:46:361150
1151 HttpRequestInfo request_info;
bnc5fdc07162016-05-23 17:36:031152 vector<QuicHttpStream*> streams;
[email protected]0b2294d32013-08-02 00:46:361153 // The MockCryptoClientStream sets max_open_streams to be
rtenneti6a4cf3b2015-01-09 03:41:151154 // kDefaultMaxStreamsPerConnection / 2.
1155 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection / 2; i++) {
jri7046038f2015-10-22 00:29:261156 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561157 int rv = request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561158 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1159 callback_.callback());
[email protected]0b2294d32013-08-02 00:46:361160 if (i == 0) {
robpercival214763f2016-07-01 23:27:011161 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1162 EXPECT_THAT(callback_.WaitForResult(), IsOk());
[email protected]0b2294d32013-08-02 00:46:361163 } else {
robpercival214763f2016-07-01 23:27:011164 EXPECT_THAT(rv, IsOk());
[email protected]0b2294d32013-08-02 00:46:361165 }
danakjad1777e2016-04-16 00:56:421166 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]0b2294d32013-08-02 00:46:361167 EXPECT_TRUE(stream);
rjshaded5ced072015-12-18 19:26:021168 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1169 net_log_, CompletionCallback()));
[email protected]0b2294d32013-08-02 00:46:361170 streams.push_back(stream.release());
1171 }
1172
jri7046038f2015-10-22 00:29:261173 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561174 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561175 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1176 CompletionCallback()));
danakjad1777e2016-04-16 00:56:421177 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]0b2294d32013-08-02 00:46:361178 EXPECT_TRUE(stream);
rjshaded5ced072015-12-18 19:26:021179 EXPECT_EQ(ERR_IO_PENDING,
1180 stream->InitializeStream(&request_info, DEFAULT_PRIORITY, net_log_,
1181 callback_.callback()));
[email protected]0b2294d32013-08-02 00:46:361182
1183 // Close the first stream.
1184 streams.front()->Close(false);
ckrasicea295fe2015-10-31 05:03:271185 // Trigger exchange of RSTs that in turn allow progress for the last
1186 // stream.
robpercival214763f2016-07-01 23:27:011187 EXPECT_THAT(callback_.WaitForResult(), IsOk());
[email protected]0b2294d32013-08-02 00:46:361188
rch37de576c2015-05-17 20:28:171189 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1190 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
ckrasicea295fe2015-10-31 05:03:271191
1192 // Force close of the connection to suppress the generation of RST
1193 // packets when streams are torn down, which wouldn't be relevant to
1194 // this test anyway.
bnc912a04b2016-04-20 14:19:501195 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri78ec06a2016-03-31 18:19:401196 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
1197 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasicea295fe2015-10-31 05:03:271198
[email protected]0b2294d32013-08-02 00:46:361199 STLDeleteElements(&streams);
1200}
1201
[email protected]1e960032013-12-20 19:00:201202TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
jri7046038f2015-10-22 00:29:261203 Initialize();
mmenke651bae7f2015-12-18 21:26:451204 SequencedSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321205 socket_factory_.AddSocketDataProvider(&socket_data);
1206
[email protected]3c772402013-12-18 21:38:111207 host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName);
[email protected]e13201d82012-12-12 05:00:321208
jri7046038f2015-10-22 00:29:261209 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591210 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561211 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561212 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1213 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321214
robpercival214763f2016-07-01 23:27:011215 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
[email protected]e13201d82012-12-12 05:00:321216
rch37de576c2015-05-17 20:28:171217 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1218 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321219}
1220
[email protected]1e960032013-12-20 19:00:201221TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
jri7046038f2015-10-22 00:29:261222 Initialize();
[email protected]3c772402013-12-18 21:38:111223 MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
mmenke651bae7f2015-12-18 21:26:451224 SequencedSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]3c772402013-12-18 21:38:111225 socket_data.set_connect_data(connect);
1226 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]3c772402013-12-18 21:38:111227
jri7046038f2015-10-22 00:29:261228 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591229 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561230 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561231 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1232 callback_.callback()));
[email protected]3c772402013-12-18 21:38:111233
robpercival214763f2016-07-01 23:27:011234 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_ADDRESS_IN_USE));
[email protected]3c772402013-12-18 21:38:111235
rch37de576c2015-05-17 20:28:171236 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1237 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:111238}
1239
[email protected]1e960032013-12-20 19:00:201240TEST_P(QuicStreamFactoryTest, CancelCreate) {
jri7046038f2015-10-22 00:29:261241 Initialize();
mmenke651bae7f2015-12-18 21:26:451242 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1243 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321244 socket_factory_.AddSocketDataProvider(&socket_data);
1245 {
jri7046038f2015-10-22 00:29:261246 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591247 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561248 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561249 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1250 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321251 }
1252
mmenke651bae7f2015-12-18 21:26:451253 base::RunLoop().RunUntilIdle();
[email protected]e13201d82012-12-12 05:00:321254
danakjad1777e2016-04-16 00:56:421255 std::unique_ptr<QuicHttpStream> stream(CreateFromSession(host_port_pair_));
[email protected]e13201d82012-12-12 05:00:321256 EXPECT_TRUE(stream.get());
1257 stream.reset();
1258
rch37de576c2015-05-17 20:28:171259 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1260 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321261}
1262
[email protected]1e960032013-12-20 19:00:201263TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) {
jri7046038f2015-10-22 00:29:261264 Initialize();
rch6faa4d42016-01-05 20:48:431265 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1266 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1267 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1268 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261269
[email protected]3c772402013-12-18 21:38:111270 // Sequentially connect to the default host, then another host, and then the
1271 // default host. Verify that the default host gets a consistent ephemeral
1272 // port, that is different from the other host's connection.
1273
bnc5fdc07162016-05-23 17:36:031274 string other_server_name = kServer2HostName;
[email protected]3c772402013-12-18 21:38:111275 EXPECT_NE(kDefaultServerHostName, other_server_name);
1276 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort);
[email protected]3c772402013-12-18 21:38:111277
[email protected]bf4ea2f2014-03-10 22:57:531278 int original_port = GetSourcePortForNewSession(host_port_pair_);
1279 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2));
1280 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]3c772402013-12-18 21:38:111281}
1282
[email protected]d8e2abf82014-03-06 10:30:101283TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) {
jri7046038f2015-10-22 00:29:261284 Initialize();
rch6faa4d42016-01-05 20:48:431285 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1286 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1287 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1288 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261289
[email protected]d8e2abf82014-03-06 10:30:101290 // Get a session to the host using the port suggester.
rjshaded5ced072015-12-18 19:26:021291 int original_port = GetSourcePortForNewSessionAndGoAway(host_port_pair_);
[email protected]d8e2abf82014-03-06 10:30:101292 // Verify that the port is different after the goaway.
[email protected]bf4ea2f2014-03-10 22:57:531293 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101294 // Since the previous session did not goaway we should see the original port.
[email protected]bf4ea2f2014-03-10 22:57:531295 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101296}
1297
[email protected]1e960032013-12-20 19:00:201298TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
jri7046038f2015-10-22 00:29:261299 Initialize();
rch6faa4d42016-01-05 20:48:431300 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1301 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1302 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1303
mmenke651bae7f2015-12-18 21:26:451304 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:581305 std::unique_ptr<QuicEncryptedPacket> rst(ConstructClientRstPacket());
bnc5fdc07162016-05-23 17:36:031306 vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311307 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:451308 SequencedSocketData socket_data(reads, arraysize(reads),
1309 writes.empty() ? nullptr : &writes[0],
1310 writes.size());
[email protected]56dfb902013-01-03 23:17:551311 socket_factory_.AddSocketDataProvider(&socket_data);
1312
mmenke651bae7f2015-12-18 21:26:451313 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1314 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]56dfb902013-01-03 23:17:551315 socket_factory_.AddSocketDataProvider(&socket_data2);
1316
jri7046038f2015-10-22 00:29:261317 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591318 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561319 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561320 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1321 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551322
robpercival214763f2016-07-01 23:27:011323 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:421324 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]0b2294d32013-08-02 00:46:361325 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:021326 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]0b2294d32013-08-02 00:46:361327 net_log_, CompletionCallback()));
[email protected]56dfb902013-01-03 23:17:551328
1329 // Close the session and verify that stream saw the error.
jri7e636642016-01-14 06:57:081330 factory_->CloseAllSessions(ERR_INTERNET_DISCONNECTED, QUIC_INTERNAL_ERROR);
[email protected]56dfb902013-01-03 23:17:551331 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1332 stream->ReadResponseHeaders(callback_.callback()));
1333
1334 // Now attempting to request a stream to the same origin should create
1335 // a new session.
1336
jri7046038f2015-10-22 00:29:261337 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591338 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561339 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561340 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1341 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551342
robpercival214763f2016-07-01 23:27:011343 EXPECT_THAT(callback_.WaitForResult(), IsOk());
xunjieli2608f9b2016-03-14 13:39:231344 stream = request2.CreateStream();
[email protected]56dfb902013-01-03 23:17:551345 stream.reset(); // Will reset stream 3.
1346
rch37de576c2015-05-17 20:28:171347 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1348 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1349 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1350 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]56dfb902013-01-03 23:17:551351}
1352
[email protected]1e960032013-12-20 19:00:201353TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
jri8c44d692015-10-23 23:53:411354 close_sessions_on_ip_change_ = true;
jri7046038f2015-10-22 00:29:261355 Initialize();
rch6faa4d42016-01-05 20:48:431356 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1357 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1358 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri8c44d692015-10-23 23:53:411359
mmenke651bae7f2015-12-18 21:26:451360 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:581361 std::unique_ptr<QuicEncryptedPacket> rst(ConstructClientRstPacket());
bnc5fdc07162016-05-23 17:36:031362 vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311363 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:451364 SequencedSocketData socket_data(reads, arraysize(reads),
1365 writes.empty() ? nullptr : &writes[0],
1366 writes.size());
[email protected]f698a012013-05-06 20:18:591367 socket_factory_.AddSocketDataProvider(&socket_data);
1368
mmenke651bae7f2015-12-18 21:26:451369 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1370 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]f698a012013-05-06 20:18:591371 socket_factory_.AddSocketDataProvider(&socket_data2);
1372
jri7046038f2015-10-22 00:29:261373 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591374 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561375 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561376 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1377 callback_.callback()));
[email protected]f698a012013-05-06 20:18:591378
robpercival214763f2016-07-01 23:27:011379 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:421380 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]0b2294d32013-08-02 00:46:361381 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:021382 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]0b2294d32013-08-02 00:46:361383 net_log_, CompletionCallback()));
[email protected]f698a012013-05-06 20:18:591384
1385 // Change the IP address and verify that stream saw the error.
jri8c44d692015-10-23 23:53:411386 NotifyIPAddressChanged();
[email protected]f698a012013-05-06 20:18:591387 EXPECT_EQ(ERR_NETWORK_CHANGED,
1388 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:261389 EXPECT_TRUE(factory_->require_confirmation());
[email protected]f698a012013-05-06 20:18:591390
1391 // Now attempting to request a stream to the same origin should create
1392 // a new session.
1393
jri7046038f2015-10-22 00:29:261394 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591395 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561396 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561397 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1398 callback_.callback()));
[email protected]f698a012013-05-06 20:18:591399
robpercival214763f2016-07-01 23:27:011400 EXPECT_THAT(callback_.WaitForResult(), IsOk());
xunjieli2608f9b2016-03-14 13:39:231401 stream = request2.CreateStream();
[email protected]f698a012013-05-06 20:18:591402 stream.reset(); // Will reset stream 3.
1403
rch37de576c2015-05-17 20:28:171404 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1405 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1406 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1407 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]f698a012013-05-06 20:18:591408}
1409
jri7e636642016-01-14 06:57:081410TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnect) {
1411 InitializeConnectionMigrationTest(
1412 {kDefaultNetworkForTests, kNewNetworkForTests});
1413 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1414 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1415 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1416
1417 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421418 std::unique_ptr<QuicEncryptedPacket> request_packet(
jri7e636642016-01-14 06:57:081419 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true));
1420 MockWrite writes[] = {MockWrite(SYNCHRONOUS, request_packet->data(),
1421 request_packet->length(), 1)};
1422 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1423 arraysize(writes));
1424 socket_factory_.AddSocketDataProvider(&socket_data);
1425
1426 // Create request and QuicHttpStream.
1427 QuicStreamRequest request(factory_.get());
1428 EXPECT_EQ(ERR_IO_PENDING,
1429 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561430 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1431 callback_.callback()));
robpercival214763f2016-07-01 23:27:011432 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:421433 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081434 EXPECT_TRUE(stream.get());
1435
1436 // Cause QUIC stream to be created.
1437 HttpRequestInfo request_info;
1438 request_info.method = "GET";
bnc3d9035b32016-06-30 18:18:481439 request_info.url = url_;
jri7e636642016-01-14 06:57:081440 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1441 net_log_, CompletionCallback()));
1442
1443 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501444 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:081445 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1446 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1447
1448 // Send GET request on stream.
1449 HttpResponseInfo response;
1450 HttpRequestHeaders request_headers;
1451 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
1452 callback_.callback()));
1453
1454 // Set up second socket data provider that is used after migration.
1455 // The response to the earlier request is read on this new socket.
danakjad1777e2016-04-16 00:56:421456 std::unique_ptr<QuicEncryptedPacket> ping(
alyssar2adf3ac2016-05-03 17:12:581457 client_maker_.MakePingPacket(2, /*include_version=*/true));
jried79618b2016-07-02 03:18:521458 std::unique_ptr<QuicEncryptedPacket> client_rst(
1459 client_maker_.MakeAckAndRstPacket(3, false, kClientDataStreamId1,
1460 QUIC_STREAM_CANCELLED, 1, 1, 1, true));
jri7e636642016-01-14 06:57:081461 MockWrite writes1[] = {
jried79618b2016-07-02 03:18:521462 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 0),
1463 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 3)};
danakjad1777e2016-04-16 00:56:421464 std::unique_ptr<QuicEncryptedPacket> response_headers_packet(
jri7e636642016-01-14 06:57:081465 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
1466 MockRead reads1[] = {MockRead(ASYNC, response_headers_packet->data(),
1467 response_headers_packet->length(), 1),
1468 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
1469 SequencedSocketData socket_data1(reads1, arraysize(reads1), writes1,
1470 arraysize(writes1));
1471 socket_factory_.AddSocketDataProvider(&socket_data1);
1472
1473 // Trigger connection migration. This should cause a PING frame
1474 // to be emitted.
1475 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1476 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1477
1478 // The session should now be marked as going away. Ensure that
1479 // while it is still alive, it is no longer active.
1480 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1481 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1482 EXPECT_EQ(1u, session->GetNumActiveStreams());
1483
1484 // Verify that response headers on the migrated socket were delivered to the
1485 // stream.
robpercival214763f2016-07-01 23:27:011486 EXPECT_THAT(stream->ReadResponseHeaders(callback_.callback()), IsOk());
jri7e636642016-01-14 06:57:081487 EXPECT_EQ(200, response.headers->response_code());
1488
1489 // Create a new request for the same destination and verify that a
1490 // new session is created.
1491 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1492 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1493 socket_factory_.AddSocketDataProvider(&socket_data2);
1494
1495 QuicStreamRequest request2(factory_.get());
1496 EXPECT_EQ(ERR_IO_PENDING,
1497 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561498 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1499 callback_.callback()));
robpercival214763f2016-07-01 23:27:011500 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:421501 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jri7e636642016-01-14 06:57:081502 EXPECT_TRUE(stream2.get());
1503
bnc912a04b2016-04-20 14:19:501504 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1505 QuicChromiumClientSession* new_session = GetActiveSession(host_port_pair_);
jrid36ada62016-02-06 02:42:081506 EXPECT_NE(session, new_session);
jri7e636642016-01-14 06:57:081507
jrid36ada62016-02-06 02:42:081508 // On a DISCONNECTED notification, nothing happens to the migrated
1509 // session, but the new session is closed since it has no open
1510 // streams.
jri7e636642016-01-14 06:57:081511 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1512 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1513 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1514 EXPECT_EQ(1u, session->GetNumActiveStreams());
jrid36ada62016-02-06 02:42:081515 EXPECT_FALSE(
1516 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), new_session));
jried79618b2016-07-02 03:18:521517 stream.reset();
jri7e636642016-01-14 06:57:081518
1519 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1520 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1521 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1522 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1523 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1524 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1525}
1526
1527TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnected) {
1528 InitializeConnectionMigrationTest(
1529 {kDefaultNetworkForTests, kNewNetworkForTests});
1530 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1531 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1532 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1533
1534 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421535 std::unique_ptr<QuicEncryptedPacket> request_packet(
jri7e636642016-01-14 06:57:081536 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true));
1537 MockWrite writes[] = {MockWrite(SYNCHRONOUS, request_packet->data(),
1538 request_packet->length(), 1)};
1539 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1540 arraysize(writes));
1541 socket_factory_.AddSocketDataProvider(&socket_data);
1542
1543 // Create request and QuicHttpStream.
1544 QuicStreamRequest request(factory_.get());
1545 EXPECT_EQ(ERR_IO_PENDING,
1546 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561547 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1548 callback_.callback()));
robpercival214763f2016-07-01 23:27:011549 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:421550 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081551 EXPECT_TRUE(stream.get());
1552
1553 // Cause QUIC stream to be created.
1554 HttpRequestInfo request_info;
1555 request_info.method = "GET";
bnc3d9035b32016-06-30 18:18:481556 request_info.url = url_;
jri7e636642016-01-14 06:57:081557 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1558 net_log_, CompletionCallback()));
1559
1560 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501561 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:081562 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1563 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1564
1565 // Send GET request on stream.
1566 HttpResponseInfo response_info;
1567 HttpRequestHeaders request_headers;
1568 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response_info,
1569 callback_.callback()));
1570
1571 // Set up second socket data provider that is used after migration.
danakjad1777e2016-04-16 00:56:421572 std::unique_ptr<QuicEncryptedPacket> ping(
alyssar2adf3ac2016-05-03 17:12:581573 client_maker_.MakePingPacket(2, /*include_version=*/true));
jried79618b2016-07-02 03:18:521574 std::unique_ptr<QuicEncryptedPacket> client_rst(
1575 client_maker_.MakeAckAndRstPacket(3, false, kClientDataStreamId1,
1576 QUIC_STREAM_CANCELLED, 1, 1, 1, true));
jri7e636642016-01-14 06:57:081577 MockWrite writes1[] = {
jried79618b2016-07-02 03:18:521578 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 0),
1579 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 3)};
danakjad1777e2016-04-16 00:56:421580 std::unique_ptr<QuicEncryptedPacket> response_packet(
jri7e636642016-01-14 06:57:081581 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
1582 MockRead reads1[] = {
1583 MockRead(ASYNC, response_packet->data(), response_packet->length(), 1),
1584 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
1585 SequencedSocketData socket_data1(reads1, arraysize(reads1), writes1,
1586 arraysize(writes1));
1587 socket_factory_.AddSocketDataProvider(&socket_data1);
1588
1589 // Trigger connection migration. This should cause a PING frame
1590 // to be emitted.
1591 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1592 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1593
1594 // The session should now be marked as going away. Ensure that
1595 // while it is still alive, it is no longer active.
1596 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1597 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1598 EXPECT_EQ(1u, session->GetNumActiveStreams());
1599
1600 // Create a new request for the same destination and verify that a
1601 // new session is created.
1602 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1603 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1604 socket_factory_.AddSocketDataProvider(&socket_data2);
1605
1606 QuicStreamRequest request2(factory_.get());
1607 EXPECT_EQ(ERR_IO_PENDING,
1608 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561609 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1610 callback_.callback()));
robpercival214763f2016-07-01 23:27:011611 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:421612 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jri7e636642016-01-14 06:57:081613 EXPECT_TRUE(stream2.get());
1614
bnc912a04b2016-04-20 14:19:501615 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1616 EXPECT_NE(session, GetActiveSession(host_port_pair_));
jri7e636642016-01-14 06:57:081617 EXPECT_EQ(true,
1618 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1619
jried79618b2016-07-02 03:18:521620 stream.reset();
1621
jri7e636642016-01-14 06:57:081622 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1623 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1624 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1625 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1626 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1627 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1628}
1629
1630TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoNetworks) {
1631 NetworkChangeNotifier::NetworkList no_networks(0);
1632 InitializeConnectionMigrationTest(no_networks);
1633 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1634 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1635
1636 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:581637 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
jri7e636642016-01-14 06:57:081638 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1639 MockWrite writes[] = {
1640 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1641 };
1642 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1643 arraysize(writes));
1644 socket_factory_.AddSocketDataProvider(&socket_data);
1645
1646 // Create request and QuicHttpStream.
1647 QuicStreamRequest request(factory_.get());
1648 EXPECT_EQ(ERR_IO_PENDING,
1649 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561650 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1651 callback_.callback()));
robpercival214763f2016-07-01 23:27:011652 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:421653 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081654 EXPECT_TRUE(stream.get());
1655
1656 // Cause QUIC stream to be created.
1657 HttpRequestInfo request_info;
1658 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1659 net_log_, CompletionCallback()));
1660
1661 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501662 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:081663 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1664 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1665 EXPECT_EQ(1u, session->GetNumActiveStreams());
1666
1667 // Trigger connection migration. Since there are no networks
1668 // to migrate to, this should cause the session to continue on the same
1669 // socket, but be marked as going away.
1670 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1671 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1672
1673 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1674 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1675 EXPECT_EQ(1u, session->GetNumActiveStreams());
1676
1677 stream.reset();
1678
1679 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1680 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1681}
1682
1683TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoNetworks) {
1684 NetworkChangeNotifier::NetworkList no_networks(0);
1685 InitializeConnectionMigrationTest(no_networks);
1686 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1687 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1688
1689 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:581690 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
jri7e636642016-01-14 06:57:081691 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1692 MockWrite writes[] = {
1693 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
1694 };
1695 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1696 arraysize(writes));
1697 socket_factory_.AddSocketDataProvider(&socket_data);
1698
1699 // Create request and QuicHttpStream.
1700 QuicStreamRequest request(factory_.get());
1701 EXPECT_EQ(ERR_IO_PENDING,
1702 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561703 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1704 callback_.callback()));
robpercival214763f2016-07-01 23:27:011705 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:421706 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081707 EXPECT_TRUE(stream.get());
1708
1709 // Cause QUIC stream to be created.
1710 HttpRequestInfo request_info;
1711 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1712 net_log_, CompletionCallback()));
1713
1714 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501715 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:081716 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1717 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1718
1719 // Trigger connection migration. Since there are no networks
1720 // to migrate to, this should cause a RST_STREAM frame to be emitted
1721 // and the session to be closed.
1722 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1723 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1724
1725 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1726 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1727
1728 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1729 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1730}
1731
1732TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoNewNetwork) {
1733 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
1734 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1735 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1736
1737 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:581738 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
jri7e636642016-01-14 06:57:081739 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1740 MockWrite writes[] = {
1741 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1742 };
1743 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1744 arraysize(writes));
1745 socket_factory_.AddSocketDataProvider(&socket_data);
1746
1747 // Create request and QuicHttpStream.
1748 QuicStreamRequest request(factory_.get());
1749 EXPECT_EQ(ERR_IO_PENDING,
1750 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561751 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1752 callback_.callback()));
robpercival214763f2016-07-01 23:27:011753 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:421754 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081755 EXPECT_TRUE(stream.get());
1756
1757 // Cause QUIC stream to be created.
1758 HttpRequestInfo request_info;
1759 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1760 net_log_, CompletionCallback()));
1761
1762 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501763 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:081764 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1765 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1766
1767 // Trigger connection migration. Since there are no networks
1768 // to migrate to, this should cause session to be continue but be marked as
1769 // going away.
1770 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1771 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1772
1773 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1774 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1775 EXPECT_EQ(1u, session->GetNumActiveStreams());
1776
1777 stream.reset();
1778
1779 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1780 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1781}
1782
1783TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoNewNetwork) {
1784 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
1785 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1786 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1787
1788 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:581789 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
jri7e636642016-01-14 06:57:081790 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1791 MockWrite writes[] = {
1792 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
1793 };
1794 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1795 arraysize(writes));
1796 socket_factory_.AddSocketDataProvider(&socket_data);
1797
1798 // Create request and QuicHttpStream.
1799 QuicStreamRequest request(factory_.get());
1800 EXPECT_EQ(ERR_IO_PENDING,
1801 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561802 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1803 callback_.callback()));
robpercival214763f2016-07-01 23:27:011804 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:421805 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081806 EXPECT_TRUE(stream.get());
1807
1808 // Cause QUIC stream to be created.
1809 HttpRequestInfo request_info;
1810 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1811 net_log_, CompletionCallback()));
1812
1813 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501814 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:081815 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1816 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1817
1818 // Trigger connection migration. Since there are no networks
1819 // to migrate to, this should cause a RST_STREAM frame to be emitted
1820 // with QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed.
1821 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1822 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1823
1824 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1825 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1826
1827 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1828 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1829}
1830
jri231c2972016-03-08 19:50:111831TEST_P(QuicStreamFactoryTest,
1832 OnNetworkChangeSoonToDisconnectNonMigratableStream) {
1833 InitializeConnectionMigrationTest(
1834 {kDefaultNetworkForTests, kNewNetworkForTests});
1835 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1836 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1837
1838 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:581839 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
jri231c2972016-03-08 19:50:111840 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1841 MockWrite writes[] = {
1842 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1843 };
1844 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1845 arraysize(writes));
1846 socket_factory_.AddSocketDataProvider(&socket_data);
1847
1848 // Create request and QuicHttpStream.
1849 QuicStreamRequest request(factory_.get());
1850 EXPECT_EQ(ERR_IO_PENDING,
1851 request.Request(host_port_pair_, privacy_mode_,
1852 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1853 callback_.callback()));
robpercival214763f2016-07-01 23:27:011854 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:421855 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri231c2972016-03-08 19:50:111856 EXPECT_TRUE(stream.get());
1857
1858 // Cause QUIC stream to be created, but marked as non-migratable.
1859 HttpRequestInfo request_info;
1860 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION;
1861 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1862 net_log_, CompletionCallback()));
1863
1864 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501865 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:111866 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1867 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1868
1869 // Trigger connection migration. Since there is a non-migratable stream,
1870 // this should cause session to continue but be marked as going away.
1871 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1872 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1873
1874 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1875 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1876 EXPECT_EQ(1u, session->GetNumActiveStreams());
1877
1878 stream.reset();
1879
1880 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1881 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1882}
1883
jri9c541572016-03-29 17:51:481884TEST_P(QuicStreamFactoryTest,
1885 OnNetworkChangeSoonToDisconnectConnectionMigrationDisabled) {
1886 InitializeConnectionMigrationTest(
1887 {kDefaultNetworkForTests, kNewNetworkForTests});
1888 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1889 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1890
1891 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:581892 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
jri9c541572016-03-29 17:51:481893 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1894 MockWrite writes[] = {
1895 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1896 };
1897 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1898 arraysize(writes));
1899 socket_factory_.AddSocketDataProvider(&socket_data);
1900
1901 // Create request and QuicHttpStream.
1902 QuicStreamRequest request(factory_.get());
1903 EXPECT_EQ(ERR_IO_PENDING,
1904 request.Request(host_port_pair_, privacy_mode_,
1905 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1906 callback_.callback()));
robpercival214763f2016-07-01 23:27:011907 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:421908 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri9c541572016-03-29 17:51:481909 EXPECT_TRUE(stream.get());
1910
1911 // Cause QUIC stream to be created.
1912 HttpRequestInfo request_info;
1913 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1914 net_log_, CompletionCallback()));
1915
1916 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501917 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:481918 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1919 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1920
1921 // Set session config to have connection migration disabled.
1922 QuicConfigPeer::SetReceivedDisableConnectionMigration(session->config());
1923 EXPECT_TRUE(session->config()->DisableConnectionMigration());
1924
1925 // Trigger connection migration. Since there is a non-migratable stream,
1926 // this should cause session to continue but be marked as going away.
1927 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1928 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1929
1930 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1931 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1932 EXPECT_EQ(1u, session->GetNumActiveStreams());
1933
1934 stream.reset();
1935
1936 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1937 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1938}
1939
jri231c2972016-03-08 19:50:111940TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNonMigratableStream) {
1941 InitializeConnectionMigrationTest(
1942 {kDefaultNetworkForTests, kNewNetworkForTests});
1943 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1944 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1945
1946 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:581947 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
jri231c2972016-03-08 19:50:111948 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1949 MockWrite writes[] = {
1950 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
1951 };
1952 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1953 arraysize(writes));
1954 socket_factory_.AddSocketDataProvider(&socket_data);
1955
1956 // Create request and QuicHttpStream.
1957 QuicStreamRequest request(factory_.get());
1958 EXPECT_EQ(ERR_IO_PENDING,
1959 request.Request(host_port_pair_, privacy_mode_,
1960 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1961 callback_.callback()));
robpercival214763f2016-07-01 23:27:011962 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:421963 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri231c2972016-03-08 19:50:111964 EXPECT_TRUE(stream.get());
1965
1966 // Cause QUIC stream to be created, but marked as non-migratable.
1967 HttpRequestInfo request_info;
1968 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION;
1969 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1970 net_log_, CompletionCallback()));
1971
1972 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501973 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:111974 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1975 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1976
1977 // Trigger connection migration. Since there is a non-migratable stream,
1978 // this should cause a RST_STREAM frame to be emitted with
1979 // QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed.
1980 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1981 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1982
1983 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1984 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1985
1986 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1987 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1988}
1989
jri9c541572016-03-29 17:51:481990TEST_P(QuicStreamFactoryTest,
1991 OnNetworkChangeDisconnectedConnectionMigrationDisabled) {
1992 InitializeConnectionMigrationTest(
1993 {kDefaultNetworkForTests, kNewNetworkForTests});
1994 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1995 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1996
1997 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:581998 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
jri9c541572016-03-29 17:51:481999 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
2000 MockWrite writes[] = {
2001 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
2002 };
2003 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2004 arraysize(writes));
2005 socket_factory_.AddSocketDataProvider(&socket_data);
2006
2007 // Create request and QuicHttpStream.
2008 QuicStreamRequest request(factory_.get());
2009 EXPECT_EQ(ERR_IO_PENDING,
2010 request.Request(host_port_pair_, privacy_mode_,
2011 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2012 callback_.callback()));
robpercival214763f2016-07-01 23:27:012013 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:422014 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri9c541572016-03-29 17:51:482015 EXPECT_TRUE(stream.get());
2016
2017 // Cause QUIC stream to be created.
2018 HttpRequestInfo request_info;
2019 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2020 net_log_, CompletionCallback()));
2021
2022 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502023 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:482024 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2025 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2026
2027 // Set session config to have connection migration disabled.
2028 QuicConfigPeer::SetReceivedDisableConnectionMigration(session->config());
2029 EXPECT_TRUE(session->config()->DisableConnectionMigration());
2030
2031 // Trigger connection migration. Since there is a non-migratable stream,
2032 // this should cause a RST_STREAM frame to be emitted with
2033 // QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed.
2034 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2035 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2036
2037 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2038 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2039
2040 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2041 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2042}
2043
jri7e636642016-01-14 06:57:082044TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoOpenStreams) {
2045 InitializeConnectionMigrationTest(
2046 {kDefaultNetworkForTests, kNewNetworkForTests});
2047 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2048 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2049
2050 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2051 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0u);
2052 socket_factory_.AddSocketDataProvider(&socket_data);
2053
2054 // Create request and QuicHttpStream.
2055 QuicStreamRequest request(factory_.get());
2056 EXPECT_EQ(ERR_IO_PENDING,
2057 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562058 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2059 callback_.callback()));
robpercival214763f2016-07-01 23:27:012060 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:422061 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:082062 EXPECT_TRUE(stream.get());
2063
2064 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502065 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:082066 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2067 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2068
2069 // Trigger connection migration. Since there are no active streams,
2070 // the session will be closed.
2071 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2072 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2073
2074 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2075 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2076
2077 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2078 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2079}
2080
2081TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoOpenStreams) {
2082 InitializeConnectionMigrationTest(
2083 {kDefaultNetworkForTests, kNewNetworkForTests});
2084 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2085 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2086
2087 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2088 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0u);
2089 socket_factory_.AddSocketDataProvider(&socket_data);
2090
2091 // Create request and QuicHttpStream.
2092 QuicStreamRequest request(factory_.get());
2093 EXPECT_EQ(ERR_IO_PENDING,
2094 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562095 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2096 callback_.callback()));
robpercival214763f2016-07-01 23:27:012097 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:422098 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:082099 EXPECT_TRUE(stream.get());
2100
2101 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502102 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:082103 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2104 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2105
2106 // Trigger connection migration. Since there are no active streams,
2107 // the session will be closed.
2108 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2109 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2110
2111 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2112 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2113
2114 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2115 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2116}
2117
jrid36ada62016-02-06 02:42:082118TEST_P(QuicStreamFactoryTest, MigrateSessionEarly) {
2119 InitializeConnectionMigrationTest(
2120 {kDefaultNetworkForTests, kNewNetworkForTests});
2121 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2122 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2123 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2124
2125 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:422126 std::unique_ptr<QuicEncryptedPacket> request_packet(
jrid36ada62016-02-06 02:42:082127 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true));
2128 MockWrite writes[] = {MockWrite(SYNCHRONOUS, request_packet->data(),
2129 request_packet->length(), 1)};
2130 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2131 arraysize(writes));
2132 socket_factory_.AddSocketDataProvider(&socket_data);
2133
2134 // Create request and QuicHttpStream.
2135 QuicStreamRequest request(factory_.get());
2136 EXPECT_EQ(ERR_IO_PENDING,
2137 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562138 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2139 callback_.callback()));
robpercival214763f2016-07-01 23:27:012140 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:422141 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jrid36ada62016-02-06 02:42:082142 EXPECT_TRUE(stream.get());
2143
2144 // Cause QUIC stream to be created.
2145 HttpRequestInfo request_info;
2146 request_info.method = "GET";
bnc3d9035b32016-06-30 18:18:482147 request_info.url = url_;
jrid36ada62016-02-06 02:42:082148 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2149 net_log_, CompletionCallback()));
2150
2151 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502152 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jrid36ada62016-02-06 02:42:082153 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2154 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2155
2156 // Send GET request on stream.
2157 HttpResponseInfo response;
2158 HttpRequestHeaders request_headers;
2159 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2160 callback_.callback()));
2161
2162 // Set up second socket data provider that is used after migration.
2163 // The response to the earlier request is read on this new socket.
danakjad1777e2016-04-16 00:56:422164 std::unique_ptr<QuicEncryptedPacket> ping(
alyssar2adf3ac2016-05-03 17:12:582165 client_maker_.MakePingPacket(2, /*include_version=*/true));
jried79618b2016-07-02 03:18:522166 std::unique_ptr<QuicEncryptedPacket> client_rst(
2167 client_maker_.MakeAckAndRstPacket(3, false, kClientDataStreamId1,
2168 QUIC_STREAM_CANCELLED, 1, 1, 1, true));
jrid36ada62016-02-06 02:42:082169 MockWrite writes1[] = {
jried79618b2016-07-02 03:18:522170 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 0),
2171 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 3)};
danakjad1777e2016-04-16 00:56:422172 std::unique_ptr<QuicEncryptedPacket> response_headers_packet(
jrid36ada62016-02-06 02:42:082173 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
2174 MockRead reads1[] = {MockRead(ASYNC, response_headers_packet->data(),
2175 response_headers_packet->length(), 1),
2176 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
2177 SequencedSocketData socket_data1(reads1, arraysize(reads1), writes1,
2178 arraysize(writes1));
2179 socket_factory_.AddSocketDataProvider(&socket_data1);
2180
2181 // Trigger early connection migration. This should cause a PING frame
2182 // to be emitted.
2183 session->OnPathDegrading();
2184
2185 // Run the message loop so that data queued in the new socket is read by the
2186 // packet reader.
2187 base::RunLoop().RunUntilIdle();
2188
2189 // The session should now be marked as going away. Ensure that
2190 // while it is still alive, it is no longer active.
2191 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2192 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2193 EXPECT_EQ(1u, session->GetNumActiveStreams());
2194
2195 // Verify that response headers on the migrated socket were delivered to the
2196 // stream.
robpercival214763f2016-07-01 23:27:012197 EXPECT_THAT(stream->ReadResponseHeaders(callback_.callback()), IsOk());
jrid36ada62016-02-06 02:42:082198 EXPECT_EQ(200, response.headers->response_code());
2199
2200 // Create a new request for the same destination and verify that a
2201 // new session is created.
2202 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2203 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
2204 socket_factory_.AddSocketDataProvider(&socket_data2);
2205
2206 QuicStreamRequest request2(factory_.get());
2207 EXPECT_EQ(ERR_IO_PENDING,
2208 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562209 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2210 callback_.callback()));
robpercival214763f2016-07-01 23:27:012211 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:422212 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jrid36ada62016-02-06 02:42:082213 EXPECT_TRUE(stream2.get());
2214
bnc912a04b2016-04-20 14:19:502215 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2216 QuicChromiumClientSession* new_session = GetActiveSession(host_port_pair_);
jrid36ada62016-02-06 02:42:082217 EXPECT_NE(session, new_session);
2218
2219 // On a SOON_TO_DISCONNECT notification, nothing happens to the
2220 // migrated session, but the new session is closed since it has no
2221 // open streams.
2222 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2223 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
2224 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2225 EXPECT_EQ(1u, session->GetNumActiveStreams());
2226 EXPECT_FALSE(
2227 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), new_session));
2228
2229 // On a DISCONNECTED notification, nothing happens to the migrated session.
2230 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2231 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2232 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2233 EXPECT_EQ(1u, session->GetNumActiveStreams());
2234
jried79618b2016-07-02 03:18:522235 stream.reset();
2236 stream2.reset();
2237
jrid36ada62016-02-06 02:42:082238 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2239 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2240 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
2241 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
2242 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2243 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2244}
2245
2246TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyNoNewNetwork) {
2247 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
2248 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2249 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2250
2251 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:582252 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
jrid36ada62016-02-06 02:42:082253 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
2254 MockWrite writes[] = {
2255 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
2256 };
2257 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2258 arraysize(writes));
2259 socket_factory_.AddSocketDataProvider(&socket_data);
2260
2261 // Create request and QuicHttpStream.
2262 QuicStreamRequest request(factory_.get());
2263 EXPECT_EQ(ERR_IO_PENDING,
2264 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562265 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2266 callback_.callback()));
robpercival214763f2016-07-01 23:27:012267 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:422268 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jrid36ada62016-02-06 02:42:082269 EXPECT_TRUE(stream.get());
2270
2271 // Cause QUIC stream to be created.
2272 HttpRequestInfo request_info;
2273 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2274 net_log_, CompletionCallback()));
2275
2276 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502277 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jrid36ada62016-02-06 02:42:082278 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2279 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2280
2281 // Trigger connection migration. Since there are no networks
2282 // to migrate to, this should cause session to be continue but be marked as
2283 // going away.
2284 session->OnPathDegrading();
2285
2286 // Run the message loop so that data queued in the new socket is read by the
2287 // packet reader.
2288 base::RunLoop().RunUntilIdle();
2289
2290 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2291 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2292 EXPECT_EQ(1u, session->GetNumActiveStreams());
2293
2294 stream.reset();
2295
2296 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2297 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2298}
2299
jri231c2972016-03-08 19:50:112300TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyNonMigratableStream) {
2301 InitializeConnectionMigrationTest(
2302 {kDefaultNetworkForTests, kNewNetworkForTests});
2303 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2304 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2305
2306 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:582307 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
jri231c2972016-03-08 19:50:112308 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
2309 MockWrite writes[] = {
2310 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
2311 };
2312 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2313 arraysize(writes));
2314 socket_factory_.AddSocketDataProvider(&socket_data);
2315
2316 // Create request and QuicHttpStream.
2317 QuicStreamRequest request(factory_.get());
2318 EXPECT_EQ(ERR_IO_PENDING,
2319 request.Request(host_port_pair_, privacy_mode_,
2320 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2321 callback_.callback()));
robpercival214763f2016-07-01 23:27:012322 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:422323 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri231c2972016-03-08 19:50:112324 EXPECT_TRUE(stream.get());
2325
2326 // Cause QUIC stream to be created, but marked as non-migratable.
2327 HttpRequestInfo request_info;
2328 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION;
2329 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2330 net_log_, CompletionCallback()));
2331
2332 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502333 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:112334 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2335 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2336
2337 // Trigger connection migration. Since there is a non-migratable stream,
2338 // this should cause session to be continue without migrating.
2339 session->OnPathDegrading();
2340
2341 // Run the message loop so that data queued in the new socket is read by the
2342 // packet reader.
2343 base::RunLoop().RunUntilIdle();
2344
2345 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2346 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2347 EXPECT_EQ(1u, session->GetNumActiveStreams());
2348
2349 stream.reset();
2350
2351 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2352 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2353}
2354
jri9c541572016-03-29 17:51:482355TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyConnectionMigrationDisabled) {
2356 InitializeConnectionMigrationTest(
2357 {kDefaultNetworkForTests, kNewNetworkForTests});
2358 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2359 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2360
2361 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:582362 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
jri9c541572016-03-29 17:51:482363 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
2364 MockWrite writes[] = {
2365 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
2366 };
2367 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2368 arraysize(writes));
2369 socket_factory_.AddSocketDataProvider(&socket_data);
2370
2371 // Create request and QuicHttpStream.
2372 QuicStreamRequest request(factory_.get());
2373 EXPECT_EQ(ERR_IO_PENDING,
2374 request.Request(host_port_pair_, privacy_mode_,
2375 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2376 callback_.callback()));
robpercival214763f2016-07-01 23:27:012377 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:422378 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri9c541572016-03-29 17:51:482379 EXPECT_TRUE(stream.get());
2380
2381 // Cause QUIC stream to be created.
2382 HttpRequestInfo request_info;
2383 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2384 net_log_, CompletionCallback()));
2385
2386 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502387 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:482388 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2389 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2390
2391 // Set session config to have connection migration disabled.
2392 QuicConfigPeer::SetReceivedDisableConnectionMigration(session->config());
2393 EXPECT_TRUE(session->config()->DisableConnectionMigration());
2394
2395 // Trigger connection migration. Since there is a non-migratable stream,
2396 // this should cause session to be continue without migrating.
2397 session->OnPathDegrading();
2398
2399 // Run the message loop so that data queued in the new socket is read by the
2400 // packet reader.
2401 base::RunLoop().RunUntilIdle();
2402
2403 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2404 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2405 EXPECT_EQ(1u, session->GetNumActiveStreams());
2406
2407 stream.reset();
2408
2409 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2410 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2411}
2412
jried79618b2016-07-02 03:18:522413TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteError) {
2414 InitializeConnectionMigrationTest(
2415 {kDefaultNetworkForTests, kNewNetworkForTests});
2416 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2417 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2418 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2419
2420 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2421 MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE, 1)};
2422 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2423 arraysize(writes));
2424 socket_factory_.AddSocketDataProvider(&socket_data);
2425
2426 // Create request and QuicHttpStream.
2427 QuicStreamRequest request(factory_.get());
2428 EXPECT_EQ(ERR_IO_PENDING,
2429 request.Request(host_port_pair_, privacy_mode_,
2430 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2431 callback_.callback()));
2432 EXPECT_EQ(OK, callback_.WaitForResult());
2433 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
2434 EXPECT_TRUE(stream.get());
2435
2436 // Cause QUIC stream to be created.
2437 HttpRequestInfo request_info;
2438 request_info.method = "GET";
2439 request_info.url = GURL("https://www.example.org/");
2440 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2441 net_log_, CompletionCallback()));
2442
2443 // Ensure that session is alive and active.
2444 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2445 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2446 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2447
2448 // Set up second socket data provider that is used after
2449 // migration. The request is rewritten to this new socket, and the
2450 // response to the request is read on this new socket.
2451 std::unique_ptr<QuicEncryptedPacket> request_packet(
2452 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true));
2453 std::unique_ptr<QuicEncryptedPacket> client_rst(
2454 client_maker_.MakeAckAndRstPacket(2, false, kClientDataStreamId1,
2455 QUIC_STREAM_CANCELLED, 1, 1, 1, true));
2456 MockWrite writes1[] = {
2457 MockWrite(SYNCHRONOUS, request_packet->data(), request_packet->length(),
2458 0),
2459 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 3)};
2460 std::unique_ptr<QuicEncryptedPacket> response_headers_packet(
2461 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
2462 MockRead reads1[] = {MockRead(ASYNC, response_headers_packet->data(),
2463 response_headers_packet->length(), 1),
2464 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
2465 SequencedSocketData socket_data1(reads1, arraysize(reads1), writes1,
2466 arraysize(writes1));
2467 socket_factory_.AddSocketDataProvider(&socket_data1);
2468
2469 // Send GET request on stream. This should cause a write error, which triggers
2470 // a connection migration attempt.
2471 HttpResponseInfo response;
2472 HttpRequestHeaders request_headers;
2473 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2474 callback_.callback()));
2475
2476 // Run the message loop so that data queued in the new socket is read by the
2477 // packet reader.
2478 base::RunLoop().RunUntilIdle();
2479
2480 // The session should now be marked as going away. Ensure that
2481 // while it is still alive, it is no longer active.
2482 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2483 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2484 EXPECT_EQ(1u, session->GetNumActiveStreams());
2485
2486 // Verify that response headers on the migrated socket were delivered to the
2487 // stream.
2488 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
2489 EXPECT_EQ(200, response.headers->response_code());
2490
2491 stream.reset();
2492
2493 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2494 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2495 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
2496 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
2497}
2498
2499TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorNoNewNetwork) {
2500 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
2501 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2502 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2503
2504 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2505 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
2506 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
2507 MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE, 1)};
2508 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2509 arraysize(writes));
2510 socket_factory_.AddSocketDataProvider(&socket_data);
2511
2512 // Create request and QuicHttpStream.
2513 QuicStreamRequest request(factory_.get());
2514 EXPECT_EQ(ERR_IO_PENDING,
2515 request.Request(host_port_pair_, privacy_mode_,
2516 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2517 callback_.callback()));
2518 EXPECT_EQ(OK, callback_.WaitForResult());
2519 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
2520 EXPECT_TRUE(stream.get());
2521
2522 // Cause QUIC stream to be created.
2523 HttpRequestInfo request_info;
2524 request_info.method = "GET";
2525 request_info.url = GURL("https://www.example.org/");
2526 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2527 net_log_, CompletionCallback()));
2528
2529 // Ensure that session is alive and active.
2530 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2531 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2532 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2533
2534 // Send GET request on stream. This should cause a write error, which triggers
2535 // a connection migration attempt.
2536 HttpResponseInfo response;
2537 HttpRequestHeaders request_headers;
2538 EXPECT_EQ(
2539 ERR_QUIC_PROTOCOL_ERROR,
2540 stream->SendRequest(request_headers, &response, callback_.callback()));
2541
2542 // Migration fails, and session is marked as going away.
2543 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2544
2545 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2546 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2547}
2548
2549TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorNonMigratableStream) {
2550 InitializeConnectionMigrationTest(
2551 {kDefaultNetworkForTests, kNewNetworkForTests});
2552 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2553 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2554
2555 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2556 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
2557 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
2558 MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE, 1)};
2559 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2560 arraysize(writes));
2561 socket_factory_.AddSocketDataProvider(&socket_data);
2562
2563 // Create request and QuicHttpStream.
2564 QuicStreamRequest request(factory_.get());
2565 EXPECT_EQ(ERR_IO_PENDING,
2566 request.Request(host_port_pair_, privacy_mode_,
2567 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2568 callback_.callback()));
2569 EXPECT_EQ(OK, callback_.WaitForResult());
2570 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
2571 EXPECT_TRUE(stream.get());
2572
2573 // Cause QUIC stream to be created, but marked as non-migratable.
2574 HttpRequestInfo request_info;
2575 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION;
2576 request_info.method = "GET";
2577 request_info.url = GURL("https://www.example.org/");
2578 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2579 net_log_, CompletionCallback()));
2580
2581 // Ensure that session is alive and active.
2582 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2583 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2584 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2585
2586 // Send GET request on stream. This should cause a write error, which triggers
2587 // a connection migration attempt.
2588 HttpResponseInfo response;
2589 HttpRequestHeaders request_headers;
2590 EXPECT_EQ(
2591 ERR_QUIC_PROTOCOL_ERROR,
2592 stream->SendRequest(request_headers, &response, callback_.callback()));
2593
2594 // Migration fails, and session is marked as going away.
2595 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2596
2597 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2598 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2599}
2600
2601TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorMigrationDisabled) {
2602 InitializeConnectionMigrationTest(
2603 {kDefaultNetworkForTests, kNewNetworkForTests});
2604 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2605 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2606
2607 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2608 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
2609 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
2610 MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE, 1)};
2611 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2612 arraysize(writes));
2613 socket_factory_.AddSocketDataProvider(&socket_data);
2614
2615 // Create request and QuicHttpStream.
2616 QuicStreamRequest request(factory_.get());
2617 EXPECT_EQ(ERR_IO_PENDING,
2618 request.Request(host_port_pair_, privacy_mode_,
2619 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2620 callback_.callback()));
2621 EXPECT_EQ(OK, callback_.WaitForResult());
2622 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
2623 EXPECT_TRUE(stream.get());
2624
2625 // Cause QUIC stream to be created.
2626 HttpRequestInfo request_info;
2627 request_info.method = "GET";
2628 request_info.url = GURL("https://www.example.org/");
2629 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2630 net_log_, CompletionCallback()));
2631
2632 // Ensure that session is alive and active.
2633 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2634 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2635 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2636
2637 // Set session config to have connection migration disabled.
2638 QuicConfigPeer::SetReceivedDisableConnectionMigration(session->config());
2639 EXPECT_TRUE(session->config()->DisableConnectionMigration());
2640
2641 // Send GET request on stream. This should cause a write error, which triggers
2642 // a connection migration attempt.
2643 HttpResponseInfo response;
2644 HttpRequestHeaders request_headers;
2645 EXPECT_EQ(
2646 ERR_QUIC_PROTOCOL_ERROR,
2647 stream->SendRequest(request_headers, &response, callback_.callback()));
2648
2649 // Migration fails, and session is marked as going away.
2650 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2651
2652 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2653 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2654}
2655
rch02d87792015-09-09 09:05:532656TEST_P(QuicStreamFactoryTest, OnSSLConfigChanged) {
jri7046038f2015-10-22 00:29:262657 Initialize();
rch6faa4d42016-01-05 20:48:432658 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2659 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2660 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2661
mmenke651bae7f2015-12-18 21:26:452662 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:582663 std::unique_ptr<QuicEncryptedPacket> rst(ConstructClientRstPacket());
bnc5fdc07162016-05-23 17:36:032664 vector<MockWrite> writes;
rch02d87792015-09-09 09:05:532665 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:452666 SequencedSocketData socket_data(reads, arraysize(reads),
2667 writes.empty() ? nullptr : &writes[0],
2668 writes.size());
rch02d87792015-09-09 09:05:532669 socket_factory_.AddSocketDataProvider(&socket_data);
rch02d87792015-09-09 09:05:532670
mmenke651bae7f2015-12-18 21:26:452671 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2672 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
rch02d87792015-09-09 09:05:532673 socket_factory_.AddSocketDataProvider(&socket_data2);
rch02d87792015-09-09 09:05:532674
jri7046038f2015-10-22 00:29:262675 QuicStreamRequest request(factory_.get());
rch02d87792015-09-09 09:05:532676 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562677 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562678 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2679 callback_.callback()));
rch02d87792015-09-09 09:05:532680
robpercival214763f2016-07-01 23:27:012681 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:422682 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rch02d87792015-09-09 09:05:532683 HttpRequestInfo request_info;
2684 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2685 net_log_, CompletionCallback()));
2686
nharper642ae4b2016-06-30 00:40:362687 ssl_config_service_->NotifySSLConfigChange();
rch02d87792015-09-09 09:05:532688 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
2689 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262690 EXPECT_FALSE(factory_->require_confirmation());
rch02d87792015-09-09 09:05:532691
2692 // Now attempting to request a stream to the same origin should create
2693 // a new session.
2694
jri7046038f2015-10-22 00:29:262695 QuicStreamRequest request2(factory_.get());
rch02d87792015-09-09 09:05:532696 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562697 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562698 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2699 callback_.callback()));
rch02d87792015-09-09 09:05:532700
robpercival214763f2016-07-01 23:27:012701 EXPECT_THAT(callback_.WaitForResult(), IsOk());
xunjieli2608f9b2016-03-14 13:39:232702 stream = request2.CreateStream();
rch02d87792015-09-09 09:05:532703 stream.reset(); // Will reset stream 3.
2704
2705 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2706 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2707 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2708 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2709}
2710
[email protected]1e960032013-12-20 19:00:202711TEST_P(QuicStreamFactoryTest, OnCertAdded) {
jri7046038f2015-10-22 00:29:262712 Initialize();
rch6faa4d42016-01-05 20:48:432713 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2714 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2715 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2716
mmenke651bae7f2015-12-18 21:26:452717 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:582718 std::unique_ptr<QuicEncryptedPacket> rst(ConstructClientRstPacket());
bnc5fdc07162016-05-23 17:36:032719 vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:312720 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:452721 SequencedSocketData socket_data(reads, arraysize(reads),
2722 writes.empty() ? nullptr : &writes[0],
2723 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:092724 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]d7d1e50b2013-11-25 22:08:092725
mmenke651bae7f2015-12-18 21:26:452726 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2727 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:092728 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]d7d1e50b2013-11-25 22:08:092729
jri7046038f2015-10-22 00:29:262730 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:592731 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562732 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562733 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2734 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092735
robpercival214763f2016-07-01 23:27:012736 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:422737 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]d7d1e50b2013-11-25 22:08:092738 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:022739 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]d7d1e50b2013-11-25 22:08:092740 net_log_, CompletionCallback()));
2741
2742 // Add a cert and verify that stream saw the event.
jri7046038f2015-10-22 00:29:262743 factory_->OnCertAdded(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:092744 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
2745 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262746 EXPECT_FALSE(factory_->require_confirmation());
[email protected]d7d1e50b2013-11-25 22:08:092747
2748 // Now attempting to request a stream to the same origin should create
2749 // a new session.
2750
jri7046038f2015-10-22 00:29:262751 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:592752 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562753 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562754 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2755 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092756
robpercival214763f2016-07-01 23:27:012757 EXPECT_THAT(callback_.WaitForResult(), IsOk());
xunjieli2608f9b2016-03-14 13:39:232758 stream = request2.CreateStream();
[email protected]d7d1e50b2013-11-25 22:08:092759 stream.reset(); // Will reset stream 3.
2760
rch37de576c2015-05-17 20:28:172761 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2762 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2763 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2764 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:092765}
2766
[email protected]1e960032013-12-20 19:00:202767TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
jri7046038f2015-10-22 00:29:262768 Initialize();
rch6faa4d42016-01-05 20:48:432769 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2770 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2771 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2772
mmenke651bae7f2015-12-18 21:26:452773 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:582774 std::unique_ptr<QuicEncryptedPacket> rst(ConstructClientRstPacket());
bnc5fdc07162016-05-23 17:36:032775 vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:312776 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:452777 SequencedSocketData socket_data(reads, arraysize(reads),
2778 writes.empty() ? nullptr : &writes[0],
2779 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:092780 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]d7d1e50b2013-11-25 22:08:092781
mmenke651bae7f2015-12-18 21:26:452782 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2783 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:092784 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]d7d1e50b2013-11-25 22:08:092785
jri7046038f2015-10-22 00:29:262786 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:592787 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562788 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562789 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2790 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092791
robpercival214763f2016-07-01 23:27:012792 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:422793 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]d7d1e50b2013-11-25 22:08:092794 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:022795 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]d7d1e50b2013-11-25 22:08:092796 net_log_, CompletionCallback()));
2797
2798 // Change the CA cert and verify that stream saw the event.
jri7046038f2015-10-22 00:29:262799 factory_->OnCACertChanged(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:092800 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
2801 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262802 EXPECT_FALSE(factory_->require_confirmation());
[email protected]d7d1e50b2013-11-25 22:08:092803
2804 // Now attempting to request a stream to the same origin should create
2805 // a new session.
2806
jri7046038f2015-10-22 00:29:262807 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:592808 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562809 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562810 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2811 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092812
robpercival214763f2016-07-01 23:27:012813 EXPECT_THAT(callback_.WaitForResult(), IsOk());
xunjieli2608f9b2016-03-14 13:39:232814 stream = request2.CreateStream();
[email protected]d7d1e50b2013-11-25 22:08:092815 stream.reset(); // Will reset stream 3.
2816
rch37de576c2015-05-17 20:28:172817 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2818 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2819 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2820 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:092821}
2822
[email protected]1e960032013-12-20 19:00:202823TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
jri7046038f2015-10-22 00:29:262824 Initialize();
rch6faa4d42016-01-05 20:48:432825
[email protected]6e12d702013-11-13 00:17:172826 vector<string> cannoncial_suffixes;
2827 cannoncial_suffixes.push_back(string(".c.youtube.com"));
2828 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]c49ff182013-09-28 08:33:262829
[email protected]6e12d702013-11-13 00:17:172830 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
2831 string r1_host_name("r1");
2832 string r2_host_name("r2");
2833 r1_host_name.append(cannoncial_suffixes[i]);
2834 r2_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:142835
[email protected]bf4ea2f2014-03-10 22:57:532836 HostPortPair host_port_pair1(r1_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:122837 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:262838 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rch1fe2eeb2015-10-26 14:45:572839 QuicServerId server_id1(host_port_pair1, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172840 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:372841 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:172842 EXPECT_FALSE(cached1->proof_valid());
2843 EXPECT_TRUE(cached1->source_address_token().empty());
2844
2845 // Mutate the cached1 to have different data.
2846 // TODO(rtenneti): mutate other members of CachedState.
2847 cached1->set_source_address_token(r1_host_name);
2848 cached1->SetProofValid();
2849
[email protected]bf4ea2f2014-03-10 22:57:532850 HostPortPair host_port_pair2(r2_host_name, 80);
rch1fe2eeb2015-10-26 14:45:572851 QuicServerId server_id2(host_port_pair2, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172852 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:372853 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:172854 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
2855 EXPECT_TRUE(cached2->proof_valid());
2856 }
[email protected]b70fdb792013-10-25 19:04:142857}
2858
[email protected]1e960032013-12-20 19:00:202859TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
jri7046038f2015-10-22 00:29:262860 Initialize();
[email protected]6e12d702013-11-13 00:17:172861 vector<string> cannoncial_suffixes;
2862 cannoncial_suffixes.push_back(string(".c.youtube.com"));
2863 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]b70fdb792013-10-25 19:04:142864
[email protected]6e12d702013-11-13 00:17:172865 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
2866 string r3_host_name("r3");
2867 string r4_host_name("r4");
2868 r3_host_name.append(cannoncial_suffixes[i]);
2869 r4_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:142870
[email protected]bf4ea2f2014-03-10 22:57:532871 HostPortPair host_port_pair1(r3_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:122872 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:262873 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rch1fe2eeb2015-10-26 14:45:572874 QuicServerId server_id1(host_port_pair1, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172875 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:372876 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:172877 EXPECT_FALSE(cached1->proof_valid());
2878 EXPECT_TRUE(cached1->source_address_token().empty());
2879
2880 // Mutate the cached1 to have different data.
2881 // TODO(rtenneti): mutate other members of CachedState.
2882 cached1->set_source_address_token(r3_host_name);
2883 cached1->SetProofInvalid();
2884
[email protected]bf4ea2f2014-03-10 22:57:532885 HostPortPair host_port_pair2(r4_host_name, 80);
rch1fe2eeb2015-10-26 14:45:572886 QuicServerId server_id2(host_port_pair2, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172887 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:372888 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:172889 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
2890 EXPECT_TRUE(cached2->source_address_token().empty());
2891 EXPECT_FALSE(cached2->proof_valid());
2892 }
[email protected]c49ff182013-09-28 08:33:262893}
2894
rtenneti14abd312015-02-06 21:56:012895TEST_P(QuicStreamFactoryTest, RacingConnections) {
jri7046038f2015-10-22 00:29:262896 disable_disk_cache_ = false;
2897 Initialize();
rch6faa4d42016-01-05 20:48:432898 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2899 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:262900
bnc359ed2a2016-04-29 20:43:452901 if (!enable_connection_racing_)
rtenneti14abd312015-02-06 21:56:012902 return;
jri7046038f2015-10-22 00:29:262903
2904 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneticcab42b2015-10-09 06:38:162905
mmenke651bae7f2015-12-18 21:26:452906 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2907 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti14abd312015-02-06 21:56:012908 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti14abd312015-02-06 21:56:012909
mmenke651bae7f2015-12-18 21:26:452910 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2911 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
rtenneti14abd312015-02-06 21:56:012912 socket_factory_.AddSocketDataProvider(&socket_data2);
rtenneti14abd312015-02-06 21:56:012913
rtenneticcab42b2015-10-09 06:38:162914 const AlternativeService alternative_service1(QUIC, host_port_pair_.host(),
2915 host_port_pair_.port());
2916 AlternativeServiceInfoVector alternative_service_info_vector;
2917 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
2918 alternative_service_info_vector.push_back(
rchdc7b9052016-03-17 20:51:502919 AlternativeServiceInfo(alternative_service1, expiration));
rtenneticcab42b2015-10-09 06:38:162920
2921 http_server_properties_.SetAlternativeServices(
bnc3d9035b32016-06-30 18:18:482922 url::SchemeHostPort(url_), alternative_service_info_vector);
rtenneticcab42b2015-10-09 06:38:162923
rtenneti14abd312015-02-06 21:56:012924 crypto_client_stream_factory_.set_handshake_mode(
2925 MockCryptoClientStream::ZERO_RTT);
2926 host_resolver_.set_synchronous_mode(true);
2927 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2928 "192.168.0.1", "");
2929
jri7046038f2015-10-22 00:29:262930 QuicStreamRequest request(factory_.get());
rch1fe2eeb2015-10-26 14:45:572931 QuicServerId server_id(host_port_pair_, privacy_mode_);
rtenneti14abd312015-02-06 21:56:012932 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562933 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562934 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2935 callback_.callback()));
jri7046038f2015-10-22 00:29:262936 EXPECT_EQ(2u, QuicStreamFactoryPeer::GetNumberOfActiveJobs(factory_.get(),
2937 server_id));
rtenneti14abd312015-02-06 21:56:012938
2939 runner_->RunNextTask();
2940
danakjad1777e2016-04-16 00:56:422941 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rtenneti14abd312015-02-06 21:56:012942 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:172943 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2944 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
jri7046038f2015-10-22 00:29:262945 EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumberOfActiveJobs(factory_.get(),
2946 server_id));
rtenneti14abd312015-02-06 21:56:012947}
2948
rtenneti34dffe752015-02-24 23:27:322949TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) {
jri7046038f2015-10-22 00:29:262950 disable_disk_cache_ = true;
2951 Initialize();
rch6faa4d42016-01-05 20:48:432952 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2953 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2954
jri7046038f2015-10-22 00:29:262955 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti34dffe752015-02-24 23:27:322956
mmenke651bae7f2015-12-18 21:26:452957 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2958 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti34dffe752015-02-24 23:27:322959 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti34dffe752015-02-24 23:27:322960
2961 crypto_client_stream_factory_.set_handshake_mode(
2962 MockCryptoClientStream::ZERO_RTT);
2963 host_resolver_.set_synchronous_mode(true);
2964 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2965 "192.168.0.1", "");
2966
jri7046038f2015-10-22 00:29:262967 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562968 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562969 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2970 callback_.callback()));
rtenneti34dffe752015-02-24 23:27:322971
2972 // If we are waiting for disk cache, we would have posted a task. Verify that
2973 // the CancelWaitForDataReady task hasn't been posted.
2974 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
2975
danakjad1777e2016-04-16 00:56:422976 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rtenneti34dffe752015-02-24 23:27:322977 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:172978 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2979 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti34dffe752015-02-24 23:27:322980}
2981
rtenneti85dcfac22015-03-27 20:22:192982TEST_P(QuicStreamFactoryTest, BadPacketLoss) {
jri7046038f2015-10-22 00:29:262983 disable_disk_cache_ = false;
2984 max_number_of_lossy_connections_ = 2;
2985 Initialize();
rch6faa4d42016-01-05 20:48:432986 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2987 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2988 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2989 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2990 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2991
jri7046038f2015-10-22 00:29:262992 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2993
2994 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2995 host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192996 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262997 factory_.get(), host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192998
mmenke651bae7f2015-12-18 21:26:452999 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3000 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:193001 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti85dcfac22015-03-27 20:22:193002
mmenke651bae7f2015-12-18 21:26:453003 SequencedSocketData socket_data2(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:193004 socket_factory_.AddSocketDataProvider(&socket_data2);
rtenneti85dcfac22015-03-27 20:22:193005
mmenke651bae7f2015-12-18 21:26:453006 SequencedSocketData socket_data3(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:193007 socket_factory_.AddSocketDataProvider(&socket_data3);
rtenneti85dcfac22015-03-27 20:22:193008
mmenke651bae7f2015-12-18 21:26:453009 SequencedSocketData socket_data4(nullptr, 0, nullptr, 0);
rtenneti97137a92015-06-18 06:00:313010 socket_factory_.AddSocketDataProvider(&socket_data4);
rtenneti97137a92015-06-18 06:00:313011
rch6faa4d42016-01-05 20:48:433012 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3013 HostPortPair server3(kServer3HostName, kDefaultServerPort);
3014 HostPortPair server4(kServer4HostName, kDefaultServerPort);
rtenneti85dcfac22015-03-27 20:22:193015
3016 crypto_client_stream_factory_.set_handshake_mode(
3017 MockCryptoClientStream::ZERO_RTT);
3018 host_resolver_.set_synchronous_mode(true);
3019 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3020 "192.168.0.1", "");
3021 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3022 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
rtenneti97137a92015-06-18 06:00:313023 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
rtenneti85dcfac22015-03-27 20:22:193024
jri7046038f2015-10-22 00:29:263025 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563026 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563027 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3028 callback_.callback()));
rtenneti85dcfac22015-03-27 20:22:193029
bnc912a04b2016-04-20 14:19:503030 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
rtenneti85dcfac22015-03-27 20:22:193031
3032 DVLOG(1) << "Create 1st session and test packet loss";
3033
3034 // Set packet_loss_rate to a lower value than packet_loss_threshold.
3035 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:263036 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/0.9f));
rtenneti41633b1f2015-04-05 18:19:533037 EXPECT_TRUE(session->connection()->connected());
bnc912a04b2016-04-20 14:19:503038 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri7046038f2015-10-22 00:29:263039 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3040 host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:193041 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263042 factory_.get(), host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:193043
3044 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:313045 // and that shouldn't close the session and it shouldn't disable QUIC.
3046 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:263047 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:193048 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263049 factory_.get(), host_port_pair_.port()));
rtenneti97137a92015-06-18 06:00:313050 EXPECT_TRUE(session->connection()->connected());
jri7046038f2015-10-22 00:29:263051 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3052 host_port_pair_.port()));
bnc912a04b2016-04-20 14:19:503053 EXPECT_TRUE(HasActiveSession(host_port_pair_));
rtenneti85dcfac22015-03-27 20:22:193054
3055 // Test N-in-a-row high packet loss connections.
3056
3057 DVLOG(1) << "Create 2nd session and test packet loss";
3058
3059 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263060 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563061 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
bncd2368ad2016-04-28 22:06:063062 /*cert_verify_flags=*/0, url2_, "GET",
3063 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:503064 QuicChromiumClientSession* session2 = GetActiveSession(server2);
rtenneti85dcfac22015-03-27 20:22:193065
3066 // If there is no packet loss during handshake confirmation, number of lossy
3067 // connections for the port should be 0.
3068 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263069 factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:193070 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:263071 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/0.9f));
rtenneti85dcfac22015-03-27 20:22:193072 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263073 factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:193074 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:263075 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:193076
3077 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:313078 // and that shouldn't close the session and it shouldn't disable QUIC.
3079 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:263080 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:193081 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263082 factory_.get(), server2.port()));
rtenneti97137a92015-06-18 06:00:313083 EXPECT_TRUE(session2->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:193084 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:263085 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
bnc912a04b2016-04-20 14:19:503086 EXPECT_TRUE(HasActiveSession(server2));
rtenneti85dcfac22015-03-27 20:22:193087
3088 DVLOG(1) << "Create 3rd session which also has packet loss";
3089
3090 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263091 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563092 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563093 /*cert_verify_flags=*/0, url3_, "GET",
rtennetia75df622015-06-21 23:59:503094 net_log_, callback3.callback()));
bnc912a04b2016-04-20 14:19:503095 QuicChromiumClientSession* session3 = GetActiveSession(server3);
rtenneti85dcfac22015-03-27 20:22:193096
rtenneti97137a92015-06-18 06:00:313097 DVLOG(1) << "Create 4th session with packet loss and test IsQuicDisabled()";
3098 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:263099 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:563100 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563101 /*cert_verify_flags=*/0, url4_, "GET",
rtennetia75df622015-06-21 23:59:503102 net_log_, callback4.callback()));
bnc912a04b2016-04-20 14:19:503103 QuicChromiumClientSession* session4 = GetActiveSession(server4);
rtenneti97137a92015-06-18 06:00:313104
rtenneti85dcfac22015-03-27 20:22:193105 // Set packet_loss_rate to higher value than packet_loss_threshold 2nd time in
3106 // a row and that should close the session and disable QUIC.
3107 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:263108 factory_->OnHandshakeConfirmed(session3, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:193109 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263110 factory_.get(), server3.port()));
rtenneti97137a92015-06-18 06:00:313111 EXPECT_FALSE(session3->connection()->connected());
jri7046038f2015-10-22 00:29:263112 EXPECT_TRUE(
3113 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server3.port()));
bnc912a04b2016-04-20 14:19:503114 EXPECT_FALSE(HasActiveSession(server3));
rtenneti85dcfac22015-03-27 20:22:193115
rtenneti97137a92015-06-18 06:00:313116 // Set packet_loss_rate to higher value than packet_loss_threshold 3rd time in
3117 // a row and IsQuicDisabled() should close the session.
3118 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:263119 factory_->OnHandshakeConfirmed(session4, /*packet_loss_rate=*/1.0f));
rtenneti97137a92015-06-18 06:00:313120 EXPECT_EQ(3, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263121 factory_.get(), server4.port()));
rtenneti97137a92015-06-18 06:00:313122 EXPECT_FALSE(session4->connection()->connected());
jri7046038f2015-10-22 00:29:263123 EXPECT_TRUE(
3124 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server4.port()));
bnc912a04b2016-04-20 14:19:503125 EXPECT_FALSE(HasActiveSession(server4));
rtenneti97137a92015-06-18 06:00:313126
danakjad1777e2016-04-16 00:56:423127 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rtenneti85dcfac22015-03-27 20:22:193128 EXPECT_TRUE(stream.get());
danakjad1777e2016-04-16 00:56:423129 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
rtenneti85dcfac22015-03-27 20:22:193130 EXPECT_TRUE(stream2.get());
danakjad1777e2016-04-16 00:56:423131 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
rtenneti85dcfac22015-03-27 20:22:193132 EXPECT_TRUE(stream3.get());
danakjad1777e2016-04-16 00:56:423133 std::unique_ptr<QuicHttpStream> stream4 = request4.CreateStream();
rtenneti97137a92015-06-18 06:00:313134 EXPECT_TRUE(stream4.get());
rch37de576c2015-05-17 20:28:173135 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3136 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3137 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3138 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3139 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3140 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
rtenneti97137a92015-06-18 06:00:313141 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
3142 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
rtenneti85dcfac22015-03-27 20:22:193143}
3144
ckrasic1e53b642015-07-08 22:39:353145TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfTwo) {
jri7046038f2015-10-22 00:29:263146 disable_disk_cache_ = false;
3147 threshold_public_resets_post_handshake_ = 2;
3148 Initialize();
rch6faa4d42016-01-05 20:48:433149 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3150 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3151 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263152 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3153
3154 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3155 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353156 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263157 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353158
mmenke651bae7f2015-12-18 21:26:453159 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3160 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353161 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353162
mmenke651bae7f2015-12-18 21:26:453163 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353164 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353165
rch6faa4d42016-01-05 20:48:433166 HostPortPair server2(kServer2HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353167
3168 crypto_client_stream_factory_.set_handshake_mode(
3169 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3170 host_resolver_.set_synchronous_mode(true);
3171 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3172 "192.168.0.1", "");
3173 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3174
jri7046038f2015-10-22 00:29:263175 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563176 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563177 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3178 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353179
bnc912a04b2016-04-20 14:19:503180 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353181
3182 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
jri78ec06a2016-03-31 18:19:403183 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
3184 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353185 // Need to spin the loop now to ensure that
3186 // QuicStreamFactory::OnSessionClosed() runs.
3187 base::RunLoop run_loop;
3188 run_loop.RunUntilIdle();
3189
jri7046038f2015-10-22 00:29:263190 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3191 factory_.get()));
3192 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3193 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353194
3195 // Test two-in-a-row public reset post handshakes..
3196 DVLOG(1) << "Create 2nd session and trigger public reset post handshake";
3197 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263198 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563199 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563200 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353201 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:503202 QuicChromiumClientSession* session2 = GetActiveSession(server2);
ckrasic1e53b642015-07-08 22:39:353203
jri78ec06a2016-03-31 18:19:403204 session2->connection()->CloseConnection(
3205 QUIC_PUBLIC_RESET, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353206 // Need to spin the loop now to ensure that
3207 // QuicStreamFactory::OnSessionClosed() runs.
3208 base::RunLoop run_loop2;
3209 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263210 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3211 factory_.get()));
3212 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3213 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:163214 EXPECT_EQ(
3215 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
jri7046038f2015-10-22 00:29:263216 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353217
danakjad1777e2016-04-16 00:56:423218 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233219 EXPECT_FALSE(stream.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423220 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233221 EXPECT_FALSE(stream2.get()); // Session is already closed.
ckrasic1e53b642015-07-08 22:39:353222 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3223 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3224 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3225 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3226}
3227
3228TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfTwo) {
jri7046038f2015-10-22 00:29:263229 disable_disk_cache_ = true;
3230 threshold_timeouts_with_open_streams_ = 2;
3231 Initialize();
rch6faa4d42016-01-05 20:48:433232 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3233 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3234 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263235
3236 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3237 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3238 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353239 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263240 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353241
mmenke651bae7f2015-12-18 21:26:453242 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3243 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353244 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353245
mmenke651bae7f2015-12-18 21:26:453246 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353247 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353248
rch6faa4d42016-01-05 20:48:433249 HostPortPair server2(kServer2HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353250
3251 crypto_client_stream_factory_.set_handshake_mode(
3252 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3253 host_resolver_.set_synchronous_mode(true);
3254 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3255 "192.168.0.1", "");
3256 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3257
jri7046038f2015-10-22 00:29:263258 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563259 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563260 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3261 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353262
bnc912a04b2016-04-20 14:19:503263 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353264
danakjad1777e2016-04-16 00:56:423265 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
ckrasic1e53b642015-07-08 22:39:353266 EXPECT_TRUE(stream.get());
3267 HttpRequestInfo request_info;
3268 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3269 net_log_, CompletionCallback()));
3270
3271 DVLOG(1)
3272 << "Created 1st session and initialized a stream. Now trigger timeout";
jri78ec06a2016-03-31 18:19:403273 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
3274 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353275 // Need to spin the loop now to ensure that
3276 // QuicStreamFactory::OnSessionClosed() runs.
3277 base::RunLoop run_loop;
3278 run_loop.RunUntilIdle();
3279
jri7046038f2015-10-22 00:29:263280 EXPECT_EQ(
3281 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3282 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3283 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353284
3285 // Test two-in-a-row timeouts with open streams.
3286 DVLOG(1) << "Create 2nd session and timeout with open stream";
3287 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263288 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563289 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563290 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353291 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:503292 QuicChromiumClientSession* session2 = GetActiveSession(server2);
ckrasic1e53b642015-07-08 22:39:353293
danakjad1777e2016-04-16 00:56:423294 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
ckrasic1e53b642015-07-08 22:39:353295 EXPECT_TRUE(stream2.get());
3296 EXPECT_EQ(OK, stream2->InitializeStream(&request_info, DEFAULT_PRIORITY,
3297 net_log_, CompletionCallback()));
3298
jri78ec06a2016-03-31 18:19:403299 session2->connection()->CloseConnection(
3300 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353301 // Need to spin the loop now to ensure that
3302 // QuicStreamFactory::OnSessionClosed() runs.
3303 base::RunLoop run_loop2;
3304 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263305 EXPECT_EQ(
3306 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3307 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3308 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:163309 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
jri7046038f2015-10-22 00:29:263310 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353311
rchcee7beb2016-03-11 06:16:143312 // Verify that QUIC is un-disabled after a TCP job fails.
3313 factory_->OnTcpJobCompleted(/*succeeded=*/false);
3314 EXPECT_EQ(
3315 0, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3316 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3317 host_port_pair_.port()));
3318
ckrasic1e53b642015-07-08 22:39:353319 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3320 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3321 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3322 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3323}
3324
3325TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfThree) {
jri7046038f2015-10-22 00:29:263326 disable_disk_cache_ = true;
3327 threshold_public_resets_post_handshake_ = 2;
3328 Initialize();
rch6faa4d42016-01-05 20:48:433329 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3330 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3331 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3332 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263333
3334 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3335 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353336 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263337 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353338
mmenke651bae7f2015-12-18 21:26:453339 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3340 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353341 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353342
mmenke651bae7f2015-12-18 21:26:453343 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353344 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353345
mmenke651bae7f2015-12-18 21:26:453346 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353347 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:353348
rch6faa4d42016-01-05 20:48:433349 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3350 HostPortPair server3(kServer3HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353351
3352 crypto_client_stream_factory_.set_handshake_mode(
3353 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3354 host_resolver_.set_synchronous_mode(true);
3355 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3356 "192.168.0.1", "");
3357 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3358 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3359
3360 // Test first and third out of three public reset post handshakes.
jri7046038f2015-10-22 00:29:263361 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563362 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563363 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3364 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353365
bnc912a04b2016-04-20 14:19:503366 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353367
3368 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
jri78ec06a2016-03-31 18:19:403369 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
3370 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353371 // Need to spin the loop now to ensure that
3372 // QuicStreamFactory::OnSessionClosed() runs.
3373 base::RunLoop run_loop;
3374 run_loop.RunUntilIdle();
3375
jri7046038f2015-10-22 00:29:263376 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3377 factory_.get()));
3378 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3379 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353380
3381 DVLOG(1) << "Create 2nd session without disable trigger";
3382 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263383 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563384 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563385 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353386 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:503387 QuicChromiumClientSession* session2 = GetActiveSession(server2);
ckrasic1e53b642015-07-08 22:39:353388
jri78ec06a2016-03-31 18:19:403389 session2->connection()->CloseConnection(
3390 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353391 // Need to spin the loop now to ensure that
3392 // QuicStreamFactory::OnSessionClosed() runs.
3393 base::RunLoop run_loop2;
3394 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263395 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3396 factory_.get()));
3397 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3398 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353399
3400 DVLOG(1) << "Create 3rd session with public reset post handshake,"
3401 << " will disable QUIC";
3402 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263403 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563404 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
bncd2368ad2016-04-28 22:06:063405 /*cert_verify_flags=*/0, url3_, "GET",
ckrasic1e53b642015-07-08 22:39:353406 net_log_, callback3.callback()));
bnc912a04b2016-04-20 14:19:503407 QuicChromiumClientSession* session3 = GetActiveSession(server3);
ckrasic1e53b642015-07-08 22:39:353408
jri78ec06a2016-03-31 18:19:403409 session3->connection()->CloseConnection(
3410 QUIC_PUBLIC_RESET, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353411 // Need to spin the loop now to ensure that
3412 // QuicStreamFactory::OnSessionClosed() runs.
3413 base::RunLoop run_loop3;
3414 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:263415 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3416 factory_.get()));
3417 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3418 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:163419 EXPECT_EQ(
3420 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
jri7046038f2015-10-22 00:29:263421 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353422
danakjad1777e2016-04-16 00:56:423423 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233424 EXPECT_FALSE(stream.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423425 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233426 EXPECT_FALSE(stream2.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423427 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233428 EXPECT_FALSE(stream3.get()); // Session is already closed.
ckrasic1e53b642015-07-08 22:39:353429
3430 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3431 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3432 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3433 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3434 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3435 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3436}
3437
3438TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfThree) {
jri7046038f2015-10-22 00:29:263439 disable_disk_cache_ = true;
3440 threshold_public_resets_post_handshake_ = 2;
3441 Initialize();
rch6faa4d42016-01-05 20:48:433442 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3443 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3444 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3445 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263446 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3447
3448 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3449 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353450 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263451 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353452
mmenke651bae7f2015-12-18 21:26:453453 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3454 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353455 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353456
mmenke651bae7f2015-12-18 21:26:453457 // SequencedSocketData socket_data2(nullptr, 0, nullptr, 0);
3458 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353459 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353460
mmenke651bae7f2015-12-18 21:26:453461 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353462 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:353463
rch6faa4d42016-01-05 20:48:433464 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3465 HostPortPair server3(kServer3HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353466
3467 crypto_client_stream_factory_.set_handshake_mode(
3468 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3469 host_resolver_.set_synchronous_mode(true);
3470 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3471 "192.168.0.1", "");
3472 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3473 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3474
3475 // Test first and third out of three timeouts with open streams.
jri7046038f2015-10-22 00:29:263476 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563477 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563478 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3479 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353480
bnc912a04b2016-04-20 14:19:503481 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353482
danakjad1777e2016-04-16 00:56:423483 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
ckrasic1e53b642015-07-08 22:39:353484 EXPECT_TRUE(stream.get());
3485 HttpRequestInfo request_info;
3486 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3487 net_log_, CompletionCallback()));
3488
3489 DVLOG(1)
3490 << "Created 1st session and initialized a stream. Now trigger timeout";
jri78ec06a2016-03-31 18:19:403491 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
3492 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353493 // Need to spin the loop now to ensure that
3494 // QuicStreamFactory::OnSessionClosed() runs.
3495 base::RunLoop run_loop;
3496 run_loop.RunUntilIdle();
3497
jri7046038f2015-10-22 00:29:263498 EXPECT_EQ(
3499 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3500 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3501 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353502
3503 // Test two-in-a-row timeouts with open streams.
3504 DVLOG(1) << "Create 2nd session without timeout";
3505 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263506 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563507 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563508 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353509 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:503510 QuicChromiumClientSession* session2 = GetActiveSession(server2);
ckrasic1e53b642015-07-08 22:39:353511
jri78ec06a2016-03-31 18:19:403512 session2->connection()->CloseConnection(
3513 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353514 // Need to spin the loop now to ensure that
3515 // QuicStreamFactory::OnSessionClosed() runs.
3516 base::RunLoop run_loop2;
3517 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263518 EXPECT_EQ(
3519 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3520 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3521 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353522
3523 DVLOG(1) << "Create 3rd session with timeout with open streams,"
3524 << " will disable QUIC";
3525
3526 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263527 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563528 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563529 /*cert_verify_flags=*/0, url3_, "GET",
ckrasic1e53b642015-07-08 22:39:353530 net_log_, callback3.callback()));
bnc912a04b2016-04-20 14:19:503531 QuicChromiumClientSession* session3 = GetActiveSession(server3);
ckrasic1e53b642015-07-08 22:39:353532
danakjad1777e2016-04-16 00:56:423533 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
ckrasic1e53b642015-07-08 22:39:353534 EXPECT_TRUE(stream3.get());
3535 EXPECT_EQ(OK, stream3->InitializeStream(&request_info, DEFAULT_PRIORITY,
3536 net_log_, CompletionCallback()));
jri78ec06a2016-03-31 18:19:403537 session3->connection()->CloseConnection(
3538 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353539 // Need to spin the loop now to ensure that
3540 // QuicStreamFactory::OnSessionClosed() runs.
3541 base::RunLoop run_loop3;
3542 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:263543 EXPECT_EQ(
3544 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3545 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3546 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:163547 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
jri7046038f2015-10-22 00:29:263548 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353549
danakjad1777e2016-04-16 00:56:423550 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233551 EXPECT_FALSE(stream2.get()); // Session is already closed.
rchcee7beb2016-03-11 06:16:143552
3553 // Verify that QUIC is un-disabled after a network change.
3554 factory_->OnIPAddressChanged();
3555 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3556 host_port_pair_.port()));
3557 EXPECT_EQ(
3558 0, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3559
ckrasic1e53b642015-07-08 22:39:353560 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3561 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3562 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3563 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3564 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3565 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3566}
3567
zhongyi89649c32016-01-22 00:14:013568TEST_P(QuicStreamFactoryTest, DisableQuicWhenTimeoutsWithOpenStreams) {
3569 disable_disk_cache_ = true;
3570 disable_quic_on_timeout_with_open_streams_ = true;
3571 Initialize();
3572 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3573 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3574 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3575
3576 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3577 host_port_pair_.port()));
3578 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
3579 factory_.get(), host_port_pair_.port()));
3580
3581 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3582 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
3583 socket_factory_.AddSocketDataProvider(&socket_data);
3584
3585 crypto_client_stream_factory_.set_handshake_mode(
3586 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3587 host_resolver_.set_synchronous_mode(true);
3588 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3589 "192.168.0.1", "");
3590
3591 // Test first timeouts with open streams will disable QUIC.
3592 QuicStreamRequest request(factory_.get());
3593 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563594 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3595 callback_.callback()));
zhongyi89649c32016-01-22 00:14:013596
bnc912a04b2016-04-20 14:19:503597 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
zhongyi89649c32016-01-22 00:14:013598
danakjad1777e2016-04-16 00:56:423599 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
zhongyi89649c32016-01-22 00:14:013600 EXPECT_TRUE(stream.get());
3601 HttpRequestInfo request_info;
3602 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3603 net_log_, CompletionCallback()));
3604
3605 DVLOG(1)
3606 << "Created 1st session and initialized a stream. Now trigger timeout."
3607 << "Will disable QUIC.";
jri78ec06a2016-03-31 18:19:403608 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
3609 ConnectionCloseBehavior::SILENT_CLOSE);
zhongyi89649c32016-01-22 00:14:013610 // Need to spin the loop now to ensure that
3611 // QuicStreamFactory::OnSessionClosed() runs.
3612 base::RunLoop run_loop;
3613 run_loop.RunUntilIdle();
3614
3615 EXPECT_EQ(
3616 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3617 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3618 host_port_pair_.port()));
3619
3620 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
3621 factory_->QuicDisabledReason(host_port_pair_.port()));
3622
rchcee7beb2016-03-11 06:16:143623 // Verify that QUIC is fully disabled after a TCP job succeeds.
3624 factory_->OnTcpJobCompleted(/*succeeded=*/true);
3625 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3626 host_port_pair_.port()));
3627
3628 // Verify that QUIC stays disabled after a TCP job succeeds.
3629 factory_->OnTcpJobCompleted(/*succeeded=*/false);
3630 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3631 host_port_pair_.port()));
3632
zhongyi89649c32016-01-22 00:14:013633 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3634 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3635}
3636
ckrasic1e53b642015-07-08 22:39:353637TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfFour) {
jri7046038f2015-10-22 00:29:263638 disable_disk_cache_ = true;
3639 threshold_public_resets_post_handshake_ = 2;
3640 Initialize();
rch6faa4d42016-01-05 20:48:433641 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3642 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3643 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3644 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3645 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263646 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3647
3648 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3649 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353650 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263651 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353652
mmenke651bae7f2015-12-18 21:26:453653 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3654 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353655 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353656
mmenke651bae7f2015-12-18 21:26:453657 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353658 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353659
mmenke651bae7f2015-12-18 21:26:453660 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353661 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:353662
mmenke651bae7f2015-12-18 21:26:453663 SequencedSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353664 socket_factory_.AddSocketDataProvider(&socket_data4);
ckrasic1e53b642015-07-08 22:39:353665
rch6faa4d42016-01-05 20:48:433666 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3667 HostPortPair server3(kServer3HostName, kDefaultServerPort);
3668 HostPortPair server4(kServer4HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353669
3670 crypto_client_stream_factory_.set_handshake_mode(
3671 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3672 host_resolver_.set_synchronous_mode(true);
3673 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3674 "192.168.0.1", "");
3675 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3676 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3677 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
3678
3679 // Test first and fourth out of four public reset post handshakes.
jri7046038f2015-10-22 00:29:263680 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563681 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563682 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3683 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353684
bnc912a04b2016-04-20 14:19:503685 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353686
3687 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
jri78ec06a2016-03-31 18:19:403688 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
3689 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353690 // Need to spin the loop now to ensure that
3691 // QuicStreamFactory::OnSessionClosed() runs.
3692 base::RunLoop run_loop;
3693 run_loop.RunUntilIdle();
3694
jri7046038f2015-10-22 00:29:263695 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3696 factory_.get()));
3697 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3698 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353699
3700 DVLOG(1) << "Create 2nd and 3rd sessions without disable trigger";
3701 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263702 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563703 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563704 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353705 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:503706 QuicChromiumClientSession* session2 = GetActiveSession(server2);
ckrasic1e53b642015-07-08 22:39:353707
jri78ec06a2016-03-31 18:19:403708 session2->connection()->CloseConnection(
3709 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353710 // Need to spin the loop now to ensure that
3711 // QuicStreamFactory::OnSessionClosed() runs.
3712 base::RunLoop run_loop2;
3713 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263714 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3715 factory_.get()));
3716 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3717 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353718
3719 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263720 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563721 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563722 /*cert_verify_flags=*/0, url3_, "GET",
ckrasic1e53b642015-07-08 22:39:353723 net_log_, callback3.callback()));
bnc912a04b2016-04-20 14:19:503724 QuicChromiumClientSession* session3 = GetActiveSession(server3);
ckrasic1e53b642015-07-08 22:39:353725
jri78ec06a2016-03-31 18:19:403726 session3->connection()->CloseConnection(
3727 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353728 // Need to spin the loop now to ensure that
3729 // QuicStreamFactory::OnSessionClosed() runs.
3730 base::RunLoop run_loop3;
3731 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:263732 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3733 factory_.get()));
3734 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3735 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353736
3737 DVLOG(1) << "Create 4rd session with public reset post handshake,"
3738 << " will not disable QUIC";
3739 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:263740 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:563741 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563742 /*cert_verify_flags=*/0, url4_, "GET",
ckrasic1e53b642015-07-08 22:39:353743 net_log_, callback4.callback()));
bnc912a04b2016-04-20 14:19:503744 QuicChromiumClientSession* session4 = GetActiveSession(server4);
ckrasic1e53b642015-07-08 22:39:353745
jri78ec06a2016-03-31 18:19:403746 session4->connection()->CloseConnection(
3747 QUIC_PUBLIC_RESET, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353748 // Need to spin the loop now to ensure that
3749 // QuicStreamFactory::OnSessionClosed() runs.
3750 base::RunLoop run_loop4;
3751 run_loop4.RunUntilIdle();
jri7046038f2015-10-22 00:29:263752 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3753 factory_.get()));
3754 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3755 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353756
danakjad1777e2016-04-16 00:56:423757 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233758 EXPECT_FALSE(stream.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423759 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233760 EXPECT_FALSE(stream2.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423761 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233762 EXPECT_FALSE(stream3.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423763 std::unique_ptr<QuicHttpStream> stream4 = request4.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233764 EXPECT_FALSE(stream4.get()); // Session is already closed.
ckrasic1e53b642015-07-08 22:39:353765
3766 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3767 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3768 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3769 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3770 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3771 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3772 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
3773 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
3774}
3775
3776TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfFour) {
jri7046038f2015-10-22 00:29:263777 disable_disk_cache_ = true;
3778 threshold_public_resets_post_handshake_ = 2;
3779 Initialize();
rch6faa4d42016-01-05 20:48:433780 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3781 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3782 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3783 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3784 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263785 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3786
3787 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3788 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353789 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263790 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353791
mmenke651bae7f2015-12-18 21:26:453792 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3793 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353794 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353795
mmenke651bae7f2015-12-18 21:26:453796 // SequencedSocketData socket_data2(nullptr, 0, nullptr, 0);
3797 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353798 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353799
mmenke651bae7f2015-12-18 21:26:453800 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353801 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:353802
mmenke651bae7f2015-12-18 21:26:453803 SequencedSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353804 socket_factory_.AddSocketDataProvider(&socket_data4);
ckrasic1e53b642015-07-08 22:39:353805
rch6faa4d42016-01-05 20:48:433806 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3807 HostPortPair server3(kServer3HostName, kDefaultServerPort);
3808 HostPortPair server4(kServer4HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353809
3810 crypto_client_stream_factory_.set_handshake_mode(
3811 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3812 host_resolver_.set_synchronous_mode(true);
3813 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3814 "192.168.0.1", "");
3815 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3816 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3817 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
3818
3819 // Test first and fourth out of three timeouts with open streams.
jri7046038f2015-10-22 00:29:263820 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563821 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563822 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3823 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353824
bnc912a04b2016-04-20 14:19:503825 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353826
danakjad1777e2016-04-16 00:56:423827 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
ckrasic1e53b642015-07-08 22:39:353828 EXPECT_TRUE(stream.get());
3829 HttpRequestInfo request_info;
3830 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3831 net_log_, CompletionCallback()));
3832
3833 DVLOG(1)
3834 << "Created 1st session and initialized a stream. Now trigger timeout";
jri78ec06a2016-03-31 18:19:403835 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
3836 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353837 // Need to spin the loop now to ensure that
3838 // QuicStreamFactory::OnSessionClosed() runs.
3839 base::RunLoop run_loop;
3840 run_loop.RunUntilIdle();
3841
jri7046038f2015-10-22 00:29:263842 EXPECT_EQ(
3843 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3844 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3845 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353846
3847 DVLOG(1) << "Create 2nd and 3rd sessions without timeout";
3848 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263849 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563850 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563851 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353852 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:503853 QuicChromiumClientSession* session2 = GetActiveSession(server2);
ckrasic1e53b642015-07-08 22:39:353854
jri78ec06a2016-03-31 18:19:403855 session2->connection()->CloseConnection(
3856 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353857 // Need to spin the loop now to ensure that
3858 // QuicStreamFactory::OnSessionClosed() runs.
3859 base::RunLoop run_loop2;
3860 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263861 EXPECT_EQ(
3862 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3863 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3864 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353865
3866 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263867 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563868 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563869 /*cert_verify_flags=*/0, url3_, "GET",
ckrasic1e53b642015-07-08 22:39:353870 net_log_, callback3.callback()));
bnc912a04b2016-04-20 14:19:503871 QuicChromiumClientSession* session3 = GetActiveSession(server3);
ckrasic1e53b642015-07-08 22:39:353872
jri78ec06a2016-03-31 18:19:403873 session3->connection()->CloseConnection(
3874 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353875 // Need to spin the loop now to ensure that
3876 // QuicStreamFactory::OnSessionClosed() runs.
3877 base::RunLoop run_loop3;
3878 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:263879 EXPECT_EQ(
3880 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3881 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3882 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353883
3884 DVLOG(1) << "Create 4th session with timeout with open streams,"
3885 << " will not disable QUIC";
3886
3887 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:263888 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:563889 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563890 /*cert_verify_flags=*/0, url4_, "GET",
ckrasic1e53b642015-07-08 22:39:353891 net_log_, callback4.callback()));
bnc912a04b2016-04-20 14:19:503892 QuicChromiumClientSession* session4 = GetActiveSession(server4);
ckrasic1e53b642015-07-08 22:39:353893
danakjad1777e2016-04-16 00:56:423894 std::unique_ptr<QuicHttpStream> stream4 = request4.CreateStream();
ckrasic1e53b642015-07-08 22:39:353895 EXPECT_TRUE(stream4.get());
3896 EXPECT_EQ(OK, stream4->InitializeStream(&request_info, DEFAULT_PRIORITY,
3897 net_log_, CompletionCallback()));
jri78ec06a2016-03-31 18:19:403898 session4->connection()->CloseConnection(
3899 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353900 // Need to spin the loop now to ensure that
3901 // QuicStreamFactory::OnSessionClosed() runs.
3902 base::RunLoop run_loop4;
3903 run_loop4.RunUntilIdle();
jri7046038f2015-10-22 00:29:263904 EXPECT_EQ(
3905 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3906 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3907 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353908
danakjad1777e2016-04-16 00:56:423909 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233910 EXPECT_FALSE(stream2.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423911 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233912 EXPECT_FALSE(stream3.get()); // Session is already closed.
rchcee7beb2016-03-11 06:16:143913
ckrasic1e53b642015-07-08 22:39:353914 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3915 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3916 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3917 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3918 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3919 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3920 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
3921 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
3922}
3923
rtenneti8332ba52015-09-17 19:33:413924TEST_P(QuicStreamFactoryTest, EnableDelayTcpRace) {
jri7046038f2015-10-22 00:29:263925 Initialize();
rch6faa4d42016-01-05 20:48:433926 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3927 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rtennetib8e80fb2016-05-16 00:12:093928 bool delay_tcp_race = QuicStreamFactoryPeer::GetDelayTcpRace(factory_.get());
3929 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), false);
mmenke651bae7f2015-12-18 21:26:453930 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3931 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti8332ba52015-09-17 19:33:413932 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti8332ba52015-09-17 19:33:413933
rtenneti8332ba52015-09-17 19:33:413934 ServerNetworkStats stats1;
3935 stats1.srtt = base::TimeDelta::FromMicroseconds(10);
bnc3d9035b32016-06-30 18:18:483936 http_server_properties_.SetServerNetworkStats(url::SchemeHostPort(url_),
3937 stats1);
rtenneti8332ba52015-09-17 19:33:413938
3939 crypto_client_stream_factory_.set_handshake_mode(
rchcb1d6bde2016-06-18 00:33:073940 MockCryptoClientStream::COLD_START);
rtenneti8332ba52015-09-17 19:33:413941 host_resolver_.set_synchronous_mode(true);
3942 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3943 "192.168.0.1", "");
3944
jri7046038f2015-10-22 00:29:263945 QuicStreamRequest request(factory_.get());
rtenneti8332ba52015-09-17 19:33:413946 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:563947 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563948 /*cert_verify_flags=*/0, url_, "POST", net_log_,
3949 callback_.callback()));
rtenneti8332ba52015-09-17 19:33:413950
rtennetib8e80fb2016-05-16 00:12:093951 // If we don't delay TCP connection, then time delay should be 0.
3952 EXPECT_FALSE(factory_->delay_tcp_race());
3953 EXPECT_EQ(base::TimeDelta(), request.GetTimeDelayForWaitingJob());
3954
3955 // Enable |delay_tcp_race_| param and verify delay is one RTT and that
3956 // server supports QUIC.
3957 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), true);
3958 EXPECT_TRUE(factory_->delay_tcp_race());
rtenneti8332ba52015-09-17 19:33:413959 EXPECT_EQ(base::TimeDelta::FromMicroseconds(15),
3960 request.GetTimeDelayForWaitingJob());
3961
3962 // Confirm the handshake and verify that the stream is created.
3963 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
3964 QuicSession::HANDSHAKE_CONFIRMED);
3965
robpercival214763f2016-07-01 23:27:013966 EXPECT_THAT(callback_.WaitForResult(), IsOk());
rtenneti8332ba52015-09-17 19:33:413967
danakjad1777e2016-04-16 00:56:423968 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rtenneti8332ba52015-09-17 19:33:413969 EXPECT_TRUE(stream.get());
3970 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3971 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtennetib8e80fb2016-05-16 00:12:093972 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), delay_tcp_race);
rtenneti8332ba52015-09-17 19:33:413973}
3974
rtenneticd2aaa15b2015-10-10 20:29:333975TEST_P(QuicStreamFactoryTest, MaybeInitialize) {
rtenneti41c09992015-11-30 18:24:013976 idle_connection_timeout_seconds_ = 500;
jri7046038f2015-10-22 00:29:263977 Initialize();
rch6faa4d42016-01-05 20:48:433978 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3979 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rtenneti41c09992015-11-30 18:24:013980 const QuicConfig* config = QuicStreamFactoryPeer::GetConfig(factory_.get());
3981 EXPECT_EQ(500, config->IdleConnectionStateLifetime().ToSeconds());
3982
jri7046038f2015-10-22 00:29:263983 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti8a80a6dc2015-09-21 19:51:133984
rtenneti8a80a6dc2015-09-21 19:51:133985 const AlternativeService alternative_service1(QUIC, host_port_pair_.host(),
3986 host_port_pair_.port());
3987 AlternativeServiceInfoVector alternative_service_info_vector;
3988 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
3989 alternative_service_info_vector.push_back(
rchdc7b9052016-03-17 20:51:503990 AlternativeServiceInfo(alternative_service1, expiration));
rtenneticcab42b2015-10-09 06:38:163991 http_server_properties_.SetAlternativeServices(
bnc3d9035b32016-06-30 18:18:483992 url::SchemeHostPort(url_), alternative_service_info_vector);
rtennetiee679d52016-04-06 17:01:133993
3994 HostPortPair host_port_pair2(kServer2HostName, kDefaultServerPort);
zhongyi3d4a55e72016-04-22 20:36:463995 url::SchemeHostPort server2("https", kServer2HostName, kDefaultServerPort);
rtennetiee679d52016-04-06 17:01:133996 const AlternativeService alternative_service2(QUIC, host_port_pair2.host(),
3997 host_port_pair2.port());
3998 AlternativeServiceInfoVector alternative_service_info_vector2;
3999 alternative_service_info_vector2.push_back(
4000 AlternativeServiceInfo(alternative_service2, expiration));
4001 http_server_properties_.SetAlternativeServices(
zhongyi3d4a55e72016-04-22 20:36:464002 server2, alternative_service_info_vector2);
rtennetiee679d52016-04-06 17:01:134003
rtenneti6971c172016-01-15 20:12:104004 http_server_properties_.SetMaxServerConfigsStoredInProperties(
4005 kMaxQuicServersToPersist);
rtenneti8a80a6dc2015-09-21 19:51:134006
rch6faa4d42016-01-05 20:48:434007 QuicServerId quic_server_id(kDefaultServerHostName, 80,
4008 PRIVACY_MODE_DISABLED);
rtenneticd2aaa15b2015-10-10 20:29:334009 QuicServerInfoFactory* quic_server_info_factory =
bnc525e175a2016-06-20 12:36:404010 new PropertiesBasedQuicServerInfoFactory(&http_server_properties_);
jri7046038f2015-10-22 00:29:264011 factory_->set_quic_server_info_factory(quic_server_info_factory);
rtenneticd2aaa15b2015-10-10 20:29:334012
danakjad1777e2016-04-16 00:56:424013 std::unique_ptr<QuicServerInfo> quic_server_info(
rtenneticd2aaa15b2015-10-10 20:29:334014 quic_server_info_factory->GetForServer(quic_server_id));
4015
4016 // Update quic_server_info's server_config and persist it.
4017 QuicServerInfo::State* state = quic_server_info->mutable_state();
4018 // Minimum SCFG that passes config validation checks.
4019 const char scfg[] = {// SCFG
4020 0x53, 0x43, 0x46, 0x47,
4021 // num entries
4022 0x01, 0x00,
4023 // padding
4024 0x00, 0x00,
4025 // EXPY
4026 0x45, 0x58, 0x50, 0x59,
4027 // EXPY end offset
4028 0x08, 0x00, 0x00, 0x00,
4029 // Value
4030 '1', '2', '3', '4', '5', '6', '7', '8'};
4031
4032 // Create temporary strings becasue Persist() clears string data in |state|.
4033 string server_config(reinterpret_cast<const char*>(&scfg), sizeof(scfg));
4034 string source_address_token("test_source_address_token");
rtenneti61de3682016-03-24 00:50:024035 string cert_sct("test_cert_sct");
4036 string chlo_hash("test_chlo_hash");
rtenneticd2aaa15b2015-10-10 20:29:334037 string signature("test_signature");
4038 string test_cert("test_cert");
4039 vector<string> certs;
4040 certs.push_back(test_cert);
4041 state->server_config = server_config;
4042 state->source_address_token = source_address_token;
rtenneti61de3682016-03-24 00:50:024043 state->cert_sct = cert_sct;
4044 state->chlo_hash = chlo_hash;
rtenneticd2aaa15b2015-10-10 20:29:334045 state->server_config_sig = signature;
4046 state->certs = certs;
4047
4048 quic_server_info->Persist();
4049
rtennetiee679d52016-04-06 17:01:134050 QuicServerId quic_server_id2(kServer2HostName, 80, PRIVACY_MODE_DISABLED);
danakjad1777e2016-04-16 00:56:424051 std::unique_ptr<QuicServerInfo> quic_server_info2(
rtennetiee679d52016-04-06 17:01:134052 quic_server_info_factory->GetForServer(quic_server_id2));
4053
4054 // Update quic_server_info2's server_config and persist it.
4055 QuicServerInfo::State* state2 = quic_server_info2->mutable_state();
4056
4057 // Minimum SCFG that passes config validation checks.
4058 const char scfg2[] = {// SCFG
4059 0x53, 0x43, 0x46, 0x47,
4060 // num entries
4061 0x01, 0x00,
4062 // padding
4063 0x00, 0x00,
4064 // EXPY
4065 0x45, 0x58, 0x50, 0x59,
4066 // EXPY end offset
4067 0x08, 0x00, 0x00, 0x00,
4068 // Value
4069 '8', '7', '3', '4', '5', '6', '2', '1'};
4070
4071 // Create temporary strings becasue Persist() clears string data in |state2|.
4072 string server_config2(reinterpret_cast<const char*>(&scfg2), sizeof(scfg2));
4073 string source_address_token2("test_source_address_token2");
4074 string cert_sct2("test_cert_sct2");
4075 string chlo_hash2("test_chlo_hash2");
4076 string signature2("test_signature2");
4077 string test_cert2("test_cert2");
4078 vector<string> certs2;
4079 certs2.push_back(test_cert2);
4080 state2->server_config = server_config2;
4081 state2->source_address_token = source_address_token2;
4082 state2->cert_sct = cert_sct2;
4083 state2->chlo_hash = chlo_hash2;
4084 state2->server_config_sig = signature2;
4085 state2->certs = certs2;
4086
4087 quic_server_info2->Persist();
4088
jri7046038f2015-10-22 00:29:264089 QuicStreamFactoryPeer::MaybeInitialize(factory_.get());
4090 EXPECT_TRUE(QuicStreamFactoryPeer::HasInitializedData(factory_.get()));
rtennetiee679d52016-04-06 17:01:134091
4092 // Verify the MRU order is maintained.
4093 const QuicServerInfoMap& quic_server_info_map =
4094 http_server_properties_.quic_server_info_map();
4095 EXPECT_EQ(2u, quic_server_info_map.size());
4096 QuicServerInfoMap::const_iterator quic_server_info_map_it =
4097 quic_server_info_map.begin();
4098 EXPECT_EQ(quic_server_info_map_it->first, quic_server_id2);
4099 ++quic_server_info_map_it;
4100 EXPECT_EQ(quic_server_info_map_it->first, quic_server_id);
4101
jri7046038f2015-10-22 00:29:264102 EXPECT_TRUE(QuicStreamFactoryPeer::SupportsQuicAtStartUp(factory_.get(),
4103 host_port_pair_));
4104 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(factory_.get(),
rtenneticd2aaa15b2015-10-10 20:29:334105 quic_server_id));
4106 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:264107 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rtenneticd2aaa15b2015-10-10 20:29:334108 QuicCryptoClientConfig::CachedState* cached =
4109 crypto_config->LookupOrCreate(quic_server_id);
4110 EXPECT_FALSE(cached->server_config().empty());
4111 EXPECT_TRUE(cached->GetServerConfig());
4112 EXPECT_EQ(server_config, cached->server_config());
4113 EXPECT_EQ(source_address_token, cached->source_address_token());
rtenneti61de3682016-03-24 00:50:024114 EXPECT_EQ(cert_sct, cached->cert_sct());
4115 EXPECT_EQ(chlo_hash, cached->chlo_hash());
rtenneticd2aaa15b2015-10-10 20:29:334116 EXPECT_EQ(signature, cached->signature());
4117 ASSERT_EQ(1U, cached->certs().size());
4118 EXPECT_EQ(test_cert, cached->certs()[0]);
rtennetiee679d52016-04-06 17:01:134119
4120 EXPECT_TRUE(QuicStreamFactoryPeer::SupportsQuicAtStartUp(factory_.get(),
4121 host_port_pair2));
4122 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(
4123 factory_.get(), quic_server_id2));
4124 QuicCryptoClientConfig::CachedState* cached2 =
4125 crypto_config->LookupOrCreate(quic_server_id2);
4126 EXPECT_FALSE(cached2->server_config().empty());
4127 EXPECT_TRUE(cached2->GetServerConfig());
4128 EXPECT_EQ(server_config2, cached2->server_config());
4129 EXPECT_EQ(source_address_token2, cached2->source_address_token());
4130 EXPECT_EQ(cert_sct2, cached2->cert_sct());
4131 EXPECT_EQ(chlo_hash2, cached2->chlo_hash());
4132 EXPECT_EQ(signature2, cached2->signature());
4133 ASSERT_EQ(1U, cached->certs().size());
4134 EXPECT_EQ(test_cert2, cached2->certs()[0]);
rtenneti8a80a6dc2015-09-21 19:51:134135}
4136
rtennetid2e74caa2015-12-09 00:51:574137TEST_P(QuicStreamFactoryTest, QuicDoingZeroRTT) {
4138 Initialize();
4139
4140 factory_->set_require_confirmation(true);
4141 QuicServerId quic_server_id(host_port_pair_, PRIVACY_MODE_DISABLED);
4142 EXPECT_FALSE(factory_->ZeroRTTEnabledFor(quic_server_id));
4143
4144 factory_->set_require_confirmation(false);
4145 EXPECT_FALSE(factory_->ZeroRTTEnabledFor(quic_server_id));
4146
4147 // Load server config and verify QUIC will do 0RTT.
4148 QuicStreamFactoryPeer::CacheDummyServerConfig(factory_.get(), quic_server_id);
4149 EXPECT_TRUE(factory_->ZeroRTTEnabledFor(quic_server_id));
4150}
4151
rtenneti1cd3b162015-09-29 02:58:284152TEST_P(QuicStreamFactoryTest, YieldAfterPackets) {
jri7046038f2015-10-22 00:29:264153 Initialize();
rch6faa4d42016-01-05 20:48:434154 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4155 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:264156 QuicStreamFactoryPeer::SetYieldAfterPackets(factory_.get(), 0);
rtenneti1cd3b162015-09-29 02:58:284157
danakjad1777e2016-04-16 00:56:424158 std::unique_ptr<QuicEncryptedPacket> close_packet(
alyssar2adf3ac2016-05-03 17:12:584159 ConstructClientConnectionClosePacket(0));
rtenneticd2aaa15b2015-10-10 20:29:334160 vector<MockRead> reads;
rtenneti1cd3b162015-09-29 02:58:284161 reads.push_back(
4162 MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0));
4163 reads.push_back(MockRead(ASYNC, OK, 1));
mmenke651bae7f2015-12-18 21:26:454164 SequencedSocketData socket_data(&reads[0], reads.size(), nullptr, 0);
rtenneti1cd3b162015-09-29 02:58:284165 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti1cd3b162015-09-29 02:58:284166
4167 crypto_client_stream_factory_.set_handshake_mode(
4168 MockCryptoClientStream::ZERO_RTT);
4169 host_resolver_.set_synchronous_mode(true);
4170 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
4171 "192.168.0.1", "");
4172
rcha02807b42016-01-29 21:56:154173 // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
4174 // posts a task.
rtenneti1cd3b162015-09-29 02:58:284175 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
rcha02807b42016-01-29 21:56:154176 SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
4177 "StartReading");
rtenneti1cd3b162015-09-29 02:58:284178
jri7046038f2015-10-22 00:29:264179 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:564180 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:564181 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4182 callback_.callback()));
rtenneti1cd3b162015-09-29 02:58:284183
rcha02807b42016-01-29 21:56:154184 // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
4185 // called.
rtenneti1cd3b162015-09-29 02:58:284186 base::RunLoop run_loop;
4187 run_loop.RunUntilIdle();
4188
4189 // Verify task that the observer's executed_count is 1, which indicates
rcha02807b42016-01-29 21:56:154190 // QuicChromiumPacketReader::StartReading() has posted only one task and
4191 // yielded the read.
rtenneti1cd3b162015-09-29 02:58:284192 EXPECT_EQ(1u, observer.executed_count());
4193
danakjad1777e2016-04-16 00:56:424194 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
xunjieli2608f9b2016-03-14 13:39:234195 EXPECT_FALSE(stream.get()); // Session is already closed.
rtenneti1cd3b162015-09-29 02:58:284196 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4197 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4198}
4199
4200TEST_P(QuicStreamFactoryTest, YieldAfterDuration) {
jri7046038f2015-10-22 00:29:264201 Initialize();
rch6faa4d42016-01-05 20:48:434202 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4203 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rtenneti1cd3b162015-09-29 02:58:284204 QuicStreamFactoryPeer::SetYieldAfterDuration(
jri7046038f2015-10-22 00:29:264205 factory_.get(), QuicTime::Delta::FromMilliseconds(-1));
rtenneti1cd3b162015-09-29 02:58:284206
danakjad1777e2016-04-16 00:56:424207 std::unique_ptr<QuicEncryptedPacket> close_packet(
alyssar2adf3ac2016-05-03 17:12:584208 ConstructClientConnectionClosePacket(0));
rtenneticd2aaa15b2015-10-10 20:29:334209 vector<MockRead> reads;
rtenneti1cd3b162015-09-29 02:58:284210 reads.push_back(
4211 MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0));
4212 reads.push_back(MockRead(ASYNC, OK, 1));
mmenke651bae7f2015-12-18 21:26:454213 SequencedSocketData socket_data(&reads[0], reads.size(), nullptr, 0);
rtenneti1cd3b162015-09-29 02:58:284214 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti1cd3b162015-09-29 02:58:284215
4216 crypto_client_stream_factory_.set_handshake_mode(
4217 MockCryptoClientStream::ZERO_RTT);
4218 host_resolver_.set_synchronous_mode(true);
4219 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
4220 "192.168.0.1", "");
4221
rcha02807b42016-01-29 21:56:154222 // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
4223 // posts a task.
rtenneti1cd3b162015-09-29 02:58:284224 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
rcha02807b42016-01-29 21:56:154225 SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
4226 "StartReading");
rtenneti1cd3b162015-09-29 02:58:284227
jri7046038f2015-10-22 00:29:264228 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:564229 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:564230 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4231 callback_.callback()));
rtenneti1cd3b162015-09-29 02:58:284232
rcha02807b42016-01-29 21:56:154233 // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
4234 // called.
rtenneti1cd3b162015-09-29 02:58:284235 base::RunLoop run_loop;
4236 run_loop.RunUntilIdle();
4237
4238 // Verify task that the observer's executed_count is 1, which indicates
rcha02807b42016-01-29 21:56:154239 // QuicChromiumPacketReader::StartReading() has posted only one task and
4240 // yielded the read.
rtenneti1cd3b162015-09-29 02:58:284241 EXPECT_EQ(1u, observer.executed_count());
4242
danakjad1777e2016-04-16 00:56:424243 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
xunjieli2608f9b2016-03-14 13:39:234244 EXPECT_FALSE(stream.get()); // Session is already closed.
rtenneti1cd3b162015-09-29 02:58:284245 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4246 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4247}
4248
ckrasic3865ee0f2016-02-29 22:04:564249TEST_P(QuicStreamFactoryTest, ServerPushSessionAffinity) {
4250 Initialize();
4251 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4252 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4253
4254 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
4255 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
4256 socket_factory_.AddSocketDataProvider(&socket_data);
4257
4258 QuicStreamRequest request(factory_.get());
4259 EXPECT_EQ(ERR_IO_PENDING,
4260 request.Request(host_port_pair_, privacy_mode_,
4261 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4262 callback_.callback()));
4263
robpercival214763f2016-07-01 23:27:014264 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:424265 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
ckrasic3865ee0f2016-02-29 22:04:564266 EXPECT_TRUE(stream.get());
4267
4268 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
4269
bnc5fdc07162016-05-23 17:36:034270 string url = "https://www.example.org/";
ckrasic3865ee0f2016-02-29 22:04:564271
bnc912a04b2016-04-20 14:19:504272 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic3865ee0f2016-02-29 22:04:564273
bnc3d9035b32016-06-30 18:18:484274 QuicClientPromisedInfo promised(session, kServerDataStreamId1, kDefaultUrl);
ckrasic3865ee0f2016-02-29 22:04:564275 (*QuicStreamFactoryPeer::GetPushPromiseIndex(factory_.get())
bnc3d9035b32016-06-30 18:18:484276 ->promised_by_url())[kDefaultUrl] = &promised;
ckrasic3865ee0f2016-02-29 22:04:564277
4278 QuicStreamRequest request2(factory_.get());
4279 EXPECT_EQ(OK, request2.Request(host_port_pair_, privacy_mode_,
bnc3d9035b32016-06-30 18:18:484280 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4281 callback_.callback()));
ckrasic3865ee0f2016-02-29 22:04:564282
4283 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
4284}
4285
4286TEST_P(QuicStreamFactoryTest, ServerPushPrivacyModeMismatch) {
4287 Initialize();
4288 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4289 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4290 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4291
4292 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
4293
alyssar2adf3ac2016-05-03 17:12:584294 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
ckrasic3865ee0f2016-02-29 22:04:564295 1, true, kServerDataStreamId1, QUIC_STREAM_CANCELLED));
4296 MockWrite writes[] = {
4297 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
4298 };
4299
4300 SequencedSocketData socket_data1(reads, arraysize(reads), writes,
4301 arraysize(writes));
4302 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
4303
4304 socket_factory_.AddSocketDataProvider(&socket_data1);
4305 socket_factory_.AddSocketDataProvider(&socket_data2);
4306
4307 QuicStreamRequest request(factory_.get());
4308 EXPECT_EQ(ERR_IO_PENDING,
4309 request.Request(host_port_pair_, privacy_mode_,
4310 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4311 callback_.callback()));
4312
robpercival214763f2016-07-01 23:27:014313 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:424314 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
ckrasic3865ee0f2016-02-29 22:04:564315 EXPECT_TRUE(stream.get());
4316
4317 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
4318
bnc5fdc07162016-05-23 17:36:034319 string url = "https://www.example.org/";
bnc912a04b2016-04-20 14:19:504320 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic3865ee0f2016-02-29 22:04:564321
bnc3d9035b32016-06-30 18:18:484322 QuicClientPromisedInfo promised(session, kServerDataStreamId1, kDefaultUrl);
ckrasic3865ee0f2016-02-29 22:04:564323
4324 QuicClientPushPromiseIndex* index =
4325 QuicStreamFactoryPeer::GetPushPromiseIndex(factory_.get());
4326
bnc3d9035b32016-06-30 18:18:484327 (*index->promised_by_url())[kDefaultUrl] = &promised;
4328 EXPECT_EQ(index->GetPromised(kDefaultUrl), &promised);
ckrasic3865ee0f2016-02-29 22:04:564329
4330 // Doing the request should not use the push stream, but rather
4331 // cancel it because the privacy modes do not match.
4332 QuicStreamRequest request2(factory_.get());
4333 EXPECT_EQ(ERR_IO_PENDING,
4334 request2.Request(host_port_pair_, PRIVACY_MODE_ENABLED,
bnc3d9035b32016-06-30 18:18:484335 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4336 callback_.callback()));
ckrasic3865ee0f2016-02-29 22:04:564337
4338 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
bnc3d9035b32016-06-30 18:18:484339 EXPECT_EQ(index->GetPromised(kDefaultUrl), nullptr);
ckrasic3865ee0f2016-02-29 22:04:564340
robpercival214763f2016-07-01 23:27:014341 EXPECT_THAT(callback_.WaitForResult(), IsOk());
danakjad1777e2016-04-16 00:56:424342 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
ckrasic3865ee0f2016-02-29 22:04:564343 EXPECT_TRUE(stream2.get());
4344
4345 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
4346 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
4347 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
4348 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
4349}
4350
bnc359ed2a2016-04-29 20:43:454351// Pool to existing session with matching QuicServerId
4352// even if destination is different.
4353TEST_P(QuicStreamFactoryTest, PoolByOrigin) {
4354 Initialize();
4355
4356 HostPortPair destination1("first.example.com", 443);
4357 HostPortPair destination2("second.example.com", 443);
4358
4359 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4360 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4361
4362 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
4363 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
4364 socket_factory_.AddSocketDataProvider(&socket_data);
4365
4366 QuicStreamRequest request1(factory_.get());
4367 EXPECT_EQ(ERR_IO_PENDING,
4368 request1.Request(destination1, privacy_mode_,
4369 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4370 callback_.callback()));
robpercival214763f2016-07-01 23:27:014371 EXPECT_THAT(callback_.WaitForResult(), IsOk());
bnc359ed2a2016-04-29 20:43:454372 std::unique_ptr<QuicHttpStream> stream1 = request1.CreateStream();
4373 EXPECT_TRUE(stream1.get());
4374 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4375
4376 // Second request returns synchronously because it pools to existing session.
4377 TestCompletionCallback callback2;
4378 QuicStreamRequest request2(factory_.get());
4379 EXPECT_EQ(OK, request2.Request(destination2, privacy_mode_,
4380 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4381 callback2.callback()));
4382 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
4383 EXPECT_TRUE(stream2.get());
4384
4385 QuicChromiumClientSession* session1 =
4386 QuicHttpStreamPeer::GetSession(stream1.get());
4387 QuicChromiumClientSession* session2 =
4388 QuicHttpStreamPeer::GetSession(stream2.get());
4389 EXPECT_EQ(session1, session2);
4390 EXPECT_EQ(QuicServerId(host_port_pair_, privacy_mode_),
4391 session1->server_id());
4392
4393 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4394 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4395}
4396
4397class QuicStreamFactoryWithDestinationTest
4398 : public QuicStreamFactoryTestBase,
4399 public ::testing::TestWithParam<PoolingTestParams> {
4400 protected:
4401 QuicStreamFactoryWithDestinationTest()
4402 : QuicStreamFactoryTestBase(GetParam().version,
4403 GetParam().enable_connection_racing),
4404 destination_type_(GetParam().destination_type),
4405 hanging_read_(SYNCHRONOUS, ERR_IO_PENDING, 0) {}
4406
4407 HostPortPair GetDestination() {
4408 switch (destination_type_) {
4409 case SAME_AS_FIRST:
4410 return origin1_;
4411 case SAME_AS_SECOND:
4412 return origin2_;
4413 case DIFFERENT:
4414 return HostPortPair(kDifferentHostname, 443);
4415 default:
4416 NOTREACHED();
4417 return HostPortPair();
4418 }
4419 }
4420
4421 void AddHangingSocketData() {
4422 std::unique_ptr<SequencedSocketData> sequenced_socket_data(
4423 new SequencedSocketData(&hanging_read_, 1, nullptr, 0));
4424 socket_factory_.AddSocketDataProvider(sequenced_socket_data.get());
4425 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
4426 }
4427
4428 bool AllDataConsumed() {
4429 for (const auto& socket_data_ptr : sequenced_socket_data_vector_) {
4430 if (!socket_data_ptr->AllReadDataConsumed() ||
4431 !socket_data_ptr->AllWriteDataConsumed()) {
4432 return false;
4433 }
4434 }
4435 return true;
4436 }
4437
4438 DestinationType destination_type_;
4439 HostPortPair origin1_;
4440 HostPortPair origin2_;
4441 MockRead hanging_read_;
bnc5fdc07162016-05-23 17:36:034442 vector<std::unique_ptr<SequencedSocketData>> sequenced_socket_data_vector_;
bnc359ed2a2016-04-29 20:43:454443};
4444
4445INSTANTIATE_TEST_CASE_P(Version,
4446 QuicStreamFactoryWithDestinationTest,
4447 ::testing::ValuesIn(GetPoolingTestParams()));
4448
4449// A single QUIC request fails because the certificate does not match the origin
4450// hostname, regardless of whether it matches the alternative service hostname.
4451TEST_P(QuicStreamFactoryWithDestinationTest, InvalidCertificate) {
4452 if (destination_type_ == DIFFERENT)
4453 return;
4454
4455 Initialize();
4456
4457 GURL url("https://mail.example.com/");
4458 origin1_ = HostPortPair::FromURL(url);
4459
4460 // Not used for requests, but this provides a test case where the certificate
4461 // is valid for the hostname of the alternative service.
4462 origin2_ = HostPortPair("mail.example.org", 433);
4463
4464 HostPortPair destination = GetDestination();
4465
4466 scoped_refptr<X509Certificate> cert(
4467 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
4468 bool unused;
4469 ASSERT_FALSE(cert->VerifyNameMatch(origin1_.host(), &unused));
4470 ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host(), &unused));
4471
4472 ProofVerifyDetailsChromium verify_details;
4473 verify_details.cert_verify_result.verified_cert = cert;
4474 verify_details.cert_verify_result.is_issued_by_known_root = true;
4475 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4476
4477 AddHangingSocketData();
4478
4479 QuicStreamRequest request(factory_.get());
4480 EXPECT_EQ(ERR_IO_PENDING, request.Request(destination, privacy_mode_,
4481 /*cert_verify_flags=*/0, url, "GET",
4482 net_log_, callback_.callback()));
4483
robpercival214763f2016-07-01 23:27:014484 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_QUIC_HANDSHAKE_FAILED));
bnc359ed2a2016-04-29 20:43:454485
4486 EXPECT_TRUE(AllDataConsumed());
4487}
4488
4489// QuicStreamRequest is pooled based on |destination| if certificate matches.
4490TEST_P(QuicStreamFactoryWithDestinationTest, SharedCertificate) {
4491 Initialize();
4492
4493 GURL url1("https://www.example.org/");
4494 GURL url2("https://mail.example.org/");
4495 origin1_ = HostPortPair::FromURL(url1);
4496 origin2_ = HostPortPair::FromURL(url2);
4497
4498 HostPortPair destination = GetDestination();
4499
4500 scoped_refptr<X509Certificate> cert(
4501 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
4502 bool unused;
4503 ASSERT_TRUE(cert->VerifyNameMatch(origin1_.host(), &unused));
4504 ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host(), &unused));
4505 ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname, &unused));
4506
4507 ProofVerifyDetailsChromium verify_details;
4508 verify_details.cert_verify_result.verified_cert = cert;
4509 verify_details.cert_verify_result.is_issued_by_known_root = true;
4510 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4511
4512 AddHangingSocketData();
4513
4514 QuicStreamRequest request1(factory_.get());
4515 EXPECT_EQ(ERR_IO_PENDING,
4516 request1.Request(destination, privacy_mode_,
4517 /*cert_verify_flags=*/0, url1, "GET", net_log_,
4518 callback_.callback()));
robpercival214763f2016-07-01 23:27:014519 EXPECT_THAT(callback_.WaitForResult(), IsOk());
bnc359ed2a2016-04-29 20:43:454520 std::unique_ptr<QuicHttpStream> stream1 = request1.CreateStream();
4521 EXPECT_TRUE(stream1.get());
4522 EXPECT_TRUE(HasActiveSession(origin1_));
4523
4524 // Second request returns synchronously because it pools to existing session.
4525 TestCompletionCallback callback2;
4526 QuicStreamRequest request2(factory_.get());
4527 EXPECT_EQ(OK, request2.Request(destination, privacy_mode_,
4528 /*cert_verify_flags=*/0, url2, "GET", net_log_,
4529 callback2.callback()));
4530 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
4531 EXPECT_TRUE(stream2.get());
4532
4533 QuicChromiumClientSession* session1 =
4534 QuicHttpStreamPeer::GetSession(stream1.get());
4535 QuicChromiumClientSession* session2 =
4536 QuicHttpStreamPeer::GetSession(stream2.get());
4537 EXPECT_EQ(session1, session2);
4538
4539 EXPECT_EQ(QuicServerId(origin1_, privacy_mode_), session1->server_id());
4540
4541 EXPECT_TRUE(AllDataConsumed());
4542}
4543
bnc47eba7d2016-07-01 00:43:384544// QuicStreamRequest is not pooled if PrivacyMode differs.
4545TEST_P(QuicStreamFactoryWithDestinationTest, DifferentPrivacyMode) {
4546 Initialize();
4547
4548 GURL url1("https://www.example.org/");
4549 GURL url2("https://mail.example.org/");
4550 origin1_ = HostPortPair::FromURL(url1);
4551 origin2_ = HostPortPair::FromURL(url2);
4552
4553 HostPortPair destination = GetDestination();
4554
4555 scoped_refptr<X509Certificate> cert(
4556 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
4557 bool unused;
4558 ASSERT_TRUE(cert->VerifyNameMatch(origin1_.host(), &unused));
4559 ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host(), &unused));
4560 ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname, &unused));
4561
4562 ProofVerifyDetailsChromium verify_details1;
4563 verify_details1.cert_verify_result.verified_cert = cert;
4564 verify_details1.cert_verify_result.is_issued_by_known_root = true;
4565 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
4566
4567 ProofVerifyDetailsChromium verify_details2;
4568 verify_details2.cert_verify_result.verified_cert = cert;
4569 verify_details2.cert_verify_result.is_issued_by_known_root = true;
4570 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
4571
4572 AddHangingSocketData();
4573 AddHangingSocketData();
4574
4575 QuicStreamRequest request1(factory_.get());
4576 EXPECT_EQ(ERR_IO_PENDING,
4577 request1.Request(destination, PRIVACY_MODE_DISABLED,
4578 /*cert_verify_flags=*/0, url1, "GET", net_log_,
4579 callback_.callback()));
4580 EXPECT_EQ(OK, callback_.WaitForResult());
4581 std::unique_ptr<QuicHttpStream> stream1 = request1.CreateStream();
4582 EXPECT_TRUE(stream1.get());
4583 EXPECT_TRUE(HasActiveSession(origin1_));
4584
4585 TestCompletionCallback callback2;
4586 QuicStreamRequest request2(factory_.get());
4587 EXPECT_EQ(ERR_IO_PENDING,
4588 request2.Request(destination, PRIVACY_MODE_ENABLED,
4589 /*cert_verify_flags=*/0, url2, "GET", net_log_,
4590 callback2.callback()));
4591 EXPECT_EQ(OK, callback2.WaitForResult());
4592 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
4593 EXPECT_TRUE(stream2.get());
4594
4595 // |request2| does not pool to the first session, because PrivacyMode does not
4596 // match. Instead, another session is opened to the same destination, but
4597 // with a different QuicServerId.
4598 QuicChromiumClientSession* session1 =
4599 QuicHttpStreamPeer::GetSession(stream1.get());
4600 QuicChromiumClientSession* session2 =
4601 QuicHttpStreamPeer::GetSession(stream2.get());
4602 EXPECT_NE(session1, session2);
4603
4604 EXPECT_EQ(QuicServerId(origin1_, PRIVACY_MODE_DISABLED),
4605 session1->server_id());
4606 EXPECT_EQ(QuicServerId(origin2_, PRIVACY_MODE_ENABLED),
4607 session2->server_id());
4608
4609 EXPECT_TRUE(AllDataConsumed());
4610}
4611
bnc359ed2a2016-04-29 20:43:454612// QuicStreamRequest is not pooled if certificate does not match its origin.
4613TEST_P(QuicStreamFactoryWithDestinationTest, DisjointCertificate) {
4614 Initialize();
4615
4616 GURL url1("https://news.example.org/");
4617 GURL url2("https://mail.example.com/");
4618 origin1_ = HostPortPair::FromURL(url1);
4619 origin2_ = HostPortPair::FromURL(url2);
4620
4621 HostPortPair destination = GetDestination();
4622
4623 scoped_refptr<X509Certificate> cert1(
4624 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
4625 bool unused;
4626 ASSERT_TRUE(cert1->VerifyNameMatch(origin1_.host(), &unused));
4627 ASSERT_FALSE(cert1->VerifyNameMatch(origin2_.host(), &unused));
4628 ASSERT_FALSE(cert1->VerifyNameMatch(kDifferentHostname, &unused));
4629
4630 ProofVerifyDetailsChromium verify_details1;
4631 verify_details1.cert_verify_result.verified_cert = cert1;
4632 verify_details1.cert_verify_result.is_issued_by_known_root = true;
4633 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
4634
4635 scoped_refptr<X509Certificate> cert2(
4636 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
4637 ASSERT_TRUE(cert2->VerifyNameMatch(origin2_.host(), &unused));
4638 ASSERT_FALSE(cert2->VerifyNameMatch(kDifferentHostname, &unused));
4639
4640 ProofVerifyDetailsChromium verify_details2;
4641 verify_details2.cert_verify_result.verified_cert = cert2;
4642 verify_details2.cert_verify_result.is_issued_by_known_root = true;
4643 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
4644
4645 AddHangingSocketData();
4646 AddHangingSocketData();
4647
4648 QuicStreamRequest request1(factory_.get());
4649 EXPECT_EQ(ERR_IO_PENDING,
4650 request1.Request(destination, privacy_mode_,
4651 /*cert_verify_flags=*/0, url1, "GET", net_log_,
4652 callback_.callback()));
robpercival214763f2016-07-01 23:27:014653 EXPECT_THAT(callback_.WaitForResult(), IsOk());
bnc359ed2a2016-04-29 20:43:454654 std::unique_ptr<QuicHttpStream> stream1 = request1.CreateStream();
4655 EXPECT_TRUE(stream1.get());
4656 EXPECT_TRUE(HasActiveSession(origin1_));
4657
4658 TestCompletionCallback callback2;
4659 QuicStreamRequest request2(factory_.get());
4660 EXPECT_EQ(ERR_IO_PENDING,
4661 request2.Request(destination, privacy_mode_,
4662 /*cert_verify_flags=*/0, url2, "GET", net_log_,
4663 callback2.callback()));
robpercival214763f2016-07-01 23:27:014664 EXPECT_THAT(callback2.WaitForResult(), IsOk());
bnc359ed2a2016-04-29 20:43:454665 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
4666 EXPECT_TRUE(stream2.get());
4667
4668 // |request2| does not pool to the first session, because the certificate does
4669 // not match. Instead, another session is opened to the same destination, but
4670 // with a different QuicServerId.
4671 QuicChromiumClientSession* session1 =
4672 QuicHttpStreamPeer::GetSession(stream1.get());
4673 QuicChromiumClientSession* session2 =
4674 QuicHttpStreamPeer::GetSession(stream2.get());
4675 EXPECT_NE(session1, session2);
4676
4677 EXPECT_EQ(QuicServerId(origin1_, privacy_mode_), session1->server_id());
4678 EXPECT_EQ(QuicServerId(origin2_, privacy_mode_), session2->server_id());
4679
4680 EXPECT_TRUE(AllDataConsumed());
4681}
4682
[email protected]e13201d82012-12-12 05:00:324683} // namespace test
[email protected]e13201d82012-12-12 05:00:324684} // namespace net