blob: 33462c9453d4aea280366a2b483d9f0509ff665a [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>
8
[email protected]e13201d82012-12-12 05:00:329#include "base/run_loop.h"
[email protected]fc9be5802013-06-11 10:56:5110#include "base/strings/string_util.h"
skyostil4891b25b2015-06-11 11:43:4511#include "base/thread_task_runner_handle.h"
[email protected]eed749f92013-12-23 18:57:3812#include "net/base/test_data_directory.h"
[email protected]6d1b4ed2013-07-10 03:57:5413#include "net/cert/cert_verifier.h"
rtenneti052774e2015-11-24 21:00:1214#include "net/cert/multi_log_ct_verifier.h"
[email protected]f2cb3cf2013-03-21 01:40:5315#include "net/dns/mock_host_resolver.h"
[email protected]e13201d82012-12-12 05:00:3216#include "net/http/http_response_headers.h"
17#include "net/http/http_response_info.h"
rtenneti8332ba52015-09-17 19:33:4118#include "net/http/http_server_properties_impl.h"
[email protected]e13201d82012-12-12 05:00:3219#include "net/http/http_util.h"
[email protected]080b77932014-08-04 01:22:4620#include "net/http/transport_security_state.h"
[email protected]c49ff182013-09-28 08:33:2621#include "net/quic/crypto/crypto_handshake.h"
[email protected]b694e48c2014-03-18 17:10:1322#include "net/quic/crypto/proof_verifier_chromium.h"
rtenneticd2aaa15b2015-10-10 20:29:3323#include "net/quic/crypto/properties_based_quic_server_info.h"
24#include "net/quic/crypto/quic_crypto_client_config.h"
[email protected]4df69842013-02-27 06:32:1625#include "net/quic/crypto/quic_decrypter.h"
26#include "net/quic/crypto/quic_encrypter.h"
rtenneti38f5cd52014-10-28 20:28:2827#include "net/quic/crypto/quic_server_info.h"
ckrasic3865ee0f2016-02-29 22:04:5628#include "net/quic/quic_client_promised_info.h"
[email protected]e13201d82012-12-12 05:00:3229#include "net/quic/quic_http_stream.h"
jri7e636642016-01-14 06:57:0830#include "net/quic/quic_http_utils.h"
[email protected]257f24f2014-04-01 09:15:3731#include "net/quic/quic_server_id.h"
[email protected]e13201d82012-12-12 05:00:3232#include "net/quic/test_tools/mock_clock.h"
[email protected]e8ff26842013-03-22 21:02:0533#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
[email protected]9558c5d32012-12-22 00:08:1434#include "net/quic/test_tools/mock_random.h"
jri9c541572016-03-29 17:51:4835#include "net/quic/test_tools/quic_config_peer.h"
rtennetid2e74caa2015-12-09 00:51:5736#include "net/quic/test_tools/quic_stream_factory_peer.h"
[email protected]1e960032013-12-20 19:00:2037#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]e13201d82012-12-12 05:00:3238#include "net/quic/test_tools/quic_test_utils.h"
rtenneti38f5cd52014-10-28 20:28:2839#include "net/quic/test_tools/test_task_runner.h"
[email protected]e13201d82012-12-12 05:00:3240#include "net/socket/socket_test_util.h"
rtenneti1cd3b162015-09-29 02:58:2841#include "net/spdy/spdy_session_test_util.h"
[email protected]5db452202014-08-19 05:22:1542#include "net/spdy/spdy_test_utils.h"
[email protected]6b8a3c742014-07-25 00:25:3543#include "net/ssl/channel_id_service.h"
44#include "net/ssl/default_channel_id_store.h"
[email protected]eed749f92013-12-23 18:57:3845#include "net/test/cert_test_util.h"
[email protected]e13201d82012-12-12 05:00:3246#include "testing/gtest/include/gtest/gtest.h"
47
[email protected]6e12d702013-11-13 00:17:1748using base::StringPiece;
49using std::string;
50using std::vector;
51
[email protected]e13201d82012-12-12 05:00:3252namespace net {
jri7e636642016-01-14 06:57:0853
[email protected]e13201d82012-12-12 05:00:3254namespace test {
55
[email protected]3c772402013-12-18 21:38:1156namespace {
bnc359ed2a2016-04-29 20:43:4557
58enum DestinationType {
59 // In pooling tests with two requests for different origins to the same
60 // destination, the destination should be
61 SAME_AS_FIRST, // the same as the first origin,
62 SAME_AS_SECOND, // the same as the second origin, or
63 DIFFERENT, // different from both.
64};
65
rch6faa4d42016-01-05 20:48:4366const char kDefaultServerHostName[] = "www.example.org";
67const char kServer2HostName[] = "mail.example.org";
68const char kServer3HostName[] = "docs.example.org";
69const char kServer4HostName[] = "images.example.org";
bnc359ed2a2016-04-29 20:43:4570const char kDifferentHostname[] = "different.example.com";
[email protected]3c772402013-12-18 21:38:1171const int kDefaultServerPort = 443;
ckrasic3865ee0f2016-02-29 22:04:5672const char kDefaultUrl[] = "https://www.example.org/";
73const char kServer2Url[] = "https://mail.example.org/";
74const char kServer3Url[] = "https://docs.example.org/";
75const char kServer4Url[] = "https://images.example.org/";
rtenneti14abd312015-02-06 21:56:0176
bnc359ed2a2016-04-29 20:43:4577// Run QuicStreamFactoryTest instances with all value combinations of version
78// and enable_connection_racting.
rtenneti14abd312015-02-06 21:56:0179struct TestParams {
bnc359ed2a2016-04-29 20:43:4580 friend std::ostream& operator<<(std::ostream& os, const TestParams& p) {
81 os << "{ version: " << QuicVersionToString(p.version)
82 << ", enable_connection_racing: "
83 << (p.enable_connection_racing ? "true" : "false") << " }";
rtenneti14abd312015-02-06 21:56:0184 return os;
85 }
86
87 QuicVersion version;
88 bool enable_connection_racing;
89};
90
bnc359ed2a2016-04-29 20:43:4591std::vector<TestParams> GetTestParams() {
92 std::vector<TestParams> params;
rtenneti14abd312015-02-06 21:56:0193 QuicVersionVector all_supported_versions = QuicSupportedVersions();
94 for (const QuicVersion version : all_supported_versions) {
bnc359ed2a2016-04-29 20:43:4595 params.push_back(TestParams{version, false});
96 params.push_back(TestParams{version, true});
97 }
98 return params;
99}
100
101// Run QuicStreamFactoryWithDestinationTest instances with all value
102// combinations of version, enable_connection_racting, and destination_type.
103struct PoolingTestParams {
104 friend std::ostream& operator<<(std::ostream& os,
105 const PoolingTestParams& p) {
106 os << "{ version: " << QuicVersionToString(p.version)
107 << ", enable_connection_racing: "
108 << (p.enable_connection_racing ? "true" : "false")
109 << ", destination_type: ";
110 switch (p.destination_type) {
111 case SAME_AS_FIRST:
112 os << "SAME_AS_FIRST";
113 break;
114 case SAME_AS_SECOND:
115 os << "SAME_AS_SECOND";
116 break;
117 case DIFFERENT:
118 os << "DIFFERENT";
119 break;
120 }
121 os << " }";
122 return os;
123 }
124
125 QuicVersion version;
126 bool enable_connection_racing;
127 DestinationType destination_type;
128};
129
130std::vector<PoolingTestParams> GetPoolingTestParams() {
131 std::vector<PoolingTestParams> params;
132 QuicVersionVector all_supported_versions = QuicSupportedVersions();
133 for (const QuicVersion version : all_supported_versions) {
134 params.push_back(PoolingTestParams{version, false, SAME_AS_FIRST});
135 params.push_back(PoolingTestParams{version, false, SAME_AS_SECOND});
136 params.push_back(PoolingTestParams{version, false, DIFFERENT});
137 params.push_back(PoolingTestParams{version, true, SAME_AS_FIRST});
138 params.push_back(PoolingTestParams{version, true, SAME_AS_SECOND});
139 params.push_back(PoolingTestParams{version, true, DIFFERENT});
rtenneti14abd312015-02-06 21:56:01140 }
141 return params;
142}
143
bnc912a04b2016-04-20 14:19:50144} // namespace
[email protected]3c772402013-12-18 21:38:11145
bnc359ed2a2016-04-29 20:43:45146class QuicHttpStreamPeer {
147 public:
148 static QuicChromiumClientSession* GetSession(QuicHttpStream* stream) {
149 return stream->session_.get();
150 }
151};
152
rtenneti38f5cd52014-10-28 20:28:28153class MockQuicServerInfo : public QuicServerInfo {
154 public:
bnc912a04b2016-04-20 14:19:50155 explicit MockQuicServerInfo(const QuicServerId& server_id)
rtenneti38f5cd52014-10-28 20:28:28156 : QuicServerInfo(server_id) {}
dcheng2339883c2014-12-23 00:23:05157 ~MockQuicServerInfo() override {}
rtenneti38f5cd52014-10-28 20:28:28158
dcheng2339883c2014-12-23 00:23:05159 void Start() override {}
rtenneti38f5cd52014-10-28 20:28:28160
dcheng2339883c2014-12-23 00:23:05161 int WaitForDataReady(const CompletionCallback& callback) override {
rtenneti38f5cd52014-10-28 20:28:28162 return ERR_IO_PENDING;
163 }
164
rtenneti170f36a2015-02-10 19:13:45165 void ResetWaitForDataReadyCallback() override {}
166
dcheng2339883c2014-12-23 00:23:05167 void CancelWaitForDataReadyCallback() override {}
rtenneti38f5cd52014-10-28 20:28:28168
dcheng2339883c2014-12-23 00:23:05169 bool IsDataReady() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28170
dcheng2339883c2014-12-23 00:23:05171 bool IsReadyToPersist() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28172
dcheng2339883c2014-12-23 00:23:05173 void Persist() override {}
rtennetif0b832b2014-11-07 02:32:30174
dcheng2339883c2014-12-23 00:23:05175 void OnExternalCacheHit() override {}
rtenneti38f5cd52014-10-28 20:28:28176};
177
178class MockQuicServerInfoFactory : public QuicServerInfoFactory {
179 public:
180 MockQuicServerInfoFactory() {}
dcheng2339883c2014-12-23 00:23:05181 ~MockQuicServerInfoFactory() override {}
rtenneti38f5cd52014-10-28 20:28:28182
dcheng2339883c2014-12-23 00:23:05183 QuicServerInfo* GetForServer(const QuicServerId& server_id) override {
rtenneti38f5cd52014-10-28 20:28:28184 return new MockQuicServerInfo(server_id);
185 }
186};
187
jri7e636642016-01-14 06:57:08188class MockNetworkChangeNotifier : public NetworkChangeNotifier {
189 public:
190 MockNetworkChangeNotifier() : force_network_handles_supported_(false) {}
191
192 ConnectionType GetCurrentConnectionType() const override {
193 return CONNECTION_UNKNOWN;
194 }
195
196 void ForceNetworkHandlesSupported() {
197 force_network_handles_supported_ = true;
198 }
199
200 bool AreNetworkHandlesCurrentlySupported() const override {
201 return force_network_handles_supported_;
202 }
203
204 void SetConnectedNetworksList(const NetworkList& network_list) {
205 connected_networks_ = network_list;
206 }
207
208 void GetCurrentConnectedNetworks(NetworkList* network_list) const override {
209 network_list->clear();
210 *network_list = connected_networks_;
211 }
212
213 void NotifyNetworkSoonToDisconnect(
214 NetworkChangeNotifier::NetworkHandle network) {
215 NetworkChangeNotifier::NotifyObserversOfSpecificNetworkChange(
216 NetworkChangeNotifier::SOON_TO_DISCONNECT, network);
217 // Spin the message loop so the notification is delivered.
218 base::MessageLoop::current()->RunUntilIdle();
219 }
220
221 void NotifyNetworkDisconnected(NetworkChangeNotifier::NetworkHandle network) {
222 NetworkChangeNotifier::NotifyObserversOfSpecificNetworkChange(
223 NetworkChangeNotifier::DISCONNECTED, network);
224 // Spin the message loop so the notification is delivered.
225 base::MessageLoop::current()->RunUntilIdle();
226 }
227
228 private:
229 bool force_network_handles_supported_;
230 NetworkChangeNotifier::NetworkList connected_networks_;
231};
232
233// Class to replace existing NetworkChangeNotifier singleton with a
234// MockNetworkChangeNotifier for a test. To use, simply create a
235// ScopedMockNetworkChangeNotifier object in the test.
236class ScopedMockNetworkChangeNotifier {
237 public:
238 ScopedMockNetworkChangeNotifier()
239 : disable_network_change_notifier_for_tests_(
240 new NetworkChangeNotifier::DisableForTest()),
241 mock_network_change_notifier_(new MockNetworkChangeNotifier()) {}
242
243 MockNetworkChangeNotifier* mock_network_change_notifier() {
244 return mock_network_change_notifier_.get();
245 }
246
247 private:
danakjad1777e2016-04-16 00:56:42248 std::unique_ptr<NetworkChangeNotifier::DisableForTest>
jri7e636642016-01-14 06:57:08249 disable_network_change_notifier_for_tests_;
danakjad1777e2016-04-16 00:56:42250 std::unique_ptr<MockNetworkChangeNotifier> mock_network_change_notifier_;
jri7e636642016-01-14 06:57:08251};
252
bnc359ed2a2016-04-29 20:43:45253class QuicStreamFactoryTestBase {
[email protected]e13201d82012-12-12 05:00:32254 protected:
bnc359ed2a2016-04-29 20:43:45255 QuicStreamFactoryTestBase(QuicVersion version, bool enable_connection_racing)
[email protected]457d6952013-12-13 09:24:58256 : random_generator_(0),
257 clock_(new MockClock()),
rtenneti38f5cd52014-10-28 20:28:28258 runner_(new TestTaskRunner(clock_)),
bnc359ed2a2016-04-29 20:43:45259 version_(version),
alyssar2adf3ac2016-05-03 17:12:58260 client_maker_(version_,
261 0,
262 clock_,
263 kDefaultServerHostName,
264 Perspective::IS_CLIENT),
265 server_maker_(version_,
266 0,
267 clock_,
268 kDefaultServerHostName,
269 Perspective::IS_SERVER),
[email protected]59c0bbd2014-03-22 04:08:12270 cert_verifier_(CertVerifier::CreateDefault()),
jri2b966f22014-09-02 22:25:36271 channel_id_service_(
rtennetibe635732014-10-02 22:51:42272 new ChannelIDService(new DefaultChannelIDStore(nullptr),
skyostil4891b25b2015-06-11 11:43:45273 base::ThreadTaskRunnerHandle::Get())),
rtenneti052774e2015-11-24 21:00:12274 cert_transparency_verifier_(new MultiLogCTVerifier()),
jri7e636642016-01-14 06:57:08275 scoped_mock_network_change_notifier_(nullptr),
jri7046038f2015-10-22 00:29:26276 factory_(nullptr),
[email protected]bf4ea2f2014-03-10 22:57:53277 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
ckrasic3865ee0f2016-02-29 22:04:56278 url_(kDefaultUrl),
279 url2_(kServer2Url),
280 url3_(kServer3Url),
281 url4_(kServer4Url),
jri7046038f2015-10-22 00:29:26282 privacy_mode_(PRIVACY_MODE_DISABLED),
283 enable_port_selection_(true),
284 always_require_handshake_confirmation_(false),
285 disable_connection_pooling_(false),
286 load_server_info_timeout_srtt_multiplier_(0.0f),
bnc359ed2a2016-04-29 20:43:45287 enable_connection_racing_(enable_connection_racing),
jri7046038f2015-10-22 00:29:26288 enable_non_blocking_io_(true),
289 disable_disk_cache_(false),
290 prefer_aes_(false),
291 max_number_of_lossy_connections_(0),
292 packet_loss_threshold_(1.0f),
293 max_disabled_reasons_(3),
294 threshold_timeouts_with_open_streams_(2),
295 threshold_public_resets_post_handshake_(2),
296 receive_buffer_size_(0),
rtenneti41c09992015-11-30 18:24:01297 close_sessions_on_ip_change_(false),
zhongyi89649c32016-01-22 00:14:01298 disable_quic_on_timeout_with_open_streams_(false),
jri7e636642016-01-14 06:57:08299 idle_connection_timeout_seconds_(kIdleConnectionTimeoutSeconds),
jrid36ada62016-02-06 02:42:08300 migrate_sessions_on_network_change_(false),
301 migrate_sessions_early_(false) {
[email protected]ca4e0d92014-08-22 16:33:22302 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
jri7046038f2015-10-22 00:29:26303 }
304
bnc359ed2a2016-04-29 20:43:45305 ~QuicStreamFactoryTestBase() {
306 // If |factory_| was initialized, then it took over ownership of |clock_|.
307 // If |factory_| was not initialized, then |clock_| needs to be destroyed.
308 if (!factory_) {
309 delete clock_;
310 }
311 }
312
jri7046038f2015-10-22 00:29:26313 void Initialize() {
bnc359ed2a2016-04-29 20:43:45314 DCHECK(!factory_);
jri7046038f2015-10-22 00:29:26315 factory_.reset(new QuicStreamFactory(
316 &host_resolver_, &socket_factory_, http_server_properties_.GetWeakPtr(),
317 cert_verifier_.get(), nullptr, channel_id_service_.get(),
rtenneti052774e2015-11-24 21:00:12318 &transport_security_state_, cert_transparency_verifier_.get(),
jri7046038f2015-10-22 00:29:26319 /*SocketPerformanceWatcherFactory*/ nullptr,
320 &crypto_client_stream_factory_, &random_generator_, clock_,
bnc359ed2a2016-04-29 20:43:45321 kDefaultMaxPacketSize, std::string(), SupportedVersions(version_),
322 enable_port_selection_, always_require_handshake_confirmation_,
323 disable_connection_pooling_, load_server_info_timeout_srtt_multiplier_,
324 enable_connection_racing_, enable_non_blocking_io_, disable_disk_cache_,
325 prefer_aes_, max_number_of_lossy_connections_, packet_loss_threshold_,
jri7046038f2015-10-22 00:29:26326 max_disabled_reasons_, threshold_timeouts_with_open_streams_,
327 threshold_public_resets_post_handshake_, receive_buffer_size_,
rtenneti634050c2016-04-28 20:41:54328 /*max_server_configs_stored_in_properties*/ 0,
zhongyi89649c32016-01-22 00:14:01329 close_sessions_on_ip_change_,
330 disable_quic_on_timeout_with_open_streams_,
331 idle_connection_timeout_seconds_, migrate_sessions_on_network_change_,
nharperd5cddca2016-02-27 03:37:52332 migrate_sessions_early_, QuicTagVector(),
333 /*enable_token_binding*/ false));
jri7046038f2015-10-22 00:29:26334 factory_->set_require_confirmation(false);
rtenneti6971c172016-01-15 20:12:10335 EXPECT_FALSE(factory_->has_quic_server_info_factory());
jri7046038f2015-10-22 00:29:26336 factory_->set_quic_server_info_factory(new MockQuicServerInfoFactory());
rtenneti6971c172016-01-15 20:12:10337 EXPECT_TRUE(factory_->has_quic_server_info_factory());
[email protected]e13201d82012-12-12 05:00:32338 }
339
jri7e636642016-01-14 06:57:08340 void InitializeConnectionMigrationTest(
341 NetworkChangeNotifier::NetworkList connected_networks) {
342 scoped_mock_network_change_notifier_.reset(
343 new ScopedMockNetworkChangeNotifier());
344 MockNetworkChangeNotifier* mock_ncn =
345 scoped_mock_network_change_notifier_->mock_network_change_notifier();
346 mock_ncn->ForceNetworkHandlesSupported();
347 mock_ncn->SetConnectedNetworksList(connected_networks);
348 migrate_sessions_on_network_change_ = true;
jrid36ada62016-02-06 02:42:08349 migrate_sessions_early_ = true;
jri7e636642016-01-14 06:57:08350 Initialize();
351 }
352
bnccb7ff3c2015-05-21 20:51:55353 bool HasActiveSession(const HostPortPair& host_port_pair) {
jri7046038f2015-10-22 00:29:26354 return QuicStreamFactoryPeer::HasActiveSession(factory_.get(),
355 host_port_pair);
bnccb7ff3c2015-05-21 20:51:55356 }
357
bnc912a04b2016-04-20 14:19:50358 QuicChromiumClientSession* GetActiveSession(
359 const HostPortPair& host_port_pair) {
360 return QuicStreamFactoryPeer::GetActiveSession(factory_.get(),
361 host_port_pair);
362 }
363
danakjad1777e2016-04-16 00:56:42364 std::unique_ptr<QuicHttpStream> CreateFromSession(
bnccb7ff3c2015-05-21 20:51:55365 const HostPortPair& host_port_pair) {
bnc912a04b2016-04-20 14:19:50366 QuicChromiumClientSession* session = GetActiveSession(host_port_pair);
jri7046038f2015-10-22 00:29:26367 return QuicStreamFactoryPeer::CreateFromSession(factory_.get(), session);
[email protected]df157d9d2014-03-10 07:27:27368 }
[email protected]e13201d82012-12-12 05:00:32369
[email protected]bf4ea2f2014-03-10 22:57:53370 int GetSourcePortForNewSession(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10371 return GetSourcePortForNewSessionInner(destination, false);
372 }
373
rjshaded5ced072015-12-18 19:26:02374 int GetSourcePortForNewSessionAndGoAway(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10375 return GetSourcePortForNewSessionInner(destination, true);
376 }
377
[email protected]bf4ea2f2014-03-10 22:57:53378 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
[email protected]d8e2abf82014-03-06 10:30:10379 bool goaway_received) {
[email protected]3c772402013-12-18 21:38:11380 // Should only be called if there is no active session for this destination.
bnccb7ff3c2015-05-21 20:51:55381 EXPECT_FALSE(HasActiveSession(destination));
mmenke651bae7f2015-12-18 21:26:45382 size_t socket_count = socket_factory_.udp_client_socket_ports().size();
[email protected]3c772402013-12-18 21:38:11383
mmenke651bae7f2015-12-18 21:26:45384 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
385 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]3c772402013-12-18 21:38:11386 socket_factory_.AddSocketDataProvider(&socket_data);
387
jri7046038f2015-10-22 00:29:26388 QuicStreamRequest request(factory_.get());
ckrasic3865ee0f2016-02-29 22:04:56389 GURL url("https://" + destination.host() + "/");
[email protected]974849d2014-02-06 01:32:59390 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56391 request.Request(destination, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56392 /*cert_verify_flags=*/0, url, "GET", net_log_,
393 callback_.callback()));
[email protected]3c772402013-12-18 21:38:11394
395 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:42396 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]3c772402013-12-18 21:38:11397 EXPECT_TRUE(stream.get());
398 stream.reset();
399
bnc912a04b2016-04-20 14:19:50400 QuicChromiumClientSession* session = GetActiveSession(destination);
[email protected]3c772402013-12-18 21:38:11401
mmenke651bae7f2015-12-18 21:26:45402 if (socket_count + 1 != socket_factory_.udp_client_socket_ports().size()) {
403 ADD_FAILURE();
[email protected]3c772402013-12-18 21:38:11404 return 0;
405 }
406
[email protected]d8e2abf82014-03-06 10:30:10407 if (goaway_received) {
408 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, "");
rtenneti9bd5d4b2015-08-21 05:44:52409 session->connection()->OnGoAwayFrame(goaway);
[email protected]d8e2abf82014-03-06 10:30:10410 }
[email protected]3c772402013-12-18 21:38:11411
jri7046038f2015-10-22 00:29:26412 factory_->OnSessionClosed(session);
bnccb7ff3c2015-05-21 20:51:55413 EXPECT_FALSE(HasActiveSession(destination));
rch37de576c2015-05-17 20:28:17414 EXPECT_TRUE(socket_data.AllReadDataConsumed());
415 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:45416 return socket_factory_.udp_client_socket_ports()[socket_count];
[email protected]3c772402013-12-18 21:38:11417 }
418
alyssar2adf3ac2016-05-03 17:12:58419 std::unique_ptr<QuicEncryptedPacket> ConstructClientConnectionClosePacket(
rtenneti1cd3b162015-09-29 02:58:28420 QuicPacketNumber num) {
alyssar2adf3ac2016-05-03 17:12:58421 return client_maker_.MakeConnectionClosePacket(num);
rtenneti1cd3b162015-09-29 02:58:28422 }
423
alyssar2adf3ac2016-05-03 17:12:58424 std::unique_ptr<QuicEncryptedPacket> ConstructClientRstPacket() {
[email protected]66ae5962014-05-22 11:13:05425 QuicStreamId stream_id = kClientDataStreamId1;
alyssar2adf3ac2016-05-03 17:12:58426 return client_maker_.MakeRstPacket(
[email protected]51cc1342014-04-18 23:44:37427 1, true, stream_id,
bnc359ed2a2016-04-29 20:43:45428 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, version_));
[email protected]459a7402014-02-10 12:58:52429 }
430
bncf8bf0722015-05-19 20:04:13431 static ProofVerifyDetailsChromium DefaultProofVerifyDetails() {
rch6faa4d42016-01-05 20:48:43432 // Load a certificate that is valid for *.example.org
bncf8bf0722015-05-19 20:04:13433 scoped_refptr<X509Certificate> test_cert(
rch6faa4d42016-01-05 20:48:43434 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bncf8bf0722015-05-19 20:04:13435 EXPECT_TRUE(test_cert.get());
436 ProofVerifyDetailsChromium verify_details;
437 verify_details.cert_verify_result.verified_cert = test_cert;
438 verify_details.cert_verify_result.is_issued_by_known_root = true;
439 return verify_details;
440 }
441
jri8c44d692015-10-23 23:53:41442 void NotifyIPAddressChanged() {
443 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
jri7e636642016-01-14 06:57:08444 // Spin the message loop so the notification is delivered.
jri8c44d692015-10-23 23:53:41445 base::MessageLoop::current()->RunUntilIdle();
446 }
447
danakjad1777e2016-04-16 00:56:42448 std::unique_ptr<QuicEncryptedPacket> ConstructGetRequestPacket(
jri7e636642016-01-14 06:57:08449 QuicPacketNumber packet_number,
450 QuicStreamId stream_id,
451 bool should_include_version,
452 bool fin) {
alyssar2adf3ac2016-05-03 17:12:58453 SpdyHeaderBlock headers =
454 client_maker_.GetRequestHeaders("GET", "https", "/");
jri7e636642016-01-14 06:57:08455 SpdyPriority priority =
456 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
457 size_t spdy_headers_frame_len;
alyssar2adf3ac2016-05-03 17:12:58458 return client_maker_.MakeRequestHeadersPacket(
jri7e636642016-01-14 06:57:08459 packet_number, stream_id, should_include_version, fin, priority,
460 headers, &spdy_headers_frame_len);
461 }
462
danakjad1777e2016-04-16 00:56:42463 std::unique_ptr<QuicEncryptedPacket> ConstructOkResponsePacket(
jri7e636642016-01-14 06:57:08464 QuicPacketNumber packet_number,
465 QuicStreamId stream_id,
466 bool should_include_version,
467 bool fin) {
alyssar2adf3ac2016-05-03 17:12:58468 SpdyHeaderBlock headers = server_maker_.GetResponseHeaders("200 OK");
jri7e636642016-01-14 06:57:08469 size_t spdy_headers_frame_len;
alyssar2adf3ac2016-05-03 17:12:58470 return server_maker_.MakeResponseHeadersPacket(
471 packet_number, stream_id, should_include_version, fin, headers,
472 &spdy_headers_frame_len);
jri7e636642016-01-14 06:57:08473 }
474
[email protected]e13201d82012-12-12 05:00:32475 MockHostResolver host_resolver_;
mmenke651bae7f2015-12-18 21:26:45476 MockClientSocketFactory socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05477 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]9558c5d32012-12-22 00:08:14478 MockRandom random_generator_;
bnc359ed2a2016-04-29 20:43:45479 MockClock* clock_; // Owned by |factory_| once created.
rtenneti38f5cd52014-10-28 20:28:28480 scoped_refptr<TestTaskRunner> runner_;
bnc359ed2a2016-04-29 20:43:45481 QuicVersion version_;
alyssar2adf3ac2016-05-03 17:12:58482 QuicTestPacketMaker client_maker_;
483 QuicTestPacketMaker server_maker_;
rtenneticcab42b2015-10-09 06:38:16484 HttpServerPropertiesImpl http_server_properties_;
danakjad1777e2016-04-16 00:56:42485 std::unique_ptr<CertVerifier> cert_verifier_;
486 std::unique_ptr<ChannelIDService> channel_id_service_;
[email protected]080b77932014-08-04 01:22:46487 TransportSecurityState transport_security_state_;
danakjad1777e2016-04-16 00:56:42488 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
489 std::unique_ptr<ScopedMockNetworkChangeNotifier>
jri7e636642016-01-14 06:57:08490 scoped_mock_network_change_notifier_;
danakjad1777e2016-04-16 00:56:42491 std::unique_ptr<QuicStreamFactory> factory_;
[email protected]bf4ea2f2014-03-10 22:57:53492 HostPortPair host_port_pair_;
ckrasic3865ee0f2016-02-29 22:04:56493 GURL url_;
494 GURL url2_;
495 GURL url3_;
496 GURL url4_;
497
[email protected]9dd3ff0f2014-03-26 09:51:28498 PrivacyMode privacy_mode_;
[email protected]e13201d82012-12-12 05:00:32499 BoundNetLog net_log_;
500 TestCompletionCallback callback_;
jri7046038f2015-10-22 00:29:26501
502 // Variables to configure QuicStreamFactory.
503 bool enable_port_selection_;
504 bool always_require_handshake_confirmation_;
505 bool disable_connection_pooling_;
506 double load_server_info_timeout_srtt_multiplier_;
507 bool enable_connection_racing_;
508 bool enable_non_blocking_io_;
509 bool disable_disk_cache_;
510 bool prefer_aes_;
511 int max_number_of_lossy_connections_;
512 double packet_loss_threshold_;
513 int max_disabled_reasons_;
514 int threshold_timeouts_with_open_streams_;
515 int threshold_public_resets_post_handshake_;
516 int receive_buffer_size_;
jri8c44d692015-10-23 23:53:41517 bool close_sessions_on_ip_change_;
zhongyi89649c32016-01-22 00:14:01518 bool disable_quic_on_timeout_with_open_streams_;
rtenneti41c09992015-11-30 18:24:01519 int idle_connection_timeout_seconds_;
jri7e636642016-01-14 06:57:08520 bool migrate_sessions_on_network_change_;
jrid36ada62016-02-06 02:42:08521 bool migrate_sessions_early_;
[email protected]e13201d82012-12-12 05:00:32522};
523
bnc359ed2a2016-04-29 20:43:45524class QuicStreamFactoryTest : public QuicStreamFactoryTestBase,
525 public ::testing::TestWithParam<TestParams> {
526 protected:
527 QuicStreamFactoryTest()
528 : QuicStreamFactoryTestBase(GetParam().version,
529 GetParam().enable_connection_racing) {}
530};
531
rtenneti14abd312015-02-06 21:56:01532INSTANTIATE_TEST_CASE_P(Version,
533 QuicStreamFactoryTest,
534 ::testing::ValuesIn(GetTestParams()));
[email protected]1e960032013-12-20 19:00:20535
[email protected]1e960032013-12-20 19:00:20536TEST_P(QuicStreamFactoryTest, Create) {
jri7046038f2015-10-22 00:29:26537 Initialize();
rch6faa4d42016-01-05 20:48:43538 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
539 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26540
mmenke651bae7f2015-12-18 21:26:45541 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
542 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:32543 socket_factory_.AddSocketDataProvider(&socket_data);
544
jri7046038f2015-10-22 00:29:26545 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:59546 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56547 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56548 /*cert_verify_flags=*/0, url_, "GET", net_log_,
549 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32550
551 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:42552 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]0edce6a2013-05-08 18:02:40553 EXPECT_TRUE(stream.get());
[email protected]e13201d82012-12-12 05:00:32554
555 // Will reset stream 3.
bnccb7ff3c2015-05-21 20:51:55556 stream = CreateFromSession(host_port_pair_);
[email protected]e13201d82012-12-12 05:00:32557 EXPECT_TRUE(stream.get());
558
[email protected]6d1b4ed2013-07-10 03:57:54559 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
560 // in streams on different sessions.
jri7046038f2015-10-22 00:29:26561 QuicStreamRequest request2(factory_.get());
ckrasic3865ee0f2016-02-29 22:04:56562 EXPECT_EQ(OK, request2.Request(host_port_pair_, privacy_mode_,
563 /*cert_verify_flags=*/0, url_, "GET", net_log_,
564 callback_.callback()));
xunjieli2608f9b2016-03-14 13:39:23565 stream = request2.CreateStream(); // Will reset stream 5.
rjshaded5ced072015-12-18 19:26:02566 stream.reset(); // Will reset stream 7.
[email protected]e13201d82012-12-12 05:00:32567
rch37de576c2015-05-17 20:28:17568 EXPECT_TRUE(socket_data.AllReadDataConsumed());
569 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:32570}
571
[email protected]8bd2b812014-03-26 04:01:17572TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
jri7046038f2015-10-22 00:29:26573 Initialize();
rch6faa4d42016-01-05 20:48:43574 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
575 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26576
mmenke651bae7f2015-12-18 21:26:45577 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
578 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17579 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]8bd2b812014-03-26 04:01:17580
581 crypto_client_stream_factory_.set_handshake_mode(
582 MockCryptoClientStream::ZERO_RTT);
583 host_resolver_.set_synchronous_mode(true);
584 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
585 "192.168.0.1", "");
586
jri7046038f2015-10-22 00:29:26587 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56588 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56589 /*cert_verify_flags=*/0, url_, "GET", net_log_,
590 callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17591
danakjad1777e2016-04-16 00:56:42592 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]8bd2b812014-03-26 04:01:17593 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17594 EXPECT_TRUE(socket_data.AllReadDataConsumed());
595 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17596}
597
598TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
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());
[email protected]8bd2b812014-03-26 04:01:17614 // Posts require handshake confirmation, so this will return asynchronously.
615 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56616 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56617 /*cert_verify_flags=*/0, url_, "POST", net_log_,
618 callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17619
620 // Confirm the handshake and verify that the stream is created.
621 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
622 QuicSession::HANDSHAKE_CONFIRMED);
623
624 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:42625 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]8bd2b812014-03-26 04:01:17626 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17627 EXPECT_TRUE(socket_data.AllReadDataConsumed());
628 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17629}
630
rch68955482015-09-24 00:14:39631TEST_P(QuicStreamFactoryTest, GoAway) {
jri7046038f2015-10-22 00:29:26632 Initialize();
rch6faa4d42016-01-05 20:48:43633 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
634 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26635
mmenke651bae7f2015-12-18 21:26:45636 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
637 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rch68955482015-09-24 00:14:39638 socket_factory_.AddSocketDataProvider(&socket_data);
rch68955482015-09-24 00:14:39639
jri7046038f2015-10-22 00:29:26640 QuicStreamRequest request(factory_.get());
rch68955482015-09-24 00:14:39641 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56642 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56643 /*cert_verify_flags=*/0, url_, "GET", net_log_,
644 callback_.callback()));
rch68955482015-09-24 00:14:39645
646 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:42647 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rch68955482015-09-24 00:14:39648 EXPECT_TRUE(stream.get());
649
bnc912a04b2016-04-20 14:19:50650 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
rch68955482015-09-24 00:14:39651
652 session->OnGoAway(QuicGoAwayFrame());
653
bnc912a04b2016-04-20 14:19:50654 EXPECT_FALSE(HasActiveSession(host_port_pair_));
rch68955482015-09-24 00:14:39655
656 EXPECT_TRUE(socket_data.AllReadDataConsumed());
657 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
658}
659
zhongyi6b5a3892016-03-12 04:46:20660TEST_P(QuicStreamFactoryTest, GoAwayForConnectionMigrationWithPortOnly) {
661 Initialize();
662 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
663 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
664
665 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
666 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
667 socket_factory_.AddSocketDataProvider(&socket_data);
668
669 QuicStreamRequest request(factory_.get());
670 EXPECT_EQ(ERR_IO_PENDING,
671 request.Request(host_port_pair_, privacy_mode_,
672 /*cert_verify_flags=*/0, url_, "GET", net_log_,
673 callback_.callback()));
674
675 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:42676 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
zhongyi6b5a3892016-03-12 04:46:20677 EXPECT_TRUE(stream.get());
678
bnc912a04b2016-04-20 14:19:50679 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
zhongyi6b5a3892016-03-12 04:46:20680
681 session->OnGoAway(
682 QuicGoAwayFrame(QUIC_ERROR_MIGRATING_PORT, 0,
683 "peer connection migration due to port change only"));
684 NetErrorDetails details;
685 EXPECT_FALSE(details.quic_port_migration_detected);
686 session->PopulateNetErrorDetails(&details);
687 EXPECT_TRUE(details.quic_port_migration_detected);
688 details.quic_port_migration_detected = false;
689 stream->PopulateNetErrorDetails(&details);
690 EXPECT_TRUE(details.quic_port_migration_detected);
691
bnc912a04b2016-04-20 14:19:50692 EXPECT_FALSE(HasActiveSession(host_port_pair_));
zhongyi6b5a3892016-03-12 04:46:20693
694 EXPECT_TRUE(socket_data.AllReadDataConsumed());
695 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
696}
697
[email protected]5db452202014-08-19 05:22:15698TEST_P(QuicStreamFactoryTest, Pooling) {
jri7046038f2015-10-22 00:29:26699 Initialize();
rch6faa4d42016-01-05 20:48:43700 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
701 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26702
mmenke651bae7f2015-12-18 21:26:45703 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
704 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38705 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]eed749f92013-12-23 18:57:38706
rch6faa4d42016-01-05 20:48:43707 HostPortPair server2(kServer2HostName, kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38708 host_resolver_.set_synchronous_mode(true);
rch6faa4d42016-01-05 20:48:43709 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
rjshaded5ced072015-12-18 19:26:02710 "192.168.0.1", "");
rch6faa4d42016-01-05 20:48:43711 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38712
jri7046038f2015-10-22 00:29:26713 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56714 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56715 /*cert_verify_flags=*/0, url_, "GET", net_log_,
716 callback_.callback()));
danakjad1777e2016-04-16 00:56:42717 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]eed749f92013-12-23 18:57:38718 EXPECT_TRUE(stream.get());
719
720 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26721 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56722 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56723 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50724 net_log_, callback.callback()));
danakjad1777e2016-04-16 00:56:42725 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]eed749f92013-12-23 18:57:38726 EXPECT_TRUE(stream2.get());
727
bnc912a04b2016-04-20 14:19:50728 EXPECT_EQ(GetActiveSession(host_port_pair_), GetActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:38729
rch37de576c2015-05-17 20:28:17730 EXPECT_TRUE(socket_data.AllReadDataConsumed());
731 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38732}
733
jri584002d12014-09-09 00:51:28734TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) {
jri7046038f2015-10-22 00:29:26735 disable_connection_pooling_ = true;
736 Initialize();
rch6faa4d42016-01-05 20:48:43737 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
738 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
739 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26740
mmenke651bae7f2015-12-18 21:26:45741 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
742 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
743 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28744 socket_factory_.AddSocketDataProvider(&socket_data1);
745 socket_factory_.AddSocketDataProvider(&socket_data2);
jri584002d12014-09-09 00:51:28746
rch6faa4d42016-01-05 20:48:43747 HostPortPair server2(kServer2HostName, kDefaultServerPort);
jri584002d12014-09-09 00:51:28748 host_resolver_.set_synchronous_mode(true);
rch6faa4d42016-01-05 20:48:43749 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
rjshaded5ced072015-12-18 19:26:02750 "192.168.0.1", "");
rch6faa4d42016-01-05 20:48:43751 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
jri584002d12014-09-09 00:51:28752
jri7046038f2015-10-22 00:29:26753 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56754 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56755 /*cert_verify_flags=*/0, url_, "GET", net_log_,
756 callback_.callback()));
danakjad1777e2016-04-16 00:56:42757 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri584002d12014-09-09 00:51:28758 EXPECT_TRUE(stream.get());
759
760 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26761 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56762 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56763 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50764 net_log_, callback.callback()));
danakjad1777e2016-04-16 00:56:42765 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jri584002d12014-09-09 00:51:28766 EXPECT_TRUE(stream2.get());
767
bnc912a04b2016-04-20 14:19:50768 EXPECT_NE(GetActiveSession(host_port_pair_), GetActiveSession(server2));
jri584002d12014-09-09 00:51:28769
rch37de576c2015-05-17 20:28:17770 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
771 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
772 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
773 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28774}
775
[email protected]eed749f92013-12-23 18:57:38776TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
jri7046038f2015-10-22 00:29:26777 Initialize();
rch6faa4d42016-01-05 20:48:43778 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
779 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
780 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26781
mmenke651bae7f2015-12-18 21:26:45782 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
783 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
784 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38785 socket_factory_.AddSocketDataProvider(&socket_data1);
786 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]eed749f92013-12-23 18:57:38787
rch6faa4d42016-01-05 20:48:43788 HostPortPair server2(kServer2HostName, kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38789 host_resolver_.set_synchronous_mode(true);
rch6faa4d42016-01-05 20:48:43790 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
rjshaded5ced072015-12-18 19:26:02791 "192.168.0.1", "");
rch6faa4d42016-01-05 20:48:43792 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38793
jri7046038f2015-10-22 00:29:26794 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56795 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56796 /*cert_verify_flags=*/0, url_, "GET", net_log_,
797 callback_.callback()));
danakjad1777e2016-04-16 00:56:42798 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]eed749f92013-12-23 18:57:38799 EXPECT_TRUE(stream.get());
800
801 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26802 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56803 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56804 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50805 net_log_, callback.callback()));
danakjad1777e2016-04-16 00:56:42806 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]eed749f92013-12-23 18:57:38807 EXPECT_TRUE(stream2.get());
808
bnc912a04b2016-04-20 14:19:50809 factory_->OnSessionGoingAway(GetActiveSession(host_port_pair_));
810 EXPECT_FALSE(HasActiveSession(host_port_pair_));
811 EXPECT_FALSE(HasActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:38812
813 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:26814 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:56815 EXPECT_EQ(OK, request3.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56816 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50817 net_log_, callback3.callback()));
danakjad1777e2016-04-16 00:56:42818 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
[email protected]eed749f92013-12-23 18:57:38819 EXPECT_TRUE(stream3.get());
820
bnc912a04b2016-04-20 14:19:50821 EXPECT_TRUE(HasActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:38822
rch37de576c2015-05-17 20:28:17823 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
824 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
825 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
826 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38827}
828
[email protected]5db452202014-08-19 05:22:15829TEST_P(QuicStreamFactoryTest, HttpsPooling) {
jri7046038f2015-10-22 00:29:26830 Initialize();
rch6faa4d42016-01-05 20:48:43831
mmenke651bae7f2015-12-18 21:26:45832 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
833 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38834 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]eed749f92013-12-23 18:57:38835
rch6faa4d42016-01-05 20:48:43836 HostPortPair server1(kDefaultServerHostName, 443);
837 HostPortPair server2(kServer2HostName, 443);
[email protected]eed749f92013-12-23 18:57:38838
bncf8bf0722015-05-19 20:04:13839 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01840 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38841
842 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53843 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
844 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38845
jri7046038f2015-10-22 00:29:26846 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56847 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56848 /*cert_verify_flags=*/0, url_, "GET", net_log_,
849 callback_.callback()));
danakjad1777e2016-04-16 00:56:42850 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]eed749f92013-12-23 18:57:38851 EXPECT_TRUE(stream.get());
852
853 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26854 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56855 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56856 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50857 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:42858 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]eed749f92013-12-23 18:57:38859 EXPECT_TRUE(stream2.get());
860
bnc912a04b2016-04-20 14:19:50861 EXPECT_EQ(GetActiveSession(server1), GetActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:38862
rch37de576c2015-05-17 20:28:17863 EXPECT_TRUE(socket_data.AllReadDataConsumed());
864 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38865}
866
jri584002d12014-09-09 00:51:28867TEST_P(QuicStreamFactoryTest, NoHttpsPoolingIfDisabled) {
jri7046038f2015-10-22 00:29:26868 disable_connection_pooling_ = true;
869 Initialize();
870
mmenke651bae7f2015-12-18 21:26:45871 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
872 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
873 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28874 socket_factory_.AddSocketDataProvider(&socket_data1);
875 socket_factory_.AddSocketDataProvider(&socket_data2);
jri584002d12014-09-09 00:51:28876
rch6faa4d42016-01-05 20:48:43877 HostPortPair server1(kDefaultServerHostName, 443);
878 HostPortPair server2(kServer2HostName, 443);
jri584002d12014-09-09 00:51:28879
bncf8bf0722015-05-19 20:04:13880 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01881 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rch6faa4d42016-01-05 20:48:43882 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28883
884 host_resolver_.set_synchronous_mode(true);
885 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
886 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
887
jri7046038f2015-10-22 00:29:26888 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56889 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56890 /*cert_verify_flags=*/0, url_, "GET", net_log_,
891 callback_.callback()));
danakjad1777e2016-04-16 00:56:42892 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri584002d12014-09-09 00:51:28893 EXPECT_TRUE(stream.get());
894
895 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26896 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56897 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56898 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50899 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:42900 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jri584002d12014-09-09 00:51:28901 EXPECT_TRUE(stream2.get());
902
bnc912a04b2016-04-20 14:19:50903 EXPECT_NE(GetActiveSession(server1), GetActiveSession(server2));
jri584002d12014-09-09 00:51:28904
rch37de576c2015-05-17 20:28:17905 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
906 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
907 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
908 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28909}
910
[email protected]5db452202014-08-19 05:22:15911TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
jri7046038f2015-10-22 00:29:26912 Initialize();
mmenke651bae7f2015-12-18 21:26:45913 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
914 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15915 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]5db452202014-08-19 05:22:15916
rch6faa4d42016-01-05 20:48:43917 HostPortPair server1(kDefaultServerHostName, 443);
918 HostPortPair server2(kServer2HostName, 443);
Avi Drissman13fc8932015-12-20 04:40:46919 uint8_t primary_pin = 1;
920 uint8_t backup_pin = 2;
rch6faa4d42016-01-05 20:48:43921 test::AddPin(&transport_security_state_, kServer2HostName, primary_pin,
[email protected]5db452202014-08-19 05:22:15922 backup_pin);
923
bncf8bf0722015-05-19 20:04:13924 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
[email protected]5db452202014-08-19 05:22:15925 verify_details.cert_verify_result.public_key_hashes.push_back(
926 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01927 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]5db452202014-08-19 05:22:15928
929 host_resolver_.set_synchronous_mode(true);
930 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
931 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
932
jri7046038f2015-10-22 00:29:26933 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56934 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56935 /*cert_verify_flags=*/0, url_, "GET", net_log_,
936 callback_.callback()));
danakjad1777e2016-04-16 00:56:42937 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]5db452202014-08-19 05:22:15938 EXPECT_TRUE(stream.get());
939
940 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26941 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56942 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56943 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50944 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:42945 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]5db452202014-08-19 05:22:15946 EXPECT_TRUE(stream2.get());
947
bnc912a04b2016-04-20 14:19:50948 EXPECT_EQ(GetActiveSession(server1), GetActiveSession(server2));
[email protected]5db452202014-08-19 05:22:15949
rch37de576c2015-05-17 20:28:17950 EXPECT_TRUE(socket_data.AllReadDataConsumed());
951 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:15952}
953
jri584002d12014-09-09 00:51:28954TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithMatchingPinsIfDisabled) {
jri7046038f2015-10-22 00:29:26955 disable_connection_pooling_ = true;
956 Initialize();
957
mmenke651bae7f2015-12-18 21:26:45958 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
959 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
960 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28961 socket_factory_.AddSocketDataProvider(&socket_data1);
962 socket_factory_.AddSocketDataProvider(&socket_data2);
jri584002d12014-09-09 00:51:28963
rch6faa4d42016-01-05 20:48:43964 HostPortPair server1(kDefaultServerHostName, 443);
965 HostPortPair server2(kServer2HostName, 443);
Avi Drissman13fc8932015-12-20 04:40:46966 uint8_t primary_pin = 1;
967 uint8_t backup_pin = 2;
rch6faa4d42016-01-05 20:48:43968 test::AddPin(&transport_security_state_, kServer2HostName, primary_pin,
jri584002d12014-09-09 00:51:28969 backup_pin);
970
bncf8bf0722015-05-19 20:04:13971 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
jri584002d12014-09-09 00:51:28972 verify_details.cert_verify_result.public_key_hashes.push_back(
973 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01974 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rch6faa4d42016-01-05 20:48:43975 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28976
977 host_resolver_.set_synchronous_mode(true);
978 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
979 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
980
jri7046038f2015-10-22 00:29:26981 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56982 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56983 /*cert_verify_flags=*/0, url_, "GET", net_log_,
984 callback_.callback()));
danakjad1777e2016-04-16 00:56:42985 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri584002d12014-09-09 00:51:28986 EXPECT_TRUE(stream.get());
987
988 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26989 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56990 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56991 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50992 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:42993 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jri584002d12014-09-09 00:51:28994 EXPECT_TRUE(stream2.get());
995
bnc912a04b2016-04-20 14:19:50996 EXPECT_NE(GetActiveSession(server1), GetActiveSession(server2));
jri584002d12014-09-09 00:51:28997
rch37de576c2015-05-17 20:28:17998 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
999 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1000 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1001 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:281002}
1003
[email protected]5db452202014-08-19 05:22:151004TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
jri7046038f2015-10-22 00:29:261005 Initialize();
mmenke651bae7f2015-12-18 21:26:451006 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1007 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
1008 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:151009 socket_factory_.AddSocketDataProvider(&socket_data1);
1010 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]5db452202014-08-19 05:22:151011
rch6faa4d42016-01-05 20:48:431012 HostPortPair server1(kDefaultServerHostName, 443);
1013 HostPortPair server2(kServer2HostName, 443);
Avi Drissman13fc8932015-12-20 04:40:461014 uint8_t primary_pin = 1;
1015 uint8_t backup_pin = 2;
1016 uint8_t bad_pin = 3;
rch6faa4d42016-01-05 20:48:431017 test::AddPin(&transport_security_state_, kServer2HostName, primary_pin,
[email protected]5db452202014-08-19 05:22:151018 backup_pin);
1019
bncf8bf0722015-05-19 20:04:131020 ProofVerifyDetailsChromium verify_details1 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011021 verify_details1.cert_verify_result.public_key_hashes.push_back(
1022 test::GetTestHashValue(bad_pin));
1023 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
1024
bncf8bf0722015-05-19 20:04:131025 ProofVerifyDetailsChromium verify_details2 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011026 verify_details2.cert_verify_result.public_key_hashes.push_back(
1027 test::GetTestHashValue(primary_pin));
1028 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
[email protected]5db452202014-08-19 05:22:151029
1030 host_resolver_.set_synchronous_mode(true);
1031 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1032 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1033
jri7046038f2015-10-22 00:29:261034 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561035 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561036 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1037 callback_.callback()));
danakjad1777e2016-04-16 00:56:421038 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]5db452202014-08-19 05:22:151039 EXPECT_TRUE(stream.get());
1040
1041 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:261042 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:561043 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561044 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:501045 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:421046 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]5db452202014-08-19 05:22:151047 EXPECT_TRUE(stream2.get());
1048
bnc912a04b2016-04-20 14:19:501049 EXPECT_NE(GetActiveSession(server1), GetActiveSession(server2));
[email protected]5db452202014-08-19 05:22:151050
rch37de576c2015-05-17 20:28:171051 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1052 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1053 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1054 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:151055}
1056
[email protected]1e960032013-12-20 19:00:201057TEST_P(QuicStreamFactoryTest, Goaway) {
jri7046038f2015-10-22 00:29:261058 Initialize();
rch6faa4d42016-01-05 20:48:431059 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1060 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1061 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1062
mmenke651bae7f2015-12-18 21:26:451063 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1064 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271065 socket_factory_.AddSocketDataProvider(&socket_data);
mmenke651bae7f2015-12-18 21:26:451066 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271067 socket_factory_.AddSocketDataProvider(&socket_data2);
1068
jri7046038f2015-10-22 00:29:261069 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591070 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561071 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561072 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1073 callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271074
1075 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421076 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]4d283b32013-10-17 12:57:271077 EXPECT_TRUE(stream.get());
1078
1079 // Mark the session as going away. Ensure that while it is still alive
1080 // that it is no longer active.
bnc912a04b2016-04-20 14:19:501081 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7046038f2015-10-22 00:29:261082 factory_->OnSessionGoingAway(session);
1083 EXPECT_EQ(true,
1084 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
bnc912a04b2016-04-20 14:19:501085 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]4d283b32013-10-17 12:57:271086
1087 // Create a new request for the same destination and verify that a
1088 // new session is created.
jri7046038f2015-10-22 00:29:261089 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591090 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561091 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561092 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1093 callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271094 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421095 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]4d283b32013-10-17 12:57:271096 EXPECT_TRUE(stream2.get());
1097
bnc912a04b2016-04-20 14:19:501098 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1099 EXPECT_NE(session, GetActiveSession(host_port_pair_));
jri7046038f2015-10-22 00:29:261100 EXPECT_EQ(true,
1101 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
[email protected]4d283b32013-10-17 12:57:271102
1103 stream2.reset();
1104 stream.reset();
1105
rch37de576c2015-05-17 20:28:171106 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1107 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1108 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1109 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]4d283b32013-10-17 12:57:271110}
1111
[email protected]1e960032013-12-20 19:00:201112TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
jri7046038f2015-10-22 00:29:261113 Initialize();
rch6faa4d42016-01-05 20:48:431114 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1115 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1116
[email protected]66ae5962014-05-22 11:13:051117 QuicStreamId stream_id = kClientDataStreamId1;
danakjad1777e2016-04-16 00:56:421118 std::unique_ptr<QuicEncryptedPacket> client_rst(
alyssar2adf3ac2016-05-03 17:12:581119 client_maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
[email protected]06ff5152013-08-29 01:03:051120 MockWrite writes[] = {
ckrasicea295fe2015-10-31 05:03:271121 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 0),
1122 };
danakjad1777e2016-04-16 00:56:421123 std::unique_ptr<QuicEncryptedPacket> server_rst(
alyssar2adf3ac2016-05-03 17:12:581124 server_maker_.MakeRstPacket(1, false, stream_id, QUIC_STREAM_CANCELLED));
ckrasicea295fe2015-10-31 05:03:271125 MockRead reads[] = {
1126 MockRead(ASYNC, server_rst->data(), server_rst->length(), 1),
mmenke651bae7f2015-12-18 21:26:451127 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
1128 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1129 arraysize(writes));
[email protected]0b2294d32013-08-02 00:46:361130 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0b2294d32013-08-02 00:46:361131
1132 HttpRequestInfo request_info;
1133 std::vector<QuicHttpStream*> streams;
1134 // The MockCryptoClientStream sets max_open_streams to be
rtenneti6a4cf3b2015-01-09 03:41:151135 // kDefaultMaxStreamsPerConnection / 2.
1136 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection / 2; i++) {
jri7046038f2015-10-22 00:29:261137 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561138 int rv = request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561139 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1140 callback_.callback());
[email protected]0b2294d32013-08-02 00:46:361141 if (i == 0) {
1142 EXPECT_EQ(ERR_IO_PENDING, rv);
1143 EXPECT_EQ(OK, callback_.WaitForResult());
1144 } else {
1145 EXPECT_EQ(OK, rv);
1146 }
danakjad1777e2016-04-16 00:56:421147 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]0b2294d32013-08-02 00:46:361148 EXPECT_TRUE(stream);
rjshaded5ced072015-12-18 19:26:021149 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1150 net_log_, CompletionCallback()));
[email protected]0b2294d32013-08-02 00:46:361151 streams.push_back(stream.release());
1152 }
1153
jri7046038f2015-10-22 00:29:261154 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561155 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561156 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1157 CompletionCallback()));
danakjad1777e2016-04-16 00:56:421158 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]0b2294d32013-08-02 00:46:361159 EXPECT_TRUE(stream);
rjshaded5ced072015-12-18 19:26:021160 EXPECT_EQ(ERR_IO_PENDING,
1161 stream->InitializeStream(&request_info, DEFAULT_PRIORITY, net_log_,
1162 callback_.callback()));
[email protected]0b2294d32013-08-02 00:46:361163
1164 // Close the first stream.
1165 streams.front()->Close(false);
ckrasicea295fe2015-10-31 05:03:271166 // Trigger exchange of RSTs that in turn allow progress for the last
1167 // stream.
[email protected]0b2294d32013-08-02 00:46:361168 EXPECT_EQ(OK, callback_.WaitForResult());
1169
rch37de576c2015-05-17 20:28:171170 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1171 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
ckrasicea295fe2015-10-31 05:03:271172
1173 // Force close of the connection to suppress the generation of RST
1174 // packets when streams are torn down, which wouldn't be relevant to
1175 // this test anyway.
bnc912a04b2016-04-20 14:19:501176 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri78ec06a2016-03-31 18:19:401177 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
1178 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasicea295fe2015-10-31 05:03:271179
[email protected]0b2294d32013-08-02 00:46:361180 STLDeleteElements(&streams);
1181}
1182
[email protected]1e960032013-12-20 19:00:201183TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
jri7046038f2015-10-22 00:29:261184 Initialize();
mmenke651bae7f2015-12-18 21:26:451185 SequencedSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321186 socket_factory_.AddSocketDataProvider(&socket_data);
1187
[email protected]3c772402013-12-18 21:38:111188 host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName);
[email protected]e13201d82012-12-12 05:00:321189
jri7046038f2015-10-22 00:29:261190 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591191 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561192 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561193 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1194 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321195
1196 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
1197
rch37de576c2015-05-17 20:28:171198 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1199 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321200}
1201
[email protected]1e960032013-12-20 19:00:201202TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
jri7046038f2015-10-22 00:29:261203 Initialize();
[email protected]3c772402013-12-18 21:38:111204 MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
mmenke651bae7f2015-12-18 21:26:451205 SequencedSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]3c772402013-12-18 21:38:111206 socket_data.set_connect_data(connect);
1207 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]3c772402013-12-18 21:38:111208
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]3c772402013-12-18 21:38:111214
1215 EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult());
1216
rch37de576c2015-05-17 20:28:171217 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1218 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:111219}
1220
[email protected]1e960032013-12-20 19:00:201221TEST_P(QuicStreamFactoryTest, CancelCreate) {
jri7046038f2015-10-22 00:29:261222 Initialize();
mmenke651bae7f2015-12-18 21:26:451223 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1224 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321225 socket_factory_.AddSocketDataProvider(&socket_data);
1226 {
jri7046038f2015-10-22 00:29:261227 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591228 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561229 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561230 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1231 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321232 }
1233
mmenke651bae7f2015-12-18 21:26:451234 base::RunLoop().RunUntilIdle();
[email protected]e13201d82012-12-12 05:00:321235
danakjad1777e2016-04-16 00:56:421236 std::unique_ptr<QuicHttpStream> stream(CreateFromSession(host_port_pair_));
[email protected]e13201d82012-12-12 05:00:321237 EXPECT_TRUE(stream.get());
1238 stream.reset();
1239
rch37de576c2015-05-17 20:28:171240 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1241 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321242}
1243
[email protected]1e960032013-12-20 19:00:201244TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) {
jri7046038f2015-10-22 00:29:261245 Initialize();
rch6faa4d42016-01-05 20:48:431246 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1247 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1248 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1249 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261250
[email protected]3c772402013-12-18 21:38:111251 // Sequentially connect to the default host, then another host, and then the
1252 // default host. Verify that the default host gets a consistent ephemeral
1253 // port, that is different from the other host's connection.
1254
rch6faa4d42016-01-05 20:48:431255 std::string other_server_name = kServer2HostName;
[email protected]3c772402013-12-18 21:38:111256 EXPECT_NE(kDefaultServerHostName, other_server_name);
1257 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort);
[email protected]3c772402013-12-18 21:38:111258
[email protected]bf4ea2f2014-03-10 22:57:531259 int original_port = GetSourcePortForNewSession(host_port_pair_);
1260 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2));
1261 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]3c772402013-12-18 21:38:111262}
1263
[email protected]d8e2abf82014-03-06 10:30:101264TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) {
jri7046038f2015-10-22 00:29:261265 Initialize();
rch6faa4d42016-01-05 20:48:431266 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1267 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1268 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1269 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261270
[email protected]d8e2abf82014-03-06 10:30:101271 // Get a session to the host using the port suggester.
rjshaded5ced072015-12-18 19:26:021272 int original_port = GetSourcePortForNewSessionAndGoAway(host_port_pair_);
[email protected]d8e2abf82014-03-06 10:30:101273 // Verify that the port is different after the goaway.
[email protected]bf4ea2f2014-03-10 22:57:531274 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101275 // Since the previous session did not goaway we should see the original port.
[email protected]bf4ea2f2014-03-10 22:57:531276 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101277}
1278
[email protected]1e960032013-12-20 19:00:201279TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
jri7046038f2015-10-22 00:29:261280 Initialize();
rch6faa4d42016-01-05 20:48:431281 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1282 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1283 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1284
mmenke651bae7f2015-12-18 21:26:451285 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:581286 std::unique_ptr<QuicEncryptedPacket> rst(ConstructClientRstPacket());
[email protected]459a7402014-02-10 12:58:521287 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311288 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:451289 SequencedSocketData socket_data(reads, arraysize(reads),
1290 writes.empty() ? nullptr : &writes[0],
1291 writes.size());
[email protected]56dfb902013-01-03 23:17:551292 socket_factory_.AddSocketDataProvider(&socket_data);
1293
mmenke651bae7f2015-12-18 21:26:451294 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1295 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]56dfb902013-01-03 23:17:551296 socket_factory_.AddSocketDataProvider(&socket_data2);
1297
jri7046038f2015-10-22 00:29:261298 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591299 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561300 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561301 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1302 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551303
1304 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421305 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]0b2294d32013-08-02 00:46:361306 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:021307 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]0b2294d32013-08-02 00:46:361308 net_log_, CompletionCallback()));
[email protected]56dfb902013-01-03 23:17:551309
1310 // Close the session and verify that stream saw the error.
jri7e636642016-01-14 06:57:081311 factory_->CloseAllSessions(ERR_INTERNET_DISCONNECTED, QUIC_INTERNAL_ERROR);
[email protected]56dfb902013-01-03 23:17:551312 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1313 stream->ReadResponseHeaders(callback_.callback()));
1314
1315 // Now attempting to request a stream to the same origin should create
1316 // a new session.
1317
jri7046038f2015-10-22 00:29:261318 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591319 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561320 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561321 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1322 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551323
1324 EXPECT_EQ(OK, callback_.WaitForResult());
xunjieli2608f9b2016-03-14 13:39:231325 stream = request2.CreateStream();
[email protected]56dfb902013-01-03 23:17:551326 stream.reset(); // Will reset stream 3.
1327
rch37de576c2015-05-17 20:28:171328 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1329 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1330 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1331 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]56dfb902013-01-03 23:17:551332}
1333
[email protected]1e960032013-12-20 19:00:201334TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
jri8c44d692015-10-23 23:53:411335 close_sessions_on_ip_change_ = true;
jri7046038f2015-10-22 00:29:261336 Initialize();
rch6faa4d42016-01-05 20:48:431337 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1338 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1339 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri8c44d692015-10-23 23:53:411340
mmenke651bae7f2015-12-18 21:26:451341 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:581342 std::unique_ptr<QuicEncryptedPacket> rst(ConstructClientRstPacket());
[email protected]459a7402014-02-10 12:58:521343 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311344 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:451345 SequencedSocketData socket_data(reads, arraysize(reads),
1346 writes.empty() ? nullptr : &writes[0],
1347 writes.size());
[email protected]f698a012013-05-06 20:18:591348 socket_factory_.AddSocketDataProvider(&socket_data);
1349
mmenke651bae7f2015-12-18 21:26:451350 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1351 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]f698a012013-05-06 20:18:591352 socket_factory_.AddSocketDataProvider(&socket_data2);
1353
jri7046038f2015-10-22 00:29:261354 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591355 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561356 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561357 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1358 callback_.callback()));
[email protected]f698a012013-05-06 20:18:591359
1360 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421361 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]0b2294d32013-08-02 00:46:361362 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:021363 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]0b2294d32013-08-02 00:46:361364 net_log_, CompletionCallback()));
[email protected]f698a012013-05-06 20:18:591365
1366 // Change the IP address and verify that stream saw the error.
jri8c44d692015-10-23 23:53:411367 NotifyIPAddressChanged();
[email protected]f698a012013-05-06 20:18:591368 EXPECT_EQ(ERR_NETWORK_CHANGED,
1369 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:261370 EXPECT_TRUE(factory_->require_confirmation());
[email protected]f698a012013-05-06 20:18:591371
1372 // Now attempting to request a stream to the same origin should create
1373 // a new session.
1374
jri7046038f2015-10-22 00:29:261375 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591376 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561377 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561378 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1379 callback_.callback()));
[email protected]f698a012013-05-06 20:18:591380
1381 EXPECT_EQ(OK, callback_.WaitForResult());
xunjieli2608f9b2016-03-14 13:39:231382 stream = request2.CreateStream();
[email protected]f698a012013-05-06 20:18:591383 stream.reset(); // Will reset stream 3.
1384
rch37de576c2015-05-17 20:28:171385 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1386 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1387 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1388 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]f698a012013-05-06 20:18:591389}
1390
jri7e636642016-01-14 06:57:081391TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnect) {
1392 InitializeConnectionMigrationTest(
1393 {kDefaultNetworkForTests, kNewNetworkForTests});
1394 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1395 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1396 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1397
1398 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421399 std::unique_ptr<QuicEncryptedPacket> request_packet(
jri7e636642016-01-14 06:57:081400 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true));
1401 MockWrite writes[] = {MockWrite(SYNCHRONOUS, request_packet->data(),
1402 request_packet->length(), 1)};
1403 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1404 arraysize(writes));
1405 socket_factory_.AddSocketDataProvider(&socket_data);
1406
1407 // Create request and QuicHttpStream.
1408 QuicStreamRequest request(factory_.get());
1409 EXPECT_EQ(ERR_IO_PENDING,
1410 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561411 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1412 callback_.callback()));
jri7e636642016-01-14 06:57:081413 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421414 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081415 EXPECT_TRUE(stream.get());
1416
1417 // Cause QUIC stream to be created.
1418 HttpRequestInfo request_info;
1419 request_info.method = "GET";
1420 request_info.url = GURL("https://www.example.org/");
1421 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1422 net_log_, CompletionCallback()));
1423
1424 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501425 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:081426 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1427 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1428
1429 // Send GET request on stream.
1430 HttpResponseInfo response;
1431 HttpRequestHeaders request_headers;
1432 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
1433 callback_.callback()));
1434
1435 // Set up second socket data provider that is used after migration.
1436 // The response to the earlier request is read on this new socket.
danakjad1777e2016-04-16 00:56:421437 std::unique_ptr<QuicEncryptedPacket> ping(
alyssar2adf3ac2016-05-03 17:12:581438 client_maker_.MakePingPacket(2, /*include_version=*/true));
jri7e636642016-01-14 06:57:081439 MockWrite writes1[] = {
1440 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 0)};
danakjad1777e2016-04-16 00:56:421441 std::unique_ptr<QuicEncryptedPacket> response_headers_packet(
jri7e636642016-01-14 06:57:081442 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
1443 MockRead reads1[] = {MockRead(ASYNC, response_headers_packet->data(),
1444 response_headers_packet->length(), 1),
1445 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
1446 SequencedSocketData socket_data1(reads1, arraysize(reads1), writes1,
1447 arraysize(writes1));
1448 socket_factory_.AddSocketDataProvider(&socket_data1);
1449
1450 // Trigger connection migration. This should cause a PING frame
1451 // to be emitted.
1452 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1453 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1454
1455 // The session should now be marked as going away. Ensure that
1456 // while it is still alive, it is no longer active.
1457 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1458 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1459 EXPECT_EQ(1u, session->GetNumActiveStreams());
1460
1461 // Verify that response headers on the migrated socket were delivered to the
1462 // stream.
1463 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
1464 EXPECT_EQ(200, response.headers->response_code());
1465
1466 // Create a new request for the same destination and verify that a
1467 // new session is created.
1468 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1469 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1470 socket_factory_.AddSocketDataProvider(&socket_data2);
1471
1472 QuicStreamRequest request2(factory_.get());
1473 EXPECT_EQ(ERR_IO_PENDING,
1474 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561475 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1476 callback_.callback()));
jri7e636642016-01-14 06:57:081477 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421478 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jri7e636642016-01-14 06:57:081479 EXPECT_TRUE(stream2.get());
1480
bnc912a04b2016-04-20 14:19:501481 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1482 QuicChromiumClientSession* new_session = GetActiveSession(host_port_pair_);
jrid36ada62016-02-06 02:42:081483 EXPECT_NE(session, new_session);
jri7e636642016-01-14 06:57:081484
jrid36ada62016-02-06 02:42:081485 // On a DISCONNECTED notification, nothing happens to the migrated
1486 // session, but the new session is closed since it has no open
1487 // streams.
jri7e636642016-01-14 06:57:081488 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1489 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1490 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1491 EXPECT_EQ(1u, session->GetNumActiveStreams());
jrid36ada62016-02-06 02:42:081492 EXPECT_FALSE(
1493 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), new_session));
jri7e636642016-01-14 06:57:081494
1495 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1496 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1497 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1498 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1499 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1500 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1501}
1502
1503TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnected) {
1504 InitializeConnectionMigrationTest(
1505 {kDefaultNetworkForTests, kNewNetworkForTests});
1506 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1507 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1508 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1509
1510 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421511 std::unique_ptr<QuicEncryptedPacket> request_packet(
jri7e636642016-01-14 06:57:081512 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true));
1513 MockWrite writes[] = {MockWrite(SYNCHRONOUS, request_packet->data(),
1514 request_packet->length(), 1)};
1515 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1516 arraysize(writes));
1517 socket_factory_.AddSocketDataProvider(&socket_data);
1518
1519 // Create request and QuicHttpStream.
1520 QuicStreamRequest request(factory_.get());
1521 EXPECT_EQ(ERR_IO_PENDING,
1522 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561523 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1524 callback_.callback()));
jri7e636642016-01-14 06:57:081525 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421526 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081527 EXPECT_TRUE(stream.get());
1528
1529 // Cause QUIC stream to be created.
1530 HttpRequestInfo request_info;
1531 request_info.method = "GET";
1532 request_info.url = GURL("https://www.example.org/");
1533 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1534 net_log_, CompletionCallback()));
1535
1536 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501537 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:081538 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1539 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1540
1541 // Send GET request on stream.
1542 HttpResponseInfo response_info;
1543 HttpRequestHeaders request_headers;
1544 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response_info,
1545 callback_.callback()));
1546
1547 // Set up second socket data provider that is used after migration.
danakjad1777e2016-04-16 00:56:421548 std::unique_ptr<QuicEncryptedPacket> ping(
alyssar2adf3ac2016-05-03 17:12:581549 client_maker_.MakePingPacket(2, /*include_version=*/true));
1550 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
jri7e636642016-01-14 06:57:081551 3, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1552 MockWrite writes1[] = {
1553 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 0)};
danakjad1777e2016-04-16 00:56:421554 std::unique_ptr<QuicEncryptedPacket> response_packet(
jri7e636642016-01-14 06:57:081555 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
1556 MockRead reads1[] = {
1557 MockRead(ASYNC, response_packet->data(), response_packet->length(), 1),
1558 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
1559 SequencedSocketData socket_data1(reads1, arraysize(reads1), writes1,
1560 arraysize(writes1));
1561 socket_factory_.AddSocketDataProvider(&socket_data1);
1562
1563 // Trigger connection migration. This should cause a PING frame
1564 // to be emitted.
1565 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1566 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1567
1568 // The session should now be marked as going away. Ensure that
1569 // while it is still alive, it is no longer active.
1570 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1571 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1572 EXPECT_EQ(1u, session->GetNumActiveStreams());
1573
1574 // Create a new request for the same destination and verify that a
1575 // new session is created.
1576 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1577 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1578 socket_factory_.AddSocketDataProvider(&socket_data2);
1579
1580 QuicStreamRequest request2(factory_.get());
1581 EXPECT_EQ(ERR_IO_PENDING,
1582 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561583 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1584 callback_.callback()));
jri7e636642016-01-14 06:57:081585 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421586 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jri7e636642016-01-14 06:57:081587 EXPECT_TRUE(stream2.get());
1588
bnc912a04b2016-04-20 14:19:501589 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1590 EXPECT_NE(session, GetActiveSession(host_port_pair_));
jri7e636642016-01-14 06:57:081591 EXPECT_EQ(true,
1592 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1593
1594 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1595 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1596 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1597 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1598 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1599 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1600}
1601
1602TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoNetworks) {
1603 NetworkChangeNotifier::NetworkList no_networks(0);
1604 InitializeConnectionMigrationTest(no_networks);
1605 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1606 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1607
1608 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:581609 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
jri7e636642016-01-14 06:57:081610 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1611 MockWrite writes[] = {
1612 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1613 };
1614 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1615 arraysize(writes));
1616 socket_factory_.AddSocketDataProvider(&socket_data);
1617
1618 // Create request and QuicHttpStream.
1619 QuicStreamRequest request(factory_.get());
1620 EXPECT_EQ(ERR_IO_PENDING,
1621 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561622 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1623 callback_.callback()));
jri7e636642016-01-14 06:57:081624 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421625 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081626 EXPECT_TRUE(stream.get());
1627
1628 // Cause QUIC stream to be created.
1629 HttpRequestInfo request_info;
1630 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1631 net_log_, CompletionCallback()));
1632
1633 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501634 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:081635 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1636 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1637 EXPECT_EQ(1u, session->GetNumActiveStreams());
1638
1639 // Trigger connection migration. Since there are no networks
1640 // to migrate to, this should cause the session to continue on the same
1641 // socket, but be marked as going away.
1642 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1643 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1644
1645 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1646 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1647 EXPECT_EQ(1u, session->GetNumActiveStreams());
1648
1649 stream.reset();
1650
1651 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1652 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1653}
1654
1655TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoNetworks) {
1656 NetworkChangeNotifier::NetworkList no_networks(0);
1657 InitializeConnectionMigrationTest(no_networks);
1658 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1659 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1660
1661 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:581662 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
jri7e636642016-01-14 06:57:081663 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1664 MockWrite writes[] = {
1665 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
1666 };
1667 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1668 arraysize(writes));
1669 socket_factory_.AddSocketDataProvider(&socket_data);
1670
1671 // Create request and QuicHttpStream.
1672 QuicStreamRequest request(factory_.get());
1673 EXPECT_EQ(ERR_IO_PENDING,
1674 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561675 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1676 callback_.callback()));
jri7e636642016-01-14 06:57:081677 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421678 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081679 EXPECT_TRUE(stream.get());
1680
1681 // Cause QUIC stream to be created.
1682 HttpRequestInfo request_info;
1683 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1684 net_log_, CompletionCallback()));
1685
1686 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501687 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:081688 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1689 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1690
1691 // Trigger connection migration. Since there are no networks
1692 // to migrate to, this should cause a RST_STREAM frame to be emitted
1693 // and the session to be closed.
1694 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1695 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1696
1697 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1698 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1699
1700 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1701 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1702}
1703
1704TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoNewNetwork) {
1705 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
1706 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1707 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1708
1709 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:581710 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
jri7e636642016-01-14 06:57:081711 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1712 MockWrite writes[] = {
1713 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1714 };
1715 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1716 arraysize(writes));
1717 socket_factory_.AddSocketDataProvider(&socket_data);
1718
1719 // Create request and QuicHttpStream.
1720 QuicStreamRequest request(factory_.get());
1721 EXPECT_EQ(ERR_IO_PENDING,
1722 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561723 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1724 callback_.callback()));
jri7e636642016-01-14 06:57:081725 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421726 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081727 EXPECT_TRUE(stream.get());
1728
1729 // Cause QUIC stream to be created.
1730 HttpRequestInfo request_info;
1731 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1732 net_log_, CompletionCallback()));
1733
1734 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501735 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:081736 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1737 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1738
1739 // Trigger connection migration. Since there are no networks
1740 // to migrate to, this should cause session to be continue but be marked as
1741 // going away.
1742 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1743 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1744
1745 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1746 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1747 EXPECT_EQ(1u, session->GetNumActiveStreams());
1748
1749 stream.reset();
1750
1751 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1752 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1753}
1754
1755TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoNewNetwork) {
1756 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
1757 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1758 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1759
1760 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:581761 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
jri7e636642016-01-14 06:57:081762 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1763 MockWrite writes[] = {
1764 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
1765 };
1766 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1767 arraysize(writes));
1768 socket_factory_.AddSocketDataProvider(&socket_data);
1769
1770 // Create request and QuicHttpStream.
1771 QuicStreamRequest request(factory_.get());
1772 EXPECT_EQ(ERR_IO_PENDING,
1773 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561774 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1775 callback_.callback()));
jri7e636642016-01-14 06:57:081776 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421777 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081778 EXPECT_TRUE(stream.get());
1779
1780 // Cause QUIC stream to be created.
1781 HttpRequestInfo request_info;
1782 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1783 net_log_, CompletionCallback()));
1784
1785 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501786 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:081787 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1788 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1789
1790 // Trigger connection migration. Since there are no networks
1791 // to migrate to, this should cause a RST_STREAM frame to be emitted
1792 // with QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed.
1793 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1794 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1795
1796 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1797 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1798
1799 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1800 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1801}
1802
jri231c2972016-03-08 19:50:111803TEST_P(QuicStreamFactoryTest,
1804 OnNetworkChangeSoonToDisconnectNonMigratableStream) {
1805 InitializeConnectionMigrationTest(
1806 {kDefaultNetworkForTests, kNewNetworkForTests});
1807 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1808 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1809
1810 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:581811 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
jri231c2972016-03-08 19:50:111812 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1813 MockWrite writes[] = {
1814 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1815 };
1816 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1817 arraysize(writes));
1818 socket_factory_.AddSocketDataProvider(&socket_data);
1819
1820 // Create request and QuicHttpStream.
1821 QuicStreamRequest request(factory_.get());
1822 EXPECT_EQ(ERR_IO_PENDING,
1823 request.Request(host_port_pair_, privacy_mode_,
1824 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1825 callback_.callback()));
1826 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421827 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri231c2972016-03-08 19:50:111828 EXPECT_TRUE(stream.get());
1829
1830 // Cause QUIC stream to be created, but marked as non-migratable.
1831 HttpRequestInfo request_info;
1832 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION;
1833 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1834 net_log_, CompletionCallback()));
1835
1836 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501837 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:111838 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1839 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1840
1841 // Trigger connection migration. Since there is a non-migratable stream,
1842 // this should cause session to continue but be marked as going away.
1843 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1844 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1845
1846 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1847 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1848 EXPECT_EQ(1u, session->GetNumActiveStreams());
1849
1850 stream.reset();
1851
1852 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1853 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1854}
1855
jri9c541572016-03-29 17:51:481856TEST_P(QuicStreamFactoryTest,
1857 OnNetworkChangeSoonToDisconnectConnectionMigrationDisabled) {
1858 InitializeConnectionMigrationTest(
1859 {kDefaultNetworkForTests, kNewNetworkForTests});
1860 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1861 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1862
1863 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:581864 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
jri9c541572016-03-29 17:51:481865 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1866 MockWrite writes[] = {
1867 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1868 };
1869 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1870 arraysize(writes));
1871 socket_factory_.AddSocketDataProvider(&socket_data);
1872
1873 // Create request and QuicHttpStream.
1874 QuicStreamRequest request(factory_.get());
1875 EXPECT_EQ(ERR_IO_PENDING,
1876 request.Request(host_port_pair_, privacy_mode_,
1877 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1878 callback_.callback()));
1879 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421880 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri9c541572016-03-29 17:51:481881 EXPECT_TRUE(stream.get());
1882
1883 // Cause QUIC stream to be created.
1884 HttpRequestInfo request_info;
1885 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1886 net_log_, CompletionCallback()));
1887
1888 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501889 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:481890 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1891 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1892
1893 // Set session config to have connection migration disabled.
1894 QuicConfigPeer::SetReceivedDisableConnectionMigration(session->config());
1895 EXPECT_TRUE(session->config()->DisableConnectionMigration());
1896
1897 // Trigger connection migration. Since there is a non-migratable stream,
1898 // this should cause session to continue but be marked as going away.
1899 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1900 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1901
1902 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1903 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1904 EXPECT_EQ(1u, session->GetNumActiveStreams());
1905
1906 stream.reset();
1907
1908 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1909 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1910}
1911
jri231c2972016-03-08 19:50:111912TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNonMigratableStream) {
1913 InitializeConnectionMigrationTest(
1914 {kDefaultNetworkForTests, kNewNetworkForTests});
1915 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1916 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1917
1918 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:581919 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
jri231c2972016-03-08 19:50:111920 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1921 MockWrite writes[] = {
1922 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
1923 };
1924 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1925 arraysize(writes));
1926 socket_factory_.AddSocketDataProvider(&socket_data);
1927
1928 // Create request and QuicHttpStream.
1929 QuicStreamRequest request(factory_.get());
1930 EXPECT_EQ(ERR_IO_PENDING,
1931 request.Request(host_port_pair_, privacy_mode_,
1932 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1933 callback_.callback()));
1934 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421935 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri231c2972016-03-08 19:50:111936 EXPECT_TRUE(stream.get());
1937
1938 // Cause QUIC stream to be created, but marked as non-migratable.
1939 HttpRequestInfo request_info;
1940 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION;
1941 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1942 net_log_, CompletionCallback()));
1943
1944 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501945 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:111946 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1947 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1948
1949 // Trigger connection migration. Since there is a non-migratable stream,
1950 // this should cause a RST_STREAM frame to be emitted with
1951 // QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed.
1952 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1953 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1954
1955 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1956 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1957
1958 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1959 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1960}
1961
jri9c541572016-03-29 17:51:481962TEST_P(QuicStreamFactoryTest,
1963 OnNetworkChangeDisconnectedConnectionMigrationDisabled) {
1964 InitializeConnectionMigrationTest(
1965 {kDefaultNetworkForTests, kNewNetworkForTests});
1966 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1967 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1968
1969 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:581970 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
jri9c541572016-03-29 17:51:481971 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1972 MockWrite writes[] = {
1973 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
1974 };
1975 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1976 arraysize(writes));
1977 socket_factory_.AddSocketDataProvider(&socket_data);
1978
1979 // Create request and QuicHttpStream.
1980 QuicStreamRequest request(factory_.get());
1981 EXPECT_EQ(ERR_IO_PENDING,
1982 request.Request(host_port_pair_, privacy_mode_,
1983 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1984 callback_.callback()));
1985 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421986 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri9c541572016-03-29 17:51:481987 EXPECT_TRUE(stream.get());
1988
1989 // Cause QUIC stream to be created.
1990 HttpRequestInfo request_info;
1991 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1992 net_log_, CompletionCallback()));
1993
1994 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501995 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:481996 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1997 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1998
1999 // Set session config to have connection migration disabled.
2000 QuicConfigPeer::SetReceivedDisableConnectionMigration(session->config());
2001 EXPECT_TRUE(session->config()->DisableConnectionMigration());
2002
2003 // Trigger connection migration. Since there is a non-migratable stream,
2004 // this should cause a RST_STREAM frame to be emitted with
2005 // QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed.
2006 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2007 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2008
2009 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2010 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2011
2012 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2013 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2014}
2015
jri7e636642016-01-14 06:57:082016TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoOpenStreams) {
2017 InitializeConnectionMigrationTest(
2018 {kDefaultNetworkForTests, kNewNetworkForTests});
2019 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2020 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2021
2022 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2023 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0u);
2024 socket_factory_.AddSocketDataProvider(&socket_data);
2025
2026 // Create request and QuicHttpStream.
2027 QuicStreamRequest request(factory_.get());
2028 EXPECT_EQ(ERR_IO_PENDING,
2029 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562030 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2031 callback_.callback()));
jri7e636642016-01-14 06:57:082032 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422033 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:082034 EXPECT_TRUE(stream.get());
2035
2036 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502037 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:082038 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2039 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2040
2041 // Trigger connection migration. Since there are no active streams,
2042 // the session will be closed.
2043 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2044 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2045
2046 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2047 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2048
2049 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2050 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2051}
2052
2053TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoOpenStreams) {
2054 InitializeConnectionMigrationTest(
2055 {kDefaultNetworkForTests, kNewNetworkForTests});
2056 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2057 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2058
2059 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2060 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0u);
2061 socket_factory_.AddSocketDataProvider(&socket_data);
2062
2063 // Create request and QuicHttpStream.
2064 QuicStreamRequest request(factory_.get());
2065 EXPECT_EQ(ERR_IO_PENDING,
2066 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562067 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2068 callback_.callback()));
jri7e636642016-01-14 06:57:082069 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422070 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:082071 EXPECT_TRUE(stream.get());
2072
2073 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502074 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:082075 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2076 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2077
2078 // Trigger connection migration. Since there are no active streams,
2079 // the session will be closed.
2080 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2081 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2082
2083 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2084 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2085
2086 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2087 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2088}
2089
jrid36ada62016-02-06 02:42:082090TEST_P(QuicStreamFactoryTest, MigrateSessionEarly) {
2091 InitializeConnectionMigrationTest(
2092 {kDefaultNetworkForTests, kNewNetworkForTests});
2093 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2094 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2095 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2096
2097 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:422098 std::unique_ptr<QuicEncryptedPacket> request_packet(
jrid36ada62016-02-06 02:42:082099 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true));
2100 MockWrite writes[] = {MockWrite(SYNCHRONOUS, request_packet->data(),
2101 request_packet->length(), 1)};
2102 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2103 arraysize(writes));
2104 socket_factory_.AddSocketDataProvider(&socket_data);
2105
2106 // Create request and QuicHttpStream.
2107 QuicStreamRequest request(factory_.get());
2108 EXPECT_EQ(ERR_IO_PENDING,
2109 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562110 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2111 callback_.callback()));
jrid36ada62016-02-06 02:42:082112 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422113 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jrid36ada62016-02-06 02:42:082114 EXPECT_TRUE(stream.get());
2115
2116 // Cause QUIC stream to be created.
2117 HttpRequestInfo request_info;
2118 request_info.method = "GET";
2119 request_info.url = GURL("https://www.example.org/");
2120 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2121 net_log_, CompletionCallback()));
2122
2123 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502124 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jrid36ada62016-02-06 02:42:082125 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2126 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2127
2128 // Send GET request on stream.
2129 HttpResponseInfo response;
2130 HttpRequestHeaders request_headers;
2131 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2132 callback_.callback()));
2133
2134 // Set up second socket data provider that is used after migration.
2135 // The response to the earlier request is read on this new socket.
danakjad1777e2016-04-16 00:56:422136 std::unique_ptr<QuicEncryptedPacket> ping(
alyssar2adf3ac2016-05-03 17:12:582137 client_maker_.MakePingPacket(2, /*include_version=*/true));
jrid36ada62016-02-06 02:42:082138 MockWrite writes1[] = {
2139 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 0)};
danakjad1777e2016-04-16 00:56:422140 std::unique_ptr<QuicEncryptedPacket> response_headers_packet(
jrid36ada62016-02-06 02:42:082141 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
2142 MockRead reads1[] = {MockRead(ASYNC, response_headers_packet->data(),
2143 response_headers_packet->length(), 1),
2144 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
2145 SequencedSocketData socket_data1(reads1, arraysize(reads1), writes1,
2146 arraysize(writes1));
2147 socket_factory_.AddSocketDataProvider(&socket_data1);
2148
2149 // Trigger early connection migration. This should cause a PING frame
2150 // to be emitted.
2151 session->OnPathDegrading();
2152
2153 // Run the message loop so that data queued in the new socket is read by the
2154 // packet reader.
2155 base::RunLoop().RunUntilIdle();
2156
2157 // The session should now be marked as going away. Ensure that
2158 // while it is still alive, it is no longer active.
2159 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2160 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2161 EXPECT_EQ(1u, session->GetNumActiveStreams());
2162
2163 // Verify that response headers on the migrated socket were delivered to the
2164 // stream.
2165 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
2166 EXPECT_EQ(200, response.headers->response_code());
2167
2168 // Create a new request for the same destination and verify that a
2169 // new session is created.
2170 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2171 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
2172 socket_factory_.AddSocketDataProvider(&socket_data2);
2173
2174 QuicStreamRequest request2(factory_.get());
2175 EXPECT_EQ(ERR_IO_PENDING,
2176 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562177 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2178 callback_.callback()));
jrid36ada62016-02-06 02:42:082179 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422180 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jrid36ada62016-02-06 02:42:082181 EXPECT_TRUE(stream2.get());
2182
bnc912a04b2016-04-20 14:19:502183 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2184 QuicChromiumClientSession* new_session = GetActiveSession(host_port_pair_);
jrid36ada62016-02-06 02:42:082185 EXPECT_NE(session, new_session);
2186
2187 // On a SOON_TO_DISCONNECT notification, nothing happens to the
2188 // migrated session, but the new session is closed since it has no
2189 // open streams.
2190 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2191 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
2192 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2193 EXPECT_EQ(1u, session->GetNumActiveStreams());
2194 EXPECT_FALSE(
2195 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), new_session));
2196
2197 // On a DISCONNECTED notification, nothing happens to the migrated session.
2198 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2199 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2200 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2201 EXPECT_EQ(1u, session->GetNumActiveStreams());
2202
2203 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2204 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2205 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
2206 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
2207 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2208 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2209}
2210
2211TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyNoNewNetwork) {
2212 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
2213 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2214 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2215
2216 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:582217 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
jrid36ada62016-02-06 02:42:082218 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
2219 MockWrite writes[] = {
2220 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
2221 };
2222 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2223 arraysize(writes));
2224 socket_factory_.AddSocketDataProvider(&socket_data);
2225
2226 // Create request and QuicHttpStream.
2227 QuicStreamRequest request(factory_.get());
2228 EXPECT_EQ(ERR_IO_PENDING,
2229 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562230 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2231 callback_.callback()));
jrid36ada62016-02-06 02:42:082232 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422233 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jrid36ada62016-02-06 02:42:082234 EXPECT_TRUE(stream.get());
2235
2236 // Cause QUIC stream to be created.
2237 HttpRequestInfo request_info;
2238 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2239 net_log_, CompletionCallback()));
2240
2241 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502242 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jrid36ada62016-02-06 02:42:082243 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2244 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2245
2246 // Trigger connection migration. Since there are no networks
2247 // to migrate to, this should cause session to be continue but be marked as
2248 // going away.
2249 session->OnPathDegrading();
2250
2251 // Run the message loop so that data queued in the new socket is read by the
2252 // packet reader.
2253 base::RunLoop().RunUntilIdle();
2254
2255 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2256 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2257 EXPECT_EQ(1u, session->GetNumActiveStreams());
2258
2259 stream.reset();
2260
2261 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2262 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2263}
2264
jri231c2972016-03-08 19:50:112265TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyNonMigratableStream) {
2266 InitializeConnectionMigrationTest(
2267 {kDefaultNetworkForTests, kNewNetworkForTests});
2268 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2269 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2270
2271 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:582272 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
jri231c2972016-03-08 19:50:112273 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
2274 MockWrite writes[] = {
2275 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
2276 };
2277 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2278 arraysize(writes));
2279 socket_factory_.AddSocketDataProvider(&socket_data);
2280
2281 // Create request and QuicHttpStream.
2282 QuicStreamRequest request(factory_.get());
2283 EXPECT_EQ(ERR_IO_PENDING,
2284 request.Request(host_port_pair_, privacy_mode_,
2285 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2286 callback_.callback()));
2287 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422288 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri231c2972016-03-08 19:50:112289 EXPECT_TRUE(stream.get());
2290
2291 // Cause QUIC stream to be created, but marked as non-migratable.
2292 HttpRequestInfo request_info;
2293 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION;
2294 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2295 net_log_, CompletionCallback()));
2296
2297 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502298 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:112299 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2300 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2301
2302 // Trigger connection migration. Since there is a non-migratable stream,
2303 // this should cause session to be continue without migrating.
2304 session->OnPathDegrading();
2305
2306 // Run the message loop so that data queued in the new socket is read by the
2307 // packet reader.
2308 base::RunLoop().RunUntilIdle();
2309
2310 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2311 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2312 EXPECT_EQ(1u, session->GetNumActiveStreams());
2313
2314 stream.reset();
2315
2316 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2317 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2318}
2319
jri9c541572016-03-29 17:51:482320TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyConnectionMigrationDisabled) {
2321 InitializeConnectionMigrationTest(
2322 {kDefaultNetworkForTests, kNewNetworkForTests});
2323 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2324 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2325
2326 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:582327 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
jri9c541572016-03-29 17:51:482328 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
2329 MockWrite writes[] = {
2330 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
2331 };
2332 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2333 arraysize(writes));
2334 socket_factory_.AddSocketDataProvider(&socket_data);
2335
2336 // Create request and QuicHttpStream.
2337 QuicStreamRequest request(factory_.get());
2338 EXPECT_EQ(ERR_IO_PENDING,
2339 request.Request(host_port_pair_, privacy_mode_,
2340 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2341 callback_.callback()));
2342 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422343 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri9c541572016-03-29 17:51:482344 EXPECT_TRUE(stream.get());
2345
2346 // Cause QUIC stream to be created.
2347 HttpRequestInfo request_info;
2348 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2349 net_log_, CompletionCallback()));
2350
2351 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502352 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:482353 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2354 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2355
2356 // Set session config to have connection migration disabled.
2357 QuicConfigPeer::SetReceivedDisableConnectionMigration(session->config());
2358 EXPECT_TRUE(session->config()->DisableConnectionMigration());
2359
2360 // Trigger connection migration. Since there is a non-migratable stream,
2361 // this should cause session to be continue without migrating.
2362 session->OnPathDegrading();
2363
2364 // Run the message loop so that data queued in the new socket is read by the
2365 // packet reader.
2366 base::RunLoop().RunUntilIdle();
2367
2368 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2369 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2370 EXPECT_EQ(1u, session->GetNumActiveStreams());
2371
2372 stream.reset();
2373
2374 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2375 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2376}
2377
rch02d87792015-09-09 09:05:532378TEST_P(QuicStreamFactoryTest, OnSSLConfigChanged) {
jri7046038f2015-10-22 00:29:262379 Initialize();
rch6faa4d42016-01-05 20:48:432380 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2381 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2382 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2383
mmenke651bae7f2015-12-18 21:26:452384 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:582385 std::unique_ptr<QuicEncryptedPacket> rst(ConstructClientRstPacket());
rch02d87792015-09-09 09:05:532386 std::vector<MockWrite> writes;
2387 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:452388 SequencedSocketData socket_data(reads, arraysize(reads),
2389 writes.empty() ? nullptr : &writes[0],
2390 writes.size());
rch02d87792015-09-09 09:05:532391 socket_factory_.AddSocketDataProvider(&socket_data);
rch02d87792015-09-09 09:05:532392
mmenke651bae7f2015-12-18 21:26:452393 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2394 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
rch02d87792015-09-09 09:05:532395 socket_factory_.AddSocketDataProvider(&socket_data2);
rch02d87792015-09-09 09:05:532396
jri7046038f2015-10-22 00:29:262397 QuicStreamRequest request(factory_.get());
rch02d87792015-09-09 09:05:532398 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562399 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562400 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2401 callback_.callback()));
rch02d87792015-09-09 09:05:532402
2403 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422404 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rch02d87792015-09-09 09:05:532405 HttpRequestInfo request_info;
2406 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2407 net_log_, CompletionCallback()));
2408
jri7046038f2015-10-22 00:29:262409 factory_->OnSSLConfigChanged();
rch02d87792015-09-09 09:05:532410 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
2411 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262412 EXPECT_FALSE(factory_->require_confirmation());
rch02d87792015-09-09 09:05:532413
2414 // Now attempting to request a stream to the same origin should create
2415 // a new session.
2416
jri7046038f2015-10-22 00:29:262417 QuicStreamRequest request2(factory_.get());
rch02d87792015-09-09 09:05:532418 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562419 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562420 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2421 callback_.callback()));
rch02d87792015-09-09 09:05:532422
2423 EXPECT_EQ(OK, callback_.WaitForResult());
xunjieli2608f9b2016-03-14 13:39:232424 stream = request2.CreateStream();
rch02d87792015-09-09 09:05:532425 stream.reset(); // Will reset stream 3.
2426
2427 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2428 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2429 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2430 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2431}
2432
[email protected]1e960032013-12-20 19:00:202433TEST_P(QuicStreamFactoryTest, OnCertAdded) {
jri7046038f2015-10-22 00:29:262434 Initialize();
rch6faa4d42016-01-05 20:48:432435 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2436 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2437 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2438
mmenke651bae7f2015-12-18 21:26:452439 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:582440 std::unique_ptr<QuicEncryptedPacket> rst(ConstructClientRstPacket());
[email protected]459a7402014-02-10 12:58:522441 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:312442 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:452443 SequencedSocketData socket_data(reads, arraysize(reads),
2444 writes.empty() ? nullptr : &writes[0],
2445 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:092446 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]d7d1e50b2013-11-25 22:08:092447
mmenke651bae7f2015-12-18 21:26:452448 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2449 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:092450 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]d7d1e50b2013-11-25 22:08:092451
jri7046038f2015-10-22 00:29:262452 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:592453 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562454 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562455 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2456 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092457
2458 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422459 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]d7d1e50b2013-11-25 22:08:092460 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:022461 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]d7d1e50b2013-11-25 22:08:092462 net_log_, CompletionCallback()));
2463
2464 // Add a cert and verify that stream saw the event.
jri7046038f2015-10-22 00:29:262465 factory_->OnCertAdded(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:092466 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
2467 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262468 EXPECT_FALSE(factory_->require_confirmation());
[email protected]d7d1e50b2013-11-25 22:08:092469
2470 // Now attempting to request a stream to the same origin should create
2471 // a new session.
2472
jri7046038f2015-10-22 00:29:262473 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:592474 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562475 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562476 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2477 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092478
2479 EXPECT_EQ(OK, callback_.WaitForResult());
xunjieli2608f9b2016-03-14 13:39:232480 stream = request2.CreateStream();
[email protected]d7d1e50b2013-11-25 22:08:092481 stream.reset(); // Will reset stream 3.
2482
rch37de576c2015-05-17 20:28:172483 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2484 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2485 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2486 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:092487}
2488
[email protected]1e960032013-12-20 19:00:202489TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
jri7046038f2015-10-22 00:29:262490 Initialize();
rch6faa4d42016-01-05 20:48:432491 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2492 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2493 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2494
mmenke651bae7f2015-12-18 21:26:452495 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
alyssar2adf3ac2016-05-03 17:12:582496 std::unique_ptr<QuicEncryptedPacket> rst(ConstructClientRstPacket());
[email protected]459a7402014-02-10 12:58:522497 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:312498 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:452499 SequencedSocketData socket_data(reads, arraysize(reads),
2500 writes.empty() ? nullptr : &writes[0],
2501 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:092502 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]d7d1e50b2013-11-25 22:08:092503
mmenke651bae7f2015-12-18 21:26:452504 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2505 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:092506 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]d7d1e50b2013-11-25 22:08:092507
jri7046038f2015-10-22 00:29:262508 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:592509 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562510 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562511 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2512 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092513
2514 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422515 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]d7d1e50b2013-11-25 22:08:092516 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:022517 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]d7d1e50b2013-11-25 22:08:092518 net_log_, CompletionCallback()));
2519
2520 // Change the CA cert and verify that stream saw the event.
jri7046038f2015-10-22 00:29:262521 factory_->OnCACertChanged(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:092522 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
2523 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262524 EXPECT_FALSE(factory_->require_confirmation());
[email protected]d7d1e50b2013-11-25 22:08:092525
2526 // Now attempting to request a stream to the same origin should create
2527 // a new session.
2528
jri7046038f2015-10-22 00:29:262529 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:592530 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562531 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562532 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2533 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092534
2535 EXPECT_EQ(OK, callback_.WaitForResult());
xunjieli2608f9b2016-03-14 13:39:232536 stream = request2.CreateStream();
[email protected]d7d1e50b2013-11-25 22:08:092537 stream.reset(); // Will reset stream 3.
2538
rch37de576c2015-05-17 20:28:172539 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2540 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2541 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2542 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:092543}
2544
[email protected]1e960032013-12-20 19:00:202545TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
jri7046038f2015-10-22 00:29:262546 Initialize();
rch6faa4d42016-01-05 20:48:432547
[email protected]6e12d702013-11-13 00:17:172548 vector<string> cannoncial_suffixes;
2549 cannoncial_suffixes.push_back(string(".c.youtube.com"));
2550 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]c49ff182013-09-28 08:33:262551
[email protected]6e12d702013-11-13 00:17:172552 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
2553 string r1_host_name("r1");
2554 string r2_host_name("r2");
2555 r1_host_name.append(cannoncial_suffixes[i]);
2556 r2_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:142557
[email protected]bf4ea2f2014-03-10 22:57:532558 HostPortPair host_port_pair1(r1_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:122559 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:262560 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rch1fe2eeb2015-10-26 14:45:572561 QuicServerId server_id1(host_port_pair1, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172562 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:372563 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:172564 EXPECT_FALSE(cached1->proof_valid());
2565 EXPECT_TRUE(cached1->source_address_token().empty());
2566
2567 // Mutate the cached1 to have different data.
2568 // TODO(rtenneti): mutate other members of CachedState.
2569 cached1->set_source_address_token(r1_host_name);
2570 cached1->SetProofValid();
2571
[email protected]bf4ea2f2014-03-10 22:57:532572 HostPortPair host_port_pair2(r2_host_name, 80);
rch1fe2eeb2015-10-26 14:45:572573 QuicServerId server_id2(host_port_pair2, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172574 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:372575 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:172576 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
2577 EXPECT_TRUE(cached2->proof_valid());
2578 }
[email protected]b70fdb792013-10-25 19:04:142579}
2580
[email protected]1e960032013-12-20 19:00:202581TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
jri7046038f2015-10-22 00:29:262582 Initialize();
[email protected]6e12d702013-11-13 00:17:172583 vector<string> cannoncial_suffixes;
2584 cannoncial_suffixes.push_back(string(".c.youtube.com"));
2585 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]b70fdb792013-10-25 19:04:142586
[email protected]6e12d702013-11-13 00:17:172587 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
2588 string r3_host_name("r3");
2589 string r4_host_name("r4");
2590 r3_host_name.append(cannoncial_suffixes[i]);
2591 r4_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:142592
[email protected]bf4ea2f2014-03-10 22:57:532593 HostPortPair host_port_pair1(r3_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:122594 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:262595 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rch1fe2eeb2015-10-26 14:45:572596 QuicServerId server_id1(host_port_pair1, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172597 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:372598 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:172599 EXPECT_FALSE(cached1->proof_valid());
2600 EXPECT_TRUE(cached1->source_address_token().empty());
2601
2602 // Mutate the cached1 to have different data.
2603 // TODO(rtenneti): mutate other members of CachedState.
2604 cached1->set_source_address_token(r3_host_name);
2605 cached1->SetProofInvalid();
2606
[email protected]bf4ea2f2014-03-10 22:57:532607 HostPortPair host_port_pair2(r4_host_name, 80);
rch1fe2eeb2015-10-26 14:45:572608 QuicServerId server_id2(host_port_pair2, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172609 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:372610 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:172611 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
2612 EXPECT_TRUE(cached2->source_address_token().empty());
2613 EXPECT_FALSE(cached2->proof_valid());
2614 }
[email protected]c49ff182013-09-28 08:33:262615}
2616
rtenneti14abd312015-02-06 21:56:012617TEST_P(QuicStreamFactoryTest, RacingConnections) {
jri7046038f2015-10-22 00:29:262618 disable_disk_cache_ = false;
2619 Initialize();
rch6faa4d42016-01-05 20:48:432620 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2621 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:262622
bnc359ed2a2016-04-29 20:43:452623 if (!enable_connection_racing_)
rtenneti14abd312015-02-06 21:56:012624 return;
jri7046038f2015-10-22 00:29:262625
2626 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneticcab42b2015-10-09 06:38:162627
mmenke651bae7f2015-12-18 21:26:452628 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2629 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti14abd312015-02-06 21:56:012630 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti14abd312015-02-06 21:56:012631
mmenke651bae7f2015-12-18 21:26:452632 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2633 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
rtenneti14abd312015-02-06 21:56:012634 socket_factory_.AddSocketDataProvider(&socket_data2);
rtenneti14abd312015-02-06 21:56:012635
rtenneticcab42b2015-10-09 06:38:162636 const AlternativeService alternative_service1(QUIC, host_port_pair_.host(),
2637 host_port_pair_.port());
2638 AlternativeServiceInfoVector alternative_service_info_vector;
2639 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
2640 alternative_service_info_vector.push_back(
rchdc7b9052016-03-17 20:51:502641 AlternativeServiceInfo(alternative_service1, expiration));
rtenneticcab42b2015-10-09 06:38:162642
zhongyi3d4a55e72016-04-22 20:36:462643 url::SchemeHostPort server("https", kDefaultServerHostName,
2644 kDefaultServerPort);
2645
rtenneticcab42b2015-10-09 06:38:162646 http_server_properties_.SetAlternativeServices(
zhongyi3d4a55e72016-04-22 20:36:462647 server, alternative_service_info_vector);
rtenneticcab42b2015-10-09 06:38:162648
rtenneti14abd312015-02-06 21:56:012649 crypto_client_stream_factory_.set_handshake_mode(
2650 MockCryptoClientStream::ZERO_RTT);
2651 host_resolver_.set_synchronous_mode(true);
2652 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2653 "192.168.0.1", "");
2654
jri7046038f2015-10-22 00:29:262655 QuicStreamRequest request(factory_.get());
rch1fe2eeb2015-10-26 14:45:572656 QuicServerId server_id(host_port_pair_, privacy_mode_);
rtenneti14abd312015-02-06 21:56:012657 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562658 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562659 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2660 callback_.callback()));
jri7046038f2015-10-22 00:29:262661 EXPECT_EQ(2u, QuicStreamFactoryPeer::GetNumberOfActiveJobs(factory_.get(),
2662 server_id));
rtenneti14abd312015-02-06 21:56:012663
2664 runner_->RunNextTask();
2665
danakjad1777e2016-04-16 00:56:422666 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rtenneti14abd312015-02-06 21:56:012667 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:172668 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2669 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
jri7046038f2015-10-22 00:29:262670 EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumberOfActiveJobs(factory_.get(),
2671 server_id));
rtenneti14abd312015-02-06 21:56:012672}
2673
rtenneti34dffe752015-02-24 23:27:322674TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) {
jri7046038f2015-10-22 00:29:262675 disable_disk_cache_ = true;
2676 Initialize();
rch6faa4d42016-01-05 20:48:432677 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2678 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2679
jri7046038f2015-10-22 00:29:262680 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti34dffe752015-02-24 23:27:322681
mmenke651bae7f2015-12-18 21:26:452682 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2683 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti34dffe752015-02-24 23:27:322684 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti34dffe752015-02-24 23:27:322685
2686 crypto_client_stream_factory_.set_handshake_mode(
2687 MockCryptoClientStream::ZERO_RTT);
2688 host_resolver_.set_synchronous_mode(true);
2689 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2690 "192.168.0.1", "");
2691
jri7046038f2015-10-22 00:29:262692 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562693 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562694 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2695 callback_.callback()));
rtenneti34dffe752015-02-24 23:27:322696
2697 // If we are waiting for disk cache, we would have posted a task. Verify that
2698 // the CancelWaitForDataReady task hasn't been posted.
2699 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
2700
danakjad1777e2016-04-16 00:56:422701 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rtenneti34dffe752015-02-24 23:27:322702 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:172703 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2704 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti34dffe752015-02-24 23:27:322705}
2706
rtenneti85dcfac22015-03-27 20:22:192707TEST_P(QuicStreamFactoryTest, BadPacketLoss) {
jri7046038f2015-10-22 00:29:262708 disable_disk_cache_ = false;
2709 max_number_of_lossy_connections_ = 2;
2710 Initialize();
rch6faa4d42016-01-05 20:48:432711 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2712 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2713 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2714 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2715 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2716
jri7046038f2015-10-22 00:29:262717 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2718
2719 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2720 host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192721 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262722 factory_.get(), host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192723
mmenke651bae7f2015-12-18 21:26:452724 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2725 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:192726 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti85dcfac22015-03-27 20:22:192727
mmenke651bae7f2015-12-18 21:26:452728 SequencedSocketData socket_data2(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:192729 socket_factory_.AddSocketDataProvider(&socket_data2);
rtenneti85dcfac22015-03-27 20:22:192730
mmenke651bae7f2015-12-18 21:26:452731 SequencedSocketData socket_data3(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:192732 socket_factory_.AddSocketDataProvider(&socket_data3);
rtenneti85dcfac22015-03-27 20:22:192733
mmenke651bae7f2015-12-18 21:26:452734 SequencedSocketData socket_data4(nullptr, 0, nullptr, 0);
rtenneti97137a92015-06-18 06:00:312735 socket_factory_.AddSocketDataProvider(&socket_data4);
rtenneti97137a92015-06-18 06:00:312736
rch6faa4d42016-01-05 20:48:432737 HostPortPair server2(kServer2HostName, kDefaultServerPort);
2738 HostPortPair server3(kServer3HostName, kDefaultServerPort);
2739 HostPortPair server4(kServer4HostName, kDefaultServerPort);
rtenneti85dcfac22015-03-27 20:22:192740
2741 crypto_client_stream_factory_.set_handshake_mode(
2742 MockCryptoClientStream::ZERO_RTT);
2743 host_resolver_.set_synchronous_mode(true);
2744 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2745 "192.168.0.1", "");
2746 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2747 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
rtenneti97137a92015-06-18 06:00:312748 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
rtenneti85dcfac22015-03-27 20:22:192749
jri7046038f2015-10-22 00:29:262750 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562751 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562752 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2753 callback_.callback()));
rtenneti85dcfac22015-03-27 20:22:192754
bnc912a04b2016-04-20 14:19:502755 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
rtenneti85dcfac22015-03-27 20:22:192756
2757 DVLOG(1) << "Create 1st session and test packet loss";
2758
2759 // Set packet_loss_rate to a lower value than packet_loss_threshold.
2760 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262761 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/0.9f));
rtenneti41633b1f2015-04-05 18:19:532762 EXPECT_TRUE(session->connection()->connected());
bnc912a04b2016-04-20 14:19:502763 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri7046038f2015-10-22 00:29:262764 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2765 host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192766 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262767 factory_.get(), host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192768
2769 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:312770 // and that shouldn't close the session and it shouldn't disable QUIC.
2771 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262772 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:192773 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262774 factory_.get(), host_port_pair_.port()));
rtenneti97137a92015-06-18 06:00:312775 EXPECT_TRUE(session->connection()->connected());
jri7046038f2015-10-22 00:29:262776 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2777 host_port_pair_.port()));
bnc912a04b2016-04-20 14:19:502778 EXPECT_TRUE(HasActiveSession(host_port_pair_));
rtenneti85dcfac22015-03-27 20:22:192779
2780 // Test N-in-a-row high packet loss connections.
2781
2782 DVLOG(1) << "Create 2nd session and test packet loss";
2783
2784 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262785 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562786 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
bncd2368ad2016-04-28 22:06:062787 /*cert_verify_flags=*/0, url2_, "GET",
2788 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:502789 QuicChromiumClientSession* session2 = GetActiveSession(server2);
rtenneti85dcfac22015-03-27 20:22:192790
2791 // If there is no packet loss during handshake confirmation, number of lossy
2792 // connections for the port should be 0.
2793 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262794 factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:192795 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262796 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/0.9f));
rtenneti85dcfac22015-03-27 20:22:192797 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262798 factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:192799 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262800 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:192801
2802 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:312803 // and that shouldn't close the session and it shouldn't disable QUIC.
2804 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262805 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:192806 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262807 factory_.get(), server2.port()));
rtenneti97137a92015-06-18 06:00:312808 EXPECT_TRUE(session2->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:192809 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262810 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
bnc912a04b2016-04-20 14:19:502811 EXPECT_TRUE(HasActiveSession(server2));
rtenneti85dcfac22015-03-27 20:22:192812
2813 DVLOG(1) << "Create 3rd session which also has packet loss";
2814
2815 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:262816 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:562817 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562818 /*cert_verify_flags=*/0, url3_, "GET",
rtennetia75df622015-06-21 23:59:502819 net_log_, callback3.callback()));
bnc912a04b2016-04-20 14:19:502820 QuicChromiumClientSession* session3 = GetActiveSession(server3);
rtenneti85dcfac22015-03-27 20:22:192821
rtenneti97137a92015-06-18 06:00:312822 DVLOG(1) << "Create 4th session with packet loss and test IsQuicDisabled()";
2823 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:262824 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:562825 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562826 /*cert_verify_flags=*/0, url4_, "GET",
rtennetia75df622015-06-21 23:59:502827 net_log_, callback4.callback()));
bnc912a04b2016-04-20 14:19:502828 QuicChromiumClientSession* session4 = GetActiveSession(server4);
rtenneti97137a92015-06-18 06:00:312829
rtenneti85dcfac22015-03-27 20:22:192830 // Set packet_loss_rate to higher value than packet_loss_threshold 2nd time in
2831 // a row and that should close the session and disable QUIC.
2832 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:262833 factory_->OnHandshakeConfirmed(session3, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:192834 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262835 factory_.get(), server3.port()));
rtenneti97137a92015-06-18 06:00:312836 EXPECT_FALSE(session3->connection()->connected());
jri7046038f2015-10-22 00:29:262837 EXPECT_TRUE(
2838 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server3.port()));
bnc912a04b2016-04-20 14:19:502839 EXPECT_FALSE(HasActiveSession(server3));
rtenneti85dcfac22015-03-27 20:22:192840
rtenneti97137a92015-06-18 06:00:312841 // Set packet_loss_rate to higher value than packet_loss_threshold 3rd time in
2842 // a row and IsQuicDisabled() should close the session.
2843 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:262844 factory_->OnHandshakeConfirmed(session4, /*packet_loss_rate=*/1.0f));
rtenneti97137a92015-06-18 06:00:312845 EXPECT_EQ(3, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262846 factory_.get(), server4.port()));
rtenneti97137a92015-06-18 06:00:312847 EXPECT_FALSE(session4->connection()->connected());
jri7046038f2015-10-22 00:29:262848 EXPECT_TRUE(
2849 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server4.port()));
bnc912a04b2016-04-20 14:19:502850 EXPECT_FALSE(HasActiveSession(server4));
rtenneti97137a92015-06-18 06:00:312851
danakjad1777e2016-04-16 00:56:422852 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rtenneti85dcfac22015-03-27 20:22:192853 EXPECT_TRUE(stream.get());
danakjad1777e2016-04-16 00:56:422854 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
rtenneti85dcfac22015-03-27 20:22:192855 EXPECT_TRUE(stream2.get());
danakjad1777e2016-04-16 00:56:422856 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
rtenneti85dcfac22015-03-27 20:22:192857 EXPECT_TRUE(stream3.get());
danakjad1777e2016-04-16 00:56:422858 std::unique_ptr<QuicHttpStream> stream4 = request4.CreateStream();
rtenneti97137a92015-06-18 06:00:312859 EXPECT_TRUE(stream4.get());
rch37de576c2015-05-17 20:28:172860 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2861 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2862 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2863 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2864 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2865 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
rtenneti97137a92015-06-18 06:00:312866 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
2867 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
rtenneti85dcfac22015-03-27 20:22:192868}
2869
ckrasic1e53b642015-07-08 22:39:352870TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfTwo) {
jri7046038f2015-10-22 00:29:262871 disable_disk_cache_ = false;
2872 threshold_public_resets_post_handshake_ = 2;
2873 Initialize();
rch6faa4d42016-01-05 20:48:432874 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2875 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2876 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:262877 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2878
2879 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2880 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352881 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262882 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352883
mmenke651bae7f2015-12-18 21:26:452884 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2885 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352886 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:352887
mmenke651bae7f2015-12-18 21:26:452888 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352889 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:352890
rch6faa4d42016-01-05 20:48:432891 HostPortPair server2(kServer2HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:352892
2893 crypto_client_stream_factory_.set_handshake_mode(
2894 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2895 host_resolver_.set_synchronous_mode(true);
2896 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2897 "192.168.0.1", "");
2898 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2899
jri7046038f2015-10-22 00:29:262900 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562901 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562902 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2903 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:352904
bnc912a04b2016-04-20 14:19:502905 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352906
2907 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
jri78ec06a2016-03-31 18:19:402908 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
2909 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:352910 // Need to spin the loop now to ensure that
2911 // QuicStreamFactory::OnSessionClosed() runs.
2912 base::RunLoop run_loop;
2913 run_loop.RunUntilIdle();
2914
jri7046038f2015-10-22 00:29:262915 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2916 factory_.get()));
2917 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2918 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352919
2920 // Test two-in-a-row public reset post handshakes..
2921 DVLOG(1) << "Create 2nd session and trigger public reset post handshake";
2922 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262923 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562924 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562925 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:352926 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:502927 QuicChromiumClientSession* session2 = GetActiveSession(server2);
ckrasic1e53b642015-07-08 22:39:352928
jri78ec06a2016-03-31 18:19:402929 session2->connection()->CloseConnection(
2930 QUIC_PUBLIC_RESET, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:352931 // Need to spin the loop now to ensure that
2932 // QuicStreamFactory::OnSessionClosed() runs.
2933 base::RunLoop run_loop2;
2934 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262935 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2936 factory_.get()));
2937 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2938 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:162939 EXPECT_EQ(
2940 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
jri7046038f2015-10-22 00:29:262941 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352942
danakjad1777e2016-04-16 00:56:422943 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
xunjieli2608f9b2016-03-14 13:39:232944 EXPECT_FALSE(stream.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:422945 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
xunjieli2608f9b2016-03-14 13:39:232946 EXPECT_FALSE(stream2.get()); // Session is already closed.
ckrasic1e53b642015-07-08 22:39:352947 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2948 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2949 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2950 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2951}
2952
2953TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfTwo) {
jri7046038f2015-10-22 00:29:262954 disable_disk_cache_ = true;
2955 threshold_timeouts_with_open_streams_ = 2;
2956 Initialize();
rch6faa4d42016-01-05 20:48:432957 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2958 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2959 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:262960
2961 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2962 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2963 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352964 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262965 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352966
mmenke651bae7f2015-12-18 21:26:452967 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2968 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352969 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:352970
mmenke651bae7f2015-12-18 21:26:452971 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352972 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:352973
rch6faa4d42016-01-05 20:48:432974 HostPortPair server2(kServer2HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:352975
2976 crypto_client_stream_factory_.set_handshake_mode(
2977 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2978 host_resolver_.set_synchronous_mode(true);
2979 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2980 "192.168.0.1", "");
2981 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2982
jri7046038f2015-10-22 00:29:262983 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562984 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562985 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2986 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:352987
bnc912a04b2016-04-20 14:19:502988 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352989
danakjad1777e2016-04-16 00:56:422990 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
ckrasic1e53b642015-07-08 22:39:352991 EXPECT_TRUE(stream.get());
2992 HttpRequestInfo request_info;
2993 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2994 net_log_, CompletionCallback()));
2995
2996 DVLOG(1)
2997 << "Created 1st session and initialized a stream. Now trigger timeout";
jri78ec06a2016-03-31 18:19:402998 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
2999 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353000 // Need to spin the loop now to ensure that
3001 // QuicStreamFactory::OnSessionClosed() runs.
3002 base::RunLoop run_loop;
3003 run_loop.RunUntilIdle();
3004
jri7046038f2015-10-22 00:29:263005 EXPECT_EQ(
3006 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3007 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3008 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353009
3010 // Test two-in-a-row timeouts with open streams.
3011 DVLOG(1) << "Create 2nd session and timeout with open stream";
3012 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263013 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563014 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563015 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353016 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:503017 QuicChromiumClientSession* session2 = GetActiveSession(server2);
ckrasic1e53b642015-07-08 22:39:353018
danakjad1777e2016-04-16 00:56:423019 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
ckrasic1e53b642015-07-08 22:39:353020 EXPECT_TRUE(stream2.get());
3021 EXPECT_EQ(OK, stream2->InitializeStream(&request_info, DEFAULT_PRIORITY,
3022 net_log_, CompletionCallback()));
3023
jri78ec06a2016-03-31 18:19:403024 session2->connection()->CloseConnection(
3025 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353026 // Need to spin the loop now to ensure that
3027 // QuicStreamFactory::OnSessionClosed() runs.
3028 base::RunLoop run_loop2;
3029 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263030 EXPECT_EQ(
3031 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3032 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3033 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:163034 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
jri7046038f2015-10-22 00:29:263035 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353036
rchcee7beb2016-03-11 06:16:143037 // Verify that QUIC is un-disabled after a TCP job fails.
3038 factory_->OnTcpJobCompleted(/*succeeded=*/false);
3039 EXPECT_EQ(
3040 0, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3041 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3042 host_port_pair_.port()));
3043
ckrasic1e53b642015-07-08 22:39:353044 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3045 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3046 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3047 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3048}
3049
3050TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfThree) {
jri7046038f2015-10-22 00:29:263051 disable_disk_cache_ = true;
3052 threshold_public_resets_post_handshake_ = 2;
3053 Initialize();
rch6faa4d42016-01-05 20:48:433054 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3055 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3056 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3057 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263058
3059 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3060 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353061 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263062 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353063
mmenke651bae7f2015-12-18 21:26:453064 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3065 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353066 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353067
mmenke651bae7f2015-12-18 21:26:453068 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353069 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353070
mmenke651bae7f2015-12-18 21:26:453071 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353072 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:353073
rch6faa4d42016-01-05 20:48:433074 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3075 HostPortPair server3(kServer3HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353076
3077 crypto_client_stream_factory_.set_handshake_mode(
3078 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3079 host_resolver_.set_synchronous_mode(true);
3080 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3081 "192.168.0.1", "");
3082 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3083 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3084
3085 // Test first and third out of three public reset post handshakes.
jri7046038f2015-10-22 00:29:263086 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563087 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563088 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3089 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353090
bnc912a04b2016-04-20 14:19:503091 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353092
3093 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
jri78ec06a2016-03-31 18:19:403094 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
3095 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353096 // Need to spin the loop now to ensure that
3097 // QuicStreamFactory::OnSessionClosed() runs.
3098 base::RunLoop run_loop;
3099 run_loop.RunUntilIdle();
3100
jri7046038f2015-10-22 00:29:263101 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3102 factory_.get()));
3103 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3104 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353105
3106 DVLOG(1) << "Create 2nd session without disable trigger";
3107 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263108 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563109 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563110 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353111 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:503112 QuicChromiumClientSession* session2 = GetActiveSession(server2);
ckrasic1e53b642015-07-08 22:39:353113
jri78ec06a2016-03-31 18:19:403114 session2->connection()->CloseConnection(
3115 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353116 // Need to spin the loop now to ensure that
3117 // QuicStreamFactory::OnSessionClosed() runs.
3118 base::RunLoop run_loop2;
3119 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263120 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3121 factory_.get()));
3122 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3123 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353124
3125 DVLOG(1) << "Create 3rd session with public reset post handshake,"
3126 << " will disable QUIC";
3127 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263128 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563129 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
bncd2368ad2016-04-28 22:06:063130 /*cert_verify_flags=*/0, url3_, "GET",
ckrasic1e53b642015-07-08 22:39:353131 net_log_, callback3.callback()));
bnc912a04b2016-04-20 14:19:503132 QuicChromiumClientSession* session3 = GetActiveSession(server3);
ckrasic1e53b642015-07-08 22:39:353133
jri78ec06a2016-03-31 18:19:403134 session3->connection()->CloseConnection(
3135 QUIC_PUBLIC_RESET, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353136 // Need to spin the loop now to ensure that
3137 // QuicStreamFactory::OnSessionClosed() runs.
3138 base::RunLoop run_loop3;
3139 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:263140 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3141 factory_.get()));
3142 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3143 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:163144 EXPECT_EQ(
3145 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
jri7046038f2015-10-22 00:29:263146 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353147
danakjad1777e2016-04-16 00:56:423148 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233149 EXPECT_FALSE(stream.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423150 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233151 EXPECT_FALSE(stream2.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423152 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233153 EXPECT_FALSE(stream3.get()); // Session is already closed.
ckrasic1e53b642015-07-08 22:39:353154
3155 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3156 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3157 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3158 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3159 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3160 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3161}
3162
3163TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfThree) {
jri7046038f2015-10-22 00:29:263164 disable_disk_cache_ = true;
3165 threshold_public_resets_post_handshake_ = 2;
3166 Initialize();
rch6faa4d42016-01-05 20:48:433167 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3168 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3169 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3170 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263171 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3172
3173 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3174 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353175 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263176 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353177
mmenke651bae7f2015-12-18 21:26:453178 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3179 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353180 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353181
mmenke651bae7f2015-12-18 21:26:453182 // SequencedSocketData socket_data2(nullptr, 0, nullptr, 0);
3183 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353184 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353185
mmenke651bae7f2015-12-18 21:26:453186 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353187 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:353188
rch6faa4d42016-01-05 20:48:433189 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3190 HostPortPair server3(kServer3HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353191
3192 crypto_client_stream_factory_.set_handshake_mode(
3193 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3194 host_resolver_.set_synchronous_mode(true);
3195 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3196 "192.168.0.1", "");
3197 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3198 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3199
3200 // Test first and third out of three timeouts with open streams.
jri7046038f2015-10-22 00:29:263201 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563202 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563203 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3204 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353205
bnc912a04b2016-04-20 14:19:503206 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353207
danakjad1777e2016-04-16 00:56:423208 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
ckrasic1e53b642015-07-08 22:39:353209 EXPECT_TRUE(stream.get());
3210 HttpRequestInfo request_info;
3211 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3212 net_log_, CompletionCallback()));
3213
3214 DVLOG(1)
3215 << "Created 1st session and initialized a stream. Now trigger timeout";
jri78ec06a2016-03-31 18:19:403216 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
3217 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353218 // Need to spin the loop now to ensure that
3219 // QuicStreamFactory::OnSessionClosed() runs.
3220 base::RunLoop run_loop;
3221 run_loop.RunUntilIdle();
3222
jri7046038f2015-10-22 00:29:263223 EXPECT_EQ(
3224 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3225 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3226 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353227
3228 // Test two-in-a-row timeouts with open streams.
3229 DVLOG(1) << "Create 2nd session without timeout";
3230 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263231 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563232 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563233 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353234 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:503235 QuicChromiumClientSession* session2 = GetActiveSession(server2);
ckrasic1e53b642015-07-08 22:39:353236
jri78ec06a2016-03-31 18:19:403237 session2->connection()->CloseConnection(
3238 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353239 // Need to spin the loop now to ensure that
3240 // QuicStreamFactory::OnSessionClosed() runs.
3241 base::RunLoop run_loop2;
3242 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263243 EXPECT_EQ(
3244 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3245 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3246 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353247
3248 DVLOG(1) << "Create 3rd session with timeout with open streams,"
3249 << " will disable QUIC";
3250
3251 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263252 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563253 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563254 /*cert_verify_flags=*/0, url3_, "GET",
ckrasic1e53b642015-07-08 22:39:353255 net_log_, callback3.callback()));
bnc912a04b2016-04-20 14:19:503256 QuicChromiumClientSession* session3 = GetActiveSession(server3);
ckrasic1e53b642015-07-08 22:39:353257
danakjad1777e2016-04-16 00:56:423258 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
ckrasic1e53b642015-07-08 22:39:353259 EXPECT_TRUE(stream3.get());
3260 EXPECT_EQ(OK, stream3->InitializeStream(&request_info, DEFAULT_PRIORITY,
3261 net_log_, CompletionCallback()));
jri78ec06a2016-03-31 18:19:403262 session3->connection()->CloseConnection(
3263 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353264 // Need to spin the loop now to ensure that
3265 // QuicStreamFactory::OnSessionClosed() runs.
3266 base::RunLoop run_loop3;
3267 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:263268 EXPECT_EQ(
3269 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3270 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3271 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:163272 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
jri7046038f2015-10-22 00:29:263273 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353274
danakjad1777e2016-04-16 00:56:423275 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233276 EXPECT_FALSE(stream2.get()); // Session is already closed.
rchcee7beb2016-03-11 06:16:143277
3278 // Verify that QUIC is un-disabled after a network change.
3279 factory_->OnIPAddressChanged();
3280 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3281 host_port_pair_.port()));
3282 EXPECT_EQ(
3283 0, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3284
ckrasic1e53b642015-07-08 22:39:353285 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3286 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3287 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3288 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3289 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3290 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3291}
3292
zhongyi89649c32016-01-22 00:14:013293TEST_P(QuicStreamFactoryTest, DisableQuicWhenTimeoutsWithOpenStreams) {
3294 disable_disk_cache_ = true;
3295 disable_quic_on_timeout_with_open_streams_ = true;
3296 Initialize();
3297 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3298 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3299 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3300
3301 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3302 host_port_pair_.port()));
3303 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
3304 factory_.get(), host_port_pair_.port()));
3305
3306 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3307 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
3308 socket_factory_.AddSocketDataProvider(&socket_data);
3309
3310 crypto_client_stream_factory_.set_handshake_mode(
3311 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3312 host_resolver_.set_synchronous_mode(true);
3313 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3314 "192.168.0.1", "");
3315
3316 // Test first timeouts with open streams will disable QUIC.
3317 QuicStreamRequest request(factory_.get());
3318 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563319 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3320 callback_.callback()));
zhongyi89649c32016-01-22 00:14:013321
bnc912a04b2016-04-20 14:19:503322 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
zhongyi89649c32016-01-22 00:14:013323
danakjad1777e2016-04-16 00:56:423324 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
zhongyi89649c32016-01-22 00:14:013325 EXPECT_TRUE(stream.get());
3326 HttpRequestInfo request_info;
3327 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3328 net_log_, CompletionCallback()));
3329
3330 DVLOG(1)
3331 << "Created 1st session and initialized a stream. Now trigger timeout."
3332 << "Will disable QUIC.";
jri78ec06a2016-03-31 18:19:403333 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
3334 ConnectionCloseBehavior::SILENT_CLOSE);
zhongyi89649c32016-01-22 00:14:013335 // Need to spin the loop now to ensure that
3336 // QuicStreamFactory::OnSessionClosed() runs.
3337 base::RunLoop run_loop;
3338 run_loop.RunUntilIdle();
3339
3340 EXPECT_EQ(
3341 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3342 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3343 host_port_pair_.port()));
3344
3345 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
3346 factory_->QuicDisabledReason(host_port_pair_.port()));
3347
rchcee7beb2016-03-11 06:16:143348 // Verify that QUIC is fully disabled after a TCP job succeeds.
3349 factory_->OnTcpJobCompleted(/*succeeded=*/true);
3350 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3351 host_port_pair_.port()));
3352
3353 // Verify that QUIC stays disabled after a TCP job succeeds.
3354 factory_->OnTcpJobCompleted(/*succeeded=*/false);
3355 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3356 host_port_pair_.port()));
3357
zhongyi89649c32016-01-22 00:14:013358 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3359 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3360}
3361
ckrasic1e53b642015-07-08 22:39:353362TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfFour) {
jri7046038f2015-10-22 00:29:263363 disable_disk_cache_ = true;
3364 threshold_public_resets_post_handshake_ = 2;
3365 Initialize();
rch6faa4d42016-01-05 20:48:433366 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3367 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3368 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3369 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3370 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263371 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3372
3373 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3374 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353375 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263376 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353377
mmenke651bae7f2015-12-18 21:26:453378 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3379 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353380 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353381
mmenke651bae7f2015-12-18 21:26:453382 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353383 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353384
mmenke651bae7f2015-12-18 21:26:453385 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353386 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:353387
mmenke651bae7f2015-12-18 21:26:453388 SequencedSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353389 socket_factory_.AddSocketDataProvider(&socket_data4);
ckrasic1e53b642015-07-08 22:39:353390
rch6faa4d42016-01-05 20:48:433391 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3392 HostPortPair server3(kServer3HostName, kDefaultServerPort);
3393 HostPortPair server4(kServer4HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353394
3395 crypto_client_stream_factory_.set_handshake_mode(
3396 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3397 host_resolver_.set_synchronous_mode(true);
3398 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3399 "192.168.0.1", "");
3400 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3401 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3402 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
3403
3404 // Test first and fourth out of four public reset post handshakes.
jri7046038f2015-10-22 00:29:263405 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563406 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563407 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3408 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353409
bnc912a04b2016-04-20 14:19:503410 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353411
3412 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
jri78ec06a2016-03-31 18:19:403413 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
3414 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353415 // Need to spin the loop now to ensure that
3416 // QuicStreamFactory::OnSessionClosed() runs.
3417 base::RunLoop run_loop;
3418 run_loop.RunUntilIdle();
3419
jri7046038f2015-10-22 00:29:263420 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3421 factory_.get()));
3422 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3423 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353424
3425 DVLOG(1) << "Create 2nd and 3rd sessions without disable trigger";
3426 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263427 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563428 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563429 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353430 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:503431 QuicChromiumClientSession* session2 = GetActiveSession(server2);
ckrasic1e53b642015-07-08 22:39:353432
jri78ec06a2016-03-31 18:19:403433 session2->connection()->CloseConnection(
3434 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353435 // Need to spin the loop now to ensure that
3436 // QuicStreamFactory::OnSessionClosed() runs.
3437 base::RunLoop run_loop2;
3438 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263439 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3440 factory_.get()));
3441 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3442 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353443
3444 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263445 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563446 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563447 /*cert_verify_flags=*/0, url3_, "GET",
ckrasic1e53b642015-07-08 22:39:353448 net_log_, callback3.callback()));
bnc912a04b2016-04-20 14:19:503449 QuicChromiumClientSession* session3 = GetActiveSession(server3);
ckrasic1e53b642015-07-08 22:39:353450
jri78ec06a2016-03-31 18:19:403451 session3->connection()->CloseConnection(
3452 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353453 // Need to spin the loop now to ensure that
3454 // QuicStreamFactory::OnSessionClosed() runs.
3455 base::RunLoop run_loop3;
3456 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:263457 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3458 factory_.get()));
3459 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3460 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353461
3462 DVLOG(1) << "Create 4rd session with public reset post handshake,"
3463 << " will not disable QUIC";
3464 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:263465 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:563466 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563467 /*cert_verify_flags=*/0, url4_, "GET",
ckrasic1e53b642015-07-08 22:39:353468 net_log_, callback4.callback()));
bnc912a04b2016-04-20 14:19:503469 QuicChromiumClientSession* session4 = GetActiveSession(server4);
ckrasic1e53b642015-07-08 22:39:353470
jri78ec06a2016-03-31 18:19:403471 session4->connection()->CloseConnection(
3472 QUIC_PUBLIC_RESET, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353473 // Need to spin the loop now to ensure that
3474 // QuicStreamFactory::OnSessionClosed() runs.
3475 base::RunLoop run_loop4;
3476 run_loop4.RunUntilIdle();
jri7046038f2015-10-22 00:29:263477 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3478 factory_.get()));
3479 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3480 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353481
danakjad1777e2016-04-16 00:56:423482 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233483 EXPECT_FALSE(stream.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423484 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233485 EXPECT_FALSE(stream2.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423486 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233487 EXPECT_FALSE(stream3.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423488 std::unique_ptr<QuicHttpStream> stream4 = request4.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233489 EXPECT_FALSE(stream4.get()); // Session is already closed.
ckrasic1e53b642015-07-08 22:39:353490
3491 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3492 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3493 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3494 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3495 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3496 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3497 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
3498 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
3499}
3500
3501TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfFour) {
jri7046038f2015-10-22 00:29:263502 disable_disk_cache_ = true;
3503 threshold_public_resets_post_handshake_ = 2;
3504 Initialize();
rch6faa4d42016-01-05 20:48:433505 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3506 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3507 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3508 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3509 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263510 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3511
3512 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3513 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353514 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263515 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353516
mmenke651bae7f2015-12-18 21:26:453517 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3518 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353519 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353520
mmenke651bae7f2015-12-18 21:26:453521 // SequencedSocketData socket_data2(nullptr, 0, nullptr, 0);
3522 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353523 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353524
mmenke651bae7f2015-12-18 21:26:453525 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353526 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:353527
mmenke651bae7f2015-12-18 21:26:453528 SequencedSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353529 socket_factory_.AddSocketDataProvider(&socket_data4);
ckrasic1e53b642015-07-08 22:39:353530
rch6faa4d42016-01-05 20:48:433531 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3532 HostPortPair server3(kServer3HostName, kDefaultServerPort);
3533 HostPortPair server4(kServer4HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353534
3535 crypto_client_stream_factory_.set_handshake_mode(
3536 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3537 host_resolver_.set_synchronous_mode(true);
3538 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3539 "192.168.0.1", "");
3540 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3541 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3542 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
3543
3544 // Test first and fourth out of three timeouts with open streams.
jri7046038f2015-10-22 00:29:263545 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563546 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563547 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3548 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353549
bnc912a04b2016-04-20 14:19:503550 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353551
danakjad1777e2016-04-16 00:56:423552 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
ckrasic1e53b642015-07-08 22:39:353553 EXPECT_TRUE(stream.get());
3554 HttpRequestInfo request_info;
3555 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3556 net_log_, CompletionCallback()));
3557
3558 DVLOG(1)
3559 << "Created 1st session and initialized a stream. Now trigger timeout";
jri78ec06a2016-03-31 18:19:403560 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
3561 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353562 // Need to spin the loop now to ensure that
3563 // QuicStreamFactory::OnSessionClosed() runs.
3564 base::RunLoop run_loop;
3565 run_loop.RunUntilIdle();
3566
jri7046038f2015-10-22 00:29:263567 EXPECT_EQ(
3568 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3569 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3570 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353571
3572 DVLOG(1) << "Create 2nd and 3rd sessions without timeout";
3573 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263574 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563575 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563576 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353577 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:503578 QuicChromiumClientSession* session2 = GetActiveSession(server2);
ckrasic1e53b642015-07-08 22:39:353579
jri78ec06a2016-03-31 18:19:403580 session2->connection()->CloseConnection(
3581 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353582 // Need to spin the loop now to ensure that
3583 // QuicStreamFactory::OnSessionClosed() runs.
3584 base::RunLoop run_loop2;
3585 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263586 EXPECT_EQ(
3587 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3588 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3589 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353590
3591 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263592 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563593 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563594 /*cert_verify_flags=*/0, url3_, "GET",
ckrasic1e53b642015-07-08 22:39:353595 net_log_, callback3.callback()));
bnc912a04b2016-04-20 14:19:503596 QuicChromiumClientSession* session3 = GetActiveSession(server3);
ckrasic1e53b642015-07-08 22:39:353597
jri78ec06a2016-03-31 18:19:403598 session3->connection()->CloseConnection(
3599 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353600 // Need to spin the loop now to ensure that
3601 // QuicStreamFactory::OnSessionClosed() runs.
3602 base::RunLoop run_loop3;
3603 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:263604 EXPECT_EQ(
3605 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3606 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3607 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353608
3609 DVLOG(1) << "Create 4th session with timeout with open streams,"
3610 << " will not disable QUIC";
3611
3612 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:263613 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:563614 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563615 /*cert_verify_flags=*/0, url4_, "GET",
ckrasic1e53b642015-07-08 22:39:353616 net_log_, callback4.callback()));
bnc912a04b2016-04-20 14:19:503617 QuicChromiumClientSession* session4 = GetActiveSession(server4);
ckrasic1e53b642015-07-08 22:39:353618
danakjad1777e2016-04-16 00:56:423619 std::unique_ptr<QuicHttpStream> stream4 = request4.CreateStream();
ckrasic1e53b642015-07-08 22:39:353620 EXPECT_TRUE(stream4.get());
3621 EXPECT_EQ(OK, stream4->InitializeStream(&request_info, DEFAULT_PRIORITY,
3622 net_log_, CompletionCallback()));
jri78ec06a2016-03-31 18:19:403623 session4->connection()->CloseConnection(
3624 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353625 // Need to spin the loop now to ensure that
3626 // QuicStreamFactory::OnSessionClosed() runs.
3627 base::RunLoop run_loop4;
3628 run_loop4.RunUntilIdle();
jri7046038f2015-10-22 00:29:263629 EXPECT_EQ(
3630 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3631 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3632 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353633
danakjad1777e2016-04-16 00:56:423634 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233635 EXPECT_FALSE(stream2.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423636 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233637 EXPECT_FALSE(stream3.get()); // Session is already closed.
rchcee7beb2016-03-11 06:16:143638
ckrasic1e53b642015-07-08 22:39:353639 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3640 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3641 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3642 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3643 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3644 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3645 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
3646 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
3647}
3648
rtenneti8332ba52015-09-17 19:33:413649TEST_P(QuicStreamFactoryTest, EnableDelayTcpRace) {
jri7046038f2015-10-22 00:29:263650 Initialize();
rch6faa4d42016-01-05 20:48:433651 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3652 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
mmenke651bae7f2015-12-18 21:26:453653 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3654 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti8332ba52015-09-17 19:33:413655 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti8332ba52015-09-17 19:33:413656
rtenneti8332ba52015-09-17 19:33:413657 ServerNetworkStats stats1;
3658 stats1.srtt = base::TimeDelta::FromMicroseconds(10);
zhongyi3d4a55e72016-04-22 20:36:463659 url::SchemeHostPort server("https", kDefaultServerHostName,
3660 kDefaultServerPort);
3661 http_server_properties_.SetServerNetworkStats(server, stats1);
rtenneti8332ba52015-09-17 19:33:413662
3663 crypto_client_stream_factory_.set_handshake_mode(
3664 MockCryptoClientStream::ZERO_RTT);
3665 host_resolver_.set_synchronous_mode(true);
3666 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3667 "192.168.0.1", "");
3668
jri7046038f2015-10-22 00:29:263669 QuicStreamRequest request(factory_.get());
rtenneti8332ba52015-09-17 19:33:413670 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:563671 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563672 /*cert_verify_flags=*/0, url_, "POST", net_log_,
3673 callback_.callback()));
rtenneti8332ba52015-09-17 19:33:413674
rtenneti8332ba52015-09-17 19:33:413675 EXPECT_EQ(base::TimeDelta::FromMicroseconds(15),
3676 request.GetTimeDelayForWaitingJob());
3677
3678 // Confirm the handshake and verify that the stream is created.
3679 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
3680 QuicSession::HANDSHAKE_CONFIRMED);
3681
3682 EXPECT_EQ(OK, callback_.WaitForResult());
3683
danakjad1777e2016-04-16 00:56:423684 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rtenneti8332ba52015-09-17 19:33:413685 EXPECT_TRUE(stream.get());
3686 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3687 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti8332ba52015-09-17 19:33:413688}
3689
rtenneticd2aaa15b2015-10-10 20:29:333690TEST_P(QuicStreamFactoryTest, MaybeInitialize) {
rtenneti41c09992015-11-30 18:24:013691 idle_connection_timeout_seconds_ = 500;
jri7046038f2015-10-22 00:29:263692 Initialize();
rch6faa4d42016-01-05 20:48:433693 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3694 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rtenneti41c09992015-11-30 18:24:013695 const QuicConfig* config = QuicStreamFactoryPeer::GetConfig(factory_.get());
3696 EXPECT_EQ(500, config->IdleConnectionStateLifetime().ToSeconds());
3697
jri7046038f2015-10-22 00:29:263698 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti8a80a6dc2015-09-21 19:51:133699
rtenneti8a80a6dc2015-09-21 19:51:133700 const AlternativeService alternative_service1(QUIC, host_port_pair_.host(),
3701 host_port_pair_.port());
3702 AlternativeServiceInfoVector alternative_service_info_vector;
3703 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
3704 alternative_service_info_vector.push_back(
rchdc7b9052016-03-17 20:51:503705 AlternativeServiceInfo(alternative_service1, expiration));
zhongyi3d4a55e72016-04-22 20:36:463706 url::SchemeHostPort server("https", kDefaultServerHostName,
3707 kDefaultServerPort);
rtenneticcab42b2015-10-09 06:38:163708 http_server_properties_.SetAlternativeServices(
zhongyi3d4a55e72016-04-22 20:36:463709 server, alternative_service_info_vector);
rtennetiee679d52016-04-06 17:01:133710
3711 HostPortPair host_port_pair2(kServer2HostName, kDefaultServerPort);
zhongyi3d4a55e72016-04-22 20:36:463712 url::SchemeHostPort server2("https", kServer2HostName, kDefaultServerPort);
rtennetiee679d52016-04-06 17:01:133713 const AlternativeService alternative_service2(QUIC, host_port_pair2.host(),
3714 host_port_pair2.port());
3715 AlternativeServiceInfoVector alternative_service_info_vector2;
3716 alternative_service_info_vector2.push_back(
3717 AlternativeServiceInfo(alternative_service2, expiration));
3718 http_server_properties_.SetAlternativeServices(
zhongyi3d4a55e72016-04-22 20:36:463719 server2, alternative_service_info_vector2);
rtennetiee679d52016-04-06 17:01:133720
rtenneti6971c172016-01-15 20:12:103721 http_server_properties_.SetMaxServerConfigsStoredInProperties(
3722 kMaxQuicServersToPersist);
rtenneti8a80a6dc2015-09-21 19:51:133723
rch6faa4d42016-01-05 20:48:433724 QuicServerId quic_server_id(kDefaultServerHostName, 80,
3725 PRIVACY_MODE_DISABLED);
rtenneticd2aaa15b2015-10-10 20:29:333726 QuicServerInfoFactory* quic_server_info_factory =
3727 new PropertiesBasedQuicServerInfoFactory(
3728 http_server_properties_.GetWeakPtr());
jri7046038f2015-10-22 00:29:263729 factory_->set_quic_server_info_factory(quic_server_info_factory);
rtenneticd2aaa15b2015-10-10 20:29:333730
danakjad1777e2016-04-16 00:56:423731 std::unique_ptr<QuicServerInfo> quic_server_info(
rtenneticd2aaa15b2015-10-10 20:29:333732 quic_server_info_factory->GetForServer(quic_server_id));
3733
3734 // Update quic_server_info's server_config and persist it.
3735 QuicServerInfo::State* state = quic_server_info->mutable_state();
3736 // Minimum SCFG that passes config validation checks.
3737 const char scfg[] = {// SCFG
3738 0x53, 0x43, 0x46, 0x47,
3739 // num entries
3740 0x01, 0x00,
3741 // padding
3742 0x00, 0x00,
3743 // EXPY
3744 0x45, 0x58, 0x50, 0x59,
3745 // EXPY end offset
3746 0x08, 0x00, 0x00, 0x00,
3747 // Value
3748 '1', '2', '3', '4', '5', '6', '7', '8'};
3749
3750 // Create temporary strings becasue Persist() clears string data in |state|.
3751 string server_config(reinterpret_cast<const char*>(&scfg), sizeof(scfg));
3752 string source_address_token("test_source_address_token");
rtenneti61de3682016-03-24 00:50:023753 string cert_sct("test_cert_sct");
3754 string chlo_hash("test_chlo_hash");
rtenneticd2aaa15b2015-10-10 20:29:333755 string signature("test_signature");
3756 string test_cert("test_cert");
3757 vector<string> certs;
3758 certs.push_back(test_cert);
3759 state->server_config = server_config;
3760 state->source_address_token = source_address_token;
rtenneti61de3682016-03-24 00:50:023761 state->cert_sct = cert_sct;
3762 state->chlo_hash = chlo_hash;
rtenneticd2aaa15b2015-10-10 20:29:333763 state->server_config_sig = signature;
3764 state->certs = certs;
3765
3766 quic_server_info->Persist();
3767
rtennetiee679d52016-04-06 17:01:133768 QuicServerId quic_server_id2(kServer2HostName, 80, PRIVACY_MODE_DISABLED);
danakjad1777e2016-04-16 00:56:423769 std::unique_ptr<QuicServerInfo> quic_server_info2(
rtennetiee679d52016-04-06 17:01:133770 quic_server_info_factory->GetForServer(quic_server_id2));
3771
3772 // Update quic_server_info2's server_config and persist it.
3773 QuicServerInfo::State* state2 = quic_server_info2->mutable_state();
3774
3775 // Minimum SCFG that passes config validation checks.
3776 const char scfg2[] = {// SCFG
3777 0x53, 0x43, 0x46, 0x47,
3778 // num entries
3779 0x01, 0x00,
3780 // padding
3781 0x00, 0x00,
3782 // EXPY
3783 0x45, 0x58, 0x50, 0x59,
3784 // EXPY end offset
3785 0x08, 0x00, 0x00, 0x00,
3786 // Value
3787 '8', '7', '3', '4', '5', '6', '2', '1'};
3788
3789 // Create temporary strings becasue Persist() clears string data in |state2|.
3790 string server_config2(reinterpret_cast<const char*>(&scfg2), sizeof(scfg2));
3791 string source_address_token2("test_source_address_token2");
3792 string cert_sct2("test_cert_sct2");
3793 string chlo_hash2("test_chlo_hash2");
3794 string signature2("test_signature2");
3795 string test_cert2("test_cert2");
3796 vector<string> certs2;
3797 certs2.push_back(test_cert2);
3798 state2->server_config = server_config2;
3799 state2->source_address_token = source_address_token2;
3800 state2->cert_sct = cert_sct2;
3801 state2->chlo_hash = chlo_hash2;
3802 state2->server_config_sig = signature2;
3803 state2->certs = certs2;
3804
3805 quic_server_info2->Persist();
3806
jri7046038f2015-10-22 00:29:263807 QuicStreamFactoryPeer::MaybeInitialize(factory_.get());
3808 EXPECT_TRUE(QuicStreamFactoryPeer::HasInitializedData(factory_.get()));
rtennetiee679d52016-04-06 17:01:133809
3810 // Verify the MRU order is maintained.
3811 const QuicServerInfoMap& quic_server_info_map =
3812 http_server_properties_.quic_server_info_map();
3813 EXPECT_EQ(2u, quic_server_info_map.size());
3814 QuicServerInfoMap::const_iterator quic_server_info_map_it =
3815 quic_server_info_map.begin();
3816 EXPECT_EQ(quic_server_info_map_it->first, quic_server_id2);
3817 ++quic_server_info_map_it;
3818 EXPECT_EQ(quic_server_info_map_it->first, quic_server_id);
3819
jri7046038f2015-10-22 00:29:263820 EXPECT_TRUE(QuicStreamFactoryPeer::SupportsQuicAtStartUp(factory_.get(),
3821 host_port_pair_));
3822 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(factory_.get(),
rtenneticd2aaa15b2015-10-10 20:29:333823 quic_server_id));
3824 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:263825 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rtenneticd2aaa15b2015-10-10 20:29:333826 QuicCryptoClientConfig::CachedState* cached =
3827 crypto_config->LookupOrCreate(quic_server_id);
3828 EXPECT_FALSE(cached->server_config().empty());
3829 EXPECT_TRUE(cached->GetServerConfig());
3830 EXPECT_EQ(server_config, cached->server_config());
3831 EXPECT_EQ(source_address_token, cached->source_address_token());
rtenneti61de3682016-03-24 00:50:023832 EXPECT_EQ(cert_sct, cached->cert_sct());
3833 EXPECT_EQ(chlo_hash, cached->chlo_hash());
rtenneticd2aaa15b2015-10-10 20:29:333834 EXPECT_EQ(signature, cached->signature());
3835 ASSERT_EQ(1U, cached->certs().size());
3836 EXPECT_EQ(test_cert, cached->certs()[0]);
rtennetiee679d52016-04-06 17:01:133837
3838 EXPECT_TRUE(QuicStreamFactoryPeer::SupportsQuicAtStartUp(factory_.get(),
3839 host_port_pair2));
3840 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(
3841 factory_.get(), quic_server_id2));
3842 QuicCryptoClientConfig::CachedState* cached2 =
3843 crypto_config->LookupOrCreate(quic_server_id2);
3844 EXPECT_FALSE(cached2->server_config().empty());
3845 EXPECT_TRUE(cached2->GetServerConfig());
3846 EXPECT_EQ(server_config2, cached2->server_config());
3847 EXPECT_EQ(source_address_token2, cached2->source_address_token());
3848 EXPECT_EQ(cert_sct2, cached2->cert_sct());
3849 EXPECT_EQ(chlo_hash2, cached2->chlo_hash());
3850 EXPECT_EQ(signature2, cached2->signature());
3851 ASSERT_EQ(1U, cached->certs().size());
3852 EXPECT_EQ(test_cert2, cached2->certs()[0]);
rtenneti8a80a6dc2015-09-21 19:51:133853}
3854
rtennetid2e74caa2015-12-09 00:51:573855TEST_P(QuicStreamFactoryTest, QuicDoingZeroRTT) {
3856 Initialize();
3857
3858 factory_->set_require_confirmation(true);
3859 QuicServerId quic_server_id(host_port_pair_, PRIVACY_MODE_DISABLED);
3860 EXPECT_FALSE(factory_->ZeroRTTEnabledFor(quic_server_id));
3861
3862 factory_->set_require_confirmation(false);
3863 EXPECT_FALSE(factory_->ZeroRTTEnabledFor(quic_server_id));
3864
3865 // Load server config and verify QUIC will do 0RTT.
3866 QuicStreamFactoryPeer::CacheDummyServerConfig(factory_.get(), quic_server_id);
3867 EXPECT_TRUE(factory_->ZeroRTTEnabledFor(quic_server_id));
3868}
3869
rtenneti1cd3b162015-09-29 02:58:283870TEST_P(QuicStreamFactoryTest, YieldAfterPackets) {
jri7046038f2015-10-22 00:29:263871 Initialize();
rch6faa4d42016-01-05 20:48:433872 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3873 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263874 QuicStreamFactoryPeer::SetYieldAfterPackets(factory_.get(), 0);
rtenneti1cd3b162015-09-29 02:58:283875
danakjad1777e2016-04-16 00:56:423876 std::unique_ptr<QuicEncryptedPacket> close_packet(
alyssar2adf3ac2016-05-03 17:12:583877 ConstructClientConnectionClosePacket(0));
rtenneticd2aaa15b2015-10-10 20:29:333878 vector<MockRead> reads;
rtenneti1cd3b162015-09-29 02:58:283879 reads.push_back(
3880 MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0));
3881 reads.push_back(MockRead(ASYNC, OK, 1));
mmenke651bae7f2015-12-18 21:26:453882 SequencedSocketData socket_data(&reads[0], reads.size(), nullptr, 0);
rtenneti1cd3b162015-09-29 02:58:283883 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti1cd3b162015-09-29 02:58:283884
3885 crypto_client_stream_factory_.set_handshake_mode(
3886 MockCryptoClientStream::ZERO_RTT);
3887 host_resolver_.set_synchronous_mode(true);
3888 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3889 "192.168.0.1", "");
3890
rcha02807b42016-01-29 21:56:153891 // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
3892 // posts a task.
rtenneti1cd3b162015-09-29 02:58:283893 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
rcha02807b42016-01-29 21:56:153894 SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
3895 "StartReading");
rtenneti1cd3b162015-09-29 02:58:283896
jri7046038f2015-10-22 00:29:263897 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563898 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563899 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3900 callback_.callback()));
rtenneti1cd3b162015-09-29 02:58:283901
rcha02807b42016-01-29 21:56:153902 // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
3903 // called.
rtenneti1cd3b162015-09-29 02:58:283904 base::RunLoop run_loop;
3905 run_loop.RunUntilIdle();
3906
3907 // Verify task that the observer's executed_count is 1, which indicates
rcha02807b42016-01-29 21:56:153908 // QuicChromiumPacketReader::StartReading() has posted only one task and
3909 // yielded the read.
rtenneti1cd3b162015-09-29 02:58:283910 EXPECT_EQ(1u, observer.executed_count());
3911
danakjad1777e2016-04-16 00:56:423912 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233913 EXPECT_FALSE(stream.get()); // Session is already closed.
rtenneti1cd3b162015-09-29 02:58:283914 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3915 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3916}
3917
3918TEST_P(QuicStreamFactoryTest, YieldAfterDuration) {
jri7046038f2015-10-22 00:29:263919 Initialize();
rch6faa4d42016-01-05 20:48:433920 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3921 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rtenneti1cd3b162015-09-29 02:58:283922 QuicStreamFactoryPeer::SetYieldAfterDuration(
jri7046038f2015-10-22 00:29:263923 factory_.get(), QuicTime::Delta::FromMilliseconds(-1));
rtenneti1cd3b162015-09-29 02:58:283924
danakjad1777e2016-04-16 00:56:423925 std::unique_ptr<QuicEncryptedPacket> close_packet(
alyssar2adf3ac2016-05-03 17:12:583926 ConstructClientConnectionClosePacket(0));
rtenneticd2aaa15b2015-10-10 20:29:333927 vector<MockRead> reads;
rtenneti1cd3b162015-09-29 02:58:283928 reads.push_back(
3929 MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0));
3930 reads.push_back(MockRead(ASYNC, OK, 1));
mmenke651bae7f2015-12-18 21:26:453931 SequencedSocketData socket_data(&reads[0], reads.size(), nullptr, 0);
rtenneti1cd3b162015-09-29 02:58:283932 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti1cd3b162015-09-29 02:58:283933
3934 crypto_client_stream_factory_.set_handshake_mode(
3935 MockCryptoClientStream::ZERO_RTT);
3936 host_resolver_.set_synchronous_mode(true);
3937 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3938 "192.168.0.1", "");
3939
rcha02807b42016-01-29 21:56:153940 // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
3941 // posts a task.
rtenneti1cd3b162015-09-29 02:58:283942 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
rcha02807b42016-01-29 21:56:153943 SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
3944 "StartReading");
rtenneti1cd3b162015-09-29 02:58:283945
jri7046038f2015-10-22 00:29:263946 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563947 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563948 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3949 callback_.callback()));
rtenneti1cd3b162015-09-29 02:58:283950
rcha02807b42016-01-29 21:56:153951 // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
3952 // called.
rtenneti1cd3b162015-09-29 02:58:283953 base::RunLoop run_loop;
3954 run_loop.RunUntilIdle();
3955
3956 // Verify task that the observer's executed_count is 1, which indicates
rcha02807b42016-01-29 21:56:153957 // QuicChromiumPacketReader::StartReading() has posted only one task and
3958 // yielded the read.
rtenneti1cd3b162015-09-29 02:58:283959 EXPECT_EQ(1u, observer.executed_count());
3960
danakjad1777e2016-04-16 00:56:423961 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233962 EXPECT_FALSE(stream.get()); // Session is already closed.
rtenneti1cd3b162015-09-29 02:58:283963 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3964 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3965}
3966
ckrasic3865ee0f2016-02-29 22:04:563967TEST_P(QuicStreamFactoryTest, ServerPushSessionAffinity) {
3968 Initialize();
3969 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3970 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3971
3972 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3973 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
3974 socket_factory_.AddSocketDataProvider(&socket_data);
3975
3976 QuicStreamRequest request(factory_.get());
3977 EXPECT_EQ(ERR_IO_PENDING,
3978 request.Request(host_port_pair_, privacy_mode_,
3979 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3980 callback_.callback()));
3981
3982 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:423983 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
ckrasic3865ee0f2016-02-29 22:04:563984 EXPECT_TRUE(stream.get());
3985
3986 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
3987
3988 std::string url = "https://www.example.org/";
3989
bnc912a04b2016-04-20 14:19:503990 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic3865ee0f2016-02-29 22:04:563991
3992 QuicClientPromisedInfo promised(session, kServerDataStreamId1, url);
3993 (*QuicStreamFactoryPeer::GetPushPromiseIndex(factory_.get())
3994 ->promised_by_url())[url] = &promised;
3995
3996 QuicStreamRequest request2(factory_.get());
3997 EXPECT_EQ(OK, request2.Request(host_port_pair_, privacy_mode_,
3998 /*cert_verify_flags=*/0, GURL(url), "GET",
3999 net_log_, callback_.callback()));
4000
4001 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
4002}
4003
4004TEST_P(QuicStreamFactoryTest, ServerPushPrivacyModeMismatch) {
4005 Initialize();
4006 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4007 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4008 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4009
4010 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
4011
alyssar2adf3ac2016-05-03 17:12:584012 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
ckrasic3865ee0f2016-02-29 22:04:564013 1, true, kServerDataStreamId1, QUIC_STREAM_CANCELLED));
4014 MockWrite writes[] = {
4015 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
4016 };
4017
4018 SequencedSocketData socket_data1(reads, arraysize(reads), writes,
4019 arraysize(writes));
4020 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
4021
4022 socket_factory_.AddSocketDataProvider(&socket_data1);
4023 socket_factory_.AddSocketDataProvider(&socket_data2);
4024
4025 QuicStreamRequest request(factory_.get());
4026 EXPECT_EQ(ERR_IO_PENDING,
4027 request.Request(host_port_pair_, privacy_mode_,
4028 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4029 callback_.callback()));
4030
4031 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:424032 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
ckrasic3865ee0f2016-02-29 22:04:564033 EXPECT_TRUE(stream.get());
4034
4035 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
4036
4037 std::string url = "https://www.example.org/";
bnc912a04b2016-04-20 14:19:504038 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic3865ee0f2016-02-29 22:04:564039
4040 QuicClientPromisedInfo promised(session, kServerDataStreamId1, url);
4041
4042 QuicClientPushPromiseIndex* index =
4043 QuicStreamFactoryPeer::GetPushPromiseIndex(factory_.get());
4044
4045 (*index->promised_by_url())[url] = &promised;
4046 EXPECT_EQ(index->GetPromised(url), &promised);
4047
4048 // Doing the request should not use the push stream, but rather
4049 // cancel it because the privacy modes do not match.
4050 QuicStreamRequest request2(factory_.get());
4051 EXPECT_EQ(ERR_IO_PENDING,
4052 request2.Request(host_port_pair_, PRIVACY_MODE_ENABLED,
4053 /*cert_verify_flags=*/0, GURL(url), "GET",
4054 net_log_, callback_.callback()));
4055
4056 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
4057 EXPECT_EQ(index->GetPromised(url), nullptr);
4058
4059 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:424060 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
ckrasic3865ee0f2016-02-29 22:04:564061 EXPECT_TRUE(stream2.get());
4062
4063 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
4064 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
4065 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
4066 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
4067}
4068
bnc359ed2a2016-04-29 20:43:454069// Pool to existing session with matching QuicServerId
4070// even if destination is different.
4071TEST_P(QuicStreamFactoryTest, PoolByOrigin) {
4072 Initialize();
4073
4074 HostPortPair destination1("first.example.com", 443);
4075 HostPortPair destination2("second.example.com", 443);
4076
4077 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4078 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4079
4080 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
4081 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
4082 socket_factory_.AddSocketDataProvider(&socket_data);
4083
4084 QuicStreamRequest request1(factory_.get());
4085 EXPECT_EQ(ERR_IO_PENDING,
4086 request1.Request(destination1, privacy_mode_,
4087 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4088 callback_.callback()));
4089 EXPECT_EQ(OK, callback_.WaitForResult());
4090 std::unique_ptr<QuicHttpStream> stream1 = request1.CreateStream();
4091 EXPECT_TRUE(stream1.get());
4092 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4093
4094 // Second request returns synchronously because it pools to existing session.
4095 TestCompletionCallback callback2;
4096 QuicStreamRequest request2(factory_.get());
4097 EXPECT_EQ(OK, request2.Request(destination2, privacy_mode_,
4098 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4099 callback2.callback()));
4100 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
4101 EXPECT_TRUE(stream2.get());
4102
4103 QuicChromiumClientSession* session1 =
4104 QuicHttpStreamPeer::GetSession(stream1.get());
4105 QuicChromiumClientSession* session2 =
4106 QuicHttpStreamPeer::GetSession(stream2.get());
4107 EXPECT_EQ(session1, session2);
4108 EXPECT_EQ(QuicServerId(host_port_pair_, privacy_mode_),
4109 session1->server_id());
4110
4111 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4112 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4113}
4114
4115class QuicStreamFactoryWithDestinationTest
4116 : public QuicStreamFactoryTestBase,
4117 public ::testing::TestWithParam<PoolingTestParams> {
4118 protected:
4119 QuicStreamFactoryWithDestinationTest()
4120 : QuicStreamFactoryTestBase(GetParam().version,
4121 GetParam().enable_connection_racing),
4122 destination_type_(GetParam().destination_type),
4123 hanging_read_(SYNCHRONOUS, ERR_IO_PENDING, 0) {}
4124
4125 HostPortPair GetDestination() {
4126 switch (destination_type_) {
4127 case SAME_AS_FIRST:
4128 return origin1_;
4129 case SAME_AS_SECOND:
4130 return origin2_;
4131 case DIFFERENT:
4132 return HostPortPair(kDifferentHostname, 443);
4133 default:
4134 NOTREACHED();
4135 return HostPortPair();
4136 }
4137 }
4138
4139 void AddHangingSocketData() {
4140 std::unique_ptr<SequencedSocketData> sequenced_socket_data(
4141 new SequencedSocketData(&hanging_read_, 1, nullptr, 0));
4142 socket_factory_.AddSocketDataProvider(sequenced_socket_data.get());
4143 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
4144 }
4145
4146 bool AllDataConsumed() {
4147 for (const auto& socket_data_ptr : sequenced_socket_data_vector_) {
4148 if (!socket_data_ptr->AllReadDataConsumed() ||
4149 !socket_data_ptr->AllWriteDataConsumed()) {
4150 return false;
4151 }
4152 }
4153 return true;
4154 }
4155
4156 DestinationType destination_type_;
4157 HostPortPair origin1_;
4158 HostPortPair origin2_;
4159 MockRead hanging_read_;
4160 std::vector<std::unique_ptr<SequencedSocketData>>
4161 sequenced_socket_data_vector_;
4162};
4163
4164INSTANTIATE_TEST_CASE_P(Version,
4165 QuicStreamFactoryWithDestinationTest,
4166 ::testing::ValuesIn(GetPoolingTestParams()));
4167
4168// A single QUIC request fails because the certificate does not match the origin
4169// hostname, regardless of whether it matches the alternative service hostname.
4170TEST_P(QuicStreamFactoryWithDestinationTest, InvalidCertificate) {
4171 if (destination_type_ == DIFFERENT)
4172 return;
4173
4174 Initialize();
4175
4176 GURL url("https://mail.example.com/");
4177 origin1_ = HostPortPair::FromURL(url);
4178
4179 // Not used for requests, but this provides a test case where the certificate
4180 // is valid for the hostname of the alternative service.
4181 origin2_ = HostPortPair("mail.example.org", 433);
4182
4183 HostPortPair destination = GetDestination();
4184
4185 scoped_refptr<X509Certificate> cert(
4186 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
4187 bool unused;
4188 ASSERT_FALSE(cert->VerifyNameMatch(origin1_.host(), &unused));
4189 ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host(), &unused));
4190
4191 ProofVerifyDetailsChromium verify_details;
4192 verify_details.cert_verify_result.verified_cert = cert;
4193 verify_details.cert_verify_result.is_issued_by_known_root = true;
4194 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4195
4196 AddHangingSocketData();
4197
4198 QuicStreamRequest request(factory_.get());
4199 EXPECT_EQ(ERR_IO_PENDING, request.Request(destination, privacy_mode_,
4200 /*cert_verify_flags=*/0, url, "GET",
4201 net_log_, callback_.callback()));
4202
4203 EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, callback_.WaitForResult());
4204
4205 EXPECT_TRUE(AllDataConsumed());
4206}
4207
4208// QuicStreamRequest is pooled based on |destination| if certificate matches.
4209TEST_P(QuicStreamFactoryWithDestinationTest, SharedCertificate) {
4210 Initialize();
4211
4212 GURL url1("https://www.example.org/");
4213 GURL url2("https://mail.example.org/");
4214 origin1_ = HostPortPair::FromURL(url1);
4215 origin2_ = HostPortPair::FromURL(url2);
4216
4217 HostPortPair destination = GetDestination();
4218
4219 scoped_refptr<X509Certificate> cert(
4220 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
4221 bool unused;
4222 ASSERT_TRUE(cert->VerifyNameMatch(origin1_.host(), &unused));
4223 ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host(), &unused));
4224 ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname, &unused));
4225
4226 ProofVerifyDetailsChromium verify_details;
4227 verify_details.cert_verify_result.verified_cert = cert;
4228 verify_details.cert_verify_result.is_issued_by_known_root = true;
4229 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4230
4231 AddHangingSocketData();
4232
4233 QuicStreamRequest request1(factory_.get());
4234 EXPECT_EQ(ERR_IO_PENDING,
4235 request1.Request(destination, privacy_mode_,
4236 /*cert_verify_flags=*/0, url1, "GET", net_log_,
4237 callback_.callback()));
4238 EXPECT_EQ(OK, callback_.WaitForResult());
4239 std::unique_ptr<QuicHttpStream> stream1 = request1.CreateStream();
4240 EXPECT_TRUE(stream1.get());
4241 EXPECT_TRUE(HasActiveSession(origin1_));
4242
4243 // Second request returns synchronously because it pools to existing session.
4244 TestCompletionCallback callback2;
4245 QuicStreamRequest request2(factory_.get());
4246 EXPECT_EQ(OK, request2.Request(destination, privacy_mode_,
4247 /*cert_verify_flags=*/0, url2, "GET", net_log_,
4248 callback2.callback()));
4249 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
4250 EXPECT_TRUE(stream2.get());
4251
4252 QuicChromiumClientSession* session1 =
4253 QuicHttpStreamPeer::GetSession(stream1.get());
4254 QuicChromiumClientSession* session2 =
4255 QuicHttpStreamPeer::GetSession(stream2.get());
4256 EXPECT_EQ(session1, session2);
4257
4258 EXPECT_EQ(QuicServerId(origin1_, privacy_mode_), session1->server_id());
4259
4260 EXPECT_TRUE(AllDataConsumed());
4261}
4262
4263// QuicStreamRequest is not pooled if certificate does not match its origin.
4264TEST_P(QuicStreamFactoryWithDestinationTest, DisjointCertificate) {
4265 Initialize();
4266
4267 GURL url1("https://news.example.org/");
4268 GURL url2("https://mail.example.com/");
4269 origin1_ = HostPortPair::FromURL(url1);
4270 origin2_ = HostPortPair::FromURL(url2);
4271
4272 HostPortPair destination = GetDestination();
4273
4274 scoped_refptr<X509Certificate> cert1(
4275 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
4276 bool unused;
4277 ASSERT_TRUE(cert1->VerifyNameMatch(origin1_.host(), &unused));
4278 ASSERT_FALSE(cert1->VerifyNameMatch(origin2_.host(), &unused));
4279 ASSERT_FALSE(cert1->VerifyNameMatch(kDifferentHostname, &unused));
4280
4281 ProofVerifyDetailsChromium verify_details1;
4282 verify_details1.cert_verify_result.verified_cert = cert1;
4283 verify_details1.cert_verify_result.is_issued_by_known_root = true;
4284 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
4285
4286 scoped_refptr<X509Certificate> cert2(
4287 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
4288 ASSERT_TRUE(cert2->VerifyNameMatch(origin2_.host(), &unused));
4289 ASSERT_FALSE(cert2->VerifyNameMatch(kDifferentHostname, &unused));
4290
4291 ProofVerifyDetailsChromium verify_details2;
4292 verify_details2.cert_verify_result.verified_cert = cert2;
4293 verify_details2.cert_verify_result.is_issued_by_known_root = true;
4294 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
4295
4296 AddHangingSocketData();
4297 AddHangingSocketData();
4298
4299 QuicStreamRequest request1(factory_.get());
4300 EXPECT_EQ(ERR_IO_PENDING,
4301 request1.Request(destination, privacy_mode_,
4302 /*cert_verify_flags=*/0, url1, "GET", net_log_,
4303 callback_.callback()));
4304 EXPECT_EQ(OK, callback_.WaitForResult());
4305 std::unique_ptr<QuicHttpStream> stream1 = request1.CreateStream();
4306 EXPECT_TRUE(stream1.get());
4307 EXPECT_TRUE(HasActiveSession(origin1_));
4308
4309 TestCompletionCallback callback2;
4310 QuicStreamRequest request2(factory_.get());
4311 EXPECT_EQ(ERR_IO_PENDING,
4312 request2.Request(destination, privacy_mode_,
4313 /*cert_verify_flags=*/0, url2, "GET", net_log_,
4314 callback2.callback()));
4315 EXPECT_EQ(OK, callback2.WaitForResult());
4316 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
4317 EXPECT_TRUE(stream2.get());
4318
4319 // |request2| does not pool to the first session, because the certificate does
4320 // not match. Instead, another session is opened to the same destination, but
4321 // with a different QuicServerId.
4322 QuicChromiumClientSession* session1 =
4323 QuicHttpStreamPeer::GetSession(stream1.get());
4324 QuicChromiumClientSession* session2 =
4325 QuicHttpStreamPeer::GetSession(stream2.get());
4326 EXPECT_NE(session1, session2);
4327
4328 EXPECT_EQ(QuicServerId(origin1_, privacy_mode_), session1->server_id());
4329 EXPECT_EQ(QuicServerId(origin2_, privacy_mode_), session2->server_id());
4330
4331 EXPECT_TRUE(AllDataConsumed());
4332}
4333
[email protected]e13201d82012-12-12 05:00:324334} // namespace test
[email protected]e13201d82012-12-12 05:00:324335} // namespace net