blob: d3ca06731cc024daf84e8e099ea5576579ef5123 [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"
rtennetid2e74caa2015-12-09 00:51:5733#include "net/quic/test_tools/quic_stream_factory_peer.h"
[email protected]1e960032013-12-20 19:00:2034#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]e13201d82012-12-12 05:00:3235#include "net/quic/test_tools/quic_test_utils.h"
rtenneti38f5cd52014-10-28 20:28:2836#include "net/quic/test_tools/test_task_runner.h"
[email protected]e13201d82012-12-12 05:00:3237#include "net/socket/socket_test_util.h"
rtenneti1cd3b162015-09-29 02:58:2838#include "net/spdy/spdy_session_test_util.h"
[email protected]5db452202014-08-19 05:22:1539#include "net/spdy/spdy_test_utils.h"
[email protected]6b8a3c742014-07-25 00:25:3540#include "net/ssl/channel_id_service.h"
41#include "net/ssl/default_channel_id_store.h"
[email protected]eed749f92013-12-23 18:57:3842#include "net/test/cert_test_util.h"
[email protected]e13201d82012-12-12 05:00:3243#include "testing/gtest/include/gtest/gtest.h"
44
[email protected]6e12d702013-11-13 00:17:1745using base::StringPiece;
rtenneti14abd312015-02-06 21:56:0146using std::ostream;
[email protected]6e12d702013-11-13 00:17:1747using std::string;
48using std::vector;
49
[email protected]e13201d82012-12-12 05:00:3250namespace net {
jri7e636642016-01-14 06:57:0851
[email protected]e13201d82012-12-12 05:00:3252namespace test {
53
[email protected]3c772402013-12-18 21:38:1154namespace {
rch6faa4d42016-01-05 20:48:4355const char kDefaultServerHostName[] = "www.example.org";
56const char kServer2HostName[] = "mail.example.org";
57const char kServer3HostName[] = "docs.example.org";
58const char kServer4HostName[] = "images.example.org";
[email protected]3c772402013-12-18 21:38:1159const int kDefaultServerPort = 443;
ckrasic3865ee0f2016-02-29 22:04:5660const char kDefaultUrl[] = "https://www.example.org/";
61const char kServer2Url[] = "https://mail.example.org/";
62const char kServer3Url[] = "https://docs.example.org/";
63const char kServer4Url[] = "https://images.example.org/";
rtenneti14abd312015-02-06 21:56:0164
65// Run all tests with all the combinations of versions and
66// enable_connection_racing.
67struct TestParams {
68 TestParams(const QuicVersion version, bool enable_connection_racing)
69 : version(version), enable_connection_racing(enable_connection_racing) {}
70
71 friend ostream& operator<<(ostream& os, const TestParams& p) {
72 os << "{ version: " << QuicVersionToString(p.version);
73 os << " enable_connection_racing: " << p.enable_connection_racing << " }";
74 return os;
75 }
76
77 QuicVersion version;
78 bool enable_connection_racing;
79};
80
81// Constructs various test permutations.
82vector<TestParams> GetTestParams() {
83 vector<TestParams> params;
84 QuicVersionVector all_supported_versions = QuicSupportedVersions();
85 for (const QuicVersion version : all_supported_versions) {
86 params.push_back(TestParams(version, false));
87 params.push_back(TestParams(version, true));
88 }
89 return params;
90}
91
[email protected]3c772402013-12-18 21:38:1192} // namespace anonymous
93
rtenneti38f5cd52014-10-28 20:28:2894class MockQuicServerInfo : public QuicServerInfo {
95 public:
96 MockQuicServerInfo(const QuicServerId& server_id)
97 : QuicServerInfo(server_id) {}
dcheng2339883c2014-12-23 00:23:0598 ~MockQuicServerInfo() override {}
rtenneti38f5cd52014-10-28 20:28:2899
dcheng2339883c2014-12-23 00:23:05100 void Start() override {}
rtenneti38f5cd52014-10-28 20:28:28101
dcheng2339883c2014-12-23 00:23:05102 int WaitForDataReady(const CompletionCallback& callback) override {
rtenneti38f5cd52014-10-28 20:28:28103 return ERR_IO_PENDING;
104 }
105
rtenneti170f36a2015-02-10 19:13:45106 void ResetWaitForDataReadyCallback() override {}
107
dcheng2339883c2014-12-23 00:23:05108 void CancelWaitForDataReadyCallback() override {}
rtenneti38f5cd52014-10-28 20:28:28109
dcheng2339883c2014-12-23 00:23:05110 bool IsDataReady() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28111
dcheng2339883c2014-12-23 00:23:05112 bool IsReadyToPersist() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28113
dcheng2339883c2014-12-23 00:23:05114 void Persist() override {}
rtennetif0b832b2014-11-07 02:32:30115
dcheng2339883c2014-12-23 00:23:05116 void OnExternalCacheHit() override {}
rtenneti38f5cd52014-10-28 20:28:28117};
118
119class MockQuicServerInfoFactory : public QuicServerInfoFactory {
120 public:
121 MockQuicServerInfoFactory() {}
dcheng2339883c2014-12-23 00:23:05122 ~MockQuicServerInfoFactory() override {}
rtenneti38f5cd52014-10-28 20:28:28123
dcheng2339883c2014-12-23 00:23:05124 QuicServerInfo* GetForServer(const QuicServerId& server_id) override {
rtenneti38f5cd52014-10-28 20:28:28125 return new MockQuicServerInfo(server_id);
126 }
127};
128
jri7e636642016-01-14 06:57:08129class MockNetworkChangeNotifier : public NetworkChangeNotifier {
130 public:
131 MockNetworkChangeNotifier() : force_network_handles_supported_(false) {}
132
133 ConnectionType GetCurrentConnectionType() const override {
134 return CONNECTION_UNKNOWN;
135 }
136
137 void ForceNetworkHandlesSupported() {
138 force_network_handles_supported_ = true;
139 }
140
141 bool AreNetworkHandlesCurrentlySupported() const override {
142 return force_network_handles_supported_;
143 }
144
145 void SetConnectedNetworksList(const NetworkList& network_list) {
146 connected_networks_ = network_list;
147 }
148
149 void GetCurrentConnectedNetworks(NetworkList* network_list) const override {
150 network_list->clear();
151 *network_list = connected_networks_;
152 }
153
154 void NotifyNetworkSoonToDisconnect(
155 NetworkChangeNotifier::NetworkHandle network) {
156 NetworkChangeNotifier::NotifyObserversOfSpecificNetworkChange(
157 NetworkChangeNotifier::SOON_TO_DISCONNECT, network);
158 // Spin the message loop so the notification is delivered.
159 base::MessageLoop::current()->RunUntilIdle();
160 }
161
162 void NotifyNetworkDisconnected(NetworkChangeNotifier::NetworkHandle network) {
163 NetworkChangeNotifier::NotifyObserversOfSpecificNetworkChange(
164 NetworkChangeNotifier::DISCONNECTED, network);
165 // Spin the message loop so the notification is delivered.
166 base::MessageLoop::current()->RunUntilIdle();
167 }
168
169 private:
170 bool force_network_handles_supported_;
171 NetworkChangeNotifier::NetworkList connected_networks_;
172};
173
174// Class to replace existing NetworkChangeNotifier singleton with a
175// MockNetworkChangeNotifier for a test. To use, simply create a
176// ScopedMockNetworkChangeNotifier object in the test.
177class ScopedMockNetworkChangeNotifier {
178 public:
179 ScopedMockNetworkChangeNotifier()
180 : disable_network_change_notifier_for_tests_(
181 new NetworkChangeNotifier::DisableForTest()),
182 mock_network_change_notifier_(new MockNetworkChangeNotifier()) {}
183
184 MockNetworkChangeNotifier* mock_network_change_notifier() {
185 return mock_network_change_notifier_.get();
186 }
187
188 private:
189 scoped_ptr<NetworkChangeNotifier::DisableForTest>
190 disable_network_change_notifier_for_tests_;
191 scoped_ptr<MockNetworkChangeNotifier> mock_network_change_notifier_;
192};
193
rtenneti14abd312015-02-06 21:56:01194class QuicStreamFactoryTest : public ::testing::TestWithParam<TestParams> {
[email protected]e13201d82012-12-12 05:00:32195 protected:
196 QuicStreamFactoryTest()
[email protected]457d6952013-12-13 09:24:58197 : random_generator_(0),
198 clock_(new MockClock()),
rtenneti38f5cd52014-10-28 20:28:28199 runner_(new TestTaskRunner(clock_)),
bncb07c05532015-05-14 19:07:20200 maker_(GetParam().version, 0, clock_, kDefaultServerHostName),
[email protected]59c0bbd2014-03-22 04:08:12201 cert_verifier_(CertVerifier::CreateDefault()),
jri2b966f22014-09-02 22:25:36202 channel_id_service_(
rtennetibe635732014-10-02 22:51:42203 new ChannelIDService(new DefaultChannelIDStore(nullptr),
skyostil4891b25b2015-06-11 11:43:45204 base::ThreadTaskRunnerHandle::Get())),
rtenneti052774e2015-11-24 21:00:12205 cert_transparency_verifier_(new MultiLogCTVerifier()),
jri7e636642016-01-14 06:57:08206 scoped_mock_network_change_notifier_(nullptr),
jri7046038f2015-10-22 00:29:26207 factory_(nullptr),
[email protected]bf4ea2f2014-03-10 22:57:53208 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
ckrasic3865ee0f2016-02-29 22:04:56209 url_(kDefaultUrl),
210 url2_(kServer2Url),
211 url3_(kServer3Url),
212 url4_(kServer4Url),
jri7046038f2015-10-22 00:29:26213 privacy_mode_(PRIVACY_MODE_DISABLED),
214 enable_port_selection_(true),
215 always_require_handshake_confirmation_(false),
216 disable_connection_pooling_(false),
217 load_server_info_timeout_srtt_multiplier_(0.0f),
218 enable_connection_racing_(true),
219 enable_non_blocking_io_(true),
220 disable_disk_cache_(false),
221 prefer_aes_(false),
222 max_number_of_lossy_connections_(0),
223 packet_loss_threshold_(1.0f),
224 max_disabled_reasons_(3),
225 threshold_timeouts_with_open_streams_(2),
226 threshold_public_resets_post_handshake_(2),
227 receive_buffer_size_(0),
228 delay_tcp_race_(false),
rtenneti41c09992015-11-30 18:24:01229 close_sessions_on_ip_change_(false),
zhongyi89649c32016-01-22 00:14:01230 disable_quic_on_timeout_with_open_streams_(false),
jri7e636642016-01-14 06:57:08231 idle_connection_timeout_seconds_(kIdleConnectionTimeoutSeconds),
jrid36ada62016-02-06 02:42:08232 migrate_sessions_on_network_change_(false),
233 migrate_sessions_early_(false) {
[email protected]ca4e0d92014-08-22 16:33:22234 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
jri7046038f2015-10-22 00:29:26235 }
236
237 void Initialize() {
238 factory_.reset(new QuicStreamFactory(
239 &host_resolver_, &socket_factory_, http_server_properties_.GetWeakPtr(),
240 cert_verifier_.get(), nullptr, channel_id_service_.get(),
rtenneti052774e2015-11-24 21:00:12241 &transport_security_state_, cert_transparency_verifier_.get(),
jri7046038f2015-10-22 00:29:26242 /*SocketPerformanceWatcherFactory*/ nullptr,
243 &crypto_client_stream_factory_, &random_generator_, clock_,
244 kDefaultMaxPacketSize, std::string(),
245 SupportedVersions(GetParam().version), enable_port_selection_,
246 always_require_handshake_confirmation_, disable_connection_pooling_,
247 load_server_info_timeout_srtt_multiplier_, enable_connection_racing_,
248 enable_non_blocking_io_, disable_disk_cache_, prefer_aes_,
249 max_number_of_lossy_connections_, packet_loss_threshold_,
250 max_disabled_reasons_, threshold_timeouts_with_open_streams_,
251 threshold_public_resets_post_handshake_, receive_buffer_size_,
rtenneti6971c172016-01-15 20:12:10252 delay_tcp_race_, /*max_server_configs_stored_in_properties*/ 0,
zhongyi89649c32016-01-22 00:14:01253 close_sessions_on_ip_change_,
254 disable_quic_on_timeout_with_open_streams_,
255 idle_connection_timeout_seconds_, migrate_sessions_on_network_change_,
nharperd5cddca2016-02-27 03:37:52256 migrate_sessions_early_, QuicTagVector(),
257 /*enable_token_binding*/ false));
jri7046038f2015-10-22 00:29:26258 factory_->set_require_confirmation(false);
rtenneti6971c172016-01-15 20:12:10259 EXPECT_FALSE(factory_->has_quic_server_info_factory());
jri7046038f2015-10-22 00:29:26260 factory_->set_quic_server_info_factory(new MockQuicServerInfoFactory());
rtenneti6971c172016-01-15 20:12:10261 EXPECT_TRUE(factory_->has_quic_server_info_factory());
[email protected]e13201d82012-12-12 05:00:32262 }
263
jri7e636642016-01-14 06:57:08264 void InitializeConnectionMigrationTest(
265 NetworkChangeNotifier::NetworkList connected_networks) {
266 scoped_mock_network_change_notifier_.reset(
267 new ScopedMockNetworkChangeNotifier());
268 MockNetworkChangeNotifier* mock_ncn =
269 scoped_mock_network_change_notifier_->mock_network_change_notifier();
270 mock_ncn->ForceNetworkHandlesSupported();
271 mock_ncn->SetConnectedNetworksList(connected_networks);
272 migrate_sessions_on_network_change_ = true;
jrid36ada62016-02-06 02:42:08273 migrate_sessions_early_ = true;
jri7e636642016-01-14 06:57:08274 Initialize();
275 }
276
bnccb7ff3c2015-05-21 20:51:55277 bool HasActiveSession(const HostPortPair& host_port_pair) {
jri7046038f2015-10-22 00:29:26278 return QuicStreamFactoryPeer::HasActiveSession(factory_.get(),
279 host_port_pair);
bnccb7ff3c2015-05-21 20:51:55280 }
281
282 scoped_ptr<QuicHttpStream> CreateFromSession(
283 const HostPortPair& host_port_pair) {
ckrasic4f9d88d2015-07-22 22:23:16284 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:26285 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair);
286 return QuicStreamFactoryPeer::CreateFromSession(factory_.get(), session);
[email protected]df157d9d2014-03-10 07:27:27287 }
[email protected]e13201d82012-12-12 05:00:32288
[email protected]bf4ea2f2014-03-10 22:57:53289 int GetSourcePortForNewSession(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10290 return GetSourcePortForNewSessionInner(destination, false);
291 }
292
rjshaded5ced072015-12-18 19:26:02293 int GetSourcePortForNewSessionAndGoAway(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10294 return GetSourcePortForNewSessionInner(destination, true);
295 }
296
[email protected]bf4ea2f2014-03-10 22:57:53297 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
[email protected]d8e2abf82014-03-06 10:30:10298 bool goaway_received) {
[email protected]3c772402013-12-18 21:38:11299 // Should only be called if there is no active session for this destination.
bnccb7ff3c2015-05-21 20:51:55300 EXPECT_FALSE(HasActiveSession(destination));
mmenke651bae7f2015-12-18 21:26:45301 size_t socket_count = socket_factory_.udp_client_socket_ports().size();
[email protected]3c772402013-12-18 21:38:11302
mmenke651bae7f2015-12-18 21:26:45303 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
304 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]3c772402013-12-18 21:38:11305 socket_factory_.AddSocketDataProvider(&socket_data);
306
jri7046038f2015-10-22 00:29:26307 QuicStreamRequest request(factory_.get());
ckrasic3865ee0f2016-02-29 22:04:56308 GURL url("https://" + destination.host() + "/");
[email protected]974849d2014-02-06 01:32:59309 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56310 request.Request(destination, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56311 /*cert_verify_flags=*/0, url, "GET", net_log_,
312 callback_.callback()));
[email protected]3c772402013-12-18 21:38:11313
314 EXPECT_EQ(OK, callback_.WaitForResult());
315 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
316 EXPECT_TRUE(stream.get());
317 stream.reset();
318
ckrasic4f9d88d2015-07-22 22:23:16319 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:26320 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), destination);
[email protected]3c772402013-12-18 21:38:11321
mmenke651bae7f2015-12-18 21:26:45322 if (socket_count + 1 != socket_factory_.udp_client_socket_ports().size()) {
323 ADD_FAILURE();
[email protected]3c772402013-12-18 21:38:11324 return 0;
325 }
326
[email protected]d8e2abf82014-03-06 10:30:10327 if (goaway_received) {
328 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, "");
rtenneti9bd5d4b2015-08-21 05:44:52329 session->connection()->OnGoAwayFrame(goaway);
[email protected]d8e2abf82014-03-06 10:30:10330 }
[email protected]3c772402013-12-18 21:38:11331
jri7046038f2015-10-22 00:29:26332 factory_->OnSessionClosed(session);
bnccb7ff3c2015-05-21 20:51:55333 EXPECT_FALSE(HasActiveSession(destination));
rch37de576c2015-05-17 20:28:17334 EXPECT_TRUE(socket_data.AllReadDataConsumed());
335 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:45336 return socket_factory_.udp_client_socket_ports()[socket_count];
[email protected]3c772402013-12-18 21:38:11337 }
338
rtenneti1cd3b162015-09-29 02:58:28339 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
340 QuicPacketNumber num) {
341 return maker_.MakeConnectionClosePacket(num);
342 }
343
[email protected]459a7402014-02-10 12:58:52344 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() {
[email protected]66ae5962014-05-22 11:13:05345 QuicStreamId stream_id = kClientDataStreamId1;
[email protected]51cc1342014-04-18 23:44:37346 return maker_.MakeRstPacket(
347 1, true, stream_id,
rtenneti14abd312015-02-06 21:56:01348 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam().version));
[email protected]459a7402014-02-10 12:58:52349 }
350
bncf8bf0722015-05-19 20:04:13351 static ProofVerifyDetailsChromium DefaultProofVerifyDetails() {
rch6faa4d42016-01-05 20:48:43352 // Load a certificate that is valid for *.example.org
bncf8bf0722015-05-19 20:04:13353 scoped_refptr<X509Certificate> test_cert(
rch6faa4d42016-01-05 20:48:43354 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bncf8bf0722015-05-19 20:04:13355 EXPECT_TRUE(test_cert.get());
356 ProofVerifyDetailsChromium verify_details;
357 verify_details.cert_verify_result.verified_cert = test_cert;
358 verify_details.cert_verify_result.is_issued_by_known_root = true;
359 return verify_details;
360 }
361
jri8c44d692015-10-23 23:53:41362 void NotifyIPAddressChanged() {
363 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
jri7e636642016-01-14 06:57:08364 // Spin the message loop so the notification is delivered.
jri8c44d692015-10-23 23:53:41365 base::MessageLoop::current()->RunUntilIdle();
366 }
367
jri7e636642016-01-14 06:57:08368 scoped_ptr<QuicEncryptedPacket> ConstructGetRequestPacket(
369 QuicPacketNumber packet_number,
370 QuicStreamId stream_id,
371 bool should_include_version,
372 bool fin) {
373 SpdyHeaderBlock headers = maker_.GetRequestHeaders("GET", "https", "/");
374 SpdyPriority priority =
375 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
376 size_t spdy_headers_frame_len;
377 return maker_.MakeRequestHeadersPacket(
378 packet_number, stream_id, should_include_version, fin, priority,
379 headers, &spdy_headers_frame_len);
380 }
381
382 scoped_ptr<QuicEncryptedPacket> ConstructOkResponsePacket(
383 QuicPacketNumber packet_number,
384 QuicStreamId stream_id,
385 bool should_include_version,
386 bool fin) {
387 SpdyHeaderBlock headers = maker_.GetResponseHeaders("200 OK");
388 size_t spdy_headers_frame_len;
389 return maker_.MakeResponseHeadersPacket(packet_number, stream_id,
390 should_include_version, fin,
391 headers, &spdy_headers_frame_len);
392 }
393
[email protected]e13201d82012-12-12 05:00:32394 MockHostResolver host_resolver_;
mmenke651bae7f2015-12-18 21:26:45395 MockClientSocketFactory socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05396 MockCryptoClientStreamFactory crypto_client_stream_factory_;
jri7e636642016-01-14 06:57:08397 ProofVerifyDetailsChromium verify_details_;
[email protected]9558c5d32012-12-22 00:08:14398 MockRandom random_generator_;
[email protected]872edd9e2013-01-16 08:51:15399 MockClock* clock_; // Owned by factory_.
rtenneti38f5cd52014-10-28 20:28:28400 scoped_refptr<TestTaskRunner> runner_;
rtenneti4b06ae72014-08-26 03:43:43401 QuicTestPacketMaker maker_;
rtenneticcab42b2015-10-09 06:38:16402 HttpServerPropertiesImpl http_server_properties_;
[email protected]59c0bbd2014-03-22 04:08:12403 scoped_ptr<CertVerifier> cert_verifier_;
[email protected]6b8a3c742014-07-25 00:25:35404 scoped_ptr<ChannelIDService> channel_id_service_;
[email protected]080b77932014-08-04 01:22:46405 TransportSecurityState transport_security_state_;
rtenneti052774e2015-11-24 21:00:12406 scoped_ptr<CTVerifier> cert_transparency_verifier_;
jri7e636642016-01-14 06:57:08407 scoped_ptr<ScopedMockNetworkChangeNotifier>
408 scoped_mock_network_change_notifier_;
jri7046038f2015-10-22 00:29:26409 scoped_ptr<QuicStreamFactory> factory_;
[email protected]bf4ea2f2014-03-10 22:57:53410 HostPortPair host_port_pair_;
ckrasic3865ee0f2016-02-29 22:04:56411 GURL url_;
412 GURL url2_;
413 GURL url3_;
414 GURL url4_;
415
[email protected]9dd3ff0f2014-03-26 09:51:28416 PrivacyMode privacy_mode_;
[email protected]e13201d82012-12-12 05:00:32417 BoundNetLog net_log_;
418 TestCompletionCallback callback_;
jri7046038f2015-10-22 00:29:26419
420 // Variables to configure QuicStreamFactory.
421 bool enable_port_selection_;
422 bool always_require_handshake_confirmation_;
423 bool disable_connection_pooling_;
424 double load_server_info_timeout_srtt_multiplier_;
425 bool enable_connection_racing_;
426 bool enable_non_blocking_io_;
427 bool disable_disk_cache_;
428 bool prefer_aes_;
429 int max_number_of_lossy_connections_;
430 double packet_loss_threshold_;
431 int max_disabled_reasons_;
432 int threshold_timeouts_with_open_streams_;
433 int threshold_public_resets_post_handshake_;
434 int receive_buffer_size_;
435 bool delay_tcp_race_;
jri8c44d692015-10-23 23:53:41436 bool close_sessions_on_ip_change_;
zhongyi89649c32016-01-22 00:14:01437 bool disable_quic_on_timeout_with_open_streams_;
rtenneti41c09992015-11-30 18:24:01438 int idle_connection_timeout_seconds_;
jri7e636642016-01-14 06:57:08439 bool migrate_sessions_on_network_change_;
jrid36ada62016-02-06 02:42:08440 bool migrate_sessions_early_;
[email protected]e13201d82012-12-12 05:00:32441};
442
rtenneti14abd312015-02-06 21:56:01443INSTANTIATE_TEST_CASE_P(Version,
444 QuicStreamFactoryTest,
445 ::testing::ValuesIn(GetTestParams()));
[email protected]1e960032013-12-20 19:00:20446
[email protected]1e960032013-12-20 19:00:20447TEST_P(QuicStreamFactoryTest, Create) {
jri7046038f2015-10-22 00:29:26448 Initialize();
rch6faa4d42016-01-05 20:48:43449 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
450 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26451
mmenke651bae7f2015-12-18 21:26:45452 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
453 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:32454 socket_factory_.AddSocketDataProvider(&socket_data);
455
jri7046038f2015-10-22 00:29:26456 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:59457 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56458 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56459 /*cert_verify_flags=*/0, url_, "GET", net_log_,
460 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32461
462 EXPECT_EQ(OK, callback_.WaitForResult());
463 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0edce6a2013-05-08 18:02:40464 EXPECT_TRUE(stream.get());
[email protected]e13201d82012-12-12 05:00:32465
466 // Will reset stream 3.
bnccb7ff3c2015-05-21 20:51:55467 stream = CreateFromSession(host_port_pair_);
[email protected]e13201d82012-12-12 05:00:32468 EXPECT_TRUE(stream.get());
469
[email protected]6d1b4ed2013-07-10 03:57:54470 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
471 // in streams on different sessions.
jri7046038f2015-10-22 00:29:26472 QuicStreamRequest request2(factory_.get());
ckrasic3865ee0f2016-02-29 22:04:56473 EXPECT_EQ(OK, request2.Request(host_port_pair_, privacy_mode_,
474 /*cert_verify_flags=*/0, url_, "GET", net_log_,
475 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32476 stream = request2.ReleaseStream(); // Will reset stream 5.
rjshaded5ced072015-12-18 19:26:02477 stream.reset(); // Will reset stream 7.
[email protected]e13201d82012-12-12 05:00:32478
rch37de576c2015-05-17 20:28:17479 EXPECT_TRUE(socket_data.AllReadDataConsumed());
480 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:32481}
482
[email protected]8bd2b812014-03-26 04:01:17483TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
jri7046038f2015-10-22 00:29:26484 Initialize();
rch6faa4d42016-01-05 20:48:43485 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
486 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26487
mmenke651bae7f2015-12-18 21:26:45488 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
489 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17490 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]8bd2b812014-03-26 04:01:17491
492 crypto_client_stream_factory_.set_handshake_mode(
493 MockCryptoClientStream::ZERO_RTT);
494 host_resolver_.set_synchronous_mode(true);
495 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
496 "192.168.0.1", "");
497
jri7046038f2015-10-22 00:29:26498 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56499 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56500 /*cert_verify_flags=*/0, url_, "GET", net_log_,
501 callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17502
503 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
504 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17505 EXPECT_TRUE(socket_data.AllReadDataConsumed());
506 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17507}
508
509TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
jri7046038f2015-10-22 00:29:26510 Initialize();
rch6faa4d42016-01-05 20:48:43511 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
512 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26513
mmenke651bae7f2015-12-18 21:26:45514 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
515 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17516 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]8bd2b812014-03-26 04:01:17517
518 crypto_client_stream_factory_.set_handshake_mode(
519 MockCryptoClientStream::ZERO_RTT);
520 host_resolver_.set_synchronous_mode(true);
521 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
522 "192.168.0.1", "");
523
jri7046038f2015-10-22 00:29:26524 QuicStreamRequest request(factory_.get());
[email protected]8bd2b812014-03-26 04:01:17525 // Posts require handshake confirmation, so this will return asynchronously.
526 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56527 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56528 /*cert_verify_flags=*/0, url_, "POST", net_log_,
529 callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17530
531 // Confirm the handshake and verify that the stream is created.
532 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
533 QuicSession::HANDSHAKE_CONFIRMED);
534
535 EXPECT_EQ(OK, callback_.WaitForResult());
536 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
537 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17538 EXPECT_TRUE(socket_data.AllReadDataConsumed());
539 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17540}
541
bnc68d401dd2015-05-18 20:31:48542TEST_P(QuicStreamFactoryTest, NoZeroRttForDifferentHost) {
jri7046038f2015-10-22 00:29:26543 Initialize();
rch6faa4d42016-01-05 20:48:43544 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
545 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26546
mmenke651bae7f2015-12-18 21:26:45547 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
548 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
bnc68d401dd2015-05-18 20:31:48549 socket_factory_.AddSocketDataProvider(&socket_data);
bnc68d401dd2015-05-18 20:31:48550
551 crypto_client_stream_factory_.set_handshake_mode(
552 MockCryptoClientStream::ZERO_RTT);
553 host_resolver_.set_synchronous_mode(true);
554 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
555 "192.168.0.1", "");
556
jri7046038f2015-10-22 00:29:26557 QuicStreamRequest request(factory_.get());
ckrasic3865ee0f2016-02-29 22:04:56558 int rv = request.Request(host_port_pair_, privacy_mode_,
559 /*cert_verify_flags=*/0, url2_, "GET", net_log_,
560 callback_.callback());
bnc68d401dd2015-05-18 20:31:48561 // If server and origin have different hostnames, then handshake confirmation
562 // should be required, so Request will return asynchronously.
563 EXPECT_EQ(ERR_IO_PENDING, rv);
564 // Confirm handshake.
565 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
566 QuicSession::HANDSHAKE_CONFIRMED);
567 EXPECT_EQ(OK, callback_.WaitForResult());
568
569 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
570 EXPECT_TRUE(stream.get());
571 EXPECT_TRUE(socket_data.AllReadDataConsumed());
572 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
573}
574
rch68955482015-09-24 00:14:39575TEST_P(QuicStreamFactoryTest, GoAway) {
jri7046038f2015-10-22 00:29:26576 Initialize();
rch6faa4d42016-01-05 20:48:43577 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
578 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26579
mmenke651bae7f2015-12-18 21:26:45580 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
581 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rch68955482015-09-24 00:14:39582 socket_factory_.AddSocketDataProvider(&socket_data);
rch68955482015-09-24 00:14:39583
jri7046038f2015-10-22 00:29:26584 QuicStreamRequest request(factory_.get());
rch68955482015-09-24 00:14:39585 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56586 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56587 /*cert_verify_flags=*/0, url_, "GET", net_log_,
588 callback_.callback()));
rch68955482015-09-24 00:14:39589
590 EXPECT_EQ(OK, callback_.WaitForResult());
591 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
592 EXPECT_TRUE(stream.get());
593
rchf114d982015-10-21 01:34:56594 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:26595 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
rch68955482015-09-24 00:14:39596
597 session->OnGoAway(QuicGoAwayFrame());
598
rchf114d982015-10-21 01:34:56599 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:26600 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
rch68955482015-09-24 00:14:39601
602 EXPECT_TRUE(socket_data.AllReadDataConsumed());
603 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
604}
605
[email protected]5db452202014-08-19 05:22:15606TEST_P(QuicStreamFactoryTest, Pooling) {
jri7046038f2015-10-22 00:29:26607 Initialize();
rch6faa4d42016-01-05 20:48:43608 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
609 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26610
mmenke651bae7f2015-12-18 21:26:45611 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
612 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38613 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]eed749f92013-12-23 18:57:38614
rch6faa4d42016-01-05 20:48:43615 HostPortPair server2(kServer2HostName, kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38616 host_resolver_.set_synchronous_mode(true);
rch6faa4d42016-01-05 20:48:43617 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
rjshaded5ced072015-12-18 19:26:02618 "192.168.0.1", "");
rch6faa4d42016-01-05 20:48:43619 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38620
jri7046038f2015-10-22 00:29:26621 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56622 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56623 /*cert_verify_flags=*/0, url_, "GET", net_log_,
624 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38625 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
626 EXPECT_TRUE(stream.get());
627
628 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26629 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56630 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56631 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50632 net_log_, callback.callback()));
[email protected]eed749f92013-12-23 18:57:38633 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
634 EXPECT_TRUE(stream2.get());
635
jri7046038f2015-10-22 00:29:26636 EXPECT_EQ(
637 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_),
638 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38639
rch37de576c2015-05-17 20:28:17640 EXPECT_TRUE(socket_data.AllReadDataConsumed());
641 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38642}
643
jri584002d12014-09-09 00:51:28644TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) {
jri7046038f2015-10-22 00:29:26645 disable_connection_pooling_ = true;
646 Initialize();
rch6faa4d42016-01-05 20:48:43647 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
648 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
649 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26650
mmenke651bae7f2015-12-18 21:26:45651 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
652 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
653 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28654 socket_factory_.AddSocketDataProvider(&socket_data1);
655 socket_factory_.AddSocketDataProvider(&socket_data2);
jri584002d12014-09-09 00:51:28656
rch6faa4d42016-01-05 20:48:43657 HostPortPair server2(kServer2HostName, kDefaultServerPort);
jri584002d12014-09-09 00:51:28658 host_resolver_.set_synchronous_mode(true);
rch6faa4d42016-01-05 20:48:43659 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
rjshaded5ced072015-12-18 19:26:02660 "192.168.0.1", "");
rch6faa4d42016-01-05 20:48:43661 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
jri584002d12014-09-09 00:51:28662
jri7046038f2015-10-22 00:29:26663 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56664 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56665 /*cert_verify_flags=*/0, url_, "GET", net_log_,
666 callback_.callback()));
jri584002d12014-09-09 00:51:28667 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
668 EXPECT_TRUE(stream.get());
669
670 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26671 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56672 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56673 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50674 net_log_, callback.callback()));
jri584002d12014-09-09 00:51:28675 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
676 EXPECT_TRUE(stream2.get());
677
jri7046038f2015-10-22 00:29:26678 EXPECT_NE(
679 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_),
680 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
jri584002d12014-09-09 00:51:28681
rch37de576c2015-05-17 20:28:17682 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
683 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
684 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
685 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28686}
687
[email protected]eed749f92013-12-23 18:57:38688TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
jri7046038f2015-10-22 00:29:26689 Initialize();
rch6faa4d42016-01-05 20:48:43690 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
691 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
692 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26693
mmenke651bae7f2015-12-18 21:26:45694 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
695 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
696 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38697 socket_factory_.AddSocketDataProvider(&socket_data1);
698 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]eed749f92013-12-23 18:57:38699
rch6faa4d42016-01-05 20:48:43700 HostPortPair server2(kServer2HostName, kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38701 host_resolver_.set_synchronous_mode(true);
rch6faa4d42016-01-05 20:48:43702 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
rjshaded5ced072015-12-18 19:26:02703 "192.168.0.1", "");
rch6faa4d42016-01-05 20:48:43704 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38705
jri7046038f2015-10-22 00:29:26706 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56707 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56708 /*cert_verify_flags=*/0, url_, "GET", net_log_,
709 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38710 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
711 EXPECT_TRUE(stream.get());
712
713 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26714 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56715 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56716 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50717 net_log_, callback.callback()));
[email protected]eed749f92013-12-23 18:57:38718 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
719 EXPECT_TRUE(stream2.get());
720
jri7046038f2015-10-22 00:29:26721 factory_->OnSessionGoingAway(
722 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_));
rchf114d982015-10-21 01:34:56723 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:26724 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
725 EXPECT_FALSE(
726 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38727
728 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:26729 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:56730 EXPECT_EQ(OK, request3.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56731 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50732 net_log_, callback3.callback()));
[email protected]eed749f92013-12-23 18:57:38733 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
734 EXPECT_TRUE(stream3.get());
735
jri7046038f2015-10-22 00:29:26736 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38737
rch37de576c2015-05-17 20:28:17738 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
739 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
740 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
741 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38742}
743
[email protected]5db452202014-08-19 05:22:15744TEST_P(QuicStreamFactoryTest, HttpsPooling) {
jri7046038f2015-10-22 00:29:26745 Initialize();
rch6faa4d42016-01-05 20:48:43746
mmenke651bae7f2015-12-18 21:26:45747 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
748 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38749 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]eed749f92013-12-23 18:57:38750
rch6faa4d42016-01-05 20:48:43751 HostPortPair server1(kDefaultServerHostName, 443);
752 HostPortPair server2(kServer2HostName, 443);
[email protected]eed749f92013-12-23 18:57:38753
bncf8bf0722015-05-19 20:04:13754 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01755 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38756
757 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53758 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
759 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38760
jri7046038f2015-10-22 00:29:26761 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56762 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56763 /*cert_verify_flags=*/0, url_, "GET", net_log_,
764 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38765 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
766 EXPECT_TRUE(stream.get());
767
768 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26769 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56770 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56771 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50772 net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38773 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
774 EXPECT_TRUE(stream2.get());
775
jri7046038f2015-10-22 00:29:26776 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
777 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38778
rch37de576c2015-05-17 20:28:17779 EXPECT_TRUE(socket_data.AllReadDataConsumed());
780 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38781}
782
jri584002d12014-09-09 00:51:28783TEST_P(QuicStreamFactoryTest, NoHttpsPoolingIfDisabled) {
jri7046038f2015-10-22 00:29:26784 disable_connection_pooling_ = true;
785 Initialize();
786
mmenke651bae7f2015-12-18 21:26:45787 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
788 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
789 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28790 socket_factory_.AddSocketDataProvider(&socket_data1);
791 socket_factory_.AddSocketDataProvider(&socket_data2);
jri584002d12014-09-09 00:51:28792
rch6faa4d42016-01-05 20:48:43793 HostPortPair server1(kDefaultServerHostName, 443);
794 HostPortPair server2(kServer2HostName, 443);
jri584002d12014-09-09 00:51:28795
bncf8bf0722015-05-19 20:04:13796 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01797 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rch6faa4d42016-01-05 20:48:43798 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28799
800 host_resolver_.set_synchronous_mode(true);
801 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
802 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
803
jri7046038f2015-10-22 00:29:26804 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56805 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56806 /*cert_verify_flags=*/0, url_, "GET", net_log_,
807 callback_.callback()));
jri584002d12014-09-09 00:51:28808 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
809 EXPECT_TRUE(stream.get());
810
811 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26812 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56813 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56814 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50815 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28816 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
817 EXPECT_TRUE(stream2.get());
818
jri7046038f2015-10-22 00:29:26819 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
820 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
jri584002d12014-09-09 00:51:28821
rch37de576c2015-05-17 20:28:17822 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
823 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
824 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
825 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28826}
827
bnccb7ff3c2015-05-21 20:51:55828class QuicAlternativeServiceCertificateValidationPooling
829 : public QuicStreamFactoryTest {
830 public:
831 void Run(bool valid) {
mmenke651bae7f2015-12-18 21:26:45832 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
833 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
bnccb7ff3c2015-05-21 20:51:55834 socket_factory_.AddSocketDataProvider(&socket_data1);
[email protected]eed749f92013-12-23 18:57:38835
rch6faa4d42016-01-05 20:48:43836 HostPortPair server1(kDefaultServerHostName, 443);
837 HostPortPair server2(kServer2HostName, 443);
[email protected]eed749f92013-12-23 18:57:38838
ckrasic3865ee0f2016-02-29 22:04:56839 GURL url(valid ? url2_ : GURL("http://invalid.example.com/"));
rch6faa4d42016-01-05 20:48:43840 HostPortPair alternative(kDefaultServerHostName, 443);
[email protected]eed749f92013-12-23 18:57:38841
bnccb7ff3c2015-05-21 20:51:55842 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
843 bool common_name_fallback_used;
844 EXPECT_EQ(valid,
845 verify_details.cert_verify_result.verified_cert->VerifyNameMatch(
ckrasic3865ee0f2016-02-29 22:04:56846 url.host(), &common_name_fallback_used));
bnccb7ff3c2015-05-21 20:51:55847 EXPECT_TRUE(
848 verify_details.cert_verify_result.verified_cert->VerifyNameMatch(
849 alternative.host(), &common_name_fallback_used));
850 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38851
bnccb7ff3c2015-05-21 20:51:55852 host_resolver_.set_synchronous_mode(true);
853 host_resolver_.rules()->AddIPLiteralRule(alternative.host(), "192.168.0.1",
854 "");
[email protected]eed749f92013-12-23 18:57:38855
bnccb7ff3c2015-05-21 20:51:55856 // Open first stream to alternative.
jri7046038f2015-10-22 00:29:26857 QuicStreamRequest request1(factory_.get());
rchf114d982015-10-21 01:34:56858 EXPECT_EQ(OK, request1.Request(alternative, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56859 /*cert_verify_flags=*/0, url_, "GET",
860 net_log_, callback_.callback()));
bnccb7ff3c2015-05-21 20:51:55861 scoped_ptr<QuicHttpStream> stream1 = request1.ReleaseStream();
862 EXPECT_TRUE(stream1.get());
[email protected]eed749f92013-12-23 18:57:38863
jri7046038f2015-10-22 00:29:26864 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56865 int rv = request2.Request(alternative, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56866 /*cert_verify_flags=*/0, url, "GET", net_log_,
867 callback_.callback());
bnccb7ff3c2015-05-21 20:51:55868 if (valid) {
869 // Alternative service of origin to |alternative| should pool to session
870 // of |stream1| even if origin is different. Since only one
871 // SocketDataProvider is set up, the second request succeeding means that
872 // it pooled to the session opened by the first one.
873 EXPECT_EQ(OK, rv);
874 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
875 EXPECT_TRUE(stream2.get());
876 } else {
877 EXPECT_EQ(ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN, rv);
878 }
[email protected]eed749f92013-12-23 18:57:38879
bnccb7ff3c2015-05-21 20:51:55880 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
881 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
882 }
883};
884
885INSTANTIATE_TEST_CASE_P(Version,
886 QuicAlternativeServiceCertificateValidationPooling,
887 ::testing::ValuesIn(GetTestParams()));
888
889TEST_P(QuicAlternativeServiceCertificateValidationPooling, Valid) {
jri7046038f2015-10-22 00:29:26890 Initialize();
bnccb7ff3c2015-05-21 20:51:55891 Run(true);
892}
893
894TEST_P(QuicAlternativeServiceCertificateValidationPooling, Invalid) {
jri7046038f2015-10-22 00:29:26895 Initialize();
bnccb7ff3c2015-05-21 20:51:55896 Run(false);
[email protected]eed749f92013-12-23 18:57:38897}
898
[email protected]5db452202014-08-19 05:22:15899TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
jri7046038f2015-10-22 00:29:26900 Initialize();
mmenke651bae7f2015-12-18 21:26:45901 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
902 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15903 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]5db452202014-08-19 05:22:15904
rch6faa4d42016-01-05 20:48:43905 HostPortPair server1(kDefaultServerHostName, 443);
906 HostPortPair server2(kServer2HostName, 443);
Avi Drissman13fc8932015-12-20 04:40:46907 uint8_t primary_pin = 1;
908 uint8_t backup_pin = 2;
rch6faa4d42016-01-05 20:48:43909 test::AddPin(&transport_security_state_, kServer2HostName, primary_pin,
[email protected]5db452202014-08-19 05:22:15910 backup_pin);
911
bncf8bf0722015-05-19 20:04:13912 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
[email protected]5db452202014-08-19 05:22:15913 verify_details.cert_verify_result.public_key_hashes.push_back(
914 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01915 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]5db452202014-08-19 05:22:15916
917 host_resolver_.set_synchronous_mode(true);
918 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
919 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
920
jri7046038f2015-10-22 00:29:26921 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56922 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56923 /*cert_verify_flags=*/0, url_, "GET", net_log_,
924 callback_.callback()));
[email protected]5db452202014-08-19 05:22:15925 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
926 EXPECT_TRUE(stream.get());
927
928 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26929 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56930 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56931 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50932 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15933 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
934 EXPECT_TRUE(stream2.get());
935
jri7046038f2015-10-22 00:29:26936 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
937 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]5db452202014-08-19 05:22:15938
rch37de576c2015-05-17 20:28:17939 EXPECT_TRUE(socket_data.AllReadDataConsumed());
940 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:15941}
942
jri584002d12014-09-09 00:51:28943TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithMatchingPinsIfDisabled) {
jri7046038f2015-10-22 00:29:26944 disable_connection_pooling_ = true;
945 Initialize();
946
mmenke651bae7f2015-12-18 21:26:45947 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
948 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
949 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28950 socket_factory_.AddSocketDataProvider(&socket_data1);
951 socket_factory_.AddSocketDataProvider(&socket_data2);
jri584002d12014-09-09 00:51:28952
rch6faa4d42016-01-05 20:48:43953 HostPortPair server1(kDefaultServerHostName, 443);
954 HostPortPair server2(kServer2HostName, 443);
Avi Drissman13fc8932015-12-20 04:40:46955 uint8_t primary_pin = 1;
956 uint8_t backup_pin = 2;
rch6faa4d42016-01-05 20:48:43957 test::AddPin(&transport_security_state_, kServer2HostName, primary_pin,
jri584002d12014-09-09 00:51:28958 backup_pin);
959
bncf8bf0722015-05-19 20:04:13960 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
jri584002d12014-09-09 00:51:28961 verify_details.cert_verify_result.public_key_hashes.push_back(
962 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01963 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rch6faa4d42016-01-05 20:48:43964 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28965
966 host_resolver_.set_synchronous_mode(true);
967 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
968 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
969
jri7046038f2015-10-22 00:29:26970 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56971 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56972 /*cert_verify_flags=*/0, url_, "GET", net_log_,
973 callback_.callback()));
jri584002d12014-09-09 00:51:28974 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
975 EXPECT_TRUE(stream.get());
976
977 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26978 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56979 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:56980 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:50981 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28982 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
983 EXPECT_TRUE(stream2.get());
984
jri7046038f2015-10-22 00:29:26985 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
986 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
jri584002d12014-09-09 00:51:28987
rch37de576c2015-05-17 20:28:17988 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
989 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
990 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
991 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28992}
993
[email protected]5db452202014-08-19 05:22:15994TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
jri7046038f2015-10-22 00:29:26995 Initialize();
mmenke651bae7f2015-12-18 21:26:45996 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
997 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
998 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15999 socket_factory_.AddSocketDataProvider(&socket_data1);
1000 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]5db452202014-08-19 05:22:151001
rch6faa4d42016-01-05 20:48:431002 HostPortPair server1(kDefaultServerHostName, 443);
1003 HostPortPair server2(kServer2HostName, 443);
Avi Drissman13fc8932015-12-20 04:40:461004 uint8_t primary_pin = 1;
1005 uint8_t backup_pin = 2;
1006 uint8_t bad_pin = 3;
rch6faa4d42016-01-05 20:48:431007 test::AddPin(&transport_security_state_, kServer2HostName, primary_pin,
[email protected]5db452202014-08-19 05:22:151008 backup_pin);
1009
bncf8bf0722015-05-19 20:04:131010 ProofVerifyDetailsChromium verify_details1 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011011 verify_details1.cert_verify_result.public_key_hashes.push_back(
1012 test::GetTestHashValue(bad_pin));
1013 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
1014
bncf8bf0722015-05-19 20:04:131015 ProofVerifyDetailsChromium verify_details2 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011016 verify_details2.cert_verify_result.public_key_hashes.push_back(
1017 test::GetTestHashValue(primary_pin));
1018 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
[email protected]5db452202014-08-19 05:22:151019
1020 host_resolver_.set_synchronous_mode(true);
1021 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1022 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1023
jri7046038f2015-10-22 00:29:261024 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561025 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561026 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1027 callback_.callback()));
[email protected]5db452202014-08-19 05:22:151028 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1029 EXPECT_TRUE(stream.get());
1030
1031 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:261032 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:561033 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561034 /*cert_verify_flags=*/0, url2_, "GET",
rtennetia75df622015-06-21 23:59:501035 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:151036 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1037 EXPECT_TRUE(stream2.get());
1038
jri7046038f2015-10-22 00:29:261039 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
1040 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]5db452202014-08-19 05:22:151041
rch37de576c2015-05-17 20:28:171042 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1043 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1044 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1045 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:151046}
1047
[email protected]1e960032013-12-20 19:00:201048TEST_P(QuicStreamFactoryTest, Goaway) {
jri7046038f2015-10-22 00:29:261049 Initialize();
rch6faa4d42016-01-05 20:48:431050 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1051 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1052 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1053
mmenke651bae7f2015-12-18 21:26:451054 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1055 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271056 socket_factory_.AddSocketDataProvider(&socket_data);
mmenke651bae7f2015-12-18 21:26:451057 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271058 socket_factory_.AddSocketDataProvider(&socket_data2);
1059
jri7046038f2015-10-22 00:29:261060 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591061 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561062 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561063 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1064 callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271065
1066 EXPECT_EQ(OK, callback_.WaitForResult());
1067 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1068 EXPECT_TRUE(stream.get());
1069
1070 // Mark the session as going away. Ensure that while it is still alive
1071 // that it is no longer active.
rchf114d982015-10-21 01:34:561072 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:261073 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1074 factory_->OnSessionGoingAway(session);
1075 EXPECT_EQ(true,
1076 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
rchf114d982015-10-21 01:34:561077 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261078 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
bnccb7ff3c2015-05-21 20:51:551079 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]4d283b32013-10-17 12:57:271080
1081 // Create a new request for the same destination and verify that a
1082 // new session is created.
jri7046038f2015-10-22 00:29:261083 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591084 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561085 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561086 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1087 callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271088 EXPECT_EQ(OK, callback_.WaitForResult());
1089 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1090 EXPECT_TRUE(stream2.get());
1091
rchf114d982015-10-21 01:34:561092 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:261093 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
1094 EXPECT_NE(session, QuicStreamFactoryPeer::GetActiveSession(factory_.get(),
rchf114d982015-10-21 01:34:561095 host_port_pair_));
jri7046038f2015-10-22 00:29:261096 EXPECT_EQ(true,
1097 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
[email protected]4d283b32013-10-17 12:57:271098
1099 stream2.reset();
1100 stream.reset();
1101
rch37de576c2015-05-17 20:28:171102 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1103 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1104 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1105 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]4d283b32013-10-17 12:57:271106}
1107
[email protected]1e960032013-12-20 19:00:201108TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
jri7046038f2015-10-22 00:29:261109 Initialize();
rch6faa4d42016-01-05 20:48:431110 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1111 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1112
[email protected]66ae5962014-05-22 11:13:051113 QuicStreamId stream_id = kClientDataStreamId1;
ckrasicea295fe2015-10-31 05:03:271114 scoped_ptr<QuicEncryptedPacket> client_rst(
[email protected]1e960032013-12-20 19:00:201115 maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
[email protected]06ff5152013-08-29 01:03:051116 MockWrite writes[] = {
ckrasicea295fe2015-10-31 05:03:271117 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 0),
1118 };
1119 scoped_ptr<QuicEncryptedPacket> server_rst(
1120 maker_.MakeRstPacket(1, false, stream_id, QUIC_STREAM_CANCELLED));
1121 MockRead reads[] = {
1122 MockRead(ASYNC, server_rst->data(), server_rst->length(), 1),
mmenke651bae7f2015-12-18 21:26:451123 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
1124 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1125 arraysize(writes));
[email protected]0b2294d32013-08-02 00:46:361126 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0b2294d32013-08-02 00:46:361127
1128 HttpRequestInfo request_info;
1129 std::vector<QuicHttpStream*> streams;
1130 // The MockCryptoClientStream sets max_open_streams to be
rtenneti6a4cf3b2015-01-09 03:41:151131 // kDefaultMaxStreamsPerConnection / 2.
1132 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection / 2; i++) {
jri7046038f2015-10-22 00:29:261133 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561134 int rv = request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561135 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1136 callback_.callback());
[email protected]0b2294d32013-08-02 00:46:361137 if (i == 0) {
1138 EXPECT_EQ(ERR_IO_PENDING, rv);
1139 EXPECT_EQ(OK, callback_.WaitForResult());
1140 } else {
1141 EXPECT_EQ(OK, rv);
1142 }
1143 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1144 EXPECT_TRUE(stream);
rjshaded5ced072015-12-18 19:26:021145 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1146 net_log_, CompletionCallback()));
[email protected]0b2294d32013-08-02 00:46:361147 streams.push_back(stream.release());
1148 }
1149
jri7046038f2015-10-22 00:29:261150 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561151 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561152 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1153 CompletionCallback()));
[email protected]0b2294d32013-08-02 00:46:361154 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1155 EXPECT_TRUE(stream);
rjshaded5ced072015-12-18 19:26:021156 EXPECT_EQ(ERR_IO_PENDING,
1157 stream->InitializeStream(&request_info, DEFAULT_PRIORITY, net_log_,
1158 callback_.callback()));
[email protected]0b2294d32013-08-02 00:46:361159
1160 // Close the first stream.
1161 streams.front()->Close(false);
ckrasicea295fe2015-10-31 05:03:271162 // Trigger exchange of RSTs that in turn allow progress for the last
1163 // stream.
[email protected]0b2294d32013-08-02 00:46:361164 EXPECT_EQ(OK, callback_.WaitForResult());
1165
rch37de576c2015-05-17 20:28:171166 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1167 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
ckrasicea295fe2015-10-31 05:03:271168
1169 // Force close of the connection to suppress the generation of RST
1170 // packets when streams are torn down, which wouldn't be relevant to
1171 // this test anyway.
1172 QuicChromiumClientSession* session =
1173 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
fayanga64c1a92016-02-13 01:55:581174 session->connection()->CloseConnection(QUIC_PUBLIC_RESET,
1175 ConnectionCloseSource::FROM_PEER);
ckrasicea295fe2015-10-31 05:03:271176
[email protected]0b2294d32013-08-02 00:46:361177 STLDeleteElements(&streams);
1178}
1179
[email protected]1e960032013-12-20 19:00:201180TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
jri7046038f2015-10-22 00:29:261181 Initialize();
mmenke651bae7f2015-12-18 21:26:451182 SequencedSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321183 socket_factory_.AddSocketDataProvider(&socket_data);
1184
[email protected]3c772402013-12-18 21:38:111185 host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName);
[email protected]e13201d82012-12-12 05:00:321186
jri7046038f2015-10-22 00:29:261187 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591188 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561189 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561190 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1191 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321192
1193 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
1194
rch37de576c2015-05-17 20:28:171195 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1196 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321197}
1198
[email protected]1e960032013-12-20 19:00:201199TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
jri7046038f2015-10-22 00:29:261200 Initialize();
[email protected]3c772402013-12-18 21:38:111201 MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
mmenke651bae7f2015-12-18 21:26:451202 SequencedSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]3c772402013-12-18 21:38:111203 socket_data.set_connect_data(connect);
1204 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]3c772402013-12-18 21:38:111205
jri7046038f2015-10-22 00:29:261206 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591207 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561208 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561209 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1210 callback_.callback()));
[email protected]3c772402013-12-18 21:38:111211
1212 EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult());
1213
rch37de576c2015-05-17 20:28:171214 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1215 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:111216}
1217
[email protected]1e960032013-12-20 19:00:201218TEST_P(QuicStreamFactoryTest, CancelCreate) {
jri7046038f2015-10-22 00:29:261219 Initialize();
mmenke651bae7f2015-12-18 21:26:451220 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1221 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321222 socket_factory_.AddSocketDataProvider(&socket_data);
1223 {
jri7046038f2015-10-22 00:29:261224 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591225 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561226 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561227 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1228 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321229 }
1230
mmenke651bae7f2015-12-18 21:26:451231 base::RunLoop().RunUntilIdle();
[email protected]e13201d82012-12-12 05:00:321232
bnccb7ff3c2015-05-21 20:51:551233 scoped_ptr<QuicHttpStream> stream(CreateFromSession(host_port_pair_));
[email protected]e13201d82012-12-12 05:00:321234 EXPECT_TRUE(stream.get());
1235 stream.reset();
1236
rch37de576c2015-05-17 20:28:171237 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1238 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321239}
1240
[email protected]1e960032013-12-20 19:00:201241TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) {
jri7046038f2015-10-22 00:29:261242 Initialize();
rch6faa4d42016-01-05 20:48:431243 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1244 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1245 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1246 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261247
[email protected]3c772402013-12-18 21:38:111248 // Sequentially connect to the default host, then another host, and then the
1249 // default host. Verify that the default host gets a consistent ephemeral
1250 // port, that is different from the other host's connection.
1251
rch6faa4d42016-01-05 20:48:431252 std::string other_server_name = kServer2HostName;
[email protected]3c772402013-12-18 21:38:111253 EXPECT_NE(kDefaultServerHostName, other_server_name);
1254 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort);
[email protected]3c772402013-12-18 21:38:111255
[email protected]bf4ea2f2014-03-10 22:57:531256 int original_port = GetSourcePortForNewSession(host_port_pair_);
1257 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2));
1258 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]3c772402013-12-18 21:38:111259}
1260
[email protected]d8e2abf82014-03-06 10:30:101261TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) {
jri7046038f2015-10-22 00:29:261262 Initialize();
rch6faa4d42016-01-05 20:48:431263 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1264 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1265 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1266 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261267
[email protected]d8e2abf82014-03-06 10:30:101268 // Get a session to the host using the port suggester.
rjshaded5ced072015-12-18 19:26:021269 int original_port = GetSourcePortForNewSessionAndGoAway(host_port_pair_);
[email protected]d8e2abf82014-03-06 10:30:101270 // Verify that the port is different after the goaway.
[email protected]bf4ea2f2014-03-10 22:57:531271 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101272 // Since the previous session did not goaway we should see the original port.
[email protected]bf4ea2f2014-03-10 22:57:531273 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101274}
1275
[email protected]1e960032013-12-20 19:00:201276TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
jri7046038f2015-10-22 00:29:261277 Initialize();
rch6faa4d42016-01-05 20:48:431278 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1279 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1280 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1281
mmenke651bae7f2015-12-18 21:26:451282 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
[email protected]459a7402014-02-10 12:58:521283 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1284 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311285 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:451286 SequencedSocketData socket_data(reads, arraysize(reads),
1287 writes.empty() ? nullptr : &writes[0],
1288 writes.size());
[email protected]56dfb902013-01-03 23:17:551289 socket_factory_.AddSocketDataProvider(&socket_data);
1290
mmenke651bae7f2015-12-18 21:26:451291 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1292 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]56dfb902013-01-03 23:17:551293 socket_factory_.AddSocketDataProvider(&socket_data2);
1294
jri7046038f2015-10-22 00:29:261295 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591296 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561297 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561298 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1299 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551300
1301 EXPECT_EQ(OK, callback_.WaitForResult());
1302 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361303 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:021304 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]0b2294d32013-08-02 00:46:361305 net_log_, CompletionCallback()));
[email protected]56dfb902013-01-03 23:17:551306
1307 // Close the session and verify that stream saw the error.
jri7e636642016-01-14 06:57:081308 factory_->CloseAllSessions(ERR_INTERNET_DISCONNECTED, QUIC_INTERNAL_ERROR);
[email protected]56dfb902013-01-03 23:17:551309 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1310 stream->ReadResponseHeaders(callback_.callback()));
1311
1312 // Now attempting to request a stream to the same origin should create
1313 // a new session.
1314
jri7046038f2015-10-22 00:29:261315 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591316 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561317 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561318 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1319 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551320
1321 EXPECT_EQ(OK, callback_.WaitForResult());
1322 stream = request2.ReleaseStream();
1323 stream.reset(); // Will reset stream 3.
1324
rch37de576c2015-05-17 20:28:171325 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1326 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1327 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1328 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]56dfb902013-01-03 23:17:551329}
1330
[email protected]1e960032013-12-20 19:00:201331TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
jri8c44d692015-10-23 23:53:411332 close_sessions_on_ip_change_ = true;
jri7046038f2015-10-22 00:29:261333 Initialize();
rch6faa4d42016-01-05 20:48:431334 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1335 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1336 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri8c44d692015-10-23 23:53:411337
mmenke651bae7f2015-12-18 21:26:451338 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
[email protected]459a7402014-02-10 12:58:521339 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1340 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311341 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:451342 SequencedSocketData socket_data(reads, arraysize(reads),
1343 writes.empty() ? nullptr : &writes[0],
1344 writes.size());
[email protected]f698a012013-05-06 20:18:591345 socket_factory_.AddSocketDataProvider(&socket_data);
1346
mmenke651bae7f2015-12-18 21:26:451347 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1348 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]f698a012013-05-06 20:18:591349 socket_factory_.AddSocketDataProvider(&socket_data2);
1350
jri7046038f2015-10-22 00:29:261351 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591352 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561353 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561354 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1355 callback_.callback()));
[email protected]f698a012013-05-06 20:18:591356
1357 EXPECT_EQ(OK, callback_.WaitForResult());
1358 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361359 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:021360 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]0b2294d32013-08-02 00:46:361361 net_log_, CompletionCallback()));
[email protected]f698a012013-05-06 20:18:591362
1363 // Change the IP address and verify that stream saw the error.
jri8c44d692015-10-23 23:53:411364 NotifyIPAddressChanged();
[email protected]f698a012013-05-06 20:18:591365 EXPECT_EQ(ERR_NETWORK_CHANGED,
1366 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:261367 EXPECT_TRUE(factory_->require_confirmation());
[email protected]f698a012013-05-06 20:18:591368
1369 // Now attempting to request a stream to the same origin should create
1370 // a new session.
1371
jri7046038f2015-10-22 00:29:261372 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591373 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561374 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561375 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1376 callback_.callback()));
[email protected]f698a012013-05-06 20:18:591377
1378 EXPECT_EQ(OK, callback_.WaitForResult());
1379 stream = request2.ReleaseStream();
1380 stream.reset(); // Will reset stream 3.
1381
rch37de576c2015-05-17 20:28:171382 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1383 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1384 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1385 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]f698a012013-05-06 20:18:591386}
1387
jri7e636642016-01-14 06:57:081388TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnect) {
1389 InitializeConnectionMigrationTest(
1390 {kDefaultNetworkForTests, kNewNetworkForTests});
1391 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1392 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1393 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1394
1395 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1396 scoped_ptr<QuicEncryptedPacket> request_packet(
1397 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true));
1398 MockWrite writes[] = {MockWrite(SYNCHRONOUS, request_packet->data(),
1399 request_packet->length(), 1)};
1400 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1401 arraysize(writes));
1402 socket_factory_.AddSocketDataProvider(&socket_data);
1403
1404 // Create request and QuicHttpStream.
1405 QuicStreamRequest request(factory_.get());
1406 EXPECT_EQ(ERR_IO_PENDING,
1407 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561408 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1409 callback_.callback()));
jri7e636642016-01-14 06:57:081410 EXPECT_EQ(OK, callback_.WaitForResult());
1411 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1412 EXPECT_TRUE(stream.get());
1413
1414 // Cause QUIC stream to be created.
1415 HttpRequestInfo request_info;
1416 request_info.method = "GET";
1417 request_info.url = GURL("https://www.example.org/");
1418 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1419 net_log_, CompletionCallback()));
1420
1421 // Ensure that session is alive and active.
1422 QuicChromiumClientSession* session =
1423 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1424 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1425 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1426
1427 // Send GET request on stream.
1428 HttpResponseInfo response;
1429 HttpRequestHeaders request_headers;
1430 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
1431 callback_.callback()));
1432
1433 // Set up second socket data provider that is used after migration.
1434 // The response to the earlier request is read on this new socket.
1435 scoped_ptr<QuicEncryptedPacket> ping(
1436 maker_.MakePingPacket(2, /*include_version=*/true));
1437 MockWrite writes1[] = {
1438 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 0)};
1439 scoped_ptr<QuicEncryptedPacket> response_headers_packet(
1440 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
1441 MockRead reads1[] = {MockRead(ASYNC, response_headers_packet->data(),
1442 response_headers_packet->length(), 1),
1443 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
1444 SequencedSocketData socket_data1(reads1, arraysize(reads1), writes1,
1445 arraysize(writes1));
1446 socket_factory_.AddSocketDataProvider(&socket_data1);
1447
1448 // Trigger connection migration. This should cause a PING frame
1449 // to be emitted.
1450 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1451 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1452
1453 // The session should now be marked as going away. Ensure that
1454 // while it is still alive, it is no longer active.
1455 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1456 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1457 EXPECT_EQ(1u, session->GetNumActiveStreams());
1458
1459 // Verify that response headers on the migrated socket were delivered to the
1460 // stream.
1461 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
1462 EXPECT_EQ(200, response.headers->response_code());
1463
1464 // Create a new request for the same destination and verify that a
1465 // new session is created.
1466 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1467 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1468 socket_factory_.AddSocketDataProvider(&socket_data2);
1469
1470 QuicStreamRequest request2(factory_.get());
1471 EXPECT_EQ(ERR_IO_PENDING,
1472 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561473 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1474 callback_.callback()));
jri7e636642016-01-14 06:57:081475 EXPECT_EQ(OK, callback_.WaitForResult());
1476 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1477 EXPECT_TRUE(stream2.get());
1478
1479 EXPECT_TRUE(
1480 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
jrid36ada62016-02-06 02:42:081481 QuicChromiumClientSession* new_session =
1482 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1483 EXPECT_NE(session, new_session);
jri7e636642016-01-14 06:57:081484
jrid36ada62016-02-06 02:42:081485 // On a DISCONNECTED notification, nothing happens to the migrated
1486 // session, but the new session is closed since it has no open
1487 // streams.
jri7e636642016-01-14 06:57:081488 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1489 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1490 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1491 EXPECT_EQ(1u, session->GetNumActiveStreams());
jrid36ada62016-02-06 02:42:081492 EXPECT_FALSE(
1493 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), new_session));
jri7e636642016-01-14 06:57:081494
1495 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1496 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1497 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1498 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1499 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1500 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1501}
1502
1503TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnected) {
1504 InitializeConnectionMigrationTest(
1505 {kDefaultNetworkForTests, kNewNetworkForTests});
1506 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1507 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1508 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1509
1510 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1511 scoped_ptr<QuicEncryptedPacket> request_packet(
1512 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true));
1513 MockWrite writes[] = {MockWrite(SYNCHRONOUS, request_packet->data(),
1514 request_packet->length(), 1)};
1515 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1516 arraysize(writes));
1517 socket_factory_.AddSocketDataProvider(&socket_data);
1518
1519 // Create request and QuicHttpStream.
1520 QuicStreamRequest request(factory_.get());
1521 EXPECT_EQ(ERR_IO_PENDING,
1522 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561523 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1524 callback_.callback()));
jri7e636642016-01-14 06:57:081525 EXPECT_EQ(OK, callback_.WaitForResult());
1526 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1527 EXPECT_TRUE(stream.get());
1528
1529 // Cause QUIC stream to be created.
1530 HttpRequestInfo request_info;
1531 request_info.method = "GET";
1532 request_info.url = GURL("https://www.example.org/");
1533 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1534 net_log_, CompletionCallback()));
1535
1536 // Ensure that session is alive and active.
1537 QuicChromiumClientSession* session =
1538 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1539 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1540 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1541
1542 // Send GET request on stream.
1543 HttpResponseInfo response_info;
1544 HttpRequestHeaders request_headers;
1545 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response_info,
1546 callback_.callback()));
1547
1548 // Set up second socket data provider that is used after migration.
1549 scoped_ptr<QuicEncryptedPacket> ping(
1550 maker_.MakePingPacket(2, /*include_version=*/true));
1551 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
1552 3, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1553 MockWrite writes1[] = {
1554 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 0)};
1555 scoped_ptr<QuicEncryptedPacket> response_packet(
1556 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
1557 MockRead reads1[] = {
1558 MockRead(ASYNC, response_packet->data(), response_packet->length(), 1),
1559 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
1560 SequencedSocketData socket_data1(reads1, arraysize(reads1), writes1,
1561 arraysize(writes1));
1562 socket_factory_.AddSocketDataProvider(&socket_data1);
1563
1564 // Trigger connection migration. This should cause a PING frame
1565 // to be emitted.
1566 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1567 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1568
1569 // The session should now be marked as going away. Ensure that
1570 // while it is still alive, it is no longer active.
1571 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1572 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1573 EXPECT_EQ(1u, session->GetNumActiveStreams());
1574
1575 // Create a new request for the same destination and verify that a
1576 // new session is created.
1577 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1578 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1579 socket_factory_.AddSocketDataProvider(&socket_data2);
1580
1581 QuicStreamRequest request2(factory_.get());
1582 EXPECT_EQ(ERR_IO_PENDING,
1583 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561584 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1585 callback_.callback()));
jri7e636642016-01-14 06:57:081586 EXPECT_EQ(OK, callback_.WaitForResult());
1587 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1588 EXPECT_TRUE(stream2.get());
1589
1590 EXPECT_TRUE(
1591 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
1592 EXPECT_NE(session, QuicStreamFactoryPeer::GetActiveSession(factory_.get(),
1593 host_port_pair_));
1594 EXPECT_EQ(true,
1595 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1596
1597 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1598 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1599 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1600 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1601 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1602 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1603}
1604
1605TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoNetworks) {
1606 NetworkChangeNotifier::NetworkList no_networks(0);
1607 InitializeConnectionMigrationTest(no_networks);
1608 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1609 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1610
1611 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1612 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
1613 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1614 MockWrite writes[] = {
1615 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1616 };
1617 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1618 arraysize(writes));
1619 socket_factory_.AddSocketDataProvider(&socket_data);
1620
1621 // Create request and QuicHttpStream.
1622 QuicStreamRequest request(factory_.get());
1623 EXPECT_EQ(ERR_IO_PENDING,
1624 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561625 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1626 callback_.callback()));
jri7e636642016-01-14 06:57:081627 EXPECT_EQ(OK, callback_.WaitForResult());
1628 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1629 EXPECT_TRUE(stream.get());
1630
1631 // Cause QUIC stream to be created.
1632 HttpRequestInfo request_info;
1633 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1634 net_log_, CompletionCallback()));
1635
1636 // Ensure that session is alive and active.
1637 QuicChromiumClientSession* session =
1638 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1639 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1640 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1641 EXPECT_EQ(1u, session->GetNumActiveStreams());
1642
1643 // Trigger connection migration. Since there are no networks
1644 // to migrate to, this should cause the session to continue on the same
1645 // socket, but be marked as going away.
1646 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1647 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1648
1649 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1650 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1651 EXPECT_EQ(1u, session->GetNumActiveStreams());
1652
1653 stream.reset();
1654
1655 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1656 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1657}
1658
1659TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoNetworks) {
1660 NetworkChangeNotifier::NetworkList no_networks(0);
1661 InitializeConnectionMigrationTest(no_networks);
1662 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1663 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1664
1665 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1666 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
1667 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1668 MockWrite writes[] = {
1669 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
1670 };
1671 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1672 arraysize(writes));
1673 socket_factory_.AddSocketDataProvider(&socket_data);
1674
1675 // Create request and QuicHttpStream.
1676 QuicStreamRequest request(factory_.get());
1677 EXPECT_EQ(ERR_IO_PENDING,
1678 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561679 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1680 callback_.callback()));
jri7e636642016-01-14 06:57:081681 EXPECT_EQ(OK, callback_.WaitForResult());
1682 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1683 EXPECT_TRUE(stream.get());
1684
1685 // Cause QUIC stream to be created.
1686 HttpRequestInfo request_info;
1687 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1688 net_log_, CompletionCallback()));
1689
1690 // Ensure that session is alive and active.
1691 QuicChromiumClientSession* session =
1692 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1693 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1694 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1695
1696 // Trigger connection migration. Since there are no networks
1697 // to migrate to, this should cause a RST_STREAM frame to be emitted
1698 // and the session to be closed.
1699 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1700 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1701
1702 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1703 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1704
1705 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1706 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1707}
1708
1709TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoNewNetwork) {
1710 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
1711 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1712 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1713
1714 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1715 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
1716 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1717 MockWrite writes[] = {
1718 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1719 };
1720 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1721 arraysize(writes));
1722 socket_factory_.AddSocketDataProvider(&socket_data);
1723
1724 // Create request and QuicHttpStream.
1725 QuicStreamRequest request(factory_.get());
1726 EXPECT_EQ(ERR_IO_PENDING,
1727 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561728 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1729 callback_.callback()));
jri7e636642016-01-14 06:57:081730 EXPECT_EQ(OK, callback_.WaitForResult());
1731 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1732 EXPECT_TRUE(stream.get());
1733
1734 // Cause QUIC stream to be created.
1735 HttpRequestInfo request_info;
1736 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1737 net_log_, CompletionCallback()));
1738
1739 // Ensure that session is alive and active.
1740 QuicChromiumClientSession* session =
1741 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1742 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1743 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1744
1745 // Trigger connection migration. Since there are no networks
1746 // to migrate to, this should cause session to be continue but be marked as
1747 // going away.
1748 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1749 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1750
1751 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1752 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1753 EXPECT_EQ(1u, session->GetNumActiveStreams());
1754
1755 stream.reset();
1756
1757 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1758 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1759}
1760
1761TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoNewNetwork) {
1762 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
1763 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1764 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1765
1766 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1767 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
1768 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1769 MockWrite writes[] = {
1770 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
1771 };
1772 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1773 arraysize(writes));
1774 socket_factory_.AddSocketDataProvider(&socket_data);
1775
1776 // Create request and QuicHttpStream.
1777 QuicStreamRequest request(factory_.get());
1778 EXPECT_EQ(ERR_IO_PENDING,
1779 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561780 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1781 callback_.callback()));
jri7e636642016-01-14 06:57:081782 EXPECT_EQ(OK, callback_.WaitForResult());
1783 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1784 EXPECT_TRUE(stream.get());
1785
1786 // Cause QUIC stream to be created.
1787 HttpRequestInfo request_info;
1788 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1789 net_log_, CompletionCallback()));
1790
1791 // Ensure that session is alive and active.
1792 QuicChromiumClientSession* session =
1793 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1794 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1795 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1796
1797 // Trigger connection migration. Since there are no networks
1798 // to migrate to, this should cause a RST_STREAM frame to be emitted
1799 // with QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed.
1800 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1801 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1802
1803 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1804 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1805
1806 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1807 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1808}
1809
jri231c2972016-03-08 19:50:111810TEST_P(QuicStreamFactoryTest,
1811 OnNetworkChangeSoonToDisconnectNonMigratableStream) {
1812 InitializeConnectionMigrationTest(
1813 {kDefaultNetworkForTests, kNewNetworkForTests});
1814 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1815 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1816
1817 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1818 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
1819 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1820 MockWrite writes[] = {
1821 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1822 };
1823 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1824 arraysize(writes));
1825 socket_factory_.AddSocketDataProvider(&socket_data);
1826
1827 // Create request and QuicHttpStream.
1828 QuicStreamRequest request(factory_.get());
1829 EXPECT_EQ(ERR_IO_PENDING,
1830 request.Request(host_port_pair_, privacy_mode_,
1831 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1832 callback_.callback()));
1833 EXPECT_EQ(OK, callback_.WaitForResult());
1834 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1835 EXPECT_TRUE(stream.get());
1836
1837 // Cause QUIC stream to be created, but marked as non-migratable.
1838 HttpRequestInfo request_info;
1839 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION;
1840 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1841 net_log_, CompletionCallback()));
1842
1843 // Ensure that session is alive and active.
1844 QuicChromiumClientSession* session =
1845 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1846 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1847 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1848
1849 // Trigger connection migration. Since there is a non-migratable stream,
1850 // this should cause session to continue but be marked as going away.
1851 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1852 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1853
1854 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1855 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1856 EXPECT_EQ(1u, session->GetNumActiveStreams());
1857
1858 stream.reset();
1859
1860 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1861 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1862}
1863
1864TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNonMigratableStream) {
1865 InitializeConnectionMigrationTest(
1866 {kDefaultNetworkForTests, kNewNetworkForTests});
1867 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1868 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1869
1870 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1871 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
1872 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1873 MockWrite writes[] = {
1874 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
1875 };
1876 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1877 arraysize(writes));
1878 socket_factory_.AddSocketDataProvider(&socket_data);
1879
1880 // Create request and QuicHttpStream.
1881 QuicStreamRequest request(factory_.get());
1882 EXPECT_EQ(ERR_IO_PENDING,
1883 request.Request(host_port_pair_, privacy_mode_,
1884 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1885 callback_.callback()));
1886 EXPECT_EQ(OK, callback_.WaitForResult());
1887 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1888 EXPECT_TRUE(stream.get());
1889
1890 // Cause QUIC stream to be created, but marked as non-migratable.
1891 HttpRequestInfo request_info;
1892 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION;
1893 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1894 net_log_, CompletionCallback()));
1895
1896 // Ensure that session is alive and active.
1897 QuicChromiumClientSession* session =
1898 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1899 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1900 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1901
1902 // Trigger connection migration. Since there is a non-migratable stream,
1903 // this should cause a RST_STREAM frame to be emitted with
1904 // QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed.
1905 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1906 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1907
1908 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1909 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1910
1911 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1912 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1913}
1914
jri7e636642016-01-14 06:57:081915TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoOpenStreams) {
1916 InitializeConnectionMigrationTest(
1917 {kDefaultNetworkForTests, kNewNetworkForTests});
1918 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1919 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1920
1921 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1922 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0u);
1923 socket_factory_.AddSocketDataProvider(&socket_data);
1924
1925 // Create request and QuicHttpStream.
1926 QuicStreamRequest request(factory_.get());
1927 EXPECT_EQ(ERR_IO_PENDING,
1928 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561929 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1930 callback_.callback()));
jri7e636642016-01-14 06:57:081931 EXPECT_EQ(OK, callback_.WaitForResult());
1932 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1933 EXPECT_TRUE(stream.get());
1934
1935 // Ensure that session is alive and active.
1936 QuicChromiumClientSession* session =
1937 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1938 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1939 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1940
1941 // Trigger connection migration. Since there are no active streams,
1942 // the session will be closed.
1943 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1944 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1945
1946 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1947 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1948
1949 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1950 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1951}
1952
1953TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoOpenStreams) {
1954 InitializeConnectionMigrationTest(
1955 {kDefaultNetworkForTests, kNewNetworkForTests});
1956 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1957 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1958
1959 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1960 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0u);
1961 socket_factory_.AddSocketDataProvider(&socket_data);
1962
1963 // Create request and QuicHttpStream.
1964 QuicStreamRequest request(factory_.get());
1965 EXPECT_EQ(ERR_IO_PENDING,
1966 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:561967 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1968 callback_.callback()));
jri7e636642016-01-14 06:57:081969 EXPECT_EQ(OK, callback_.WaitForResult());
1970 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1971 EXPECT_TRUE(stream.get());
1972
1973 // Ensure that session is alive and active.
1974 QuicChromiumClientSession* session =
1975 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1976 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1977 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1978
1979 // Trigger connection migration. Since there are no active streams,
1980 // the session will be closed.
1981 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1982 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1983
1984 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1985 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1986
1987 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1988 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1989}
1990
jrid36ada62016-02-06 02:42:081991TEST_P(QuicStreamFactoryTest, MigrateSessionEarly) {
1992 InitializeConnectionMigrationTest(
1993 {kDefaultNetworkForTests, kNewNetworkForTests});
1994 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1995 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1996 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1997
1998 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1999 scoped_ptr<QuicEncryptedPacket> request_packet(
2000 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true));
2001 MockWrite writes[] = {MockWrite(SYNCHRONOUS, request_packet->data(),
2002 request_packet->length(), 1)};
2003 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2004 arraysize(writes));
2005 socket_factory_.AddSocketDataProvider(&socket_data);
2006
2007 // Create request and QuicHttpStream.
2008 QuicStreamRequest request(factory_.get());
2009 EXPECT_EQ(ERR_IO_PENDING,
2010 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562011 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2012 callback_.callback()));
jrid36ada62016-02-06 02:42:082013 EXPECT_EQ(OK, callback_.WaitForResult());
2014 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2015 EXPECT_TRUE(stream.get());
2016
2017 // Cause QUIC stream to be created.
2018 HttpRequestInfo request_info;
2019 request_info.method = "GET";
2020 request_info.url = GURL("https://www.example.org/");
2021 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2022 net_log_, CompletionCallback()));
2023
2024 // Ensure that session is alive and active.
2025 QuicChromiumClientSession* session =
2026 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
2027 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2028 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2029
2030 // Send GET request on stream.
2031 HttpResponseInfo response;
2032 HttpRequestHeaders request_headers;
2033 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2034 callback_.callback()));
2035
2036 // Set up second socket data provider that is used after migration.
2037 // The response to the earlier request is read on this new socket.
2038 scoped_ptr<QuicEncryptedPacket> ping(
2039 maker_.MakePingPacket(2, /*include_version=*/true));
2040 MockWrite writes1[] = {
2041 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 0)};
2042 scoped_ptr<QuicEncryptedPacket> response_headers_packet(
2043 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
2044 MockRead reads1[] = {MockRead(ASYNC, response_headers_packet->data(),
2045 response_headers_packet->length(), 1),
2046 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
2047 SequencedSocketData socket_data1(reads1, arraysize(reads1), writes1,
2048 arraysize(writes1));
2049 socket_factory_.AddSocketDataProvider(&socket_data1);
2050
2051 // Trigger early connection migration. This should cause a PING frame
2052 // to be emitted.
2053 session->OnPathDegrading();
2054
2055 // Run the message loop so that data queued in the new socket is read by the
2056 // packet reader.
2057 base::RunLoop().RunUntilIdle();
2058
2059 // The session should now be marked as going away. Ensure that
2060 // while it is still alive, it is no longer active.
2061 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2062 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2063 EXPECT_EQ(1u, session->GetNumActiveStreams());
2064
2065 // Verify that response headers on the migrated socket were delivered to the
2066 // stream.
2067 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
2068 EXPECT_EQ(200, response.headers->response_code());
2069
2070 // Create a new request for the same destination and verify that a
2071 // new session is created.
2072 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2073 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
2074 socket_factory_.AddSocketDataProvider(&socket_data2);
2075
2076 QuicStreamRequest request2(factory_.get());
2077 EXPECT_EQ(ERR_IO_PENDING,
2078 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562079 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2080 callback_.callback()));
jrid36ada62016-02-06 02:42:082081 EXPECT_EQ(OK, callback_.WaitForResult());
2082 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2083 EXPECT_TRUE(stream2.get());
2084
2085 EXPECT_TRUE(
2086 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
2087 QuicChromiumClientSession* new_session =
2088 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
2089 EXPECT_NE(session, new_session);
2090
2091 // On a SOON_TO_DISCONNECT notification, nothing happens to the
2092 // migrated session, but the new session is closed since it has no
2093 // open streams.
2094 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2095 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
2096 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2097 EXPECT_EQ(1u, session->GetNumActiveStreams());
2098 EXPECT_FALSE(
2099 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), new_session));
2100
2101 // On a DISCONNECTED notification, nothing happens to the migrated session.
2102 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2103 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2104 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2105 EXPECT_EQ(1u, session->GetNumActiveStreams());
2106
2107 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2108 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2109 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
2110 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
2111 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2112 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2113}
2114
2115TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyNoNewNetwork) {
2116 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
2117 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2118 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2119
2120 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2121 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
2122 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
2123 MockWrite writes[] = {
2124 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
2125 };
2126 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2127 arraysize(writes));
2128 socket_factory_.AddSocketDataProvider(&socket_data);
2129
2130 // Create request and QuicHttpStream.
2131 QuicStreamRequest request(factory_.get());
2132 EXPECT_EQ(ERR_IO_PENDING,
2133 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562134 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2135 callback_.callback()));
jrid36ada62016-02-06 02:42:082136 EXPECT_EQ(OK, callback_.WaitForResult());
2137 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2138 EXPECT_TRUE(stream.get());
2139
2140 // Cause QUIC stream to be created.
2141 HttpRequestInfo request_info;
2142 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2143 net_log_, CompletionCallback()));
2144
2145 // Ensure that session is alive and active.
2146 QuicChromiumClientSession* session =
2147 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
2148 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2149 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2150
2151 // Trigger connection migration. Since there are no networks
2152 // to migrate to, this should cause session to be continue but be marked as
2153 // going away.
2154 session->OnPathDegrading();
2155
2156 // Run the message loop so that data queued in the new socket is read by the
2157 // packet reader.
2158 base::RunLoop().RunUntilIdle();
2159
2160 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2161 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2162 EXPECT_EQ(1u, session->GetNumActiveStreams());
2163
2164 stream.reset();
2165
2166 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2167 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2168}
2169
jri231c2972016-03-08 19:50:112170TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyNonMigratableStream) {
2171 InitializeConnectionMigrationTest(
2172 {kDefaultNetworkForTests, kNewNetworkForTests});
2173 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2174 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2175
2176 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2177 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
2178 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
2179 MockWrite writes[] = {
2180 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
2181 };
2182 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2183 arraysize(writes));
2184 socket_factory_.AddSocketDataProvider(&socket_data);
2185
2186 // Create request and QuicHttpStream.
2187 QuicStreamRequest request(factory_.get());
2188 EXPECT_EQ(ERR_IO_PENDING,
2189 request.Request(host_port_pair_, privacy_mode_,
2190 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2191 callback_.callback()));
2192 EXPECT_EQ(OK, callback_.WaitForResult());
2193 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2194 EXPECT_TRUE(stream.get());
2195
2196 // Cause QUIC stream to be created, but marked as non-migratable.
2197 HttpRequestInfo request_info;
2198 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION;
2199 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2200 net_log_, CompletionCallback()));
2201
2202 // Ensure that session is alive and active.
2203 QuicChromiumClientSession* session =
2204 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
2205 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2206 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2207
2208 // Trigger connection migration. Since there is a non-migratable stream,
2209 // this should cause session to be continue without migrating.
2210 session->OnPathDegrading();
2211
2212 // Run the message loop so that data queued in the new socket is read by the
2213 // packet reader.
2214 base::RunLoop().RunUntilIdle();
2215
2216 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2217 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2218 EXPECT_EQ(1u, session->GetNumActiveStreams());
2219
2220 stream.reset();
2221
2222 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2223 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2224}
2225
rch02d87792015-09-09 09:05:532226TEST_P(QuicStreamFactoryTest, OnSSLConfigChanged) {
jri7046038f2015-10-22 00:29:262227 Initialize();
rch6faa4d42016-01-05 20:48:432228 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2229 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2230 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2231
mmenke651bae7f2015-12-18 21:26:452232 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
rch02d87792015-09-09 09:05:532233 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
2234 std::vector<MockWrite> writes;
2235 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:452236 SequencedSocketData socket_data(reads, arraysize(reads),
2237 writes.empty() ? nullptr : &writes[0],
2238 writes.size());
rch02d87792015-09-09 09:05:532239 socket_factory_.AddSocketDataProvider(&socket_data);
rch02d87792015-09-09 09:05:532240
mmenke651bae7f2015-12-18 21:26:452241 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2242 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
rch02d87792015-09-09 09:05:532243 socket_factory_.AddSocketDataProvider(&socket_data2);
rch02d87792015-09-09 09:05:532244
jri7046038f2015-10-22 00:29:262245 QuicStreamRequest request(factory_.get());
rch02d87792015-09-09 09:05:532246 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562247 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562248 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2249 callback_.callback()));
rch02d87792015-09-09 09:05:532250
2251 EXPECT_EQ(OK, callback_.WaitForResult());
2252 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2253 HttpRequestInfo request_info;
2254 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2255 net_log_, CompletionCallback()));
2256
jri7046038f2015-10-22 00:29:262257 factory_->OnSSLConfigChanged();
rch02d87792015-09-09 09:05:532258 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
2259 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262260 EXPECT_FALSE(factory_->require_confirmation());
rch02d87792015-09-09 09:05:532261
2262 // Now attempting to request a stream to the same origin should create
2263 // a new session.
2264
jri7046038f2015-10-22 00:29:262265 QuicStreamRequest request2(factory_.get());
rch02d87792015-09-09 09:05:532266 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562267 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562268 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2269 callback_.callback()));
rch02d87792015-09-09 09:05:532270
2271 EXPECT_EQ(OK, callback_.WaitForResult());
2272 stream = request2.ReleaseStream();
2273 stream.reset(); // Will reset stream 3.
2274
2275 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2276 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2277 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2278 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2279}
2280
[email protected]1e960032013-12-20 19:00:202281TEST_P(QuicStreamFactoryTest, OnCertAdded) {
jri7046038f2015-10-22 00:29:262282 Initialize();
rch6faa4d42016-01-05 20:48:432283 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2284 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2285 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2286
mmenke651bae7f2015-12-18 21:26:452287 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
[email protected]459a7402014-02-10 12:58:522288 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
2289 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:312290 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:452291 SequencedSocketData socket_data(reads, arraysize(reads),
2292 writes.empty() ? nullptr : &writes[0],
2293 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:092294 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]d7d1e50b2013-11-25 22:08:092295
mmenke651bae7f2015-12-18 21:26:452296 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2297 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:092298 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]d7d1e50b2013-11-25 22:08:092299
jri7046038f2015-10-22 00:29:262300 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:592301 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562302 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562303 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2304 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092305
2306 EXPECT_EQ(OK, callback_.WaitForResult());
2307 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2308 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:022309 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]d7d1e50b2013-11-25 22:08:092310 net_log_, CompletionCallback()));
2311
2312 // Add a cert and verify that stream saw the event.
jri7046038f2015-10-22 00:29:262313 factory_->OnCertAdded(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:092314 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
2315 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262316 EXPECT_FALSE(factory_->require_confirmation());
[email protected]d7d1e50b2013-11-25 22:08:092317
2318 // Now attempting to request a stream to the same origin should create
2319 // a new session.
2320
jri7046038f2015-10-22 00:29:262321 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:592322 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562323 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562324 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2325 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092326
2327 EXPECT_EQ(OK, callback_.WaitForResult());
2328 stream = request2.ReleaseStream();
2329 stream.reset(); // Will reset stream 3.
2330
rch37de576c2015-05-17 20:28:172331 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2332 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2333 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2334 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:092335}
2336
[email protected]1e960032013-12-20 19:00:202337TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
jri7046038f2015-10-22 00:29:262338 Initialize();
rch6faa4d42016-01-05 20:48:432339 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2340 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2341 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2342
mmenke651bae7f2015-12-18 21:26:452343 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
[email protected]459a7402014-02-10 12:58:522344 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
2345 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:312346 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:452347 SequencedSocketData socket_data(reads, arraysize(reads),
2348 writes.empty() ? nullptr : &writes[0],
2349 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:092350 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]d7d1e50b2013-11-25 22:08:092351
mmenke651bae7f2015-12-18 21:26:452352 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2353 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:092354 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]d7d1e50b2013-11-25 22:08:092355
jri7046038f2015-10-22 00:29:262356 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:592357 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562358 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562359 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2360 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092361
2362 EXPECT_EQ(OK, callback_.WaitForResult());
2363 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2364 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:022365 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]d7d1e50b2013-11-25 22:08:092366 net_log_, CompletionCallback()));
2367
2368 // Change the CA cert and verify that stream saw the event.
jri7046038f2015-10-22 00:29:262369 factory_->OnCACertChanged(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:092370 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
2371 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262372 EXPECT_FALSE(factory_->require_confirmation());
[email protected]d7d1e50b2013-11-25 22:08:092373
2374 // Now attempting to request a stream to the same origin should create
2375 // a new session.
2376
jri7046038f2015-10-22 00:29:262377 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:592378 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562379 request2.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562380 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2381 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092382
2383 EXPECT_EQ(OK, callback_.WaitForResult());
2384 stream = request2.ReleaseStream();
2385 stream.reset(); // Will reset stream 3.
2386
rch37de576c2015-05-17 20:28:172387 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2388 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2389 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2390 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:092391}
2392
[email protected]1e960032013-12-20 19:00:202393TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
jri7046038f2015-10-22 00:29:262394 Initialize();
rch6faa4d42016-01-05 20:48:432395
[email protected]6e12d702013-11-13 00:17:172396 vector<string> cannoncial_suffixes;
2397 cannoncial_suffixes.push_back(string(".c.youtube.com"));
2398 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]c49ff182013-09-28 08:33:262399
[email protected]6e12d702013-11-13 00:17:172400 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
2401 string r1_host_name("r1");
2402 string r2_host_name("r2");
2403 r1_host_name.append(cannoncial_suffixes[i]);
2404 r2_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:142405
[email protected]bf4ea2f2014-03-10 22:57:532406 HostPortPair host_port_pair1(r1_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:122407 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:262408 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rch1fe2eeb2015-10-26 14:45:572409 QuicServerId server_id1(host_port_pair1, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172410 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:372411 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:172412 EXPECT_FALSE(cached1->proof_valid());
2413 EXPECT_TRUE(cached1->source_address_token().empty());
2414
2415 // Mutate the cached1 to have different data.
2416 // TODO(rtenneti): mutate other members of CachedState.
2417 cached1->set_source_address_token(r1_host_name);
2418 cached1->SetProofValid();
2419
[email protected]bf4ea2f2014-03-10 22:57:532420 HostPortPair host_port_pair2(r2_host_name, 80);
rch1fe2eeb2015-10-26 14:45:572421 QuicServerId server_id2(host_port_pair2, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172422 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:372423 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:172424 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
2425 EXPECT_TRUE(cached2->proof_valid());
2426 }
[email protected]b70fdb792013-10-25 19:04:142427}
2428
[email protected]1e960032013-12-20 19:00:202429TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
jri7046038f2015-10-22 00:29:262430 Initialize();
[email protected]6e12d702013-11-13 00:17:172431 vector<string> cannoncial_suffixes;
2432 cannoncial_suffixes.push_back(string(".c.youtube.com"));
2433 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]b70fdb792013-10-25 19:04:142434
[email protected]6e12d702013-11-13 00:17:172435 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
2436 string r3_host_name("r3");
2437 string r4_host_name("r4");
2438 r3_host_name.append(cannoncial_suffixes[i]);
2439 r4_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:142440
[email protected]bf4ea2f2014-03-10 22:57:532441 HostPortPair host_port_pair1(r3_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:122442 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:262443 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rch1fe2eeb2015-10-26 14:45:572444 QuicServerId server_id1(host_port_pair1, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172445 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:372446 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:172447 EXPECT_FALSE(cached1->proof_valid());
2448 EXPECT_TRUE(cached1->source_address_token().empty());
2449
2450 // Mutate the cached1 to have different data.
2451 // TODO(rtenneti): mutate other members of CachedState.
2452 cached1->set_source_address_token(r3_host_name);
2453 cached1->SetProofInvalid();
2454
[email protected]bf4ea2f2014-03-10 22:57:532455 HostPortPair host_port_pair2(r4_host_name, 80);
rch1fe2eeb2015-10-26 14:45:572456 QuicServerId server_id2(host_port_pair2, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172457 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:372458 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:172459 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
2460 EXPECT_TRUE(cached2->source_address_token().empty());
2461 EXPECT_FALSE(cached2->proof_valid());
2462 }
[email protected]c49ff182013-09-28 08:33:262463}
2464
rtenneti14abd312015-02-06 21:56:012465TEST_P(QuicStreamFactoryTest, RacingConnections) {
jri7046038f2015-10-22 00:29:262466 disable_disk_cache_ = false;
2467 Initialize();
rch6faa4d42016-01-05 20:48:432468 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2469 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:262470
rtenneti14abd312015-02-06 21:56:012471 if (!GetParam().enable_connection_racing)
2472 return;
jri7046038f2015-10-22 00:29:262473
2474 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneticcab42b2015-10-09 06:38:162475
mmenke651bae7f2015-12-18 21:26:452476 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2477 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti14abd312015-02-06 21:56:012478 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti14abd312015-02-06 21:56:012479
mmenke651bae7f2015-12-18 21:26:452480 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2481 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
rtenneti14abd312015-02-06 21:56:012482 socket_factory_.AddSocketDataProvider(&socket_data2);
rtenneti14abd312015-02-06 21:56:012483
rtenneticcab42b2015-10-09 06:38:162484 const AlternativeService alternative_service1(QUIC, host_port_pair_.host(),
2485 host_port_pair_.port());
2486 AlternativeServiceInfoVector alternative_service_info_vector;
2487 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
2488 alternative_service_info_vector.push_back(
anthonyvd5b168c12016-03-07 22:03:572489 AlternativeServiceInfo(alternative_service1, 1.0, expiration));
rtenneticcab42b2015-10-09 06:38:162490
2491 http_server_properties_.SetAlternativeServices(
2492 host_port_pair_, alternative_service_info_vector);
2493
rtenneti14abd312015-02-06 21:56:012494 crypto_client_stream_factory_.set_handshake_mode(
2495 MockCryptoClientStream::ZERO_RTT);
2496 host_resolver_.set_synchronous_mode(true);
2497 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2498 "192.168.0.1", "");
2499
jri7046038f2015-10-22 00:29:262500 QuicStreamRequest request(factory_.get());
rch1fe2eeb2015-10-26 14:45:572501 QuicServerId server_id(host_port_pair_, privacy_mode_);
rtenneti14abd312015-02-06 21:56:012502 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562503 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562504 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2505 callback_.callback()));
jri7046038f2015-10-22 00:29:262506 EXPECT_EQ(2u, QuicStreamFactoryPeer::GetNumberOfActiveJobs(factory_.get(),
2507 server_id));
rtenneti14abd312015-02-06 21:56:012508
2509 runner_->RunNextTask();
2510
2511 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2512 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:172513 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2514 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
jri7046038f2015-10-22 00:29:262515 EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumberOfActiveJobs(factory_.get(),
2516 server_id));
rtenneti14abd312015-02-06 21:56:012517}
2518
rtenneti34dffe752015-02-24 23:27:322519TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) {
jri7046038f2015-10-22 00:29:262520 disable_disk_cache_ = true;
2521 Initialize();
rch6faa4d42016-01-05 20:48:432522 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2523 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2524
jri7046038f2015-10-22 00:29:262525 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti34dffe752015-02-24 23:27:322526
mmenke651bae7f2015-12-18 21:26:452527 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2528 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti34dffe752015-02-24 23:27:322529 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti34dffe752015-02-24 23:27:322530
2531 crypto_client_stream_factory_.set_handshake_mode(
2532 MockCryptoClientStream::ZERO_RTT);
2533 host_resolver_.set_synchronous_mode(true);
2534 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2535 "192.168.0.1", "");
2536
jri7046038f2015-10-22 00:29:262537 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562538 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562539 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2540 callback_.callback()));
rtenneti34dffe752015-02-24 23:27:322541
2542 // If we are waiting for disk cache, we would have posted a task. Verify that
2543 // the CancelWaitForDataReady task hasn't been posted.
2544 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
2545
2546 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2547 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:172548 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2549 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti34dffe752015-02-24 23:27:322550}
2551
rtenneti85dcfac22015-03-27 20:22:192552TEST_P(QuicStreamFactoryTest, BadPacketLoss) {
jri7046038f2015-10-22 00:29:262553 disable_disk_cache_ = false;
2554 max_number_of_lossy_connections_ = 2;
2555 Initialize();
rch6faa4d42016-01-05 20:48:432556 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2557 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2558 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2559 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2560 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2561
jri7046038f2015-10-22 00:29:262562 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2563
2564 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2565 host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192566 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262567 factory_.get(), host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192568
mmenke651bae7f2015-12-18 21:26:452569 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2570 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:192571 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti85dcfac22015-03-27 20:22:192572
mmenke651bae7f2015-12-18 21:26:452573 SequencedSocketData socket_data2(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:192574 socket_factory_.AddSocketDataProvider(&socket_data2);
rtenneti85dcfac22015-03-27 20:22:192575
mmenke651bae7f2015-12-18 21:26:452576 SequencedSocketData socket_data3(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:192577 socket_factory_.AddSocketDataProvider(&socket_data3);
rtenneti85dcfac22015-03-27 20:22:192578
mmenke651bae7f2015-12-18 21:26:452579 SequencedSocketData socket_data4(nullptr, 0, nullptr, 0);
rtenneti97137a92015-06-18 06:00:312580 socket_factory_.AddSocketDataProvider(&socket_data4);
rtenneti97137a92015-06-18 06:00:312581
rch6faa4d42016-01-05 20:48:432582 HostPortPair server2(kServer2HostName, kDefaultServerPort);
2583 HostPortPair server3(kServer3HostName, kDefaultServerPort);
2584 HostPortPair server4(kServer4HostName, kDefaultServerPort);
rtenneti85dcfac22015-03-27 20:22:192585
2586 crypto_client_stream_factory_.set_handshake_mode(
2587 MockCryptoClientStream::ZERO_RTT);
2588 host_resolver_.set_synchronous_mode(true);
2589 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2590 "192.168.0.1", "");
2591 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2592 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
rtenneti97137a92015-06-18 06:00:312593 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
rtenneti85dcfac22015-03-27 20:22:192594
jri7046038f2015-10-22 00:29:262595 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562596 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562597 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2598 callback_.callback()));
rtenneti85dcfac22015-03-27 20:22:192599
rchf114d982015-10-21 01:34:562600 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262601 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
rtenneti85dcfac22015-03-27 20:22:192602
2603 DVLOG(1) << "Create 1st session and test packet loss";
2604
2605 // Set packet_loss_rate to a lower value than packet_loss_threshold.
2606 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262607 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/0.9f));
rtenneti41633b1f2015-04-05 18:19:532608 EXPECT_TRUE(session->connection()->connected());
rchf114d982015-10-21 01:34:562609 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:262610 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
2611 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2612 host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192613 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262614 factory_.get(), host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192615
2616 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:312617 // and that shouldn't close the session and it shouldn't disable QUIC.
2618 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262619 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:192620 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262621 factory_.get(), host_port_pair_.port()));
rtenneti97137a92015-06-18 06:00:312622 EXPECT_TRUE(session->connection()->connected());
jri7046038f2015-10-22 00:29:262623 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2624 host_port_pair_.port()));
rchf114d982015-10-21 01:34:562625 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:262626 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
rtenneti85dcfac22015-03-27 20:22:192627
2628 // Test N-in-a-row high packet loss connections.
2629
2630 DVLOG(1) << "Create 2nd session and test packet loss";
2631
2632 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262633 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562634 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562635 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2636 callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162637 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262638 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
rtenneti85dcfac22015-03-27 20:22:192639
2640 // If there is no packet loss during handshake confirmation, number of lossy
2641 // connections for the port should be 0.
2642 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262643 factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:192644 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262645 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/0.9f));
rtenneti85dcfac22015-03-27 20:22:192646 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262647 factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:192648 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262649 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:192650
2651 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:312652 // and that shouldn't close the session and it shouldn't disable QUIC.
2653 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262654 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:192655 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262656 factory_.get(), server2.port()));
rtenneti97137a92015-06-18 06:00:312657 EXPECT_TRUE(session2->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:192658 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262659 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
2660 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server2));
rtenneti85dcfac22015-03-27 20:22:192661
2662 DVLOG(1) << "Create 3rd session which also has packet loss";
2663
2664 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:262665 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:562666 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562667 /*cert_verify_flags=*/0, url3_, "GET",
rtennetia75df622015-06-21 23:59:502668 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:162669 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:262670 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
rtenneti85dcfac22015-03-27 20:22:192671
rtenneti97137a92015-06-18 06:00:312672 DVLOG(1) << "Create 4th session with packet loss and test IsQuicDisabled()";
2673 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:262674 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:562675 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562676 /*cert_verify_flags=*/0, url4_, "GET",
rtennetia75df622015-06-21 23:59:502677 net_log_, callback4.callback()));
ckrasic4f9d88d2015-07-22 22:23:162678 QuicChromiumClientSession* session4 =
jri7046038f2015-10-22 00:29:262679 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server4);
rtenneti97137a92015-06-18 06:00:312680
rtenneti85dcfac22015-03-27 20:22:192681 // Set packet_loss_rate to higher value than packet_loss_threshold 2nd time in
2682 // a row and that should close the session and disable QUIC.
2683 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:262684 factory_->OnHandshakeConfirmed(session3, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:192685 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262686 factory_.get(), server3.port()));
rtenneti97137a92015-06-18 06:00:312687 EXPECT_FALSE(session3->connection()->connected());
jri7046038f2015-10-22 00:29:262688 EXPECT_TRUE(
2689 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server3.port()));
2690 EXPECT_FALSE(
2691 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server3));
bnccb7ff3c2015-05-21 20:51:552692 EXPECT_FALSE(HasActiveSession(server3));
rtenneti85dcfac22015-03-27 20:22:192693
rtenneti97137a92015-06-18 06:00:312694 // Set packet_loss_rate to higher value than packet_loss_threshold 3rd time in
2695 // a row and IsQuicDisabled() should close the session.
2696 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:262697 factory_->OnHandshakeConfirmed(session4, /*packet_loss_rate=*/1.0f));
rtenneti97137a92015-06-18 06:00:312698 EXPECT_EQ(3, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262699 factory_.get(), server4.port()));
rtenneti97137a92015-06-18 06:00:312700 EXPECT_FALSE(session4->connection()->connected());
jri7046038f2015-10-22 00:29:262701 EXPECT_TRUE(
2702 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server4.port()));
2703 EXPECT_FALSE(
2704 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server4));
rtenneti97137a92015-06-18 06:00:312705 EXPECT_FALSE(HasActiveSession(server4));
2706
rtenneti85dcfac22015-03-27 20:22:192707 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2708 EXPECT_TRUE(stream.get());
2709 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2710 EXPECT_TRUE(stream2.get());
2711 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2712 EXPECT_TRUE(stream3.get());
rtenneti97137a92015-06-18 06:00:312713 scoped_ptr<QuicHttpStream> stream4 = request4.ReleaseStream();
2714 EXPECT_TRUE(stream4.get());
rch37de576c2015-05-17 20:28:172715 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2716 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2717 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2718 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2719 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2720 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
rtenneti97137a92015-06-18 06:00:312721 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
2722 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
rtenneti85dcfac22015-03-27 20:22:192723}
2724
ckrasic1e53b642015-07-08 22:39:352725TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfTwo) {
jri7046038f2015-10-22 00:29:262726 disable_disk_cache_ = false;
2727 threshold_public_resets_post_handshake_ = 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);
jri7046038f2015-10-22 00:29:262732 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2733
2734 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2735 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352736 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262737 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352738
mmenke651bae7f2015-12-18 21:26:452739 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2740 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352741 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:352742
mmenke651bae7f2015-12-18 21:26:452743 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352744 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:352745
rch6faa4d42016-01-05 20:48:432746 HostPortPair server2(kServer2HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:352747
2748 crypto_client_stream_factory_.set_handshake_mode(
2749 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2750 host_resolver_.set_synchronous_mode(true);
2751 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2752 "192.168.0.1", "");
2753 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2754
jri7046038f2015-10-22 00:29:262755 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562756 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562757 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2758 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:352759
rchf114d982015-10-21 01:34:562760 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262761 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352762
2763 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
fayanga64c1a92016-02-13 01:55:582764 session->connection()->CloseConnection(QUIC_PUBLIC_RESET,
2765 ConnectionCloseSource::FROM_PEER);
ckrasic1e53b642015-07-08 22:39:352766 // Need to spin the loop now to ensure that
2767 // QuicStreamFactory::OnSessionClosed() runs.
2768 base::RunLoop run_loop;
2769 run_loop.RunUntilIdle();
2770
jri7046038f2015-10-22 00:29:262771 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2772 factory_.get()));
2773 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2774 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352775
2776 // Test two-in-a-row public reset post handshakes..
2777 DVLOG(1) << "Create 2nd session and trigger public reset post handshake";
2778 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262779 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562780 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562781 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:352782 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162783 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262784 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352785
fayanga64c1a92016-02-13 01:55:582786 session2->connection()->CloseConnection(QUIC_PUBLIC_RESET,
2787 ConnectionCloseSource::FROM_PEER);
ckrasic1e53b642015-07-08 22:39:352788 // Need to spin the loop now to ensure that
2789 // QuicStreamFactory::OnSessionClosed() runs.
2790 base::RunLoop run_loop2;
2791 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262792 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2793 factory_.get()));
2794 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2795 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:162796 EXPECT_EQ(
2797 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
jri7046038f2015-10-22 00:29:262798 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352799
2800 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2801 EXPECT_TRUE(stream.get());
2802 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2803 EXPECT_TRUE(stream2.get());
2804 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2805 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2806 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2807 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2808}
2809
2810TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfTwo) {
jri7046038f2015-10-22 00:29:262811 disable_disk_cache_ = true;
2812 threshold_timeouts_with_open_streams_ = 2;
2813 Initialize();
rch6faa4d42016-01-05 20:48:432814 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2815 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2816 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:262817
2818 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2819 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2820 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352821 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262822 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352823
mmenke651bae7f2015-12-18 21:26:452824 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2825 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352826 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:352827
mmenke651bae7f2015-12-18 21:26:452828 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352829 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:352830
rch6faa4d42016-01-05 20:48:432831 HostPortPair server2(kServer2HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:352832
2833 crypto_client_stream_factory_.set_handshake_mode(
2834 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2835 host_resolver_.set_synchronous_mode(true);
2836 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2837 "192.168.0.1", "");
2838 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2839
jri7046038f2015-10-22 00:29:262840 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562841 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562842 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2843 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:352844
rchf114d982015-10-21 01:34:562845 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262846 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352847
2848 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2849 EXPECT_TRUE(stream.get());
2850 HttpRequestInfo request_info;
2851 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2852 net_log_, CompletionCallback()));
2853
2854 DVLOG(1)
2855 << "Created 1st session and initialized a stream. Now trigger timeout";
fayanga64c1a92016-02-13 01:55:582856 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT,
2857 ConnectionCloseSource::FROM_SELF);
ckrasic1e53b642015-07-08 22:39:352858 // Need to spin the loop now to ensure that
2859 // QuicStreamFactory::OnSessionClosed() runs.
2860 base::RunLoop run_loop;
2861 run_loop.RunUntilIdle();
2862
jri7046038f2015-10-22 00:29:262863 EXPECT_EQ(
2864 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2865 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2866 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352867
2868 // Test two-in-a-row timeouts with open streams.
2869 DVLOG(1) << "Create 2nd session and timeout with open stream";
2870 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262871 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562872 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562873 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:352874 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162875 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262876 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352877
2878 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2879 EXPECT_TRUE(stream2.get());
2880 EXPECT_EQ(OK, stream2->InitializeStream(&request_info, DEFAULT_PRIORITY,
2881 net_log_, CompletionCallback()));
2882
fayanga64c1a92016-02-13 01:55:582883 session2->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT,
2884 ConnectionCloseSource::FROM_SELF);
ckrasic1e53b642015-07-08 22:39:352885 // Need to spin the loop now to ensure that
2886 // QuicStreamFactory::OnSessionClosed() runs.
2887 base::RunLoop run_loop2;
2888 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262889 EXPECT_EQ(
2890 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2891 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2892 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:162893 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
jri7046038f2015-10-22 00:29:262894 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352895
2896 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2897 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2898 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2899 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2900}
2901
2902TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfThree) {
jri7046038f2015-10-22 00:29:262903 disable_disk_cache_ = true;
2904 threshold_public_resets_post_handshake_ = 2;
2905 Initialize();
rch6faa4d42016-01-05 20:48:432906 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2907 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2908 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2909 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:262910
2911 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2912 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352913 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262914 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352915
mmenke651bae7f2015-12-18 21:26:452916 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2917 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352918 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:352919
mmenke651bae7f2015-12-18 21:26:452920 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352921 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:352922
mmenke651bae7f2015-12-18 21:26:452923 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352924 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:352925
rch6faa4d42016-01-05 20:48:432926 HostPortPair server2(kServer2HostName, kDefaultServerPort);
2927 HostPortPair server3(kServer3HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:352928
2929 crypto_client_stream_factory_.set_handshake_mode(
2930 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2931 host_resolver_.set_synchronous_mode(true);
2932 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2933 "192.168.0.1", "");
2934 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2935 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
2936
2937 // Test first and third out of three public reset post handshakes.
jri7046038f2015-10-22 00:29:262938 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562939 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562940 /*cert_verify_flags=*/0, url_, "GET", net_log_,
2941 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:352942
rchf114d982015-10-21 01:34:562943 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262944 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352945
2946 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
fayanga64c1a92016-02-13 01:55:582947 session->connection()->CloseConnection(QUIC_PUBLIC_RESET,
2948 ConnectionCloseSource::FROM_PEER);
ckrasic1e53b642015-07-08 22:39:352949 // Need to spin the loop now to ensure that
2950 // QuicStreamFactory::OnSessionClosed() runs.
2951 base::RunLoop run_loop;
2952 run_loop.RunUntilIdle();
2953
jri7046038f2015-10-22 00:29:262954 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2955 factory_.get()));
2956 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2957 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352958
2959 DVLOG(1) << "Create 2nd session without disable trigger";
2960 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262961 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562962 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562963 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:352964 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162965 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262966 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352967
fayanga64c1a92016-02-13 01:55:582968 session2->connection()->CloseConnection(QUIC_NO_ERROR,
2969 ConnectionCloseSource::FROM_SELF);
ckrasic1e53b642015-07-08 22:39:352970 // Need to spin the loop now to ensure that
2971 // QuicStreamFactory::OnSessionClosed() runs.
2972 base::RunLoop run_loop2;
2973 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262974 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2975 factory_.get()));
2976 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2977 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352978
2979 DVLOG(1) << "Create 3rd session with public reset post handshake,"
2980 << " will disable QUIC";
2981 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:262982 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:562983 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:562984 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:352985 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:162986 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:262987 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:352988
fayanga64c1a92016-02-13 01:55:582989 session3->connection()->CloseConnection(QUIC_PUBLIC_RESET,
2990 ConnectionCloseSource::FROM_PEER);
ckrasic1e53b642015-07-08 22:39:352991 // Need to spin the loop now to ensure that
2992 // QuicStreamFactory::OnSessionClosed() runs.
2993 base::RunLoop run_loop3;
2994 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:262995 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2996 factory_.get()));
2997 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2998 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:162999 EXPECT_EQ(
3000 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
jri7046038f2015-10-22 00:29:263001 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353002
3003 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
3004 EXPECT_TRUE(stream.get());
3005 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
3006 EXPECT_TRUE(stream2.get());
3007 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
3008 EXPECT_TRUE(stream3.get());
3009
3010 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3011 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3012 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3013 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3014 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3015 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3016}
3017
3018TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfThree) {
jri7046038f2015-10-22 00:29:263019 disable_disk_cache_ = true;
3020 threshold_public_resets_post_handshake_ = 2;
3021 Initialize();
rch6faa4d42016-01-05 20:48:433022 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3023 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3024 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3025 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263026 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3027
3028 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3029 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353030 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263031 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353032
mmenke651bae7f2015-12-18 21:26:453033 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3034 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353035 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353036
mmenke651bae7f2015-12-18 21:26:453037 // SequencedSocketData socket_data2(nullptr, 0, nullptr, 0);
3038 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353039 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353040
mmenke651bae7f2015-12-18 21:26:453041 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353042 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:353043
rch6faa4d42016-01-05 20:48:433044 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3045 HostPortPair server3(kServer3HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353046
3047 crypto_client_stream_factory_.set_handshake_mode(
3048 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3049 host_resolver_.set_synchronous_mode(true);
3050 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3051 "192.168.0.1", "");
3052 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3053 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3054
3055 // Test first and third out of three timeouts with open streams.
jri7046038f2015-10-22 00:29:263056 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563057 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563058 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3059 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353060
rchf114d982015-10-21 01:34:563061 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:263062 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353063
3064 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
3065 EXPECT_TRUE(stream.get());
3066 HttpRequestInfo request_info;
3067 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3068 net_log_, CompletionCallback()));
3069
3070 DVLOG(1)
3071 << "Created 1st session and initialized a stream. Now trigger timeout";
fayanga64c1a92016-02-13 01:55:583072 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT,
3073 ConnectionCloseSource::FROM_SELF);
ckrasic1e53b642015-07-08 22:39:353074 // Need to spin the loop now to ensure that
3075 // QuicStreamFactory::OnSessionClosed() runs.
3076 base::RunLoop run_loop;
3077 run_loop.RunUntilIdle();
3078
jri7046038f2015-10-22 00:29:263079 EXPECT_EQ(
3080 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3081 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3082 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353083
3084 // Test two-in-a-row timeouts with open streams.
3085 DVLOG(1) << "Create 2nd session without timeout";
3086 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263087 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563088 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563089 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353090 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:163091 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:263092 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:353093
fayanga64c1a92016-02-13 01:55:583094 session2->connection()->CloseConnection(QUIC_NO_ERROR,
3095 ConnectionCloseSource::FROM_PEER);
ckrasic1e53b642015-07-08 22:39:353096 // Need to spin the loop now to ensure that
3097 // QuicStreamFactory::OnSessionClosed() runs.
3098 base::RunLoop run_loop2;
3099 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263100 EXPECT_EQ(
3101 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3102 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3103 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353104
3105 DVLOG(1) << "Create 3rd session with timeout with open streams,"
3106 << " will disable QUIC";
3107
3108 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263109 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563110 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563111 /*cert_verify_flags=*/0, url3_, "GET",
ckrasic1e53b642015-07-08 22:39:353112 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:163113 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:263114 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:353115
3116 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
3117 EXPECT_TRUE(stream3.get());
3118 EXPECT_EQ(OK, stream3->InitializeStream(&request_info, DEFAULT_PRIORITY,
3119 net_log_, CompletionCallback()));
fayanga64c1a92016-02-13 01:55:583120 session3->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT,
3121 ConnectionCloseSource::FROM_SELF);
ckrasic1e53b642015-07-08 22:39:353122 // Need to spin the loop now to ensure that
3123 // QuicStreamFactory::OnSessionClosed() runs.
3124 base::RunLoop run_loop3;
3125 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:263126 EXPECT_EQ(
3127 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3128 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3129 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:163130 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
jri7046038f2015-10-22 00:29:263131 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353132
3133 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
3134 EXPECT_TRUE(stream2.get());
3135 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3136 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3137 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3138 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3139 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3140 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3141}
3142
zhongyi89649c32016-01-22 00:14:013143TEST_P(QuicStreamFactoryTest, DisableQuicWhenTimeoutsWithOpenStreams) {
3144 disable_disk_cache_ = true;
3145 disable_quic_on_timeout_with_open_streams_ = true;
3146 Initialize();
3147 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3148 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3149 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3150
3151 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3152 host_port_pair_.port()));
3153 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
3154 factory_.get(), host_port_pair_.port()));
3155
3156 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3157 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
3158 socket_factory_.AddSocketDataProvider(&socket_data);
3159
3160 crypto_client_stream_factory_.set_handshake_mode(
3161 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3162 host_resolver_.set_synchronous_mode(true);
3163 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3164 "192.168.0.1", "");
3165
3166 // Test first timeouts with open streams will disable QUIC.
3167 QuicStreamRequest request(factory_.get());
3168 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563169 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3170 callback_.callback()));
zhongyi89649c32016-01-22 00:14:013171
3172 QuicChromiumClientSession* session =
3173 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
3174
3175 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
3176 EXPECT_TRUE(stream.get());
3177 HttpRequestInfo request_info;
3178 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3179 net_log_, CompletionCallback()));
3180
3181 DVLOG(1)
3182 << "Created 1st session and initialized a stream. Now trigger timeout."
3183 << "Will disable QUIC.";
fayanga64c1a92016-02-13 01:55:583184 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT,
3185 ConnectionCloseSource::FROM_SELF);
zhongyi89649c32016-01-22 00:14:013186 // Need to spin the loop now to ensure that
3187 // QuicStreamFactory::OnSessionClosed() runs.
3188 base::RunLoop run_loop;
3189 run_loop.RunUntilIdle();
3190
3191 EXPECT_EQ(
3192 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3193 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3194 host_port_pair_.port()));
3195
3196 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
3197 factory_->QuicDisabledReason(host_port_pair_.port()));
3198
3199 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3200 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3201}
3202
ckrasic1e53b642015-07-08 22:39:353203TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfFour) {
jri7046038f2015-10-22 00:29:263204 disable_disk_cache_ = true;
3205 threshold_public_resets_post_handshake_ = 2;
3206 Initialize();
rch6faa4d42016-01-05 20:48:433207 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3208 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3209 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3210 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3211 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263212 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3213
3214 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3215 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353216 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263217 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353218
mmenke651bae7f2015-12-18 21:26:453219 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3220 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353221 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353222
mmenke651bae7f2015-12-18 21:26:453223 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353224 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353225
mmenke651bae7f2015-12-18 21:26:453226 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353227 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:353228
mmenke651bae7f2015-12-18 21:26:453229 SequencedSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353230 socket_factory_.AddSocketDataProvider(&socket_data4);
ckrasic1e53b642015-07-08 22:39:353231
rch6faa4d42016-01-05 20:48:433232 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3233 HostPortPair server3(kServer3HostName, kDefaultServerPort);
3234 HostPortPair server4(kServer4HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353235
3236 crypto_client_stream_factory_.set_handshake_mode(
3237 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3238 host_resolver_.set_synchronous_mode(true);
3239 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3240 "192.168.0.1", "");
3241 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3242 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3243 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
3244
3245 // Test first and fourth out of four public reset post handshakes.
jri7046038f2015-10-22 00:29:263246 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563247 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563248 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3249 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353250
rchf114d982015-10-21 01:34:563251 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:263252 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353253
3254 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
fayanga64c1a92016-02-13 01:55:583255 session->connection()->CloseConnection(QUIC_PUBLIC_RESET,
3256 ConnectionCloseSource::FROM_PEER);
ckrasic1e53b642015-07-08 22:39:353257 // Need to spin the loop now to ensure that
3258 // QuicStreamFactory::OnSessionClosed() runs.
3259 base::RunLoop run_loop;
3260 run_loop.RunUntilIdle();
3261
jri7046038f2015-10-22 00:29:263262 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3263 factory_.get()));
3264 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3265 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353266
3267 DVLOG(1) << "Create 2nd and 3rd sessions without disable trigger";
3268 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263269 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563270 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563271 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353272 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:163273 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:263274 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:353275
fayanga64c1a92016-02-13 01:55:583276 session2->connection()->CloseConnection(QUIC_NO_ERROR,
3277 ConnectionCloseSource::FROM_SELF);
ckrasic1e53b642015-07-08 22:39:353278 // Need to spin the loop now to ensure that
3279 // QuicStreamFactory::OnSessionClosed() runs.
3280 base::RunLoop run_loop2;
3281 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263282 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3283 factory_.get()));
3284 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3285 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353286
3287 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263288 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563289 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563290 /*cert_verify_flags=*/0, url3_, "GET",
ckrasic1e53b642015-07-08 22:39:353291 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:163292 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:263293 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:353294
fayanga64c1a92016-02-13 01:55:583295 session3->connection()->CloseConnection(QUIC_NO_ERROR,
3296 ConnectionCloseSource::FROM_SELF);
ckrasic1e53b642015-07-08 22:39:353297 // Need to spin the loop now to ensure that
3298 // QuicStreamFactory::OnSessionClosed() runs.
3299 base::RunLoop run_loop3;
3300 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:263301 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3302 factory_.get()));
3303 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3304 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353305
3306 DVLOG(1) << "Create 4rd session with public reset post handshake,"
3307 << " will not disable QUIC";
3308 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:263309 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:563310 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563311 /*cert_verify_flags=*/0, url4_, "GET",
ckrasic1e53b642015-07-08 22:39:353312 net_log_, callback4.callback()));
ckrasic4f9d88d2015-07-22 22:23:163313 QuicChromiumClientSession* session4 =
jri7046038f2015-10-22 00:29:263314 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server4);
ckrasic1e53b642015-07-08 22:39:353315
fayanga64c1a92016-02-13 01:55:583316 session4->connection()->CloseConnection(QUIC_PUBLIC_RESET,
3317 ConnectionCloseSource::FROM_PEER);
ckrasic1e53b642015-07-08 22:39:353318 // Need to spin the loop now to ensure that
3319 // QuicStreamFactory::OnSessionClosed() runs.
3320 base::RunLoop run_loop4;
3321 run_loop4.RunUntilIdle();
jri7046038f2015-10-22 00:29:263322 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3323 factory_.get()));
3324 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3325 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353326
3327 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
3328 EXPECT_TRUE(stream.get());
3329 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
3330 EXPECT_TRUE(stream2.get());
3331 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
3332 EXPECT_TRUE(stream3.get());
3333 scoped_ptr<QuicHttpStream> stream4 = request4.ReleaseStream();
3334 EXPECT_TRUE(stream4.get());
3335
3336 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3337 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3338 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3339 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3340 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3341 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3342 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
3343 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
3344}
3345
3346TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfFour) {
jri7046038f2015-10-22 00:29:263347 disable_disk_cache_ = true;
3348 threshold_public_resets_post_handshake_ = 2;
3349 Initialize();
rch6faa4d42016-01-05 20:48:433350 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3351 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3352 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3353 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3354 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263355 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3356
3357 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3358 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353359 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263360 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353361
mmenke651bae7f2015-12-18 21:26:453362 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3363 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353364 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353365
mmenke651bae7f2015-12-18 21:26:453366 // SequencedSocketData socket_data2(nullptr, 0, nullptr, 0);
3367 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353368 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353369
mmenke651bae7f2015-12-18 21:26:453370 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353371 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:353372
mmenke651bae7f2015-12-18 21:26:453373 SequencedSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353374 socket_factory_.AddSocketDataProvider(&socket_data4);
ckrasic1e53b642015-07-08 22:39:353375
rch6faa4d42016-01-05 20:48:433376 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3377 HostPortPair server3(kServer3HostName, kDefaultServerPort);
3378 HostPortPair server4(kServer4HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353379
3380 crypto_client_stream_factory_.set_handshake_mode(
3381 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3382 host_resolver_.set_synchronous_mode(true);
3383 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3384 "192.168.0.1", "");
3385 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3386 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3387 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
3388
3389 // Test first and fourth out of three timeouts with open streams.
jri7046038f2015-10-22 00:29:263390 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563391 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563392 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3393 callback_.callback()));
ckrasic1e53b642015-07-08 22:39:353394
rchf114d982015-10-21 01:34:563395 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:263396 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353397
3398 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
3399 EXPECT_TRUE(stream.get());
3400 HttpRequestInfo request_info;
3401 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3402 net_log_, CompletionCallback()));
3403
3404 DVLOG(1)
3405 << "Created 1st session and initialized a stream. Now trigger timeout";
fayanga64c1a92016-02-13 01:55:583406 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT,
3407 ConnectionCloseSource::FROM_SELF);
ckrasic1e53b642015-07-08 22:39:353408 // Need to spin the loop now to ensure that
3409 // QuicStreamFactory::OnSessionClosed() runs.
3410 base::RunLoop run_loop;
3411 run_loop.RunUntilIdle();
3412
jri7046038f2015-10-22 00:29:263413 EXPECT_EQ(
3414 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3415 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3416 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353417
3418 DVLOG(1) << "Create 2nd and 3rd sessions without timeout";
3419 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263420 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563421 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563422 /*cert_verify_flags=*/0, url2_, "GET",
ckrasic1e53b642015-07-08 22:39:353423 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:163424 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:263425 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:353426
fayanga64c1a92016-02-13 01:55:583427 session2->connection()->CloseConnection(QUIC_NO_ERROR,
3428 ConnectionCloseSource::FROM_PEER);
ckrasic1e53b642015-07-08 22:39:353429 // Need to spin the loop now to ensure that
3430 // QuicStreamFactory::OnSessionClosed() runs.
3431 base::RunLoop run_loop2;
3432 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263433 EXPECT_EQ(
3434 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3435 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3436 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353437
3438 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263439 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563440 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563441 /*cert_verify_flags=*/0, url3_, "GET",
ckrasic1e53b642015-07-08 22:39:353442 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:163443 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:263444 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:353445
fayanga64c1a92016-02-13 01:55:583446 session3->connection()->CloseConnection(QUIC_NO_ERROR,
3447 ConnectionCloseSource::FROM_PEER);
ckrasic1e53b642015-07-08 22:39:353448 // Need to spin the loop now to ensure that
3449 // QuicStreamFactory::OnSessionClosed() runs.
3450 base::RunLoop run_loop3;
3451 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:263452 EXPECT_EQ(
3453 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3454 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3455 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353456
3457 DVLOG(1) << "Create 4th session with timeout with open streams,"
3458 << " will not disable QUIC";
3459
3460 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:263461 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:563462 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563463 /*cert_verify_flags=*/0, url4_, "GET",
ckrasic1e53b642015-07-08 22:39:353464 net_log_, callback4.callback()));
ckrasic4f9d88d2015-07-22 22:23:163465 QuicChromiumClientSession* session4 =
jri7046038f2015-10-22 00:29:263466 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server4);
ckrasic1e53b642015-07-08 22:39:353467
3468 scoped_ptr<QuicHttpStream> stream4 = request4.ReleaseStream();
3469 EXPECT_TRUE(stream4.get());
3470 EXPECT_EQ(OK, stream4->InitializeStream(&request_info, DEFAULT_PRIORITY,
3471 net_log_, CompletionCallback()));
fayanga64c1a92016-02-13 01:55:583472 session4->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT,
3473 ConnectionCloseSource::FROM_SELF);
ckrasic1e53b642015-07-08 22:39:353474 // Need to spin the loop now to ensure that
3475 // QuicStreamFactory::OnSessionClosed() runs.
3476 base::RunLoop run_loop4;
3477 run_loop4.RunUntilIdle();
jri7046038f2015-10-22 00:29:263478 EXPECT_EQ(
3479 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3480 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3481 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353482
3483 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
3484 EXPECT_TRUE(stream2.get());
3485 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
3486 EXPECT_TRUE(stream3.get());
3487 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3488 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3489 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3490 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3491 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3492 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3493 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
3494 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
3495}
3496
rtenneti8332ba52015-09-17 19:33:413497TEST_P(QuicStreamFactoryTest, EnableDelayTcpRace) {
jri7046038f2015-10-22 00:29:263498 Initialize();
rch6faa4d42016-01-05 20:48:433499 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3500 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263501 bool delay_tcp_race = QuicStreamFactoryPeer::GetDelayTcpRace(factory_.get());
3502 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), false);
mmenke651bae7f2015-12-18 21:26:453503 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3504 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti8332ba52015-09-17 19:33:413505 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti8332ba52015-09-17 19:33:413506
rtenneti8332ba52015-09-17 19:33:413507 ServerNetworkStats stats1;
3508 stats1.srtt = base::TimeDelta::FromMicroseconds(10);
rtenneticcab42b2015-10-09 06:38:163509 http_server_properties_.SetServerNetworkStats(host_port_pair_, stats1);
rtenneti8332ba52015-09-17 19:33:413510
3511 crypto_client_stream_factory_.set_handshake_mode(
3512 MockCryptoClientStream::ZERO_RTT);
3513 host_resolver_.set_synchronous_mode(true);
3514 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3515 "192.168.0.1", "");
3516
jri7046038f2015-10-22 00:29:263517 QuicStreamRequest request(factory_.get());
rtenneti8332ba52015-09-17 19:33:413518 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:563519 request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563520 /*cert_verify_flags=*/0, url_, "POST", net_log_,
3521 callback_.callback()));
rtenneti8332ba52015-09-17 19:33:413522
3523 // If we don't delay TCP connection, then time delay should be 0.
jri7046038f2015-10-22 00:29:263524 EXPECT_FALSE(factory_->delay_tcp_race());
rtenneti8332ba52015-09-17 19:33:413525 EXPECT_EQ(base::TimeDelta(), request.GetTimeDelayForWaitingJob());
3526
3527 // Enable |delay_tcp_race_| param and verify delay is one RTT and that
3528 // server supports QUIC.
jri7046038f2015-10-22 00:29:263529 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), true);
3530 EXPECT_TRUE(factory_->delay_tcp_race());
rtenneti8332ba52015-09-17 19:33:413531 EXPECT_EQ(base::TimeDelta::FromMicroseconds(15),
3532 request.GetTimeDelayForWaitingJob());
3533
3534 // Confirm the handshake and verify that the stream is created.
3535 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
3536 QuicSession::HANDSHAKE_CONFIRMED);
3537
3538 EXPECT_EQ(OK, callback_.WaitForResult());
3539
3540 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
3541 EXPECT_TRUE(stream.get());
3542 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3543 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
jri7046038f2015-10-22 00:29:263544 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), delay_tcp_race);
rtenneti8332ba52015-09-17 19:33:413545}
3546
rtenneticd2aaa15b2015-10-10 20:29:333547TEST_P(QuicStreamFactoryTest, MaybeInitialize) {
rtenneti41c09992015-11-30 18:24:013548 idle_connection_timeout_seconds_ = 500;
jri7046038f2015-10-22 00:29:263549 Initialize();
rch6faa4d42016-01-05 20:48:433550 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3551 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rtenneti41c09992015-11-30 18:24:013552 const QuicConfig* config = QuicStreamFactoryPeer::GetConfig(factory_.get());
3553 EXPECT_EQ(500, config->IdleConnectionStateLifetime().ToSeconds());
3554
jri7046038f2015-10-22 00:29:263555 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti8a80a6dc2015-09-21 19:51:133556
rtenneti8a80a6dc2015-09-21 19:51:133557 const AlternativeService alternative_service1(QUIC, host_port_pair_.host(),
3558 host_port_pair_.port());
3559 AlternativeServiceInfoVector alternative_service_info_vector;
3560 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
3561 alternative_service_info_vector.push_back(
anthonyvd5b168c12016-03-07 22:03:573562 AlternativeServiceInfo(alternative_service1, 1.0, expiration));
rtenneti8a80a6dc2015-09-21 19:51:133563
rtenneticcab42b2015-10-09 06:38:163564 http_server_properties_.SetAlternativeServices(
rtenneti8a80a6dc2015-09-21 19:51:133565 host_port_pair_, alternative_service_info_vector);
rtenneti6971c172016-01-15 20:12:103566 http_server_properties_.SetMaxServerConfigsStoredInProperties(
3567 kMaxQuicServersToPersist);
rtenneti8a80a6dc2015-09-21 19:51:133568
rch6faa4d42016-01-05 20:48:433569 QuicServerId quic_server_id(kDefaultServerHostName, 80,
3570 PRIVACY_MODE_DISABLED);
rtenneticd2aaa15b2015-10-10 20:29:333571 QuicServerInfoFactory* quic_server_info_factory =
3572 new PropertiesBasedQuicServerInfoFactory(
3573 http_server_properties_.GetWeakPtr());
jri7046038f2015-10-22 00:29:263574 factory_->set_quic_server_info_factory(quic_server_info_factory);
rtenneticd2aaa15b2015-10-10 20:29:333575
3576 scoped_ptr<QuicServerInfo> quic_server_info(
3577 quic_server_info_factory->GetForServer(quic_server_id));
3578
3579 // Update quic_server_info's server_config and persist it.
3580 QuicServerInfo::State* state = quic_server_info->mutable_state();
3581 // Minimum SCFG that passes config validation checks.
3582 const char scfg[] = {// SCFG
3583 0x53, 0x43, 0x46, 0x47,
3584 // num entries
3585 0x01, 0x00,
3586 // padding
3587 0x00, 0x00,
3588 // EXPY
3589 0x45, 0x58, 0x50, 0x59,
3590 // EXPY end offset
3591 0x08, 0x00, 0x00, 0x00,
3592 // Value
3593 '1', '2', '3', '4', '5', '6', '7', '8'};
3594
3595 // Create temporary strings becasue Persist() clears string data in |state|.
3596 string server_config(reinterpret_cast<const char*>(&scfg), sizeof(scfg));
3597 string source_address_token("test_source_address_token");
3598 string signature("test_signature");
3599 string test_cert("test_cert");
3600 vector<string> certs;
3601 certs.push_back(test_cert);
3602 state->server_config = server_config;
3603 state->source_address_token = source_address_token;
3604 state->server_config_sig = signature;
3605 state->certs = certs;
3606
3607 quic_server_info->Persist();
3608
jri7046038f2015-10-22 00:29:263609 QuicStreamFactoryPeer::MaybeInitialize(factory_.get());
3610 EXPECT_TRUE(QuicStreamFactoryPeer::HasInitializedData(factory_.get()));
3611 EXPECT_TRUE(QuicStreamFactoryPeer::SupportsQuicAtStartUp(factory_.get(),
3612 host_port_pair_));
3613 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(factory_.get(),
rtenneticd2aaa15b2015-10-10 20:29:333614 quic_server_id));
3615 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:263616 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rtenneticd2aaa15b2015-10-10 20:29:333617 QuicCryptoClientConfig::CachedState* cached =
3618 crypto_config->LookupOrCreate(quic_server_id);
3619 EXPECT_FALSE(cached->server_config().empty());
3620 EXPECT_TRUE(cached->GetServerConfig());
3621 EXPECT_EQ(server_config, cached->server_config());
3622 EXPECT_EQ(source_address_token, cached->source_address_token());
3623 EXPECT_EQ(signature, cached->signature());
3624 ASSERT_EQ(1U, cached->certs().size());
3625 EXPECT_EQ(test_cert, cached->certs()[0]);
rtenneti8a80a6dc2015-09-21 19:51:133626}
3627
rtennetid2e74caa2015-12-09 00:51:573628TEST_P(QuicStreamFactoryTest, QuicDoingZeroRTT) {
3629 Initialize();
3630
3631 factory_->set_require_confirmation(true);
3632 QuicServerId quic_server_id(host_port_pair_, PRIVACY_MODE_DISABLED);
3633 EXPECT_FALSE(factory_->ZeroRTTEnabledFor(quic_server_id));
3634
3635 factory_->set_require_confirmation(false);
3636 EXPECT_FALSE(factory_->ZeroRTTEnabledFor(quic_server_id));
3637
3638 // Load server config and verify QUIC will do 0RTT.
3639 QuicStreamFactoryPeer::CacheDummyServerConfig(factory_.get(), quic_server_id);
3640 EXPECT_TRUE(factory_->ZeroRTTEnabledFor(quic_server_id));
3641}
3642
rtenneti1cd3b162015-09-29 02:58:283643TEST_P(QuicStreamFactoryTest, YieldAfterPackets) {
jri7046038f2015-10-22 00:29:263644 Initialize();
rch6faa4d42016-01-05 20:48:433645 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3646 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263647 QuicStreamFactoryPeer::SetYieldAfterPackets(factory_.get(), 0);
rtenneti1cd3b162015-09-29 02:58:283648
3649 scoped_ptr<QuicEncryptedPacket> close_packet(
3650 ConstructConnectionClosePacket(0));
rtenneticd2aaa15b2015-10-10 20:29:333651 vector<MockRead> reads;
rtenneti1cd3b162015-09-29 02:58:283652 reads.push_back(
3653 MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0));
3654 reads.push_back(MockRead(ASYNC, OK, 1));
mmenke651bae7f2015-12-18 21:26:453655 SequencedSocketData socket_data(&reads[0], reads.size(), nullptr, 0);
rtenneti1cd3b162015-09-29 02:58:283656 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti1cd3b162015-09-29 02:58:283657
3658 crypto_client_stream_factory_.set_handshake_mode(
3659 MockCryptoClientStream::ZERO_RTT);
3660 host_resolver_.set_synchronous_mode(true);
3661 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3662 "192.168.0.1", "");
3663
rcha02807b42016-01-29 21:56:153664 // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
3665 // posts a task.
rtenneti1cd3b162015-09-29 02:58:283666 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
rcha02807b42016-01-29 21:56:153667 SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
3668 "StartReading");
rtenneti1cd3b162015-09-29 02:58:283669
jri7046038f2015-10-22 00:29:263670 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563671 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563672 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3673 callback_.callback()));
rtenneti1cd3b162015-09-29 02:58:283674
rcha02807b42016-01-29 21:56:153675 // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
3676 // called.
rtenneti1cd3b162015-09-29 02:58:283677 base::RunLoop run_loop;
3678 run_loop.RunUntilIdle();
3679
3680 // Verify task that the observer's executed_count is 1, which indicates
rcha02807b42016-01-29 21:56:153681 // QuicChromiumPacketReader::StartReading() has posted only one task and
3682 // yielded the read.
rtenneti1cd3b162015-09-29 02:58:283683 EXPECT_EQ(1u, observer.executed_count());
3684
3685 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
3686 EXPECT_TRUE(stream.get());
3687 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3688 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3689}
3690
3691TEST_P(QuicStreamFactoryTest, YieldAfterDuration) {
jri7046038f2015-10-22 00:29:263692 Initialize();
rch6faa4d42016-01-05 20:48:433693 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3694 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rtenneti1cd3b162015-09-29 02:58:283695 QuicStreamFactoryPeer::SetYieldAfterDuration(
jri7046038f2015-10-22 00:29:263696 factory_.get(), QuicTime::Delta::FromMilliseconds(-1));
rtenneti1cd3b162015-09-29 02:58:283697
3698 scoped_ptr<QuicEncryptedPacket> close_packet(
3699 ConstructConnectionClosePacket(0));
rtenneticd2aaa15b2015-10-10 20:29:333700 vector<MockRead> reads;
rtenneti1cd3b162015-09-29 02:58:283701 reads.push_back(
3702 MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0));
3703 reads.push_back(MockRead(ASYNC, OK, 1));
mmenke651bae7f2015-12-18 21:26:453704 SequencedSocketData socket_data(&reads[0], reads.size(), nullptr, 0);
rtenneti1cd3b162015-09-29 02:58:283705 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti1cd3b162015-09-29 02:58:283706
3707 crypto_client_stream_factory_.set_handshake_mode(
3708 MockCryptoClientStream::ZERO_RTT);
3709 host_resolver_.set_synchronous_mode(true);
3710 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3711 "192.168.0.1", "");
3712
rcha02807b42016-01-29 21:56:153713 // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
3714 // posts a task.
rtenneti1cd3b162015-09-29 02:58:283715 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
rcha02807b42016-01-29 21:56:153716 SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
3717 "StartReading");
rtenneti1cd3b162015-09-29 02:58:283718
jri7046038f2015-10-22 00:29:263719 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563720 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic3865ee0f2016-02-29 22:04:563721 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3722 callback_.callback()));
rtenneti1cd3b162015-09-29 02:58:283723
rcha02807b42016-01-29 21:56:153724 // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
3725 // called.
rtenneti1cd3b162015-09-29 02:58:283726 base::RunLoop run_loop;
3727 run_loop.RunUntilIdle();
3728
3729 // Verify task that the observer's executed_count is 1, which indicates
rcha02807b42016-01-29 21:56:153730 // QuicChromiumPacketReader::StartReading() has posted only one task and
3731 // yielded the read.
rtenneti1cd3b162015-09-29 02:58:283732 EXPECT_EQ(1u, observer.executed_count());
3733
3734 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
3735 EXPECT_TRUE(stream.get());
3736 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3737 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3738}
3739
ckrasic3865ee0f2016-02-29 22:04:563740TEST_P(QuicStreamFactoryTest, ServerPushSessionAffinity) {
3741 Initialize();
3742 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3743 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3744
3745 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3746 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
3747 socket_factory_.AddSocketDataProvider(&socket_data);
3748
3749 QuicStreamRequest request(factory_.get());
3750 EXPECT_EQ(ERR_IO_PENDING,
3751 request.Request(host_port_pair_, privacy_mode_,
3752 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3753 callback_.callback()));
3754
3755 EXPECT_EQ(OK, callback_.WaitForResult());
3756 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
3757 EXPECT_TRUE(stream.get());
3758
3759 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
3760
3761 std::string url = "https://www.example.org/";
3762
3763 QuicChromiumClientSession* session =
3764 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
3765
3766 QuicClientPromisedInfo promised(session, kServerDataStreamId1, url);
3767 (*QuicStreamFactoryPeer::GetPushPromiseIndex(factory_.get())
3768 ->promised_by_url())[url] = &promised;
3769
3770 QuicStreamRequest request2(factory_.get());
3771 EXPECT_EQ(OK, request2.Request(host_port_pair_, privacy_mode_,
3772 /*cert_verify_flags=*/0, GURL(url), "GET",
3773 net_log_, callback_.callback()));
3774
3775 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
3776}
3777
3778TEST_P(QuicStreamFactoryTest, ServerPushPrivacyModeMismatch) {
3779 Initialize();
3780 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3781 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3782 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3783
3784 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3785
3786 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
3787 1, true, kServerDataStreamId1, QUIC_STREAM_CANCELLED));
3788 MockWrite writes[] = {
3789 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
3790 };
3791
3792 SequencedSocketData socket_data1(reads, arraysize(reads), writes,
3793 arraysize(writes));
3794 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
3795
3796 socket_factory_.AddSocketDataProvider(&socket_data1);
3797 socket_factory_.AddSocketDataProvider(&socket_data2);
3798
3799 QuicStreamRequest request(factory_.get());
3800 EXPECT_EQ(ERR_IO_PENDING,
3801 request.Request(host_port_pair_, privacy_mode_,
3802 /*cert_verify_flags=*/0, url_, "GET", net_log_,
3803 callback_.callback()));
3804
3805 EXPECT_EQ(OK, callback_.WaitForResult());
3806 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
3807 EXPECT_TRUE(stream.get());
3808
3809 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
3810
3811 std::string url = "https://www.example.org/";
3812 QuicChromiumClientSession* session =
3813 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
3814
3815 QuicClientPromisedInfo promised(session, kServerDataStreamId1, url);
3816
3817 QuicClientPushPromiseIndex* index =
3818 QuicStreamFactoryPeer::GetPushPromiseIndex(factory_.get());
3819
3820 (*index->promised_by_url())[url] = &promised;
3821 EXPECT_EQ(index->GetPromised(url), &promised);
3822
3823 // Doing the request should not use the push stream, but rather
3824 // cancel it because the privacy modes do not match.
3825 QuicStreamRequest request2(factory_.get());
3826 EXPECT_EQ(ERR_IO_PENDING,
3827 request2.Request(host_port_pair_, PRIVACY_MODE_ENABLED,
3828 /*cert_verify_flags=*/0, GURL(url), "GET",
3829 net_log_, callback_.callback()));
3830
3831 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
3832 EXPECT_EQ(index->GetPromised(url), nullptr);
3833
3834 EXPECT_EQ(OK, callback_.WaitForResult());
3835 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
3836 EXPECT_TRUE(stream2.get());
3837
3838 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
3839 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
3840 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3841 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3842}
3843
[email protected]e13201d82012-12-12 05:00:323844} // namespace test
[email protected]e13201d82012-12-12 05:00:323845} // namespace net