blob: c08de4aa72492040fc4a4908e74b2a94831d14e6 [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
bnc912a04b2016-04-20 14:19:5093} // namespace
[email protected]3c772402013-12-18 21:38:1194
rtenneti38f5cd52014-10-28 20:28:2895class MockQuicServerInfo : public QuicServerInfo {
96 public:
bnc912a04b2016-04-20 14:19:5097 explicit MockQuicServerInfo(const QuicServerId& server_id)
rtenneti38f5cd52014-10-28 20:28:2898 : 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
bnc912a04b2016-04-20 14:19:50283 QuicChromiumClientSession* GetActiveSession(
284 const HostPortPair& host_port_pair) {
285 return QuicStreamFactoryPeer::GetActiveSession(factory_.get(),
286 host_port_pair);
287 }
288
danakjad1777e2016-04-16 00:56:42289 std::unique_ptr<QuicHttpStream> CreateFromSession(
bnccb7ff3c2015-05-21 20:51:55290 const HostPortPair& host_port_pair) {
bnc912a04b2016-04-20 14:19:50291 QuicChromiumClientSession* session = GetActiveSession(host_port_pair);
jri7046038f2015-10-22 00:29:26292 return QuicStreamFactoryPeer::CreateFromSession(factory_.get(), session);
[email protected]df157d9d2014-03-10 07:27:27293 }
[email protected]e13201d82012-12-12 05:00:32294
[email protected]bf4ea2f2014-03-10 22:57:53295 int GetSourcePortForNewSession(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10296 return GetSourcePortForNewSessionInner(destination, false);
297 }
298
rjshaded5ced072015-12-18 19:26:02299 int GetSourcePortForNewSessionAndGoAway(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10300 return GetSourcePortForNewSessionInner(destination, true);
301 }
302
[email protected]bf4ea2f2014-03-10 22:57:53303 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
[email protected]d8e2abf82014-03-06 10:30:10304 bool goaway_received) {
[email protected]3c772402013-12-18 21:38:11305 // Should only be called if there is no active session for this destination.
bnccb7ff3c2015-05-21 20:51:55306 EXPECT_FALSE(HasActiveSession(destination));
mmenke651bae7f2015-12-18 21:26:45307 size_t socket_count = socket_factory_.udp_client_socket_ports().size();
[email protected]3c772402013-12-18 21:38:11308
mmenke651bae7f2015-12-18 21:26:45309 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
310 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]3c772402013-12-18 21:38:11311 socket_factory_.AddSocketDataProvider(&socket_data);
312
jri7046038f2015-10-22 00:29:26313 QuicStreamRequest request(factory_.get());
ckrasic3865ee0f2016-02-29 22:04:56314 GURL url("https://" + destination.host() + "/");
[email protected]974849d2014-02-06 01:32:59315 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56316 request.Request(destination, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56317 /*cert_verify_flags=*/0, url, "GET", net_log_,
318 callback_.callback()));
[email protected]3c772402013-12-18 21:38:11319
320 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:42321 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]3c772402013-12-18 21:38:11322 EXPECT_TRUE(stream.get());
323 stream.reset();
324
bnc912a04b2016-04-20 14:19:50325 QuicChromiumClientSession* session = GetActiveSession(destination);
[email protected]3c772402013-12-18 21:38:11326
mmenke651bae7f2015-12-18 21:26:45327 if (socket_count + 1 != socket_factory_.udp_client_socket_ports().size()) {
328 ADD_FAILURE();
[email protected]3c772402013-12-18 21:38:11329 return 0;
330 }
331
[email protected]d8e2abf82014-03-06 10:30:10332 if (goaway_received) {
333 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, "");
rtenneti9bd5d4b2015-08-21 05:44:52334 session->connection()->OnGoAwayFrame(goaway);
[email protected]d8e2abf82014-03-06 10:30:10335 }
[email protected]3c772402013-12-18 21:38:11336
jri7046038f2015-10-22 00:29:26337 factory_->OnSessionClosed(session);
bnccb7ff3c2015-05-21 20:51:55338 EXPECT_FALSE(HasActiveSession(destination));
rch37de576c2015-05-17 20:28:17339 EXPECT_TRUE(socket_data.AllReadDataConsumed());
340 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:45341 return socket_factory_.udp_client_socket_ports()[socket_count];
[email protected]3c772402013-12-18 21:38:11342 }
343
danakjad1777e2016-04-16 00:56:42344 std::unique_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
rtenneti1cd3b162015-09-29 02:58:28345 QuicPacketNumber num) {
346 return maker_.MakeConnectionClosePacket(num);
347 }
348
danakjad1777e2016-04-16 00:56:42349 std::unique_ptr<QuicEncryptedPacket> ConstructRstPacket() {
[email protected]66ae5962014-05-22 11:13:05350 QuicStreamId stream_id = kClientDataStreamId1;
[email protected]51cc1342014-04-18 23:44:37351 return maker_.MakeRstPacket(
352 1, true, stream_id,
rtenneti14abd312015-02-06 21:56:01353 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam().version));
[email protected]459a7402014-02-10 12:58:52354 }
355
bncf8bf0722015-05-19 20:04:13356 static ProofVerifyDetailsChromium DefaultProofVerifyDetails() {
rch6faa4d42016-01-05 20:48:43357 // Load a certificate that is valid for *.example.org
bncf8bf0722015-05-19 20:04:13358 scoped_refptr<X509Certificate> test_cert(
rch6faa4d42016-01-05 20:48:43359 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bncf8bf0722015-05-19 20:04:13360 EXPECT_TRUE(test_cert.get());
361 ProofVerifyDetailsChromium verify_details;
362 verify_details.cert_verify_result.verified_cert = test_cert;
363 verify_details.cert_verify_result.is_issued_by_known_root = true;
364 return verify_details;
365 }
366
jri8c44d692015-10-23 23:53:41367 void NotifyIPAddressChanged() {
368 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
jri7e636642016-01-14 06:57:08369 // Spin the message loop so the notification is delivered.
jri8c44d692015-10-23 23:53:41370 base::MessageLoop::current()->RunUntilIdle();
371 }
372
danakjad1777e2016-04-16 00:56:42373 std::unique_ptr<QuicEncryptedPacket> ConstructGetRequestPacket(
jri7e636642016-01-14 06:57:08374 QuicPacketNumber packet_number,
375 QuicStreamId stream_id,
376 bool should_include_version,
377 bool fin) {
378 SpdyHeaderBlock headers = maker_.GetRequestHeaders("GET", "https", "/");
379 SpdyPriority priority =
380 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
381 size_t spdy_headers_frame_len;
382 return maker_.MakeRequestHeadersPacket(
383 packet_number, stream_id, should_include_version, fin, priority,
384 headers, &spdy_headers_frame_len);
385 }
386
danakjad1777e2016-04-16 00:56:42387 std::unique_ptr<QuicEncryptedPacket> ConstructOkResponsePacket(
jri7e636642016-01-14 06:57:08388 QuicPacketNumber packet_number,
389 QuicStreamId stream_id,
390 bool should_include_version,
391 bool fin) {
392 SpdyHeaderBlock headers = maker_.GetResponseHeaders("200 OK");
393 size_t spdy_headers_frame_len;
394 return maker_.MakeResponseHeadersPacket(packet_number, stream_id,
395 should_include_version, fin,
396 headers, &spdy_headers_frame_len);
397 }
398
[email protected]e13201d82012-12-12 05:00:32399 MockHostResolver host_resolver_;
mmenke651bae7f2015-12-18 21:26:45400 MockClientSocketFactory socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05401 MockCryptoClientStreamFactory crypto_client_stream_factory_;
jri7e636642016-01-14 06:57:08402 ProofVerifyDetailsChromium verify_details_;
[email protected]9558c5d32012-12-22 00:08:14403 MockRandom random_generator_;
[email protected]872edd9e2013-01-16 08:51:15404 MockClock* clock_; // Owned by factory_.
rtenneti38f5cd52014-10-28 20:28:28405 scoped_refptr<TestTaskRunner> runner_;
rtenneti4b06ae72014-08-26 03:43:43406 QuicTestPacketMaker maker_;
rtenneticcab42b2015-10-09 06:38:16407 HttpServerPropertiesImpl http_server_properties_;
danakjad1777e2016-04-16 00:56:42408 std::unique_ptr<CertVerifier> cert_verifier_;
409 std::unique_ptr<ChannelIDService> channel_id_service_;
[email protected]080b77932014-08-04 01:22:46410 TransportSecurityState transport_security_state_;
danakjad1777e2016-04-16 00:56:42411 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
412 std::unique_ptr<ScopedMockNetworkChangeNotifier>
jri7e636642016-01-14 06:57:08413 scoped_mock_network_change_notifier_;
danakjad1777e2016-04-16 00:56:42414 std::unique_ptr<QuicStreamFactory> factory_;
[email protected]bf4ea2f2014-03-10 22:57:53415 HostPortPair host_port_pair_;
ckrasic3865ee0f2016-02-29 22:04:56416 GURL url_;
417 GURL url2_;
418 GURL url3_;
419 GURL url4_;
420
[email protected]9dd3ff0f2014-03-26 09:51:28421 PrivacyMode privacy_mode_;
[email protected]e13201d82012-12-12 05:00:32422 BoundNetLog net_log_;
423 TestCompletionCallback callback_;
jri7046038f2015-10-22 00:29:26424
425 // Variables to configure QuicStreamFactory.
426 bool enable_port_selection_;
427 bool always_require_handshake_confirmation_;
428 bool disable_connection_pooling_;
429 double load_server_info_timeout_srtt_multiplier_;
430 bool enable_connection_racing_;
431 bool enable_non_blocking_io_;
432 bool disable_disk_cache_;
433 bool prefer_aes_;
434 int max_number_of_lossy_connections_;
435 double packet_loss_threshold_;
436 int max_disabled_reasons_;
437 int threshold_timeouts_with_open_streams_;
438 int threshold_public_resets_post_handshake_;
439 int receive_buffer_size_;
440 bool delay_tcp_race_;
jri8c44d692015-10-23 23:53:41441 bool close_sessions_on_ip_change_;
zhongyi89649c32016-01-22 00:14:01442 bool disable_quic_on_timeout_with_open_streams_;
rtenneti41c09992015-11-30 18:24:01443 int idle_connection_timeout_seconds_;
jri7e636642016-01-14 06:57:08444 bool migrate_sessions_on_network_change_;
jrid36ada62016-02-06 02:42:08445 bool migrate_sessions_early_;
[email protected]e13201d82012-12-12 05:00:32446};
447
rtenneti14abd312015-02-06 21:56:01448INSTANTIATE_TEST_CASE_P(Version,
449 QuicStreamFactoryTest,
450 ::testing::ValuesIn(GetTestParams()));
[email protected]1e960032013-12-20 19:00:20451
[email protected]1e960032013-12-20 19:00:20452TEST_P(QuicStreamFactoryTest, Create) {
jri7046038f2015-10-22 00:29:26453 Initialize();
rch6faa4d42016-01-05 20:48:43454 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
455 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26456
mmenke651bae7f2015-12-18 21:26:45457 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
458 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:32459 socket_factory_.AddSocketDataProvider(&socket_data);
460
jri7046038f2015-10-22 00:29:26461 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:59462 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56463 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56464 /*cert_verify_flags=*/0, url_, "GET", net_log_,
465 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32466
467 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:42468 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]0edce6a2013-05-08 18:02:40469 EXPECT_TRUE(stream.get());
[email protected]e13201d82012-12-12 05:00:32470
471 // Will reset stream 3.
bnccb7ff3c2015-05-21 20:51:55472 stream = CreateFromSession(host_port_pair_);
[email protected]e13201d82012-12-12 05:00:32473 EXPECT_TRUE(stream.get());
474
[email protected]6d1b4ed2013-07-10 03:57:54475 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
476 // in streams on different sessions.
jri7046038f2015-10-22 00:29:26477 QuicStreamRequest request2(factory_.get());
ckrasic3865ee0f2016-02-29 22:04:56478 EXPECT_EQ(OK, request2.Request(host_port_pair_, privacy_mode_,
479 /*cert_verify_flags=*/0, url_, "GET", net_log_,
480 callback_.callback()));
xunjieli2608f9b2016-03-14 13:39:23481 stream = request2.CreateStream(); // Will reset stream 5.
rjshaded5ced072015-12-18 19:26:02482 stream.reset(); // Will reset stream 7.
[email protected]e13201d82012-12-12 05:00:32483
rch37de576c2015-05-17 20:28:17484 EXPECT_TRUE(socket_data.AllReadDataConsumed());
485 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:32486}
487
[email protected]8bd2b812014-03-26 04:01:17488TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
jri7046038f2015-10-22 00:29:26489 Initialize();
rch6faa4d42016-01-05 20:48:43490 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
491 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26492
mmenke651bae7f2015-12-18 21:26:45493 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
494 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17495 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]8bd2b812014-03-26 04:01:17496
497 crypto_client_stream_factory_.set_handshake_mode(
498 MockCryptoClientStream::ZERO_RTT);
499 host_resolver_.set_synchronous_mode(true);
500 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
501 "192.168.0.1", "");
502
jri7046038f2015-10-22 00:29:26503 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56504 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56505 /*cert_verify_flags=*/0, url_, "GET", net_log_,
506 callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17507
danakjad1777e2016-04-16 00:56:42508 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]8bd2b812014-03-26 04:01:17509 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17510 EXPECT_TRUE(socket_data.AllReadDataConsumed());
511 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17512}
513
514TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
jri7046038f2015-10-22 00:29:26515 Initialize();
rch6faa4d42016-01-05 20:48:43516 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
517 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26518
mmenke651bae7f2015-12-18 21:26:45519 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
520 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17521 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]8bd2b812014-03-26 04:01:17522
523 crypto_client_stream_factory_.set_handshake_mode(
524 MockCryptoClientStream::ZERO_RTT);
525 host_resolver_.set_synchronous_mode(true);
526 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
527 "192.168.0.1", "");
528
jri7046038f2015-10-22 00:29:26529 QuicStreamRequest request(factory_.get());
[email protected]8bd2b812014-03-26 04:01:17530 // Posts require handshake confirmation, so this will return asynchronously.
531 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56532 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56533 /*cert_verify_flags=*/0, url_, "POST", net_log_,
534 callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17535
536 // Confirm the handshake and verify that the stream is created.
537 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
538 QuicSession::HANDSHAKE_CONFIRMED);
539
540 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:42541 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]8bd2b812014-03-26 04:01:17542 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17543 EXPECT_TRUE(socket_data.AllReadDataConsumed());
544 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17545}
546
bnc68d401dd2015-05-18 20:31:48547TEST_P(QuicStreamFactoryTest, NoZeroRttForDifferentHost) {
jri7046038f2015-10-22 00:29:26548 Initialize();
rch6faa4d42016-01-05 20:48:43549 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
550 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26551
mmenke651bae7f2015-12-18 21:26:45552 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
553 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
bnc68d401dd2015-05-18 20:31:48554 socket_factory_.AddSocketDataProvider(&socket_data);
bnc68d401dd2015-05-18 20:31:48555
556 crypto_client_stream_factory_.set_handshake_mode(
557 MockCryptoClientStream::ZERO_RTT);
558 host_resolver_.set_synchronous_mode(true);
559 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
560 "192.168.0.1", "");
561
jri7046038f2015-10-22 00:29:26562 QuicStreamRequest request(factory_.get());
ckrasic3865ee0f2016-02-29 22:04:56563 int rv = request.Request(host_port_pair_, privacy_mode_,
564 /*cert_verify_flags=*/0, url2_, "GET", net_log_,
565 callback_.callback());
bnc68d401dd2015-05-18 20:31:48566 // If server and origin have different hostnames, then handshake confirmation
567 // should be required, so Request will return asynchronously.
568 EXPECT_EQ(ERR_IO_PENDING, rv);
569 // Confirm handshake.
570 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
571 QuicSession::HANDSHAKE_CONFIRMED);
572 EXPECT_EQ(OK, callback_.WaitForResult());
573
danakjad1777e2016-04-16 00:56:42574 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
bnc68d401dd2015-05-18 20:31:48575 EXPECT_TRUE(stream.get());
576 EXPECT_TRUE(socket_data.AllReadDataConsumed());
577 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
578}
579
rch68955482015-09-24 00:14:39580TEST_P(QuicStreamFactoryTest, GoAway) {
jri7046038f2015-10-22 00:29:26581 Initialize();
rch6faa4d42016-01-05 20:48:43582 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
583 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26584
mmenke651bae7f2015-12-18 21:26:45585 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
586 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rch68955482015-09-24 00:14:39587 socket_factory_.AddSocketDataProvider(&socket_data);
rch68955482015-09-24 00:14:39588
jri7046038f2015-10-22 00:29:26589 QuicStreamRequest request(factory_.get());
rch68955482015-09-24 00:14:39590 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56591 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56592 /*cert_verify_flags=*/0, url_, "GET", net_log_,
593 callback_.callback()));
rch68955482015-09-24 00:14:39594
595 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:42596 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rch68955482015-09-24 00:14:39597 EXPECT_TRUE(stream.get());
598
bnc912a04b2016-04-20 14:19:50599 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
rch68955482015-09-24 00:14:39600
601 session->OnGoAway(QuicGoAwayFrame());
602
bnc912a04b2016-04-20 14:19:50603 EXPECT_FALSE(HasActiveSession(host_port_pair_));
rch68955482015-09-24 00:14:39604
605 EXPECT_TRUE(socket_data.AllReadDataConsumed());
606 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
607}
608
zhongyi6b5a3892016-03-12 04:46:20609TEST_P(QuicStreamFactoryTest, GoAwayForConnectionMigrationWithPortOnly) {
610 Initialize();
611 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
612 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
613
614 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
615 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
616 socket_factory_.AddSocketDataProvider(&socket_data);
617
618 QuicStreamRequest request(factory_.get());
619 EXPECT_EQ(ERR_IO_PENDING,
620 request.Request(host_port_pair_, privacy_mode_,
621 /*cert_verify_flags=*/0, url_, "GET", net_log_,
622 callback_.callback()));
623
624 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:42625 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
zhongyi6b5a3892016-03-12 04:46:20626 EXPECT_TRUE(stream.get());
627
bnc912a04b2016-04-20 14:19:50628 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
zhongyi6b5a3892016-03-12 04:46:20629
630 session->OnGoAway(
631 QuicGoAwayFrame(QUIC_ERROR_MIGRATING_PORT, 0,
632 "peer connection migration due to port change only"));
633 NetErrorDetails details;
634 EXPECT_FALSE(details.quic_port_migration_detected);
635 session->PopulateNetErrorDetails(&details);
636 EXPECT_TRUE(details.quic_port_migration_detected);
637 details.quic_port_migration_detected = false;
638 stream->PopulateNetErrorDetails(&details);
639 EXPECT_TRUE(details.quic_port_migration_detected);
640
bnc912a04b2016-04-20 14:19:50641 EXPECT_FALSE(HasActiveSession(host_port_pair_));
zhongyi6b5a3892016-03-12 04:46:20642
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
bnc912a04b2016-04-20 14:19:50677 EXPECT_EQ(GetActiveSession(host_port_pair_), GetActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:38678
rch37de576c2015-05-17 20:28:17679 EXPECT_TRUE(socket_data.AllReadDataConsumed());
680 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38681}
682
jri584002d12014-09-09 00:51:28683TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) {
jri7046038f2015-10-22 00:29:26684 disable_connection_pooling_ = true;
685 Initialize();
rch6faa4d42016-01-05 20:48:43686 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
687 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
688 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26689
mmenke651bae7f2015-12-18 21:26:45690 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
691 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
692 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28693 socket_factory_.AddSocketDataProvider(&socket_data1);
694 socket_factory_.AddSocketDataProvider(&socket_data2);
jri584002d12014-09-09 00:51:28695
rch6faa4d42016-01-05 20:48:43696 HostPortPair server2(kServer2HostName, kDefaultServerPort);
jri584002d12014-09-09 00:51:28697 host_resolver_.set_synchronous_mode(true);
rch6faa4d42016-01-05 20:48:43698 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
rjshaded5ced072015-12-18 19:26:02699 "192.168.0.1", "");
rch6faa4d42016-01-05 20:48:43700 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
jri584002d12014-09-09 00:51:28701
jri7046038f2015-10-22 00:29:26702 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56703 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56704 /*cert_verify_flags=*/0, url_, "GET", net_log_,
705 callback_.callback()));
danakjad1777e2016-04-16 00:56:42706 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri584002d12014-09-09 00:51:28707 EXPECT_TRUE(stream.get());
708
709 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26710 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56711 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56712 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50713 net_log_, callback.callback()));
danakjad1777e2016-04-16 00:56:42714 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jri584002d12014-09-09 00:51:28715 EXPECT_TRUE(stream2.get());
716
bnc912a04b2016-04-20 14:19:50717 EXPECT_NE(GetActiveSession(host_port_pair_), GetActiveSession(server2));
jri584002d12014-09-09 00:51:28718
rch37de576c2015-05-17 20:28:17719 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
720 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
721 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
722 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28723}
724
[email protected]eed749f92013-12-23 18:57:38725TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
jri7046038f2015-10-22 00:29:26726 Initialize();
rch6faa4d42016-01-05 20:48:43727 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
728 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
729 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26730
mmenke651bae7f2015-12-18 21:26:45731 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
732 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
733 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38734 socket_factory_.AddSocketDataProvider(&socket_data1);
735 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]eed749f92013-12-23 18:57:38736
rch6faa4d42016-01-05 20:48:43737 HostPortPair server2(kServer2HostName, kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38738 host_resolver_.set_synchronous_mode(true);
rch6faa4d42016-01-05 20:48:43739 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
rjshaded5ced072015-12-18 19:26:02740 "192.168.0.1", "");
rch6faa4d42016-01-05 20:48:43741 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38742
jri7046038f2015-10-22 00:29:26743 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56744 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56745 /*cert_verify_flags=*/0, url_, "GET", net_log_,
746 callback_.callback()));
danakjad1777e2016-04-16 00:56:42747 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]eed749f92013-12-23 18:57:38748 EXPECT_TRUE(stream.get());
749
750 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26751 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56752 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56753 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50754 net_log_, callback.callback()));
danakjad1777e2016-04-16 00:56:42755 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]eed749f92013-12-23 18:57:38756 EXPECT_TRUE(stream2.get());
757
bnc912a04b2016-04-20 14:19:50758 factory_->OnSessionGoingAway(GetActiveSession(host_port_pair_));
759 EXPECT_FALSE(HasActiveSession(host_port_pair_));
760 EXPECT_FALSE(HasActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:38761
762 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:26763 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:56764 EXPECT_EQ(OK, request3.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56765 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50766 net_log_, callback3.callback()));
danakjad1777e2016-04-16 00:56:42767 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
[email protected]eed749f92013-12-23 18:57:38768 EXPECT_TRUE(stream3.get());
769
bnc912a04b2016-04-20 14:19:50770 EXPECT_TRUE(HasActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:38771
rch37de576c2015-05-17 20:28:17772 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
773 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
774 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
775 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38776}
777
[email protected]5db452202014-08-19 05:22:15778TEST_P(QuicStreamFactoryTest, HttpsPooling) {
jri7046038f2015-10-22 00:29:26779 Initialize();
rch6faa4d42016-01-05 20:48:43780
mmenke651bae7f2015-12-18 21:26:45781 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
782 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38783 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]eed749f92013-12-23 18:57:38784
rch6faa4d42016-01-05 20:48:43785 HostPortPair server1(kDefaultServerHostName, 443);
786 HostPortPair server2(kServer2HostName, 443);
[email protected]eed749f92013-12-23 18:57:38787
bncf8bf0722015-05-19 20:04:13788 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01789 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38790
791 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53792 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
793 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38794
jri7046038f2015-10-22 00:29:26795 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56796 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56797 /*cert_verify_flags=*/0, url_, "GET", net_log_,
798 callback_.callback()));
danakjad1777e2016-04-16 00:56:42799 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]eed749f92013-12-23 18:57:38800 EXPECT_TRUE(stream.get());
801
802 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26803 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56804 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56805 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50806 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:42807 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]eed749f92013-12-23 18:57:38808 EXPECT_TRUE(stream2.get());
809
bnc912a04b2016-04-20 14:19:50810 EXPECT_EQ(GetActiveSession(server1), GetActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:38811
rch37de576c2015-05-17 20:28:17812 EXPECT_TRUE(socket_data.AllReadDataConsumed());
813 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38814}
815
jri584002d12014-09-09 00:51:28816TEST_P(QuicStreamFactoryTest, NoHttpsPoolingIfDisabled) {
jri7046038f2015-10-22 00:29:26817 disable_connection_pooling_ = true;
818 Initialize();
819
mmenke651bae7f2015-12-18 21:26:45820 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
821 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
822 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28823 socket_factory_.AddSocketDataProvider(&socket_data1);
824 socket_factory_.AddSocketDataProvider(&socket_data2);
jri584002d12014-09-09 00:51:28825
rch6faa4d42016-01-05 20:48:43826 HostPortPair server1(kDefaultServerHostName, 443);
827 HostPortPair server2(kServer2HostName, 443);
jri584002d12014-09-09 00:51:28828
bncf8bf0722015-05-19 20:04:13829 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01830 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rch6faa4d42016-01-05 20:48:43831 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28832
833 host_resolver_.set_synchronous_mode(true);
834 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
835 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
836
jri7046038f2015-10-22 00:29:26837 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56838 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56839 /*cert_verify_flags=*/0, url_, "GET", net_log_,
840 callback_.callback()));
danakjad1777e2016-04-16 00:56:42841 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri584002d12014-09-09 00:51:28842 EXPECT_TRUE(stream.get());
843
844 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26845 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56846 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56847 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50848 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:42849 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jri584002d12014-09-09 00:51:28850 EXPECT_TRUE(stream2.get());
851
bnc912a04b2016-04-20 14:19:50852 EXPECT_NE(GetActiveSession(server1), GetActiveSession(server2));
jri584002d12014-09-09 00:51:28853
rch37de576c2015-05-17 20:28:17854 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
855 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
856 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
857 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28858}
859
bnccb7ff3c2015-05-21 20:51:55860class QuicAlternativeServiceCertificateValidationPooling
861 : public QuicStreamFactoryTest {
862 public:
863 void Run(bool valid) {
mmenke651bae7f2015-12-18 21:26:45864 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
865 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
bnccb7ff3c2015-05-21 20:51:55866 socket_factory_.AddSocketDataProvider(&socket_data1);
[email protected]eed749f92013-12-23 18:57:38867
rch6faa4d42016-01-05 20:48:43868 HostPortPair server1(kDefaultServerHostName, 443);
869 HostPortPair server2(kServer2HostName, 443);
[email protected]eed749f92013-12-23 18:57:38870
ckrasic3865ee0f2016-02-29 22:04:56871 GURL url(valid ? url2_ : GURL("http://invalid.example.com/"));
rch6faa4d42016-01-05 20:48:43872 HostPortPair alternative(kDefaultServerHostName, 443);
[email protected]eed749f92013-12-23 18:57:38873
bnccb7ff3c2015-05-21 20:51:55874 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
875 bool common_name_fallback_used;
876 EXPECT_EQ(valid,
877 verify_details.cert_verify_result.verified_cert->VerifyNameMatch(
ckrasic3865ee0f2016-02-29 22:04:56878 url.host(), &common_name_fallback_used));
bnccb7ff3c2015-05-21 20:51:55879 EXPECT_TRUE(
880 verify_details.cert_verify_result.verified_cert->VerifyNameMatch(
881 alternative.host(), &common_name_fallback_used));
882 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38883
bnccb7ff3c2015-05-21 20:51:55884 host_resolver_.set_synchronous_mode(true);
885 host_resolver_.rules()->AddIPLiteralRule(alternative.host(), "192.168.0.1",
886 "");
[email protected]eed749f92013-12-23 18:57:38887
bnccb7ff3c2015-05-21 20:51:55888 // Open first stream to alternative.
jri7046038f2015-10-22 00:29:26889 QuicStreamRequest request1(factory_.get());
rchf114d982015-10-21 01:34:56890 EXPECT_EQ(OK, request1.Request(alternative, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56891 /*cert_verify_flags=*/0, url_, "GET",
892 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:42893 std::unique_ptr<QuicHttpStream> stream1 = request1.CreateStream();
bnccb7ff3c2015-05-21 20:51:55894 EXPECT_TRUE(stream1.get());
[email protected]eed749f92013-12-23 18:57:38895
jri7046038f2015-10-22 00:29:26896 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56897 int rv = request2.Request(alternative, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56898 /*cert_verify_flags=*/0, url, "GET", net_log_,
899 callback_.callback());
bnccb7ff3c2015-05-21 20:51:55900 if (valid) {
901 // Alternative service of origin to |alternative| should pool to session
902 // of |stream1| even if origin is different. Since only one
903 // SocketDataProvider is set up, the second request succeeding means that
904 // it pooled to the session opened by the first one.
905 EXPECT_EQ(OK, rv);
danakjad1777e2016-04-16 00:56:42906 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
bnccb7ff3c2015-05-21 20:51:55907 EXPECT_TRUE(stream2.get());
908 } else {
909 EXPECT_EQ(ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN, rv);
910 }
[email protected]eed749f92013-12-23 18:57:38911
bnccb7ff3c2015-05-21 20:51:55912 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
913 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
914 }
915};
916
917INSTANTIATE_TEST_CASE_P(Version,
918 QuicAlternativeServiceCertificateValidationPooling,
919 ::testing::ValuesIn(GetTestParams()));
920
921TEST_P(QuicAlternativeServiceCertificateValidationPooling, Valid) {
jri7046038f2015-10-22 00:29:26922 Initialize();
bnccb7ff3c2015-05-21 20:51:55923 Run(true);
924}
925
926TEST_P(QuicAlternativeServiceCertificateValidationPooling, Invalid) {
jri7046038f2015-10-22 00:29:26927 Initialize();
bnccb7ff3c2015-05-21 20:51:55928 Run(false);
[email protected]eed749f92013-12-23 18:57:38929}
930
[email protected]5db452202014-08-19 05:22:15931TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
jri7046038f2015-10-22 00:29:26932 Initialize();
mmenke651bae7f2015-12-18 21:26:45933 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
934 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15935 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]5db452202014-08-19 05:22:15936
rch6faa4d42016-01-05 20:48:43937 HostPortPair server1(kDefaultServerHostName, 443);
938 HostPortPair server2(kServer2HostName, 443);
Avi Drissman13fc8932015-12-20 04:40:46939 uint8_t primary_pin = 1;
940 uint8_t backup_pin = 2;
rch6faa4d42016-01-05 20:48:43941 test::AddPin(&transport_security_state_, kServer2HostName, primary_pin,
[email protected]5db452202014-08-19 05:22:15942 backup_pin);
943
bncf8bf0722015-05-19 20:04:13944 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
[email protected]5db452202014-08-19 05:22:15945 verify_details.cert_verify_result.public_key_hashes.push_back(
946 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01947 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]5db452202014-08-19 05:22:15948
949 host_resolver_.set_synchronous_mode(true);
950 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
951 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
952
jri7046038f2015-10-22 00:29:26953 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56954 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56955 /*cert_verify_flags=*/0, url_, "GET", net_log_,
956 callback_.callback()));
danakjad1777e2016-04-16 00:56:42957 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]5db452202014-08-19 05:22:15958 EXPECT_TRUE(stream.get());
959
960 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26961 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56962 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56963 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50964 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:42965 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]5db452202014-08-19 05:22:15966 EXPECT_TRUE(stream2.get());
967
bnc912a04b2016-04-20 14:19:50968 EXPECT_EQ(GetActiveSession(server1), GetActiveSession(server2));
[email protected]5db452202014-08-19 05:22:15969
rch37de576c2015-05-17 20:28:17970 EXPECT_TRUE(socket_data.AllReadDataConsumed());
971 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:15972}
973
jri584002d12014-09-09 00:51:28974TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithMatchingPinsIfDisabled) {
jri7046038f2015-10-22 00:29:26975 disable_connection_pooling_ = true;
976 Initialize();
977
mmenke651bae7f2015-12-18 21:26:45978 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
979 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
980 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28981 socket_factory_.AddSocketDataProvider(&socket_data1);
982 socket_factory_.AddSocketDataProvider(&socket_data2);
jri584002d12014-09-09 00:51:28983
rch6faa4d42016-01-05 20:48:43984 HostPortPair server1(kDefaultServerHostName, 443);
985 HostPortPair server2(kServer2HostName, 443);
Avi Drissman13fc8932015-12-20 04:40:46986 uint8_t primary_pin = 1;
987 uint8_t backup_pin = 2;
rch6faa4d42016-01-05 20:48:43988 test::AddPin(&transport_security_state_, kServer2HostName, primary_pin,
jri584002d12014-09-09 00:51:28989 backup_pin);
990
bncf8bf0722015-05-19 20:04:13991 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
jri584002d12014-09-09 00:51:28992 verify_details.cert_verify_result.public_key_hashes.push_back(
993 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01994 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rch6faa4d42016-01-05 20:48:43995 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28996
997 host_resolver_.set_synchronous_mode(true);
998 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
999 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1000
jri7046038f2015-10-22 00:29:261001 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561002 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561003 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1004 callback_.callback()));
danakjad1777e2016-04-16 00:56:421005 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri584002d12014-09-09 00:51:281006 EXPECT_TRUE(stream.get());
1007
1008 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:261009 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:561010 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561011 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:501012 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:421013 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jri584002d12014-09-09 00:51:281014 EXPECT_TRUE(stream2.get());
1015
bnc912a04b2016-04-20 14:19:501016 EXPECT_NE(GetActiveSession(server1), GetActiveSession(server2));
jri584002d12014-09-09 00:51:281017
rch37de576c2015-05-17 20:28:171018 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1019 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1020 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1021 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:281022}
1023
[email protected]5db452202014-08-19 05:22:151024TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
jri7046038f2015-10-22 00:29:261025 Initialize();
mmenke651bae7f2015-12-18 21:26:451026 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1027 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
1028 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:151029 socket_factory_.AddSocketDataProvider(&socket_data1);
1030 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]5db452202014-08-19 05:22:151031
rch6faa4d42016-01-05 20:48:431032 HostPortPair server1(kDefaultServerHostName, 443);
1033 HostPortPair server2(kServer2HostName, 443);
Avi Drissman13fc8932015-12-20 04:40:461034 uint8_t primary_pin = 1;
1035 uint8_t backup_pin = 2;
1036 uint8_t bad_pin = 3;
rch6faa4d42016-01-05 20:48:431037 test::AddPin(&transport_security_state_, kServer2HostName, primary_pin,
[email protected]5db452202014-08-19 05:22:151038 backup_pin);
1039
bncf8bf0722015-05-19 20:04:131040 ProofVerifyDetailsChromium verify_details1 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011041 verify_details1.cert_verify_result.public_key_hashes.push_back(
1042 test::GetTestHashValue(bad_pin));
1043 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
1044
bncf8bf0722015-05-19 20:04:131045 ProofVerifyDetailsChromium verify_details2 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011046 verify_details2.cert_verify_result.public_key_hashes.push_back(
1047 test::GetTestHashValue(primary_pin));
1048 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
[email protected]5db452202014-08-19 05:22:151049
1050 host_resolver_.set_synchronous_mode(true);
1051 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1052 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1053
jri7046038f2015-10-22 00:29:261054 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561055 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561056 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1057 callback_.callback()));
danakjad1777e2016-04-16 00:56:421058 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]5db452202014-08-19 05:22:151059 EXPECT_TRUE(stream.get());
1060
1061 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:261062 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:561063 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561064 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:501065 net_log_, callback_.callback()));
danakjad1777e2016-04-16 00:56:421066 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]5db452202014-08-19 05:22:151067 EXPECT_TRUE(stream2.get());
1068
bnc912a04b2016-04-20 14:19:501069 EXPECT_NE(GetActiveSession(server1), GetActiveSession(server2));
[email protected]5db452202014-08-19 05:22:151070
rch37de576c2015-05-17 20:28:171071 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1072 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1073 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1074 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:151075}
1076
[email protected]1e960032013-12-20 19:00:201077TEST_P(QuicStreamFactoryTest, Goaway) {
jri7046038f2015-10-22 00:29:261078 Initialize();
rch6faa4d42016-01-05 20:48:431079 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1080 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1081 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1082
mmenke651bae7f2015-12-18 21:26:451083 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1084 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271085 socket_factory_.AddSocketDataProvider(&socket_data);
mmenke651bae7f2015-12-18 21:26:451086 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271087 socket_factory_.AddSocketDataProvider(&socket_data2);
1088
jri7046038f2015-10-22 00:29:261089 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591090 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561091 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561092 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1093 callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271094
1095 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421096 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]4d283b32013-10-17 12:57:271097 EXPECT_TRUE(stream.get());
1098
1099 // Mark the session as going away. Ensure that while it is still alive
1100 // that it is no longer active.
bnc912a04b2016-04-20 14:19:501101 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7046038f2015-10-22 00:29:261102 factory_->OnSessionGoingAway(session);
1103 EXPECT_EQ(true,
1104 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
bnc912a04b2016-04-20 14:19:501105 EXPECT_FALSE(HasActiveSession(host_port_pair_));
bnccb7ff3c2015-05-21 20:51:551106 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]4d283b32013-10-17 12:57:271107
1108 // Create a new request for the same destination and verify that a
1109 // new session is created.
jri7046038f2015-10-22 00:29:261110 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591111 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561112 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561113 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1114 callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271115 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421116 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
[email protected]4d283b32013-10-17 12:57:271117 EXPECT_TRUE(stream2.get());
1118
bnc912a04b2016-04-20 14:19:501119 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1120 EXPECT_NE(session, GetActiveSession(host_port_pair_));
jri7046038f2015-10-22 00:29:261121 EXPECT_EQ(true,
1122 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
[email protected]4d283b32013-10-17 12:57:271123
1124 stream2.reset();
1125 stream.reset();
1126
rch37de576c2015-05-17 20:28:171127 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1128 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1129 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1130 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]4d283b32013-10-17 12:57:271131}
1132
[email protected]1e960032013-12-20 19:00:201133TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
jri7046038f2015-10-22 00:29:261134 Initialize();
rch6faa4d42016-01-05 20:48:431135 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1136 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1137
[email protected]66ae5962014-05-22 11:13:051138 QuicStreamId stream_id = kClientDataStreamId1;
danakjad1777e2016-04-16 00:56:421139 std::unique_ptr<QuicEncryptedPacket> client_rst(
[email protected]1e960032013-12-20 19:00:201140 maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
[email protected]06ff5152013-08-29 01:03:051141 MockWrite writes[] = {
ckrasicea295fe2015-10-31 05:03:271142 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 0),
1143 };
danakjad1777e2016-04-16 00:56:421144 std::unique_ptr<QuicEncryptedPacket> server_rst(
ckrasicea295fe2015-10-31 05:03:271145 maker_.MakeRstPacket(1, false, stream_id, QUIC_STREAM_CANCELLED));
1146 MockRead reads[] = {
1147 MockRead(ASYNC, server_rst->data(), server_rst->length(), 1),
mmenke651bae7f2015-12-18 21:26:451148 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
1149 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1150 arraysize(writes));
[email protected]0b2294d32013-08-02 00:46:361151 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0b2294d32013-08-02 00:46:361152
1153 HttpRequestInfo request_info;
1154 std::vector<QuicHttpStream*> streams;
1155 // The MockCryptoClientStream sets max_open_streams to be
rtenneti6a4cf3b2015-01-09 03:41:151156 // kDefaultMaxStreamsPerConnection / 2.
1157 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection / 2; i++) {
jri7046038f2015-10-22 00:29:261158 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561159 int rv = request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561160 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1161 callback_.callback());
[email protected]0b2294d32013-08-02 00:46:361162 if (i == 0) {
1163 EXPECT_EQ(ERR_IO_PENDING, rv);
1164 EXPECT_EQ(OK, callback_.WaitForResult());
1165 } else {
1166 EXPECT_EQ(OK, rv);
1167 }
danakjad1777e2016-04-16 00:56:421168 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]0b2294d32013-08-02 00:46:361169 EXPECT_TRUE(stream);
rjshaded5ced072015-12-18 19:26:021170 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1171 net_log_, CompletionCallback()));
[email protected]0b2294d32013-08-02 00:46:361172 streams.push_back(stream.release());
1173 }
1174
jri7046038f2015-10-22 00:29:261175 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561176 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561177 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1178 CompletionCallback()));
danakjad1777e2016-04-16 00:56:421179 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]0b2294d32013-08-02 00:46:361180 EXPECT_TRUE(stream);
rjshaded5ced072015-12-18 19:26:021181 EXPECT_EQ(ERR_IO_PENDING,
1182 stream->InitializeStream(&request_info, DEFAULT_PRIORITY, net_log_,
1183 callback_.callback()));
[email protected]0b2294d32013-08-02 00:46:361184
1185 // Close the first stream.
1186 streams.front()->Close(false);
ckrasicea295fe2015-10-31 05:03:271187 // Trigger exchange of RSTs that in turn allow progress for the last
1188 // stream.
[email protected]0b2294d32013-08-02 00:46:361189 EXPECT_EQ(OK, callback_.WaitForResult());
1190
rch37de576c2015-05-17 20:28:171191 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1192 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
ckrasicea295fe2015-10-31 05:03:271193
1194 // Force close of the connection to suppress the generation of RST
1195 // packets when streams are torn down, which wouldn't be relevant to
1196 // this test anyway.
bnc912a04b2016-04-20 14:19:501197 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri78ec06a2016-03-31 18:19:401198 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
1199 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasicea295fe2015-10-31 05:03:271200
[email protected]0b2294d32013-08-02 00:46:361201 STLDeleteElements(&streams);
1202}
1203
[email protected]1e960032013-12-20 19:00:201204TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
jri7046038f2015-10-22 00:29:261205 Initialize();
mmenke651bae7f2015-12-18 21:26:451206 SequencedSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321207 socket_factory_.AddSocketDataProvider(&socket_data);
1208
[email protected]3c772402013-12-18 21:38:111209 host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName);
[email protected]e13201d82012-12-12 05:00:321210
jri7046038f2015-10-22 00:29:261211 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591212 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561213 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561214 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1215 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321216
1217 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
1218
rch37de576c2015-05-17 20:28:171219 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1220 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321221}
1222
[email protected]1e960032013-12-20 19:00:201223TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
jri7046038f2015-10-22 00:29:261224 Initialize();
[email protected]3c772402013-12-18 21:38:111225 MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
mmenke651bae7f2015-12-18 21:26:451226 SequencedSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]3c772402013-12-18 21:38:111227 socket_data.set_connect_data(connect);
1228 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]3c772402013-12-18 21:38:111229
jri7046038f2015-10-22 00:29:261230 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591231 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561232 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561233 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1234 callback_.callback()));
[email protected]3c772402013-12-18 21:38:111235
1236 EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult());
1237
rch37de576c2015-05-17 20:28:171238 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1239 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:111240}
1241
[email protected]1e960032013-12-20 19:00:201242TEST_P(QuicStreamFactoryTest, CancelCreate) {
jri7046038f2015-10-22 00:29:261243 Initialize();
mmenke651bae7f2015-12-18 21:26:451244 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1245 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321246 socket_factory_.AddSocketDataProvider(&socket_data);
1247 {
jri7046038f2015-10-22 00:29:261248 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591249 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561250 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561251 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1252 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321253 }
1254
mmenke651bae7f2015-12-18 21:26:451255 base::RunLoop().RunUntilIdle();
[email protected]e13201d82012-12-12 05:00:321256
danakjad1777e2016-04-16 00:56:421257 std::unique_ptr<QuicHttpStream> stream(CreateFromSession(host_port_pair_));
[email protected]e13201d82012-12-12 05:00:321258 EXPECT_TRUE(stream.get());
1259 stream.reset();
1260
rch37de576c2015-05-17 20:28:171261 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1262 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321263}
1264
[email protected]1e960032013-12-20 19:00:201265TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) {
jri7046038f2015-10-22 00:29:261266 Initialize();
rch6faa4d42016-01-05 20:48:431267 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1268 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1269 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1270 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261271
[email protected]3c772402013-12-18 21:38:111272 // Sequentially connect to the default host, then another host, and then the
1273 // default host. Verify that the default host gets a consistent ephemeral
1274 // port, that is different from the other host's connection.
1275
rch6faa4d42016-01-05 20:48:431276 std::string other_server_name = kServer2HostName;
[email protected]3c772402013-12-18 21:38:111277 EXPECT_NE(kDefaultServerHostName, other_server_name);
1278 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort);
[email protected]3c772402013-12-18 21:38:111279
[email protected]bf4ea2f2014-03-10 22:57:531280 int original_port = GetSourcePortForNewSession(host_port_pair_);
1281 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2));
1282 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]3c772402013-12-18 21:38:111283}
1284
[email protected]d8e2abf82014-03-06 10:30:101285TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) {
jri7046038f2015-10-22 00:29:261286 Initialize();
rch6faa4d42016-01-05 20:48:431287 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1288 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1289 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1290 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261291
[email protected]d8e2abf82014-03-06 10:30:101292 // Get a session to the host using the port suggester.
rjshaded5ced072015-12-18 19:26:021293 int original_port = GetSourcePortForNewSessionAndGoAway(host_port_pair_);
[email protected]d8e2abf82014-03-06 10:30:101294 // Verify that the port is different after the goaway.
[email protected]bf4ea2f2014-03-10 22:57:531295 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101296 // Since the previous session did not goaway we should see the original port.
[email protected]bf4ea2f2014-03-10 22:57:531297 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101298}
1299
[email protected]1e960032013-12-20 19:00:201300TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
jri7046038f2015-10-22 00:29:261301 Initialize();
rch6faa4d42016-01-05 20:48:431302 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1303 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1304 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1305
mmenke651bae7f2015-12-18 21:26:451306 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421307 std::unique_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
[email protected]459a7402014-02-10 12:58:521308 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311309 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:451310 SequencedSocketData socket_data(reads, arraysize(reads),
1311 writes.empty() ? nullptr : &writes[0],
1312 writes.size());
[email protected]56dfb902013-01-03 23:17:551313 socket_factory_.AddSocketDataProvider(&socket_data);
1314
mmenke651bae7f2015-12-18 21:26:451315 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1316 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]56dfb902013-01-03 23:17:551317 socket_factory_.AddSocketDataProvider(&socket_data2);
1318
jri7046038f2015-10-22 00:29:261319 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591320 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561321 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561322 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1323 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551324
1325 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421326 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]0b2294d32013-08-02 00:46:361327 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:021328 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]0b2294d32013-08-02 00:46:361329 net_log_, CompletionCallback()));
[email protected]56dfb902013-01-03 23:17:551330
1331 // Close the session and verify that stream saw the error.
jri7e636642016-01-14 06:57:081332 factory_->CloseAllSessions(ERR_INTERNET_DISCONNECTED, QUIC_INTERNAL_ERROR);
[email protected]56dfb902013-01-03 23:17:551333 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1334 stream->ReadResponseHeaders(callback_.callback()));
1335
1336 // Now attempting to request a stream to the same origin should create
1337 // a new session.
1338
jri7046038f2015-10-22 00:29:261339 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591340 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561341 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561342 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1343 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551344
1345 EXPECT_EQ(OK, callback_.WaitForResult());
xunjieli2608f9b2016-03-14 13:39:231346 stream = request2.CreateStream();
[email protected]56dfb902013-01-03 23:17:551347 stream.reset(); // Will reset stream 3.
1348
rch37de576c2015-05-17 20:28:171349 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1350 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1351 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1352 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]56dfb902013-01-03 23:17:551353}
1354
[email protected]1e960032013-12-20 19:00:201355TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
jri8c44d692015-10-23 23:53:411356 close_sessions_on_ip_change_ = true;
jri7046038f2015-10-22 00:29:261357 Initialize();
rch6faa4d42016-01-05 20:48:431358 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1359 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1360 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri8c44d692015-10-23 23:53:411361
mmenke651bae7f2015-12-18 21:26:451362 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421363 std::unique_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
[email protected]459a7402014-02-10 12:58:521364 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311365 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:451366 SequencedSocketData socket_data(reads, arraysize(reads),
1367 writes.empty() ? nullptr : &writes[0],
1368 writes.size());
[email protected]f698a012013-05-06 20:18:591369 socket_factory_.AddSocketDataProvider(&socket_data);
1370
mmenke651bae7f2015-12-18 21:26:451371 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1372 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]f698a012013-05-06 20:18:591373 socket_factory_.AddSocketDataProvider(&socket_data2);
1374
jri7046038f2015-10-22 00:29:261375 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591376 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561377 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561378 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1379 callback_.callback()));
[email protected]f698a012013-05-06 20:18:591380
1381 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421382 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]0b2294d32013-08-02 00:46:361383 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:021384 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]0b2294d32013-08-02 00:46:361385 net_log_, CompletionCallback()));
[email protected]f698a012013-05-06 20:18:591386
1387 // Change the IP address and verify that stream saw the error.
jri8c44d692015-10-23 23:53:411388 NotifyIPAddressChanged();
[email protected]f698a012013-05-06 20:18:591389 EXPECT_EQ(ERR_NETWORK_CHANGED,
1390 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:261391 EXPECT_TRUE(factory_->require_confirmation());
[email protected]f698a012013-05-06 20:18:591392
1393 // Now attempting to request a stream to the same origin should create
1394 // a new session.
1395
jri7046038f2015-10-22 00:29:261396 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591397 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561398 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561399 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1400 callback_.callback()));
[email protected]f698a012013-05-06 20:18:591401
1402 EXPECT_EQ(OK, callback_.WaitForResult());
xunjieli2608f9b2016-03-14 13:39:231403 stream = request2.CreateStream();
[email protected]f698a012013-05-06 20:18:591404 stream.reset(); // Will reset stream 3.
1405
rch37de576c2015-05-17 20:28:171406 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1407 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1408 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1409 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]f698a012013-05-06 20:18:591410}
1411
jri7e636642016-01-14 06:57:081412TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnect) {
1413 InitializeConnectionMigrationTest(
1414 {kDefaultNetworkForTests, kNewNetworkForTests});
1415 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1416 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1417 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1418
1419 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421420 std::unique_ptr<QuicEncryptedPacket> request_packet(
jri7e636642016-01-14 06:57:081421 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true));
1422 MockWrite writes[] = {MockWrite(SYNCHRONOUS, request_packet->data(),
1423 request_packet->length(), 1)};
1424 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1425 arraysize(writes));
1426 socket_factory_.AddSocketDataProvider(&socket_data);
1427
1428 // Create request and QuicHttpStream.
1429 QuicStreamRequest request(factory_.get());
1430 EXPECT_EQ(ERR_IO_PENDING,
1431 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561432 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1433 callback_.callback()));
jri7e636642016-01-14 06:57:081434 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421435 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081436 EXPECT_TRUE(stream.get());
1437
1438 // Cause QUIC stream to be created.
1439 HttpRequestInfo request_info;
1440 request_info.method = "GET";
1441 request_info.url = GURL("https://www.example.org/");
1442 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1443 net_log_, CompletionCallback()));
1444
1445 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501446 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:081447 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1448 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1449
1450 // Send GET request on stream.
1451 HttpResponseInfo response;
1452 HttpRequestHeaders request_headers;
1453 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
1454 callback_.callback()));
1455
1456 // Set up second socket data provider that is used after migration.
1457 // The response to the earlier request is read on this new socket.
danakjad1777e2016-04-16 00:56:421458 std::unique_ptr<QuicEncryptedPacket> ping(
jri7e636642016-01-14 06:57:081459 maker_.MakePingPacket(2, /*include_version=*/true));
1460 MockWrite writes1[] = {
1461 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 0)};
danakjad1777e2016-04-16 00:56:421462 std::unique_ptr<QuicEncryptedPacket> response_headers_packet(
jri7e636642016-01-14 06:57:081463 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
1464 MockRead reads1[] = {MockRead(ASYNC, response_headers_packet->data(),
1465 response_headers_packet->length(), 1),
1466 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
1467 SequencedSocketData socket_data1(reads1, arraysize(reads1), writes1,
1468 arraysize(writes1));
1469 socket_factory_.AddSocketDataProvider(&socket_data1);
1470
1471 // Trigger connection migration. This should cause a PING frame
1472 // to be emitted.
1473 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1474 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1475
1476 // The session should now be marked as going away. Ensure that
1477 // while it is still alive, it is no longer active.
1478 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1479 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1480 EXPECT_EQ(1u, session->GetNumActiveStreams());
1481
1482 // Verify that response headers on the migrated socket were delivered to the
1483 // stream.
1484 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
1485 EXPECT_EQ(200, response.headers->response_code());
1486
1487 // Create a new request for the same destination and verify that a
1488 // new session is created.
1489 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1490 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1491 socket_factory_.AddSocketDataProvider(&socket_data2);
1492
1493 QuicStreamRequest request2(factory_.get());
1494 EXPECT_EQ(ERR_IO_PENDING,
1495 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561496 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1497 callback_.callback()));
jri7e636642016-01-14 06:57:081498 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421499 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jri7e636642016-01-14 06:57:081500 EXPECT_TRUE(stream2.get());
1501
bnc912a04b2016-04-20 14:19:501502 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1503 QuicChromiumClientSession* new_session = GetActiveSession(host_port_pair_);
jrid36ada62016-02-06 02:42:081504 EXPECT_NE(session, new_session);
jri7e636642016-01-14 06:57:081505
jrid36ada62016-02-06 02:42:081506 // On a DISCONNECTED notification, nothing happens to the migrated
1507 // session, but the new session is closed since it has no open
1508 // streams.
jri7e636642016-01-14 06:57:081509 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1510 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1511 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1512 EXPECT_EQ(1u, session->GetNumActiveStreams());
jrid36ada62016-02-06 02:42:081513 EXPECT_FALSE(
1514 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), new_session));
jri7e636642016-01-14 06:57:081515
1516 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1517 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1518 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1519 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1520 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1521 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1522}
1523
1524TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnected) {
1525 InitializeConnectionMigrationTest(
1526 {kDefaultNetworkForTests, kNewNetworkForTests});
1527 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1528 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1529 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1530
1531 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421532 std::unique_ptr<QuicEncryptedPacket> request_packet(
jri7e636642016-01-14 06:57:081533 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true));
1534 MockWrite writes[] = {MockWrite(SYNCHRONOUS, request_packet->data(),
1535 request_packet->length(), 1)};
1536 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1537 arraysize(writes));
1538 socket_factory_.AddSocketDataProvider(&socket_data);
1539
1540 // Create request and QuicHttpStream.
1541 QuicStreamRequest request(factory_.get());
1542 EXPECT_EQ(ERR_IO_PENDING,
1543 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561544 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1545 callback_.callback()));
jri7e636642016-01-14 06:57:081546 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421547 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081548 EXPECT_TRUE(stream.get());
1549
1550 // Cause QUIC stream to be created.
1551 HttpRequestInfo request_info;
1552 request_info.method = "GET";
1553 request_info.url = GURL("https://www.example.org/");
1554 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1555 net_log_, CompletionCallback()));
1556
1557 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501558 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:081559 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1560 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1561
1562 // Send GET request on stream.
1563 HttpResponseInfo response_info;
1564 HttpRequestHeaders request_headers;
1565 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response_info,
1566 callback_.callback()));
1567
1568 // Set up second socket data provider that is used after migration.
danakjad1777e2016-04-16 00:56:421569 std::unique_ptr<QuicEncryptedPacket> ping(
jri7e636642016-01-14 06:57:081570 maker_.MakePingPacket(2, /*include_version=*/true));
danakjad1777e2016-04-16 00:56:421571 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri7e636642016-01-14 06:57:081572 3, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1573 MockWrite writes1[] = {
1574 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 0)};
danakjad1777e2016-04-16 00:56:421575 std::unique_ptr<QuicEncryptedPacket> response_packet(
jri7e636642016-01-14 06:57:081576 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
1577 MockRead reads1[] = {
1578 MockRead(ASYNC, response_packet->data(), response_packet->length(), 1),
1579 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
1580 SequencedSocketData socket_data1(reads1, arraysize(reads1), writes1,
1581 arraysize(writes1));
1582 socket_factory_.AddSocketDataProvider(&socket_data1);
1583
1584 // Trigger connection migration. This should cause a PING frame
1585 // to be emitted.
1586 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1587 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1588
1589 // The session should now be marked as going away. Ensure that
1590 // while it is still alive, it is no longer active.
1591 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1592 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1593 EXPECT_EQ(1u, session->GetNumActiveStreams());
1594
1595 // Create a new request for the same destination and verify that a
1596 // new session is created.
1597 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1598 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1599 socket_factory_.AddSocketDataProvider(&socket_data2);
1600
1601 QuicStreamRequest request2(factory_.get());
1602 EXPECT_EQ(ERR_IO_PENDING,
1603 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561604 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1605 callback_.callback()));
jri7e636642016-01-14 06:57:081606 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421607 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jri7e636642016-01-14 06:57:081608 EXPECT_TRUE(stream2.get());
1609
bnc912a04b2016-04-20 14:19:501610 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1611 EXPECT_NE(session, GetActiveSession(host_port_pair_));
jri7e636642016-01-14 06:57:081612 EXPECT_EQ(true,
1613 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1614
1615 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1616 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1617 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1618 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1619 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1620 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1621}
1622
1623TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoNetworks) {
1624 NetworkChangeNotifier::NetworkList no_networks(0);
1625 InitializeConnectionMigrationTest(no_networks);
1626 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1627 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1628
1629 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421630 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri7e636642016-01-14 06:57:081631 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1632 MockWrite writes[] = {
1633 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1634 };
1635 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1636 arraysize(writes));
1637 socket_factory_.AddSocketDataProvider(&socket_data);
1638
1639 // Create request and QuicHttpStream.
1640 QuicStreamRequest request(factory_.get());
1641 EXPECT_EQ(ERR_IO_PENDING,
1642 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561643 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1644 callback_.callback()));
jri7e636642016-01-14 06:57:081645 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421646 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081647 EXPECT_TRUE(stream.get());
1648
1649 // Cause QUIC stream to be created.
1650 HttpRequestInfo request_info;
1651 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1652 net_log_, CompletionCallback()));
1653
1654 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501655 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:081656 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1657 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1658 EXPECT_EQ(1u, session->GetNumActiveStreams());
1659
1660 // Trigger connection migration. Since there are no networks
1661 // to migrate to, this should cause the session to continue on the same
1662 // socket, but be marked as going away.
1663 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1664 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1665
1666 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1667 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1668 EXPECT_EQ(1u, session->GetNumActiveStreams());
1669
1670 stream.reset();
1671
1672 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1673 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1674}
1675
1676TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoNetworks) {
1677 NetworkChangeNotifier::NetworkList no_networks(0);
1678 InitializeConnectionMigrationTest(no_networks);
1679 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1680 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1681
1682 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421683 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri7e636642016-01-14 06:57:081684 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1685 MockWrite writes[] = {
1686 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
1687 };
1688 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1689 arraysize(writes));
1690 socket_factory_.AddSocketDataProvider(&socket_data);
1691
1692 // Create request and QuicHttpStream.
1693 QuicStreamRequest request(factory_.get());
1694 EXPECT_EQ(ERR_IO_PENDING,
1695 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561696 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1697 callback_.callback()));
jri7e636642016-01-14 06:57:081698 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421699 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081700 EXPECT_TRUE(stream.get());
1701
1702 // Cause QUIC stream to be created.
1703 HttpRequestInfo request_info;
1704 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1705 net_log_, CompletionCallback()));
1706
1707 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501708 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:081709 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1710 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1711
1712 // Trigger connection migration. Since there are no networks
1713 // to migrate to, this should cause a RST_STREAM frame to be emitted
1714 // and the session to be closed.
1715 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1716 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1717
1718 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1719 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1720
1721 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1722 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1723}
1724
1725TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoNewNetwork) {
1726 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
1727 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1728 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1729
1730 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421731 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri7e636642016-01-14 06:57:081732 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1733 MockWrite writes[] = {
1734 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1735 };
1736 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1737 arraysize(writes));
1738 socket_factory_.AddSocketDataProvider(&socket_data);
1739
1740 // Create request and QuicHttpStream.
1741 QuicStreamRequest request(factory_.get());
1742 EXPECT_EQ(ERR_IO_PENDING,
1743 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561744 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1745 callback_.callback()));
jri7e636642016-01-14 06:57:081746 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421747 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081748 EXPECT_TRUE(stream.get());
1749
1750 // Cause QUIC stream to be created.
1751 HttpRequestInfo request_info;
1752 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1753 net_log_, CompletionCallback()));
1754
1755 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501756 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:081757 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1758 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1759
1760 // Trigger connection migration. Since there are no networks
1761 // to migrate to, this should cause session to be continue but be marked as
1762 // going away.
1763 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1764 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1765
1766 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1767 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1768 EXPECT_EQ(1u, session->GetNumActiveStreams());
1769
1770 stream.reset();
1771
1772 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1773 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1774}
1775
1776TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoNewNetwork) {
1777 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
1778 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1779 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1780
1781 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421782 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri7e636642016-01-14 06:57:081783 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1784 MockWrite writes[] = {
1785 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
1786 };
1787 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1788 arraysize(writes));
1789 socket_factory_.AddSocketDataProvider(&socket_data);
1790
1791 // Create request and QuicHttpStream.
1792 QuicStreamRequest request(factory_.get());
1793 EXPECT_EQ(ERR_IO_PENDING,
1794 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561795 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1796 callback_.callback()));
jri7e636642016-01-14 06:57:081797 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421798 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:081799 EXPECT_TRUE(stream.get());
1800
1801 // Cause QUIC stream to be created.
1802 HttpRequestInfo request_info;
1803 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1804 net_log_, CompletionCallback()));
1805
1806 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501807 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:081808 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1809 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1810
1811 // Trigger connection migration. Since there are no networks
1812 // to migrate to, this should cause a RST_STREAM frame to be emitted
1813 // with QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed.
1814 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1815 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1816
1817 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1818 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1819
1820 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1821 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1822}
1823
jri231c2972016-03-08 19:50:111824TEST_P(QuicStreamFactoryTest,
1825 OnNetworkChangeSoonToDisconnectNonMigratableStream) {
1826 InitializeConnectionMigrationTest(
1827 {kDefaultNetworkForTests, kNewNetworkForTests});
1828 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1829 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1830
1831 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421832 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri231c2972016-03-08 19:50:111833 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1834 MockWrite writes[] = {
1835 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1836 };
1837 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1838 arraysize(writes));
1839 socket_factory_.AddSocketDataProvider(&socket_data);
1840
1841 // Create request and QuicHttpStream.
1842 QuicStreamRequest request(factory_.get());
1843 EXPECT_EQ(ERR_IO_PENDING,
1844 request.Request(host_port_pair_, privacy_mode_,
1845 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1846 callback_.callback()));
1847 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421848 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri231c2972016-03-08 19:50:111849 EXPECT_TRUE(stream.get());
1850
1851 // Cause QUIC stream to be created, but marked as non-migratable.
1852 HttpRequestInfo request_info;
1853 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION;
1854 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1855 net_log_, CompletionCallback()));
1856
1857 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501858 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:111859 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1860 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1861
1862 // Trigger connection migration. Since there is a non-migratable stream,
1863 // this should cause session to continue but be marked as going away.
1864 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1865 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1866
1867 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1868 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1869 EXPECT_EQ(1u, session->GetNumActiveStreams());
1870
1871 stream.reset();
1872
1873 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1874 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1875}
1876
jri9c541572016-03-29 17:51:481877TEST_P(QuicStreamFactoryTest,
1878 OnNetworkChangeSoonToDisconnectConnectionMigrationDisabled) {
1879 InitializeConnectionMigrationTest(
1880 {kDefaultNetworkForTests, kNewNetworkForTests});
1881 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1882 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1883
1884 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421885 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri9c541572016-03-29 17:51:481886 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1887 MockWrite writes[] = {
1888 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1889 };
1890 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1891 arraysize(writes));
1892 socket_factory_.AddSocketDataProvider(&socket_data);
1893
1894 // Create request and QuicHttpStream.
1895 QuicStreamRequest request(factory_.get());
1896 EXPECT_EQ(ERR_IO_PENDING,
1897 request.Request(host_port_pair_, privacy_mode_,
1898 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1899 callback_.callback()));
1900 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421901 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri9c541572016-03-29 17:51:481902 EXPECT_TRUE(stream.get());
1903
1904 // Cause QUIC stream to be created.
1905 HttpRequestInfo request_info;
1906 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1907 net_log_, CompletionCallback()));
1908
1909 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501910 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:481911 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1912 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1913
1914 // Set session config to have connection migration disabled.
1915 QuicConfigPeer::SetReceivedDisableConnectionMigration(session->config());
1916 EXPECT_TRUE(session->config()->DisableConnectionMigration());
1917
1918 // Trigger connection migration. Since there is a non-migratable stream,
1919 // this should cause session to continue but be marked as going away.
1920 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1921 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1922
1923 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1924 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1925 EXPECT_EQ(1u, session->GetNumActiveStreams());
1926
1927 stream.reset();
1928
1929 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1930 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1931}
1932
jri231c2972016-03-08 19:50:111933TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNonMigratableStream) {
1934 InitializeConnectionMigrationTest(
1935 {kDefaultNetworkForTests, kNewNetworkForTests});
1936 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1937 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1938
1939 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421940 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri231c2972016-03-08 19:50:111941 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1942 MockWrite writes[] = {
1943 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
1944 };
1945 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1946 arraysize(writes));
1947 socket_factory_.AddSocketDataProvider(&socket_data);
1948
1949 // Create request and QuicHttpStream.
1950 QuicStreamRequest request(factory_.get());
1951 EXPECT_EQ(ERR_IO_PENDING,
1952 request.Request(host_port_pair_, privacy_mode_,
1953 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1954 callback_.callback()));
1955 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:421956 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri231c2972016-03-08 19:50:111957 EXPECT_TRUE(stream.get());
1958
1959 // Cause QUIC stream to be created, but marked as non-migratable.
1960 HttpRequestInfo request_info;
1961 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION;
1962 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1963 net_log_, CompletionCallback()));
1964
1965 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:501966 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:111967 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1968 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1969
1970 // Trigger connection migration. Since there is a non-migratable stream,
1971 // this should cause a RST_STREAM frame to be emitted with
1972 // QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed.
1973 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1974 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1975
1976 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1977 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1978
1979 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1980 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1981}
1982
jri9c541572016-03-29 17:51:481983TEST_P(QuicStreamFactoryTest,
1984 OnNetworkChangeDisconnectedConnectionMigrationDisabled) {
1985 InitializeConnectionMigrationTest(
1986 {kDefaultNetworkForTests, kNewNetworkForTests});
1987 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1988 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1989
1990 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:421991 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri9c541572016-03-29 17:51:481992 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1993 MockWrite writes[] = {
1994 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
1995 };
1996 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1997 arraysize(writes));
1998 socket_factory_.AddSocketDataProvider(&socket_data);
1999
2000 // Create request and QuicHttpStream.
2001 QuicStreamRequest request(factory_.get());
2002 EXPECT_EQ(ERR_IO_PENDING,
2003 request.Request(host_port_pair_, privacy_mode_,
2004 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2005 callback_.callback()));
2006 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422007 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri9c541572016-03-29 17:51:482008 EXPECT_TRUE(stream.get());
2009
2010 // Cause QUIC stream to be created.
2011 HttpRequestInfo request_info;
2012 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2013 net_log_, CompletionCallback()));
2014
2015 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502016 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:482017 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2018 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2019
2020 // Set session config to have connection migration disabled.
2021 QuicConfigPeer::SetReceivedDisableConnectionMigration(session->config());
2022 EXPECT_TRUE(session->config()->DisableConnectionMigration());
2023
2024 // Trigger connection migration. Since there is a non-migratable stream,
2025 // this should cause a RST_STREAM frame to be emitted with
2026 // QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed.
2027 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2028 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2029
2030 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2031 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2032
2033 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2034 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2035}
2036
jri7e636642016-01-14 06:57:082037TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoOpenStreams) {
2038 InitializeConnectionMigrationTest(
2039 {kDefaultNetworkForTests, kNewNetworkForTests});
2040 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2041 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2042
2043 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2044 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0u);
2045 socket_factory_.AddSocketDataProvider(&socket_data);
2046
2047 // Create request and QuicHttpStream.
2048 QuicStreamRequest request(factory_.get());
2049 EXPECT_EQ(ERR_IO_PENDING,
2050 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562051 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2052 callback_.callback()));
jri7e636642016-01-14 06:57:082053 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422054 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:082055 EXPECT_TRUE(stream.get());
2056
2057 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502058 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:082059 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2060 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2061
2062 // Trigger connection migration. Since there are no active streams,
2063 // the session will be closed.
2064 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2065 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2066
2067 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2068 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2069
2070 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2071 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2072}
2073
2074TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoOpenStreams) {
2075 InitializeConnectionMigrationTest(
2076 {kDefaultNetworkForTests, kNewNetworkForTests});
2077 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2078 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2079
2080 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2081 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0u);
2082 socket_factory_.AddSocketDataProvider(&socket_data);
2083
2084 // Create request and QuicHttpStream.
2085 QuicStreamRequest request(factory_.get());
2086 EXPECT_EQ(ERR_IO_PENDING,
2087 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562088 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2089 callback_.callback()));
jri7e636642016-01-14 06:57:082090 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422091 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri7e636642016-01-14 06:57:082092 EXPECT_TRUE(stream.get());
2093
2094 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502095 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:082096 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2097 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2098
2099 // Trigger connection migration. Since there are no active streams,
2100 // the session will be closed.
2101 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2102 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2103
2104 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2105 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2106
2107 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2108 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2109}
2110
jrid36ada62016-02-06 02:42:082111TEST_P(QuicStreamFactoryTest, MigrateSessionEarly) {
2112 InitializeConnectionMigrationTest(
2113 {kDefaultNetworkForTests, kNewNetworkForTests});
2114 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2115 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2116 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2117
2118 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:422119 std::unique_ptr<QuicEncryptedPacket> request_packet(
jrid36ada62016-02-06 02:42:082120 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true));
2121 MockWrite writes[] = {MockWrite(SYNCHRONOUS, request_packet->data(),
2122 request_packet->length(), 1)};
2123 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2124 arraysize(writes));
2125 socket_factory_.AddSocketDataProvider(&socket_data);
2126
2127 // Create request and QuicHttpStream.
2128 QuicStreamRequest request(factory_.get());
2129 EXPECT_EQ(ERR_IO_PENDING,
2130 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562131 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2132 callback_.callback()));
jrid36ada62016-02-06 02:42:082133 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422134 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jrid36ada62016-02-06 02:42:082135 EXPECT_TRUE(stream.get());
2136
2137 // Cause QUIC stream to be created.
2138 HttpRequestInfo request_info;
2139 request_info.method = "GET";
2140 request_info.url = GURL("https://www.example.org/");
2141 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2142 net_log_, CompletionCallback()));
2143
2144 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502145 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jrid36ada62016-02-06 02:42:082146 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2147 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2148
2149 // Send GET request on stream.
2150 HttpResponseInfo response;
2151 HttpRequestHeaders request_headers;
2152 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2153 callback_.callback()));
2154
2155 // Set up second socket data provider that is used after migration.
2156 // The response to the earlier request is read on this new socket.
danakjad1777e2016-04-16 00:56:422157 std::unique_ptr<QuicEncryptedPacket> ping(
jrid36ada62016-02-06 02:42:082158 maker_.MakePingPacket(2, /*include_version=*/true));
2159 MockWrite writes1[] = {
2160 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 0)};
danakjad1777e2016-04-16 00:56:422161 std::unique_ptr<QuicEncryptedPacket> response_headers_packet(
jrid36ada62016-02-06 02:42:082162 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
2163 MockRead reads1[] = {MockRead(ASYNC, response_headers_packet->data(),
2164 response_headers_packet->length(), 1),
2165 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
2166 SequencedSocketData socket_data1(reads1, arraysize(reads1), writes1,
2167 arraysize(writes1));
2168 socket_factory_.AddSocketDataProvider(&socket_data1);
2169
2170 // Trigger early connection migration. This should cause a PING frame
2171 // to be emitted.
2172 session->OnPathDegrading();
2173
2174 // Run the message loop so that data queued in the new socket is read by the
2175 // packet reader.
2176 base::RunLoop().RunUntilIdle();
2177
2178 // The session should now be marked as going away. Ensure that
2179 // while it is still alive, it is no longer active.
2180 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2181 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2182 EXPECT_EQ(1u, session->GetNumActiveStreams());
2183
2184 // Verify that response headers on the migrated socket were delivered to the
2185 // stream.
2186 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
2187 EXPECT_EQ(200, response.headers->response_code());
2188
2189 // Create a new request for the same destination and verify that a
2190 // new session is created.
2191 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2192 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
2193 socket_factory_.AddSocketDataProvider(&socket_data2);
2194
2195 QuicStreamRequest request2(factory_.get());
2196 EXPECT_EQ(ERR_IO_PENDING,
2197 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562198 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2199 callback_.callback()));
jrid36ada62016-02-06 02:42:082200 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422201 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
jrid36ada62016-02-06 02:42:082202 EXPECT_TRUE(stream2.get());
2203
bnc912a04b2016-04-20 14:19:502204 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2205 QuicChromiumClientSession* new_session = GetActiveSession(host_port_pair_);
jrid36ada62016-02-06 02:42:082206 EXPECT_NE(session, new_session);
2207
2208 // On a SOON_TO_DISCONNECT notification, nothing happens to the
2209 // migrated session, but the new session is closed since it has no
2210 // open streams.
2211 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2212 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
2213 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2214 EXPECT_EQ(1u, session->GetNumActiveStreams());
2215 EXPECT_FALSE(
2216 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), new_session));
2217
2218 // On a DISCONNECTED notification, nothing happens to the migrated session.
2219 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2220 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2221 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2222 EXPECT_EQ(1u, session->GetNumActiveStreams());
2223
2224 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2225 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2226 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
2227 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
2228 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2229 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2230}
2231
2232TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyNoNewNetwork) {
2233 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
2234 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2235 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2236
2237 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:422238 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jrid36ada62016-02-06 02:42:082239 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
2240 MockWrite writes[] = {
2241 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
2242 };
2243 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2244 arraysize(writes));
2245 socket_factory_.AddSocketDataProvider(&socket_data);
2246
2247 // Create request and QuicHttpStream.
2248 QuicStreamRequest request(factory_.get());
2249 EXPECT_EQ(ERR_IO_PENDING,
2250 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562251 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2252 callback_.callback()));
jrid36ada62016-02-06 02:42:082253 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422254 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jrid36ada62016-02-06 02:42:082255 EXPECT_TRUE(stream.get());
2256
2257 // Cause QUIC stream to be created.
2258 HttpRequestInfo request_info;
2259 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2260 net_log_, CompletionCallback()));
2261
2262 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502263 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jrid36ada62016-02-06 02:42:082264 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2265 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2266
2267 // Trigger connection migration. Since there are no networks
2268 // to migrate to, this should cause session to be continue but be marked as
2269 // going away.
2270 session->OnPathDegrading();
2271
2272 // Run the message loop so that data queued in the new socket is read by the
2273 // packet reader.
2274 base::RunLoop().RunUntilIdle();
2275
2276 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2277 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2278 EXPECT_EQ(1u, session->GetNumActiveStreams());
2279
2280 stream.reset();
2281
2282 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2283 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2284}
2285
jri231c2972016-03-08 19:50:112286TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyNonMigratableStream) {
2287 InitializeConnectionMigrationTest(
2288 {kDefaultNetworkForTests, kNewNetworkForTests});
2289 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2290 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2291
2292 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:422293 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri231c2972016-03-08 19:50:112294 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
2295 MockWrite writes[] = {
2296 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
2297 };
2298 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2299 arraysize(writes));
2300 socket_factory_.AddSocketDataProvider(&socket_data);
2301
2302 // Create request and QuicHttpStream.
2303 QuicStreamRequest request(factory_.get());
2304 EXPECT_EQ(ERR_IO_PENDING,
2305 request.Request(host_port_pair_, privacy_mode_,
2306 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2307 callback_.callback()));
2308 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422309 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri231c2972016-03-08 19:50:112310 EXPECT_TRUE(stream.get());
2311
2312 // Cause QUIC stream to be created, but marked as non-migratable.
2313 HttpRequestInfo request_info;
2314 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION;
2315 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2316 net_log_, CompletionCallback()));
2317
2318 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502319 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:112320 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2321 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2322
2323 // Trigger connection migration. Since there is a non-migratable stream,
2324 // this should cause session to be continue without migrating.
2325 session->OnPathDegrading();
2326
2327 // Run the message loop so that data queued in the new socket is read by the
2328 // packet reader.
2329 base::RunLoop().RunUntilIdle();
2330
2331 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2332 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2333 EXPECT_EQ(1u, session->GetNumActiveStreams());
2334
2335 stream.reset();
2336
2337 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2338 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2339}
2340
jri9c541572016-03-29 17:51:482341TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyConnectionMigrationDisabled) {
2342 InitializeConnectionMigrationTest(
2343 {kDefaultNetworkForTests, kNewNetworkForTests});
2344 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2345 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2346
2347 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:422348 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
jri9c541572016-03-29 17:51:482349 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
2350 MockWrite writes[] = {
2351 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
2352 };
2353 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2354 arraysize(writes));
2355 socket_factory_.AddSocketDataProvider(&socket_data);
2356
2357 // Create request and QuicHttpStream.
2358 QuicStreamRequest request(factory_.get());
2359 EXPECT_EQ(ERR_IO_PENDING,
2360 request.Request(host_port_pair_, privacy_mode_,
2361 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2362 callback_.callback()));
2363 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422364 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
jri9c541572016-03-29 17:51:482365 EXPECT_TRUE(stream.get());
2366
2367 // Cause QUIC stream to be created.
2368 HttpRequestInfo request_info;
2369 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2370 net_log_, CompletionCallback()));
2371
2372 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502373 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:482374 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2375 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2376
2377 // Set session config to have connection migration disabled.
2378 QuicConfigPeer::SetReceivedDisableConnectionMigration(session->config());
2379 EXPECT_TRUE(session->config()->DisableConnectionMigration());
2380
2381 // Trigger connection migration. Since there is a non-migratable stream,
2382 // this should cause session to be continue without migrating.
2383 session->OnPathDegrading();
2384
2385 // Run the message loop so that data queued in the new socket is read by the
2386 // packet reader.
2387 base::RunLoop().RunUntilIdle();
2388
2389 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2390 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2391 EXPECT_EQ(1u, session->GetNumActiveStreams());
2392
2393 stream.reset();
2394
2395 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2396 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2397}
2398
rch02d87792015-09-09 09:05:532399TEST_P(QuicStreamFactoryTest, OnSSLConfigChanged) {
jri7046038f2015-10-22 00:29:262400 Initialize();
rch6faa4d42016-01-05 20:48:432401 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2402 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2403 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2404
mmenke651bae7f2015-12-18 21:26:452405 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:422406 std::unique_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
rch02d87792015-09-09 09:05:532407 std::vector<MockWrite> writes;
2408 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:452409 SequencedSocketData socket_data(reads, arraysize(reads),
2410 writes.empty() ? nullptr : &writes[0],
2411 writes.size());
rch02d87792015-09-09 09:05:532412 socket_factory_.AddSocketDataProvider(&socket_data);
rch02d87792015-09-09 09:05:532413
mmenke651bae7f2015-12-18 21:26:452414 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2415 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
rch02d87792015-09-09 09:05:532416 socket_factory_.AddSocketDataProvider(&socket_data2);
rch02d87792015-09-09 09:05:532417
jri7046038f2015-10-22 00:29:262418 QuicStreamRequest request(factory_.get());
rch02d87792015-09-09 09:05:532419 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562420 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562421 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2422 callback_.callback()));
rch02d87792015-09-09 09:05:532423
2424 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422425 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rch02d87792015-09-09 09:05:532426 HttpRequestInfo request_info;
2427 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2428 net_log_, CompletionCallback()));
2429
jri7046038f2015-10-22 00:29:262430 factory_->OnSSLConfigChanged();
rch02d87792015-09-09 09:05:532431 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
2432 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262433 EXPECT_FALSE(factory_->require_confirmation());
rch02d87792015-09-09 09:05:532434
2435 // Now attempting to request a stream to the same origin should create
2436 // a new session.
2437
jri7046038f2015-10-22 00:29:262438 QuicStreamRequest request2(factory_.get());
rch02d87792015-09-09 09:05:532439 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562440 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562441 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2442 callback_.callback()));
rch02d87792015-09-09 09:05:532443
2444 EXPECT_EQ(OK, callback_.WaitForResult());
xunjieli2608f9b2016-03-14 13:39:232445 stream = request2.CreateStream();
rch02d87792015-09-09 09:05:532446 stream.reset(); // Will reset stream 3.
2447
2448 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2449 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2450 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2451 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2452}
2453
[email protected]1e960032013-12-20 19:00:202454TEST_P(QuicStreamFactoryTest, OnCertAdded) {
jri7046038f2015-10-22 00:29:262455 Initialize();
rch6faa4d42016-01-05 20:48:432456 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2457 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2458 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2459
mmenke651bae7f2015-12-18 21:26:452460 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:422461 std::unique_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
[email protected]459a7402014-02-10 12:58:522462 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:312463 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:452464 SequencedSocketData socket_data(reads, arraysize(reads),
2465 writes.empty() ? nullptr : &writes[0],
2466 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:092467 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]d7d1e50b2013-11-25 22:08:092468
mmenke651bae7f2015-12-18 21:26:452469 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2470 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:092471 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]d7d1e50b2013-11-25 22:08:092472
jri7046038f2015-10-22 00:29:262473 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:592474 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562475 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562476 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2477 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092478
2479 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422480 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]d7d1e50b2013-11-25 22:08:092481 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:022482 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]d7d1e50b2013-11-25 22:08:092483 net_log_, CompletionCallback()));
2484
2485 // Add a cert and verify that stream saw the event.
jri7046038f2015-10-22 00:29:262486 factory_->OnCertAdded(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:092487 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
2488 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262489 EXPECT_FALSE(factory_->require_confirmation());
[email protected]d7d1e50b2013-11-25 22:08:092490
2491 // Now attempting to request a stream to the same origin should create
2492 // a new session.
2493
jri7046038f2015-10-22 00:29:262494 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:592495 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562496 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562497 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2498 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092499
2500 EXPECT_EQ(OK, callback_.WaitForResult());
xunjieli2608f9b2016-03-14 13:39:232501 stream = request2.CreateStream();
[email protected]d7d1e50b2013-11-25 22:08:092502 stream.reset(); // Will reset stream 3.
2503
rch37de576c2015-05-17 20:28:172504 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2505 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2506 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2507 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:092508}
2509
[email protected]1e960032013-12-20 19:00:202510TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
jri7046038f2015-10-22 00:29:262511 Initialize();
rch6faa4d42016-01-05 20:48:432512 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2513 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2514 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2515
mmenke651bae7f2015-12-18 21:26:452516 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
danakjad1777e2016-04-16 00:56:422517 std::unique_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
[email protected]459a7402014-02-10 12:58:522518 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:312519 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:452520 SequencedSocketData socket_data(reads, arraysize(reads),
2521 writes.empty() ? nullptr : &writes[0],
2522 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:092523 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]d7d1e50b2013-11-25 22:08:092524
mmenke651bae7f2015-12-18 21:26:452525 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2526 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:092527 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]d7d1e50b2013-11-25 22:08:092528
jri7046038f2015-10-22 00:29:262529 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:592530 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562531 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562532 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2533 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092534
2535 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:422536 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
[email protected]d7d1e50b2013-11-25 22:08:092537 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:022538 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]d7d1e50b2013-11-25 22:08:092539 net_log_, CompletionCallback()));
2540
2541 // Change the CA cert and verify that stream saw the event.
jri7046038f2015-10-22 00:29:262542 factory_->OnCACertChanged(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:092543 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
2544 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262545 EXPECT_FALSE(factory_->require_confirmation());
[email protected]d7d1e50b2013-11-25 22:08:092546
2547 // Now attempting to request a stream to the same origin should create
2548 // a new session.
2549
jri7046038f2015-10-22 00:29:262550 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:592551 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562552 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562553 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2554 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092555
2556 EXPECT_EQ(OK, callback_.WaitForResult());
xunjieli2608f9b2016-03-14 13:39:232557 stream = request2.CreateStream();
[email protected]d7d1e50b2013-11-25 22:08:092558 stream.reset(); // Will reset stream 3.
2559
rch37de576c2015-05-17 20:28:172560 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2561 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2562 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2563 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:092564}
2565
[email protected]1e960032013-12-20 19:00:202566TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
jri7046038f2015-10-22 00:29:262567 Initialize();
rch6faa4d42016-01-05 20:48:432568
[email protected]6e12d702013-11-13 00:17:172569 vector<string> cannoncial_suffixes;
2570 cannoncial_suffixes.push_back(string(".c.youtube.com"));
2571 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]c49ff182013-09-28 08:33:262572
[email protected]6e12d702013-11-13 00:17:172573 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
2574 string r1_host_name("r1");
2575 string r2_host_name("r2");
2576 r1_host_name.append(cannoncial_suffixes[i]);
2577 r2_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:142578
[email protected]bf4ea2f2014-03-10 22:57:532579 HostPortPair host_port_pair1(r1_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:122580 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:262581 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rch1fe2eeb2015-10-26 14:45:572582 QuicServerId server_id1(host_port_pair1, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172583 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:372584 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:172585 EXPECT_FALSE(cached1->proof_valid());
2586 EXPECT_TRUE(cached1->source_address_token().empty());
2587
2588 // Mutate the cached1 to have different data.
2589 // TODO(rtenneti): mutate other members of CachedState.
2590 cached1->set_source_address_token(r1_host_name);
2591 cached1->SetProofValid();
2592
[email protected]bf4ea2f2014-03-10 22:57:532593 HostPortPair host_port_pair2(r2_host_name, 80);
rch1fe2eeb2015-10-26 14:45:572594 QuicServerId server_id2(host_port_pair2, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172595 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:372596 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:172597 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
2598 EXPECT_TRUE(cached2->proof_valid());
2599 }
[email protected]b70fdb792013-10-25 19:04:142600}
2601
[email protected]1e960032013-12-20 19:00:202602TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
jri7046038f2015-10-22 00:29:262603 Initialize();
[email protected]6e12d702013-11-13 00:17:172604 vector<string> cannoncial_suffixes;
2605 cannoncial_suffixes.push_back(string(".c.youtube.com"));
2606 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]b70fdb792013-10-25 19:04:142607
[email protected]6e12d702013-11-13 00:17:172608 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
2609 string r3_host_name("r3");
2610 string r4_host_name("r4");
2611 r3_host_name.append(cannoncial_suffixes[i]);
2612 r4_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:142613
[email protected]bf4ea2f2014-03-10 22:57:532614 HostPortPair host_port_pair1(r3_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:122615 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:262616 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rch1fe2eeb2015-10-26 14:45:572617 QuicServerId server_id1(host_port_pair1, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172618 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:372619 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:172620 EXPECT_FALSE(cached1->proof_valid());
2621 EXPECT_TRUE(cached1->source_address_token().empty());
2622
2623 // Mutate the cached1 to have different data.
2624 // TODO(rtenneti): mutate other members of CachedState.
2625 cached1->set_source_address_token(r3_host_name);
2626 cached1->SetProofInvalid();
2627
[email protected]bf4ea2f2014-03-10 22:57:532628 HostPortPair host_port_pair2(r4_host_name, 80);
rch1fe2eeb2015-10-26 14:45:572629 QuicServerId server_id2(host_port_pair2, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172630 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:372631 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:172632 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
2633 EXPECT_TRUE(cached2->source_address_token().empty());
2634 EXPECT_FALSE(cached2->proof_valid());
2635 }
[email protected]c49ff182013-09-28 08:33:262636}
2637
rtenneti14abd312015-02-06 21:56:012638TEST_P(QuicStreamFactoryTest, RacingConnections) {
jri7046038f2015-10-22 00:29:262639 disable_disk_cache_ = false;
2640 Initialize();
rch6faa4d42016-01-05 20:48:432641 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2642 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:262643
rtenneti14abd312015-02-06 21:56:012644 if (!GetParam().enable_connection_racing)
2645 return;
jri7046038f2015-10-22 00:29:262646
2647 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneticcab42b2015-10-09 06:38:162648
mmenke651bae7f2015-12-18 21:26:452649 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2650 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti14abd312015-02-06 21:56:012651 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti14abd312015-02-06 21:56:012652
mmenke651bae7f2015-12-18 21:26:452653 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2654 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
rtenneti14abd312015-02-06 21:56:012655 socket_factory_.AddSocketDataProvider(&socket_data2);
rtenneti14abd312015-02-06 21:56:012656
rtenneticcab42b2015-10-09 06:38:162657 const AlternativeService alternative_service1(QUIC, host_port_pair_.host(),
2658 host_port_pair_.port());
2659 AlternativeServiceInfoVector alternative_service_info_vector;
2660 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
2661 alternative_service_info_vector.push_back(
rchdc7b9052016-03-17 20:51:502662 AlternativeServiceInfo(alternative_service1, expiration));
rtenneticcab42b2015-10-09 06:38:162663
2664 http_server_properties_.SetAlternativeServices(
2665 host_port_pair_, alternative_service_info_vector);
2666
rtenneti14abd312015-02-06 21:56:012667 crypto_client_stream_factory_.set_handshake_mode(
2668 MockCryptoClientStream::ZERO_RTT);
2669 host_resolver_.set_synchronous_mode(true);
2670 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2671 "192.168.0.1", "");
2672
jri7046038f2015-10-22 00:29:262673 QuicStreamRequest request(factory_.get());
rch1fe2eeb2015-10-26 14:45:572674 QuicServerId server_id(host_port_pair_, privacy_mode_);
rtenneti14abd312015-02-06 21:56:012675 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562676 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562677 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2678 callback_.callback()));
jri7046038f2015-10-22 00:29:262679 EXPECT_EQ(2u, QuicStreamFactoryPeer::GetNumberOfActiveJobs(factory_.get(),
2680 server_id));
rtenneti14abd312015-02-06 21:56:012681
2682 runner_->RunNextTask();
2683
danakjad1777e2016-04-16 00:56:422684 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rtenneti14abd312015-02-06 21:56:012685 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:172686 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2687 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
jri7046038f2015-10-22 00:29:262688 EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumberOfActiveJobs(factory_.get(),
2689 server_id));
rtenneti14abd312015-02-06 21:56:012690}
2691
rtenneti34dffe752015-02-24 23:27:322692TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) {
jri7046038f2015-10-22 00:29:262693 disable_disk_cache_ = true;
2694 Initialize();
rch6faa4d42016-01-05 20:48:432695 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2696 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2697
jri7046038f2015-10-22 00:29:262698 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti34dffe752015-02-24 23:27:322699
mmenke651bae7f2015-12-18 21:26:452700 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2701 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti34dffe752015-02-24 23:27:322702 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti34dffe752015-02-24 23:27:322703
2704 crypto_client_stream_factory_.set_handshake_mode(
2705 MockCryptoClientStream::ZERO_RTT);
2706 host_resolver_.set_synchronous_mode(true);
2707 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2708 "192.168.0.1", "");
2709
jri7046038f2015-10-22 00:29:262710 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562711 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562712 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2713 callback_.callback()));
rtenneti34dffe752015-02-24 23:27:322714
2715 // If we are waiting for disk cache, we would have posted a task. Verify that
2716 // the CancelWaitForDataReady task hasn't been posted.
2717 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
2718
danakjad1777e2016-04-16 00:56:422719 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rtenneti34dffe752015-02-24 23:27:322720 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:172721 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2722 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti34dffe752015-02-24 23:27:322723}
2724
rtenneti85dcfac22015-03-27 20:22:192725TEST_P(QuicStreamFactoryTest, BadPacketLoss) {
jri7046038f2015-10-22 00:29:262726 disable_disk_cache_ = false;
2727 max_number_of_lossy_connections_ = 2;
2728 Initialize();
rch6faa4d42016-01-05 20:48:432729 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2730 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2731 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2732 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2733 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2734
jri7046038f2015-10-22 00:29:262735 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2736
2737 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2738 host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192739 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262740 factory_.get(), host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192741
mmenke651bae7f2015-12-18 21:26:452742 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2743 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:192744 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti85dcfac22015-03-27 20:22:192745
mmenke651bae7f2015-12-18 21:26:452746 SequencedSocketData socket_data2(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:192747 socket_factory_.AddSocketDataProvider(&socket_data2);
rtenneti85dcfac22015-03-27 20:22:192748
mmenke651bae7f2015-12-18 21:26:452749 SequencedSocketData socket_data3(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:192750 socket_factory_.AddSocketDataProvider(&socket_data3);
rtenneti85dcfac22015-03-27 20:22:192751
mmenke651bae7f2015-12-18 21:26:452752 SequencedSocketData socket_data4(nullptr, 0, nullptr, 0);
rtenneti97137a92015-06-18 06:00:312753 socket_factory_.AddSocketDataProvider(&socket_data4);
rtenneti97137a92015-06-18 06:00:312754
rch6faa4d42016-01-05 20:48:432755 HostPortPair server2(kServer2HostName, kDefaultServerPort);
2756 HostPortPair server3(kServer3HostName, kDefaultServerPort);
2757 HostPortPair server4(kServer4HostName, kDefaultServerPort);
rtenneti85dcfac22015-03-27 20:22:192758
2759 crypto_client_stream_factory_.set_handshake_mode(
2760 MockCryptoClientStream::ZERO_RTT);
2761 host_resolver_.set_synchronous_mode(true);
2762 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2763 "192.168.0.1", "");
2764 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2765 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
rtenneti97137a92015-06-18 06:00:312766 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
rtenneti85dcfac22015-03-27 20:22:192767
jri7046038f2015-10-22 00:29:262768 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562769 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562770 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2771 callback_.callback()));
rtenneti85dcfac22015-03-27 20:22:192772
bnc912a04b2016-04-20 14:19:502773 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
rtenneti85dcfac22015-03-27 20:22:192774
2775 DVLOG(1) << "Create 1st session and test packet loss";
2776
2777 // Set packet_loss_rate to a lower value than packet_loss_threshold.
2778 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262779 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/0.9f));
rtenneti41633b1f2015-04-05 18:19:532780 EXPECT_TRUE(session->connection()->connected());
bnc912a04b2016-04-20 14:19:502781 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri7046038f2015-10-22 00:29:262782 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2783 host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192784 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262785 factory_.get(), host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192786
2787 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:312788 // and that shouldn't close the session and it shouldn't disable QUIC.
2789 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262790 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:192791 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262792 factory_.get(), host_port_pair_.port()));
rtenneti97137a92015-06-18 06:00:312793 EXPECT_TRUE(session->connection()->connected());
jri7046038f2015-10-22 00:29:262794 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2795 host_port_pair_.port()));
bnc912a04b2016-04-20 14:19:502796 EXPECT_TRUE(HasActiveSession(host_port_pair_));
rtenneti85dcfac22015-03-27 20:22:192797
2798 // Test N-in-a-row high packet loss connections.
2799
2800 DVLOG(1) << "Create 2nd session and test packet loss";
2801
2802 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262803 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562804 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562805 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2806 callback2.callback()));
bnc912a04b2016-04-20 14:19:502807 QuicChromiumClientSession* session2 = GetActiveSession(server2);
rtenneti85dcfac22015-03-27 20:22:192808
2809 // If there is no packet loss during handshake confirmation, number of lossy
2810 // connections for the port should be 0.
2811 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262812 factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:192813 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262814 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/0.9f));
rtenneti85dcfac22015-03-27 20:22:192815 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262816 factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:192817 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262818 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:192819
2820 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:312821 // and that shouldn't close the session and it shouldn't disable QUIC.
2822 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262823 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:192824 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262825 factory_.get(), server2.port()));
rtenneti97137a92015-06-18 06:00:312826 EXPECT_TRUE(session2->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:192827 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262828 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
bnc912a04b2016-04-20 14:19:502829 EXPECT_TRUE(HasActiveSession(server2));
rtenneti85dcfac22015-03-27 20:22:192830
2831 DVLOG(1) << "Create 3rd session which also has packet loss";
2832
2833 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:262834 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:562835 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562836 /*cert_verify_flags=*/0, url3_, "GET",
rtennetia75df622015-06-21 23:59:502837 net_log_, callback3.callback()));
bnc912a04b2016-04-20 14:19:502838 QuicChromiumClientSession* session3 = GetActiveSession(server3);
rtenneti85dcfac22015-03-27 20:22:192839
rtenneti97137a92015-06-18 06:00:312840 DVLOG(1) << "Create 4th session with packet loss and test IsQuicDisabled()";
2841 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:262842 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:562843 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562844 /*cert_verify_flags=*/0, url4_, "GET",
rtennetia75df622015-06-21 23:59:502845 net_log_, callback4.callback()));
bnc912a04b2016-04-20 14:19:502846 QuicChromiumClientSession* session4 = GetActiveSession(server4);
rtenneti97137a92015-06-18 06:00:312847
rtenneti85dcfac22015-03-27 20:22:192848 // Set packet_loss_rate to higher value than packet_loss_threshold 2nd time in
2849 // a row and that should close the session and disable QUIC.
2850 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:262851 factory_->OnHandshakeConfirmed(session3, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:192852 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262853 factory_.get(), server3.port()));
rtenneti97137a92015-06-18 06:00:312854 EXPECT_FALSE(session3->connection()->connected());
jri7046038f2015-10-22 00:29:262855 EXPECT_TRUE(
2856 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server3.port()));
bnc912a04b2016-04-20 14:19:502857 EXPECT_FALSE(HasActiveSession(server3));
bnccb7ff3c2015-05-21 20:51:552858 EXPECT_FALSE(HasActiveSession(server3));
rtenneti85dcfac22015-03-27 20:22:192859
rtenneti97137a92015-06-18 06:00:312860 // Set packet_loss_rate to higher value than packet_loss_threshold 3rd time in
2861 // a row and IsQuicDisabled() should close the session.
2862 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:262863 factory_->OnHandshakeConfirmed(session4, /*packet_loss_rate=*/1.0f));
rtenneti97137a92015-06-18 06:00:312864 EXPECT_EQ(3, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262865 factory_.get(), server4.port()));
rtenneti97137a92015-06-18 06:00:312866 EXPECT_FALSE(session4->connection()->connected());
jri7046038f2015-10-22 00:29:262867 EXPECT_TRUE(
2868 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server4.port()));
bnc912a04b2016-04-20 14:19:502869 EXPECT_FALSE(HasActiveSession(server4));
rtenneti97137a92015-06-18 06:00:312870 EXPECT_FALSE(HasActiveSession(server4));
2871
danakjad1777e2016-04-16 00:56:422872 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rtenneti85dcfac22015-03-27 20:22:192873 EXPECT_TRUE(stream.get());
danakjad1777e2016-04-16 00:56:422874 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
rtenneti85dcfac22015-03-27 20:22:192875 EXPECT_TRUE(stream2.get());
danakjad1777e2016-04-16 00:56:422876 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
rtenneti85dcfac22015-03-27 20:22:192877 EXPECT_TRUE(stream3.get());
danakjad1777e2016-04-16 00:56:422878 std::unique_ptr<QuicHttpStream> stream4 = request4.CreateStream();
rtenneti97137a92015-06-18 06:00:312879 EXPECT_TRUE(stream4.get());
rch37de576c2015-05-17 20:28:172880 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2881 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2882 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2883 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2884 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2885 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
rtenneti97137a92015-06-18 06:00:312886 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
2887 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
rtenneti85dcfac22015-03-27 20:22:192888}
2889
ckrasic1e53b642015-07-08 22:39:352890TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfTwo) {
jri7046038f2015-10-22 00:29:262891 disable_disk_cache_ = false;
2892 threshold_public_resets_post_handshake_ = 2;
2893 Initialize();
rch6faa4d42016-01-05 20:48:432894 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2895 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2896 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:262897 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2898
2899 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2900 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352901 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262902 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352903
mmenke651bae7f2015-12-18 21:26:452904 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2905 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352906 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:352907
mmenke651bae7f2015-12-18 21:26:452908 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352909 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:352910
rch6faa4d42016-01-05 20:48:432911 HostPortPair server2(kServer2HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:352912
2913 crypto_client_stream_factory_.set_handshake_mode(
2914 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2915 host_resolver_.set_synchronous_mode(true);
2916 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2917 "192.168.0.1", "");
2918 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2919
jri7046038f2015-10-22 00:29:262920 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562921 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562922 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2923 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:352924
bnc912a04b2016-04-20 14:19:502925 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352926
2927 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
jri78ec06a2016-03-31 18:19:402928 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
2929 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:352930 // Need to spin the loop now to ensure that
2931 // QuicStreamFactory::OnSessionClosed() runs.
2932 base::RunLoop run_loop;
2933 run_loop.RunUntilIdle();
2934
jri7046038f2015-10-22 00:29:262935 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2936 factory_.get()));
2937 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2938 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352939
2940 // Test two-in-a-row public reset post handshakes..
2941 DVLOG(1) << "Create 2nd session and trigger public reset post handshake";
2942 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262943 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562944 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562945 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:352946 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:502947 QuicChromiumClientSession* session2 = GetActiveSession(server2);
ckrasic1e53b642015-07-08 22:39:352948
jri78ec06a2016-03-31 18:19:402949 session2->connection()->CloseConnection(
2950 QUIC_PUBLIC_RESET, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:352951 // Need to spin the loop now to ensure that
2952 // QuicStreamFactory::OnSessionClosed() runs.
2953 base::RunLoop run_loop2;
2954 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262955 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2956 factory_.get()));
2957 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2958 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:162959 EXPECT_EQ(
2960 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
jri7046038f2015-10-22 00:29:262961 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352962
danakjad1777e2016-04-16 00:56:422963 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
xunjieli2608f9b2016-03-14 13:39:232964 EXPECT_FALSE(stream.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:422965 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
xunjieli2608f9b2016-03-14 13:39:232966 EXPECT_FALSE(stream2.get()); // Session is already closed.
ckrasic1e53b642015-07-08 22:39:352967 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2968 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2969 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2970 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2971}
2972
2973TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfTwo) {
jri7046038f2015-10-22 00:29:262974 disable_disk_cache_ = true;
2975 threshold_timeouts_with_open_streams_ = 2;
2976 Initialize();
rch6faa4d42016-01-05 20:48:432977 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2978 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2979 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:262980
2981 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2982 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2983 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352984 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262985 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352986
mmenke651bae7f2015-12-18 21:26:452987 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2988 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352989 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:352990
mmenke651bae7f2015-12-18 21:26:452991 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352992 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:352993
rch6faa4d42016-01-05 20:48:432994 HostPortPair server2(kServer2HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:352995
2996 crypto_client_stream_factory_.set_handshake_mode(
2997 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2998 host_resolver_.set_synchronous_mode(true);
2999 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3000 "192.168.0.1", "");
3001 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3002
jri7046038f2015-10-22 00:29:263003 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563004 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563005 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3006 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353007
bnc912a04b2016-04-20 14:19:503008 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353009
danakjad1777e2016-04-16 00:56:423010 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
ckrasic1e53b642015-07-08 22:39:353011 EXPECT_TRUE(stream.get());
3012 HttpRequestInfo request_info;
3013 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3014 net_log_, CompletionCallback()));
3015
3016 DVLOG(1)
3017 << "Created 1st session and initialized a stream. Now trigger timeout";
jri78ec06a2016-03-31 18:19:403018 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
3019 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353020 // Need to spin the loop now to ensure that
3021 // QuicStreamFactory::OnSessionClosed() runs.
3022 base::RunLoop run_loop;
3023 run_loop.RunUntilIdle();
3024
jri7046038f2015-10-22 00:29:263025 EXPECT_EQ(
3026 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3027 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3028 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353029
3030 // Test two-in-a-row timeouts with open streams.
3031 DVLOG(1) << "Create 2nd session and timeout with open stream";
3032 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263033 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563034 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563035 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353036 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:503037 QuicChromiumClientSession* session2 = GetActiveSession(server2);
ckrasic1e53b642015-07-08 22:39:353038
danakjad1777e2016-04-16 00:56:423039 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
ckrasic1e53b642015-07-08 22:39:353040 EXPECT_TRUE(stream2.get());
3041 EXPECT_EQ(OK, stream2->InitializeStream(&request_info, DEFAULT_PRIORITY,
3042 net_log_, CompletionCallback()));
3043
jri78ec06a2016-03-31 18:19:403044 session2->connection()->CloseConnection(
3045 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353046 // Need to spin the loop now to ensure that
3047 // QuicStreamFactory::OnSessionClosed() runs.
3048 base::RunLoop run_loop2;
3049 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263050 EXPECT_EQ(
3051 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3052 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3053 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:163054 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
jri7046038f2015-10-22 00:29:263055 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353056
rchcee7beb2016-03-11 06:16:143057 // Verify that QUIC is un-disabled after a TCP job fails.
3058 factory_->OnTcpJobCompleted(/*succeeded=*/false);
3059 EXPECT_EQ(
3060 0, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3061 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3062 host_port_pair_.port()));
3063
ckrasic1e53b642015-07-08 22:39:353064 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3065 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3066 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3067 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3068}
3069
3070TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfThree) {
jri7046038f2015-10-22 00:29:263071 disable_disk_cache_ = true;
3072 threshold_public_resets_post_handshake_ = 2;
3073 Initialize();
rch6faa4d42016-01-05 20:48:433074 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3075 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3076 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3077 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263078
3079 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3080 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353081 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263082 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353083
mmenke651bae7f2015-12-18 21:26:453084 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3085 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353086 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353087
mmenke651bae7f2015-12-18 21:26:453088 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353089 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353090
mmenke651bae7f2015-12-18 21:26:453091 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353092 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:353093
rch6faa4d42016-01-05 20:48:433094 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3095 HostPortPair server3(kServer3HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353096
3097 crypto_client_stream_factory_.set_handshake_mode(
3098 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3099 host_resolver_.set_synchronous_mode(true);
3100 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3101 "192.168.0.1", "");
3102 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3103 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3104
3105 // Test first and third out of three public reset post handshakes.
jri7046038f2015-10-22 00:29:263106 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563107 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563108 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3109 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353110
bnc912a04b2016-04-20 14:19:503111 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353112
3113 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
jri78ec06a2016-03-31 18:19:403114 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
3115 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353116 // Need to spin the loop now to ensure that
3117 // QuicStreamFactory::OnSessionClosed() runs.
3118 base::RunLoop run_loop;
3119 run_loop.RunUntilIdle();
3120
jri7046038f2015-10-22 00:29:263121 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3122 factory_.get()));
3123 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3124 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353125
3126 DVLOG(1) << "Create 2nd session without disable trigger";
3127 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263128 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563129 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563130 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353131 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:503132 QuicChromiumClientSession* session2 = GetActiveSession(server2);
ckrasic1e53b642015-07-08 22:39:353133
jri78ec06a2016-03-31 18:19:403134 session2->connection()->CloseConnection(
3135 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353136 // Need to spin the loop now to ensure that
3137 // QuicStreamFactory::OnSessionClosed() runs.
3138 base::RunLoop run_loop2;
3139 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263140 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3141 factory_.get()));
3142 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3143 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353144
3145 DVLOG(1) << "Create 3rd session with public reset post handshake,"
3146 << " will disable QUIC";
3147 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263148 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563149 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563150 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353151 net_log_, callback3.callback()));
bnc912a04b2016-04-20 14:19:503152 QuicChromiumClientSession* session3 = GetActiveSession(server3);
ckrasic1e53b642015-07-08 22:39:353153
jri78ec06a2016-03-31 18:19:403154 session3->connection()->CloseConnection(
3155 QUIC_PUBLIC_RESET, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353156 // Need to spin the loop now to ensure that
3157 // QuicStreamFactory::OnSessionClosed() runs.
3158 base::RunLoop run_loop3;
3159 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:263160 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3161 factory_.get()));
3162 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3163 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:163164 EXPECT_EQ(
3165 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
jri7046038f2015-10-22 00:29:263166 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353167
danakjad1777e2016-04-16 00:56:423168 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233169 EXPECT_FALSE(stream.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423170 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233171 EXPECT_FALSE(stream2.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423172 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233173 EXPECT_FALSE(stream3.get()); // Session is already closed.
ckrasic1e53b642015-07-08 22:39:353174
3175 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3176 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3177 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3178 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3179 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3180 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3181}
3182
3183TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfThree) {
jri7046038f2015-10-22 00:29:263184 disable_disk_cache_ = true;
3185 threshold_public_resets_post_handshake_ = 2;
3186 Initialize();
rch6faa4d42016-01-05 20:48:433187 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3188 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3189 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3190 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263191 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3192
3193 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3194 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353195 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263196 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353197
mmenke651bae7f2015-12-18 21:26:453198 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3199 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353200 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353201
mmenke651bae7f2015-12-18 21:26:453202 // SequencedSocketData socket_data2(nullptr, 0, nullptr, 0);
3203 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353204 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353205
mmenke651bae7f2015-12-18 21:26:453206 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353207 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:353208
rch6faa4d42016-01-05 20:48:433209 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3210 HostPortPair server3(kServer3HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353211
3212 crypto_client_stream_factory_.set_handshake_mode(
3213 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3214 host_resolver_.set_synchronous_mode(true);
3215 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3216 "192.168.0.1", "");
3217 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3218 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3219
3220 // Test first and third out of three timeouts with open streams.
jri7046038f2015-10-22 00:29:263221 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563222 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563223 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3224 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353225
bnc912a04b2016-04-20 14:19:503226 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353227
danakjad1777e2016-04-16 00:56:423228 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
ckrasic1e53b642015-07-08 22:39:353229 EXPECT_TRUE(stream.get());
3230 HttpRequestInfo request_info;
3231 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3232 net_log_, CompletionCallback()));
3233
3234 DVLOG(1)
3235 << "Created 1st session and initialized a stream. Now trigger timeout";
jri78ec06a2016-03-31 18:19:403236 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
3237 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353238 // Need to spin the loop now to ensure that
3239 // QuicStreamFactory::OnSessionClosed() runs.
3240 base::RunLoop run_loop;
3241 run_loop.RunUntilIdle();
3242
jri7046038f2015-10-22 00:29:263243 EXPECT_EQ(
3244 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3245 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3246 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353247
3248 // Test two-in-a-row timeouts with open streams.
3249 DVLOG(1) << "Create 2nd session without timeout";
3250 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263251 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563252 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563253 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353254 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:503255 QuicChromiumClientSession* session2 = GetActiveSession(server2);
ckrasic1e53b642015-07-08 22:39:353256
jri78ec06a2016-03-31 18:19:403257 session2->connection()->CloseConnection(
3258 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353259 // Need to spin the loop now to ensure that
3260 // QuicStreamFactory::OnSessionClosed() runs.
3261 base::RunLoop run_loop2;
3262 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263263 EXPECT_EQ(
3264 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3265 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3266 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353267
3268 DVLOG(1) << "Create 3rd session with timeout with open streams,"
3269 << " will disable QUIC";
3270
3271 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263272 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563273 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563274 /*cert_verify_flags=*/0, url3_, "GET",
ckrasic1e53b642015-07-08 22:39:353275 net_log_, callback3.callback()));
bnc912a04b2016-04-20 14:19:503276 QuicChromiumClientSession* session3 = GetActiveSession(server3);
ckrasic1e53b642015-07-08 22:39:353277
danakjad1777e2016-04-16 00:56:423278 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
ckrasic1e53b642015-07-08 22:39:353279 EXPECT_TRUE(stream3.get());
3280 EXPECT_EQ(OK, stream3->InitializeStream(&request_info, DEFAULT_PRIORITY,
3281 net_log_, CompletionCallback()));
jri78ec06a2016-03-31 18:19:403282 session3->connection()->CloseConnection(
3283 QUIC_NETWORK_IDLE_TIMEOUT, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353284 // Need to spin the loop now to ensure that
3285 // QuicStreamFactory::OnSessionClosed() runs.
3286 base::RunLoop run_loop3;
3287 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:263288 EXPECT_EQ(
3289 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3290 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3291 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:163292 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
jri7046038f2015-10-22 00:29:263293 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353294
danakjad1777e2016-04-16 00:56:423295 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233296 EXPECT_FALSE(stream2.get()); // Session is already closed.
rchcee7beb2016-03-11 06:16:143297
3298 // Verify that QUIC is un-disabled after a network change.
3299 factory_->OnIPAddressChanged();
3300 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3301 host_port_pair_.port()));
3302 EXPECT_EQ(
3303 0, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3304
ckrasic1e53b642015-07-08 22:39:353305 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3306 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3307 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3308 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3309 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3310 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3311}
3312
zhongyi89649c32016-01-22 00:14:013313TEST_P(QuicStreamFactoryTest, DisableQuicWhenTimeoutsWithOpenStreams) {
3314 disable_disk_cache_ = true;
3315 disable_quic_on_timeout_with_open_streams_ = true;
3316 Initialize();
3317 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3318 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3319 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3320
3321 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3322 host_port_pair_.port()));
3323 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
3324 factory_.get(), host_port_pair_.port()));
3325
3326 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3327 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
3328 socket_factory_.AddSocketDataProvider(&socket_data);
3329
3330 crypto_client_stream_factory_.set_handshake_mode(
3331 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3332 host_resolver_.set_synchronous_mode(true);
3333 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3334 "192.168.0.1", "");
3335
3336 // Test first timeouts with open streams will disable QUIC.
3337 QuicStreamRequest request(factory_.get());
3338 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563339 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3340 callback_.callback()));
zhongyi89649c32016-01-22 00:14:013341
bnc912a04b2016-04-20 14:19:503342 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
zhongyi89649c32016-01-22 00:14:013343
danakjad1777e2016-04-16 00:56:423344 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
zhongyi89649c32016-01-22 00:14:013345 EXPECT_TRUE(stream.get());
3346 HttpRequestInfo request_info;
3347 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3348 net_log_, CompletionCallback()));
3349
3350 DVLOG(1)
3351 << "Created 1st session and initialized a stream. Now trigger timeout."
3352 << "Will disable QUIC.";
jri78ec06a2016-03-31 18:19:403353 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
3354 ConnectionCloseBehavior::SILENT_CLOSE);
zhongyi89649c32016-01-22 00:14:013355 // Need to spin the loop now to ensure that
3356 // QuicStreamFactory::OnSessionClosed() runs.
3357 base::RunLoop run_loop;
3358 run_loop.RunUntilIdle();
3359
3360 EXPECT_EQ(
3361 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3362 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3363 host_port_pair_.port()));
3364
3365 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
3366 factory_->QuicDisabledReason(host_port_pair_.port()));
3367
rchcee7beb2016-03-11 06:16:143368 // Verify that QUIC is fully disabled after a TCP job succeeds.
3369 factory_->OnTcpJobCompleted(/*succeeded=*/true);
3370 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3371 host_port_pair_.port()));
3372
3373 // Verify that QUIC stays disabled after a TCP job succeeds.
3374 factory_->OnTcpJobCompleted(/*succeeded=*/false);
3375 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3376 host_port_pair_.port()));
3377
zhongyi89649c32016-01-22 00:14:013378 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3379 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3380}
3381
ckrasic1e53b642015-07-08 22:39:353382TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfFour) {
jri7046038f2015-10-22 00:29:263383 disable_disk_cache_ = true;
3384 threshold_public_resets_post_handshake_ = 2;
3385 Initialize();
rch6faa4d42016-01-05 20:48:433386 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3387 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3388 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3389 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3390 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263391 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3392
3393 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3394 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353395 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263396 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353397
mmenke651bae7f2015-12-18 21:26:453398 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3399 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353400 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353401
mmenke651bae7f2015-12-18 21:26:453402 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353403 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353404
mmenke651bae7f2015-12-18 21:26:453405 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353406 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:353407
mmenke651bae7f2015-12-18 21:26:453408 SequencedSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353409 socket_factory_.AddSocketDataProvider(&socket_data4);
ckrasic1e53b642015-07-08 22:39:353410
rch6faa4d42016-01-05 20:48:433411 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3412 HostPortPair server3(kServer3HostName, kDefaultServerPort);
3413 HostPortPair server4(kServer4HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353414
3415 crypto_client_stream_factory_.set_handshake_mode(
3416 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3417 host_resolver_.set_synchronous_mode(true);
3418 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3419 "192.168.0.1", "");
3420 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3421 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3422 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
3423
3424 // Test first and fourth out of four public reset post handshakes.
jri7046038f2015-10-22 00:29:263425 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563426 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563427 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3428 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353429
bnc912a04b2016-04-20 14:19:503430 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353431
3432 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
jri78ec06a2016-03-31 18:19:403433 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, "test",
3434 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353435 // Need to spin the loop now to ensure that
3436 // QuicStreamFactory::OnSessionClosed() runs.
3437 base::RunLoop run_loop;
3438 run_loop.RunUntilIdle();
3439
jri7046038f2015-10-22 00:29:263440 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3441 factory_.get()));
3442 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3443 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353444
3445 DVLOG(1) << "Create 2nd and 3rd sessions without disable trigger";
3446 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263447 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563448 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563449 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353450 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:503451 QuicChromiumClientSession* session2 = GetActiveSession(server2);
ckrasic1e53b642015-07-08 22:39:353452
jri78ec06a2016-03-31 18:19:403453 session2->connection()->CloseConnection(
3454 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353455 // Need to spin the loop now to ensure that
3456 // QuicStreamFactory::OnSessionClosed() runs.
3457 base::RunLoop run_loop2;
3458 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263459 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3460 factory_.get()));
3461 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3462 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353463
3464 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263465 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563466 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563467 /*cert_verify_flags=*/0, url3_, "GET",
ckrasic1e53b642015-07-08 22:39:353468 net_log_, callback3.callback()));
bnc912a04b2016-04-20 14:19:503469 QuicChromiumClientSession* session3 = GetActiveSession(server3);
ckrasic1e53b642015-07-08 22:39:353470
jri78ec06a2016-03-31 18:19:403471 session3->connection()->CloseConnection(
3472 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353473 // Need to spin the loop now to ensure that
3474 // QuicStreamFactory::OnSessionClosed() runs.
3475 base::RunLoop run_loop3;
3476 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:263477 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3478 factory_.get()));
3479 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3480 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353481
3482 DVLOG(1) << "Create 4rd session with public reset post handshake,"
3483 << " will not disable QUIC";
3484 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:263485 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:563486 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563487 /*cert_verify_flags=*/0, url4_, "GET",
ckrasic1e53b642015-07-08 22:39:353488 net_log_, callback4.callback()));
bnc912a04b2016-04-20 14:19:503489 QuicChromiumClientSession* session4 = GetActiveSession(server4);
ckrasic1e53b642015-07-08 22:39:353490
jri78ec06a2016-03-31 18:19:403491 session4->connection()->CloseConnection(
3492 QUIC_PUBLIC_RESET, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353493 // Need to spin the loop now to ensure that
3494 // QuicStreamFactory::OnSessionClosed() runs.
3495 base::RunLoop run_loop4;
3496 run_loop4.RunUntilIdle();
jri7046038f2015-10-22 00:29:263497 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3498 factory_.get()));
3499 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3500 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353501
danakjad1777e2016-04-16 00:56:423502 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233503 EXPECT_FALSE(stream.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423504 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233505 EXPECT_FALSE(stream2.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423506 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233507 EXPECT_FALSE(stream3.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423508 std::unique_ptr<QuicHttpStream> stream4 = request4.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233509 EXPECT_FALSE(stream4.get()); // Session is already closed.
ckrasic1e53b642015-07-08 22:39:353510
3511 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3512 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3513 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3514 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3515 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3516 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3517 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
3518 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
3519}
3520
3521TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfFour) {
jri7046038f2015-10-22 00:29:263522 disable_disk_cache_ = true;
3523 threshold_public_resets_post_handshake_ = 2;
3524 Initialize();
rch6faa4d42016-01-05 20:48:433525 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3526 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3527 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3528 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3529 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263530 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3531
3532 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3533 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353534 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263535 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353536
mmenke651bae7f2015-12-18 21:26:453537 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3538 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353539 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353540
mmenke651bae7f2015-12-18 21:26:453541 // SequencedSocketData socket_data2(nullptr, 0, nullptr, 0);
3542 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353543 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353544
mmenke651bae7f2015-12-18 21:26:453545 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353546 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:353547
mmenke651bae7f2015-12-18 21:26:453548 SequencedSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353549 socket_factory_.AddSocketDataProvider(&socket_data4);
ckrasic1e53b642015-07-08 22:39:353550
rch6faa4d42016-01-05 20:48:433551 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3552 HostPortPair server3(kServer3HostName, kDefaultServerPort);
3553 HostPortPair server4(kServer4HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353554
3555 crypto_client_stream_factory_.set_handshake_mode(
3556 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3557 host_resolver_.set_synchronous_mode(true);
3558 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3559 "192.168.0.1", "");
3560 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3561 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3562 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
3563
3564 // Test first and fourth out of three timeouts with open streams.
jri7046038f2015-10-22 00:29:263565 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563566 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563567 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3568 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353569
bnc912a04b2016-04-20 14:19:503570 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353571
danakjad1777e2016-04-16 00:56:423572 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
ckrasic1e53b642015-07-08 22:39:353573 EXPECT_TRUE(stream.get());
3574 HttpRequestInfo request_info;
3575 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3576 net_log_, CompletionCallback()));
3577
3578 DVLOG(1)
3579 << "Created 1st session and initialized a stream. Now trigger timeout";
jri78ec06a2016-03-31 18:19:403580 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, "test",
3581 ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353582 // Need to spin the loop now to ensure that
3583 // QuicStreamFactory::OnSessionClosed() runs.
3584 base::RunLoop run_loop;
3585 run_loop.RunUntilIdle();
3586
jri7046038f2015-10-22 00:29:263587 EXPECT_EQ(
3588 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3589 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3590 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353591
3592 DVLOG(1) << "Create 2nd and 3rd sessions without timeout";
3593 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263594 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563595 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563596 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353597 net_log_, callback2.callback()));
bnc912a04b2016-04-20 14:19:503598 QuicChromiumClientSession* session2 = GetActiveSession(server2);
ckrasic1e53b642015-07-08 22:39:353599
jri78ec06a2016-03-31 18:19:403600 session2->connection()->CloseConnection(
3601 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353602 // Need to spin the loop now to ensure that
3603 // QuicStreamFactory::OnSessionClosed() runs.
3604 base::RunLoop run_loop2;
3605 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263606 EXPECT_EQ(
3607 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3608 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3609 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353610
3611 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263612 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563613 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563614 /*cert_verify_flags=*/0, url3_, "GET",
ckrasic1e53b642015-07-08 22:39:353615 net_log_, callback3.callback()));
bnc912a04b2016-04-20 14:19:503616 QuicChromiumClientSession* session3 = GetActiveSession(server3);
ckrasic1e53b642015-07-08 22:39:353617
jri78ec06a2016-03-31 18:19:403618 session3->connection()->CloseConnection(
3619 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
ckrasic1e53b642015-07-08 22:39:353620 // Need to spin the loop now to ensure that
3621 // QuicStreamFactory::OnSessionClosed() runs.
3622 base::RunLoop run_loop3;
3623 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:263624 EXPECT_EQ(
3625 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3626 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3627 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353628
3629 DVLOG(1) << "Create 4th session with timeout with open streams,"
3630 << " will not disable QUIC";
3631
3632 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:263633 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:563634 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563635 /*cert_verify_flags=*/0, url4_, "GET",
ckrasic1e53b642015-07-08 22:39:353636 net_log_, callback4.callback()));
bnc912a04b2016-04-20 14:19:503637 QuicChromiumClientSession* session4 = GetActiveSession(server4);
ckrasic1e53b642015-07-08 22:39:353638
danakjad1777e2016-04-16 00:56:423639 std::unique_ptr<QuicHttpStream> stream4 = request4.CreateStream();
ckrasic1e53b642015-07-08 22:39:353640 EXPECT_TRUE(stream4.get());
3641 EXPECT_EQ(OK, stream4->InitializeStream(&request_info, DEFAULT_PRIORITY,
3642 net_log_, CompletionCallback()));
jri78ec06a2016-03-31 18:19:403643 session4->connection()->CloseConnection(
3644 QUIC_NETWORK_IDLE_TIMEOUT, "test", 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_loop4;
3648 run_loop4.RunUntilIdle();
jri7046038f2015-10-22 00:29:263649 EXPECT_EQ(
3650 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3651 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3652 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353653
danakjad1777e2016-04-16 00:56:423654 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233655 EXPECT_FALSE(stream2.get()); // Session is already closed.
danakjad1777e2016-04-16 00:56:423656 std::unique_ptr<QuicHttpStream> stream3 = request3.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233657 EXPECT_FALSE(stream3.get()); // Session is already closed.
rchcee7beb2016-03-11 06:16:143658
ckrasic1e53b642015-07-08 22:39:353659 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3660 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3661 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3662 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3663 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3664 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3665 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
3666 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
3667}
3668
rtenneti8332ba52015-09-17 19:33:413669TEST_P(QuicStreamFactoryTest, EnableDelayTcpRace) {
jri7046038f2015-10-22 00:29:263670 Initialize();
rch6faa4d42016-01-05 20:48:433671 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3672 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263673 bool delay_tcp_race = QuicStreamFactoryPeer::GetDelayTcpRace(factory_.get());
3674 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), false);
mmenke651bae7f2015-12-18 21:26:453675 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3676 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti8332ba52015-09-17 19:33:413677 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti8332ba52015-09-17 19:33:413678
rtenneti8332ba52015-09-17 19:33:413679 ServerNetworkStats stats1;
3680 stats1.srtt = base::TimeDelta::FromMicroseconds(10);
rtenneticcab42b2015-10-09 06:38:163681 http_server_properties_.SetServerNetworkStats(host_port_pair_, stats1);
rtenneti8332ba52015-09-17 19:33:413682
3683 crypto_client_stream_factory_.set_handshake_mode(
3684 MockCryptoClientStream::ZERO_RTT);
3685 host_resolver_.set_synchronous_mode(true);
3686 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3687 "192.168.0.1", "");
3688
jri7046038f2015-10-22 00:29:263689 QuicStreamRequest request(factory_.get());
rtenneti8332ba52015-09-17 19:33:413690 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:563691 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563692 /*cert_verify_flags=*/0, url_, "POST", net_log_,
3693 callback_.callback()));
rtenneti8332ba52015-09-17 19:33:413694
3695 // If we don't delay TCP connection, then time delay should be 0.
jri7046038f2015-10-22 00:29:263696 EXPECT_FALSE(factory_->delay_tcp_race());
rtenneti8332ba52015-09-17 19:33:413697 EXPECT_EQ(base::TimeDelta(), request.GetTimeDelayForWaitingJob());
3698
3699 // Enable |delay_tcp_race_| param and verify delay is one RTT and that
3700 // server supports QUIC.
jri7046038f2015-10-22 00:29:263701 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), true);
3702 EXPECT_TRUE(factory_->delay_tcp_race());
rtenneti8332ba52015-09-17 19:33:413703 EXPECT_EQ(base::TimeDelta::FromMicroseconds(15),
3704 request.GetTimeDelayForWaitingJob());
3705
3706 // Confirm the handshake and verify that the stream is created.
3707 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
3708 QuicSession::HANDSHAKE_CONFIRMED);
3709
3710 EXPECT_EQ(OK, callback_.WaitForResult());
3711
danakjad1777e2016-04-16 00:56:423712 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
rtenneti8332ba52015-09-17 19:33:413713 EXPECT_TRUE(stream.get());
3714 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3715 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
jri7046038f2015-10-22 00:29:263716 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), delay_tcp_race);
rtenneti8332ba52015-09-17 19:33:413717}
3718
rtenneticd2aaa15b2015-10-10 20:29:333719TEST_P(QuicStreamFactoryTest, MaybeInitialize) {
rtenneti41c09992015-11-30 18:24:013720 idle_connection_timeout_seconds_ = 500;
jri7046038f2015-10-22 00:29:263721 Initialize();
rch6faa4d42016-01-05 20:48:433722 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3723 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rtenneti41c09992015-11-30 18:24:013724 const QuicConfig* config = QuicStreamFactoryPeer::GetConfig(factory_.get());
3725 EXPECT_EQ(500, config->IdleConnectionStateLifetime().ToSeconds());
3726
jri7046038f2015-10-22 00:29:263727 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti8a80a6dc2015-09-21 19:51:133728
rtenneti8a80a6dc2015-09-21 19:51:133729 const AlternativeService alternative_service1(QUIC, host_port_pair_.host(),
3730 host_port_pair_.port());
3731 AlternativeServiceInfoVector alternative_service_info_vector;
3732 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
3733 alternative_service_info_vector.push_back(
rchdc7b9052016-03-17 20:51:503734 AlternativeServiceInfo(alternative_service1, expiration));
rtenneti8a80a6dc2015-09-21 19:51:133735
rtenneticcab42b2015-10-09 06:38:163736 http_server_properties_.SetAlternativeServices(
rtenneti8a80a6dc2015-09-21 19:51:133737 host_port_pair_, alternative_service_info_vector);
rtennetiee679d52016-04-06 17:01:133738
3739 HostPortPair host_port_pair2(kServer2HostName, kDefaultServerPort);
3740 const AlternativeService alternative_service2(QUIC, host_port_pair2.host(),
3741 host_port_pair2.port());
3742 AlternativeServiceInfoVector alternative_service_info_vector2;
3743 alternative_service_info_vector2.push_back(
3744 AlternativeServiceInfo(alternative_service2, expiration));
3745 http_server_properties_.SetAlternativeServices(
3746 host_port_pair2, alternative_service_info_vector2);
3747
rtenneti6971c172016-01-15 20:12:103748 http_server_properties_.SetMaxServerConfigsStoredInProperties(
3749 kMaxQuicServersToPersist);
rtenneti8a80a6dc2015-09-21 19:51:133750
rch6faa4d42016-01-05 20:48:433751 QuicServerId quic_server_id(kDefaultServerHostName, 80,
3752 PRIVACY_MODE_DISABLED);
rtenneticd2aaa15b2015-10-10 20:29:333753 QuicServerInfoFactory* quic_server_info_factory =
3754 new PropertiesBasedQuicServerInfoFactory(
3755 http_server_properties_.GetWeakPtr());
jri7046038f2015-10-22 00:29:263756 factory_->set_quic_server_info_factory(quic_server_info_factory);
rtenneticd2aaa15b2015-10-10 20:29:333757
danakjad1777e2016-04-16 00:56:423758 std::unique_ptr<QuicServerInfo> quic_server_info(
rtenneticd2aaa15b2015-10-10 20:29:333759 quic_server_info_factory->GetForServer(quic_server_id));
3760
3761 // Update quic_server_info's server_config and persist it.
3762 QuicServerInfo::State* state = quic_server_info->mutable_state();
3763 // Minimum SCFG that passes config validation checks.
3764 const char scfg[] = {// SCFG
3765 0x53, 0x43, 0x46, 0x47,
3766 // num entries
3767 0x01, 0x00,
3768 // padding
3769 0x00, 0x00,
3770 // EXPY
3771 0x45, 0x58, 0x50, 0x59,
3772 // EXPY end offset
3773 0x08, 0x00, 0x00, 0x00,
3774 // Value
3775 '1', '2', '3', '4', '5', '6', '7', '8'};
3776
3777 // Create temporary strings becasue Persist() clears string data in |state|.
3778 string server_config(reinterpret_cast<const char*>(&scfg), sizeof(scfg));
3779 string source_address_token("test_source_address_token");
rtenneti61de3682016-03-24 00:50:023780 string cert_sct("test_cert_sct");
3781 string chlo_hash("test_chlo_hash");
rtenneticd2aaa15b2015-10-10 20:29:333782 string signature("test_signature");
3783 string test_cert("test_cert");
3784 vector<string> certs;
3785 certs.push_back(test_cert);
3786 state->server_config = server_config;
3787 state->source_address_token = source_address_token;
rtenneti61de3682016-03-24 00:50:023788 state->cert_sct = cert_sct;
3789 state->chlo_hash = chlo_hash;
rtenneticd2aaa15b2015-10-10 20:29:333790 state->server_config_sig = signature;
3791 state->certs = certs;
3792
3793 quic_server_info->Persist();
3794
rtennetiee679d52016-04-06 17:01:133795 QuicServerId quic_server_id2(kServer2HostName, 80, PRIVACY_MODE_DISABLED);
danakjad1777e2016-04-16 00:56:423796 std::unique_ptr<QuicServerInfo> quic_server_info2(
rtennetiee679d52016-04-06 17:01:133797 quic_server_info_factory->GetForServer(quic_server_id2));
3798
3799 // Update quic_server_info2's server_config and persist it.
3800 QuicServerInfo::State* state2 = quic_server_info2->mutable_state();
3801
3802 // Minimum SCFG that passes config validation checks.
3803 const char scfg2[] = {// SCFG
3804 0x53, 0x43, 0x46, 0x47,
3805 // num entries
3806 0x01, 0x00,
3807 // padding
3808 0x00, 0x00,
3809 // EXPY
3810 0x45, 0x58, 0x50, 0x59,
3811 // EXPY end offset
3812 0x08, 0x00, 0x00, 0x00,
3813 // Value
3814 '8', '7', '3', '4', '5', '6', '2', '1'};
3815
3816 // Create temporary strings becasue Persist() clears string data in |state2|.
3817 string server_config2(reinterpret_cast<const char*>(&scfg2), sizeof(scfg2));
3818 string source_address_token2("test_source_address_token2");
3819 string cert_sct2("test_cert_sct2");
3820 string chlo_hash2("test_chlo_hash2");
3821 string signature2("test_signature2");
3822 string test_cert2("test_cert2");
3823 vector<string> certs2;
3824 certs2.push_back(test_cert2);
3825 state2->server_config = server_config2;
3826 state2->source_address_token = source_address_token2;
3827 state2->cert_sct = cert_sct2;
3828 state2->chlo_hash = chlo_hash2;
3829 state2->server_config_sig = signature2;
3830 state2->certs = certs2;
3831
3832 quic_server_info2->Persist();
3833
jri7046038f2015-10-22 00:29:263834 QuicStreamFactoryPeer::MaybeInitialize(factory_.get());
3835 EXPECT_TRUE(QuicStreamFactoryPeer::HasInitializedData(factory_.get()));
rtennetiee679d52016-04-06 17:01:133836
3837 // Verify the MRU order is maintained.
3838 const QuicServerInfoMap& quic_server_info_map =
3839 http_server_properties_.quic_server_info_map();
3840 EXPECT_EQ(2u, quic_server_info_map.size());
3841 QuicServerInfoMap::const_iterator quic_server_info_map_it =
3842 quic_server_info_map.begin();
3843 EXPECT_EQ(quic_server_info_map_it->first, quic_server_id2);
3844 ++quic_server_info_map_it;
3845 EXPECT_EQ(quic_server_info_map_it->first, quic_server_id);
3846
jri7046038f2015-10-22 00:29:263847 EXPECT_TRUE(QuicStreamFactoryPeer::SupportsQuicAtStartUp(factory_.get(),
3848 host_port_pair_));
3849 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(factory_.get(),
rtenneticd2aaa15b2015-10-10 20:29:333850 quic_server_id));
3851 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:263852 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rtenneticd2aaa15b2015-10-10 20:29:333853 QuicCryptoClientConfig::CachedState* cached =
3854 crypto_config->LookupOrCreate(quic_server_id);
3855 EXPECT_FALSE(cached->server_config().empty());
3856 EXPECT_TRUE(cached->GetServerConfig());
3857 EXPECT_EQ(server_config, cached->server_config());
3858 EXPECT_EQ(source_address_token, cached->source_address_token());
rtenneti61de3682016-03-24 00:50:023859 EXPECT_EQ(cert_sct, cached->cert_sct());
3860 EXPECT_EQ(chlo_hash, cached->chlo_hash());
rtenneticd2aaa15b2015-10-10 20:29:333861 EXPECT_EQ(signature, cached->signature());
3862 ASSERT_EQ(1U, cached->certs().size());
3863 EXPECT_EQ(test_cert, cached->certs()[0]);
rtennetiee679d52016-04-06 17:01:133864
3865 EXPECT_TRUE(QuicStreamFactoryPeer::SupportsQuicAtStartUp(factory_.get(),
3866 host_port_pair2));
3867 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(
3868 factory_.get(), quic_server_id2));
3869 QuicCryptoClientConfig::CachedState* cached2 =
3870 crypto_config->LookupOrCreate(quic_server_id2);
3871 EXPECT_FALSE(cached2->server_config().empty());
3872 EXPECT_TRUE(cached2->GetServerConfig());
3873 EXPECT_EQ(server_config2, cached2->server_config());
3874 EXPECT_EQ(source_address_token2, cached2->source_address_token());
3875 EXPECT_EQ(cert_sct2, cached2->cert_sct());
3876 EXPECT_EQ(chlo_hash2, cached2->chlo_hash());
3877 EXPECT_EQ(signature2, cached2->signature());
3878 ASSERT_EQ(1U, cached->certs().size());
3879 EXPECT_EQ(test_cert2, cached2->certs()[0]);
rtenneti8a80a6dc2015-09-21 19:51:133880}
3881
rtennetid2e74caa2015-12-09 00:51:573882TEST_P(QuicStreamFactoryTest, QuicDoingZeroRTT) {
3883 Initialize();
3884
3885 factory_->set_require_confirmation(true);
3886 QuicServerId quic_server_id(host_port_pair_, PRIVACY_MODE_DISABLED);
3887 EXPECT_FALSE(factory_->ZeroRTTEnabledFor(quic_server_id));
3888
3889 factory_->set_require_confirmation(false);
3890 EXPECT_FALSE(factory_->ZeroRTTEnabledFor(quic_server_id));
3891
3892 // Load server config and verify QUIC will do 0RTT.
3893 QuicStreamFactoryPeer::CacheDummyServerConfig(factory_.get(), quic_server_id);
3894 EXPECT_TRUE(factory_->ZeroRTTEnabledFor(quic_server_id));
3895}
3896
rtenneti1cd3b162015-09-29 02:58:283897TEST_P(QuicStreamFactoryTest, YieldAfterPackets) {
jri7046038f2015-10-22 00:29:263898 Initialize();
rch6faa4d42016-01-05 20:48:433899 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3900 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263901 QuicStreamFactoryPeer::SetYieldAfterPackets(factory_.get(), 0);
rtenneti1cd3b162015-09-29 02:58:283902
danakjad1777e2016-04-16 00:56:423903 std::unique_ptr<QuicEncryptedPacket> close_packet(
rtenneti1cd3b162015-09-29 02:58:283904 ConstructConnectionClosePacket(0));
rtenneticd2aaa15b2015-10-10 20:29:333905 vector<MockRead> reads;
rtenneti1cd3b162015-09-29 02:58:283906 reads.push_back(
3907 MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0));
3908 reads.push_back(MockRead(ASYNC, OK, 1));
mmenke651bae7f2015-12-18 21:26:453909 SequencedSocketData socket_data(&reads[0], reads.size(), nullptr, 0);
rtenneti1cd3b162015-09-29 02:58:283910 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti1cd3b162015-09-29 02:58:283911
3912 crypto_client_stream_factory_.set_handshake_mode(
3913 MockCryptoClientStream::ZERO_RTT);
3914 host_resolver_.set_synchronous_mode(true);
3915 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3916 "192.168.0.1", "");
3917
rcha02807b42016-01-29 21:56:153918 // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
3919 // posts a task.
rtenneti1cd3b162015-09-29 02:58:283920 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
rcha02807b42016-01-29 21:56:153921 SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
3922 "StartReading");
rtenneti1cd3b162015-09-29 02:58:283923
jri7046038f2015-10-22 00:29:263924 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563925 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563926 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3927 callback_.callback()));
rtenneti1cd3b162015-09-29 02:58:283928
rcha02807b42016-01-29 21:56:153929 // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
3930 // called.
rtenneti1cd3b162015-09-29 02:58:283931 base::RunLoop run_loop;
3932 run_loop.RunUntilIdle();
3933
3934 // Verify task that the observer's executed_count is 1, which indicates
rcha02807b42016-01-29 21:56:153935 // QuicChromiumPacketReader::StartReading() has posted only one task and
3936 // yielded the read.
rtenneti1cd3b162015-09-29 02:58:283937 EXPECT_EQ(1u, observer.executed_count());
3938
danakjad1777e2016-04-16 00:56:423939 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233940 EXPECT_FALSE(stream.get()); // Session is already closed.
rtenneti1cd3b162015-09-29 02:58:283941 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3942 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3943}
3944
3945TEST_P(QuicStreamFactoryTest, YieldAfterDuration) {
jri7046038f2015-10-22 00:29:263946 Initialize();
rch6faa4d42016-01-05 20:48:433947 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3948 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rtenneti1cd3b162015-09-29 02:58:283949 QuicStreamFactoryPeer::SetYieldAfterDuration(
jri7046038f2015-10-22 00:29:263950 factory_.get(), QuicTime::Delta::FromMilliseconds(-1));
rtenneti1cd3b162015-09-29 02:58:283951
danakjad1777e2016-04-16 00:56:423952 std::unique_ptr<QuicEncryptedPacket> close_packet(
rtenneti1cd3b162015-09-29 02:58:283953 ConstructConnectionClosePacket(0));
rtenneticd2aaa15b2015-10-10 20:29:333954 vector<MockRead> reads;
rtenneti1cd3b162015-09-29 02:58:283955 reads.push_back(
3956 MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0));
3957 reads.push_back(MockRead(ASYNC, OK, 1));
mmenke651bae7f2015-12-18 21:26:453958 SequencedSocketData socket_data(&reads[0], reads.size(), nullptr, 0);
rtenneti1cd3b162015-09-29 02:58:283959 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti1cd3b162015-09-29 02:58:283960
3961 crypto_client_stream_factory_.set_handshake_mode(
3962 MockCryptoClientStream::ZERO_RTT);
3963 host_resolver_.set_synchronous_mode(true);
3964 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3965 "192.168.0.1", "");
3966
rcha02807b42016-01-29 21:56:153967 // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
3968 // posts a task.
rtenneti1cd3b162015-09-29 02:58:283969 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
rcha02807b42016-01-29 21:56:153970 SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
3971 "StartReading");
rtenneti1cd3b162015-09-29 02:58:283972
jri7046038f2015-10-22 00:29:263973 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563974 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563975 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3976 callback_.callback()));
rtenneti1cd3b162015-09-29 02:58:283977
rcha02807b42016-01-29 21:56:153978 // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
3979 // called.
rtenneti1cd3b162015-09-29 02:58:283980 base::RunLoop run_loop;
3981 run_loop.RunUntilIdle();
3982
3983 // Verify task that the observer's executed_count is 1, which indicates
rcha02807b42016-01-29 21:56:153984 // QuicChromiumPacketReader::StartReading() has posted only one task and
3985 // yielded the read.
rtenneti1cd3b162015-09-29 02:58:283986 EXPECT_EQ(1u, observer.executed_count());
3987
danakjad1777e2016-04-16 00:56:423988 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
xunjieli2608f9b2016-03-14 13:39:233989 EXPECT_FALSE(stream.get()); // Session is already closed.
rtenneti1cd3b162015-09-29 02:58:283990 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3991 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3992}
3993
ckrasic3865ee0f2016-02-29 22:04:563994TEST_P(QuicStreamFactoryTest, ServerPushSessionAffinity) {
3995 Initialize();
3996 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3997 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3998
3999 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
4000 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
4001 socket_factory_.AddSocketDataProvider(&socket_data);
4002
4003 QuicStreamRequest request(factory_.get());
4004 EXPECT_EQ(ERR_IO_PENDING,
4005 request.Request(host_port_pair_, privacy_mode_,
4006 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4007 callback_.callback()));
4008
4009 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:424010 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
ckrasic3865ee0f2016-02-29 22:04:564011 EXPECT_TRUE(stream.get());
4012
4013 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
4014
4015 std::string url = "https://www.example.org/";
4016
bnc912a04b2016-04-20 14:19:504017 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic3865ee0f2016-02-29 22:04:564018
4019 QuicClientPromisedInfo promised(session, kServerDataStreamId1, url);
4020 (*QuicStreamFactoryPeer::GetPushPromiseIndex(factory_.get())
4021 ->promised_by_url())[url] = &promised;
4022
4023 QuicStreamRequest request2(factory_.get());
4024 EXPECT_EQ(OK, request2.Request(host_port_pair_, privacy_mode_,
4025 /*cert_verify_flags=*/0, GURL(url), "GET",
4026 net_log_, callback_.callback()));
4027
4028 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
4029}
4030
4031TEST_P(QuicStreamFactoryTest, ServerPushPrivacyModeMismatch) {
4032 Initialize();
4033 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4034 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4035 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4036
4037 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
4038
danakjad1777e2016-04-16 00:56:424039 std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
ckrasic3865ee0f2016-02-29 22:04:564040 1, true, kServerDataStreamId1, QUIC_STREAM_CANCELLED));
4041 MockWrite writes[] = {
4042 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
4043 };
4044
4045 SequencedSocketData socket_data1(reads, arraysize(reads), writes,
4046 arraysize(writes));
4047 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
4048
4049 socket_factory_.AddSocketDataProvider(&socket_data1);
4050 socket_factory_.AddSocketDataProvider(&socket_data2);
4051
4052 QuicStreamRequest request(factory_.get());
4053 EXPECT_EQ(ERR_IO_PENDING,
4054 request.Request(host_port_pair_, privacy_mode_,
4055 /*cert_verify_flags=*/0, url_, "GET", net_log_,
4056 callback_.callback()));
4057
4058 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:424059 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
ckrasic3865ee0f2016-02-29 22:04:564060 EXPECT_TRUE(stream.get());
4061
4062 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
4063
4064 std::string url = "https://www.example.org/";
bnc912a04b2016-04-20 14:19:504065 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic3865ee0f2016-02-29 22:04:564066
4067 QuicClientPromisedInfo promised(session, kServerDataStreamId1, url);
4068
4069 QuicClientPushPromiseIndex* index =
4070 QuicStreamFactoryPeer::GetPushPromiseIndex(factory_.get());
4071
4072 (*index->promised_by_url())[url] = &promised;
4073 EXPECT_EQ(index->GetPromised(url), &promised);
4074
4075 // Doing the request should not use the push stream, but rather
4076 // cancel it because the privacy modes do not match.
4077 QuicStreamRequest request2(factory_.get());
4078 EXPECT_EQ(ERR_IO_PENDING,
4079 request2.Request(host_port_pair_, PRIVACY_MODE_ENABLED,
4080 /*cert_verify_flags=*/0, GURL(url), "GET",
4081 net_log_, callback_.callback()));
4082
4083 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
4084 EXPECT_EQ(index->GetPromised(url), nullptr);
4085
4086 EXPECT_EQ(OK, callback_.WaitForResult());
danakjad1777e2016-04-16 00:56:424087 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
ckrasic3865ee0f2016-02-29 22:04:564088 EXPECT_TRUE(stream2.get());
4089
4090 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
4091 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
4092 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
4093 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
4094}
4095
[email protected]e13201d82012-12-12 05:00:324096} // namespace test
[email protected]e13201d82012-12-12 05:00:324097} // namespace net