blob: dda32e5b53961e0ed0b4266ef8bec644efa1bb24 [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),
260 maker_(version_, 0, clock_, kDefaultServerHostName),
[email protected]59c0bbd2014-03-22 04:08:12261 cert_verifier_(CertVerifier::CreateDefault()),
jri2b966f22014-09-02 22:25:36262 channel_id_service_(
rtennetibe635732014-10-02 22:51:42263 new ChannelIDService(new DefaultChannelIDStore(nullptr),
skyostil4891b25b2015-06-11 11:43:45264 base::ThreadTaskRunnerHandle::Get())),
rtenneti052774e2015-11-24 21:00:12265 cert_transparency_verifier_(new MultiLogCTVerifier()),
jri7e636642016-01-14 06:57:08266 scoped_mock_network_change_notifier_(nullptr),
jri7046038f2015-10-22 00:29:26267 factory_(nullptr),
[email protected]bf4ea2f2014-03-10 22:57:53268 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
ckrasic3865ee0f2016-02-29 22:04:56269 url_(kDefaultUrl),
270 url2_(kServer2Url),
271 url3_(kServer3Url),
272 url4_(kServer4Url),
jri7046038f2015-10-22 00:29:26273 privacy_mode_(PRIVACY_MODE_DISABLED),
274 enable_port_selection_(true),
275 always_require_handshake_confirmation_(false),
276 disable_connection_pooling_(false),
277 load_server_info_timeout_srtt_multiplier_(0.0f),
bnc359ed2a2016-04-29 20:43:45278 enable_connection_racing_(enable_connection_racing),
jri7046038f2015-10-22 00:29:26279 enable_non_blocking_io_(true),
280 disable_disk_cache_(false),
281 prefer_aes_(false),
282 max_number_of_lossy_connections_(0),
283 packet_loss_threshold_(1.0f),
284 max_disabled_reasons_(3),
285 threshold_timeouts_with_open_streams_(2),
286 threshold_public_resets_post_handshake_(2),
287 receive_buffer_size_(0),
rtenneti41c09992015-11-30 18:24:01288 close_sessions_on_ip_change_(false),
zhongyi89649c32016-01-22 00:14:01289 disable_quic_on_timeout_with_open_streams_(false),
jri7e636642016-01-14 06:57:08290 idle_connection_timeout_seconds_(kIdleConnectionTimeoutSeconds),
jrid36ada62016-02-06 02:42:08291 migrate_sessions_on_network_change_(false),
292 migrate_sessions_early_(false) {
[email protected]ca4e0d92014-08-22 16:33:22293 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
jri7046038f2015-10-22 00:29:26294 }
295
bnc359ed2a2016-04-29 20:43:45296 ~QuicStreamFactoryTestBase() {
297 // If |factory_| was initialized, then it took over ownership of |clock_|.
298 // If |factory_| was not initialized, then |clock_| needs to be destroyed.
299 if (!factory_) {
300 delete clock_;
301 }
302 }
303
jri7046038f2015-10-22 00:29:26304 void Initialize() {
bnc359ed2a2016-04-29 20:43:45305 DCHECK(!factory_);
jri7046038f2015-10-22 00:29:26306 factory_.reset(new QuicStreamFactory(
307 &host_resolver_, &socket_factory_, http_server_properties_.GetWeakPtr(),
308 cert_verifier_.get(), nullptr, channel_id_service_.get(),
rtenneti052774e2015-11-24 21:00:12309 &transport_security_state_, cert_transparency_verifier_.get(),
jri7046038f2015-10-22 00:29:26310 /*SocketPerformanceWatcherFactory*/ nullptr,
311 &crypto_client_stream_factory_, &random_generator_, clock_,
bnc359ed2a2016-04-29 20:43:45312 kDefaultMaxPacketSize, std::string(), SupportedVersions(version_),
313 enable_port_selection_, always_require_handshake_confirmation_,
314 disable_connection_pooling_, load_server_info_timeout_srtt_multiplier_,
315 enable_connection_racing_, enable_non_blocking_io_, disable_disk_cache_,
316 prefer_aes_, max_number_of_lossy_connections_, packet_loss_threshold_,
jri7046038f2015-10-22 00:29:26317 max_disabled_reasons_, threshold_timeouts_with_open_streams_,
318 threshold_public_resets_post_handshake_, receive_buffer_size_,
rtenneti634050c2016-04-28 20:41:54319 /*max_server_configs_stored_in_properties*/ 0,
zhongyi89649c32016-01-22 00:14:01320 close_sessions_on_ip_change_,
321 disable_quic_on_timeout_with_open_streams_,
322 idle_connection_timeout_seconds_, migrate_sessions_on_network_change_,
nharperd5cddca2016-02-27 03:37:52323 migrate_sessions_early_, QuicTagVector(),
324 /*enable_token_binding*/ false));
jri7046038f2015-10-22 00:29:26325 factory_->set_require_confirmation(false);
rtenneti6971c172016-01-15 20:12:10326 EXPECT_FALSE(factory_->has_quic_server_info_factory());
jri7046038f2015-10-22 00:29:26327 factory_->set_quic_server_info_factory(new MockQuicServerInfoFactory());
rtenneti6971c172016-01-15 20:12:10328 EXPECT_TRUE(factory_->has_quic_server_info_factory());
[email protected]e13201d82012-12-12 05:00:32329 }
330
jri7e636642016-01-14 06:57:08331 void InitializeConnectionMigrationTest(
332 NetworkChangeNotifier::NetworkList connected_networks) {
333 scoped_mock_network_change_notifier_.reset(
334 new ScopedMockNetworkChangeNotifier());
335 MockNetworkChangeNotifier* mock_ncn =
336 scoped_mock_network_change_notifier_->mock_network_change_notifier();
337 mock_ncn->ForceNetworkHandlesSupported();
338 mock_ncn->SetConnectedNetworksList(connected_networks);
339 migrate_sessions_on_network_change_ = true;
jrid36ada62016-02-06 02:42:08340 migrate_sessions_early_ = true;
jri7e636642016-01-14 06:57:08341 Initialize();
342 }
343
bnccb7ff3c2015-05-21 20:51:55344 bool HasActiveSession(const HostPortPair& host_port_pair) {
jri7046038f2015-10-22 00:29:26345 return QuicStreamFactoryPeer::HasActiveSession(factory_.get(),
346 host_port_pair);
bnccb7ff3c2015-05-21 20:51:55347 }
348
bnc912a04b2016-04-20 14:19:50349 QuicChromiumClientSession* GetActiveSession(
350 const HostPortPair& host_port_pair) {
351 return QuicStreamFactoryPeer::GetActiveSession(factory_.get(),
352 host_port_pair);
353 }
354
danakjad1777e2016-04-16 00:56:42355 std::unique_ptr<QuicHttpStream> CreateFromSession(
bnccb7ff3c2015-05-21 20:51:55356 const HostPortPair& host_port_pair) {
bnc912a04b2016-04-20 14:19:50357 QuicChromiumClientSession* session = GetActiveSession(host_port_pair);
jri7046038f2015-10-22 00:29:26358 return QuicStreamFactoryPeer::CreateFromSession(factory_.get(), session);
[email protected]df157d9d2014-03-10 07:27:27359 }
[email protected]e13201d82012-12-12 05:00:32360
[email protected]bf4ea2f2014-03-10 22:57:53361 int GetSourcePortForNewSession(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10362 return GetSourcePortForNewSessionInner(destination, false);
363 }
364
rjshaded5ced072015-12-18 19:26:02365 int GetSourcePortForNewSessionAndGoAway(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10366 return GetSourcePortForNewSessionInner(destination, true);
367 }
368
[email protected]bf4ea2f2014-03-10 22:57:53369 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
[email protected]d8e2abf82014-03-06 10:30:10370 bool goaway_received) {
[email protected]3c772402013-12-18 21:38:11371 // Should only be called if there is no active session for this destination.
bnccb7ff3c2015-05-21 20:51:55372 EXPECT_FALSE(HasActiveSession(destination));
mmenke651bae7f2015-12-18 21:26:45373 size_t socket_count = socket_factory_.udp_client_socket_ports().size();
[email protected]3c772402013-12-18 21:38:11374
mmenke651bae7f2015-12-18 21:26:45375 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
376 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]3c772402013-12-18 21:38:11377 socket_factory_.AddSocketDataProvider(&socket_data);
378
jri7046038f2015-10-22 00:29:26379 QuicStreamRequest request(factory_.get());
ckrasic3865ee0f2016-02-29 22:04:56380 GURL url("https://" + destination.host() + "/");
[email protected]974849d2014-02-06 01:32:59381 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56382 request.Request(destination, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56383 /*cert_verify_flags=*/0, url, "GET", net_log_,
384 callback_.callback()));
[email protected]3c772402013-12-18 21:38:11385
386 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:42387 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]3c772402013-12-18 21:38:11388 EXPECT_TRUE(stream.get());
389 stream.reset();
390
bnc912a04b2016-04-20 14:19:50391 QuicChromiumClientSession* session = GetActiveSession(destination);
[email protected]3c772402013-12-18 21:38:11392
mmenke651bae7f2015-12-18 21:26:45393 if (socket_count + 1 != socket_factory_.udp_client_socket_ports().size()) {
394 ADD_FAILURE();
[email protected]3c772402013-12-18 21:38:11395 return 0;
396 }
397
[email protected]d8e2abf82014-03-06 10:30:10398 if (goaway_received) {
399 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, "");
rtenneti9bd5d4b2015-08-21 05:44:52400 session->connection()->OnGoAwayFrame(goaway);
[email protected]d8e2abf82014-03-06 10:30:10401 }
[email protected]3c772402013-12-18 21:38:11402
jri7046038f2015-10-22 00:29:26403 factory_->OnSessionClosed(session);
bnccb7ff3c2015-05-21 20:51:55404 EXPECT_FALSE(HasActiveSession(destination));
rch37de576c2015-05-17 20:28:17405 EXPECT_TRUE(socket_data.AllReadDataConsumed());
406 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:45407 return socket_factory_.udp_client_socket_ports()[socket_count];
[email protected]3c772402013-12-18 21:38:11408 }
409
danakjad1777e2016-04-16 00:56:42410 std::unique_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
rtenneti1cd3b162015-09-29 02:58:28411 QuicPacketNumber num) {
412 return maker_.MakeConnectionClosePacket(num);
413 }
414
danakjad1777e2016-04-16 00:56:42415 std::unique_ptr<QuicEncryptedPacket> ConstructRstPacket() {
[email protected]66ae5962014-05-22 11:13:05416 QuicStreamId stream_id = kClientDataStreamId1;
[email protected]51cc1342014-04-18 23:44:37417 return maker_.MakeRstPacket(
418 1, true, stream_id,
bnc359ed2a2016-04-29 20:43:45419 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, version_));
[email protected]459a7402014-02-10 12:58:52420 }
421
bncf8bf0722015-05-19 20:04:13422 static ProofVerifyDetailsChromium DefaultProofVerifyDetails() {
rch6faa4d42016-01-05 20:48:43423 // Load a certificate that is valid for *.example.org
bncf8bf0722015-05-19 20:04:13424 scoped_refptr<X509Certificate> test_cert(
rch6faa4d42016-01-05 20:48:43425 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bncf8bf0722015-05-19 20:04:13426 EXPECT_TRUE(test_cert.get());
427 ProofVerifyDetailsChromium verify_details;
428 verify_details.cert_verify_result.verified_cert = test_cert;
429 verify_details.cert_verify_result.is_issued_by_known_root = true;
430 return verify_details;
431 }
432
jri8c44d692015-10-23 23:53:41433 void NotifyIPAddressChanged() {
434 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
jri7e636642016-01-14 06:57:08435 // Spin the message loop so the notification is delivered.
jri8c44d692015-10-23 23:53:41436 base::MessageLoop::current()->RunUntilIdle();
437 }
438
danakjad1777e2016-04-16 00:56:42439 std::unique_ptr<QuicEncryptedPacket> ConstructGetRequestPacket(
jri7e636642016-01-14 06:57:08440 QuicPacketNumber packet_number,
441 QuicStreamId stream_id,
442 bool should_include_version,
443 bool fin) {
444 SpdyHeaderBlock headers = maker_.GetRequestHeaders("GET", "https", "/");
445 SpdyPriority priority =
446 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
447 size_t spdy_headers_frame_len;
448 return maker_.MakeRequestHeadersPacket(
449 packet_number, stream_id, should_include_version, fin, priority,
450 headers, &spdy_headers_frame_len);
451 }
452
danakjad1777e2016-04-16 00:56:42453 std::unique_ptr<QuicEncryptedPacket> ConstructOkResponsePacket(
jri7e636642016-01-14 06:57:08454 QuicPacketNumber packet_number,
455 QuicStreamId stream_id,
456 bool should_include_version,
457 bool fin) {
458 SpdyHeaderBlock headers = maker_.GetResponseHeaders("200 OK");
459 size_t spdy_headers_frame_len;
460 return maker_.MakeResponseHeadersPacket(packet_number, stream_id,
461 should_include_version, fin,
462 headers, &spdy_headers_frame_len);
463 }
464
[email protected]e13201d82012-12-12 05:00:32465 MockHostResolver host_resolver_;
mmenke651bae7f2015-12-18 21:26:45466 MockClientSocketFactory socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05467 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]9558c5d32012-12-22 00:08:14468 MockRandom random_generator_;
bnc359ed2a2016-04-29 20:43:45469 MockClock* clock_; // Owned by |factory_| once created.
rtenneti38f5cd52014-10-28 20:28:28470 scoped_refptr<TestTaskRunner> runner_;
bnc359ed2a2016-04-29 20:43:45471 QuicVersion version_;
rtenneti4b06ae72014-08-26 03:43:43472 QuicTestPacketMaker maker_;
rtenneticcab42b2015-10-09 06:38:16473 HttpServerPropertiesImpl http_server_properties_;
danakjad1777e2016-04-16 00:56:42474 std::unique_ptr<CertVerifier> cert_verifier_;
475 std::unique_ptr<ChannelIDService> channel_id_service_;
[email protected]080b77932014-08-04 01:22:46476 TransportSecurityState transport_security_state_;
danakjad1777e2016-04-16 00:56:42477 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
478 std::unique_ptr<ScopedMockNetworkChangeNotifier>
jri7e636642016-01-14 06:57:08479 scoped_mock_network_change_notifier_;
danakjad1777e2016-04-16 00:56:42480 std::unique_ptr<QuicStreamFactory> factory_;
[email protected]bf4ea2f2014-03-10 22:57:53481 HostPortPair host_port_pair_;
ckrasic3865ee0f2016-02-29 22:04:56482 GURL url_;
483 GURL url2_;
484 GURL url3_;
485 GURL url4_;
486
[email protected]9dd3ff0f2014-03-26 09:51:28487 PrivacyMode privacy_mode_;
[email protected]e13201d82012-12-12 05:00:32488 BoundNetLog net_log_;
489 TestCompletionCallback callback_;
jri7046038f2015-10-22 00:29:26490
491 // Variables to configure QuicStreamFactory.
492 bool enable_port_selection_;
493 bool always_require_handshake_confirmation_;
494 bool disable_connection_pooling_;
495 double load_server_info_timeout_srtt_multiplier_;
496 bool enable_connection_racing_;
497 bool enable_non_blocking_io_;
498 bool disable_disk_cache_;
499 bool prefer_aes_;
500 int max_number_of_lossy_connections_;
501 double packet_loss_threshold_;
502 int max_disabled_reasons_;
503 int threshold_timeouts_with_open_streams_;
504 int threshold_public_resets_post_handshake_;
505 int receive_buffer_size_;
jri8c44d692015-10-23 23:53:41506 bool close_sessions_on_ip_change_;
zhongyi89649c32016-01-22 00:14:01507 bool disable_quic_on_timeout_with_open_streams_;
rtenneti41c09992015-11-30 18:24:01508 int idle_connection_timeout_seconds_;
jri7e636642016-01-14 06:57:08509 bool migrate_sessions_on_network_change_;
jrid36ada62016-02-06 02:42:08510 bool migrate_sessions_early_;
[email protected]e13201d82012-12-12 05:00:32511};
512
bnc359ed2a2016-04-29 20:43:45513class QuicStreamFactoryTest : public QuicStreamFactoryTestBase,
514 public ::testing::TestWithParam<TestParams> {
515 protected:
516 QuicStreamFactoryTest()
517 : QuicStreamFactoryTestBase(GetParam().version,
518 GetParam().enable_connection_racing) {}
519};
520
rtenneti14abd312015-02-06 21:56:01521INSTANTIATE_TEST_CASE_P(Version,
522 QuicStreamFactoryTest,
523 ::testing::ValuesIn(GetTestParams()));
[email protected]1e960032013-12-20 19:00:20524
[email protected]1e960032013-12-20 19:00:20525TEST_P(QuicStreamFactoryTest, Create) {
jri7046038f2015-10-22 00:29:26526 Initialize();
rch6faa4d42016-01-05 20:48:43527 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
528 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26529
mmenke651bae7f2015-12-18 21:26:45530 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
531 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:32532 socket_factory_.AddSocketDataProvider(&socket_data);
533
jri7046038f2015-10-22 00:29:26534 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:59535 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56536 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56537 /*cert_verify_flags=*/0, url_, "GET", net_log_,
538 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32539
540 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:42541 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]0edce6a2013-05-08 18:02:40542 EXPECT_TRUE(stream.get());
[email protected]e13201d82012-12-12 05:00:32543
544 // Will reset stream 3.
bnccb7ff3c2015-05-21 20:51:55545 stream = CreateFromSession(host_port_pair_);
[email protected]e13201d82012-12-12 05:00:32546 EXPECT_TRUE(stream.get());
547
[email protected]6d1b4ed2013-07-10 03:57:54548 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
549 // in streams on different sessions.
jri7046038f2015-10-22 00:29:26550 QuicStreamRequest request2(factory_.get());
ckrasic3865ee0f2016-02-29 22:04:56551 EXPECT_EQ(OK, request2.Request(host_port_pair_, privacy_mode_,
552 /*cert_verify_flags=*/0, url_, "GET", net_log_,
553 callback_.callback()));
xunjieli2608f9b2016-03-14 13:39:23554 stream = request2.CreateStream(); // Will reset stream 5.
rjshaded5ced072015-12-18 19:26:02555 stream.reset(); // Will reset stream 7.
[email protected]e13201d82012-12-12 05:00:32556
rch37de576c2015-05-17 20:28:17557 EXPECT_TRUE(socket_data.AllReadDataConsumed());
558 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:32559}
560
[email protected]8bd2b812014-03-26 04:01:17561TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
jri7046038f2015-10-22 00:29:26562 Initialize();
rch6faa4d42016-01-05 20:48:43563 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
564 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26565
mmenke651bae7f2015-12-18 21:26:45566 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
567 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17568 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]8bd2b812014-03-26 04:01:17569
570 crypto_client_stream_factory_.set_handshake_mode(
571 MockCryptoClientStream::ZERO_RTT);
572 host_resolver_.set_synchronous_mode(true);
573 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
574 "192.168.0.1", "");
575
jri7046038f2015-10-22 00:29:26576 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56577 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56578 /*cert_verify_flags=*/0, url_, "GET", net_log_,
579 callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17580
danakjad1777e2016-04-16 00:56:42581 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]8bd2b812014-03-26 04:01:17582 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17583 EXPECT_TRUE(socket_data.AllReadDataConsumed());
584 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17585}
586
587TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
jri7046038f2015-10-22 00:29:26588 Initialize();
rch6faa4d42016-01-05 20:48:43589 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
590 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26591
mmenke651bae7f2015-12-18 21:26:45592 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
593 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17594 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]8bd2b812014-03-26 04:01:17595
596 crypto_client_stream_factory_.set_handshake_mode(
597 MockCryptoClientStream::ZERO_RTT);
598 host_resolver_.set_synchronous_mode(true);
599 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
600 "192.168.0.1", "");
601
jri7046038f2015-10-22 00:29:26602 QuicStreamRequest request(factory_.get());
[email protected]8bd2b812014-03-26 04:01:17603 // Posts require handshake confirmation, so this will return asynchronously.
604 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56605 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56606 /*cert_verify_flags=*/0, url_, "POST", net_log_,
607 callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17608
609 // Confirm the handshake and verify that the stream is created.
610 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
611 QuicSession::HANDSHAKE_CONFIRMED);
612
613 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:42614 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]8bd2b812014-03-26 04:01:17615 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17616 EXPECT_TRUE(socket_data.AllReadDataConsumed());
617 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17618}
619
rch68955482015-09-24 00:14:39620TEST_P(QuicStreamFactoryTest, GoAway) {
jri7046038f2015-10-22 00:29:26621 Initialize();
rch6faa4d42016-01-05 20:48:43622 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
623 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26624
mmenke651bae7f2015-12-18 21:26:45625 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
626 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rch68955482015-09-24 00:14:39627 socket_factory_.AddSocketDataProvider(&socket_data);
rch68955482015-09-24 00:14:39628
jri7046038f2015-10-22 00:29:26629 QuicStreamRequest request(factory_.get());
rch68955482015-09-24 00:14:39630 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56631 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56632 /*cert_verify_flags=*/0, url_, "GET", net_log_,
633 callback_.callback()));
rch68955482015-09-24 00:14:39634
635 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:42636 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rch68955482015-09-24 00:14:39637 EXPECT_TRUE(stream.get());
638
bnc912a04b2016-04-20 14:19:50639 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
rch68955482015-09-24 00:14:39640
641 session->OnGoAway(QuicGoAwayFrame());
642
bnc912a04b2016-04-20 14:19:50643 EXPECT_FALSE(HasActiveSession(host_port_pair_));
rch68955482015-09-24 00:14:39644
645 EXPECT_TRUE(socket_data.AllReadDataConsumed());
646 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
647}
648
zhongyi6b5a3892016-03-12 04:46:20649TEST_P(QuicStreamFactoryTest, GoAwayForConnectionMigrationWithPortOnly) {
650 Initialize();
651 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
652 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
653
654 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
655 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
656 socket_factory_.AddSocketDataProvider(&socket_data);
657
658 QuicStreamRequest request(factory_.get());
659 EXPECT_EQ(ERR_IO_PENDING,
660 request.Request(host_port_pair_, privacy_mode_,
661 /*cert_verify_flags=*/0, url_, "GET", net_log_,
662 callback_.callback()));
663
664 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:42665 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
zhongyi6b5a3892016-03-12 04:46:20666 EXPECT_TRUE(stream.get());
667
bnc912a04b2016-04-20 14:19:50668 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
zhongyi6b5a3892016-03-12 04:46:20669
670 session->OnGoAway(
671 QuicGoAwayFrame(QUIC_ERROR_MIGRATING_PORT, 0,
672 "peer connection migration due to port change only"));
673 NetErrorDetails details;
674 EXPECT_FALSE(details.quic_port_migration_detected);
675 session->PopulateNetErrorDetails(&details);
676 EXPECT_TRUE(details.quic_port_migration_detected);
677 details.quic_port_migration_detected = false;
678 stream->PopulateNetErrorDetails(&details);
679 EXPECT_TRUE(details.quic_port_migration_detected);
680
bnc912a04b2016-04-20 14:19:50681 EXPECT_FALSE(HasActiveSession(host_port_pair_));
zhongyi6b5a3892016-03-12 04:46:20682
683 EXPECT_TRUE(socket_data.AllReadDataConsumed());
684 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
685}
686
[email protected]5db452202014-08-19 05:22:15687TEST_P(QuicStreamFactoryTest, Pooling) {
jri7046038f2015-10-22 00:29:26688 Initialize();
rch6faa4d42016-01-05 20:48:43689 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
690 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26691
mmenke651bae7f2015-12-18 21:26:45692 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
693 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38694 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]eed749f92013-12-23 18:57:38695
rch6faa4d42016-01-05 20:48:43696 HostPortPair server2(kServer2HostName, kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38697 host_resolver_.set_synchronous_mode(true);
rch6faa4d42016-01-05 20:48:43698 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
rjshaded5ced072015-12-18 19:26:02699 "192.168.0.1", "");
rch6faa4d42016-01-05 20:48:43700 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38701
jri7046038f2015-10-22 00:29:26702 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56703 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56704 /*cert_verify_flags=*/0, url_, "GET", net_log_,
705 callback_.callback()));
danakjad1777e2016-04-16 00:56:42706 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]eed749f92013-12-23 18:57:38707 EXPECT_TRUE(stream.get());
708
709 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26710 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56711 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56712 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50713 net_log_, callback.callback()));
danakjad1777e2016-04-16 00:56:42714 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]eed749f92013-12-23 18:57:38715 EXPECT_TRUE(stream2.get());
716
bnc912a04b2016-04-20 14:19:50717 EXPECT_EQ(GetActiveSession(host_port_pair_), GetActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:38718
rch37de576c2015-05-17 20:28:17719 EXPECT_TRUE(socket_data.AllReadDataConsumed());
720 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38721}
722
jri584002d12014-09-09 00:51:28723TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) {
jri7046038f2015-10-22 00:29:26724 disable_connection_pooling_ = true;
725 Initialize();
rch6faa4d42016-01-05 20:48:43726 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
727 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
728 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26729
mmenke651bae7f2015-12-18 21:26:45730 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
731 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
732 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28733 socket_factory_.AddSocketDataProvider(&socket_data1);
734 socket_factory_.AddSocketDataProvider(&socket_data2);
jri584002d12014-09-09 00:51:28735
rch6faa4d42016-01-05 20:48:43736 HostPortPair server2(kServer2HostName, kDefaultServerPort);
jri584002d12014-09-09 00:51:28737 host_resolver_.set_synchronous_mode(true);
rch6faa4d42016-01-05 20:48:43738 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
rjshaded5ced072015-12-18 19:26:02739 "192.168.0.1", "");
rch6faa4d42016-01-05 20:48:43740 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
jri584002d12014-09-09 00:51:28741
jri7046038f2015-10-22 00:29:26742 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56743 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56744 /*cert_verify_flags=*/0, url_, "GET", net_log_,
745 callback_.callback()));
danakjad1777e2016-04-16 00:56:42746 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri584002d12014-09-09 00:51:28747 EXPECT_TRUE(stream.get());
748
749 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26750 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56751 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56752 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50753 net_log_, callback.callback()));
danakjad1777e2016-04-16 00:56:42754 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jri584002d12014-09-09 00:51:28755 EXPECT_TRUE(stream2.get());
756
bnc912a04b2016-04-20 14:19:50757 EXPECT_NE(GetActiveSession(host_port_pair_), GetActiveSession(server2));
jri584002d12014-09-09 00:51:28758
rch37de576c2015-05-17 20:28:17759 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
760 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
761 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
762 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28763}
764
[email protected]eed749f92013-12-23 18:57:38765TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
jri7046038f2015-10-22 00:29:26766 Initialize();
rch6faa4d42016-01-05 20:48:43767 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
768 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
769 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26770
mmenke651bae7f2015-12-18 21:26:45771 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
772 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
773 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38774 socket_factory_.AddSocketDataProvider(&socket_data1);
775 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]eed749f92013-12-23 18:57:38776
rch6faa4d42016-01-05 20:48:43777 HostPortPair server2(kServer2HostName, kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38778 host_resolver_.set_synchronous_mode(true);
rch6faa4d42016-01-05 20:48:43779 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
rjshaded5ced072015-12-18 19:26:02780 "192.168.0.1", "");
rch6faa4d42016-01-05 20:48:43781 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38782
jri7046038f2015-10-22 00:29:26783 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56784 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56785 /*cert_verify_flags=*/0, url_, "GET", net_log_,
786 callback_.callback()));
danakjad1777e2016-04-16 00:56:42787 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]eed749f92013-12-23 18:57:38788 EXPECT_TRUE(stream.get());
789
790 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26791 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56792 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56793 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50794 net_log_, callback.callback()));
danakjad1777e2016-04-16 00:56:42795 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]eed749f92013-12-23 18:57:38796 EXPECT_TRUE(stream2.get());
797
bnc912a04b2016-04-20 14:19:50798 factory_->OnSessionGoingAway(GetActiveSession(host_port_pair_));
799 EXPECT_FALSE(HasActiveSession(host_port_pair_));
800 EXPECT_FALSE(HasActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:38801
802 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:26803 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:56804 EXPECT_EQ(OK, request3.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56805 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50806 net_log_, callback3.callback()));
danakjad1777e2016-04-16 00:56:42807 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
[email protected]eed749f92013-12-23 18:57:38808 EXPECT_TRUE(stream3.get());
809
bnc912a04b2016-04-20 14:19:50810 EXPECT_TRUE(HasActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:38811
rch37de576c2015-05-17 20:28:17812 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
813 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
814 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
815 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38816}
817
[email protected]5db452202014-08-19 05:22:15818TEST_P(QuicStreamFactoryTest, HttpsPooling) {
jri7046038f2015-10-22 00:29:26819 Initialize();
rch6faa4d42016-01-05 20:48:43820
mmenke651bae7f2015-12-18 21:26:45821 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
822 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38823 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]eed749f92013-12-23 18:57:38824
rch6faa4d42016-01-05 20:48:43825 HostPortPair server1(kDefaultServerHostName, 443);
826 HostPortPair server2(kServer2HostName, 443);
[email protected]eed749f92013-12-23 18:57:38827
bncf8bf0722015-05-19 20:04:13828 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01829 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38830
831 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53832 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
833 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38834
jri7046038f2015-10-22 00:29:26835 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56836 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56837 /*cert_verify_flags=*/0, url_, "GET", net_log_,
838 callback_.callback()));
danakjad1777e2016-04-16 00:56:42839 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]eed749f92013-12-23 18:57:38840 EXPECT_TRUE(stream.get());
841
842 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26843 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56844 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56845 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50846 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:42847 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]eed749f92013-12-23 18:57:38848 EXPECT_TRUE(stream2.get());
849
bnc912a04b2016-04-20 14:19:50850 EXPECT_EQ(GetActiveSession(server1), GetActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:38851
rch37de576c2015-05-17 20:28:17852 EXPECT_TRUE(socket_data.AllReadDataConsumed());
853 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38854}
855
jri584002d12014-09-09 00:51:28856TEST_P(QuicStreamFactoryTest, NoHttpsPoolingIfDisabled) {
jri7046038f2015-10-22 00:29:26857 disable_connection_pooling_ = true;
858 Initialize();
859
mmenke651bae7f2015-12-18 21:26:45860 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
861 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
862 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28863 socket_factory_.AddSocketDataProvider(&socket_data1);
864 socket_factory_.AddSocketDataProvider(&socket_data2);
jri584002d12014-09-09 00:51:28865
rch6faa4d42016-01-05 20:48:43866 HostPortPair server1(kDefaultServerHostName, 443);
867 HostPortPair server2(kServer2HostName, 443);
jri584002d12014-09-09 00:51:28868
bncf8bf0722015-05-19 20:04:13869 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01870 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rch6faa4d42016-01-05 20:48:43871 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28872
873 host_resolver_.set_synchronous_mode(true);
874 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
875 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
876
jri7046038f2015-10-22 00:29:26877 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56878 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56879 /*cert_verify_flags=*/0, url_, "GET", net_log_,
880 callback_.callback()));
danakjad1777e2016-04-16 00:56:42881 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri584002d12014-09-09 00:51:28882 EXPECT_TRUE(stream.get());
883
884 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26885 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56886 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56887 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50888 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:42889 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jri584002d12014-09-09 00:51:28890 EXPECT_TRUE(stream2.get());
891
bnc912a04b2016-04-20 14:19:50892 EXPECT_NE(GetActiveSession(server1), GetActiveSession(server2));
jri584002d12014-09-09 00:51:28893
rch37de576c2015-05-17 20:28:17894 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
895 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
896 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
897 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28898}
899
[email protected]5db452202014-08-19 05:22:15900TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
jri7046038f2015-10-22 00:29:26901 Initialize();
mmenke651bae7f2015-12-18 21:26:45902 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
903 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15904 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]5db452202014-08-19 05:22:15905
rch6faa4d42016-01-05 20:48:43906 HostPortPair server1(kDefaultServerHostName, 443);
907 HostPortPair server2(kServer2HostName, 443);
Avi Drissman13fc8932015-12-20 04:40:46908 uint8_t primary_pin = 1;
909 uint8_t backup_pin = 2;
rch6faa4d42016-01-05 20:48:43910 test::AddPin(&transport_security_state_, kServer2HostName, primary_pin,
[email protected]5db452202014-08-19 05:22:15911 backup_pin);
912
bncf8bf0722015-05-19 20:04:13913 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
[email protected]5db452202014-08-19 05:22:15914 verify_details.cert_verify_result.public_key_hashes.push_back(
915 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01916 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]5db452202014-08-19 05:22:15917
918 host_resolver_.set_synchronous_mode(true);
919 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
920 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
921
jri7046038f2015-10-22 00:29:26922 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56923 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56924 /*cert_verify_flags=*/0, url_, "GET", net_log_,
925 callback_.callback()));
danakjad1777e2016-04-16 00:56:42926 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]5db452202014-08-19 05:22:15927 EXPECT_TRUE(stream.get());
928
929 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26930 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56931 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56932 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50933 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:42934 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]5db452202014-08-19 05:22:15935 EXPECT_TRUE(stream2.get());
936
bnc912a04b2016-04-20 14:19:50937 EXPECT_EQ(GetActiveSession(server1), GetActiveSession(server2));
[email protected]5db452202014-08-19 05:22:15938
rch37de576c2015-05-17 20:28:17939 EXPECT_TRUE(socket_data.AllReadDataConsumed());
940 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:15941}
942
jri584002d12014-09-09 00:51:28943TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithMatchingPinsIfDisabled) {
jri7046038f2015-10-22 00:29:26944 disable_connection_pooling_ = true;
945 Initialize();
946
mmenke651bae7f2015-12-18 21:26:45947 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
948 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
949 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28950 socket_factory_.AddSocketDataProvider(&socket_data1);
951 socket_factory_.AddSocketDataProvider(&socket_data2);
jri584002d12014-09-09 00:51:28952
rch6faa4d42016-01-05 20:48:43953 HostPortPair server1(kDefaultServerHostName, 443);
954 HostPortPair server2(kServer2HostName, 443);
Avi Drissman13fc8932015-12-20 04:40:46955 uint8_t primary_pin = 1;
956 uint8_t backup_pin = 2;
rch6faa4d42016-01-05 20:48:43957 test::AddPin(&transport_security_state_, kServer2HostName, primary_pin,
jri584002d12014-09-09 00:51:28958 backup_pin);
959
bncf8bf0722015-05-19 20:04:13960 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
jri584002d12014-09-09 00:51:28961 verify_details.cert_verify_result.public_key_hashes.push_back(
962 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01963 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rch6faa4d42016-01-05 20:48:43964 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28965
966 host_resolver_.set_synchronous_mode(true);
967 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
968 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
969
jri7046038f2015-10-22 00:29:26970 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56971 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56972 /*cert_verify_flags=*/0, url_, "GET", net_log_,
973 callback_.callback()));
danakjad1777e2016-04-16 00:56:42974 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri584002d12014-09-09 00:51:28975 EXPECT_TRUE(stream.get());
976
977 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26978 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56979 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56980 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50981 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:42982 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jri584002d12014-09-09 00:51:28983 EXPECT_TRUE(stream2.get());
984
bnc912a04b2016-04-20 14:19:50985 EXPECT_NE(GetActiveSession(server1), GetActiveSession(server2));
jri584002d12014-09-09 00:51:28986
rch37de576c2015-05-17 20:28:17987 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
988 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
989 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
990 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28991}
992
[email protected]5db452202014-08-19 05:22:15993TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
jri7046038f2015-10-22 00:29:26994 Initialize();
mmenke651bae7f2015-12-18 21:26:45995 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
996 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
997 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15998 socket_factory_.AddSocketDataProvider(&socket_data1);
999 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]5db452202014-08-19 05:22:151000
rch6faa4d42016-01-05 20:48:431001 HostPortPair server1(kDefaultServerHostName, 443);
1002 HostPortPair server2(kServer2HostName, 443);
Avi Drissman13fc8932015-12-20 04:40:461003 uint8_t primary_pin = 1;
1004 uint8_t backup_pin = 2;
1005 uint8_t bad_pin = 3;
rch6faa4d42016-01-05 20:48:431006 test::AddPin(&transport_security_state_, kServer2HostName, primary_pin,
[email protected]5db452202014-08-19 05:22:151007 backup_pin);
1008
bncf8bf0722015-05-19 20:04:131009 ProofVerifyDetailsChromium verify_details1 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011010 verify_details1.cert_verify_result.public_key_hashes.push_back(
1011 test::GetTestHashValue(bad_pin));
1012 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
1013
bncf8bf0722015-05-19 20:04:131014 ProofVerifyDetailsChromium verify_details2 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011015 verify_details2.cert_verify_result.public_key_hashes.push_back(
1016 test::GetTestHashValue(primary_pin));
1017 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
[email protected]5db452202014-08-19 05:22:151018
1019 host_resolver_.set_synchronous_mode(true);
1020 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1021 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1022
jri7046038f2015-10-22 00:29:261023 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561024 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561025 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1026 callback_.callback()));
danakjad1777e2016-04-16 00:56:421027 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]5db452202014-08-19 05:22:151028 EXPECT_TRUE(stream.get());
1029
1030 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:261031 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:561032 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561033 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:501034 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:421035 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]5db452202014-08-19 05:22:151036 EXPECT_TRUE(stream2.get());
1037
bnc912a04b2016-04-20 14:19:501038 EXPECT_NE(GetActiveSession(server1), GetActiveSession(server2));
[email protected]5db452202014-08-19 05:22:151039
rch37de576c2015-05-17 20:28:171040 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1041 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1042 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1043 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:151044}
1045
[email protected]1e960032013-12-20 19:00:201046TEST_P(QuicStreamFactoryTest, Goaway) {
jri7046038f2015-10-22 00:29:261047 Initialize();
rch6faa4d42016-01-05 20:48:431048 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1049 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1050 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1051
mmenke651bae7f2015-12-18 21:26:451052 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1053 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271054 socket_factory_.AddSocketDataProvider(&socket_data);
mmenke651bae7f2015-12-18 21:26:451055 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271056 socket_factory_.AddSocketDataProvider(&socket_data2);
1057
jri7046038f2015-10-22 00:29:261058 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591059 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561060 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561061 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1062 callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271063
1064 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421065 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]4d283b32013-10-17 12:57:271066 EXPECT_TRUE(stream.get());
1067
1068 // Mark the session as going away. Ensure that while it is still alive
1069 // that it is no longer active.
bnc912a04b2016-04-20 14:19:501070 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7046038f2015-10-22 00:29:261071 factory_->OnSessionGoingAway(session);
1072 EXPECT_EQ(true,
1073 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
bnc912a04b2016-04-20 14:19:501074 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]4d283b32013-10-17 12:57:271075
1076 // Create a new request for the same destination and verify that a
1077 // new session is created.
jri7046038f2015-10-22 00:29:261078 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591079 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561080 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561081 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1082 callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271083 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421084 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]4d283b32013-10-17 12:57:271085 EXPECT_TRUE(stream2.get());
1086
bnc912a04b2016-04-20 14:19:501087 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1088 EXPECT_NE(session, GetActiveSession(host_port_pair_));
jri7046038f2015-10-22 00:29:261089 EXPECT_EQ(true,
1090 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
[email protected]4d283b32013-10-17 12:57:271091
1092 stream2.reset();
1093 stream.reset();
1094
rch37de576c2015-05-17 20:28:171095 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1096 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1097 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1098 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]4d283b32013-10-17 12:57:271099}
1100
[email protected]1e960032013-12-20 19:00:201101TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
jri7046038f2015-10-22 00:29:261102 Initialize();
rch6faa4d42016-01-05 20:48:431103 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1104 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1105
[email protected]66ae5962014-05-22 11:13:051106 QuicStreamId stream_id = kClientDataStreamId1;
danakjad1777e2016-04-16 00:56:421107 std::unique_ptr<QuicEncryptedPacket> client_rst(
[email protected]1e960032013-12-20 19:00:201108 maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
[email protected]06ff5152013-08-29 01:03:051109 MockWrite writes[] = {
ckrasicea295fe2015-10-31 05:03:271110 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 0),
1111 };
danakjad1777e2016-04-16 00:56:421112 std::unique_ptr<QuicEncryptedPacket> server_rst(
ckrasicea295fe2015-10-31 05:03:271113 maker_.MakeRstPacket(1, false, stream_id, QUIC_STREAM_CANCELLED));
1114 MockRead reads[] = {
1115 MockRead(ASYNC, server_rst->data(), server_rst->length(), 1),
mmenke651bae7f2015-12-18 21:26:451116 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
1117 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1118 arraysize(writes));
[email protected]0b2294d32013-08-02 00:46:361119 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0b2294d32013-08-02 00:46:361120
1121 HttpRequestInfo request_info;
1122 std::vector<QuicHttpStream*> streams;
1123 // The MockCryptoClientStream sets max_open_streams to be
rtenneti6a4cf3b2015-01-09 03:41:151124 // kDefaultMaxStreamsPerConnection / 2.
1125 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection / 2; i++) {
jri7046038f2015-10-22 00:29:261126 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561127 int rv = request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561128 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1129 callback_.callback());
[email protected]0b2294d32013-08-02 00:46:361130 if (i == 0) {
1131 EXPECT_EQ(ERR_IO_PENDING, rv);
1132 EXPECT_EQ(OK, callback_.WaitForResult());
1133 } else {
1134 EXPECT_EQ(OK, rv);
1135 }
danakjad1777e2016-04-16 00:56:421136 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]0b2294d32013-08-02 00:46:361137 EXPECT_TRUE(stream);
rjshaded5ced072015-12-18 19:26:021138 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1139 net_log_, CompletionCallback()));
[email protected]0b2294d32013-08-02 00:46:361140 streams.push_back(stream.release());
1141 }
1142
jri7046038f2015-10-22 00:29:261143 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561144 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561145 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1146 CompletionCallback()));
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(ERR_IO_PENDING,
1150 stream->InitializeStream(&request_info, DEFAULT_PRIORITY, net_log_,
1151 callback_.callback()));
[email protected]0b2294d32013-08-02 00:46:361152
1153 // Close the first stream.
1154 streams.front()->Close(false);
ckrasicea295fe2015-10-31 05:03:271155 // Trigger exchange of RSTs that in turn allow progress for the last
1156 // stream.
[email protected]0b2294d32013-08-02 00:46:361157 EXPECT_EQ(OK, callback_.WaitForResult());
1158
rch37de576c2015-05-17 20:28:171159 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1160 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
ckrasicea295fe2015-10-31 05:03:271161
1162 // Force close of the connection to suppress the generation of RST
1163 // packets when streams are torn down, which wouldn't be relevant to
1164 // this test anyway.
bnc912a04b2016-04-20 14:19:501165 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri78ec06a2016-03-31 18:19:401166 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
1167 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasicea295fe2015-10-31 05:03:271168
[email protected]0b2294d32013-08-02 00:46:361169 STLDeleteElements(&streams);
1170}
1171
[email protected]1e960032013-12-20 19:00:201172TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
jri7046038f2015-10-22 00:29:261173 Initialize();
mmenke651bae7f2015-12-18 21:26:451174 SequencedSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321175 socket_factory_.AddSocketDataProvider(&socket_data);
1176
[email protected]3c772402013-12-18 21:38:111177 host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName);
[email protected]e13201d82012-12-12 05:00:321178
jri7046038f2015-10-22 00:29:261179 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591180 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561181 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561182 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1183 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321184
1185 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
1186
rch37de576c2015-05-17 20:28:171187 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1188 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321189}
1190
[email protected]1e960032013-12-20 19:00:201191TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
jri7046038f2015-10-22 00:29:261192 Initialize();
[email protected]3c772402013-12-18 21:38:111193 MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
mmenke651bae7f2015-12-18 21:26:451194 SequencedSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]3c772402013-12-18 21:38:111195 socket_data.set_connect_data(connect);
1196 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]3c772402013-12-18 21:38:111197
jri7046038f2015-10-22 00:29:261198 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591199 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561200 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561201 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1202 callback_.callback()));
[email protected]3c772402013-12-18 21:38:111203
1204 EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult());
1205
rch37de576c2015-05-17 20:28:171206 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1207 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:111208}
1209
[email protected]1e960032013-12-20 19:00:201210TEST_P(QuicStreamFactoryTest, CancelCreate) {
jri7046038f2015-10-22 00:29:261211 Initialize();
mmenke651bae7f2015-12-18 21:26:451212 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1213 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321214 socket_factory_.AddSocketDataProvider(&socket_data);
1215 {
jri7046038f2015-10-22 00:29:261216 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591217 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561218 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561219 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1220 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321221 }
1222
mmenke651bae7f2015-12-18 21:26:451223 base::RunLoop().RunUntilIdle();
[email protected]e13201d82012-12-12 05:00:321224
danakjad1777e2016-04-16 00:56:421225 std::unique_ptr<QuicHttpStream> stream(CreateFromSession(host_port_pair_));
[email protected]e13201d82012-12-12 05:00:321226 EXPECT_TRUE(stream.get());
1227 stream.reset();
1228
rch37de576c2015-05-17 20:28:171229 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1230 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321231}
1232
[email protected]1e960032013-12-20 19:00:201233TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) {
jri7046038f2015-10-22 00:29:261234 Initialize();
rch6faa4d42016-01-05 20:48:431235 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1236 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1237 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1238 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261239
[email protected]3c772402013-12-18 21:38:111240 // Sequentially connect to the default host, then another host, and then the
1241 // default host. Verify that the default host gets a consistent ephemeral
1242 // port, that is different from the other host's connection.
1243
rch6faa4d42016-01-05 20:48:431244 std::string other_server_name = kServer2HostName;
[email protected]3c772402013-12-18 21:38:111245 EXPECT_NE(kDefaultServerHostName, other_server_name);
1246 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort);
[email protected]3c772402013-12-18 21:38:111247
[email protected]bf4ea2f2014-03-10 22:57:531248 int original_port = GetSourcePortForNewSession(host_port_pair_);
1249 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2));
1250 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]3c772402013-12-18 21:38:111251}
1252
[email protected]d8e2abf82014-03-06 10:30:101253TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) {
jri7046038f2015-10-22 00:29:261254 Initialize();
rch6faa4d42016-01-05 20:48:431255 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1256 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1257 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1258 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261259
[email protected]d8e2abf82014-03-06 10:30:101260 // Get a session to the host using the port suggester.
rjshaded5ced072015-12-18 19:26:021261 int original_port = GetSourcePortForNewSessionAndGoAway(host_port_pair_);
[email protected]d8e2abf82014-03-06 10:30:101262 // Verify that the port is different after the goaway.
[email protected]bf4ea2f2014-03-10 22:57:531263 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101264 // Since the previous session did not goaway we should see the original port.
[email protected]bf4ea2f2014-03-10 22:57:531265 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101266}
1267
[email protected]1e960032013-12-20 19:00:201268TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
jri7046038f2015-10-22 00:29:261269 Initialize();
rch6faa4d42016-01-05 20:48:431270 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1271 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1272 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1273
mmenke651bae7f2015-12-18 21:26:451274 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421275 std::unique_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
[email protected]459a7402014-02-10 12:58:521276 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311277 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:451278 SequencedSocketData socket_data(reads, arraysize(reads),
1279 writes.empty() ? nullptr : &writes[0],
1280 writes.size());
[email protected]56dfb902013-01-03 23:17:551281 socket_factory_.AddSocketDataProvider(&socket_data);
1282
mmenke651bae7f2015-12-18 21:26:451283 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1284 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]56dfb902013-01-03 23:17:551285 socket_factory_.AddSocketDataProvider(&socket_data2);
1286
jri7046038f2015-10-22 00:29:261287 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591288 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561289 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561290 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1291 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551292
1293 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421294 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]0b2294d32013-08-02 00:46:361295 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:021296 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]0b2294d32013-08-02 00:46:361297 net_log_, CompletionCallback()));
[email protected]56dfb902013-01-03 23:17:551298
1299 // Close the session and verify that stream saw the error.
jri7e636642016-01-14 06:57:081300 factory_->CloseAllSessions(ERR_INTERNET_DISCONNECTED, QUIC_INTERNAL_ERROR);
[email protected]56dfb902013-01-03 23:17:551301 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1302 stream->ReadResponseHeaders(callback_.callback()));
1303
1304 // Now attempting to request a stream to the same origin should create
1305 // a new session.
1306
jri7046038f2015-10-22 00:29:261307 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591308 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561309 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561310 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1311 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551312
1313 EXPECT_EQ(OK, callback_.WaitForResult());
xunjieli2608f9b2016-03-14 13:39:231314 stream = request2.CreateStream();
[email protected]56dfb902013-01-03 23:17:551315 stream.reset(); // Will reset stream 3.
1316
rch37de576c2015-05-17 20:28:171317 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1318 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1319 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1320 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]56dfb902013-01-03 23:17:551321}
1322
[email protected]1e960032013-12-20 19:00:201323TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
jri8c44d692015-10-23 23:53:411324 close_sessions_on_ip_change_ = true;
jri7046038f2015-10-22 00:29:261325 Initialize();
rch6faa4d42016-01-05 20:48:431326 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1327 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1328 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri8c44d692015-10-23 23:53:411329
mmenke651bae7f2015-12-18 21:26:451330 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421331 std::unique_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
[email protected]459a7402014-02-10 12:58:521332 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311333 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:451334 SequencedSocketData socket_data(reads, arraysize(reads),
1335 writes.empty() ? nullptr : &writes[0],
1336 writes.size());
[email protected]f698a012013-05-06 20:18:591337 socket_factory_.AddSocketDataProvider(&socket_data);
1338
mmenke651bae7f2015-12-18 21:26:451339 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1340 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]f698a012013-05-06 20:18:591341 socket_factory_.AddSocketDataProvider(&socket_data2);
1342
jri7046038f2015-10-22 00:29:261343 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591344 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561345 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561346 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1347 callback_.callback()));
[email protected]f698a012013-05-06 20:18:591348
1349 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421350 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]0b2294d32013-08-02 00:46:361351 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:021352 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]0b2294d32013-08-02 00:46:361353 net_log_, CompletionCallback()));
[email protected]f698a012013-05-06 20:18:591354
1355 // Change the IP address and verify that stream saw the error.
jri8c44d692015-10-23 23:53:411356 NotifyIPAddressChanged();
[email protected]f698a012013-05-06 20:18:591357 EXPECT_EQ(ERR_NETWORK_CHANGED,
1358 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:261359 EXPECT_TRUE(factory_->require_confirmation());
[email protected]f698a012013-05-06 20:18:591360
1361 // Now attempting to request a stream to the same origin should create
1362 // a new session.
1363
jri7046038f2015-10-22 00:29:261364 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591365 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561366 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561367 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1368 callback_.callback()));
[email protected]f698a012013-05-06 20:18:591369
1370 EXPECT_EQ(OK, callback_.WaitForResult());
xunjieli2608f9b2016-03-14 13:39:231371 stream = request2.CreateStream();
[email protected]f698a012013-05-06 20:18:591372 stream.reset(); // Will reset stream 3.
1373
rch37de576c2015-05-17 20:28:171374 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1375 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1376 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1377 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]f698a012013-05-06 20:18:591378}
1379
jri7e636642016-01-14 06:57:081380TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnect) {
1381 InitializeConnectionMigrationTest(
1382 {kDefaultNetworkForTests, kNewNetworkForTests});
1383 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1384 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1385 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1386
1387 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421388 std::unique_ptr<QuicEncryptedPacket> request_packet(
jri7e636642016-01-14 06:57:081389 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true));
1390 MockWrite writes[] = {MockWrite(SYNCHRONOUS, request_packet->data(),
1391 request_packet->length(), 1)};
1392 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1393 arraysize(writes));
1394 socket_factory_.AddSocketDataProvider(&socket_data);
1395
1396 // Create request and QuicHttpStream.
1397 QuicStreamRequest request(factory_.get());
1398 EXPECT_EQ(ERR_IO_PENDING,
1399 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561400 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1401 callback_.callback()));
jri7e636642016-01-14 06:57:081402 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421403 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081404 EXPECT_TRUE(stream.get());
1405
1406 // Cause QUIC stream to be created.
1407 HttpRequestInfo request_info;
1408 request_info.method = "GET";
1409 request_info.url = GURL("https://www.example.org/");
1410 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1411 net_log_, CompletionCallback()));
1412
1413 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501414 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:081415 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1416 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1417
1418 // Send GET request on stream.
1419 HttpResponseInfo response;
1420 HttpRequestHeaders request_headers;
1421 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
1422 callback_.callback()));
1423
1424 // Set up second socket data provider that is used after migration.
1425 // The response to the earlier request is read on this new socket.
danakjad1777e2016-04-16 00:56:421426 std::unique_ptr<QuicEncryptedPacket> ping(
jri7e636642016-01-14 06:57:081427 maker_.MakePingPacket(2, /*include_version=*/true));
1428 MockWrite writes1[] = {
1429 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 0)};
danakjad1777e2016-04-16 00:56:421430 std::unique_ptr<QuicEncryptedPacket> response_headers_packet(
jri7e636642016-01-14 06:57:081431 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
1432 MockRead reads1[] = {MockRead(ASYNC, response_headers_packet->data(),
1433 response_headers_packet->length(), 1),
1434 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
1435 SequencedSocketData socket_data1(reads1, arraysize(reads1), writes1,
1436 arraysize(writes1));
1437 socket_factory_.AddSocketDataProvider(&socket_data1);
1438
1439 // Trigger connection migration. This should cause a PING frame
1440 // to be emitted.
1441 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1442 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1443
1444 // The session should now be marked as going away. Ensure that
1445 // while it is still alive, it is no longer active.
1446 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1447 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1448 EXPECT_EQ(1u, session->GetNumActiveStreams());
1449
1450 // Verify that response headers on the migrated socket were delivered to the
1451 // stream.
1452 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
1453 EXPECT_EQ(200, response.headers->response_code());
1454
1455 // Create a new request for the same destination and verify that a
1456 // new session is created.
1457 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1458 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1459 socket_factory_.AddSocketDataProvider(&socket_data2);
1460
1461 QuicStreamRequest request2(factory_.get());
1462 EXPECT_EQ(ERR_IO_PENDING,
1463 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561464 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1465 callback_.callback()));
jri7e636642016-01-14 06:57:081466 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421467 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jri7e636642016-01-14 06:57:081468 EXPECT_TRUE(stream2.get());
1469
bnc912a04b2016-04-20 14:19:501470 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1471 QuicChromiumClientSession* new_session = GetActiveSession(host_port_pair_);
jrid36ada62016-02-06 02:42:081472 EXPECT_NE(session, new_session);
jri7e636642016-01-14 06:57:081473
jrid36ada62016-02-06 02:42:081474 // On a DISCONNECTED notification, nothing happens to the migrated
1475 // session, but the new session is closed since it has no open
1476 // streams.
jri7e636642016-01-14 06:57:081477 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1478 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1479 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1480 EXPECT_EQ(1u, session->GetNumActiveStreams());
jrid36ada62016-02-06 02:42:081481 EXPECT_FALSE(
1482 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), new_session));
jri7e636642016-01-14 06:57:081483
1484 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1485 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1486 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1487 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1488 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1489 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1490}
1491
1492TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnected) {
1493 InitializeConnectionMigrationTest(
1494 {kDefaultNetworkForTests, kNewNetworkForTests});
1495 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1496 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1497 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1498
1499 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421500 std::unique_ptr<QuicEncryptedPacket> request_packet(
jri7e636642016-01-14 06:57:081501 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true));
1502 MockWrite writes[] = {MockWrite(SYNCHRONOUS, request_packet->data(),
1503 request_packet->length(), 1)};
1504 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1505 arraysize(writes));
1506 socket_factory_.AddSocketDataProvider(&socket_data);
1507
1508 // Create request and QuicHttpStream.
1509 QuicStreamRequest request(factory_.get());
1510 EXPECT_EQ(ERR_IO_PENDING,
1511 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561512 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1513 callback_.callback()));
jri7e636642016-01-14 06:57:081514 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421515 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081516 EXPECT_TRUE(stream.get());
1517
1518 // Cause QUIC stream to be created.
1519 HttpRequestInfo request_info;
1520 request_info.method = "GET";
1521 request_info.url = GURL("https://www.example.org/");
1522 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1523 net_log_, CompletionCallback()));
1524
1525 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501526 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:081527 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1528 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1529
1530 // Send GET request on stream.
1531 HttpResponseInfo response_info;
1532 HttpRequestHeaders request_headers;
1533 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response_info,
1534 callback_.callback()));
1535
1536 // Set up second socket data provider that is used after migration.
danakjad1777e2016-04-16 00:56:421537 std::unique_ptr<QuicEncryptedPacket> ping(
jri7e636642016-01-14 06:57:081538 maker_.MakePingPacket(2, /*include_version=*/true));
danakjad1777e2016-04-16 00:56:421539 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri7e636642016-01-14 06:57:081540 3, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1541 MockWrite writes1[] = {
1542 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 0)};
danakjad1777e2016-04-16 00:56:421543 std::unique_ptr<QuicEncryptedPacket> response_packet(
jri7e636642016-01-14 06:57:081544 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
1545 MockRead reads1[] = {
1546 MockRead(ASYNC, response_packet->data(), response_packet->length(), 1),
1547 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
1548 SequencedSocketData socket_data1(reads1, arraysize(reads1), writes1,
1549 arraysize(writes1));
1550 socket_factory_.AddSocketDataProvider(&socket_data1);
1551
1552 // Trigger connection migration. This should cause a PING frame
1553 // to be emitted.
1554 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1555 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1556
1557 // The session should now be marked as going away. Ensure that
1558 // while it is still alive, it is no longer active.
1559 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1560 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1561 EXPECT_EQ(1u, session->GetNumActiveStreams());
1562
1563 // Create a new request for the same destination and verify that a
1564 // new session is created.
1565 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1566 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1567 socket_factory_.AddSocketDataProvider(&socket_data2);
1568
1569 QuicStreamRequest request2(factory_.get());
1570 EXPECT_EQ(ERR_IO_PENDING,
1571 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561572 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1573 callback_.callback()));
jri7e636642016-01-14 06:57:081574 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421575 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jri7e636642016-01-14 06:57:081576 EXPECT_TRUE(stream2.get());
1577
bnc912a04b2016-04-20 14:19:501578 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1579 EXPECT_NE(session, GetActiveSession(host_port_pair_));
jri7e636642016-01-14 06:57:081580 EXPECT_EQ(true,
1581 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1582
1583 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1584 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1585 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1586 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1587 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1588 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1589}
1590
1591TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoNetworks) {
1592 NetworkChangeNotifier::NetworkList no_networks(0);
1593 InitializeConnectionMigrationTest(no_networks);
1594 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1595 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1596
1597 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421598 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri7e636642016-01-14 06:57:081599 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1600 MockWrite writes[] = {
1601 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1602 };
1603 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1604 arraysize(writes));
1605 socket_factory_.AddSocketDataProvider(&socket_data);
1606
1607 // Create request and QuicHttpStream.
1608 QuicStreamRequest request(factory_.get());
1609 EXPECT_EQ(ERR_IO_PENDING,
1610 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561611 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1612 callback_.callback()));
jri7e636642016-01-14 06:57:081613 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421614 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081615 EXPECT_TRUE(stream.get());
1616
1617 // Cause QUIC stream to be created.
1618 HttpRequestInfo request_info;
1619 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1620 net_log_, CompletionCallback()));
1621
1622 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501623 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:081624 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1625 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1626 EXPECT_EQ(1u, session->GetNumActiveStreams());
1627
1628 // Trigger connection migration. Since there are no networks
1629 // to migrate to, this should cause the session to continue on the same
1630 // socket, but be marked as going away.
1631 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1632 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1633
1634 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1635 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1636 EXPECT_EQ(1u, session->GetNumActiveStreams());
1637
1638 stream.reset();
1639
1640 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1641 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1642}
1643
1644TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoNetworks) {
1645 NetworkChangeNotifier::NetworkList no_networks(0);
1646 InitializeConnectionMigrationTest(no_networks);
1647 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1648 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1649
1650 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421651 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri7e636642016-01-14 06:57:081652 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1653 MockWrite writes[] = {
1654 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
1655 };
1656 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1657 arraysize(writes));
1658 socket_factory_.AddSocketDataProvider(&socket_data);
1659
1660 // Create request and QuicHttpStream.
1661 QuicStreamRequest request(factory_.get());
1662 EXPECT_EQ(ERR_IO_PENDING,
1663 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561664 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1665 callback_.callback()));
jri7e636642016-01-14 06:57:081666 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421667 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081668 EXPECT_TRUE(stream.get());
1669
1670 // Cause QUIC stream to be created.
1671 HttpRequestInfo request_info;
1672 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1673 net_log_, CompletionCallback()));
1674
1675 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501676 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:081677 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1678 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1679
1680 // Trigger connection migration. Since there are no networks
1681 // to migrate to, this should cause a RST_STREAM frame to be emitted
1682 // and the session to be closed.
1683 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1684 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1685
1686 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1687 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1688
1689 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1690 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1691}
1692
1693TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoNewNetwork) {
1694 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
1695 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1696 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1697
1698 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421699 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri7e636642016-01-14 06:57:081700 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1701 MockWrite writes[] = {
1702 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1703 };
1704 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1705 arraysize(writes));
1706 socket_factory_.AddSocketDataProvider(&socket_data);
1707
1708 // Create request and QuicHttpStream.
1709 QuicStreamRequest request(factory_.get());
1710 EXPECT_EQ(ERR_IO_PENDING,
1711 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561712 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1713 callback_.callback()));
jri7e636642016-01-14 06:57:081714 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421715 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081716 EXPECT_TRUE(stream.get());
1717
1718 // Cause QUIC stream to be created.
1719 HttpRequestInfo request_info;
1720 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1721 net_log_, CompletionCallback()));
1722
1723 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501724 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:081725 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1726 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1727
1728 // Trigger connection migration. Since there are no networks
1729 // to migrate to, this should cause session to be continue but be marked as
1730 // going away.
1731 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1732 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1733
1734 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1735 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1736 EXPECT_EQ(1u, session->GetNumActiveStreams());
1737
1738 stream.reset();
1739
1740 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1741 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1742}
1743
1744TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoNewNetwork) {
1745 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
1746 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1747 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1748
1749 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421750 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri7e636642016-01-14 06:57:081751 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1752 MockWrite writes[] = {
1753 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
1754 };
1755 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1756 arraysize(writes));
1757 socket_factory_.AddSocketDataProvider(&socket_data);
1758
1759 // Create request and QuicHttpStream.
1760 QuicStreamRequest request(factory_.get());
1761 EXPECT_EQ(ERR_IO_PENDING,
1762 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561763 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1764 callback_.callback()));
jri7e636642016-01-14 06:57:081765 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421766 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081767 EXPECT_TRUE(stream.get());
1768
1769 // Cause QUIC stream to be created.
1770 HttpRequestInfo request_info;
1771 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1772 net_log_, CompletionCallback()));
1773
1774 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501775 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:081776 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1777 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1778
1779 // Trigger connection migration. Since there are no networks
1780 // to migrate to, this should cause a RST_STREAM frame to be emitted
1781 // with QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed.
1782 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1783 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1784
1785 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1786 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1787
1788 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1789 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1790}
1791
jri231c2972016-03-08 19:50:111792TEST_P(QuicStreamFactoryTest,
1793 OnNetworkChangeSoonToDisconnectNonMigratableStream) {
1794 InitializeConnectionMigrationTest(
1795 {kDefaultNetworkForTests, kNewNetworkForTests});
1796 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1797 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1798
1799 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421800 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri231c2972016-03-08 19:50:111801 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1802 MockWrite writes[] = {
1803 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1804 };
1805 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1806 arraysize(writes));
1807 socket_factory_.AddSocketDataProvider(&socket_data);
1808
1809 // Create request and QuicHttpStream.
1810 QuicStreamRequest request(factory_.get());
1811 EXPECT_EQ(ERR_IO_PENDING,
1812 request.Request(host_port_pair_, privacy_mode_,
1813 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1814 callback_.callback()));
1815 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421816 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri231c2972016-03-08 19:50:111817 EXPECT_TRUE(stream.get());
1818
1819 // Cause QUIC stream to be created, but marked as non-migratable.
1820 HttpRequestInfo request_info;
1821 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION;
1822 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1823 net_log_, CompletionCallback()));
1824
1825 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501826 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:111827 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1828 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1829
1830 // Trigger connection migration. Since there is a non-migratable stream,
1831 // this should cause session to continue but be marked as going away.
1832 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1833 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1834
1835 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1836 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1837 EXPECT_EQ(1u, session->GetNumActiveStreams());
1838
1839 stream.reset();
1840
1841 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1842 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1843}
1844
jri9c541572016-03-29 17:51:481845TEST_P(QuicStreamFactoryTest,
1846 OnNetworkChangeSoonToDisconnectConnectionMigrationDisabled) {
1847 InitializeConnectionMigrationTest(
1848 {kDefaultNetworkForTests, kNewNetworkForTests});
1849 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1850 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1851
1852 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421853 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri9c541572016-03-29 17:51:481854 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1855 MockWrite writes[] = {
1856 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1857 };
1858 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1859 arraysize(writes));
1860 socket_factory_.AddSocketDataProvider(&socket_data);
1861
1862 // Create request and QuicHttpStream.
1863 QuicStreamRequest request(factory_.get());
1864 EXPECT_EQ(ERR_IO_PENDING,
1865 request.Request(host_port_pair_, privacy_mode_,
1866 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1867 callback_.callback()));
1868 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421869 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri9c541572016-03-29 17:51:481870 EXPECT_TRUE(stream.get());
1871
1872 // Cause QUIC stream to be created.
1873 HttpRequestInfo request_info;
1874 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1875 net_log_, CompletionCallback()));
1876
1877 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501878 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:481879 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1880 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1881
1882 // Set session config to have connection migration disabled.
1883 QuicConfigPeer::SetReceivedDisableConnectionMigration(session->config());
1884 EXPECT_TRUE(session->config()->DisableConnectionMigration());
1885
1886 // Trigger connection migration. Since there is a non-migratable stream,
1887 // this should cause session to continue but be marked as going away.
1888 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1889 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1890
1891 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1892 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1893 EXPECT_EQ(1u, session->GetNumActiveStreams());
1894
1895 stream.reset();
1896
1897 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1898 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1899}
1900
jri231c2972016-03-08 19:50:111901TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNonMigratableStream) {
1902 InitializeConnectionMigrationTest(
1903 {kDefaultNetworkForTests, kNewNetworkForTests});
1904 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1905 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1906
1907 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421908 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri231c2972016-03-08 19:50:111909 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1910 MockWrite writes[] = {
1911 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
1912 };
1913 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1914 arraysize(writes));
1915 socket_factory_.AddSocketDataProvider(&socket_data);
1916
1917 // Create request and QuicHttpStream.
1918 QuicStreamRequest request(factory_.get());
1919 EXPECT_EQ(ERR_IO_PENDING,
1920 request.Request(host_port_pair_, privacy_mode_,
1921 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1922 callback_.callback()));
1923 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421924 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri231c2972016-03-08 19:50:111925 EXPECT_TRUE(stream.get());
1926
1927 // Cause QUIC stream to be created, but marked as non-migratable.
1928 HttpRequestInfo request_info;
1929 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION;
1930 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1931 net_log_, CompletionCallback()));
1932
1933 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501934 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:111935 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1936 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1937
1938 // Trigger connection migration. Since there is a non-migratable stream,
1939 // this should cause a RST_STREAM frame to be emitted with
1940 // QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed.
1941 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1942 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1943
1944 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1945 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1946
1947 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1948 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1949}
1950
jri9c541572016-03-29 17:51:481951TEST_P(QuicStreamFactoryTest,
1952 OnNetworkChangeDisconnectedConnectionMigrationDisabled) {
1953 InitializeConnectionMigrationTest(
1954 {kDefaultNetworkForTests, kNewNetworkForTests});
1955 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1956 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1957
1958 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421959 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri9c541572016-03-29 17:51:481960 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1961 MockWrite writes[] = {
1962 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
1963 };
1964 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1965 arraysize(writes));
1966 socket_factory_.AddSocketDataProvider(&socket_data);
1967
1968 // Create request and QuicHttpStream.
1969 QuicStreamRequest request(factory_.get());
1970 EXPECT_EQ(ERR_IO_PENDING,
1971 request.Request(host_port_pair_, privacy_mode_,
1972 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1973 callback_.callback()));
1974 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421975 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri9c541572016-03-29 17:51:481976 EXPECT_TRUE(stream.get());
1977
1978 // Cause QUIC stream to be created.
1979 HttpRequestInfo request_info;
1980 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1981 net_log_, CompletionCallback()));
1982
1983 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501984 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:481985 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1986 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1987
1988 // Set session config to have connection migration disabled.
1989 QuicConfigPeer::SetReceivedDisableConnectionMigration(session->config());
1990 EXPECT_TRUE(session->config()->DisableConnectionMigration());
1991
1992 // Trigger connection migration. Since there is a non-migratable stream,
1993 // this should cause a RST_STREAM frame to be emitted with
1994 // QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed.
1995 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1996 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1997
1998 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1999 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2000
2001 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2002 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2003}
2004
jri7e636642016-01-14 06:57:082005TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoOpenStreams) {
2006 InitializeConnectionMigrationTest(
2007 {kDefaultNetworkForTests, kNewNetworkForTests});
2008 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2009 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2010
2011 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2012 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0u);
2013 socket_factory_.AddSocketDataProvider(&socket_data);
2014
2015 // Create request and QuicHttpStream.
2016 QuicStreamRequest request(factory_.get());
2017 EXPECT_EQ(ERR_IO_PENDING,
2018 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562019 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2020 callback_.callback()));
jri7e636642016-01-14 06:57:082021 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422022 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:082023 EXPECT_TRUE(stream.get());
2024
2025 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502026 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:082027 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2028 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2029
2030 // Trigger connection migration. Since there are no active streams,
2031 // the session will be closed.
2032 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2033 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2034
2035 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2036 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2037
2038 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2039 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2040}
2041
2042TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoOpenStreams) {
2043 InitializeConnectionMigrationTest(
2044 {kDefaultNetworkForTests, kNewNetworkForTests});
2045 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2046 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2047
2048 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2049 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0u);
2050 socket_factory_.AddSocketDataProvider(&socket_data);
2051
2052 // Create request and QuicHttpStream.
2053 QuicStreamRequest request(factory_.get());
2054 EXPECT_EQ(ERR_IO_PENDING,
2055 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562056 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2057 callback_.callback()));
jri7e636642016-01-14 06:57:082058 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422059 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:082060 EXPECT_TRUE(stream.get());
2061
2062 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502063 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:082064 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2065 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2066
2067 // Trigger connection migration. Since there are no active streams,
2068 // the session will be closed.
2069 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2070 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2071
2072 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2073 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2074
2075 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2076 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2077}
2078
jrid36ada62016-02-06 02:42:082079TEST_P(QuicStreamFactoryTest, MigrateSessionEarly) {
2080 InitializeConnectionMigrationTest(
2081 {kDefaultNetworkForTests, kNewNetworkForTests});
2082 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2083 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2084 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2085
2086 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:422087 std::unique_ptr<QuicEncryptedPacket> request_packet(
jrid36ada62016-02-06 02:42:082088 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true));
2089 MockWrite writes[] = {MockWrite(SYNCHRONOUS, request_packet->data(),
2090 request_packet->length(), 1)};
2091 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2092 arraysize(writes));
2093 socket_factory_.AddSocketDataProvider(&socket_data);
2094
2095 // Create request and QuicHttpStream.
2096 QuicStreamRequest request(factory_.get());
2097 EXPECT_EQ(ERR_IO_PENDING,
2098 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562099 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2100 callback_.callback()));
jrid36ada62016-02-06 02:42:082101 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422102 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jrid36ada62016-02-06 02:42:082103 EXPECT_TRUE(stream.get());
2104
2105 // Cause QUIC stream to be created.
2106 HttpRequestInfo request_info;
2107 request_info.method = "GET";
2108 request_info.url = GURL("https://www.example.org/");
2109 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2110 net_log_, CompletionCallback()));
2111
2112 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502113 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jrid36ada62016-02-06 02:42:082114 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2115 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2116
2117 // Send GET request on stream.
2118 HttpResponseInfo response;
2119 HttpRequestHeaders request_headers;
2120 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2121 callback_.callback()));
2122
2123 // Set up second socket data provider that is used after migration.
2124 // The response to the earlier request is read on this new socket.
danakjad1777e2016-04-16 00:56:422125 std::unique_ptr<QuicEncryptedPacket> ping(
jrid36ada62016-02-06 02:42:082126 maker_.MakePingPacket(2, /*include_version=*/true));
2127 MockWrite writes1[] = {
2128 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 0)};
danakjad1777e2016-04-16 00:56:422129 std::unique_ptr<QuicEncryptedPacket> response_headers_packet(
jrid36ada62016-02-06 02:42:082130 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
2131 MockRead reads1[] = {MockRead(ASYNC, response_headers_packet->data(),
2132 response_headers_packet->length(), 1),
2133 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
2134 SequencedSocketData socket_data1(reads1, arraysize(reads1), writes1,
2135 arraysize(writes1));
2136 socket_factory_.AddSocketDataProvider(&socket_data1);
2137
2138 // Trigger early connection migration. This should cause a PING frame
2139 // to be emitted.
2140 session->OnPathDegrading();
2141
2142 // Run the message loop so that data queued in the new socket is read by the
2143 // packet reader.
2144 base::RunLoop().RunUntilIdle();
2145
2146 // The session should now be marked as going away. Ensure that
2147 // while it is still alive, it is no longer active.
2148 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2149 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2150 EXPECT_EQ(1u, session->GetNumActiveStreams());
2151
2152 // Verify that response headers on the migrated socket were delivered to the
2153 // stream.
2154 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
2155 EXPECT_EQ(200, response.headers->response_code());
2156
2157 // Create a new request for the same destination and verify that a
2158 // new session is created.
2159 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2160 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
2161 socket_factory_.AddSocketDataProvider(&socket_data2);
2162
2163 QuicStreamRequest request2(factory_.get());
2164 EXPECT_EQ(ERR_IO_PENDING,
2165 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562166 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2167 callback_.callback()));
jrid36ada62016-02-06 02:42:082168 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422169 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jrid36ada62016-02-06 02:42:082170 EXPECT_TRUE(stream2.get());
2171
bnc912a04b2016-04-20 14:19:502172 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2173 QuicChromiumClientSession* new_session = GetActiveSession(host_port_pair_);
jrid36ada62016-02-06 02:42:082174 EXPECT_NE(session, new_session);
2175
2176 // On a SOON_TO_DISCONNECT notification, nothing happens to the
2177 // migrated session, but the new session is closed since it has no
2178 // open streams.
2179 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2180 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
2181 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2182 EXPECT_EQ(1u, session->GetNumActiveStreams());
2183 EXPECT_FALSE(
2184 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), new_session));
2185
2186 // On a DISCONNECTED notification, nothing happens to the migrated session.
2187 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2188 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2189 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2190 EXPECT_EQ(1u, session->GetNumActiveStreams());
2191
2192 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2193 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2194 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
2195 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
2196 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2197 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2198}
2199
2200TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyNoNewNetwork) {
2201 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
2202 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2203 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2204
2205 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:422206 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jrid36ada62016-02-06 02:42:082207 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
2208 MockWrite writes[] = {
2209 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
2210 };
2211 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2212 arraysize(writes));
2213 socket_factory_.AddSocketDataProvider(&socket_data);
2214
2215 // Create request and QuicHttpStream.
2216 QuicStreamRequest request(factory_.get());
2217 EXPECT_EQ(ERR_IO_PENDING,
2218 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562219 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2220 callback_.callback()));
jrid36ada62016-02-06 02:42:082221 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422222 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jrid36ada62016-02-06 02:42:082223 EXPECT_TRUE(stream.get());
2224
2225 // Cause QUIC stream to be created.
2226 HttpRequestInfo request_info;
2227 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2228 net_log_, CompletionCallback()));
2229
2230 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502231 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jrid36ada62016-02-06 02:42:082232 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2233 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2234
2235 // Trigger connection migration. Since there are no networks
2236 // to migrate to, this should cause session to be continue but be marked as
2237 // going away.
2238 session->OnPathDegrading();
2239
2240 // Run the message loop so that data queued in the new socket is read by the
2241 // packet reader.
2242 base::RunLoop().RunUntilIdle();
2243
2244 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2245 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2246 EXPECT_EQ(1u, session->GetNumActiveStreams());
2247
2248 stream.reset();
2249
2250 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2251 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2252}
2253
jri231c2972016-03-08 19:50:112254TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyNonMigratableStream) {
2255 InitializeConnectionMigrationTest(
2256 {kDefaultNetworkForTests, kNewNetworkForTests});
2257 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2258 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2259
2260 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:422261 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri231c2972016-03-08 19:50:112262 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
2263 MockWrite writes[] = {
2264 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
2265 };
2266 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2267 arraysize(writes));
2268 socket_factory_.AddSocketDataProvider(&socket_data);
2269
2270 // Create request and QuicHttpStream.
2271 QuicStreamRequest request(factory_.get());
2272 EXPECT_EQ(ERR_IO_PENDING,
2273 request.Request(host_port_pair_, privacy_mode_,
2274 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2275 callback_.callback()));
2276 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422277 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri231c2972016-03-08 19:50:112278 EXPECT_TRUE(stream.get());
2279
2280 // Cause QUIC stream to be created, but marked as non-migratable.
2281 HttpRequestInfo request_info;
2282 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION;
2283 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2284 net_log_, CompletionCallback()));
2285
2286 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502287 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:112288 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2289 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2290
2291 // Trigger connection migration. Since there is a non-migratable stream,
2292 // this should cause session to be continue without migrating.
2293 session->OnPathDegrading();
2294
2295 // Run the message loop so that data queued in the new socket is read by the
2296 // packet reader.
2297 base::RunLoop().RunUntilIdle();
2298
2299 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2300 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2301 EXPECT_EQ(1u, session->GetNumActiveStreams());
2302
2303 stream.reset();
2304
2305 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2306 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2307}
2308
jri9c541572016-03-29 17:51:482309TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyConnectionMigrationDisabled) {
2310 InitializeConnectionMigrationTest(
2311 {kDefaultNetworkForTests, kNewNetworkForTests});
2312 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2313 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2314
2315 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:422316 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri9c541572016-03-29 17:51:482317 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
2318 MockWrite writes[] = {
2319 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
2320 };
2321 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2322 arraysize(writes));
2323 socket_factory_.AddSocketDataProvider(&socket_data);
2324
2325 // Create request and QuicHttpStream.
2326 QuicStreamRequest request(factory_.get());
2327 EXPECT_EQ(ERR_IO_PENDING,
2328 request.Request(host_port_pair_, privacy_mode_,
2329 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2330 callback_.callback()));
2331 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422332 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri9c541572016-03-29 17:51:482333 EXPECT_TRUE(stream.get());
2334
2335 // Cause QUIC stream to be created.
2336 HttpRequestInfo request_info;
2337 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2338 net_log_, CompletionCallback()));
2339
2340 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502341 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:482342 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2343 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2344
2345 // Set session config to have connection migration disabled.
2346 QuicConfigPeer::SetReceivedDisableConnectionMigration(session->config());
2347 EXPECT_TRUE(session->config()->DisableConnectionMigration());
2348
2349 // Trigger connection migration. Since there is a non-migratable stream,
2350 // this should cause session to be continue without migrating.
2351 session->OnPathDegrading();
2352
2353 // Run the message loop so that data queued in the new socket is read by the
2354 // packet reader.
2355 base::RunLoop().RunUntilIdle();
2356
2357 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2358 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2359 EXPECT_EQ(1u, session->GetNumActiveStreams());
2360
2361 stream.reset();
2362
2363 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2364 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2365}
2366
rch02d87792015-09-09 09:05:532367TEST_P(QuicStreamFactoryTest, OnSSLConfigChanged) {
jri7046038f2015-10-22 00:29:262368 Initialize();
rch6faa4d42016-01-05 20:48:432369 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2370 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2371 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2372
mmenke651bae7f2015-12-18 21:26:452373 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:422374 std::unique_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
rch02d87792015-09-09 09:05:532375 std::vector<MockWrite> writes;
2376 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:452377 SequencedSocketData socket_data(reads, arraysize(reads),
2378 writes.empty() ? nullptr : &writes[0],
2379 writes.size());
rch02d87792015-09-09 09:05:532380 socket_factory_.AddSocketDataProvider(&socket_data);
rch02d87792015-09-09 09:05:532381
mmenke651bae7f2015-12-18 21:26:452382 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2383 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
rch02d87792015-09-09 09:05:532384 socket_factory_.AddSocketDataProvider(&socket_data2);
rch02d87792015-09-09 09:05:532385
jri7046038f2015-10-22 00:29:262386 QuicStreamRequest request(factory_.get());
rch02d87792015-09-09 09:05:532387 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562388 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562389 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2390 callback_.callback()));
rch02d87792015-09-09 09:05:532391
2392 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422393 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rch02d87792015-09-09 09:05:532394 HttpRequestInfo request_info;
2395 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2396 net_log_, CompletionCallback()));
2397
jri7046038f2015-10-22 00:29:262398 factory_->OnSSLConfigChanged();
rch02d87792015-09-09 09:05:532399 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
2400 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262401 EXPECT_FALSE(factory_->require_confirmation());
rch02d87792015-09-09 09:05:532402
2403 // Now attempting to request a stream to the same origin should create
2404 // a new session.
2405
jri7046038f2015-10-22 00:29:262406 QuicStreamRequest request2(factory_.get());
rch02d87792015-09-09 09:05:532407 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562408 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562409 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2410 callback_.callback()));
rch02d87792015-09-09 09:05:532411
2412 EXPECT_EQ(OK, callback_.WaitForResult());
xunjieli2608f9b2016-03-14 13:39:232413 stream = request2.CreateStream();
rch02d87792015-09-09 09:05:532414 stream.reset(); // Will reset stream 3.
2415
2416 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2417 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2418 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2419 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2420}
2421
[email protected]1e960032013-12-20 19:00:202422TEST_P(QuicStreamFactoryTest, OnCertAdded) {
jri7046038f2015-10-22 00:29:262423 Initialize();
rch6faa4d42016-01-05 20:48:432424 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2425 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2426 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2427
mmenke651bae7f2015-12-18 21:26:452428 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:422429 std::unique_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
[email protected]459a7402014-02-10 12:58:522430 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:312431 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:452432 SequencedSocketData socket_data(reads, arraysize(reads),
2433 writes.empty() ? nullptr : &writes[0],
2434 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:092435 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]d7d1e50b2013-11-25 22:08:092436
mmenke651bae7f2015-12-18 21:26:452437 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2438 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:092439 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]d7d1e50b2013-11-25 22:08:092440
jri7046038f2015-10-22 00:29:262441 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:592442 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562443 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562444 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2445 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092446
2447 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422448 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]d7d1e50b2013-11-25 22:08:092449 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:022450 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]d7d1e50b2013-11-25 22:08:092451 net_log_, CompletionCallback()));
2452
2453 // Add a cert and verify that stream saw the event.
jri7046038f2015-10-22 00:29:262454 factory_->OnCertAdded(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:092455 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
2456 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262457 EXPECT_FALSE(factory_->require_confirmation());
[email protected]d7d1e50b2013-11-25 22:08:092458
2459 // Now attempting to request a stream to the same origin should create
2460 // a new session.
2461
jri7046038f2015-10-22 00:29:262462 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:592463 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562464 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562465 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2466 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092467
2468 EXPECT_EQ(OK, callback_.WaitForResult());
xunjieli2608f9b2016-03-14 13:39:232469 stream = request2.CreateStream();
[email protected]d7d1e50b2013-11-25 22:08:092470 stream.reset(); // Will reset stream 3.
2471
rch37de576c2015-05-17 20:28:172472 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2473 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2474 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2475 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:092476}
2477
[email protected]1e960032013-12-20 19:00:202478TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
jri7046038f2015-10-22 00:29:262479 Initialize();
rch6faa4d42016-01-05 20:48:432480 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2481 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2482 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2483
mmenke651bae7f2015-12-18 21:26:452484 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:422485 std::unique_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
[email protected]459a7402014-02-10 12:58:522486 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:312487 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:452488 SequencedSocketData socket_data(reads, arraysize(reads),
2489 writes.empty() ? nullptr : &writes[0],
2490 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:092491 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]d7d1e50b2013-11-25 22:08:092492
mmenke651bae7f2015-12-18 21:26:452493 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2494 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:092495 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]d7d1e50b2013-11-25 22:08:092496
jri7046038f2015-10-22 00:29:262497 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:592498 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562499 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562500 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2501 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092502
2503 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422504 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]d7d1e50b2013-11-25 22:08:092505 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:022506 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]d7d1e50b2013-11-25 22:08:092507 net_log_, CompletionCallback()));
2508
2509 // Change the CA cert and verify that stream saw the event.
jri7046038f2015-10-22 00:29:262510 factory_->OnCACertChanged(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:092511 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
2512 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262513 EXPECT_FALSE(factory_->require_confirmation());
[email protected]d7d1e50b2013-11-25 22:08:092514
2515 // Now attempting to request a stream to the same origin should create
2516 // a new session.
2517
jri7046038f2015-10-22 00:29:262518 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:592519 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562520 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562521 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2522 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092523
2524 EXPECT_EQ(OK, callback_.WaitForResult());
xunjieli2608f9b2016-03-14 13:39:232525 stream = request2.CreateStream();
[email protected]d7d1e50b2013-11-25 22:08:092526 stream.reset(); // Will reset stream 3.
2527
rch37de576c2015-05-17 20:28:172528 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2529 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2530 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2531 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:092532}
2533
[email protected]1e960032013-12-20 19:00:202534TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
jri7046038f2015-10-22 00:29:262535 Initialize();
rch6faa4d42016-01-05 20:48:432536
[email protected]6e12d702013-11-13 00:17:172537 vector<string> cannoncial_suffixes;
2538 cannoncial_suffixes.push_back(string(".c.youtube.com"));
2539 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]c49ff182013-09-28 08:33:262540
[email protected]6e12d702013-11-13 00:17:172541 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
2542 string r1_host_name("r1");
2543 string r2_host_name("r2");
2544 r1_host_name.append(cannoncial_suffixes[i]);
2545 r2_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:142546
[email protected]bf4ea2f2014-03-10 22:57:532547 HostPortPair host_port_pair1(r1_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:122548 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:262549 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rch1fe2eeb2015-10-26 14:45:572550 QuicServerId server_id1(host_port_pair1, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172551 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:372552 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:172553 EXPECT_FALSE(cached1->proof_valid());
2554 EXPECT_TRUE(cached1->source_address_token().empty());
2555
2556 // Mutate the cached1 to have different data.
2557 // TODO(rtenneti): mutate other members of CachedState.
2558 cached1->set_source_address_token(r1_host_name);
2559 cached1->SetProofValid();
2560
[email protected]bf4ea2f2014-03-10 22:57:532561 HostPortPair host_port_pair2(r2_host_name, 80);
rch1fe2eeb2015-10-26 14:45:572562 QuicServerId server_id2(host_port_pair2, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172563 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:372564 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:172565 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
2566 EXPECT_TRUE(cached2->proof_valid());
2567 }
[email protected]b70fdb792013-10-25 19:04:142568}
2569
[email protected]1e960032013-12-20 19:00:202570TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
jri7046038f2015-10-22 00:29:262571 Initialize();
[email protected]6e12d702013-11-13 00:17:172572 vector<string> cannoncial_suffixes;
2573 cannoncial_suffixes.push_back(string(".c.youtube.com"));
2574 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]b70fdb792013-10-25 19:04:142575
[email protected]6e12d702013-11-13 00:17:172576 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
2577 string r3_host_name("r3");
2578 string r4_host_name("r4");
2579 r3_host_name.append(cannoncial_suffixes[i]);
2580 r4_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:142581
[email protected]bf4ea2f2014-03-10 22:57:532582 HostPortPair host_port_pair1(r3_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:122583 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:262584 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rch1fe2eeb2015-10-26 14:45:572585 QuicServerId server_id1(host_port_pair1, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172586 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:372587 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:172588 EXPECT_FALSE(cached1->proof_valid());
2589 EXPECT_TRUE(cached1->source_address_token().empty());
2590
2591 // Mutate the cached1 to have different data.
2592 // TODO(rtenneti): mutate other members of CachedState.
2593 cached1->set_source_address_token(r3_host_name);
2594 cached1->SetProofInvalid();
2595
[email protected]bf4ea2f2014-03-10 22:57:532596 HostPortPair host_port_pair2(r4_host_name, 80);
rch1fe2eeb2015-10-26 14:45:572597 QuicServerId server_id2(host_port_pair2, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172598 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:372599 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:172600 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
2601 EXPECT_TRUE(cached2->source_address_token().empty());
2602 EXPECT_FALSE(cached2->proof_valid());
2603 }
[email protected]c49ff182013-09-28 08:33:262604}
2605
rtenneti14abd312015-02-06 21:56:012606TEST_P(QuicStreamFactoryTest, RacingConnections) {
jri7046038f2015-10-22 00:29:262607 disable_disk_cache_ = false;
2608 Initialize();
rch6faa4d42016-01-05 20:48:432609 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2610 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:262611
bnc359ed2a2016-04-29 20:43:452612 if (!enable_connection_racing_)
rtenneti14abd312015-02-06 21:56:012613 return;
jri7046038f2015-10-22 00:29:262614
2615 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneticcab42b2015-10-09 06:38:162616
mmenke651bae7f2015-12-18 21:26:452617 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2618 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti14abd312015-02-06 21:56:012619 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti14abd312015-02-06 21:56:012620
mmenke651bae7f2015-12-18 21:26:452621 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2622 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
rtenneti14abd312015-02-06 21:56:012623 socket_factory_.AddSocketDataProvider(&socket_data2);
rtenneti14abd312015-02-06 21:56:012624
rtenneticcab42b2015-10-09 06:38:162625 const AlternativeService alternative_service1(QUIC, host_port_pair_.host(),
2626 host_port_pair_.port());
2627 AlternativeServiceInfoVector alternative_service_info_vector;
2628 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
2629 alternative_service_info_vector.push_back(
rchdc7b9052016-03-17 20:51:502630 AlternativeServiceInfo(alternative_service1, expiration));
rtenneticcab42b2015-10-09 06:38:162631
zhongyi3d4a55e72016-04-22 20:36:462632 url::SchemeHostPort server("https", kDefaultServerHostName,
2633 kDefaultServerPort);
2634
rtenneticcab42b2015-10-09 06:38:162635 http_server_properties_.SetAlternativeServices(
zhongyi3d4a55e72016-04-22 20:36:462636 server, alternative_service_info_vector);
rtenneticcab42b2015-10-09 06:38:162637
rtenneti14abd312015-02-06 21:56:012638 crypto_client_stream_factory_.set_handshake_mode(
2639 MockCryptoClientStream::ZERO_RTT);
2640 host_resolver_.set_synchronous_mode(true);
2641 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2642 "192.168.0.1", "");
2643
jri7046038f2015-10-22 00:29:262644 QuicStreamRequest request(factory_.get());
rch1fe2eeb2015-10-26 14:45:572645 QuicServerId server_id(host_port_pair_, privacy_mode_);
rtenneti14abd312015-02-06 21:56:012646 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562647 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562648 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2649 callback_.callback()));
jri7046038f2015-10-22 00:29:262650 EXPECT_EQ(2u, QuicStreamFactoryPeer::GetNumberOfActiveJobs(factory_.get(),
2651 server_id));
rtenneti14abd312015-02-06 21:56:012652
2653 runner_->RunNextTask();
2654
danakjad1777e2016-04-16 00:56:422655 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rtenneti14abd312015-02-06 21:56:012656 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:172657 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2658 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
jri7046038f2015-10-22 00:29:262659 EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumberOfActiveJobs(factory_.get(),
2660 server_id));
rtenneti14abd312015-02-06 21:56:012661}
2662
rtenneti34dffe752015-02-24 23:27:322663TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) {
jri7046038f2015-10-22 00:29:262664 disable_disk_cache_ = true;
2665 Initialize();
rch6faa4d42016-01-05 20:48:432666 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2667 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2668
jri7046038f2015-10-22 00:29:262669 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti34dffe752015-02-24 23:27:322670
mmenke651bae7f2015-12-18 21:26:452671 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2672 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti34dffe752015-02-24 23:27:322673 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti34dffe752015-02-24 23:27:322674
2675 crypto_client_stream_factory_.set_handshake_mode(
2676 MockCryptoClientStream::ZERO_RTT);
2677 host_resolver_.set_synchronous_mode(true);
2678 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2679 "192.168.0.1", "");
2680
jri7046038f2015-10-22 00:29:262681 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562682 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562683 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2684 callback_.callback()));
rtenneti34dffe752015-02-24 23:27:322685
2686 // If we are waiting for disk cache, we would have posted a task. Verify that
2687 // the CancelWaitForDataReady task hasn't been posted.
2688 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
2689
danakjad1777e2016-04-16 00:56:422690 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rtenneti34dffe752015-02-24 23:27:322691 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:172692 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2693 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti34dffe752015-02-24 23:27:322694}
2695
rtenneti85dcfac22015-03-27 20:22:192696TEST_P(QuicStreamFactoryTest, BadPacketLoss) {
jri7046038f2015-10-22 00:29:262697 disable_disk_cache_ = false;
2698 max_number_of_lossy_connections_ = 2;
2699 Initialize();
rch6faa4d42016-01-05 20:48:432700 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2701 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2702 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2703 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2704 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2705
jri7046038f2015-10-22 00:29:262706 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2707
2708 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2709 host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192710 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262711 factory_.get(), host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192712
mmenke651bae7f2015-12-18 21:26:452713 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2714 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:192715 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti85dcfac22015-03-27 20:22:192716
mmenke651bae7f2015-12-18 21:26:452717 SequencedSocketData socket_data2(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:192718 socket_factory_.AddSocketDataProvider(&socket_data2);
rtenneti85dcfac22015-03-27 20:22:192719
mmenke651bae7f2015-12-18 21:26:452720 SequencedSocketData socket_data3(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:192721 socket_factory_.AddSocketDataProvider(&socket_data3);
rtenneti85dcfac22015-03-27 20:22:192722
mmenke651bae7f2015-12-18 21:26:452723 SequencedSocketData socket_data4(nullptr, 0, nullptr, 0);
rtenneti97137a92015-06-18 06:00:312724 socket_factory_.AddSocketDataProvider(&socket_data4);
rtenneti97137a92015-06-18 06:00:312725
rch6faa4d42016-01-05 20:48:432726 HostPortPair server2(kServer2HostName, kDefaultServerPort);
2727 HostPortPair server3(kServer3HostName, kDefaultServerPort);
2728 HostPortPair server4(kServer4HostName, kDefaultServerPort);
rtenneti85dcfac22015-03-27 20:22:192729
2730 crypto_client_stream_factory_.set_handshake_mode(
2731 MockCryptoClientStream::ZERO_RTT);
2732 host_resolver_.set_synchronous_mode(true);
2733 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2734 "192.168.0.1", "");
2735 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2736 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
rtenneti97137a92015-06-18 06:00:312737 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
rtenneti85dcfac22015-03-27 20:22:192738
jri7046038f2015-10-22 00:29:262739 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562740 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562741 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2742 callback_.callback()));
rtenneti85dcfac22015-03-27 20:22:192743
bnc912a04b2016-04-20 14:19:502744 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
rtenneti85dcfac22015-03-27 20:22:192745
2746 DVLOG(1) << "Create 1st session and test packet loss";
2747
2748 // Set packet_loss_rate to a lower value than packet_loss_threshold.
2749 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262750 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/0.9f));
rtenneti41633b1f2015-04-05 18:19:532751 EXPECT_TRUE(session->connection()->connected());
bnc912a04b2016-04-20 14:19:502752 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri7046038f2015-10-22 00:29:262753 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2754 host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192755 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262756 factory_.get(), host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192757
2758 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:312759 // and that shouldn't close the session and it shouldn't disable QUIC.
2760 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262761 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:192762 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262763 factory_.get(), host_port_pair_.port()));
rtenneti97137a92015-06-18 06:00:312764 EXPECT_TRUE(session->connection()->connected());
jri7046038f2015-10-22 00:29:262765 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2766 host_port_pair_.port()));
bnc912a04b2016-04-20 14:19:502767 EXPECT_TRUE(HasActiveSession(host_port_pair_));
rtenneti85dcfac22015-03-27 20:22:192768
2769 // Test N-in-a-row high packet loss connections.
2770
2771 DVLOG(1) << "Create 2nd session and test packet loss";
2772
2773 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262774 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562775 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
bncd2368ad2016-04-28 22:06:062776 /*cert_verify_flags=*/0, url2_, "GET",
2777 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:502778 QuicChromiumClientSession* session2 = GetActiveSession(server2);
rtenneti85dcfac22015-03-27 20:22:192779
2780 // If there is no packet loss during handshake confirmation, number of lossy
2781 // connections for the port should be 0.
2782 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262783 factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:192784 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262785 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/0.9f));
rtenneti85dcfac22015-03-27 20:22:192786 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262787 factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:192788 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262789 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:192790
2791 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:312792 // and that shouldn't close the session and it shouldn't disable QUIC.
2793 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262794 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:192795 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262796 factory_.get(), server2.port()));
rtenneti97137a92015-06-18 06:00:312797 EXPECT_TRUE(session2->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:192798 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262799 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
bnc912a04b2016-04-20 14:19:502800 EXPECT_TRUE(HasActiveSession(server2));
rtenneti85dcfac22015-03-27 20:22:192801
2802 DVLOG(1) << "Create 3rd session which also has packet loss";
2803
2804 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:262805 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:562806 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562807 /*cert_verify_flags=*/0, url3_, "GET",
rtennetia75df622015-06-21 23:59:502808 net_log_, callback3.callback()));
bnc912a04b2016-04-20 14:19:502809 QuicChromiumClientSession* session3 = GetActiveSession(server3);
rtenneti85dcfac22015-03-27 20:22:192810
rtenneti97137a92015-06-18 06:00:312811 DVLOG(1) << "Create 4th session with packet loss and test IsQuicDisabled()";
2812 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:262813 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:562814 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562815 /*cert_verify_flags=*/0, url4_, "GET",
rtennetia75df622015-06-21 23:59:502816 net_log_, callback4.callback()));
bnc912a04b2016-04-20 14:19:502817 QuicChromiumClientSession* session4 = GetActiveSession(server4);
rtenneti97137a92015-06-18 06:00:312818
rtenneti85dcfac22015-03-27 20:22:192819 // Set packet_loss_rate to higher value than packet_loss_threshold 2nd time in
2820 // a row and that should close the session and disable QUIC.
2821 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:262822 factory_->OnHandshakeConfirmed(session3, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:192823 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262824 factory_.get(), server3.port()));
rtenneti97137a92015-06-18 06:00:312825 EXPECT_FALSE(session3->connection()->connected());
jri7046038f2015-10-22 00:29:262826 EXPECT_TRUE(
2827 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server3.port()));
bnc912a04b2016-04-20 14:19:502828 EXPECT_FALSE(HasActiveSession(server3));
rtenneti85dcfac22015-03-27 20:22:192829
rtenneti97137a92015-06-18 06:00:312830 // Set packet_loss_rate to higher value than packet_loss_threshold 3rd time in
2831 // a row and IsQuicDisabled() should close the session.
2832 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:262833 factory_->OnHandshakeConfirmed(session4, /*packet_loss_rate=*/1.0f));
rtenneti97137a92015-06-18 06:00:312834 EXPECT_EQ(3, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262835 factory_.get(), server4.port()));
rtenneti97137a92015-06-18 06:00:312836 EXPECT_FALSE(session4->connection()->connected());
jri7046038f2015-10-22 00:29:262837 EXPECT_TRUE(
2838 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server4.port()));
bnc912a04b2016-04-20 14:19:502839 EXPECT_FALSE(HasActiveSession(server4));
rtenneti97137a92015-06-18 06:00:312840
danakjad1777e2016-04-16 00:56:422841 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rtenneti85dcfac22015-03-27 20:22:192842 EXPECT_TRUE(stream.get());
danakjad1777e2016-04-16 00:56:422843 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
rtenneti85dcfac22015-03-27 20:22:192844 EXPECT_TRUE(stream2.get());
danakjad1777e2016-04-16 00:56:422845 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
rtenneti85dcfac22015-03-27 20:22:192846 EXPECT_TRUE(stream3.get());
danakjad1777e2016-04-16 00:56:422847 std::unique_ptr<QuicHttpStream> stream4 = request4.CreateStream();
rtenneti97137a92015-06-18 06:00:312848 EXPECT_TRUE(stream4.get());
rch37de576c2015-05-17 20:28:172849 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2850 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2851 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2852 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2853 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2854 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
rtenneti97137a92015-06-18 06:00:312855 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
2856 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
rtenneti85dcfac22015-03-27 20:22:192857}
2858
ckrasic1e53b642015-07-08 22:39:352859TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfTwo) {
jri7046038f2015-10-22 00:29:262860 disable_disk_cache_ = false;
2861 threshold_public_resets_post_handshake_ = 2;
2862 Initialize();
rch6faa4d42016-01-05 20:48:432863 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2864 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2865 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:262866 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2867
2868 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2869 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352870 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262871 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352872
mmenke651bae7f2015-12-18 21:26:452873 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2874 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352875 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:352876
mmenke651bae7f2015-12-18 21:26:452877 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352878 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:352879
rch6faa4d42016-01-05 20:48:432880 HostPortPair server2(kServer2HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:352881
2882 crypto_client_stream_factory_.set_handshake_mode(
2883 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2884 host_resolver_.set_synchronous_mode(true);
2885 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2886 "192.168.0.1", "");
2887 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2888
jri7046038f2015-10-22 00:29:262889 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562890 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562891 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2892 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:352893
bnc912a04b2016-04-20 14:19:502894 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352895
2896 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
jri78ec06a2016-03-31 18:19:402897 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
2898 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:352899 // Need to spin the loop now to ensure that
2900 // QuicStreamFactory::OnSessionClosed() runs.
2901 base::RunLoop run_loop;
2902 run_loop.RunUntilIdle();
2903
jri7046038f2015-10-22 00:29:262904 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2905 factory_.get()));
2906 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2907 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352908
2909 // Test two-in-a-row public reset post handshakes..
2910 DVLOG(1) << "Create 2nd session and trigger public reset post handshake";
2911 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262912 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562913 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562914 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:352915 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:502916 QuicChromiumClientSession* session2 = GetActiveSession(server2);
ckrasic1e53b642015-07-08 22:39:352917
jri78ec06a2016-03-31 18:19:402918 session2->connection()->CloseConnection(
2919 QUIC_PUBLIC_RESET, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:352920 // Need to spin the loop now to ensure that
2921 // QuicStreamFactory::OnSessionClosed() runs.
2922 base::RunLoop run_loop2;
2923 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262924 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2925 factory_.get()));
2926 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2927 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:162928 EXPECT_EQ(
2929 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
jri7046038f2015-10-22 00:29:262930 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352931
danakjad1777e2016-04-16 00:56:422932 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
xunjieli2608f9b2016-03-14 13:39:232933 EXPECT_FALSE(stream.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:422934 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
xunjieli2608f9b2016-03-14 13:39:232935 EXPECT_FALSE(stream2.get()); // Session is already closed.
ckrasic1e53b642015-07-08 22:39:352936 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2937 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2938 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2939 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2940}
2941
2942TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfTwo) {
jri7046038f2015-10-22 00:29:262943 disable_disk_cache_ = true;
2944 threshold_timeouts_with_open_streams_ = 2;
2945 Initialize();
rch6faa4d42016-01-05 20:48:432946 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2947 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2948 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:262949
2950 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2951 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2952 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352953 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262954 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352955
mmenke651bae7f2015-12-18 21:26:452956 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2957 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352958 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:352959
mmenke651bae7f2015-12-18 21:26:452960 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352961 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:352962
rch6faa4d42016-01-05 20:48:432963 HostPortPair server2(kServer2HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:352964
2965 crypto_client_stream_factory_.set_handshake_mode(
2966 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2967 host_resolver_.set_synchronous_mode(true);
2968 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2969 "192.168.0.1", "");
2970 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2971
jri7046038f2015-10-22 00:29:262972 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562973 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562974 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2975 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:352976
bnc912a04b2016-04-20 14:19:502977 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352978
danakjad1777e2016-04-16 00:56:422979 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
ckrasic1e53b642015-07-08 22:39:352980 EXPECT_TRUE(stream.get());
2981 HttpRequestInfo request_info;
2982 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2983 net_log_, CompletionCallback()));
2984
2985 DVLOG(1)
2986 << "Created 1st session and initialized a stream. Now trigger timeout";
jri78ec06a2016-03-31 18:19:402987 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
2988 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:352989 // Need to spin the loop now to ensure that
2990 // QuicStreamFactory::OnSessionClosed() runs.
2991 base::RunLoop run_loop;
2992 run_loop.RunUntilIdle();
2993
jri7046038f2015-10-22 00:29:262994 EXPECT_EQ(
2995 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2996 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2997 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352998
2999 // Test two-in-a-row timeouts with open streams.
3000 DVLOG(1) << "Create 2nd session and timeout with open stream";
3001 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263002 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563003 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563004 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353005 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:503006 QuicChromiumClientSession* session2 = GetActiveSession(server2);
ckrasic1e53b642015-07-08 22:39:353007
danakjad1777e2016-04-16 00:56:423008 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
ckrasic1e53b642015-07-08 22:39:353009 EXPECT_TRUE(stream2.get());
3010 EXPECT_EQ(OK, stream2->InitializeStream(&request_info, DEFAULT_PRIORITY,
3011 net_log_, CompletionCallback()));
3012
jri78ec06a2016-03-31 18:19:403013 session2->connection()->CloseConnection(
3014 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353015 // Need to spin the loop now to ensure that
3016 // QuicStreamFactory::OnSessionClosed() runs.
3017 base::RunLoop run_loop2;
3018 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263019 EXPECT_EQ(
3020 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3021 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3022 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:163023 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
jri7046038f2015-10-22 00:29:263024 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353025
rchcee7beb2016-03-11 06:16:143026 // Verify that QUIC is un-disabled after a TCP job fails.
3027 factory_->OnTcpJobCompleted(/*succeeded=*/false);
3028 EXPECT_EQ(
3029 0, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3030 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3031 host_port_pair_.port()));
3032
ckrasic1e53b642015-07-08 22:39:353033 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3034 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3035 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3036 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3037}
3038
3039TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfThree) {
jri7046038f2015-10-22 00:29:263040 disable_disk_cache_ = true;
3041 threshold_public_resets_post_handshake_ = 2;
3042 Initialize();
rch6faa4d42016-01-05 20:48:433043 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3044 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3045 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3046 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263047
3048 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3049 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353050 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263051 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353052
mmenke651bae7f2015-12-18 21:26:453053 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3054 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353055 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353056
mmenke651bae7f2015-12-18 21:26:453057 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353058 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353059
mmenke651bae7f2015-12-18 21:26:453060 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353061 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:353062
rch6faa4d42016-01-05 20:48:433063 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3064 HostPortPair server3(kServer3HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353065
3066 crypto_client_stream_factory_.set_handshake_mode(
3067 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3068 host_resolver_.set_synchronous_mode(true);
3069 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3070 "192.168.0.1", "");
3071 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3072 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3073
3074 // Test first and third out of three public reset post handshakes.
jri7046038f2015-10-22 00:29:263075 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563076 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563077 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3078 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353079
bnc912a04b2016-04-20 14:19:503080 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353081
3082 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
jri78ec06a2016-03-31 18:19:403083 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
3084 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353085 // Need to spin the loop now to ensure that
3086 // QuicStreamFactory::OnSessionClosed() runs.
3087 base::RunLoop run_loop;
3088 run_loop.RunUntilIdle();
3089
jri7046038f2015-10-22 00:29:263090 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3091 factory_.get()));
3092 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3093 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353094
3095 DVLOG(1) << "Create 2nd session without disable trigger";
3096 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263097 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563098 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563099 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353100 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:503101 QuicChromiumClientSession* session2 = GetActiveSession(server2);
ckrasic1e53b642015-07-08 22:39:353102
jri78ec06a2016-03-31 18:19:403103 session2->connection()->CloseConnection(
3104 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353105 // Need to spin the loop now to ensure that
3106 // QuicStreamFactory::OnSessionClosed() runs.
3107 base::RunLoop run_loop2;
3108 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263109 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3110 factory_.get()));
3111 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3112 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353113
3114 DVLOG(1) << "Create 3rd session with public reset post handshake,"
3115 << " will disable QUIC";
3116 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263117 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563118 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
bncd2368ad2016-04-28 22:06:063119 /*cert_verify_flags=*/0, url3_, "GET",
ckrasic1e53b642015-07-08 22:39:353120 net_log_, callback3.callback()));
bnc912a04b2016-04-20 14:19:503121 QuicChromiumClientSession* session3 = GetActiveSession(server3);
ckrasic1e53b642015-07-08 22:39:353122
jri78ec06a2016-03-31 18:19:403123 session3->connection()->CloseConnection(
3124 QUIC_PUBLIC_RESET, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353125 // Need to spin the loop now to ensure that
3126 // QuicStreamFactory::OnSessionClosed() runs.
3127 base::RunLoop run_loop3;
3128 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:263129 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3130 factory_.get()));
3131 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3132 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:163133 EXPECT_EQ(
3134 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
jri7046038f2015-10-22 00:29:263135 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353136
danakjad1777e2016-04-16 00:56:423137 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233138 EXPECT_FALSE(stream.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423139 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233140 EXPECT_FALSE(stream2.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423141 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233142 EXPECT_FALSE(stream3.get()); // Session is already closed.
ckrasic1e53b642015-07-08 22:39:353143
3144 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3145 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3146 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3147 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3148 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3149 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3150}
3151
3152TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfThree) {
jri7046038f2015-10-22 00:29:263153 disable_disk_cache_ = true;
3154 threshold_public_resets_post_handshake_ = 2;
3155 Initialize();
rch6faa4d42016-01-05 20:48:433156 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3157 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3158 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3159 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263160 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3161
3162 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3163 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353164 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263165 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353166
mmenke651bae7f2015-12-18 21:26:453167 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3168 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353169 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353170
mmenke651bae7f2015-12-18 21:26:453171 // SequencedSocketData socket_data2(nullptr, 0, nullptr, 0);
3172 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353173 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353174
mmenke651bae7f2015-12-18 21:26:453175 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353176 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:353177
rch6faa4d42016-01-05 20:48:433178 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3179 HostPortPair server3(kServer3HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353180
3181 crypto_client_stream_factory_.set_handshake_mode(
3182 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3183 host_resolver_.set_synchronous_mode(true);
3184 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3185 "192.168.0.1", "");
3186 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3187 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3188
3189 // Test first and third out of three timeouts with open streams.
jri7046038f2015-10-22 00:29:263190 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563191 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563192 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3193 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353194
bnc912a04b2016-04-20 14:19:503195 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353196
danakjad1777e2016-04-16 00:56:423197 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
ckrasic1e53b642015-07-08 22:39:353198 EXPECT_TRUE(stream.get());
3199 HttpRequestInfo request_info;
3200 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3201 net_log_, CompletionCallback()));
3202
3203 DVLOG(1)
3204 << "Created 1st session and initialized a stream. Now trigger timeout";
jri78ec06a2016-03-31 18:19:403205 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
3206 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353207 // Need to spin the loop now to ensure that
3208 // QuicStreamFactory::OnSessionClosed() runs.
3209 base::RunLoop run_loop;
3210 run_loop.RunUntilIdle();
3211
jri7046038f2015-10-22 00:29:263212 EXPECT_EQ(
3213 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3214 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3215 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353216
3217 // Test two-in-a-row timeouts with open streams.
3218 DVLOG(1) << "Create 2nd session without timeout";
3219 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263220 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563221 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563222 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353223 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:503224 QuicChromiumClientSession* session2 = GetActiveSession(server2);
ckrasic1e53b642015-07-08 22:39:353225
jri78ec06a2016-03-31 18:19:403226 session2->connection()->CloseConnection(
3227 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353228 // Need to spin the loop now to ensure that
3229 // QuicStreamFactory::OnSessionClosed() runs.
3230 base::RunLoop run_loop2;
3231 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263232 EXPECT_EQ(
3233 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3234 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3235 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353236
3237 DVLOG(1) << "Create 3rd session with timeout with open streams,"
3238 << " will disable QUIC";
3239
3240 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263241 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563242 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563243 /*cert_verify_flags=*/0, url3_, "GET",
ckrasic1e53b642015-07-08 22:39:353244 net_log_, callback3.callback()));
bnc912a04b2016-04-20 14:19:503245 QuicChromiumClientSession* session3 = GetActiveSession(server3);
ckrasic1e53b642015-07-08 22:39:353246
danakjad1777e2016-04-16 00:56:423247 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
ckrasic1e53b642015-07-08 22:39:353248 EXPECT_TRUE(stream3.get());
3249 EXPECT_EQ(OK, stream3->InitializeStream(&request_info, DEFAULT_PRIORITY,
3250 net_log_, CompletionCallback()));
jri78ec06a2016-03-31 18:19:403251 session3->connection()->CloseConnection(
3252 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353253 // Need to spin the loop now to ensure that
3254 // QuicStreamFactory::OnSessionClosed() runs.
3255 base::RunLoop run_loop3;
3256 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:263257 EXPECT_EQ(
3258 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3259 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3260 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:163261 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
jri7046038f2015-10-22 00:29:263262 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353263
danakjad1777e2016-04-16 00:56:423264 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233265 EXPECT_FALSE(stream2.get()); // Session is already closed.
rchcee7beb2016-03-11 06:16:143266
3267 // Verify that QUIC is un-disabled after a network change.
3268 factory_->OnIPAddressChanged();
3269 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3270 host_port_pair_.port()));
3271 EXPECT_EQ(
3272 0, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3273
ckrasic1e53b642015-07-08 22:39:353274 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3275 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3276 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3277 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3278 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3279 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3280}
3281
zhongyi89649c32016-01-22 00:14:013282TEST_P(QuicStreamFactoryTest, DisableQuicWhenTimeoutsWithOpenStreams) {
3283 disable_disk_cache_ = true;
3284 disable_quic_on_timeout_with_open_streams_ = true;
3285 Initialize();
3286 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3287 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3288 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3289
3290 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3291 host_port_pair_.port()));
3292 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
3293 factory_.get(), host_port_pair_.port()));
3294
3295 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3296 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
3297 socket_factory_.AddSocketDataProvider(&socket_data);
3298
3299 crypto_client_stream_factory_.set_handshake_mode(
3300 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3301 host_resolver_.set_synchronous_mode(true);
3302 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3303 "192.168.0.1", "");
3304
3305 // Test first timeouts with open streams will disable QUIC.
3306 QuicStreamRequest request(factory_.get());
3307 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563308 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3309 callback_.callback()));
zhongyi89649c32016-01-22 00:14:013310
bnc912a04b2016-04-20 14:19:503311 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
zhongyi89649c32016-01-22 00:14:013312
danakjad1777e2016-04-16 00:56:423313 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
zhongyi89649c32016-01-22 00:14:013314 EXPECT_TRUE(stream.get());
3315 HttpRequestInfo request_info;
3316 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3317 net_log_, CompletionCallback()));
3318
3319 DVLOG(1)
3320 << "Created 1st session and initialized a stream. Now trigger timeout."
3321 << "Will disable QUIC.";
jri78ec06a2016-03-31 18:19:403322 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
3323 ConnectionCloseBehavior::SILENT_CLOSE);
zhongyi89649c32016-01-22 00:14:013324 // Need to spin the loop now to ensure that
3325 // QuicStreamFactory::OnSessionClosed() runs.
3326 base::RunLoop run_loop;
3327 run_loop.RunUntilIdle();
3328
3329 EXPECT_EQ(
3330 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3331 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3332 host_port_pair_.port()));
3333
3334 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
3335 factory_->QuicDisabledReason(host_port_pair_.port()));
3336
rchcee7beb2016-03-11 06:16:143337 // Verify that QUIC is fully disabled after a TCP job succeeds.
3338 factory_->OnTcpJobCompleted(/*succeeded=*/true);
3339 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3340 host_port_pair_.port()));
3341
3342 // Verify that QUIC stays disabled after a TCP job succeeds.
3343 factory_->OnTcpJobCompleted(/*succeeded=*/false);
3344 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3345 host_port_pair_.port()));
3346
zhongyi89649c32016-01-22 00:14:013347 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3348 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3349}
3350
ckrasic1e53b642015-07-08 22:39:353351TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfFour) {
jri7046038f2015-10-22 00:29:263352 disable_disk_cache_ = true;
3353 threshold_public_resets_post_handshake_ = 2;
3354 Initialize();
rch6faa4d42016-01-05 20:48:433355 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3356 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3357 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3358 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3359 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263360 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3361
3362 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3363 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353364 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263365 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353366
mmenke651bae7f2015-12-18 21:26:453367 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3368 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353369 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353370
mmenke651bae7f2015-12-18 21:26:453371 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353372 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353373
mmenke651bae7f2015-12-18 21:26:453374 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353375 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:353376
mmenke651bae7f2015-12-18 21:26:453377 SequencedSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353378 socket_factory_.AddSocketDataProvider(&socket_data4);
ckrasic1e53b642015-07-08 22:39:353379
rch6faa4d42016-01-05 20:48:433380 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3381 HostPortPair server3(kServer3HostName, kDefaultServerPort);
3382 HostPortPair server4(kServer4HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353383
3384 crypto_client_stream_factory_.set_handshake_mode(
3385 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3386 host_resolver_.set_synchronous_mode(true);
3387 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3388 "192.168.0.1", "");
3389 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3390 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3391 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
3392
3393 // Test first and fourth out of four public reset post handshakes.
jri7046038f2015-10-22 00:29:263394 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563395 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563396 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3397 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353398
bnc912a04b2016-04-20 14:19:503399 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353400
3401 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
jri78ec06a2016-03-31 18:19:403402 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
3403 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353404 // Need to spin the loop now to ensure that
3405 // QuicStreamFactory::OnSessionClosed() runs.
3406 base::RunLoop run_loop;
3407 run_loop.RunUntilIdle();
3408
jri7046038f2015-10-22 00:29:263409 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3410 factory_.get()));
3411 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3412 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353413
3414 DVLOG(1) << "Create 2nd and 3rd sessions without disable trigger";
3415 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263416 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563417 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563418 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353419 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:503420 QuicChromiumClientSession* session2 = GetActiveSession(server2);
ckrasic1e53b642015-07-08 22:39:353421
jri78ec06a2016-03-31 18:19:403422 session2->connection()->CloseConnection(
3423 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353424 // Need to spin the loop now to ensure that
3425 // QuicStreamFactory::OnSessionClosed() runs.
3426 base::RunLoop run_loop2;
3427 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263428 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3429 factory_.get()));
3430 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3431 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353432
3433 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263434 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563435 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563436 /*cert_verify_flags=*/0, url3_, "GET",
ckrasic1e53b642015-07-08 22:39:353437 net_log_, callback3.callback()));
bnc912a04b2016-04-20 14:19:503438 QuicChromiumClientSession* session3 = GetActiveSession(server3);
ckrasic1e53b642015-07-08 22:39:353439
jri78ec06a2016-03-31 18:19:403440 session3->connection()->CloseConnection(
3441 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353442 // Need to spin the loop now to ensure that
3443 // QuicStreamFactory::OnSessionClosed() runs.
3444 base::RunLoop run_loop3;
3445 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:263446 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3447 factory_.get()));
3448 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3449 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353450
3451 DVLOG(1) << "Create 4rd session with public reset post handshake,"
3452 << " will not disable QUIC";
3453 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:263454 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:563455 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563456 /*cert_verify_flags=*/0, url4_, "GET",
ckrasic1e53b642015-07-08 22:39:353457 net_log_, callback4.callback()));
bnc912a04b2016-04-20 14:19:503458 QuicChromiumClientSession* session4 = GetActiveSession(server4);
ckrasic1e53b642015-07-08 22:39:353459
jri78ec06a2016-03-31 18:19:403460 session4->connection()->CloseConnection(
3461 QUIC_PUBLIC_RESET, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353462 // Need to spin the loop now to ensure that
3463 // QuicStreamFactory::OnSessionClosed() runs.
3464 base::RunLoop run_loop4;
3465 run_loop4.RunUntilIdle();
jri7046038f2015-10-22 00:29:263466 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3467 factory_.get()));
3468 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3469 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353470
danakjad1777e2016-04-16 00:56:423471 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233472 EXPECT_FALSE(stream.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423473 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233474 EXPECT_FALSE(stream2.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423475 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233476 EXPECT_FALSE(stream3.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423477 std::unique_ptr<QuicHttpStream> stream4 = request4.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233478 EXPECT_FALSE(stream4.get()); // Session is already closed.
ckrasic1e53b642015-07-08 22:39:353479
3480 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3481 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3482 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3483 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3484 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3485 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3486 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
3487 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
3488}
3489
3490TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfFour) {
jri7046038f2015-10-22 00:29:263491 disable_disk_cache_ = true;
3492 threshold_public_resets_post_handshake_ = 2;
3493 Initialize();
rch6faa4d42016-01-05 20:48:433494 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3495 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3496 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3497 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3498 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263499 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3500
3501 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3502 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353503 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263504 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353505
mmenke651bae7f2015-12-18 21:26:453506 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3507 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353508 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353509
mmenke651bae7f2015-12-18 21:26:453510 // SequencedSocketData socket_data2(nullptr, 0, nullptr, 0);
3511 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353512 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353513
mmenke651bae7f2015-12-18 21:26:453514 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353515 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:353516
mmenke651bae7f2015-12-18 21:26:453517 SequencedSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353518 socket_factory_.AddSocketDataProvider(&socket_data4);
ckrasic1e53b642015-07-08 22:39:353519
rch6faa4d42016-01-05 20:48:433520 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3521 HostPortPair server3(kServer3HostName, kDefaultServerPort);
3522 HostPortPair server4(kServer4HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353523
3524 crypto_client_stream_factory_.set_handshake_mode(
3525 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3526 host_resolver_.set_synchronous_mode(true);
3527 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3528 "192.168.0.1", "");
3529 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3530 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3531 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
3532
3533 // Test first and fourth out of three timeouts with open streams.
jri7046038f2015-10-22 00:29:263534 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563535 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563536 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3537 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353538
bnc912a04b2016-04-20 14:19:503539 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353540
danakjad1777e2016-04-16 00:56:423541 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
ckrasic1e53b642015-07-08 22:39:353542 EXPECT_TRUE(stream.get());
3543 HttpRequestInfo request_info;
3544 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3545 net_log_, CompletionCallback()));
3546
3547 DVLOG(1)
3548 << "Created 1st session and initialized a stream. Now trigger timeout";
jri78ec06a2016-03-31 18:19:403549 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
3550 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353551 // Need to spin the loop now to ensure that
3552 // QuicStreamFactory::OnSessionClosed() runs.
3553 base::RunLoop run_loop;
3554 run_loop.RunUntilIdle();
3555
jri7046038f2015-10-22 00:29:263556 EXPECT_EQ(
3557 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3558 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3559 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353560
3561 DVLOG(1) << "Create 2nd and 3rd sessions without timeout";
3562 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263563 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563564 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563565 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353566 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:503567 QuicChromiumClientSession* session2 = GetActiveSession(server2);
ckrasic1e53b642015-07-08 22:39:353568
jri78ec06a2016-03-31 18:19:403569 session2->connection()->CloseConnection(
3570 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353571 // Need to spin the loop now to ensure that
3572 // QuicStreamFactory::OnSessionClosed() runs.
3573 base::RunLoop run_loop2;
3574 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263575 EXPECT_EQ(
3576 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3577 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3578 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353579
3580 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263581 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563582 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563583 /*cert_verify_flags=*/0, url3_, "GET",
ckrasic1e53b642015-07-08 22:39:353584 net_log_, callback3.callback()));
bnc912a04b2016-04-20 14:19:503585 QuicChromiumClientSession* session3 = GetActiveSession(server3);
ckrasic1e53b642015-07-08 22:39:353586
jri78ec06a2016-03-31 18:19:403587 session3->connection()->CloseConnection(
3588 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353589 // Need to spin the loop now to ensure that
3590 // QuicStreamFactory::OnSessionClosed() runs.
3591 base::RunLoop run_loop3;
3592 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:263593 EXPECT_EQ(
3594 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3595 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3596 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353597
3598 DVLOG(1) << "Create 4th session with timeout with open streams,"
3599 << " will not disable QUIC";
3600
3601 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:263602 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:563603 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563604 /*cert_verify_flags=*/0, url4_, "GET",
ckrasic1e53b642015-07-08 22:39:353605 net_log_, callback4.callback()));
bnc912a04b2016-04-20 14:19:503606 QuicChromiumClientSession* session4 = GetActiveSession(server4);
ckrasic1e53b642015-07-08 22:39:353607
danakjad1777e2016-04-16 00:56:423608 std::unique_ptr<QuicHttpStream> stream4 = request4.CreateStream();
ckrasic1e53b642015-07-08 22:39:353609 EXPECT_TRUE(stream4.get());
3610 EXPECT_EQ(OK, stream4->InitializeStream(&request_info, DEFAULT_PRIORITY,
3611 net_log_, CompletionCallback()));
jri78ec06a2016-03-31 18:19:403612 session4->connection()->CloseConnection(
3613 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353614 // Need to spin the loop now to ensure that
3615 // QuicStreamFactory::OnSessionClosed() runs.
3616 base::RunLoop run_loop4;
3617 run_loop4.RunUntilIdle();
jri7046038f2015-10-22 00:29:263618 EXPECT_EQ(
3619 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3620 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3621 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353622
danakjad1777e2016-04-16 00:56:423623 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233624 EXPECT_FALSE(stream2.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423625 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233626 EXPECT_FALSE(stream3.get()); // Session is already closed.
rchcee7beb2016-03-11 06:16:143627
ckrasic1e53b642015-07-08 22:39:353628 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3629 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3630 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3631 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3632 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3633 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3634 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
3635 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
3636}
3637
rtenneti8332ba52015-09-17 19:33:413638TEST_P(QuicStreamFactoryTest, EnableDelayTcpRace) {
jri7046038f2015-10-22 00:29:263639 Initialize();
rch6faa4d42016-01-05 20:48:433640 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3641 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
mmenke651bae7f2015-12-18 21:26:453642 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3643 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti8332ba52015-09-17 19:33:413644 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti8332ba52015-09-17 19:33:413645
rtenneti8332ba52015-09-17 19:33:413646 ServerNetworkStats stats1;
3647 stats1.srtt = base::TimeDelta::FromMicroseconds(10);
zhongyi3d4a55e72016-04-22 20:36:463648 url::SchemeHostPort server("https", kDefaultServerHostName,
3649 kDefaultServerPort);
3650 http_server_properties_.SetServerNetworkStats(server, stats1);
rtenneti8332ba52015-09-17 19:33:413651
3652 crypto_client_stream_factory_.set_handshake_mode(
3653 MockCryptoClientStream::ZERO_RTT);
3654 host_resolver_.set_synchronous_mode(true);
3655 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3656 "192.168.0.1", "");
3657
jri7046038f2015-10-22 00:29:263658 QuicStreamRequest request(factory_.get());
rtenneti8332ba52015-09-17 19:33:413659 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:563660 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563661 /*cert_verify_flags=*/0, url_, "POST", net_log_,
3662 callback_.callback()));
rtenneti8332ba52015-09-17 19:33:413663
rtenneti8332ba52015-09-17 19:33:413664 EXPECT_EQ(base::TimeDelta::FromMicroseconds(15),
3665 request.GetTimeDelayForWaitingJob());
3666
3667 // Confirm the handshake and verify that the stream is created.
3668 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
3669 QuicSession::HANDSHAKE_CONFIRMED);
3670
3671 EXPECT_EQ(OK, callback_.WaitForResult());
3672
danakjad1777e2016-04-16 00:56:423673 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rtenneti8332ba52015-09-17 19:33:413674 EXPECT_TRUE(stream.get());
3675 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3676 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti8332ba52015-09-17 19:33:413677}
3678
rtenneticd2aaa15b2015-10-10 20:29:333679TEST_P(QuicStreamFactoryTest, MaybeInitialize) {
rtenneti41c09992015-11-30 18:24:013680 idle_connection_timeout_seconds_ = 500;
jri7046038f2015-10-22 00:29:263681 Initialize();
rch6faa4d42016-01-05 20:48:433682 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3683 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rtenneti41c09992015-11-30 18:24:013684 const QuicConfig* config = QuicStreamFactoryPeer::GetConfig(factory_.get());
3685 EXPECT_EQ(500, config->IdleConnectionStateLifetime().ToSeconds());
3686
jri7046038f2015-10-22 00:29:263687 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti8a80a6dc2015-09-21 19:51:133688
rtenneti8a80a6dc2015-09-21 19:51:133689 const AlternativeService alternative_service1(QUIC, host_port_pair_.host(),
3690 host_port_pair_.port());
3691 AlternativeServiceInfoVector alternative_service_info_vector;
3692 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
3693 alternative_service_info_vector.push_back(
rchdc7b9052016-03-17 20:51:503694 AlternativeServiceInfo(alternative_service1, expiration));
zhongyi3d4a55e72016-04-22 20:36:463695 url::SchemeHostPort server("https", kDefaultServerHostName,
3696 kDefaultServerPort);
rtenneticcab42b2015-10-09 06:38:163697 http_server_properties_.SetAlternativeServices(
zhongyi3d4a55e72016-04-22 20:36:463698 server, alternative_service_info_vector);
rtennetiee679d52016-04-06 17:01:133699
3700 HostPortPair host_port_pair2(kServer2HostName, kDefaultServerPort);
zhongyi3d4a55e72016-04-22 20:36:463701 url::SchemeHostPort server2("https", kServer2HostName, kDefaultServerPort);
rtennetiee679d52016-04-06 17:01:133702 const AlternativeService alternative_service2(QUIC, host_port_pair2.host(),
3703 host_port_pair2.port());
3704 AlternativeServiceInfoVector alternative_service_info_vector2;
3705 alternative_service_info_vector2.push_back(
3706 AlternativeServiceInfo(alternative_service2, expiration));
3707 http_server_properties_.SetAlternativeServices(
zhongyi3d4a55e72016-04-22 20:36:463708 server2, alternative_service_info_vector2);
rtennetiee679d52016-04-06 17:01:133709
rtenneti6971c172016-01-15 20:12:103710 http_server_properties_.SetMaxServerConfigsStoredInProperties(
3711 kMaxQuicServersToPersist);
rtenneti8a80a6dc2015-09-21 19:51:133712
rch6faa4d42016-01-05 20:48:433713 QuicServerId quic_server_id(kDefaultServerHostName, 80,
3714 PRIVACY_MODE_DISABLED);
rtenneticd2aaa15b2015-10-10 20:29:333715 QuicServerInfoFactory* quic_server_info_factory =
3716 new PropertiesBasedQuicServerInfoFactory(
3717 http_server_properties_.GetWeakPtr());
jri7046038f2015-10-22 00:29:263718 factory_->set_quic_server_info_factory(quic_server_info_factory);
rtenneticd2aaa15b2015-10-10 20:29:333719
danakjad1777e2016-04-16 00:56:423720 std::unique_ptr<QuicServerInfo> quic_server_info(
rtenneticd2aaa15b2015-10-10 20:29:333721 quic_server_info_factory->GetForServer(quic_server_id));
3722
3723 // Update quic_server_info's server_config and persist it.
3724 QuicServerInfo::State* state = quic_server_info->mutable_state();
3725 // Minimum SCFG that passes config validation checks.
3726 const char scfg[] = {// SCFG
3727 0x53, 0x43, 0x46, 0x47,
3728 // num entries
3729 0x01, 0x00,
3730 // padding
3731 0x00, 0x00,
3732 // EXPY
3733 0x45, 0x58, 0x50, 0x59,
3734 // EXPY end offset
3735 0x08, 0x00, 0x00, 0x00,
3736 // Value
3737 '1', '2', '3', '4', '5', '6', '7', '8'};
3738
3739 // Create temporary strings becasue Persist() clears string data in |state|.
3740 string server_config(reinterpret_cast<const char*>(&scfg), sizeof(scfg));
3741 string source_address_token("test_source_address_token");
rtenneti61de3682016-03-24 00:50:023742 string cert_sct("test_cert_sct");
3743 string chlo_hash("test_chlo_hash");
rtenneticd2aaa15b2015-10-10 20:29:333744 string signature("test_signature");
3745 string test_cert("test_cert");
3746 vector<string> certs;
3747 certs.push_back(test_cert);
3748 state->server_config = server_config;
3749 state->source_address_token = source_address_token;
rtenneti61de3682016-03-24 00:50:023750 state->cert_sct = cert_sct;
3751 state->chlo_hash = chlo_hash;
rtenneticd2aaa15b2015-10-10 20:29:333752 state->server_config_sig = signature;
3753 state->certs = certs;
3754
3755 quic_server_info->Persist();
3756
rtennetiee679d52016-04-06 17:01:133757 QuicServerId quic_server_id2(kServer2HostName, 80, PRIVACY_MODE_DISABLED);
danakjad1777e2016-04-16 00:56:423758 std::unique_ptr<QuicServerInfo> quic_server_info2(
rtennetiee679d52016-04-06 17:01:133759 quic_server_info_factory->GetForServer(quic_server_id2));
3760
3761 // Update quic_server_info2's server_config and persist it.
3762 QuicServerInfo::State* state2 = quic_server_info2->mutable_state();
3763
3764 // Minimum SCFG that passes config validation checks.
3765 const char scfg2[] = {// SCFG
3766 0x53, 0x43, 0x46, 0x47,
3767 // num entries
3768 0x01, 0x00,
3769 // padding
3770 0x00, 0x00,
3771 // EXPY
3772 0x45, 0x58, 0x50, 0x59,
3773 // EXPY end offset
3774 0x08, 0x00, 0x00, 0x00,
3775 // Value
3776 '8', '7', '3', '4', '5', '6', '2', '1'};
3777
3778 // Create temporary strings becasue Persist() clears string data in |state2|.
3779 string server_config2(reinterpret_cast<const char*>(&scfg2), sizeof(scfg2));
3780 string source_address_token2("test_source_address_token2");
3781 string cert_sct2("test_cert_sct2");
3782 string chlo_hash2("test_chlo_hash2");
3783 string signature2("test_signature2");
3784 string test_cert2("test_cert2");
3785 vector<string> certs2;
3786 certs2.push_back(test_cert2);
3787 state2->server_config = server_config2;
3788 state2->source_address_token = source_address_token2;
3789 state2->cert_sct = cert_sct2;
3790 state2->chlo_hash = chlo_hash2;
3791 state2->server_config_sig = signature2;
3792 state2->certs = certs2;
3793
3794 quic_server_info2->Persist();
3795
jri7046038f2015-10-22 00:29:263796 QuicStreamFactoryPeer::MaybeInitialize(factory_.get());
3797 EXPECT_TRUE(QuicStreamFactoryPeer::HasInitializedData(factory_.get()));
rtennetiee679d52016-04-06 17:01:133798
3799 // Verify the MRU order is maintained.
3800 const QuicServerInfoMap& quic_server_info_map =
3801 http_server_properties_.quic_server_info_map();
3802 EXPECT_EQ(2u, quic_server_info_map.size());
3803 QuicServerInfoMap::const_iterator quic_server_info_map_it =
3804 quic_server_info_map.begin();
3805 EXPECT_EQ(quic_server_info_map_it->first, quic_server_id2);
3806 ++quic_server_info_map_it;
3807 EXPECT_EQ(quic_server_info_map_it->first, quic_server_id);
3808
jri7046038f2015-10-22 00:29:263809 EXPECT_TRUE(QuicStreamFactoryPeer::SupportsQuicAtStartUp(factory_.get(),
3810 host_port_pair_));
3811 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(factory_.get(),
rtenneticd2aaa15b2015-10-10 20:29:333812 quic_server_id));
3813 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:263814 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rtenneticd2aaa15b2015-10-10 20:29:333815 QuicCryptoClientConfig::CachedState* cached =
3816 crypto_config->LookupOrCreate(quic_server_id);
3817 EXPECT_FALSE(cached->server_config().empty());
3818 EXPECT_TRUE(cached->GetServerConfig());
3819 EXPECT_EQ(server_config, cached->server_config());
3820 EXPECT_EQ(source_address_token, cached->source_address_token());
rtenneti61de3682016-03-24 00:50:023821 EXPECT_EQ(cert_sct, cached->cert_sct());
3822 EXPECT_EQ(chlo_hash, cached->chlo_hash());
rtenneticd2aaa15b2015-10-10 20:29:333823 EXPECT_EQ(signature, cached->signature());
3824 ASSERT_EQ(1U, cached->certs().size());
3825 EXPECT_EQ(test_cert, cached->certs()[0]);
rtennetiee679d52016-04-06 17:01:133826
3827 EXPECT_TRUE(QuicStreamFactoryPeer::SupportsQuicAtStartUp(factory_.get(),
3828 host_port_pair2));
3829 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(
3830 factory_.get(), quic_server_id2));
3831 QuicCryptoClientConfig::CachedState* cached2 =
3832 crypto_config->LookupOrCreate(quic_server_id2);
3833 EXPECT_FALSE(cached2->server_config().empty());
3834 EXPECT_TRUE(cached2->GetServerConfig());
3835 EXPECT_EQ(server_config2, cached2->server_config());
3836 EXPECT_EQ(source_address_token2, cached2->source_address_token());
3837 EXPECT_EQ(cert_sct2, cached2->cert_sct());
3838 EXPECT_EQ(chlo_hash2, cached2->chlo_hash());
3839 EXPECT_EQ(signature2, cached2->signature());
3840 ASSERT_EQ(1U, cached->certs().size());
3841 EXPECT_EQ(test_cert2, cached2->certs()[0]);
rtenneti8a80a6dc2015-09-21 19:51:133842}
3843
rtennetid2e74caa2015-12-09 00:51:573844TEST_P(QuicStreamFactoryTest, QuicDoingZeroRTT) {
3845 Initialize();
3846
3847 factory_->set_require_confirmation(true);
3848 QuicServerId quic_server_id(host_port_pair_, PRIVACY_MODE_DISABLED);
3849 EXPECT_FALSE(factory_->ZeroRTTEnabledFor(quic_server_id));
3850
3851 factory_->set_require_confirmation(false);
3852 EXPECT_FALSE(factory_->ZeroRTTEnabledFor(quic_server_id));
3853
3854 // Load server config and verify QUIC will do 0RTT.
3855 QuicStreamFactoryPeer::CacheDummyServerConfig(factory_.get(), quic_server_id);
3856 EXPECT_TRUE(factory_->ZeroRTTEnabledFor(quic_server_id));
3857}
3858
rtenneti1cd3b162015-09-29 02:58:283859TEST_P(QuicStreamFactoryTest, YieldAfterPackets) {
jri7046038f2015-10-22 00:29:263860 Initialize();
rch6faa4d42016-01-05 20:48:433861 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3862 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263863 QuicStreamFactoryPeer::SetYieldAfterPackets(factory_.get(), 0);
rtenneti1cd3b162015-09-29 02:58:283864
danakjad1777e2016-04-16 00:56:423865 std::unique_ptr<QuicEncryptedPacket> close_packet(
rtenneti1cd3b162015-09-29 02:58:283866 ConstructConnectionClosePacket(0));
rtenneticd2aaa15b2015-10-10 20:29:333867 vector<MockRead> reads;
rtenneti1cd3b162015-09-29 02:58:283868 reads.push_back(
3869 MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0));
3870 reads.push_back(MockRead(ASYNC, OK, 1));
mmenke651bae7f2015-12-18 21:26:453871 SequencedSocketData socket_data(&reads[0], reads.size(), nullptr, 0);
rtenneti1cd3b162015-09-29 02:58:283872 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti1cd3b162015-09-29 02:58:283873
3874 crypto_client_stream_factory_.set_handshake_mode(
3875 MockCryptoClientStream::ZERO_RTT);
3876 host_resolver_.set_synchronous_mode(true);
3877 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3878 "192.168.0.1", "");
3879
rcha02807b42016-01-29 21:56:153880 // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
3881 // posts a task.
rtenneti1cd3b162015-09-29 02:58:283882 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
rcha02807b42016-01-29 21:56:153883 SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
3884 "StartReading");
rtenneti1cd3b162015-09-29 02:58:283885
jri7046038f2015-10-22 00:29:263886 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563887 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563888 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3889 callback_.callback()));
rtenneti1cd3b162015-09-29 02:58:283890
rcha02807b42016-01-29 21:56:153891 // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
3892 // called.
rtenneti1cd3b162015-09-29 02:58:283893 base::RunLoop run_loop;
3894 run_loop.RunUntilIdle();
3895
3896 // Verify task that the observer's executed_count is 1, which indicates
rcha02807b42016-01-29 21:56:153897 // QuicChromiumPacketReader::StartReading() has posted only one task and
3898 // yielded the read.
rtenneti1cd3b162015-09-29 02:58:283899 EXPECT_EQ(1u, observer.executed_count());
3900
danakjad1777e2016-04-16 00:56:423901 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233902 EXPECT_FALSE(stream.get()); // Session is already closed.
rtenneti1cd3b162015-09-29 02:58:283903 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3904 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3905}
3906
3907TEST_P(QuicStreamFactoryTest, YieldAfterDuration) {
jri7046038f2015-10-22 00:29:263908 Initialize();
rch6faa4d42016-01-05 20:48:433909 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3910 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rtenneti1cd3b162015-09-29 02:58:283911 QuicStreamFactoryPeer::SetYieldAfterDuration(
jri7046038f2015-10-22 00:29:263912 factory_.get(), QuicTime::Delta::FromMilliseconds(-1));
rtenneti1cd3b162015-09-29 02:58:283913
danakjad1777e2016-04-16 00:56:423914 std::unique_ptr<QuicEncryptedPacket> close_packet(
rtenneti1cd3b162015-09-29 02:58:283915 ConstructConnectionClosePacket(0));
rtenneticd2aaa15b2015-10-10 20:29:333916 vector<MockRead> reads;
rtenneti1cd3b162015-09-29 02:58:283917 reads.push_back(
3918 MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0));
3919 reads.push_back(MockRead(ASYNC, OK, 1));
mmenke651bae7f2015-12-18 21:26:453920 SequencedSocketData socket_data(&reads[0], reads.size(), nullptr, 0);
rtenneti1cd3b162015-09-29 02:58:283921 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti1cd3b162015-09-29 02:58:283922
3923 crypto_client_stream_factory_.set_handshake_mode(
3924 MockCryptoClientStream::ZERO_RTT);
3925 host_resolver_.set_synchronous_mode(true);
3926 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3927 "192.168.0.1", "");
3928
rcha02807b42016-01-29 21:56:153929 // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
3930 // posts a task.
rtenneti1cd3b162015-09-29 02:58:283931 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
rcha02807b42016-01-29 21:56:153932 SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
3933 "StartReading");
rtenneti1cd3b162015-09-29 02:58:283934
jri7046038f2015-10-22 00:29:263935 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563936 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563937 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3938 callback_.callback()));
rtenneti1cd3b162015-09-29 02:58:283939
rcha02807b42016-01-29 21:56:153940 // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
3941 // called.
rtenneti1cd3b162015-09-29 02:58:283942 base::RunLoop run_loop;
3943 run_loop.RunUntilIdle();
3944
3945 // Verify task that the observer's executed_count is 1, which indicates
rcha02807b42016-01-29 21:56:153946 // QuicChromiumPacketReader::StartReading() has posted only one task and
3947 // yielded the read.
rtenneti1cd3b162015-09-29 02:58:283948 EXPECT_EQ(1u, observer.executed_count());
3949
danakjad1777e2016-04-16 00:56:423950 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233951 EXPECT_FALSE(stream.get()); // Session is already closed.
rtenneti1cd3b162015-09-29 02:58:283952 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3953 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3954}
3955
ckrasic3865ee0f2016-02-29 22:04:563956TEST_P(QuicStreamFactoryTest, ServerPushSessionAffinity) {
3957 Initialize();
3958 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3959 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3960
3961 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3962 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
3963 socket_factory_.AddSocketDataProvider(&socket_data);
3964
3965 QuicStreamRequest request(factory_.get());
3966 EXPECT_EQ(ERR_IO_PENDING,
3967 request.Request(host_port_pair_, privacy_mode_,
3968 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3969 callback_.callback()));
3970
3971 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:423972 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
ckrasic3865ee0f2016-02-29 22:04:563973 EXPECT_TRUE(stream.get());
3974
3975 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
3976
3977 std::string url = "https://www.example.org/";
3978
bnc912a04b2016-04-20 14:19:503979 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic3865ee0f2016-02-29 22:04:563980
3981 QuicClientPromisedInfo promised(session, kServerDataStreamId1, url);
3982 (*QuicStreamFactoryPeer::GetPushPromiseIndex(factory_.get())
3983 ->promised_by_url())[url] = &promised;
3984
3985 QuicStreamRequest request2(factory_.get());
3986 EXPECT_EQ(OK, request2.Request(host_port_pair_, privacy_mode_,
3987 /*cert_verify_flags=*/0, GURL(url), "GET",
3988 net_log_, callback_.callback()));
3989
3990 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
3991}
3992
3993TEST_P(QuicStreamFactoryTest, ServerPushPrivacyModeMismatch) {
3994 Initialize();
3995 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3996 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3997 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3998
3999 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
4000
danakjad1777e2016-04-16 00:56:424001 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
ckrasic3865ee0f2016-02-29 22:04:564002 1, true, kServerDataStreamId1, QUIC_STREAM_CANCELLED));
4003 MockWrite writes[] = {
4004 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
4005 };
4006
4007 SequencedSocketData socket_data1(reads, arraysize(reads), writes,
4008 arraysize(writes));
4009 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
4010
4011 socket_factory_.AddSocketDataProvider(&socket_data1);
4012 socket_factory_.AddSocketDataProvider(&socket_data2);
4013
4014 QuicStreamRequest request(factory_.get());
4015 EXPECT_EQ(ERR_IO_PENDING,
4016 request.Request(host_port_pair_, privacy_mode_,
4017 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4018 callback_.callback()));
4019
4020 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:424021 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
ckrasic3865ee0f2016-02-29 22:04:564022 EXPECT_TRUE(stream.get());
4023
4024 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
4025
4026 std::string url = "https://www.example.org/";
bnc912a04b2016-04-20 14:19:504027 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic3865ee0f2016-02-29 22:04:564028
4029 QuicClientPromisedInfo promised(session, kServerDataStreamId1, url);
4030
4031 QuicClientPushPromiseIndex* index =
4032 QuicStreamFactoryPeer::GetPushPromiseIndex(factory_.get());
4033
4034 (*index->promised_by_url())[url] = &promised;
4035 EXPECT_EQ(index->GetPromised(url), &promised);
4036
4037 // Doing the request should not use the push stream, but rather
4038 // cancel it because the privacy modes do not match.
4039 QuicStreamRequest request2(factory_.get());
4040 EXPECT_EQ(ERR_IO_PENDING,
4041 request2.Request(host_port_pair_, PRIVACY_MODE_ENABLED,
4042 /*cert_verify_flags=*/0, GURL(url), "GET",
4043 net_log_, callback_.callback()));
4044
4045 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
4046 EXPECT_EQ(index->GetPromised(url), nullptr);
4047
4048 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:424049 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
ckrasic3865ee0f2016-02-29 22:04:564050 EXPECT_TRUE(stream2.get());
4051
4052 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
4053 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
4054 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
4055 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
4056}
4057
bnc359ed2a2016-04-29 20:43:454058// Pool to existing session with matching QuicServerId
4059// even if destination is different.
4060TEST_P(QuicStreamFactoryTest, PoolByOrigin) {
4061 Initialize();
4062
4063 HostPortPair destination1("first.example.com", 443);
4064 HostPortPair destination2("second.example.com", 443);
4065
4066 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4067 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4068
4069 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
4070 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
4071 socket_factory_.AddSocketDataProvider(&socket_data);
4072
4073 QuicStreamRequest request1(factory_.get());
4074 EXPECT_EQ(ERR_IO_PENDING,
4075 request1.Request(destination1, privacy_mode_,
4076 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4077 callback_.callback()));
4078 EXPECT_EQ(OK, callback_.WaitForResult());
4079 std::unique_ptr<QuicHttpStream> stream1 = request1.CreateStream();
4080 EXPECT_TRUE(stream1.get());
4081 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4082
4083 // Second request returns synchronously because it pools to existing session.
4084 TestCompletionCallback callback2;
4085 QuicStreamRequest request2(factory_.get());
4086 EXPECT_EQ(OK, request2.Request(destination2, privacy_mode_,
4087 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4088 callback2.callback()));
4089 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
4090 EXPECT_TRUE(stream2.get());
4091
4092 QuicChromiumClientSession* session1 =
4093 QuicHttpStreamPeer::GetSession(stream1.get());
4094 QuicChromiumClientSession* session2 =
4095 QuicHttpStreamPeer::GetSession(stream2.get());
4096 EXPECT_EQ(session1, session2);
4097 EXPECT_EQ(QuicServerId(host_port_pair_, privacy_mode_),
4098 session1->server_id());
4099
4100 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4101 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4102}
4103
4104class QuicStreamFactoryWithDestinationTest
4105 : public QuicStreamFactoryTestBase,
4106 public ::testing::TestWithParam<PoolingTestParams> {
4107 protected:
4108 QuicStreamFactoryWithDestinationTest()
4109 : QuicStreamFactoryTestBase(GetParam().version,
4110 GetParam().enable_connection_racing),
4111 destination_type_(GetParam().destination_type),
4112 hanging_read_(SYNCHRONOUS, ERR_IO_PENDING, 0) {}
4113
4114 HostPortPair GetDestination() {
4115 switch (destination_type_) {
4116 case SAME_AS_FIRST:
4117 return origin1_;
4118 case SAME_AS_SECOND:
4119 return origin2_;
4120 case DIFFERENT:
4121 return HostPortPair(kDifferentHostname, 443);
4122 default:
4123 NOTREACHED();
4124 return HostPortPair();
4125 }
4126 }
4127
4128 void AddHangingSocketData() {
4129 std::unique_ptr<SequencedSocketData> sequenced_socket_data(
4130 new SequencedSocketData(&hanging_read_, 1, nullptr, 0));
4131 socket_factory_.AddSocketDataProvider(sequenced_socket_data.get());
4132 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
4133 }
4134
4135 bool AllDataConsumed() {
4136 for (const auto& socket_data_ptr : sequenced_socket_data_vector_) {
4137 if (!socket_data_ptr->AllReadDataConsumed() ||
4138 !socket_data_ptr->AllWriteDataConsumed()) {
4139 return false;
4140 }
4141 }
4142 return true;
4143 }
4144
4145 DestinationType destination_type_;
4146 HostPortPair origin1_;
4147 HostPortPair origin2_;
4148 MockRead hanging_read_;
4149 std::vector<std::unique_ptr<SequencedSocketData>>
4150 sequenced_socket_data_vector_;
4151};
4152
4153INSTANTIATE_TEST_CASE_P(Version,
4154 QuicStreamFactoryWithDestinationTest,
4155 ::testing::ValuesIn(GetPoolingTestParams()));
4156
4157// A single QUIC request fails because the certificate does not match the origin
4158// hostname, regardless of whether it matches the alternative service hostname.
4159TEST_P(QuicStreamFactoryWithDestinationTest, InvalidCertificate) {
4160 if (destination_type_ == DIFFERENT)
4161 return;
4162
4163 Initialize();
4164
4165 GURL url("https://mail.example.com/");
4166 origin1_ = HostPortPair::FromURL(url);
4167
4168 // Not used for requests, but this provides a test case where the certificate
4169 // is valid for the hostname of the alternative service.
4170 origin2_ = HostPortPair("mail.example.org", 433);
4171
4172 HostPortPair destination = GetDestination();
4173
4174 scoped_refptr<X509Certificate> cert(
4175 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
4176 bool unused;
4177 ASSERT_FALSE(cert->VerifyNameMatch(origin1_.host(), &unused));
4178 ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host(), &unused));
4179
4180 ProofVerifyDetailsChromium verify_details;
4181 verify_details.cert_verify_result.verified_cert = cert;
4182 verify_details.cert_verify_result.is_issued_by_known_root = true;
4183 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4184
4185 AddHangingSocketData();
4186
4187 QuicStreamRequest request(factory_.get());
4188 EXPECT_EQ(ERR_IO_PENDING, request.Request(destination, privacy_mode_,
4189 /*cert_verify_flags=*/0, url, "GET",
4190 net_log_, callback_.callback()));
4191
4192 EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, callback_.WaitForResult());
4193
4194 EXPECT_TRUE(AllDataConsumed());
4195}
4196
4197// QuicStreamRequest is pooled based on |destination| if certificate matches.
4198TEST_P(QuicStreamFactoryWithDestinationTest, SharedCertificate) {
4199 Initialize();
4200
4201 GURL url1("https://www.example.org/");
4202 GURL url2("https://mail.example.org/");
4203 origin1_ = HostPortPair::FromURL(url1);
4204 origin2_ = HostPortPair::FromURL(url2);
4205
4206 HostPortPair destination = GetDestination();
4207
4208 scoped_refptr<X509Certificate> cert(
4209 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
4210 bool unused;
4211 ASSERT_TRUE(cert->VerifyNameMatch(origin1_.host(), &unused));
4212 ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host(), &unused));
4213 ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname, &unused));
4214
4215 ProofVerifyDetailsChromium verify_details;
4216 verify_details.cert_verify_result.verified_cert = cert;
4217 verify_details.cert_verify_result.is_issued_by_known_root = true;
4218 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4219
4220 AddHangingSocketData();
4221
4222 QuicStreamRequest request1(factory_.get());
4223 EXPECT_EQ(ERR_IO_PENDING,
4224 request1.Request(destination, privacy_mode_,
4225 /*cert_verify_flags=*/0, url1, "GET", net_log_,
4226 callback_.callback()));
4227 EXPECT_EQ(OK, callback_.WaitForResult());
4228 std::unique_ptr<QuicHttpStream> stream1 = request1.CreateStream();
4229 EXPECT_TRUE(stream1.get());
4230 EXPECT_TRUE(HasActiveSession(origin1_));
4231
4232 // Second request returns synchronously because it pools to existing session.
4233 TestCompletionCallback callback2;
4234 QuicStreamRequest request2(factory_.get());
4235 EXPECT_EQ(OK, request2.Request(destination, privacy_mode_,
4236 /*cert_verify_flags=*/0, url2, "GET", net_log_,
4237 callback2.callback()));
4238 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
4239 EXPECT_TRUE(stream2.get());
4240
4241 QuicChromiumClientSession* session1 =
4242 QuicHttpStreamPeer::GetSession(stream1.get());
4243 QuicChromiumClientSession* session2 =
4244 QuicHttpStreamPeer::GetSession(stream2.get());
4245 EXPECT_EQ(session1, session2);
4246
4247 EXPECT_EQ(QuicServerId(origin1_, privacy_mode_), session1->server_id());
4248
4249 EXPECT_TRUE(AllDataConsumed());
4250}
4251
4252// QuicStreamRequest is not pooled if certificate does not match its origin.
4253TEST_P(QuicStreamFactoryWithDestinationTest, DisjointCertificate) {
4254 Initialize();
4255
4256 GURL url1("https://news.example.org/");
4257 GURL url2("https://mail.example.com/");
4258 origin1_ = HostPortPair::FromURL(url1);
4259 origin2_ = HostPortPair::FromURL(url2);
4260
4261 HostPortPair destination = GetDestination();
4262
4263 scoped_refptr<X509Certificate> cert1(
4264 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
4265 bool unused;
4266 ASSERT_TRUE(cert1->VerifyNameMatch(origin1_.host(), &unused));
4267 ASSERT_FALSE(cert1->VerifyNameMatch(origin2_.host(), &unused));
4268 ASSERT_FALSE(cert1->VerifyNameMatch(kDifferentHostname, &unused));
4269
4270 ProofVerifyDetailsChromium verify_details1;
4271 verify_details1.cert_verify_result.verified_cert = cert1;
4272 verify_details1.cert_verify_result.is_issued_by_known_root = true;
4273 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
4274
4275 scoped_refptr<X509Certificate> cert2(
4276 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
4277 ASSERT_TRUE(cert2->VerifyNameMatch(origin2_.host(), &unused));
4278 ASSERT_FALSE(cert2->VerifyNameMatch(kDifferentHostname, &unused));
4279
4280 ProofVerifyDetailsChromium verify_details2;
4281 verify_details2.cert_verify_result.verified_cert = cert2;
4282 verify_details2.cert_verify_result.is_issued_by_known_root = true;
4283 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
4284
4285 AddHangingSocketData();
4286 AddHangingSocketData();
4287
4288 QuicStreamRequest request1(factory_.get());
4289 EXPECT_EQ(ERR_IO_PENDING,
4290 request1.Request(destination, privacy_mode_,
4291 /*cert_verify_flags=*/0, url1, "GET", net_log_,
4292 callback_.callback()));
4293 EXPECT_EQ(OK, callback_.WaitForResult());
4294 std::unique_ptr<QuicHttpStream> stream1 = request1.CreateStream();
4295 EXPECT_TRUE(stream1.get());
4296 EXPECT_TRUE(HasActiveSession(origin1_));
4297
4298 TestCompletionCallback callback2;
4299 QuicStreamRequest request2(factory_.get());
4300 EXPECT_EQ(ERR_IO_PENDING,
4301 request2.Request(destination, privacy_mode_,
4302 /*cert_verify_flags=*/0, url2, "GET", net_log_,
4303 callback2.callback()));
4304 EXPECT_EQ(OK, callback2.WaitForResult());
4305 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
4306 EXPECT_TRUE(stream2.get());
4307
4308 // |request2| does not pool to the first session, because the certificate does
4309 // not match. Instead, another session is opened to the same destination, but
4310 // with a different QuicServerId.
4311 QuicChromiumClientSession* session1 =
4312 QuicHttpStreamPeer::GetSession(stream1.get());
4313 QuicChromiumClientSession* session2 =
4314 QuicHttpStreamPeer::GetSession(stream2.get());
4315 EXPECT_NE(session1, session2);
4316
4317 EXPECT_EQ(QuicServerId(origin1_, privacy_mode_), session1->server_id());
4318 EXPECT_EQ(QuicServerId(origin2_, privacy_mode_), session2->server_id());
4319
4320 EXPECT_TRUE(AllDataConsumed());
4321}
4322
[email protected]e13201d82012-12-12 05:00:324323} // namespace test
[email protected]e13201d82012-12-12 05:00:324324} // namespace net