blob: 794e40af210d6f1195b1f2472d52fae1ba7fc45e [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
[email protected]e13201d82012-12-12 05:00:327#include "base/run_loop.h"
[email protected]fc9be5802013-06-11 10:56:518#include "base/strings/string_util.h"
skyostil4891b25b2015-06-11 11:43:459#include "base/thread_task_runner_handle.h"
[email protected]eed749f92013-12-23 18:57:3810#include "net/base/test_data_directory.h"
[email protected]6d1b4ed2013-07-10 03:57:5411#include "net/cert/cert_verifier.h"
rtenneti052774e2015-11-24 21:00:1212#include "net/cert/multi_log_ct_verifier.h"
[email protected]f2cb3cf2013-03-21 01:40:5313#include "net/dns/mock_host_resolver.h"
[email protected]e13201d82012-12-12 05:00:3214#include "net/http/http_response_headers.h"
15#include "net/http/http_response_info.h"
rtenneti8332ba52015-09-17 19:33:4116#include "net/http/http_server_properties_impl.h"
[email protected]e13201d82012-12-12 05:00:3217#include "net/http/http_util.h"
[email protected]080b77932014-08-04 01:22:4618#include "net/http/transport_security_state.h"
[email protected]c49ff182013-09-28 08:33:2619#include "net/quic/crypto/crypto_handshake.h"
[email protected]b694e48c2014-03-18 17:10:1320#include "net/quic/crypto/proof_verifier_chromium.h"
rtenneticd2aaa15b2015-10-10 20:29:3321#include "net/quic/crypto/properties_based_quic_server_info.h"
22#include "net/quic/crypto/quic_crypto_client_config.h"
[email protected]4df69842013-02-27 06:32:1623#include "net/quic/crypto/quic_decrypter.h"
24#include "net/quic/crypto/quic_encrypter.h"
rtenneti38f5cd52014-10-28 20:28:2825#include "net/quic/crypto/quic_server_info.h"
ckrasic3865ee0f2016-02-29 22:04:5626#include "net/quic/quic_client_promised_info.h"
[email protected]e13201d82012-12-12 05:00:3227#include "net/quic/quic_http_stream.h"
jri7e636642016-01-14 06:57:0828#include "net/quic/quic_http_utils.h"
[email protected]257f24f2014-04-01 09:15:3729#include "net/quic/quic_server_id.h"
[email protected]e13201d82012-12-12 05:00:3230#include "net/quic/test_tools/mock_clock.h"
[email protected]e8ff26842013-03-22 21:02:0531#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
[email protected]9558c5d32012-12-22 00:08:1432#include "net/quic/test_tools/mock_random.h"
jri9c541572016-03-29 17:51:4833#include "net/quic/test_tools/quic_config_peer.h"
rtennetid2e74caa2015-12-09 00:51:5734#include "net/quic/test_tools/quic_stream_factory_peer.h"
[email protected]1e960032013-12-20 19:00:2035#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]e13201d82012-12-12 05:00:3236#include "net/quic/test_tools/quic_test_utils.h"
rtenneti38f5cd52014-10-28 20:28:2837#include "net/quic/test_tools/test_task_runner.h"
[email protected]e13201d82012-12-12 05:00:3238#include "net/socket/socket_test_util.h"
rtenneti1cd3b162015-09-29 02:58:2839#include "net/spdy/spdy_session_test_util.h"
[email protected]5db452202014-08-19 05:22:1540#include "net/spdy/spdy_test_utils.h"
[email protected]6b8a3c742014-07-25 00:25:3541#include "net/ssl/channel_id_service.h"
42#include "net/ssl/default_channel_id_store.h"
[email protected]eed749f92013-12-23 18:57:3843#include "net/test/cert_test_util.h"
[email protected]e13201d82012-12-12 05:00:3244#include "testing/gtest/include/gtest/gtest.h"
45
[email protected]6e12d702013-11-13 00:17:1746using base::StringPiece;
rtenneti14abd312015-02-06 21:56:0147using std::ostream;
[email protected]6e12d702013-11-13 00:17:1748using std::string;
49using std::vector;
50
[email protected]e13201d82012-12-12 05:00:3251namespace net {
jri7e636642016-01-14 06:57:0852
[email protected]e13201d82012-12-12 05:00:3253namespace test {
54
[email protected]3c772402013-12-18 21:38:1155namespace {
rch6faa4d42016-01-05 20:48:4356const char kDefaultServerHostName[] = "www.example.org";
57const char kServer2HostName[] = "mail.example.org";
58const char kServer3HostName[] = "docs.example.org";
59const char kServer4HostName[] = "images.example.org";
[email protected]3c772402013-12-18 21:38:1160const int kDefaultServerPort = 443;
ckrasic3865ee0f2016-02-29 22:04:5661const char kDefaultUrl[] = "https://www.example.org/";
62const char kServer2Url[] = "https://mail.example.org/";
63const char kServer3Url[] = "https://docs.example.org/";
64const char kServer4Url[] = "https://images.example.org/";
rtenneti14abd312015-02-06 21:56:0165
66// Run all tests with all the combinations of versions and
67// enable_connection_racing.
68struct TestParams {
69 TestParams(const QuicVersion version, bool enable_connection_racing)
70 : version(version), enable_connection_racing(enable_connection_racing) {}
71
72 friend ostream& operator<<(ostream& os, const TestParams& p) {
73 os << "{ version: " << QuicVersionToString(p.version);
74 os << " enable_connection_racing: " << p.enable_connection_racing << " }";
75 return os;
76 }
77
78 QuicVersion version;
79 bool enable_connection_racing;
80};
81
82// Constructs various test permutations.
83vector<TestParams> GetTestParams() {
84 vector<TestParams> params;
85 QuicVersionVector all_supported_versions = QuicSupportedVersions();
86 for (const QuicVersion version : all_supported_versions) {
87 params.push_back(TestParams(version, false));
88 params.push_back(TestParams(version, true));
89 }
90 return params;
91}
92
[email protected]3c772402013-12-18 21:38:1193} // namespace anonymous
94
rtenneti38f5cd52014-10-28 20:28:2895class MockQuicServerInfo : public QuicServerInfo {
96 public:
97 MockQuicServerInfo(const QuicServerId& server_id)
98 : QuicServerInfo(server_id) {}
dcheng2339883c2014-12-23 00:23:0599 ~MockQuicServerInfo() override {}
rtenneti38f5cd52014-10-28 20:28:28100
dcheng2339883c2014-12-23 00:23:05101 void Start() override {}
rtenneti38f5cd52014-10-28 20:28:28102
dcheng2339883c2014-12-23 00:23:05103 int WaitForDataReady(const CompletionCallback& callback) override {
rtenneti38f5cd52014-10-28 20:28:28104 return ERR_IO_PENDING;
105 }
106
rtenneti170f36a2015-02-10 19:13:45107 void ResetWaitForDataReadyCallback() override {}
108
dcheng2339883c2014-12-23 00:23:05109 void CancelWaitForDataReadyCallback() override {}
rtenneti38f5cd52014-10-28 20:28:28110
dcheng2339883c2014-12-23 00:23:05111 bool IsDataReady() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28112
dcheng2339883c2014-12-23 00:23:05113 bool IsReadyToPersist() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28114
dcheng2339883c2014-12-23 00:23:05115 void Persist() override {}
rtennetif0b832b2014-11-07 02:32:30116
dcheng2339883c2014-12-23 00:23:05117 void OnExternalCacheHit() override {}
rtenneti38f5cd52014-10-28 20:28:28118};
119
120class MockQuicServerInfoFactory : public QuicServerInfoFactory {
121 public:
122 MockQuicServerInfoFactory() {}
dcheng2339883c2014-12-23 00:23:05123 ~MockQuicServerInfoFactory() override {}
rtenneti38f5cd52014-10-28 20:28:28124
dcheng2339883c2014-12-23 00:23:05125 QuicServerInfo* GetForServer(const QuicServerId& server_id) override {
rtenneti38f5cd52014-10-28 20:28:28126 return new MockQuicServerInfo(server_id);
127 }
128};
129
jri7e636642016-01-14 06:57:08130class MockNetworkChangeNotifier : public NetworkChangeNotifier {
131 public:
132 MockNetworkChangeNotifier() : force_network_handles_supported_(false) {}
133
134 ConnectionType GetCurrentConnectionType() const override {
135 return CONNECTION_UNKNOWN;
136 }
137
138 void ForceNetworkHandlesSupported() {
139 force_network_handles_supported_ = true;
140 }
141
142 bool AreNetworkHandlesCurrentlySupported() const override {
143 return force_network_handles_supported_;
144 }
145
146 void SetConnectedNetworksList(const NetworkList& network_list) {
147 connected_networks_ = network_list;
148 }
149
150 void GetCurrentConnectedNetworks(NetworkList* network_list) const override {
151 network_list->clear();
152 *network_list = connected_networks_;
153 }
154
155 void NotifyNetworkSoonToDisconnect(
156 NetworkChangeNotifier::NetworkHandle network) {
157 NetworkChangeNotifier::NotifyObserversOfSpecificNetworkChange(
158 NetworkChangeNotifier::SOON_TO_DISCONNECT, network);
159 // Spin the message loop so the notification is delivered.
160 base::MessageLoop::current()->RunUntilIdle();
161 }
162
163 void NotifyNetworkDisconnected(NetworkChangeNotifier::NetworkHandle network) {
164 NetworkChangeNotifier::NotifyObserversOfSpecificNetworkChange(
165 NetworkChangeNotifier::DISCONNECTED, network);
166 // Spin the message loop so the notification is delivered.
167 base::MessageLoop::current()->RunUntilIdle();
168 }
169
170 private:
171 bool force_network_handles_supported_;
172 NetworkChangeNotifier::NetworkList connected_networks_;
173};
174
175// Class to replace existing NetworkChangeNotifier singleton with a
176// MockNetworkChangeNotifier for a test. To use, simply create a
177// ScopedMockNetworkChangeNotifier object in the test.
178class ScopedMockNetworkChangeNotifier {
179 public:
180 ScopedMockNetworkChangeNotifier()
181 : disable_network_change_notifier_for_tests_(
182 new NetworkChangeNotifier::DisableForTest()),
183 mock_network_change_notifier_(new MockNetworkChangeNotifier()) {}
184
185 MockNetworkChangeNotifier* mock_network_change_notifier() {
186 return mock_network_change_notifier_.get();
187 }
188
189 private:
danakjad1777e2016-04-16 00:56:42190 std::unique_ptr<NetworkChangeNotifier::DisableForTest>
jri7e636642016-01-14 06:57:08191 disable_network_change_notifier_for_tests_;
danakjad1777e2016-04-16 00:56:42192 std::unique_ptr<MockNetworkChangeNotifier> mock_network_change_notifier_;
jri7e636642016-01-14 06:57:08193};
194
rtenneti14abd312015-02-06 21:56:01195class QuicStreamFactoryTest : public ::testing::TestWithParam<TestParams> {
[email protected]e13201d82012-12-12 05:00:32196 protected:
197 QuicStreamFactoryTest()
[email protected]457d6952013-12-13 09:24:58198 : random_generator_(0),
199 clock_(new MockClock()),
rtenneti38f5cd52014-10-28 20:28:28200 runner_(new TestTaskRunner(clock_)),
bncb07c05532015-05-14 19:07:20201 maker_(GetParam().version, 0, clock_, kDefaultServerHostName),
[email protected]59c0bbd2014-03-22 04:08:12202 cert_verifier_(CertVerifier::CreateDefault()),
jri2b966f22014-09-02 22:25:36203 channel_id_service_(
rtennetibe635732014-10-02 22:51:42204 new ChannelIDService(new DefaultChannelIDStore(nullptr),
skyostil4891b25b2015-06-11 11:43:45205 base::ThreadTaskRunnerHandle::Get())),
rtenneti052774e2015-11-24 21:00:12206 cert_transparency_verifier_(new MultiLogCTVerifier()),
jri7e636642016-01-14 06:57:08207 scoped_mock_network_change_notifier_(nullptr),
jri7046038f2015-10-22 00:29:26208 factory_(nullptr),
[email protected]bf4ea2f2014-03-10 22:57:53209 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
ckrasic3865ee0f2016-02-29 22:04:56210 url_(kDefaultUrl),
211 url2_(kServer2Url),
212 url3_(kServer3Url),
213 url4_(kServer4Url),
jri7046038f2015-10-22 00:29:26214 privacy_mode_(PRIVACY_MODE_DISABLED),
215 enable_port_selection_(true),
216 always_require_handshake_confirmation_(false),
217 disable_connection_pooling_(false),
218 load_server_info_timeout_srtt_multiplier_(0.0f),
219 enable_connection_racing_(true),
220 enable_non_blocking_io_(true),
221 disable_disk_cache_(false),
222 prefer_aes_(false),
223 max_number_of_lossy_connections_(0),
224 packet_loss_threshold_(1.0f),
225 max_disabled_reasons_(3),
226 threshold_timeouts_with_open_streams_(2),
227 threshold_public_resets_post_handshake_(2),
228 receive_buffer_size_(0),
229 delay_tcp_race_(false),
rtenneti41c09992015-11-30 18:24:01230 close_sessions_on_ip_change_(false),
zhongyi89649c32016-01-22 00:14:01231 disable_quic_on_timeout_with_open_streams_(false),
jri7e636642016-01-14 06:57:08232 idle_connection_timeout_seconds_(kIdleConnectionTimeoutSeconds),
jrid36ada62016-02-06 02:42:08233 migrate_sessions_on_network_change_(false),
234 migrate_sessions_early_(false) {
[email protected]ca4e0d92014-08-22 16:33:22235 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
jri7046038f2015-10-22 00:29:26236 }
237
238 void Initialize() {
239 factory_.reset(new QuicStreamFactory(
240 &host_resolver_, &socket_factory_, http_server_properties_.GetWeakPtr(),
241 cert_verifier_.get(), nullptr, channel_id_service_.get(),
rtenneti052774e2015-11-24 21:00:12242 &transport_security_state_, cert_transparency_verifier_.get(),
jri7046038f2015-10-22 00:29:26243 /*SocketPerformanceWatcherFactory*/ nullptr,
244 &crypto_client_stream_factory_, &random_generator_, clock_,
245 kDefaultMaxPacketSize, std::string(),
246 SupportedVersions(GetParam().version), enable_port_selection_,
247 always_require_handshake_confirmation_, disable_connection_pooling_,
248 load_server_info_timeout_srtt_multiplier_, enable_connection_racing_,
249 enable_non_blocking_io_, disable_disk_cache_, prefer_aes_,
250 max_number_of_lossy_connections_, packet_loss_threshold_,
251 max_disabled_reasons_, threshold_timeouts_with_open_streams_,
252 threshold_public_resets_post_handshake_, receive_buffer_size_,
rtenneti6971c172016-01-15 20:12:10253 delay_tcp_race_, /*max_server_configs_stored_in_properties*/ 0,
zhongyi89649c32016-01-22 00:14:01254 close_sessions_on_ip_change_,
255 disable_quic_on_timeout_with_open_streams_,
256 idle_connection_timeout_seconds_, migrate_sessions_on_network_change_,
nharperd5cddca2016-02-27 03:37:52257 migrate_sessions_early_, QuicTagVector(),
258 /*enable_token_binding*/ false));
jri7046038f2015-10-22 00:29:26259 factory_->set_require_confirmation(false);
rtenneti6971c172016-01-15 20:12:10260 EXPECT_FALSE(factory_->has_quic_server_info_factory());
jri7046038f2015-10-22 00:29:26261 factory_->set_quic_server_info_factory(new MockQuicServerInfoFactory());
rtenneti6971c172016-01-15 20:12:10262 EXPECT_TRUE(factory_->has_quic_server_info_factory());
[email protected]e13201d82012-12-12 05:00:32263 }
264
jri7e636642016-01-14 06:57:08265 void InitializeConnectionMigrationTest(
266 NetworkChangeNotifier::NetworkList connected_networks) {
267 scoped_mock_network_change_notifier_.reset(
268 new ScopedMockNetworkChangeNotifier());
269 MockNetworkChangeNotifier* mock_ncn =
270 scoped_mock_network_change_notifier_->mock_network_change_notifier();
271 mock_ncn->ForceNetworkHandlesSupported();
272 mock_ncn->SetConnectedNetworksList(connected_networks);
273 migrate_sessions_on_network_change_ = true;
jrid36ada62016-02-06 02:42:08274 migrate_sessions_early_ = true;
jri7e636642016-01-14 06:57:08275 Initialize();
276 }
277
bnccb7ff3c2015-05-21 20:51:55278 bool HasActiveSession(const HostPortPair& host_port_pair) {
jri7046038f2015-10-22 00:29:26279 return QuicStreamFactoryPeer::HasActiveSession(factory_.get(),
280 host_port_pair);
bnccb7ff3c2015-05-21 20:51:55281 }
282
danakjad1777e2016-04-16 00:56:42283 std::unique_ptr<QuicHttpStream> CreateFromSession(
bnccb7ff3c2015-05-21 20:51:55284 const HostPortPair& host_port_pair) {
ckrasic4f9d88d2015-07-22 22:23:16285 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:26286 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair);
287 return QuicStreamFactoryPeer::CreateFromSession(factory_.get(), session);
[email protected]df157d9d2014-03-10 07:27:27288 }
[email protected]e13201d82012-12-12 05:00:32289
[email protected]bf4ea2f2014-03-10 22:57:53290 int GetSourcePortForNewSession(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10291 return GetSourcePortForNewSessionInner(destination, false);
292 }
293
rjshaded5ced072015-12-18 19:26:02294 int GetSourcePortForNewSessionAndGoAway(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10295 return GetSourcePortForNewSessionInner(destination, true);
296 }
297
[email protected]bf4ea2f2014-03-10 22:57:53298 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
[email protected]d8e2abf82014-03-06 10:30:10299 bool goaway_received) {
[email protected]3c772402013-12-18 21:38:11300 // Should only be called if there is no active session for this destination.
bnccb7ff3c2015-05-21 20:51:55301 EXPECT_FALSE(HasActiveSession(destination));
mmenke651bae7f2015-12-18 21:26:45302 size_t socket_count = socket_factory_.udp_client_socket_ports().size();
[email protected]3c772402013-12-18 21:38:11303
mmenke651bae7f2015-12-18 21:26:45304 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
305 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]3c772402013-12-18 21:38:11306 socket_factory_.AddSocketDataProvider(&socket_data);
307
jri7046038f2015-10-22 00:29:26308 QuicStreamRequest request(factory_.get());
ckrasic3865ee0f2016-02-29 22:04:56309 GURL url("https://" + destination.host() + "/");
[email protected]974849d2014-02-06 01:32:59310 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56311 request.Request(destination, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56312 /*cert_verify_flags=*/0, url, "GET", net_log_,
313 callback_.callback()));
[email protected]3c772402013-12-18 21:38:11314
315 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:42316 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]3c772402013-12-18 21:38:11317 EXPECT_TRUE(stream.get());
318 stream.reset();
319
ckrasic4f9d88d2015-07-22 22:23:16320 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:26321 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), destination);
[email protected]3c772402013-12-18 21:38:11322
mmenke651bae7f2015-12-18 21:26:45323 if (socket_count + 1 != socket_factory_.udp_client_socket_ports().size()) {
324 ADD_FAILURE();
[email protected]3c772402013-12-18 21:38:11325 return 0;
326 }
327
[email protected]d8e2abf82014-03-06 10:30:10328 if (goaway_received) {
329 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, "");
rtenneti9bd5d4b2015-08-21 05:44:52330 session->connection()->OnGoAwayFrame(goaway);
[email protected]d8e2abf82014-03-06 10:30:10331 }
[email protected]3c772402013-12-18 21:38:11332
jri7046038f2015-10-22 00:29:26333 factory_->OnSessionClosed(session);
bnccb7ff3c2015-05-21 20:51:55334 EXPECT_FALSE(HasActiveSession(destination));
rch37de576c2015-05-17 20:28:17335 EXPECT_TRUE(socket_data.AllReadDataConsumed());
336 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:45337 return socket_factory_.udp_client_socket_ports()[socket_count];
[email protected]3c772402013-12-18 21:38:11338 }
339
danakjad1777e2016-04-16 00:56:42340 std::unique_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
rtenneti1cd3b162015-09-29 02:58:28341 QuicPacketNumber num) {
342 return maker_.MakeConnectionClosePacket(num);
343 }
344
danakjad1777e2016-04-16 00:56:42345 std::unique_ptr<QuicEncryptedPacket> ConstructRstPacket() {
[email protected]66ae5962014-05-22 11:13:05346 QuicStreamId stream_id = kClientDataStreamId1;
[email protected]51cc1342014-04-18 23:44:37347 return maker_.MakeRstPacket(
348 1, true, stream_id,
rtenneti14abd312015-02-06 21:56:01349 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam().version));
[email protected]459a7402014-02-10 12:58:52350 }
351
bncf8bf0722015-05-19 20:04:13352 static ProofVerifyDetailsChromium DefaultProofVerifyDetails() {
rch6faa4d42016-01-05 20:48:43353 // Load a certificate that is valid for *.example.org
bncf8bf0722015-05-19 20:04:13354 scoped_refptr<X509Certificate> test_cert(
rch6faa4d42016-01-05 20:48:43355 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bncf8bf0722015-05-19 20:04:13356 EXPECT_TRUE(test_cert.get());
357 ProofVerifyDetailsChromium verify_details;
358 verify_details.cert_verify_result.verified_cert = test_cert;
359 verify_details.cert_verify_result.is_issued_by_known_root = true;
360 return verify_details;
361 }
362
jri8c44d692015-10-23 23:53:41363 void NotifyIPAddressChanged() {
364 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
jri7e636642016-01-14 06:57:08365 // Spin the message loop so the notification is delivered.
jri8c44d692015-10-23 23:53:41366 base::MessageLoop::current()->RunUntilIdle();
367 }
368
danakjad1777e2016-04-16 00:56:42369 std::unique_ptr<QuicEncryptedPacket> ConstructGetRequestPacket(
jri7e636642016-01-14 06:57:08370 QuicPacketNumber packet_number,
371 QuicStreamId stream_id,
372 bool should_include_version,
373 bool fin) {
374 SpdyHeaderBlock headers = maker_.GetRequestHeaders("GET", "https", "/");
375 SpdyPriority priority =
376 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
377 size_t spdy_headers_frame_len;
378 return maker_.MakeRequestHeadersPacket(
379 packet_number, stream_id, should_include_version, fin, priority,
380 headers, &spdy_headers_frame_len);
381 }
382
danakjad1777e2016-04-16 00:56:42383 std::unique_ptr<QuicEncryptedPacket> ConstructOkResponsePacket(
jri7e636642016-01-14 06:57:08384 QuicPacketNumber packet_number,
385 QuicStreamId stream_id,
386 bool should_include_version,
387 bool fin) {
388 SpdyHeaderBlock headers = maker_.GetResponseHeaders("200 OK");
389 size_t spdy_headers_frame_len;
390 return maker_.MakeResponseHeadersPacket(packet_number, stream_id,
391 should_include_version, fin,
392 headers, &spdy_headers_frame_len);
393 }
394
[email protected]e13201d82012-12-12 05:00:32395 MockHostResolver host_resolver_;
mmenke651bae7f2015-12-18 21:26:45396 MockClientSocketFactory socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05397 MockCryptoClientStreamFactory crypto_client_stream_factory_;
jri7e636642016-01-14 06:57:08398 ProofVerifyDetailsChromium verify_details_;
[email protected]9558c5d32012-12-22 00:08:14399 MockRandom random_generator_;
[email protected]872edd9e2013-01-16 08:51:15400 MockClock* clock_; // Owned by factory_.
rtenneti38f5cd52014-10-28 20:28:28401 scoped_refptr<TestTaskRunner> runner_;
rtenneti4b06ae72014-08-26 03:43:43402 QuicTestPacketMaker maker_;
rtenneticcab42b2015-10-09 06:38:16403 HttpServerPropertiesImpl http_server_properties_;
danakjad1777e2016-04-16 00:56:42404 std::unique_ptr<CertVerifier> cert_verifier_;
405 std::unique_ptr<ChannelIDService> channel_id_service_;
[email protected]080b77932014-08-04 01:22:46406 TransportSecurityState transport_security_state_;
danakjad1777e2016-04-16 00:56:42407 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
408 std::unique_ptr<ScopedMockNetworkChangeNotifier>
jri7e636642016-01-14 06:57:08409 scoped_mock_network_change_notifier_;
danakjad1777e2016-04-16 00:56:42410 std::unique_ptr<QuicStreamFactory> factory_;
[email protected]bf4ea2f2014-03-10 22:57:53411 HostPortPair host_port_pair_;
ckrasic3865ee0f2016-02-29 22:04:56412 GURL url_;
413 GURL url2_;
414 GURL url3_;
415 GURL url4_;
416
[email protected]9dd3ff0f2014-03-26 09:51:28417 PrivacyMode privacy_mode_;
[email protected]e13201d82012-12-12 05:00:32418 BoundNetLog net_log_;
419 TestCompletionCallback callback_;
jri7046038f2015-10-22 00:29:26420
421 // Variables to configure QuicStreamFactory.
422 bool enable_port_selection_;
423 bool always_require_handshake_confirmation_;
424 bool disable_connection_pooling_;
425 double load_server_info_timeout_srtt_multiplier_;
426 bool enable_connection_racing_;
427 bool enable_non_blocking_io_;
428 bool disable_disk_cache_;
429 bool prefer_aes_;
430 int max_number_of_lossy_connections_;
431 double packet_loss_threshold_;
432 int max_disabled_reasons_;
433 int threshold_timeouts_with_open_streams_;
434 int threshold_public_resets_post_handshake_;
435 int receive_buffer_size_;
436 bool delay_tcp_race_;
jri8c44d692015-10-23 23:53:41437 bool close_sessions_on_ip_change_;
zhongyi89649c32016-01-22 00:14:01438 bool disable_quic_on_timeout_with_open_streams_;
rtenneti41c09992015-11-30 18:24:01439 int idle_connection_timeout_seconds_;
jri7e636642016-01-14 06:57:08440 bool migrate_sessions_on_network_change_;
jrid36ada62016-02-06 02:42:08441 bool migrate_sessions_early_;
[email protected]e13201d82012-12-12 05:00:32442};
443
rtenneti14abd312015-02-06 21:56:01444INSTANTIATE_TEST_CASE_P(Version,
445 QuicStreamFactoryTest,
446 ::testing::ValuesIn(GetTestParams()));
[email protected]1e960032013-12-20 19:00:20447
[email protected]1e960032013-12-20 19:00:20448TEST_P(QuicStreamFactoryTest, Create) {
jri7046038f2015-10-22 00:29:26449 Initialize();
rch6faa4d42016-01-05 20:48:43450 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
451 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26452
mmenke651bae7f2015-12-18 21:26:45453 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
454 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:32455 socket_factory_.AddSocketDataProvider(&socket_data);
456
jri7046038f2015-10-22 00:29:26457 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:59458 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56459 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56460 /*cert_verify_flags=*/0, url_, "GET", net_log_,
461 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32462
463 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:42464 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]0edce6a2013-05-08 18:02:40465 EXPECT_TRUE(stream.get());
[email protected]e13201d82012-12-12 05:00:32466
467 // Will reset stream 3.
bnccb7ff3c2015-05-21 20:51:55468 stream = CreateFromSession(host_port_pair_);
[email protected]e13201d82012-12-12 05:00:32469 EXPECT_TRUE(stream.get());
470
[email protected]6d1b4ed2013-07-10 03:57:54471 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
472 // in streams on different sessions.
jri7046038f2015-10-22 00:29:26473 QuicStreamRequest request2(factory_.get());
ckrasic3865ee0f2016-02-29 22:04:56474 EXPECT_EQ(OK, request2.Request(host_port_pair_, privacy_mode_,
475 /*cert_verify_flags=*/0, url_, "GET", net_log_,
476 callback_.callback()));
xunjieli2608f9b2016-03-14 13:39:23477 stream = request2.CreateStream(); // Will reset stream 5.
rjshaded5ced072015-12-18 19:26:02478 stream.reset(); // Will reset stream 7.
[email protected]e13201d82012-12-12 05:00:32479
rch37de576c2015-05-17 20:28:17480 EXPECT_TRUE(socket_data.AllReadDataConsumed());
481 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:32482}
483
[email protected]8bd2b812014-03-26 04:01:17484TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
jri7046038f2015-10-22 00:29:26485 Initialize();
rch6faa4d42016-01-05 20:48:43486 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
487 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26488
mmenke651bae7f2015-12-18 21:26:45489 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
490 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17491 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]8bd2b812014-03-26 04:01:17492
493 crypto_client_stream_factory_.set_handshake_mode(
494 MockCryptoClientStream::ZERO_RTT);
495 host_resolver_.set_synchronous_mode(true);
496 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
497 "192.168.0.1", "");
498
jri7046038f2015-10-22 00:29:26499 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56500 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56501 /*cert_verify_flags=*/0, url_, "GET", net_log_,
502 callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17503
danakjad1777e2016-04-16 00:56:42504 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]8bd2b812014-03-26 04:01:17505 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17506 EXPECT_TRUE(socket_data.AllReadDataConsumed());
507 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17508}
509
510TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
jri7046038f2015-10-22 00:29:26511 Initialize();
rch6faa4d42016-01-05 20:48:43512 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
513 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26514
mmenke651bae7f2015-12-18 21:26:45515 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
516 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17517 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]8bd2b812014-03-26 04:01:17518
519 crypto_client_stream_factory_.set_handshake_mode(
520 MockCryptoClientStream::ZERO_RTT);
521 host_resolver_.set_synchronous_mode(true);
522 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
523 "192.168.0.1", "");
524
jri7046038f2015-10-22 00:29:26525 QuicStreamRequest request(factory_.get());
[email protected]8bd2b812014-03-26 04:01:17526 // Posts require handshake confirmation, so this will return asynchronously.
527 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56528 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56529 /*cert_verify_flags=*/0, url_, "POST", net_log_,
530 callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17531
532 // Confirm the handshake and verify that the stream is created.
533 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
534 QuicSession::HANDSHAKE_CONFIRMED);
535
536 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:42537 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]8bd2b812014-03-26 04:01:17538 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17539 EXPECT_TRUE(socket_data.AllReadDataConsumed());
540 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17541}
542
bnc68d401dd2015-05-18 20:31:48543TEST_P(QuicStreamFactoryTest, NoZeroRttForDifferentHost) {
jri7046038f2015-10-22 00:29:26544 Initialize();
rch6faa4d42016-01-05 20:48:43545 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
546 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26547
mmenke651bae7f2015-12-18 21:26:45548 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
549 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
bnc68d401dd2015-05-18 20:31:48550 socket_factory_.AddSocketDataProvider(&socket_data);
bnc68d401dd2015-05-18 20:31:48551
552 crypto_client_stream_factory_.set_handshake_mode(
553 MockCryptoClientStream::ZERO_RTT);
554 host_resolver_.set_synchronous_mode(true);
555 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
556 "192.168.0.1", "");
557
jri7046038f2015-10-22 00:29:26558 QuicStreamRequest request(factory_.get());
ckrasic3865ee0f2016-02-29 22:04:56559 int rv = request.Request(host_port_pair_, privacy_mode_,
560 /*cert_verify_flags=*/0, url2_, "GET", net_log_,
561 callback_.callback());
bnc68d401dd2015-05-18 20:31:48562 // If server and origin have different hostnames, then handshake confirmation
563 // should be required, so Request will return asynchronously.
564 EXPECT_EQ(ERR_IO_PENDING, rv);
565 // Confirm handshake.
566 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
567 QuicSession::HANDSHAKE_CONFIRMED);
568 EXPECT_EQ(OK, callback_.WaitForResult());
569
danakjad1777e2016-04-16 00:56:42570 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
bnc68d401dd2015-05-18 20:31:48571 EXPECT_TRUE(stream.get());
572 EXPECT_TRUE(socket_data.AllReadDataConsumed());
573 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
574}
575
rch68955482015-09-24 00:14:39576TEST_P(QuicStreamFactoryTest, GoAway) {
jri7046038f2015-10-22 00:29:26577 Initialize();
rch6faa4d42016-01-05 20:48:43578 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
579 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26580
mmenke651bae7f2015-12-18 21:26:45581 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
582 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rch68955482015-09-24 00:14:39583 socket_factory_.AddSocketDataProvider(&socket_data);
rch68955482015-09-24 00:14:39584
jri7046038f2015-10-22 00:29:26585 QuicStreamRequest request(factory_.get());
rch68955482015-09-24 00:14:39586 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56587 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56588 /*cert_verify_flags=*/0, url_, "GET", net_log_,
589 callback_.callback()));
rch68955482015-09-24 00:14:39590
591 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:42592 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rch68955482015-09-24 00:14:39593 EXPECT_TRUE(stream.get());
594
rchf114d982015-10-21 01:34:56595 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:26596 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
rch68955482015-09-24 00:14:39597
598 session->OnGoAway(QuicGoAwayFrame());
599
rchf114d982015-10-21 01:34:56600 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:26601 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
rch68955482015-09-24 00:14:39602
603 EXPECT_TRUE(socket_data.AllReadDataConsumed());
604 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
605}
606
zhongyi6b5a3892016-03-12 04:46:20607TEST_P(QuicStreamFactoryTest, GoAwayForConnectionMigrationWithPortOnly) {
608 Initialize();
609 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
610 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
611
612 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
613 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
614 socket_factory_.AddSocketDataProvider(&socket_data);
615
616 QuicStreamRequest request(factory_.get());
617 EXPECT_EQ(ERR_IO_PENDING,
618 request.Request(host_port_pair_, privacy_mode_,
619 /*cert_verify_flags=*/0, url_, "GET", net_log_,
620 callback_.callback()));
621
622 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:42623 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
zhongyi6b5a3892016-03-12 04:46:20624 EXPECT_TRUE(stream.get());
625
626 QuicChromiumClientSession* session =
627 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
628
629 session->OnGoAway(
630 QuicGoAwayFrame(QUIC_ERROR_MIGRATING_PORT, 0,
631 "peer connection migration due to port change only"));
632 NetErrorDetails details;
633 EXPECT_FALSE(details.quic_port_migration_detected);
634 session->PopulateNetErrorDetails(&details);
635 EXPECT_TRUE(details.quic_port_migration_detected);
636 details.quic_port_migration_detected = false;
637 stream->PopulateNetErrorDetails(&details);
638 EXPECT_TRUE(details.quic_port_migration_detected);
639
640 EXPECT_FALSE(
641 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
642
643 EXPECT_TRUE(socket_data.AllReadDataConsumed());
644 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
645}
646
[email protected]5db452202014-08-19 05:22:15647TEST_P(QuicStreamFactoryTest, Pooling) {
jri7046038f2015-10-22 00:29:26648 Initialize();
rch6faa4d42016-01-05 20:48:43649 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
650 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26651
mmenke651bae7f2015-12-18 21:26:45652 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
653 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38654 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]eed749f92013-12-23 18:57:38655
rch6faa4d42016-01-05 20:48:43656 HostPortPair server2(kServer2HostName, kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38657 host_resolver_.set_synchronous_mode(true);
rch6faa4d42016-01-05 20:48:43658 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
rjshaded5ced072015-12-18 19:26:02659 "192.168.0.1", "");
rch6faa4d42016-01-05 20:48:43660 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38661
jri7046038f2015-10-22 00:29:26662 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56663 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56664 /*cert_verify_flags=*/0, url_, "GET", net_log_,
665 callback_.callback()));
danakjad1777e2016-04-16 00:56:42666 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]eed749f92013-12-23 18:57:38667 EXPECT_TRUE(stream.get());
668
669 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26670 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56671 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56672 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50673 net_log_, callback.callback()));
danakjad1777e2016-04-16 00:56:42674 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]eed749f92013-12-23 18:57:38675 EXPECT_TRUE(stream2.get());
676
jri7046038f2015-10-22 00:29:26677 EXPECT_EQ(
678 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_),
679 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38680
rch37de576c2015-05-17 20:28:17681 EXPECT_TRUE(socket_data.AllReadDataConsumed());
682 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38683}
684
jri584002d12014-09-09 00:51:28685TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) {
jri7046038f2015-10-22 00:29:26686 disable_connection_pooling_ = true;
687 Initialize();
rch6faa4d42016-01-05 20:48:43688 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
689 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
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_data1(reads, arraysize(reads), nullptr, 0);
694 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28695 socket_factory_.AddSocketDataProvider(&socket_data1);
696 socket_factory_.AddSocketDataProvider(&socket_data2);
jri584002d12014-09-09 00:51:28697
rch6faa4d42016-01-05 20:48:43698 HostPortPair server2(kServer2HostName, kDefaultServerPort);
jri584002d12014-09-09 00:51:28699 host_resolver_.set_synchronous_mode(true);
rch6faa4d42016-01-05 20:48:43700 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
rjshaded5ced072015-12-18 19:26:02701 "192.168.0.1", "");
rch6faa4d42016-01-05 20:48:43702 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
jri584002d12014-09-09 00:51:28703
jri7046038f2015-10-22 00:29:26704 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56705 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56706 /*cert_verify_flags=*/0, url_, "GET", net_log_,
707 callback_.callback()));
danakjad1777e2016-04-16 00:56:42708 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri584002d12014-09-09 00:51:28709 EXPECT_TRUE(stream.get());
710
711 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26712 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56713 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56714 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50715 net_log_, callback.callback()));
danakjad1777e2016-04-16 00:56:42716 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jri584002d12014-09-09 00:51:28717 EXPECT_TRUE(stream2.get());
718
jri7046038f2015-10-22 00:29:26719 EXPECT_NE(
720 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_),
721 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
jri584002d12014-09-09 00:51:28722
rch37de576c2015-05-17 20:28:17723 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
724 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
725 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
726 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28727}
728
[email protected]eed749f92013-12-23 18:57:38729TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
jri7046038f2015-10-22 00:29:26730 Initialize();
rch6faa4d42016-01-05 20:48:43731 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
732 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
733 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26734
mmenke651bae7f2015-12-18 21:26:45735 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
736 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
737 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38738 socket_factory_.AddSocketDataProvider(&socket_data1);
739 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]eed749f92013-12-23 18:57:38740
rch6faa4d42016-01-05 20:48:43741 HostPortPair server2(kServer2HostName, kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38742 host_resolver_.set_synchronous_mode(true);
rch6faa4d42016-01-05 20:48:43743 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
rjshaded5ced072015-12-18 19:26:02744 "192.168.0.1", "");
rch6faa4d42016-01-05 20:48:43745 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38746
jri7046038f2015-10-22 00:29:26747 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56748 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56749 /*cert_verify_flags=*/0, url_, "GET", net_log_,
750 callback_.callback()));
danakjad1777e2016-04-16 00:56:42751 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]eed749f92013-12-23 18:57:38752 EXPECT_TRUE(stream.get());
753
754 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26755 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56756 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56757 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50758 net_log_, callback.callback()));
danakjad1777e2016-04-16 00:56:42759 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]eed749f92013-12-23 18:57:38760 EXPECT_TRUE(stream2.get());
761
jri7046038f2015-10-22 00:29:26762 factory_->OnSessionGoingAway(
763 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_));
rchf114d982015-10-21 01:34:56764 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:26765 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
766 EXPECT_FALSE(
767 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38768
769 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:26770 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:56771 EXPECT_EQ(OK, request3.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56772 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50773 net_log_, callback3.callback()));
danakjad1777e2016-04-16 00:56:42774 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
[email protected]eed749f92013-12-23 18:57:38775 EXPECT_TRUE(stream3.get());
776
jri7046038f2015-10-22 00:29:26777 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38778
rch37de576c2015-05-17 20:28:17779 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
780 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
781 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
782 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38783}
784
[email protected]5db452202014-08-19 05:22:15785TEST_P(QuicStreamFactoryTest, HttpsPooling) {
jri7046038f2015-10-22 00:29:26786 Initialize();
rch6faa4d42016-01-05 20:48:43787
mmenke651bae7f2015-12-18 21:26:45788 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
789 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38790 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]eed749f92013-12-23 18:57:38791
rch6faa4d42016-01-05 20:48:43792 HostPortPair server1(kDefaultServerHostName, 443);
793 HostPortPair server2(kServer2HostName, 443);
[email protected]eed749f92013-12-23 18:57:38794
bncf8bf0722015-05-19 20:04:13795 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01796 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38797
798 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53799 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
800 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38801
jri7046038f2015-10-22 00:29:26802 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56803 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56804 /*cert_verify_flags=*/0, url_, "GET", net_log_,
805 callback_.callback()));
danakjad1777e2016-04-16 00:56:42806 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]eed749f92013-12-23 18:57:38807 EXPECT_TRUE(stream.get());
808
809 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26810 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56811 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56812 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50813 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:42814 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]eed749f92013-12-23 18:57:38815 EXPECT_TRUE(stream2.get());
816
jri7046038f2015-10-22 00:29:26817 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
818 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38819
rch37de576c2015-05-17 20:28:17820 EXPECT_TRUE(socket_data.AllReadDataConsumed());
821 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38822}
823
jri584002d12014-09-09 00:51:28824TEST_P(QuicStreamFactoryTest, NoHttpsPoolingIfDisabled) {
jri7046038f2015-10-22 00:29:26825 disable_connection_pooling_ = true;
826 Initialize();
827
mmenke651bae7f2015-12-18 21:26:45828 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
829 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
830 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28831 socket_factory_.AddSocketDataProvider(&socket_data1);
832 socket_factory_.AddSocketDataProvider(&socket_data2);
jri584002d12014-09-09 00:51:28833
rch6faa4d42016-01-05 20:48:43834 HostPortPair server1(kDefaultServerHostName, 443);
835 HostPortPair server2(kServer2HostName, 443);
jri584002d12014-09-09 00:51:28836
bncf8bf0722015-05-19 20:04:13837 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01838 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rch6faa4d42016-01-05 20:48:43839 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28840
841 host_resolver_.set_synchronous_mode(true);
842 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
843 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
844
jri7046038f2015-10-22 00:29:26845 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56846 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56847 /*cert_verify_flags=*/0, url_, "GET", net_log_,
848 callback_.callback()));
danakjad1777e2016-04-16 00:56:42849 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri584002d12014-09-09 00:51:28850 EXPECT_TRUE(stream.get());
851
852 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26853 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56854 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56855 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50856 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:42857 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jri584002d12014-09-09 00:51:28858 EXPECT_TRUE(stream2.get());
859
jri7046038f2015-10-22 00:29:26860 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
861 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
jri584002d12014-09-09 00:51:28862
rch37de576c2015-05-17 20:28:17863 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
864 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
865 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
866 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28867}
868
bnccb7ff3c2015-05-21 20:51:55869class QuicAlternativeServiceCertificateValidationPooling
870 : public QuicStreamFactoryTest {
871 public:
872 void Run(bool valid) {
mmenke651bae7f2015-12-18 21:26:45873 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
874 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
bnccb7ff3c2015-05-21 20:51:55875 socket_factory_.AddSocketDataProvider(&socket_data1);
[email protected]eed749f92013-12-23 18:57:38876
rch6faa4d42016-01-05 20:48:43877 HostPortPair server1(kDefaultServerHostName, 443);
878 HostPortPair server2(kServer2HostName, 443);
[email protected]eed749f92013-12-23 18:57:38879
ckrasic3865ee0f2016-02-29 22:04:56880 GURL url(valid ? url2_ : GURL("http://invalid.example.com/"));
rch6faa4d42016-01-05 20:48:43881 HostPortPair alternative(kDefaultServerHostName, 443);
[email protected]eed749f92013-12-23 18:57:38882
bnccb7ff3c2015-05-21 20:51:55883 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
884 bool common_name_fallback_used;
885 EXPECT_EQ(valid,
886 verify_details.cert_verify_result.verified_cert->VerifyNameMatch(
ckrasic3865ee0f2016-02-29 22:04:56887 url.host(), &common_name_fallback_used));
bnccb7ff3c2015-05-21 20:51:55888 EXPECT_TRUE(
889 verify_details.cert_verify_result.verified_cert->VerifyNameMatch(
890 alternative.host(), &common_name_fallback_used));
891 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38892
bnccb7ff3c2015-05-21 20:51:55893 host_resolver_.set_synchronous_mode(true);
894 host_resolver_.rules()->AddIPLiteralRule(alternative.host(), "192.168.0.1",
895 "");
[email protected]eed749f92013-12-23 18:57:38896
bnccb7ff3c2015-05-21 20:51:55897 // Open first stream to alternative.
jri7046038f2015-10-22 00:29:26898 QuicStreamRequest request1(factory_.get());
rchf114d982015-10-21 01:34:56899 EXPECT_EQ(OK, request1.Request(alternative, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56900 /*cert_verify_flags=*/0, url_, "GET",
901 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:42902 std::unique_ptr<QuicHttpStream> stream1 = request1.CreateStream();
bnccb7ff3c2015-05-21 20:51:55903 EXPECT_TRUE(stream1.get());
[email protected]eed749f92013-12-23 18:57:38904
jri7046038f2015-10-22 00:29:26905 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56906 int rv = request2.Request(alternative, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56907 /*cert_verify_flags=*/0, url, "GET", net_log_,
908 callback_.callback());
bnccb7ff3c2015-05-21 20:51:55909 if (valid) {
910 // Alternative service of origin to |alternative| should pool to session
911 // of |stream1| even if origin is different. Since only one
912 // SocketDataProvider is set up, the second request succeeding means that
913 // it pooled to the session opened by the first one.
914 EXPECT_EQ(OK, rv);
danakjad1777e2016-04-16 00:56:42915 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
bnccb7ff3c2015-05-21 20:51:55916 EXPECT_TRUE(stream2.get());
917 } else {
918 EXPECT_EQ(ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN, rv);
919 }
[email protected]eed749f92013-12-23 18:57:38920
bnccb7ff3c2015-05-21 20:51:55921 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
922 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
923 }
924};
925
926INSTANTIATE_TEST_CASE_P(Version,
927 QuicAlternativeServiceCertificateValidationPooling,
928 ::testing::ValuesIn(GetTestParams()));
929
930TEST_P(QuicAlternativeServiceCertificateValidationPooling, Valid) {
jri7046038f2015-10-22 00:29:26931 Initialize();
bnccb7ff3c2015-05-21 20:51:55932 Run(true);
933}
934
935TEST_P(QuicAlternativeServiceCertificateValidationPooling, Invalid) {
jri7046038f2015-10-22 00:29:26936 Initialize();
bnccb7ff3c2015-05-21 20:51:55937 Run(false);
[email protected]eed749f92013-12-23 18:57:38938}
939
[email protected]5db452202014-08-19 05:22:15940TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
jri7046038f2015-10-22 00:29:26941 Initialize();
mmenke651bae7f2015-12-18 21:26:45942 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
943 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15944 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]5db452202014-08-19 05:22:15945
rch6faa4d42016-01-05 20:48:43946 HostPortPair server1(kDefaultServerHostName, 443);
947 HostPortPair server2(kServer2HostName, 443);
Avi Drissman13fc8932015-12-20 04:40:46948 uint8_t primary_pin = 1;
949 uint8_t backup_pin = 2;
rch6faa4d42016-01-05 20:48:43950 test::AddPin(&transport_security_state_, kServer2HostName, primary_pin,
[email protected]5db452202014-08-19 05:22:15951 backup_pin);
952
bncf8bf0722015-05-19 20:04:13953 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
[email protected]5db452202014-08-19 05:22:15954 verify_details.cert_verify_result.public_key_hashes.push_back(
955 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01956 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]5db452202014-08-19 05:22:15957
958 host_resolver_.set_synchronous_mode(true);
959 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
960 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
961
jri7046038f2015-10-22 00:29:26962 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56963 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56964 /*cert_verify_flags=*/0, url_, "GET", net_log_,
965 callback_.callback()));
danakjad1777e2016-04-16 00:56:42966 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]5db452202014-08-19 05:22:15967 EXPECT_TRUE(stream.get());
968
969 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26970 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56971 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56972 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50973 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:42974 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]5db452202014-08-19 05:22:15975 EXPECT_TRUE(stream2.get());
976
jri7046038f2015-10-22 00:29:26977 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
978 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]5db452202014-08-19 05:22:15979
rch37de576c2015-05-17 20:28:17980 EXPECT_TRUE(socket_data.AllReadDataConsumed());
981 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:15982}
983
jri584002d12014-09-09 00:51:28984TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithMatchingPinsIfDisabled) {
jri7046038f2015-10-22 00:29:26985 disable_connection_pooling_ = true;
986 Initialize();
987
mmenke651bae7f2015-12-18 21:26:45988 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
989 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
990 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28991 socket_factory_.AddSocketDataProvider(&socket_data1);
992 socket_factory_.AddSocketDataProvider(&socket_data2);
jri584002d12014-09-09 00:51:28993
rch6faa4d42016-01-05 20:48:43994 HostPortPair server1(kDefaultServerHostName, 443);
995 HostPortPair server2(kServer2HostName, 443);
Avi Drissman13fc8932015-12-20 04:40:46996 uint8_t primary_pin = 1;
997 uint8_t backup_pin = 2;
rch6faa4d42016-01-05 20:48:43998 test::AddPin(&transport_security_state_, kServer2HostName, primary_pin,
jri584002d12014-09-09 00:51:28999 backup_pin);
1000
bncf8bf0722015-05-19 20:04:131001 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
jri584002d12014-09-09 00:51:281002 verify_details.cert_verify_result.public_key_hashes.push_back(
1003 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:011004 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rch6faa4d42016-01-05 20:48:431005 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:281006
1007 host_resolver_.set_synchronous_mode(true);
1008 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1009 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1010
jri7046038f2015-10-22 00:29:261011 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561012 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561013 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1014 callback_.callback()));
danakjad1777e2016-04-16 00:56:421015 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri584002d12014-09-09 00:51:281016 EXPECT_TRUE(stream.get());
1017
1018 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:261019 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:561020 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561021 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:501022 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:421023 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jri584002d12014-09-09 00:51:281024 EXPECT_TRUE(stream2.get());
1025
jri7046038f2015-10-22 00:29:261026 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
1027 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
jri584002d12014-09-09 00:51:281028
rch37de576c2015-05-17 20:28:171029 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1030 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1031 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1032 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:281033}
1034
[email protected]5db452202014-08-19 05:22:151035TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
jri7046038f2015-10-22 00:29:261036 Initialize();
mmenke651bae7f2015-12-18 21:26:451037 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1038 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
1039 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:151040 socket_factory_.AddSocketDataProvider(&socket_data1);
1041 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]5db452202014-08-19 05:22:151042
rch6faa4d42016-01-05 20:48:431043 HostPortPair server1(kDefaultServerHostName, 443);
1044 HostPortPair server2(kServer2HostName, 443);
Avi Drissman13fc8932015-12-20 04:40:461045 uint8_t primary_pin = 1;
1046 uint8_t backup_pin = 2;
1047 uint8_t bad_pin = 3;
rch6faa4d42016-01-05 20:48:431048 test::AddPin(&transport_security_state_, kServer2HostName, primary_pin,
[email protected]5db452202014-08-19 05:22:151049 backup_pin);
1050
bncf8bf0722015-05-19 20:04:131051 ProofVerifyDetailsChromium verify_details1 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011052 verify_details1.cert_verify_result.public_key_hashes.push_back(
1053 test::GetTestHashValue(bad_pin));
1054 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
1055
bncf8bf0722015-05-19 20:04:131056 ProofVerifyDetailsChromium verify_details2 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011057 verify_details2.cert_verify_result.public_key_hashes.push_back(
1058 test::GetTestHashValue(primary_pin));
1059 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
[email protected]5db452202014-08-19 05:22:151060
1061 host_resolver_.set_synchronous_mode(true);
1062 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1063 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1064
jri7046038f2015-10-22 00:29:261065 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561066 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561067 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1068 callback_.callback()));
danakjad1777e2016-04-16 00:56:421069 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]5db452202014-08-19 05:22:151070 EXPECT_TRUE(stream.get());
1071
1072 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:261073 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:561074 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561075 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:501076 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:421077 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]5db452202014-08-19 05:22:151078 EXPECT_TRUE(stream2.get());
1079
jri7046038f2015-10-22 00:29:261080 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
1081 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]5db452202014-08-19 05:22:151082
rch37de576c2015-05-17 20:28:171083 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1084 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1085 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1086 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:151087}
1088
[email protected]1e960032013-12-20 19:00:201089TEST_P(QuicStreamFactoryTest, Goaway) {
jri7046038f2015-10-22 00:29:261090 Initialize();
rch6faa4d42016-01-05 20:48:431091 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1092 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1093 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1094
mmenke651bae7f2015-12-18 21:26:451095 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1096 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271097 socket_factory_.AddSocketDataProvider(&socket_data);
mmenke651bae7f2015-12-18 21:26:451098 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271099 socket_factory_.AddSocketDataProvider(&socket_data2);
1100
jri7046038f2015-10-22 00:29:261101 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591102 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561103 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561104 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1105 callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271106
1107 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421108 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]4d283b32013-10-17 12:57:271109 EXPECT_TRUE(stream.get());
1110
1111 // Mark the session as going away. Ensure that while it is still alive
1112 // that it is no longer active.
rchf114d982015-10-21 01:34:561113 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:261114 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1115 factory_->OnSessionGoingAway(session);
1116 EXPECT_EQ(true,
1117 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
rchf114d982015-10-21 01:34:561118 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261119 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
bnccb7ff3c2015-05-21 20:51:551120 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]4d283b32013-10-17 12:57:271121
1122 // Create a new request for the same destination and verify that a
1123 // new session is created.
jri7046038f2015-10-22 00:29:261124 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591125 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561126 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561127 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1128 callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271129 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421130 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]4d283b32013-10-17 12:57:271131 EXPECT_TRUE(stream2.get());
1132
rchf114d982015-10-21 01:34:561133 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:261134 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
1135 EXPECT_NE(session, QuicStreamFactoryPeer::GetActiveSession(factory_.get(),
rchf114d982015-10-21 01:34:561136 host_port_pair_));
jri7046038f2015-10-22 00:29:261137 EXPECT_EQ(true,
1138 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
[email protected]4d283b32013-10-17 12:57:271139
1140 stream2.reset();
1141 stream.reset();
1142
rch37de576c2015-05-17 20:28:171143 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1144 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1145 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1146 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]4d283b32013-10-17 12:57:271147}
1148
[email protected]1e960032013-12-20 19:00:201149TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
jri7046038f2015-10-22 00:29:261150 Initialize();
rch6faa4d42016-01-05 20:48:431151 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1152 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1153
[email protected]66ae5962014-05-22 11:13:051154 QuicStreamId stream_id = kClientDataStreamId1;
danakjad1777e2016-04-16 00:56:421155 std::unique_ptr<QuicEncryptedPacket> client_rst(
[email protected]1e960032013-12-20 19:00:201156 maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
[email protected]06ff5152013-08-29 01:03:051157 MockWrite writes[] = {
ckrasicea295fe2015-10-31 05:03:271158 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 0),
1159 };
danakjad1777e2016-04-16 00:56:421160 std::unique_ptr<QuicEncryptedPacket> server_rst(
ckrasicea295fe2015-10-31 05:03:271161 maker_.MakeRstPacket(1, false, stream_id, QUIC_STREAM_CANCELLED));
1162 MockRead reads[] = {
1163 MockRead(ASYNC, server_rst->data(), server_rst->length(), 1),
mmenke651bae7f2015-12-18 21:26:451164 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
1165 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1166 arraysize(writes));
[email protected]0b2294d32013-08-02 00:46:361167 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0b2294d32013-08-02 00:46:361168
1169 HttpRequestInfo request_info;
1170 std::vector<QuicHttpStream*> streams;
1171 // The MockCryptoClientStream sets max_open_streams to be
rtenneti6a4cf3b2015-01-09 03:41:151172 // kDefaultMaxStreamsPerConnection / 2.
1173 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection / 2; i++) {
jri7046038f2015-10-22 00:29:261174 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561175 int rv = request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561176 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1177 callback_.callback());
[email protected]0b2294d32013-08-02 00:46:361178 if (i == 0) {
1179 EXPECT_EQ(ERR_IO_PENDING, rv);
1180 EXPECT_EQ(OK, callback_.WaitForResult());
1181 } else {
1182 EXPECT_EQ(OK, rv);
1183 }
danakjad1777e2016-04-16 00:56:421184 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]0b2294d32013-08-02 00:46:361185 EXPECT_TRUE(stream);
rjshaded5ced072015-12-18 19:26:021186 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1187 net_log_, CompletionCallback()));
[email protected]0b2294d32013-08-02 00:46:361188 streams.push_back(stream.release());
1189 }
1190
jri7046038f2015-10-22 00:29:261191 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561192 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561193 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1194 CompletionCallback()));
danakjad1777e2016-04-16 00:56:421195 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]0b2294d32013-08-02 00:46:361196 EXPECT_TRUE(stream);
rjshaded5ced072015-12-18 19:26:021197 EXPECT_EQ(ERR_IO_PENDING,
1198 stream->InitializeStream(&request_info, DEFAULT_PRIORITY, net_log_,
1199 callback_.callback()));
[email protected]0b2294d32013-08-02 00:46:361200
1201 // Close the first stream.
1202 streams.front()->Close(false);
ckrasicea295fe2015-10-31 05:03:271203 // Trigger exchange of RSTs that in turn allow progress for the last
1204 // stream.
[email protected]0b2294d32013-08-02 00:46:361205 EXPECT_EQ(OK, callback_.WaitForResult());
1206
rch37de576c2015-05-17 20:28:171207 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1208 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
ckrasicea295fe2015-10-31 05:03:271209
1210 // Force close of the connection to suppress the generation of RST
1211 // packets when streams are torn down, which wouldn't be relevant to
1212 // this test anyway.
1213 QuicChromiumClientSession* session =
1214 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
jri78ec06a2016-03-31 18:19:401215 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
1216 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasicea295fe2015-10-31 05:03:271217
[email protected]0b2294d32013-08-02 00:46:361218 STLDeleteElements(&streams);
1219}
1220
[email protected]1e960032013-12-20 19:00:201221TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
jri7046038f2015-10-22 00:29:261222 Initialize();
mmenke651bae7f2015-12-18 21:26:451223 SequencedSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321224 socket_factory_.AddSocketDataProvider(&socket_data);
1225
[email protected]3c772402013-12-18 21:38:111226 host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName);
[email protected]e13201d82012-12-12 05:00:321227
jri7046038f2015-10-22 00:29:261228 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591229 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561230 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561231 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1232 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321233
1234 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
1235
rch37de576c2015-05-17 20:28:171236 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1237 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321238}
1239
[email protected]1e960032013-12-20 19:00:201240TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
jri7046038f2015-10-22 00:29:261241 Initialize();
[email protected]3c772402013-12-18 21:38:111242 MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
mmenke651bae7f2015-12-18 21:26:451243 SequencedSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]3c772402013-12-18 21:38:111244 socket_data.set_connect_data(connect);
1245 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]3c772402013-12-18 21:38:111246
jri7046038f2015-10-22 00:29:261247 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591248 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561249 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561250 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1251 callback_.callback()));
[email protected]3c772402013-12-18 21:38:111252
1253 EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult());
1254
rch37de576c2015-05-17 20:28:171255 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1256 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:111257}
1258
[email protected]1e960032013-12-20 19:00:201259TEST_P(QuicStreamFactoryTest, CancelCreate) {
jri7046038f2015-10-22 00:29:261260 Initialize();
mmenke651bae7f2015-12-18 21:26:451261 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1262 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321263 socket_factory_.AddSocketDataProvider(&socket_data);
1264 {
jri7046038f2015-10-22 00:29:261265 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591266 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561267 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561268 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1269 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321270 }
1271
mmenke651bae7f2015-12-18 21:26:451272 base::RunLoop().RunUntilIdle();
[email protected]e13201d82012-12-12 05:00:321273
danakjad1777e2016-04-16 00:56:421274 std::unique_ptr<QuicHttpStream> stream(CreateFromSession(host_port_pair_));
[email protected]e13201d82012-12-12 05:00:321275 EXPECT_TRUE(stream.get());
1276 stream.reset();
1277
rch37de576c2015-05-17 20:28:171278 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1279 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321280}
1281
[email protected]1e960032013-12-20 19:00:201282TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) {
jri7046038f2015-10-22 00:29:261283 Initialize();
rch6faa4d42016-01-05 20:48:431284 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1285 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1286 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1287 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261288
[email protected]3c772402013-12-18 21:38:111289 // Sequentially connect to the default host, then another host, and then the
1290 // default host. Verify that the default host gets a consistent ephemeral
1291 // port, that is different from the other host's connection.
1292
rch6faa4d42016-01-05 20:48:431293 std::string other_server_name = kServer2HostName;
[email protected]3c772402013-12-18 21:38:111294 EXPECT_NE(kDefaultServerHostName, other_server_name);
1295 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort);
[email protected]3c772402013-12-18 21:38:111296
[email protected]bf4ea2f2014-03-10 22:57:531297 int original_port = GetSourcePortForNewSession(host_port_pair_);
1298 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2));
1299 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]3c772402013-12-18 21:38:111300}
1301
[email protected]d8e2abf82014-03-06 10:30:101302TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) {
jri7046038f2015-10-22 00:29:261303 Initialize();
rch6faa4d42016-01-05 20:48:431304 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1305 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1306 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1307 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261308
[email protected]d8e2abf82014-03-06 10:30:101309 // Get a session to the host using the port suggester.
rjshaded5ced072015-12-18 19:26:021310 int original_port = GetSourcePortForNewSessionAndGoAway(host_port_pair_);
[email protected]d8e2abf82014-03-06 10:30:101311 // Verify that the port is different after the goaway.
[email protected]bf4ea2f2014-03-10 22:57:531312 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101313 // Since the previous session did not goaway we should see the original port.
[email protected]bf4ea2f2014-03-10 22:57:531314 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101315}
1316
[email protected]1e960032013-12-20 19:00:201317TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
jri7046038f2015-10-22 00:29:261318 Initialize();
rch6faa4d42016-01-05 20:48:431319 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1320 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1321 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1322
mmenke651bae7f2015-12-18 21:26:451323 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421324 std::unique_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
[email protected]459a7402014-02-10 12:58:521325 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311326 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:451327 SequencedSocketData socket_data(reads, arraysize(reads),
1328 writes.empty() ? nullptr : &writes[0],
1329 writes.size());
[email protected]56dfb902013-01-03 23:17:551330 socket_factory_.AddSocketDataProvider(&socket_data);
1331
mmenke651bae7f2015-12-18 21:26:451332 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1333 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]56dfb902013-01-03 23:17:551334 socket_factory_.AddSocketDataProvider(&socket_data2);
1335
jri7046038f2015-10-22 00:29:261336 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591337 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561338 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561339 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1340 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551341
1342 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421343 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]0b2294d32013-08-02 00:46:361344 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:021345 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]0b2294d32013-08-02 00:46:361346 net_log_, CompletionCallback()));
[email protected]56dfb902013-01-03 23:17:551347
1348 // Close the session and verify that stream saw the error.
jri7e636642016-01-14 06:57:081349 factory_->CloseAllSessions(ERR_INTERNET_DISCONNECTED, QUIC_INTERNAL_ERROR);
[email protected]56dfb902013-01-03 23:17:551350 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1351 stream->ReadResponseHeaders(callback_.callback()));
1352
1353 // Now attempting to request a stream to the same origin should create
1354 // a new session.
1355
jri7046038f2015-10-22 00:29:261356 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591357 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561358 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561359 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1360 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551361
1362 EXPECT_EQ(OK, callback_.WaitForResult());
xunjieli2608f9b2016-03-14 13:39:231363 stream = request2.CreateStream();
[email protected]56dfb902013-01-03 23:17:551364 stream.reset(); // Will reset stream 3.
1365
rch37de576c2015-05-17 20:28:171366 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1367 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1368 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1369 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]56dfb902013-01-03 23:17:551370}
1371
[email protected]1e960032013-12-20 19:00:201372TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
jri8c44d692015-10-23 23:53:411373 close_sessions_on_ip_change_ = true;
jri7046038f2015-10-22 00:29:261374 Initialize();
rch6faa4d42016-01-05 20:48:431375 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1376 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1377 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri8c44d692015-10-23 23:53:411378
mmenke651bae7f2015-12-18 21:26:451379 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421380 std::unique_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
[email protected]459a7402014-02-10 12:58:521381 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311382 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:451383 SequencedSocketData socket_data(reads, arraysize(reads),
1384 writes.empty() ? nullptr : &writes[0],
1385 writes.size());
[email protected]f698a012013-05-06 20:18:591386 socket_factory_.AddSocketDataProvider(&socket_data);
1387
mmenke651bae7f2015-12-18 21:26:451388 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1389 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]f698a012013-05-06 20:18:591390 socket_factory_.AddSocketDataProvider(&socket_data2);
1391
jri7046038f2015-10-22 00:29:261392 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591393 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561394 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561395 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1396 callback_.callback()));
[email protected]f698a012013-05-06 20:18:591397
1398 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421399 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]0b2294d32013-08-02 00:46:361400 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:021401 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]0b2294d32013-08-02 00:46:361402 net_log_, CompletionCallback()));
[email protected]f698a012013-05-06 20:18:591403
1404 // Change the IP address and verify that stream saw the error.
jri8c44d692015-10-23 23:53:411405 NotifyIPAddressChanged();
[email protected]f698a012013-05-06 20:18:591406 EXPECT_EQ(ERR_NETWORK_CHANGED,
1407 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:261408 EXPECT_TRUE(factory_->require_confirmation());
[email protected]f698a012013-05-06 20:18:591409
1410 // Now attempting to request a stream to the same origin should create
1411 // a new session.
1412
jri7046038f2015-10-22 00:29:261413 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591414 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561415 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561416 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1417 callback_.callback()));
[email protected]f698a012013-05-06 20:18:591418
1419 EXPECT_EQ(OK, callback_.WaitForResult());
xunjieli2608f9b2016-03-14 13:39:231420 stream = request2.CreateStream();
[email protected]f698a012013-05-06 20:18:591421 stream.reset(); // Will reset stream 3.
1422
rch37de576c2015-05-17 20:28:171423 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1424 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1425 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1426 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]f698a012013-05-06 20:18:591427}
1428
jri7e636642016-01-14 06:57:081429TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnect) {
1430 InitializeConnectionMigrationTest(
1431 {kDefaultNetworkForTests, kNewNetworkForTests});
1432 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1433 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1434 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1435
1436 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421437 std::unique_ptr<QuicEncryptedPacket> request_packet(
jri7e636642016-01-14 06:57:081438 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true));
1439 MockWrite writes[] = {MockWrite(SYNCHRONOUS, request_packet->data(),
1440 request_packet->length(), 1)};
1441 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1442 arraysize(writes));
1443 socket_factory_.AddSocketDataProvider(&socket_data);
1444
1445 // Create request and QuicHttpStream.
1446 QuicStreamRequest request(factory_.get());
1447 EXPECT_EQ(ERR_IO_PENDING,
1448 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561449 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1450 callback_.callback()));
jri7e636642016-01-14 06:57:081451 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421452 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081453 EXPECT_TRUE(stream.get());
1454
1455 // Cause QUIC stream to be created.
1456 HttpRequestInfo request_info;
1457 request_info.method = "GET";
1458 request_info.url = GURL("https://www.example.org/");
1459 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1460 net_log_, CompletionCallback()));
1461
1462 // Ensure that session is alive and active.
1463 QuicChromiumClientSession* session =
1464 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1465 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1466 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1467
1468 // Send GET request on stream.
1469 HttpResponseInfo response;
1470 HttpRequestHeaders request_headers;
1471 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
1472 callback_.callback()));
1473
1474 // Set up second socket data provider that is used after migration.
1475 // The response to the earlier request is read on this new socket.
danakjad1777e2016-04-16 00:56:421476 std::unique_ptr<QuicEncryptedPacket> ping(
jri7e636642016-01-14 06:57:081477 maker_.MakePingPacket(2, /*include_version=*/true));
1478 MockWrite writes1[] = {
1479 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 0)};
danakjad1777e2016-04-16 00:56:421480 std::unique_ptr<QuicEncryptedPacket> response_headers_packet(
jri7e636642016-01-14 06:57:081481 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
1482 MockRead reads1[] = {MockRead(ASYNC, response_headers_packet->data(),
1483 response_headers_packet->length(), 1),
1484 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
1485 SequencedSocketData socket_data1(reads1, arraysize(reads1), writes1,
1486 arraysize(writes1));
1487 socket_factory_.AddSocketDataProvider(&socket_data1);
1488
1489 // Trigger connection migration. This should cause a PING frame
1490 // to be emitted.
1491 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1492 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1493
1494 // The session should now be marked as going away. Ensure that
1495 // while it is still alive, it is no longer active.
1496 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1497 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1498 EXPECT_EQ(1u, session->GetNumActiveStreams());
1499
1500 // Verify that response headers on the migrated socket were delivered to the
1501 // stream.
1502 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
1503 EXPECT_EQ(200, response.headers->response_code());
1504
1505 // Create a new request for the same destination and verify that a
1506 // new session is created.
1507 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1508 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1509 socket_factory_.AddSocketDataProvider(&socket_data2);
1510
1511 QuicStreamRequest request2(factory_.get());
1512 EXPECT_EQ(ERR_IO_PENDING,
1513 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561514 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1515 callback_.callback()));
jri7e636642016-01-14 06:57:081516 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421517 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jri7e636642016-01-14 06:57:081518 EXPECT_TRUE(stream2.get());
1519
1520 EXPECT_TRUE(
1521 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
jrid36ada62016-02-06 02:42:081522 QuicChromiumClientSession* new_session =
1523 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1524 EXPECT_NE(session, new_session);
jri7e636642016-01-14 06:57:081525
jrid36ada62016-02-06 02:42:081526 // On a DISCONNECTED notification, nothing happens to the migrated
1527 // session, but the new session is closed since it has no open
1528 // streams.
jri7e636642016-01-14 06:57:081529 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1530 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1531 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1532 EXPECT_EQ(1u, session->GetNumActiveStreams());
jrid36ada62016-02-06 02:42:081533 EXPECT_FALSE(
1534 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), new_session));
jri7e636642016-01-14 06:57:081535
1536 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1537 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1538 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1539 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1540 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1541 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1542}
1543
1544TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnected) {
1545 InitializeConnectionMigrationTest(
1546 {kDefaultNetworkForTests, kNewNetworkForTests});
1547 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1548 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1549 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1550
1551 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421552 std::unique_ptr<QuicEncryptedPacket> request_packet(
jri7e636642016-01-14 06:57:081553 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true));
1554 MockWrite writes[] = {MockWrite(SYNCHRONOUS, request_packet->data(),
1555 request_packet->length(), 1)};
1556 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1557 arraysize(writes));
1558 socket_factory_.AddSocketDataProvider(&socket_data);
1559
1560 // Create request and QuicHttpStream.
1561 QuicStreamRequest request(factory_.get());
1562 EXPECT_EQ(ERR_IO_PENDING,
1563 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561564 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1565 callback_.callback()));
jri7e636642016-01-14 06:57:081566 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421567 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081568 EXPECT_TRUE(stream.get());
1569
1570 // Cause QUIC stream to be created.
1571 HttpRequestInfo request_info;
1572 request_info.method = "GET";
1573 request_info.url = GURL("https://www.example.org/");
1574 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1575 net_log_, CompletionCallback()));
1576
1577 // Ensure that session is alive and active.
1578 QuicChromiumClientSession* session =
1579 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1580 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1581 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1582
1583 // Send GET request on stream.
1584 HttpResponseInfo response_info;
1585 HttpRequestHeaders request_headers;
1586 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response_info,
1587 callback_.callback()));
1588
1589 // Set up second socket data provider that is used after migration.
danakjad1777e2016-04-16 00:56:421590 std::unique_ptr<QuicEncryptedPacket> ping(
jri7e636642016-01-14 06:57:081591 maker_.MakePingPacket(2, /*include_version=*/true));
danakjad1777e2016-04-16 00:56:421592 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri7e636642016-01-14 06:57:081593 3, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1594 MockWrite writes1[] = {
1595 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 0)};
danakjad1777e2016-04-16 00:56:421596 std::unique_ptr<QuicEncryptedPacket> response_packet(
jri7e636642016-01-14 06:57:081597 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
1598 MockRead reads1[] = {
1599 MockRead(ASYNC, response_packet->data(), response_packet->length(), 1),
1600 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
1601 SequencedSocketData socket_data1(reads1, arraysize(reads1), writes1,
1602 arraysize(writes1));
1603 socket_factory_.AddSocketDataProvider(&socket_data1);
1604
1605 // Trigger connection migration. This should cause a PING frame
1606 // to be emitted.
1607 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1608 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1609
1610 // The session should now be marked as going away. Ensure that
1611 // while it is still alive, it is no longer active.
1612 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1613 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1614 EXPECT_EQ(1u, session->GetNumActiveStreams());
1615
1616 // Create a new request for the same destination and verify that a
1617 // new session is created.
1618 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1619 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1620 socket_factory_.AddSocketDataProvider(&socket_data2);
1621
1622 QuicStreamRequest request2(factory_.get());
1623 EXPECT_EQ(ERR_IO_PENDING,
1624 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561625 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1626 callback_.callback()));
jri7e636642016-01-14 06:57:081627 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421628 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jri7e636642016-01-14 06:57:081629 EXPECT_TRUE(stream2.get());
1630
1631 EXPECT_TRUE(
1632 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
1633 EXPECT_NE(session, QuicStreamFactoryPeer::GetActiveSession(factory_.get(),
1634 host_port_pair_));
1635 EXPECT_EQ(true,
1636 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1637
1638 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1639 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1640 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1641 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1642 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1643 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1644}
1645
1646TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoNetworks) {
1647 NetworkChangeNotifier::NetworkList no_networks(0);
1648 InitializeConnectionMigrationTest(no_networks);
1649 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1650 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1651
1652 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421653 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri7e636642016-01-14 06:57:081654 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1655 MockWrite writes[] = {
1656 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1657 };
1658 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1659 arraysize(writes));
1660 socket_factory_.AddSocketDataProvider(&socket_data);
1661
1662 // Create request and QuicHttpStream.
1663 QuicStreamRequest request(factory_.get());
1664 EXPECT_EQ(ERR_IO_PENDING,
1665 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561666 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1667 callback_.callback()));
jri7e636642016-01-14 06:57:081668 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421669 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081670 EXPECT_TRUE(stream.get());
1671
1672 // Cause QUIC stream to be created.
1673 HttpRequestInfo request_info;
1674 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1675 net_log_, CompletionCallback()));
1676
1677 // Ensure that session is alive and active.
1678 QuicChromiumClientSession* session =
1679 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1680 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1681 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1682 EXPECT_EQ(1u, session->GetNumActiveStreams());
1683
1684 // Trigger connection migration. Since there are no networks
1685 // to migrate to, this should cause the session to continue on the same
1686 // socket, but be marked as going away.
1687 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1688 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1689
1690 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1691 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1692 EXPECT_EQ(1u, session->GetNumActiveStreams());
1693
1694 stream.reset();
1695
1696 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1697 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1698}
1699
1700TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoNetworks) {
1701 NetworkChangeNotifier::NetworkList no_networks(0);
1702 InitializeConnectionMigrationTest(no_networks);
1703 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1704 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1705
1706 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421707 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri7e636642016-01-14 06:57:081708 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1709 MockWrite writes[] = {
1710 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
1711 };
1712 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1713 arraysize(writes));
1714 socket_factory_.AddSocketDataProvider(&socket_data);
1715
1716 // Create request and QuicHttpStream.
1717 QuicStreamRequest request(factory_.get());
1718 EXPECT_EQ(ERR_IO_PENDING,
1719 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561720 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1721 callback_.callback()));
jri7e636642016-01-14 06:57:081722 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421723 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081724 EXPECT_TRUE(stream.get());
1725
1726 // Cause QUIC stream to be created.
1727 HttpRequestInfo request_info;
1728 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1729 net_log_, CompletionCallback()));
1730
1731 // Ensure that session is alive and active.
1732 QuicChromiumClientSession* session =
1733 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1734 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1735 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1736
1737 // Trigger connection migration. Since there are no networks
1738 // to migrate to, this should cause a RST_STREAM frame to be emitted
1739 // and the session to be closed.
1740 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1741 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1742
1743 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1744 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1745
1746 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1747 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1748}
1749
1750TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoNewNetwork) {
1751 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
1752 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1753 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1754
1755 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421756 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri7e636642016-01-14 06:57:081757 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1758 MockWrite writes[] = {
1759 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1760 };
1761 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1762 arraysize(writes));
1763 socket_factory_.AddSocketDataProvider(&socket_data);
1764
1765 // Create request and QuicHttpStream.
1766 QuicStreamRequest request(factory_.get());
1767 EXPECT_EQ(ERR_IO_PENDING,
1768 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561769 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1770 callback_.callback()));
jri7e636642016-01-14 06:57:081771 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421772 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081773 EXPECT_TRUE(stream.get());
1774
1775 // Cause QUIC stream to be created.
1776 HttpRequestInfo request_info;
1777 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1778 net_log_, CompletionCallback()));
1779
1780 // Ensure that session is alive and active.
1781 QuicChromiumClientSession* session =
1782 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1783 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1784 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1785
1786 // Trigger connection migration. Since there are no networks
1787 // to migrate to, this should cause session to be continue but be marked as
1788 // going away.
1789 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1790 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1791
1792 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1793 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1794 EXPECT_EQ(1u, session->GetNumActiveStreams());
1795
1796 stream.reset();
1797
1798 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1799 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1800}
1801
1802TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoNewNetwork) {
1803 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
1804 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1805 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1806
1807 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421808 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri7e636642016-01-14 06:57:081809 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1810 MockWrite writes[] = {
1811 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
1812 };
1813 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1814 arraysize(writes));
1815 socket_factory_.AddSocketDataProvider(&socket_data);
1816
1817 // Create request and QuicHttpStream.
1818 QuicStreamRequest request(factory_.get());
1819 EXPECT_EQ(ERR_IO_PENDING,
1820 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561821 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1822 callback_.callback()));
jri7e636642016-01-14 06:57:081823 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421824 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081825 EXPECT_TRUE(stream.get());
1826
1827 // Cause QUIC stream to be created.
1828 HttpRequestInfo request_info;
1829 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1830 net_log_, CompletionCallback()));
1831
1832 // Ensure that session is alive and active.
1833 QuicChromiumClientSession* session =
1834 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1835 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1836 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1837
1838 // Trigger connection migration. Since there are no networks
1839 // to migrate to, this should cause a RST_STREAM frame to be emitted
1840 // with QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed.
1841 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1842 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1843
1844 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1845 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1846
1847 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1848 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1849}
1850
jri231c2972016-03-08 19:50:111851TEST_P(QuicStreamFactoryTest,
1852 OnNetworkChangeSoonToDisconnectNonMigratableStream) {
1853 InitializeConnectionMigrationTest(
1854 {kDefaultNetworkForTests, kNewNetworkForTests});
1855 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1856 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1857
1858 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421859 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri231c2972016-03-08 19:50:111860 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1861 MockWrite writes[] = {
1862 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1863 };
1864 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1865 arraysize(writes));
1866 socket_factory_.AddSocketDataProvider(&socket_data);
1867
1868 // Create request and QuicHttpStream.
1869 QuicStreamRequest request(factory_.get());
1870 EXPECT_EQ(ERR_IO_PENDING,
1871 request.Request(host_port_pair_, privacy_mode_,
1872 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1873 callback_.callback()));
1874 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421875 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri231c2972016-03-08 19:50:111876 EXPECT_TRUE(stream.get());
1877
1878 // Cause QUIC stream to be created, but marked as non-migratable.
1879 HttpRequestInfo request_info;
1880 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION;
1881 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1882 net_log_, CompletionCallback()));
1883
1884 // Ensure that session is alive and active.
1885 QuicChromiumClientSession* session =
1886 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1887 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1888 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1889
1890 // Trigger connection migration. Since there is a non-migratable stream,
1891 // this should cause session to continue but be marked as going away.
1892 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1893 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1894
1895 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1896 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1897 EXPECT_EQ(1u, session->GetNumActiveStreams());
1898
1899 stream.reset();
1900
1901 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1902 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1903}
1904
jri9c541572016-03-29 17:51:481905TEST_P(QuicStreamFactoryTest,
1906 OnNetworkChangeSoonToDisconnectConnectionMigrationDisabled) {
1907 InitializeConnectionMigrationTest(
1908 {kDefaultNetworkForTests, kNewNetworkForTests});
1909 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1910 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1911
1912 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421913 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri9c541572016-03-29 17:51:481914 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1915 MockWrite writes[] = {
1916 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1917 };
1918 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1919 arraysize(writes));
1920 socket_factory_.AddSocketDataProvider(&socket_data);
1921
1922 // Create request and QuicHttpStream.
1923 QuicStreamRequest request(factory_.get());
1924 EXPECT_EQ(ERR_IO_PENDING,
1925 request.Request(host_port_pair_, privacy_mode_,
1926 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1927 callback_.callback()));
1928 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421929 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri9c541572016-03-29 17:51:481930 EXPECT_TRUE(stream.get());
1931
1932 // Cause QUIC stream to be created.
1933 HttpRequestInfo request_info;
1934 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1935 net_log_, CompletionCallback()));
1936
1937 // Ensure that session is alive and active.
1938 QuicChromiumClientSession* session =
1939 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1940 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1941 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1942
1943 // Set session config to have connection migration disabled.
1944 QuicConfigPeer::SetReceivedDisableConnectionMigration(session->config());
1945 EXPECT_TRUE(session->config()->DisableConnectionMigration());
1946
1947 // Trigger connection migration. Since there is a non-migratable stream,
1948 // this should cause session to continue but be marked as going away.
1949 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1950 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1951
1952 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1953 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1954 EXPECT_EQ(1u, session->GetNumActiveStreams());
1955
1956 stream.reset();
1957
1958 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1959 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1960}
1961
jri231c2972016-03-08 19:50:111962TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNonMigratableStream) {
1963 InitializeConnectionMigrationTest(
1964 {kDefaultNetworkForTests, kNewNetworkForTests});
1965 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1966 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1967
1968 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421969 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri231c2972016-03-08 19:50:111970 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1971 MockWrite writes[] = {
1972 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
1973 };
1974 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1975 arraysize(writes));
1976 socket_factory_.AddSocketDataProvider(&socket_data);
1977
1978 // Create request and QuicHttpStream.
1979 QuicStreamRequest request(factory_.get());
1980 EXPECT_EQ(ERR_IO_PENDING,
1981 request.Request(host_port_pair_, privacy_mode_,
1982 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1983 callback_.callback()));
1984 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421985 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri231c2972016-03-08 19:50:111986 EXPECT_TRUE(stream.get());
1987
1988 // Cause QUIC stream to be created, but marked as non-migratable.
1989 HttpRequestInfo request_info;
1990 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION;
1991 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1992 net_log_, CompletionCallback()));
1993
1994 // Ensure that session is alive and active.
1995 QuicChromiumClientSession* session =
1996 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1997 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1998 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1999
2000 // Trigger connection migration. Since there is a non-migratable stream,
2001 // this should cause a RST_STREAM frame to be emitted with
2002 // QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed.
2003 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2004 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2005
2006 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2007 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2008
2009 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2010 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2011}
2012
jri9c541572016-03-29 17:51:482013TEST_P(QuicStreamFactoryTest,
2014 OnNetworkChangeDisconnectedConnectionMigrationDisabled) {
2015 InitializeConnectionMigrationTest(
2016 {kDefaultNetworkForTests, kNewNetworkForTests});
2017 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2018 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2019
2020 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:422021 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri9c541572016-03-29 17:51:482022 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
2023 MockWrite writes[] = {
2024 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
2025 };
2026 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2027 arraysize(writes));
2028 socket_factory_.AddSocketDataProvider(&socket_data);
2029
2030 // Create request and QuicHttpStream.
2031 QuicStreamRequest request(factory_.get());
2032 EXPECT_EQ(ERR_IO_PENDING,
2033 request.Request(host_port_pair_, privacy_mode_,
2034 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2035 callback_.callback()));
2036 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422037 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri9c541572016-03-29 17:51:482038 EXPECT_TRUE(stream.get());
2039
2040 // Cause QUIC stream to be created.
2041 HttpRequestInfo request_info;
2042 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2043 net_log_, CompletionCallback()));
2044
2045 // Ensure that session is alive and active.
2046 QuicChromiumClientSession* session =
2047 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
2048 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2049 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2050
2051 // Set session config to have connection migration disabled.
2052 QuicConfigPeer::SetReceivedDisableConnectionMigration(session->config());
2053 EXPECT_TRUE(session->config()->DisableConnectionMigration());
2054
2055 // Trigger connection migration. Since there is a non-migratable stream,
2056 // this should cause a RST_STREAM frame to be emitted with
2057 // QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed.
2058 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2059 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2060
2061 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2062 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2063
2064 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2065 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2066}
2067
jri7e636642016-01-14 06:57:082068TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoOpenStreams) {
2069 InitializeConnectionMigrationTest(
2070 {kDefaultNetworkForTests, kNewNetworkForTests});
2071 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2072 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2073
2074 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2075 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0u);
2076 socket_factory_.AddSocketDataProvider(&socket_data);
2077
2078 // Create request and QuicHttpStream.
2079 QuicStreamRequest request(factory_.get());
2080 EXPECT_EQ(ERR_IO_PENDING,
2081 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562082 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2083 callback_.callback()));
jri7e636642016-01-14 06:57:082084 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422085 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:082086 EXPECT_TRUE(stream.get());
2087
2088 // Ensure that session is alive and active.
2089 QuicChromiumClientSession* session =
2090 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
2091 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2092 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2093
2094 // Trigger connection migration. Since there are no active streams,
2095 // the session will be closed.
2096 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2097 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2098
2099 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2100 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2101
2102 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2103 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2104}
2105
2106TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoOpenStreams) {
2107 InitializeConnectionMigrationTest(
2108 {kDefaultNetworkForTests, kNewNetworkForTests});
2109 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2110 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2111
2112 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2113 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0u);
2114 socket_factory_.AddSocketDataProvider(&socket_data);
2115
2116 // Create request and QuicHttpStream.
2117 QuicStreamRequest request(factory_.get());
2118 EXPECT_EQ(ERR_IO_PENDING,
2119 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562120 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2121 callback_.callback()));
jri7e636642016-01-14 06:57:082122 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422123 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:082124 EXPECT_TRUE(stream.get());
2125
2126 // Ensure that session is alive and active.
2127 QuicChromiumClientSession* session =
2128 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
2129 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2130 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2131
2132 // Trigger connection migration. Since there are no active streams,
2133 // the session will be closed.
2134 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2135 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2136
2137 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2138 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2139
2140 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2141 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2142}
2143
jrid36ada62016-02-06 02:42:082144TEST_P(QuicStreamFactoryTest, MigrateSessionEarly) {
2145 InitializeConnectionMigrationTest(
2146 {kDefaultNetworkForTests, kNewNetworkForTests});
2147 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2148 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2149 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2150
2151 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:422152 std::unique_ptr<QuicEncryptedPacket> request_packet(
jrid36ada62016-02-06 02:42:082153 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true));
2154 MockWrite writes[] = {MockWrite(SYNCHRONOUS, request_packet->data(),
2155 request_packet->length(), 1)};
2156 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2157 arraysize(writes));
2158 socket_factory_.AddSocketDataProvider(&socket_data);
2159
2160 // Create request and QuicHttpStream.
2161 QuicStreamRequest request(factory_.get());
2162 EXPECT_EQ(ERR_IO_PENDING,
2163 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562164 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2165 callback_.callback()));
jrid36ada62016-02-06 02:42:082166 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422167 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jrid36ada62016-02-06 02:42:082168 EXPECT_TRUE(stream.get());
2169
2170 // Cause QUIC stream to be created.
2171 HttpRequestInfo request_info;
2172 request_info.method = "GET";
2173 request_info.url = GURL("https://www.example.org/");
2174 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2175 net_log_, CompletionCallback()));
2176
2177 // Ensure that session is alive and active.
2178 QuicChromiumClientSession* session =
2179 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
2180 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2181 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2182
2183 // Send GET request on stream.
2184 HttpResponseInfo response;
2185 HttpRequestHeaders request_headers;
2186 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2187 callback_.callback()));
2188
2189 // Set up second socket data provider that is used after migration.
2190 // The response to the earlier request is read on this new socket.
danakjad1777e2016-04-16 00:56:422191 std::unique_ptr<QuicEncryptedPacket> ping(
jrid36ada62016-02-06 02:42:082192 maker_.MakePingPacket(2, /*include_version=*/true));
2193 MockWrite writes1[] = {
2194 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 0)};
danakjad1777e2016-04-16 00:56:422195 std::unique_ptr<QuicEncryptedPacket> response_headers_packet(
jrid36ada62016-02-06 02:42:082196 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
2197 MockRead reads1[] = {MockRead(ASYNC, response_headers_packet->data(),
2198 response_headers_packet->length(), 1),
2199 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
2200 SequencedSocketData socket_data1(reads1, arraysize(reads1), writes1,
2201 arraysize(writes1));
2202 socket_factory_.AddSocketDataProvider(&socket_data1);
2203
2204 // Trigger early connection migration. This should cause a PING frame
2205 // to be emitted.
2206 session->OnPathDegrading();
2207
2208 // Run the message loop so that data queued in the new socket is read by the
2209 // packet reader.
2210 base::RunLoop().RunUntilIdle();
2211
2212 // The session should now be marked as going away. Ensure that
2213 // while it is still alive, it is no longer active.
2214 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2215 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2216 EXPECT_EQ(1u, session->GetNumActiveStreams());
2217
2218 // Verify that response headers on the migrated socket were delivered to the
2219 // stream.
2220 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
2221 EXPECT_EQ(200, response.headers->response_code());
2222
2223 // Create a new request for the same destination and verify that a
2224 // new session is created.
2225 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2226 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
2227 socket_factory_.AddSocketDataProvider(&socket_data2);
2228
2229 QuicStreamRequest request2(factory_.get());
2230 EXPECT_EQ(ERR_IO_PENDING,
2231 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562232 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2233 callback_.callback()));
jrid36ada62016-02-06 02:42:082234 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422235 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jrid36ada62016-02-06 02:42:082236 EXPECT_TRUE(stream2.get());
2237
2238 EXPECT_TRUE(
2239 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
2240 QuicChromiumClientSession* new_session =
2241 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
2242 EXPECT_NE(session, new_session);
2243
2244 // On a SOON_TO_DISCONNECT notification, nothing happens to the
2245 // migrated session, but the new session is closed since it has no
2246 // open streams.
2247 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2248 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
2249 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2250 EXPECT_EQ(1u, session->GetNumActiveStreams());
2251 EXPECT_FALSE(
2252 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), new_session));
2253
2254 // On a DISCONNECTED notification, nothing happens to the migrated session.
2255 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2256 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2257 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2258 EXPECT_EQ(1u, session->GetNumActiveStreams());
2259
2260 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2261 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2262 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
2263 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
2264 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2265 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2266}
2267
2268TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyNoNewNetwork) {
2269 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
2270 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2271 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2272
2273 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:422274 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jrid36ada62016-02-06 02:42:082275 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
2276 MockWrite writes[] = {
2277 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
2278 };
2279 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2280 arraysize(writes));
2281 socket_factory_.AddSocketDataProvider(&socket_data);
2282
2283 // Create request and QuicHttpStream.
2284 QuicStreamRequest request(factory_.get());
2285 EXPECT_EQ(ERR_IO_PENDING,
2286 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562287 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2288 callback_.callback()));
jrid36ada62016-02-06 02:42:082289 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422290 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jrid36ada62016-02-06 02:42:082291 EXPECT_TRUE(stream.get());
2292
2293 // Cause QUIC stream to be created.
2294 HttpRequestInfo request_info;
2295 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2296 net_log_, CompletionCallback()));
2297
2298 // Ensure that session is alive and active.
2299 QuicChromiumClientSession* session =
2300 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
2301 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2302 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2303
2304 // Trigger connection migration. Since there are no networks
2305 // to migrate to, this should cause session to be continue but be marked as
2306 // going away.
2307 session->OnPathDegrading();
2308
2309 // Run the message loop so that data queued in the new socket is read by the
2310 // packet reader.
2311 base::RunLoop().RunUntilIdle();
2312
2313 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2314 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2315 EXPECT_EQ(1u, session->GetNumActiveStreams());
2316
2317 stream.reset();
2318
2319 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2320 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2321}
2322
jri231c2972016-03-08 19:50:112323TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyNonMigratableStream) {
2324 InitializeConnectionMigrationTest(
2325 {kDefaultNetworkForTests, kNewNetworkForTests});
2326 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2327 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2328
2329 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:422330 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri231c2972016-03-08 19:50:112331 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
2332 MockWrite writes[] = {
2333 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
2334 };
2335 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2336 arraysize(writes));
2337 socket_factory_.AddSocketDataProvider(&socket_data);
2338
2339 // Create request and QuicHttpStream.
2340 QuicStreamRequest request(factory_.get());
2341 EXPECT_EQ(ERR_IO_PENDING,
2342 request.Request(host_port_pair_, privacy_mode_,
2343 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2344 callback_.callback()));
2345 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422346 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri231c2972016-03-08 19:50:112347 EXPECT_TRUE(stream.get());
2348
2349 // Cause QUIC stream to be created, but marked as non-migratable.
2350 HttpRequestInfo request_info;
2351 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION;
2352 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2353 net_log_, CompletionCallback()));
2354
2355 // Ensure that session is alive and active.
2356 QuicChromiumClientSession* session =
2357 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
2358 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2359 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2360
2361 // Trigger connection migration. Since there is a non-migratable stream,
2362 // this should cause session to be continue without migrating.
2363 session->OnPathDegrading();
2364
2365 // Run the message loop so that data queued in the new socket is read by the
2366 // packet reader.
2367 base::RunLoop().RunUntilIdle();
2368
2369 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2370 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2371 EXPECT_EQ(1u, session->GetNumActiveStreams());
2372
2373 stream.reset();
2374
2375 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2376 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2377}
2378
jri9c541572016-03-29 17:51:482379TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyConnectionMigrationDisabled) {
2380 InitializeConnectionMigrationTest(
2381 {kDefaultNetworkForTests, kNewNetworkForTests});
2382 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2383 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2384
2385 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:422386 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri9c541572016-03-29 17:51:482387 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
2388 MockWrite writes[] = {
2389 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
2390 };
2391 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2392 arraysize(writes));
2393 socket_factory_.AddSocketDataProvider(&socket_data);
2394
2395 // Create request and QuicHttpStream.
2396 QuicStreamRequest request(factory_.get());
2397 EXPECT_EQ(ERR_IO_PENDING,
2398 request.Request(host_port_pair_, privacy_mode_,
2399 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2400 callback_.callback()));
2401 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422402 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri9c541572016-03-29 17:51:482403 EXPECT_TRUE(stream.get());
2404
2405 // Cause QUIC stream to be created.
2406 HttpRequestInfo request_info;
2407 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2408 net_log_, CompletionCallback()));
2409
2410 // Ensure that session is alive and active.
2411 QuicChromiumClientSession* session =
2412 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
2413 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2414 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2415
2416 // Set session config to have connection migration disabled.
2417 QuicConfigPeer::SetReceivedDisableConnectionMigration(session->config());
2418 EXPECT_TRUE(session->config()->DisableConnectionMigration());
2419
2420 // Trigger connection migration. Since there is a non-migratable stream,
2421 // this should cause session to be continue without migrating.
2422 session->OnPathDegrading();
2423
2424 // Run the message loop so that data queued in the new socket is read by the
2425 // packet reader.
2426 base::RunLoop().RunUntilIdle();
2427
2428 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2429 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2430 EXPECT_EQ(1u, session->GetNumActiveStreams());
2431
2432 stream.reset();
2433
2434 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2435 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2436}
2437
rch02d87792015-09-09 09:05:532438TEST_P(QuicStreamFactoryTest, OnSSLConfigChanged) {
jri7046038f2015-10-22 00:29:262439 Initialize();
rch6faa4d42016-01-05 20:48:432440 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2441 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2442 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2443
mmenke651bae7f2015-12-18 21:26:452444 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:422445 std::unique_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
rch02d87792015-09-09 09:05:532446 std::vector<MockWrite> writes;
2447 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:452448 SequencedSocketData socket_data(reads, arraysize(reads),
2449 writes.empty() ? nullptr : &writes[0],
2450 writes.size());
rch02d87792015-09-09 09:05:532451 socket_factory_.AddSocketDataProvider(&socket_data);
rch02d87792015-09-09 09:05:532452
mmenke651bae7f2015-12-18 21:26:452453 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2454 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
rch02d87792015-09-09 09:05:532455 socket_factory_.AddSocketDataProvider(&socket_data2);
rch02d87792015-09-09 09:05:532456
jri7046038f2015-10-22 00:29:262457 QuicStreamRequest request(factory_.get());
rch02d87792015-09-09 09:05:532458 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562459 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562460 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2461 callback_.callback()));
rch02d87792015-09-09 09:05:532462
2463 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422464 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rch02d87792015-09-09 09:05:532465 HttpRequestInfo request_info;
2466 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2467 net_log_, CompletionCallback()));
2468
jri7046038f2015-10-22 00:29:262469 factory_->OnSSLConfigChanged();
rch02d87792015-09-09 09:05:532470 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
2471 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262472 EXPECT_FALSE(factory_->require_confirmation());
rch02d87792015-09-09 09:05:532473
2474 // Now attempting to request a stream to the same origin should create
2475 // a new session.
2476
jri7046038f2015-10-22 00:29:262477 QuicStreamRequest request2(factory_.get());
rch02d87792015-09-09 09:05:532478 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562479 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562480 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2481 callback_.callback()));
rch02d87792015-09-09 09:05:532482
2483 EXPECT_EQ(OK, callback_.WaitForResult());
xunjieli2608f9b2016-03-14 13:39:232484 stream = request2.CreateStream();
rch02d87792015-09-09 09:05:532485 stream.reset(); // Will reset stream 3.
2486
2487 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2488 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2489 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2490 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2491}
2492
[email protected]1e960032013-12-20 19:00:202493TEST_P(QuicStreamFactoryTest, OnCertAdded) {
jri7046038f2015-10-22 00:29:262494 Initialize();
rch6faa4d42016-01-05 20:48:432495 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2496 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2497 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2498
mmenke651bae7f2015-12-18 21:26:452499 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:422500 std::unique_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
[email protected]459a7402014-02-10 12:58:522501 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:312502 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:452503 SequencedSocketData socket_data(reads, arraysize(reads),
2504 writes.empty() ? nullptr : &writes[0],
2505 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:092506 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]d7d1e50b2013-11-25 22:08:092507
mmenke651bae7f2015-12-18 21:26:452508 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2509 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:092510 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]d7d1e50b2013-11-25 22:08:092511
jri7046038f2015-10-22 00:29:262512 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:592513 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562514 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562515 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2516 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092517
2518 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422519 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]d7d1e50b2013-11-25 22:08:092520 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:022521 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]d7d1e50b2013-11-25 22:08:092522 net_log_, CompletionCallback()));
2523
2524 // Add a cert and verify that stream saw the event.
jri7046038f2015-10-22 00:29:262525 factory_->OnCertAdded(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:092526 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
2527 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262528 EXPECT_FALSE(factory_->require_confirmation());
[email protected]d7d1e50b2013-11-25 22:08:092529
2530 // Now attempting to request a stream to the same origin should create
2531 // a new session.
2532
jri7046038f2015-10-22 00:29:262533 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:592534 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562535 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562536 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2537 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092538
2539 EXPECT_EQ(OK, callback_.WaitForResult());
xunjieli2608f9b2016-03-14 13:39:232540 stream = request2.CreateStream();
[email protected]d7d1e50b2013-11-25 22:08:092541 stream.reset(); // Will reset stream 3.
2542
rch37de576c2015-05-17 20:28:172543 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2544 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2545 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2546 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:092547}
2548
[email protected]1e960032013-12-20 19:00:202549TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
jri7046038f2015-10-22 00:29:262550 Initialize();
rch6faa4d42016-01-05 20:48:432551 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2552 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2553 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2554
mmenke651bae7f2015-12-18 21:26:452555 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:422556 std::unique_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
[email protected]459a7402014-02-10 12:58:522557 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:312558 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:452559 SequencedSocketData socket_data(reads, arraysize(reads),
2560 writes.empty() ? nullptr : &writes[0],
2561 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:092562 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]d7d1e50b2013-11-25 22:08:092563
mmenke651bae7f2015-12-18 21:26:452564 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2565 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:092566 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]d7d1e50b2013-11-25 22:08:092567
jri7046038f2015-10-22 00:29:262568 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:592569 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562570 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562571 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2572 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092573
2574 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422575 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]d7d1e50b2013-11-25 22:08:092576 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:022577 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]d7d1e50b2013-11-25 22:08:092578 net_log_, CompletionCallback()));
2579
2580 // Change the CA cert and verify that stream saw the event.
jri7046038f2015-10-22 00:29:262581 factory_->OnCACertChanged(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:092582 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
2583 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262584 EXPECT_FALSE(factory_->require_confirmation());
[email protected]d7d1e50b2013-11-25 22:08:092585
2586 // Now attempting to request a stream to the same origin should create
2587 // a new session.
2588
jri7046038f2015-10-22 00:29:262589 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:592590 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562591 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562592 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2593 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092594
2595 EXPECT_EQ(OK, callback_.WaitForResult());
xunjieli2608f9b2016-03-14 13:39:232596 stream = request2.CreateStream();
[email protected]d7d1e50b2013-11-25 22:08:092597 stream.reset(); // Will reset stream 3.
2598
rch37de576c2015-05-17 20:28:172599 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2600 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2601 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2602 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:092603}
2604
[email protected]1e960032013-12-20 19:00:202605TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
jri7046038f2015-10-22 00:29:262606 Initialize();
rch6faa4d42016-01-05 20:48:432607
[email protected]6e12d702013-11-13 00:17:172608 vector<string> cannoncial_suffixes;
2609 cannoncial_suffixes.push_back(string(".c.youtube.com"));
2610 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]c49ff182013-09-28 08:33:262611
[email protected]6e12d702013-11-13 00:17:172612 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
2613 string r1_host_name("r1");
2614 string r2_host_name("r2");
2615 r1_host_name.append(cannoncial_suffixes[i]);
2616 r2_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:142617
[email protected]bf4ea2f2014-03-10 22:57:532618 HostPortPair host_port_pair1(r1_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:122619 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:262620 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rch1fe2eeb2015-10-26 14:45:572621 QuicServerId server_id1(host_port_pair1, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172622 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:372623 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:172624 EXPECT_FALSE(cached1->proof_valid());
2625 EXPECT_TRUE(cached1->source_address_token().empty());
2626
2627 // Mutate the cached1 to have different data.
2628 // TODO(rtenneti): mutate other members of CachedState.
2629 cached1->set_source_address_token(r1_host_name);
2630 cached1->SetProofValid();
2631
[email protected]bf4ea2f2014-03-10 22:57:532632 HostPortPair host_port_pair2(r2_host_name, 80);
rch1fe2eeb2015-10-26 14:45:572633 QuicServerId server_id2(host_port_pair2, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172634 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:372635 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:172636 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
2637 EXPECT_TRUE(cached2->proof_valid());
2638 }
[email protected]b70fdb792013-10-25 19:04:142639}
2640
[email protected]1e960032013-12-20 19:00:202641TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
jri7046038f2015-10-22 00:29:262642 Initialize();
[email protected]6e12d702013-11-13 00:17:172643 vector<string> cannoncial_suffixes;
2644 cannoncial_suffixes.push_back(string(".c.youtube.com"));
2645 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]b70fdb792013-10-25 19:04:142646
[email protected]6e12d702013-11-13 00:17:172647 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
2648 string r3_host_name("r3");
2649 string r4_host_name("r4");
2650 r3_host_name.append(cannoncial_suffixes[i]);
2651 r4_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:142652
[email protected]bf4ea2f2014-03-10 22:57:532653 HostPortPair host_port_pair1(r3_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:122654 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:262655 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rch1fe2eeb2015-10-26 14:45:572656 QuicServerId server_id1(host_port_pair1, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172657 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:372658 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:172659 EXPECT_FALSE(cached1->proof_valid());
2660 EXPECT_TRUE(cached1->source_address_token().empty());
2661
2662 // Mutate the cached1 to have different data.
2663 // TODO(rtenneti): mutate other members of CachedState.
2664 cached1->set_source_address_token(r3_host_name);
2665 cached1->SetProofInvalid();
2666
[email protected]bf4ea2f2014-03-10 22:57:532667 HostPortPair host_port_pair2(r4_host_name, 80);
rch1fe2eeb2015-10-26 14:45:572668 QuicServerId server_id2(host_port_pair2, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172669 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:372670 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:172671 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
2672 EXPECT_TRUE(cached2->source_address_token().empty());
2673 EXPECT_FALSE(cached2->proof_valid());
2674 }
[email protected]c49ff182013-09-28 08:33:262675}
2676
rtenneti14abd312015-02-06 21:56:012677TEST_P(QuicStreamFactoryTest, RacingConnections) {
jri7046038f2015-10-22 00:29:262678 disable_disk_cache_ = false;
2679 Initialize();
rch6faa4d42016-01-05 20:48:432680 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2681 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:262682
rtenneti14abd312015-02-06 21:56:012683 if (!GetParam().enable_connection_racing)
2684 return;
jri7046038f2015-10-22 00:29:262685
2686 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneticcab42b2015-10-09 06:38:162687
mmenke651bae7f2015-12-18 21:26:452688 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2689 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti14abd312015-02-06 21:56:012690 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti14abd312015-02-06 21:56:012691
mmenke651bae7f2015-12-18 21:26:452692 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2693 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
rtenneti14abd312015-02-06 21:56:012694 socket_factory_.AddSocketDataProvider(&socket_data2);
rtenneti14abd312015-02-06 21:56:012695
rtenneticcab42b2015-10-09 06:38:162696 const AlternativeService alternative_service1(QUIC, host_port_pair_.host(),
2697 host_port_pair_.port());
2698 AlternativeServiceInfoVector alternative_service_info_vector;
2699 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
2700 alternative_service_info_vector.push_back(
rchdc7b9052016-03-17 20:51:502701 AlternativeServiceInfo(alternative_service1, expiration));
rtenneticcab42b2015-10-09 06:38:162702
2703 http_server_properties_.SetAlternativeServices(
2704 host_port_pair_, alternative_service_info_vector);
2705
rtenneti14abd312015-02-06 21:56:012706 crypto_client_stream_factory_.set_handshake_mode(
2707 MockCryptoClientStream::ZERO_RTT);
2708 host_resolver_.set_synchronous_mode(true);
2709 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2710 "192.168.0.1", "");
2711
jri7046038f2015-10-22 00:29:262712 QuicStreamRequest request(factory_.get());
rch1fe2eeb2015-10-26 14:45:572713 QuicServerId server_id(host_port_pair_, privacy_mode_);
rtenneti14abd312015-02-06 21:56:012714 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562715 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562716 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2717 callback_.callback()));
jri7046038f2015-10-22 00:29:262718 EXPECT_EQ(2u, QuicStreamFactoryPeer::GetNumberOfActiveJobs(factory_.get(),
2719 server_id));
rtenneti14abd312015-02-06 21:56:012720
2721 runner_->RunNextTask();
2722
danakjad1777e2016-04-16 00:56:422723 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rtenneti14abd312015-02-06 21:56:012724 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:172725 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2726 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
jri7046038f2015-10-22 00:29:262727 EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumberOfActiveJobs(factory_.get(),
2728 server_id));
rtenneti14abd312015-02-06 21:56:012729}
2730
rtenneti34dffe752015-02-24 23:27:322731TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) {
jri7046038f2015-10-22 00:29:262732 disable_disk_cache_ = true;
2733 Initialize();
rch6faa4d42016-01-05 20:48:432734 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2735 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2736
jri7046038f2015-10-22 00:29:262737 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti34dffe752015-02-24 23:27:322738
mmenke651bae7f2015-12-18 21:26:452739 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2740 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti34dffe752015-02-24 23:27:322741 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti34dffe752015-02-24 23:27:322742
2743 crypto_client_stream_factory_.set_handshake_mode(
2744 MockCryptoClientStream::ZERO_RTT);
2745 host_resolver_.set_synchronous_mode(true);
2746 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2747 "192.168.0.1", "");
2748
jri7046038f2015-10-22 00:29:262749 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562750 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562751 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2752 callback_.callback()));
rtenneti34dffe752015-02-24 23:27:322753
2754 // If we are waiting for disk cache, we would have posted a task. Verify that
2755 // the CancelWaitForDataReady task hasn't been posted.
2756 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
2757
danakjad1777e2016-04-16 00:56:422758 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rtenneti34dffe752015-02-24 23:27:322759 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:172760 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2761 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti34dffe752015-02-24 23:27:322762}
2763
rtenneti85dcfac22015-03-27 20:22:192764TEST_P(QuicStreamFactoryTest, BadPacketLoss) {
jri7046038f2015-10-22 00:29:262765 disable_disk_cache_ = false;
2766 max_number_of_lossy_connections_ = 2;
2767 Initialize();
rch6faa4d42016-01-05 20:48:432768 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2769 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2770 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2771 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2772 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2773
jri7046038f2015-10-22 00:29:262774 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2775
2776 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2777 host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192778 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262779 factory_.get(), host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192780
mmenke651bae7f2015-12-18 21:26:452781 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2782 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:192783 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti85dcfac22015-03-27 20:22:192784
mmenke651bae7f2015-12-18 21:26:452785 SequencedSocketData socket_data2(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:192786 socket_factory_.AddSocketDataProvider(&socket_data2);
rtenneti85dcfac22015-03-27 20:22:192787
mmenke651bae7f2015-12-18 21:26:452788 SequencedSocketData socket_data3(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:192789 socket_factory_.AddSocketDataProvider(&socket_data3);
rtenneti85dcfac22015-03-27 20:22:192790
mmenke651bae7f2015-12-18 21:26:452791 SequencedSocketData socket_data4(nullptr, 0, nullptr, 0);
rtenneti97137a92015-06-18 06:00:312792 socket_factory_.AddSocketDataProvider(&socket_data4);
rtenneti97137a92015-06-18 06:00:312793
rch6faa4d42016-01-05 20:48:432794 HostPortPair server2(kServer2HostName, kDefaultServerPort);
2795 HostPortPair server3(kServer3HostName, kDefaultServerPort);
2796 HostPortPair server4(kServer4HostName, kDefaultServerPort);
rtenneti85dcfac22015-03-27 20:22:192797
2798 crypto_client_stream_factory_.set_handshake_mode(
2799 MockCryptoClientStream::ZERO_RTT);
2800 host_resolver_.set_synchronous_mode(true);
2801 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2802 "192.168.0.1", "");
2803 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2804 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
rtenneti97137a92015-06-18 06:00:312805 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
rtenneti85dcfac22015-03-27 20:22:192806
jri7046038f2015-10-22 00:29:262807 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562808 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562809 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2810 callback_.callback()));
rtenneti85dcfac22015-03-27 20:22:192811
rchf114d982015-10-21 01:34:562812 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262813 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
rtenneti85dcfac22015-03-27 20:22:192814
2815 DVLOG(1) << "Create 1st session and test packet loss";
2816
2817 // Set packet_loss_rate to a lower value than packet_loss_threshold.
2818 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262819 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/0.9f));
rtenneti41633b1f2015-04-05 18:19:532820 EXPECT_TRUE(session->connection()->connected());
rchf114d982015-10-21 01:34:562821 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:262822 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
2823 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2824 host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192825 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262826 factory_.get(), host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192827
2828 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:312829 // and that shouldn't close the session and it shouldn't disable QUIC.
2830 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262831 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:192832 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262833 factory_.get(), host_port_pair_.port()));
rtenneti97137a92015-06-18 06:00:312834 EXPECT_TRUE(session->connection()->connected());
jri7046038f2015-10-22 00:29:262835 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2836 host_port_pair_.port()));
rchf114d982015-10-21 01:34:562837 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:262838 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
rtenneti85dcfac22015-03-27 20:22:192839
2840 // Test N-in-a-row high packet loss connections.
2841
2842 DVLOG(1) << "Create 2nd session and test packet loss";
2843
2844 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262845 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562846 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562847 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2848 callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162849 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262850 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
rtenneti85dcfac22015-03-27 20:22:192851
2852 // If there is no packet loss during handshake confirmation, number of lossy
2853 // connections for the port should be 0.
2854 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262855 factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:192856 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262857 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/0.9f));
rtenneti85dcfac22015-03-27 20:22:192858 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262859 factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:192860 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262861 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:192862
2863 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:312864 // and that shouldn't close the session and it shouldn't disable QUIC.
2865 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262866 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:192867 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262868 factory_.get(), server2.port()));
rtenneti97137a92015-06-18 06:00:312869 EXPECT_TRUE(session2->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:192870 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262871 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
2872 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server2));
rtenneti85dcfac22015-03-27 20:22:192873
2874 DVLOG(1) << "Create 3rd session which also has packet loss";
2875
2876 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:262877 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:562878 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562879 /*cert_verify_flags=*/0, url3_, "GET",
rtennetia75df622015-06-21 23:59:502880 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:162881 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:262882 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
rtenneti85dcfac22015-03-27 20:22:192883
rtenneti97137a92015-06-18 06:00:312884 DVLOG(1) << "Create 4th session with packet loss and test IsQuicDisabled()";
2885 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:262886 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:562887 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562888 /*cert_verify_flags=*/0, url4_, "GET",
rtennetia75df622015-06-21 23:59:502889 net_log_, callback4.callback()));
ckrasic4f9d88d2015-07-22 22:23:162890 QuicChromiumClientSession* session4 =
jri7046038f2015-10-22 00:29:262891 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server4);
rtenneti97137a92015-06-18 06:00:312892
rtenneti85dcfac22015-03-27 20:22:192893 // Set packet_loss_rate to higher value than packet_loss_threshold 2nd time in
2894 // a row and that should close the session and disable QUIC.
2895 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:262896 factory_->OnHandshakeConfirmed(session3, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:192897 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262898 factory_.get(), server3.port()));
rtenneti97137a92015-06-18 06:00:312899 EXPECT_FALSE(session3->connection()->connected());
jri7046038f2015-10-22 00:29:262900 EXPECT_TRUE(
2901 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server3.port()));
2902 EXPECT_FALSE(
2903 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server3));
bnccb7ff3c2015-05-21 20:51:552904 EXPECT_FALSE(HasActiveSession(server3));
rtenneti85dcfac22015-03-27 20:22:192905
rtenneti97137a92015-06-18 06:00:312906 // Set packet_loss_rate to higher value than packet_loss_threshold 3rd time in
2907 // a row and IsQuicDisabled() should close the session.
2908 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:262909 factory_->OnHandshakeConfirmed(session4, /*packet_loss_rate=*/1.0f));
rtenneti97137a92015-06-18 06:00:312910 EXPECT_EQ(3, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262911 factory_.get(), server4.port()));
rtenneti97137a92015-06-18 06:00:312912 EXPECT_FALSE(session4->connection()->connected());
jri7046038f2015-10-22 00:29:262913 EXPECT_TRUE(
2914 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server4.port()));
2915 EXPECT_FALSE(
2916 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server4));
rtenneti97137a92015-06-18 06:00:312917 EXPECT_FALSE(HasActiveSession(server4));
2918
danakjad1777e2016-04-16 00:56:422919 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rtenneti85dcfac22015-03-27 20:22:192920 EXPECT_TRUE(stream.get());
danakjad1777e2016-04-16 00:56:422921 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
rtenneti85dcfac22015-03-27 20:22:192922 EXPECT_TRUE(stream2.get());
danakjad1777e2016-04-16 00:56:422923 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
rtenneti85dcfac22015-03-27 20:22:192924 EXPECT_TRUE(stream3.get());
danakjad1777e2016-04-16 00:56:422925 std::unique_ptr<QuicHttpStream> stream4 = request4.CreateStream();
rtenneti97137a92015-06-18 06:00:312926 EXPECT_TRUE(stream4.get());
rch37de576c2015-05-17 20:28:172927 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2928 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2929 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2930 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2931 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2932 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
rtenneti97137a92015-06-18 06:00:312933 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
2934 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
rtenneti85dcfac22015-03-27 20:22:192935}
2936
ckrasic1e53b642015-07-08 22:39:352937TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfTwo) {
jri7046038f2015-10-22 00:29:262938 disable_disk_cache_ = false;
2939 threshold_public_resets_post_handshake_ = 2;
2940 Initialize();
rch6faa4d42016-01-05 20:48:432941 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2942 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2943 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:262944 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2945
2946 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2947 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352948 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262949 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352950
mmenke651bae7f2015-12-18 21:26:452951 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2952 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352953 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:352954
mmenke651bae7f2015-12-18 21:26:452955 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352956 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:352957
rch6faa4d42016-01-05 20:48:432958 HostPortPair server2(kServer2HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:352959
2960 crypto_client_stream_factory_.set_handshake_mode(
2961 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2962 host_resolver_.set_synchronous_mode(true);
2963 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2964 "192.168.0.1", "");
2965 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2966
jri7046038f2015-10-22 00:29:262967 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562968 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562969 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2970 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:352971
rchf114d982015-10-21 01:34:562972 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262973 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352974
2975 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
jri78ec06a2016-03-31 18:19:402976 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
2977 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:352978 // Need to spin the loop now to ensure that
2979 // QuicStreamFactory::OnSessionClosed() runs.
2980 base::RunLoop run_loop;
2981 run_loop.RunUntilIdle();
2982
jri7046038f2015-10-22 00:29:262983 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2984 factory_.get()));
2985 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2986 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352987
2988 // Test two-in-a-row public reset post handshakes..
2989 DVLOG(1) << "Create 2nd session and trigger public reset post handshake";
2990 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262991 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562992 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562993 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:352994 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162995 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262996 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352997
jri78ec06a2016-03-31 18:19:402998 session2->connection()->CloseConnection(
2999 QUIC_PUBLIC_RESET, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353000 // Need to spin the loop now to ensure that
3001 // QuicStreamFactory::OnSessionClosed() runs.
3002 base::RunLoop run_loop2;
3003 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263004 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3005 factory_.get()));
3006 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3007 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:163008 EXPECT_EQ(
3009 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
jri7046038f2015-10-22 00:29:263010 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353011
danakjad1777e2016-04-16 00:56:423012 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233013 EXPECT_FALSE(stream.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423014 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233015 EXPECT_FALSE(stream2.get()); // Session is already closed.
ckrasic1e53b642015-07-08 22:39:353016 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3017 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3018 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3019 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3020}
3021
3022TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfTwo) {
jri7046038f2015-10-22 00:29:263023 disable_disk_cache_ = true;
3024 threshold_timeouts_with_open_streams_ = 2;
3025 Initialize();
rch6faa4d42016-01-05 20:48:433026 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3027 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3028 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263029
3030 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3031 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3032 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353033 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263034 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353035
mmenke651bae7f2015-12-18 21:26:453036 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3037 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353038 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353039
mmenke651bae7f2015-12-18 21:26:453040 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353041 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353042
rch6faa4d42016-01-05 20:48:433043 HostPortPair server2(kServer2HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353044
3045 crypto_client_stream_factory_.set_handshake_mode(
3046 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3047 host_resolver_.set_synchronous_mode(true);
3048 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3049 "192.168.0.1", "");
3050 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3051
jri7046038f2015-10-22 00:29:263052 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563053 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563054 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3055 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353056
rchf114d982015-10-21 01:34:563057 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:263058 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353059
danakjad1777e2016-04-16 00:56:423060 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
ckrasic1e53b642015-07-08 22:39:353061 EXPECT_TRUE(stream.get());
3062 HttpRequestInfo request_info;
3063 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3064 net_log_, CompletionCallback()));
3065
3066 DVLOG(1)
3067 << "Created 1st session and initialized a stream. Now trigger timeout";
jri78ec06a2016-03-31 18:19:403068 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
3069 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353070 // Need to spin the loop now to ensure that
3071 // QuicStreamFactory::OnSessionClosed() runs.
3072 base::RunLoop run_loop;
3073 run_loop.RunUntilIdle();
3074
jri7046038f2015-10-22 00:29:263075 EXPECT_EQ(
3076 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3077 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3078 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353079
3080 // Test two-in-a-row timeouts with open streams.
3081 DVLOG(1) << "Create 2nd session and timeout with open stream";
3082 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263083 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563084 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563085 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353086 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:163087 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:263088 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:353089
danakjad1777e2016-04-16 00:56:423090 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
ckrasic1e53b642015-07-08 22:39:353091 EXPECT_TRUE(stream2.get());
3092 EXPECT_EQ(OK, stream2->InitializeStream(&request_info, DEFAULT_PRIORITY,
3093 net_log_, CompletionCallback()));
3094
jri78ec06a2016-03-31 18:19:403095 session2->connection()->CloseConnection(
3096 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353097 // Need to spin the loop now to ensure that
3098 // QuicStreamFactory::OnSessionClosed() runs.
3099 base::RunLoop run_loop2;
3100 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263101 EXPECT_EQ(
3102 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3103 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3104 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:163105 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
jri7046038f2015-10-22 00:29:263106 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353107
rchcee7beb2016-03-11 06:16:143108 // Verify that QUIC is un-disabled after a TCP job fails.
3109 factory_->OnTcpJobCompleted(/*succeeded=*/false);
3110 EXPECT_EQ(
3111 0, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3112 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3113 host_port_pair_.port()));
3114
ckrasic1e53b642015-07-08 22:39:353115 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3116 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3117 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3118 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3119}
3120
3121TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfThree) {
jri7046038f2015-10-22 00:29:263122 disable_disk_cache_ = true;
3123 threshold_public_resets_post_handshake_ = 2;
3124 Initialize();
rch6faa4d42016-01-05 20:48:433125 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3126 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3127 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3128 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263129
3130 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3131 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353132 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263133 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353134
mmenke651bae7f2015-12-18 21:26:453135 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3136 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353137 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353138
mmenke651bae7f2015-12-18 21:26:453139 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353140 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353141
mmenke651bae7f2015-12-18 21:26:453142 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353143 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:353144
rch6faa4d42016-01-05 20:48:433145 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3146 HostPortPair server3(kServer3HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353147
3148 crypto_client_stream_factory_.set_handshake_mode(
3149 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3150 host_resolver_.set_synchronous_mode(true);
3151 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3152 "192.168.0.1", "");
3153 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3154 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3155
3156 // Test first and third out of three public reset post handshakes.
jri7046038f2015-10-22 00:29:263157 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563158 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563159 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3160 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353161
rchf114d982015-10-21 01:34:563162 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:263163 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353164
3165 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
jri78ec06a2016-03-31 18:19:403166 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
3167 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353168 // Need to spin the loop now to ensure that
3169 // QuicStreamFactory::OnSessionClosed() runs.
3170 base::RunLoop run_loop;
3171 run_loop.RunUntilIdle();
3172
jri7046038f2015-10-22 00:29:263173 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3174 factory_.get()));
3175 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3176 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353177
3178 DVLOG(1) << "Create 2nd session without disable trigger";
3179 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263180 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563181 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563182 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353183 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:163184 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:263185 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:353186
jri78ec06a2016-03-31 18:19:403187 session2->connection()->CloseConnection(
3188 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353189 // Need to spin the loop now to ensure that
3190 // QuicStreamFactory::OnSessionClosed() runs.
3191 base::RunLoop run_loop2;
3192 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263193 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3194 factory_.get()));
3195 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3196 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353197
3198 DVLOG(1) << "Create 3rd session with public reset post handshake,"
3199 << " will disable QUIC";
3200 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263201 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563202 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563203 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353204 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:163205 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:263206 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:353207
jri78ec06a2016-03-31 18:19:403208 session3->connection()->CloseConnection(
3209 QUIC_PUBLIC_RESET, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353210 // Need to spin the loop now to ensure that
3211 // QuicStreamFactory::OnSessionClosed() runs.
3212 base::RunLoop run_loop3;
3213 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:263214 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3215 factory_.get()));
3216 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3217 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:163218 EXPECT_EQ(
3219 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
jri7046038f2015-10-22 00:29:263220 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353221
danakjad1777e2016-04-16 00:56:423222 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233223 EXPECT_FALSE(stream.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423224 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233225 EXPECT_FALSE(stream2.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423226 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233227 EXPECT_FALSE(stream3.get()); // Session is already closed.
ckrasic1e53b642015-07-08 22:39:353228
3229 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3230 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3231 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3232 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3233 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3234 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3235}
3236
3237TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfThree) {
jri7046038f2015-10-22 00:29:263238 disable_disk_cache_ = true;
3239 threshold_public_resets_post_handshake_ = 2;
3240 Initialize();
rch6faa4d42016-01-05 20:48:433241 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3242 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3243 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3244 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263245 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3246
3247 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3248 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353249 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263250 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353251
mmenke651bae7f2015-12-18 21:26:453252 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3253 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353254 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353255
mmenke651bae7f2015-12-18 21:26:453256 // SequencedSocketData socket_data2(nullptr, 0, nullptr, 0);
3257 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353258 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353259
mmenke651bae7f2015-12-18 21:26:453260 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353261 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:353262
rch6faa4d42016-01-05 20:48:433263 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3264 HostPortPair server3(kServer3HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353265
3266 crypto_client_stream_factory_.set_handshake_mode(
3267 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3268 host_resolver_.set_synchronous_mode(true);
3269 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3270 "192.168.0.1", "");
3271 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3272 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3273
3274 // Test first and third out of three timeouts with open streams.
jri7046038f2015-10-22 00:29:263275 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563276 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563277 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3278 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353279
rchf114d982015-10-21 01:34:563280 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:263281 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353282
danakjad1777e2016-04-16 00:56:423283 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
ckrasic1e53b642015-07-08 22:39:353284 EXPECT_TRUE(stream.get());
3285 HttpRequestInfo request_info;
3286 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3287 net_log_, CompletionCallback()));
3288
3289 DVLOG(1)
3290 << "Created 1st session and initialized a stream. Now trigger timeout";
jri78ec06a2016-03-31 18:19:403291 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
3292 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353293 // Need to spin the loop now to ensure that
3294 // QuicStreamFactory::OnSessionClosed() runs.
3295 base::RunLoop run_loop;
3296 run_loop.RunUntilIdle();
3297
jri7046038f2015-10-22 00:29:263298 EXPECT_EQ(
3299 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3300 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3301 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353302
3303 // Test two-in-a-row timeouts with open streams.
3304 DVLOG(1) << "Create 2nd session without timeout";
3305 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263306 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563307 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563308 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353309 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:163310 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:263311 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:353312
jri78ec06a2016-03-31 18:19:403313 session2->connection()->CloseConnection(
3314 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353315 // Need to spin the loop now to ensure that
3316 // QuicStreamFactory::OnSessionClosed() runs.
3317 base::RunLoop run_loop2;
3318 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263319 EXPECT_EQ(
3320 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3321 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3322 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353323
3324 DVLOG(1) << "Create 3rd session with timeout with open streams,"
3325 << " will disable QUIC";
3326
3327 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263328 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563329 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563330 /*cert_verify_flags=*/0, url3_, "GET",
ckrasic1e53b642015-07-08 22:39:353331 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:163332 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:263333 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:353334
danakjad1777e2016-04-16 00:56:423335 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
ckrasic1e53b642015-07-08 22:39:353336 EXPECT_TRUE(stream3.get());
3337 EXPECT_EQ(OK, stream3->InitializeStream(&request_info, DEFAULT_PRIORITY,
3338 net_log_, CompletionCallback()));
jri78ec06a2016-03-31 18:19:403339 session3->connection()->CloseConnection(
3340 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353341 // Need to spin the loop now to ensure that
3342 // QuicStreamFactory::OnSessionClosed() runs.
3343 base::RunLoop run_loop3;
3344 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:263345 EXPECT_EQ(
3346 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3347 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3348 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:163349 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
jri7046038f2015-10-22 00:29:263350 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353351
danakjad1777e2016-04-16 00:56:423352 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233353 EXPECT_FALSE(stream2.get()); // Session is already closed.
rchcee7beb2016-03-11 06:16:143354
3355 // Verify that QUIC is un-disabled after a network change.
3356 factory_->OnIPAddressChanged();
3357 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3358 host_port_pair_.port()));
3359 EXPECT_EQ(
3360 0, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3361
ckrasic1e53b642015-07-08 22:39:353362 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3363 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3364 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3365 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3366 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3367 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3368}
3369
zhongyi89649c32016-01-22 00:14:013370TEST_P(QuicStreamFactoryTest, DisableQuicWhenTimeoutsWithOpenStreams) {
3371 disable_disk_cache_ = true;
3372 disable_quic_on_timeout_with_open_streams_ = true;
3373 Initialize();
3374 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3375 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3376 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3377
3378 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3379 host_port_pair_.port()));
3380 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
3381 factory_.get(), host_port_pair_.port()));
3382
3383 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3384 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
3385 socket_factory_.AddSocketDataProvider(&socket_data);
3386
3387 crypto_client_stream_factory_.set_handshake_mode(
3388 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3389 host_resolver_.set_synchronous_mode(true);
3390 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3391 "192.168.0.1", "");
3392
3393 // Test first timeouts with open streams will disable QUIC.
3394 QuicStreamRequest request(factory_.get());
3395 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()));
zhongyi89649c32016-01-22 00:14:013398
3399 QuicChromiumClientSession* session =
3400 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
3401
danakjad1777e2016-04-16 00:56:423402 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
zhongyi89649c32016-01-22 00:14:013403 EXPECT_TRUE(stream.get());
3404 HttpRequestInfo request_info;
3405 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3406 net_log_, CompletionCallback()));
3407
3408 DVLOG(1)
3409 << "Created 1st session and initialized a stream. Now trigger timeout."
3410 << "Will disable QUIC.";
jri78ec06a2016-03-31 18:19:403411 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
3412 ConnectionCloseBehavior::SILENT_CLOSE);
zhongyi89649c32016-01-22 00:14:013413 // Need to spin the loop now to ensure that
3414 // QuicStreamFactory::OnSessionClosed() runs.
3415 base::RunLoop run_loop;
3416 run_loop.RunUntilIdle();
3417
3418 EXPECT_EQ(
3419 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3420 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3421 host_port_pair_.port()));
3422
3423 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
3424 factory_->QuicDisabledReason(host_port_pair_.port()));
3425
rchcee7beb2016-03-11 06:16:143426 // Verify that QUIC is fully disabled after a TCP job succeeds.
3427 factory_->OnTcpJobCompleted(/*succeeded=*/true);
3428 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3429 host_port_pair_.port()));
3430
3431 // Verify that QUIC stays disabled after a TCP job succeeds.
3432 factory_->OnTcpJobCompleted(/*succeeded=*/false);
3433 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3434 host_port_pair_.port()));
3435
zhongyi89649c32016-01-22 00:14:013436 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3437 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3438}
3439
ckrasic1e53b642015-07-08 22:39:353440TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfFour) {
jri7046038f2015-10-22 00:29:263441 disable_disk_cache_ = true;
3442 threshold_public_resets_post_handshake_ = 2;
3443 Initialize();
rch6faa4d42016-01-05 20:48:433444 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3445 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3446 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3447 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3448 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263449 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3450
3451 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3452 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353453 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263454 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353455
mmenke651bae7f2015-12-18 21:26:453456 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3457 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353458 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353459
mmenke651bae7f2015-12-18 21:26:453460 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353461 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353462
mmenke651bae7f2015-12-18 21:26:453463 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353464 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:353465
mmenke651bae7f2015-12-18 21:26:453466 SequencedSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353467 socket_factory_.AddSocketDataProvider(&socket_data4);
ckrasic1e53b642015-07-08 22:39:353468
rch6faa4d42016-01-05 20:48:433469 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3470 HostPortPair server3(kServer3HostName, kDefaultServerPort);
3471 HostPortPair server4(kServer4HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353472
3473 crypto_client_stream_factory_.set_handshake_mode(
3474 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3475 host_resolver_.set_synchronous_mode(true);
3476 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3477 "192.168.0.1", "");
3478 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3479 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3480 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
3481
3482 // Test first and fourth out of four public reset post handshakes.
jri7046038f2015-10-22 00:29:263483 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563484 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563485 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3486 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353487
rchf114d982015-10-21 01:34:563488 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:263489 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353490
3491 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
jri78ec06a2016-03-31 18:19:403492 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
3493 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353494 // Need to spin the loop now to ensure that
3495 // QuicStreamFactory::OnSessionClosed() runs.
3496 base::RunLoop run_loop;
3497 run_loop.RunUntilIdle();
3498
jri7046038f2015-10-22 00:29:263499 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3500 factory_.get()));
3501 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3502 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353503
3504 DVLOG(1) << "Create 2nd and 3rd sessions without disable trigger";
3505 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263506 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563507 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563508 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353509 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:163510 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:263511 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:353512
jri78ec06a2016-03-31 18:19:403513 session2->connection()->CloseConnection(
3514 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353515 // Need to spin the loop now to ensure that
3516 // QuicStreamFactory::OnSessionClosed() runs.
3517 base::RunLoop run_loop2;
3518 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263519 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3520 factory_.get()));
3521 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3522 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353523
3524 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263525 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563526 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563527 /*cert_verify_flags=*/0, url3_, "GET",
ckrasic1e53b642015-07-08 22:39:353528 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:163529 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:263530 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:353531
jri78ec06a2016-03-31 18:19:403532 session3->connection()->CloseConnection(
3533 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353534 // Need to spin the loop now to ensure that
3535 // QuicStreamFactory::OnSessionClosed() runs.
3536 base::RunLoop run_loop3;
3537 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:263538 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3539 factory_.get()));
3540 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3541 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353542
3543 DVLOG(1) << "Create 4rd session with public reset post handshake,"
3544 << " will not disable QUIC";
3545 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:263546 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:563547 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563548 /*cert_verify_flags=*/0, url4_, "GET",
ckrasic1e53b642015-07-08 22:39:353549 net_log_, callback4.callback()));
ckrasic4f9d88d2015-07-22 22:23:163550 QuicChromiumClientSession* session4 =
jri7046038f2015-10-22 00:29:263551 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server4);
ckrasic1e53b642015-07-08 22:39:353552
jri78ec06a2016-03-31 18:19:403553 session4->connection()->CloseConnection(
3554 QUIC_PUBLIC_RESET, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353555 // Need to spin the loop now to ensure that
3556 // QuicStreamFactory::OnSessionClosed() runs.
3557 base::RunLoop run_loop4;
3558 run_loop4.RunUntilIdle();
jri7046038f2015-10-22 00:29:263559 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3560 factory_.get()));
3561 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3562 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353563
danakjad1777e2016-04-16 00:56:423564 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233565 EXPECT_FALSE(stream.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423566 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233567 EXPECT_FALSE(stream2.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423568 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233569 EXPECT_FALSE(stream3.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423570 std::unique_ptr<QuicHttpStream> stream4 = request4.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233571 EXPECT_FALSE(stream4.get()); // Session is already closed.
ckrasic1e53b642015-07-08 22:39:353572
3573 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3574 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3575 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3576 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3577 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3578 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3579 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
3580 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
3581}
3582
3583TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfFour) {
jri7046038f2015-10-22 00:29:263584 disable_disk_cache_ = true;
3585 threshold_public_resets_post_handshake_ = 2;
3586 Initialize();
rch6faa4d42016-01-05 20:48:433587 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3588 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3589 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3590 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3591 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263592 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3593
3594 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3595 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353596 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263597 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353598
mmenke651bae7f2015-12-18 21:26:453599 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3600 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353601 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353602
mmenke651bae7f2015-12-18 21:26:453603 // SequencedSocketData socket_data2(nullptr, 0, nullptr, 0);
3604 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353605 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353606
mmenke651bae7f2015-12-18 21:26:453607 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353608 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:353609
mmenke651bae7f2015-12-18 21:26:453610 SequencedSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353611 socket_factory_.AddSocketDataProvider(&socket_data4);
ckrasic1e53b642015-07-08 22:39:353612
rch6faa4d42016-01-05 20:48:433613 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3614 HostPortPair server3(kServer3HostName, kDefaultServerPort);
3615 HostPortPair server4(kServer4HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353616
3617 crypto_client_stream_factory_.set_handshake_mode(
3618 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3619 host_resolver_.set_synchronous_mode(true);
3620 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3621 "192.168.0.1", "");
3622 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3623 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3624 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
3625
3626 // Test first and fourth out of three timeouts with open streams.
jri7046038f2015-10-22 00:29:263627 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563628 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563629 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3630 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353631
rchf114d982015-10-21 01:34:563632 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:263633 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353634
danakjad1777e2016-04-16 00:56:423635 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
ckrasic1e53b642015-07-08 22:39:353636 EXPECT_TRUE(stream.get());
3637 HttpRequestInfo request_info;
3638 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3639 net_log_, CompletionCallback()));
3640
3641 DVLOG(1)
3642 << "Created 1st session and initialized a stream. Now trigger timeout";
jri78ec06a2016-03-31 18:19:403643 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
3644 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353645 // Need to spin the loop now to ensure that
3646 // QuicStreamFactory::OnSessionClosed() runs.
3647 base::RunLoop run_loop;
3648 run_loop.RunUntilIdle();
3649
jri7046038f2015-10-22 00:29:263650 EXPECT_EQ(
3651 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3652 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3653 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353654
3655 DVLOG(1) << "Create 2nd and 3rd sessions without timeout";
3656 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263657 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563658 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563659 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353660 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:163661 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:263662 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:353663
jri78ec06a2016-03-31 18:19:403664 session2->connection()->CloseConnection(
3665 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353666 // Need to spin the loop now to ensure that
3667 // QuicStreamFactory::OnSessionClosed() runs.
3668 base::RunLoop run_loop2;
3669 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263670 EXPECT_EQ(
3671 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3672 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3673 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353674
3675 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263676 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563677 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563678 /*cert_verify_flags=*/0, url3_, "GET",
ckrasic1e53b642015-07-08 22:39:353679 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:163680 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:263681 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:353682
jri78ec06a2016-03-31 18:19:403683 session3->connection()->CloseConnection(
3684 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353685 // Need to spin the loop now to ensure that
3686 // QuicStreamFactory::OnSessionClosed() runs.
3687 base::RunLoop run_loop3;
3688 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:263689 EXPECT_EQ(
3690 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3691 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3692 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353693
3694 DVLOG(1) << "Create 4th session with timeout with open streams,"
3695 << " will not disable QUIC";
3696
3697 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:263698 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:563699 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563700 /*cert_verify_flags=*/0, url4_, "GET",
ckrasic1e53b642015-07-08 22:39:353701 net_log_, callback4.callback()));
ckrasic4f9d88d2015-07-22 22:23:163702 QuicChromiumClientSession* session4 =
jri7046038f2015-10-22 00:29:263703 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server4);
ckrasic1e53b642015-07-08 22:39:353704
danakjad1777e2016-04-16 00:56:423705 std::unique_ptr<QuicHttpStream> stream4 = request4.CreateStream();
ckrasic1e53b642015-07-08 22:39:353706 EXPECT_TRUE(stream4.get());
3707 EXPECT_EQ(OK, stream4->InitializeStream(&request_info, DEFAULT_PRIORITY,
3708 net_log_, CompletionCallback()));
jri78ec06a2016-03-31 18:19:403709 session4->connection()->CloseConnection(
3710 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353711 // Need to spin the loop now to ensure that
3712 // QuicStreamFactory::OnSessionClosed() runs.
3713 base::RunLoop run_loop4;
3714 run_loop4.RunUntilIdle();
jri7046038f2015-10-22 00:29:263715 EXPECT_EQ(
3716 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3717 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3718 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353719
danakjad1777e2016-04-16 00:56:423720 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233721 EXPECT_FALSE(stream2.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423722 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233723 EXPECT_FALSE(stream3.get()); // Session is already closed.
rchcee7beb2016-03-11 06:16:143724
ckrasic1e53b642015-07-08 22:39:353725 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3726 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3727 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3728 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3729 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3730 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3731 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
3732 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
3733}
3734
rtenneti8332ba52015-09-17 19:33:413735TEST_P(QuicStreamFactoryTest, EnableDelayTcpRace) {
jri7046038f2015-10-22 00:29:263736 Initialize();
rch6faa4d42016-01-05 20:48:433737 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3738 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263739 bool delay_tcp_race = QuicStreamFactoryPeer::GetDelayTcpRace(factory_.get());
3740 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), false);
mmenke651bae7f2015-12-18 21:26:453741 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3742 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti8332ba52015-09-17 19:33:413743 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti8332ba52015-09-17 19:33:413744
rtenneti8332ba52015-09-17 19:33:413745 ServerNetworkStats stats1;
3746 stats1.srtt = base::TimeDelta::FromMicroseconds(10);
rtenneticcab42b2015-10-09 06:38:163747 http_server_properties_.SetServerNetworkStats(host_port_pair_, stats1);
rtenneti8332ba52015-09-17 19:33:413748
3749 crypto_client_stream_factory_.set_handshake_mode(
3750 MockCryptoClientStream::ZERO_RTT);
3751 host_resolver_.set_synchronous_mode(true);
3752 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3753 "192.168.0.1", "");
3754
jri7046038f2015-10-22 00:29:263755 QuicStreamRequest request(factory_.get());
rtenneti8332ba52015-09-17 19:33:413756 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:563757 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563758 /*cert_verify_flags=*/0, url_, "POST", net_log_,
3759 callback_.callback()));
rtenneti8332ba52015-09-17 19:33:413760
3761 // If we don't delay TCP connection, then time delay should be 0.
jri7046038f2015-10-22 00:29:263762 EXPECT_FALSE(factory_->delay_tcp_race());
rtenneti8332ba52015-09-17 19:33:413763 EXPECT_EQ(base::TimeDelta(), request.GetTimeDelayForWaitingJob());
3764
3765 // Enable |delay_tcp_race_| param and verify delay is one RTT and that
3766 // server supports QUIC.
jri7046038f2015-10-22 00:29:263767 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), true);
3768 EXPECT_TRUE(factory_->delay_tcp_race());
rtenneti8332ba52015-09-17 19:33:413769 EXPECT_EQ(base::TimeDelta::FromMicroseconds(15),
3770 request.GetTimeDelayForWaitingJob());
3771
3772 // Confirm the handshake and verify that the stream is created.
3773 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
3774 QuicSession::HANDSHAKE_CONFIRMED);
3775
3776 EXPECT_EQ(OK, callback_.WaitForResult());
3777
danakjad1777e2016-04-16 00:56:423778 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rtenneti8332ba52015-09-17 19:33:413779 EXPECT_TRUE(stream.get());
3780 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3781 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
jri7046038f2015-10-22 00:29:263782 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), delay_tcp_race);
rtenneti8332ba52015-09-17 19:33:413783}
3784
rtenneticd2aaa15b2015-10-10 20:29:333785TEST_P(QuicStreamFactoryTest, MaybeInitialize) {
rtenneti41c09992015-11-30 18:24:013786 idle_connection_timeout_seconds_ = 500;
jri7046038f2015-10-22 00:29:263787 Initialize();
rch6faa4d42016-01-05 20:48:433788 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3789 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rtenneti41c09992015-11-30 18:24:013790 const QuicConfig* config = QuicStreamFactoryPeer::GetConfig(factory_.get());
3791 EXPECT_EQ(500, config->IdleConnectionStateLifetime().ToSeconds());
3792
jri7046038f2015-10-22 00:29:263793 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti8a80a6dc2015-09-21 19:51:133794
rtenneti8a80a6dc2015-09-21 19:51:133795 const AlternativeService alternative_service1(QUIC, host_port_pair_.host(),
3796 host_port_pair_.port());
3797 AlternativeServiceInfoVector alternative_service_info_vector;
3798 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
3799 alternative_service_info_vector.push_back(
rchdc7b9052016-03-17 20:51:503800 AlternativeServiceInfo(alternative_service1, expiration));
rtenneti8a80a6dc2015-09-21 19:51:133801
rtenneticcab42b2015-10-09 06:38:163802 http_server_properties_.SetAlternativeServices(
rtenneti8a80a6dc2015-09-21 19:51:133803 host_port_pair_, alternative_service_info_vector);
rtennetiee679d52016-04-06 17:01:133804
3805 HostPortPair host_port_pair2(kServer2HostName, kDefaultServerPort);
3806 const AlternativeService alternative_service2(QUIC, host_port_pair2.host(),
3807 host_port_pair2.port());
3808 AlternativeServiceInfoVector alternative_service_info_vector2;
3809 alternative_service_info_vector2.push_back(
3810 AlternativeServiceInfo(alternative_service2, expiration));
3811 http_server_properties_.SetAlternativeServices(
3812 host_port_pair2, alternative_service_info_vector2);
3813
rtenneti6971c172016-01-15 20:12:103814 http_server_properties_.SetMaxServerConfigsStoredInProperties(
3815 kMaxQuicServersToPersist);
rtenneti8a80a6dc2015-09-21 19:51:133816
rch6faa4d42016-01-05 20:48:433817 QuicServerId quic_server_id(kDefaultServerHostName, 80,
3818 PRIVACY_MODE_DISABLED);
rtenneticd2aaa15b2015-10-10 20:29:333819 QuicServerInfoFactory* quic_server_info_factory =
3820 new PropertiesBasedQuicServerInfoFactory(
3821 http_server_properties_.GetWeakPtr());
jri7046038f2015-10-22 00:29:263822 factory_->set_quic_server_info_factory(quic_server_info_factory);
rtenneticd2aaa15b2015-10-10 20:29:333823
danakjad1777e2016-04-16 00:56:423824 std::unique_ptr<QuicServerInfo> quic_server_info(
rtenneticd2aaa15b2015-10-10 20:29:333825 quic_server_info_factory->GetForServer(quic_server_id));
3826
3827 // Update quic_server_info's server_config and persist it.
3828 QuicServerInfo::State* state = quic_server_info->mutable_state();
3829 // Minimum SCFG that passes config validation checks.
3830 const char scfg[] = {// SCFG
3831 0x53, 0x43, 0x46, 0x47,
3832 // num entries
3833 0x01, 0x00,
3834 // padding
3835 0x00, 0x00,
3836 // EXPY
3837 0x45, 0x58, 0x50, 0x59,
3838 // EXPY end offset
3839 0x08, 0x00, 0x00, 0x00,
3840 // Value
3841 '1', '2', '3', '4', '5', '6', '7', '8'};
3842
3843 // Create temporary strings becasue Persist() clears string data in |state|.
3844 string server_config(reinterpret_cast<const char*>(&scfg), sizeof(scfg));
3845 string source_address_token("test_source_address_token");
rtenneti61de3682016-03-24 00:50:023846 string cert_sct("test_cert_sct");
3847 string chlo_hash("test_chlo_hash");
rtenneticd2aaa15b2015-10-10 20:29:333848 string signature("test_signature");
3849 string test_cert("test_cert");
3850 vector<string> certs;
3851 certs.push_back(test_cert);
3852 state->server_config = server_config;
3853 state->source_address_token = source_address_token;
rtenneti61de3682016-03-24 00:50:023854 state->cert_sct = cert_sct;
3855 state->chlo_hash = chlo_hash;
rtenneticd2aaa15b2015-10-10 20:29:333856 state->server_config_sig = signature;
3857 state->certs = certs;
3858
3859 quic_server_info->Persist();
3860
rtennetiee679d52016-04-06 17:01:133861 QuicServerId quic_server_id2(kServer2HostName, 80, PRIVACY_MODE_DISABLED);
danakjad1777e2016-04-16 00:56:423862 std::unique_ptr<QuicServerInfo> quic_server_info2(
rtennetiee679d52016-04-06 17:01:133863 quic_server_info_factory->GetForServer(quic_server_id2));
3864
3865 // Update quic_server_info2's server_config and persist it.
3866 QuicServerInfo::State* state2 = quic_server_info2->mutable_state();
3867
3868 // Minimum SCFG that passes config validation checks.
3869 const char scfg2[] = {// SCFG
3870 0x53, 0x43, 0x46, 0x47,
3871 // num entries
3872 0x01, 0x00,
3873 // padding
3874 0x00, 0x00,
3875 // EXPY
3876 0x45, 0x58, 0x50, 0x59,
3877 // EXPY end offset
3878 0x08, 0x00, 0x00, 0x00,
3879 // Value
3880 '8', '7', '3', '4', '5', '6', '2', '1'};
3881
3882 // Create temporary strings becasue Persist() clears string data in |state2|.
3883 string server_config2(reinterpret_cast<const char*>(&scfg2), sizeof(scfg2));
3884 string source_address_token2("test_source_address_token2");
3885 string cert_sct2("test_cert_sct2");
3886 string chlo_hash2("test_chlo_hash2");
3887 string signature2("test_signature2");
3888 string test_cert2("test_cert2");
3889 vector<string> certs2;
3890 certs2.push_back(test_cert2);
3891 state2->server_config = server_config2;
3892 state2->source_address_token = source_address_token2;
3893 state2->cert_sct = cert_sct2;
3894 state2->chlo_hash = chlo_hash2;
3895 state2->server_config_sig = signature2;
3896 state2->certs = certs2;
3897
3898 quic_server_info2->Persist();
3899
jri7046038f2015-10-22 00:29:263900 QuicStreamFactoryPeer::MaybeInitialize(factory_.get());
3901 EXPECT_TRUE(QuicStreamFactoryPeer::HasInitializedData(factory_.get()));
rtennetiee679d52016-04-06 17:01:133902
3903 // Verify the MRU order is maintained.
3904 const QuicServerInfoMap& quic_server_info_map =
3905 http_server_properties_.quic_server_info_map();
3906 EXPECT_EQ(2u, quic_server_info_map.size());
3907 QuicServerInfoMap::const_iterator quic_server_info_map_it =
3908 quic_server_info_map.begin();
3909 EXPECT_EQ(quic_server_info_map_it->first, quic_server_id2);
3910 ++quic_server_info_map_it;
3911 EXPECT_EQ(quic_server_info_map_it->first, quic_server_id);
3912
jri7046038f2015-10-22 00:29:263913 EXPECT_TRUE(QuicStreamFactoryPeer::SupportsQuicAtStartUp(factory_.get(),
3914 host_port_pair_));
3915 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(factory_.get(),
rtenneticd2aaa15b2015-10-10 20:29:333916 quic_server_id));
3917 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:263918 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rtenneticd2aaa15b2015-10-10 20:29:333919 QuicCryptoClientConfig::CachedState* cached =
3920 crypto_config->LookupOrCreate(quic_server_id);
3921 EXPECT_FALSE(cached->server_config().empty());
3922 EXPECT_TRUE(cached->GetServerConfig());
3923 EXPECT_EQ(server_config, cached->server_config());
3924 EXPECT_EQ(source_address_token, cached->source_address_token());
rtenneti61de3682016-03-24 00:50:023925 EXPECT_EQ(cert_sct, cached->cert_sct());
3926 EXPECT_EQ(chlo_hash, cached->chlo_hash());
rtenneticd2aaa15b2015-10-10 20:29:333927 EXPECT_EQ(signature, cached->signature());
3928 ASSERT_EQ(1U, cached->certs().size());
3929 EXPECT_EQ(test_cert, cached->certs()[0]);
rtennetiee679d52016-04-06 17:01:133930
3931 EXPECT_TRUE(QuicStreamFactoryPeer::SupportsQuicAtStartUp(factory_.get(),
3932 host_port_pair2));
3933 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(
3934 factory_.get(), quic_server_id2));
3935 QuicCryptoClientConfig::CachedState* cached2 =
3936 crypto_config->LookupOrCreate(quic_server_id2);
3937 EXPECT_FALSE(cached2->server_config().empty());
3938 EXPECT_TRUE(cached2->GetServerConfig());
3939 EXPECT_EQ(server_config2, cached2->server_config());
3940 EXPECT_EQ(source_address_token2, cached2->source_address_token());
3941 EXPECT_EQ(cert_sct2, cached2->cert_sct());
3942 EXPECT_EQ(chlo_hash2, cached2->chlo_hash());
3943 EXPECT_EQ(signature2, cached2->signature());
3944 ASSERT_EQ(1U, cached->certs().size());
3945 EXPECT_EQ(test_cert2, cached2->certs()[0]);
rtenneti8a80a6dc2015-09-21 19:51:133946}
3947
rtennetid2e74caa2015-12-09 00:51:573948TEST_P(QuicStreamFactoryTest, QuicDoingZeroRTT) {
3949 Initialize();
3950
3951 factory_->set_require_confirmation(true);
3952 QuicServerId quic_server_id(host_port_pair_, PRIVACY_MODE_DISABLED);
3953 EXPECT_FALSE(factory_->ZeroRTTEnabledFor(quic_server_id));
3954
3955 factory_->set_require_confirmation(false);
3956 EXPECT_FALSE(factory_->ZeroRTTEnabledFor(quic_server_id));
3957
3958 // Load server config and verify QUIC will do 0RTT.
3959 QuicStreamFactoryPeer::CacheDummyServerConfig(factory_.get(), quic_server_id);
3960 EXPECT_TRUE(factory_->ZeroRTTEnabledFor(quic_server_id));
3961}
3962
rtenneti1cd3b162015-09-29 02:58:283963TEST_P(QuicStreamFactoryTest, YieldAfterPackets) {
jri7046038f2015-10-22 00:29:263964 Initialize();
rch6faa4d42016-01-05 20:48:433965 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3966 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263967 QuicStreamFactoryPeer::SetYieldAfterPackets(factory_.get(), 0);
rtenneti1cd3b162015-09-29 02:58:283968
danakjad1777e2016-04-16 00:56:423969 std::unique_ptr<QuicEncryptedPacket> close_packet(
rtenneti1cd3b162015-09-29 02:58:283970 ConstructConnectionClosePacket(0));
rtenneticd2aaa15b2015-10-10 20:29:333971 vector<MockRead> reads;
rtenneti1cd3b162015-09-29 02:58:283972 reads.push_back(
3973 MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0));
3974 reads.push_back(MockRead(ASYNC, OK, 1));
mmenke651bae7f2015-12-18 21:26:453975 SequencedSocketData socket_data(&reads[0], reads.size(), nullptr, 0);
rtenneti1cd3b162015-09-29 02:58:283976 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti1cd3b162015-09-29 02:58:283977
3978 crypto_client_stream_factory_.set_handshake_mode(
3979 MockCryptoClientStream::ZERO_RTT);
3980 host_resolver_.set_synchronous_mode(true);
3981 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3982 "192.168.0.1", "");
3983
rcha02807b42016-01-29 21:56:153984 // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
3985 // posts a task.
rtenneti1cd3b162015-09-29 02:58:283986 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
rcha02807b42016-01-29 21:56:153987 SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
3988 "StartReading");
rtenneti1cd3b162015-09-29 02:58:283989
jri7046038f2015-10-22 00:29:263990 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563991 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563992 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3993 callback_.callback()));
rtenneti1cd3b162015-09-29 02:58:283994
rcha02807b42016-01-29 21:56:153995 // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
3996 // called.
rtenneti1cd3b162015-09-29 02:58:283997 base::RunLoop run_loop;
3998 run_loop.RunUntilIdle();
3999
4000 // Verify task that the observer's executed_count is 1, which indicates
rcha02807b42016-01-29 21:56:154001 // QuicChromiumPacketReader::StartReading() has posted only one task and
4002 // yielded the read.
rtenneti1cd3b162015-09-29 02:58:284003 EXPECT_EQ(1u, observer.executed_count());
4004
danakjad1777e2016-04-16 00:56:424005 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
xunjieli2608f9b2016-03-14 13:39:234006 EXPECT_FALSE(stream.get()); // Session is already closed.
rtenneti1cd3b162015-09-29 02:58:284007 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4008 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4009}
4010
4011TEST_P(QuicStreamFactoryTest, YieldAfterDuration) {
jri7046038f2015-10-22 00:29:264012 Initialize();
rch6faa4d42016-01-05 20:48:434013 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4014 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rtenneti1cd3b162015-09-29 02:58:284015 QuicStreamFactoryPeer::SetYieldAfterDuration(
jri7046038f2015-10-22 00:29:264016 factory_.get(), QuicTime::Delta::FromMilliseconds(-1));
rtenneti1cd3b162015-09-29 02:58:284017
danakjad1777e2016-04-16 00:56:424018 std::unique_ptr<QuicEncryptedPacket> close_packet(
rtenneti1cd3b162015-09-29 02:58:284019 ConstructConnectionClosePacket(0));
rtenneticd2aaa15b2015-10-10 20:29:334020 vector<MockRead> reads;
rtenneti1cd3b162015-09-29 02:58:284021 reads.push_back(
4022 MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0));
4023 reads.push_back(MockRead(ASYNC, OK, 1));
mmenke651bae7f2015-12-18 21:26:454024 SequencedSocketData socket_data(&reads[0], reads.size(), nullptr, 0);
rtenneti1cd3b162015-09-29 02:58:284025 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti1cd3b162015-09-29 02:58:284026
4027 crypto_client_stream_factory_.set_handshake_mode(
4028 MockCryptoClientStream::ZERO_RTT);
4029 host_resolver_.set_synchronous_mode(true);
4030 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
4031 "192.168.0.1", "");
4032
rcha02807b42016-01-29 21:56:154033 // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
4034 // posts a task.
rtenneti1cd3b162015-09-29 02:58:284035 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
rcha02807b42016-01-29 21:56:154036 SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
4037 "StartReading");
rtenneti1cd3b162015-09-29 02:58:284038
jri7046038f2015-10-22 00:29:264039 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:564040 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:564041 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4042 callback_.callback()));
rtenneti1cd3b162015-09-29 02:58:284043
rcha02807b42016-01-29 21:56:154044 // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
4045 // called.
rtenneti1cd3b162015-09-29 02:58:284046 base::RunLoop run_loop;
4047 run_loop.RunUntilIdle();
4048
4049 // Verify task that the observer's executed_count is 1, which indicates
rcha02807b42016-01-29 21:56:154050 // QuicChromiumPacketReader::StartReading() has posted only one task and
4051 // yielded the read.
rtenneti1cd3b162015-09-29 02:58:284052 EXPECT_EQ(1u, observer.executed_count());
4053
danakjad1777e2016-04-16 00:56:424054 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
xunjieli2608f9b2016-03-14 13:39:234055 EXPECT_FALSE(stream.get()); // Session is already closed.
rtenneti1cd3b162015-09-29 02:58:284056 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4057 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4058}
4059
ckrasic3865ee0f2016-02-29 22:04:564060TEST_P(QuicStreamFactoryTest, ServerPushSessionAffinity) {
4061 Initialize();
4062 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4063 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4064
4065 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
4066 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
4067 socket_factory_.AddSocketDataProvider(&socket_data);
4068
4069 QuicStreamRequest request(factory_.get());
4070 EXPECT_EQ(ERR_IO_PENDING,
4071 request.Request(host_port_pair_, privacy_mode_,
4072 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4073 callback_.callback()));
4074
4075 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:424076 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
ckrasic3865ee0f2016-02-29 22:04:564077 EXPECT_TRUE(stream.get());
4078
4079 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
4080
4081 std::string url = "https://www.example.org/";
4082
4083 QuicChromiumClientSession* session =
4084 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
4085
4086 QuicClientPromisedInfo promised(session, kServerDataStreamId1, url);
4087 (*QuicStreamFactoryPeer::GetPushPromiseIndex(factory_.get())
4088 ->promised_by_url())[url] = &promised;
4089
4090 QuicStreamRequest request2(factory_.get());
4091 EXPECT_EQ(OK, request2.Request(host_port_pair_, privacy_mode_,
4092 /*cert_verify_flags=*/0, GURL(url), "GET",
4093 net_log_, callback_.callback()));
4094
4095 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
4096}
4097
4098TEST_P(QuicStreamFactoryTest, ServerPushPrivacyModeMismatch) {
4099 Initialize();
4100 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4101 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4102 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4103
4104 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
4105
danakjad1777e2016-04-16 00:56:424106 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
ckrasic3865ee0f2016-02-29 22:04:564107 1, true, kServerDataStreamId1, QUIC_STREAM_CANCELLED));
4108 MockWrite writes[] = {
4109 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
4110 };
4111
4112 SequencedSocketData socket_data1(reads, arraysize(reads), writes,
4113 arraysize(writes));
4114 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
4115
4116 socket_factory_.AddSocketDataProvider(&socket_data1);
4117 socket_factory_.AddSocketDataProvider(&socket_data2);
4118
4119 QuicStreamRequest request(factory_.get());
4120 EXPECT_EQ(ERR_IO_PENDING,
4121 request.Request(host_port_pair_, privacy_mode_,
4122 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4123 callback_.callback()));
4124
4125 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:424126 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
ckrasic3865ee0f2016-02-29 22:04:564127 EXPECT_TRUE(stream.get());
4128
4129 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
4130
4131 std::string url = "https://www.example.org/";
4132 QuicChromiumClientSession* session =
4133 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
4134
4135 QuicClientPromisedInfo promised(session, kServerDataStreamId1, url);
4136
4137 QuicClientPushPromiseIndex* index =
4138 QuicStreamFactoryPeer::GetPushPromiseIndex(factory_.get());
4139
4140 (*index->promised_by_url())[url] = &promised;
4141 EXPECT_EQ(index->GetPromised(url), &promised);
4142
4143 // Doing the request should not use the push stream, but rather
4144 // cancel it because the privacy modes do not match.
4145 QuicStreamRequest request2(factory_.get());
4146 EXPECT_EQ(ERR_IO_PENDING,
4147 request2.Request(host_port_pair_, PRIVACY_MODE_ENABLED,
4148 /*cert_verify_flags=*/0, GURL(url), "GET",
4149 net_log_, callback_.callback()));
4150
4151 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
4152 EXPECT_EQ(index->GetPromised(url), nullptr);
4153
4154 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:424155 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
ckrasic3865ee0f2016-02-29 22:04:564156 EXPECT_TRUE(stream2.get());
4157
4158 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
4159 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
4160 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
4161 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
4162}
4163
[email protected]e13201d82012-12-12 05:00:324164} // namespace test
[email protected]e13201d82012-12-12 05:00:324165} // namespace net