blob: b4044558b369ec18ca1c5002e4bbeded913603e1 [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"
[email protected]f2cb3cf2013-03-21 01:40:5312#include "net/dns/mock_host_resolver.h"
[email protected]e13201d82012-12-12 05:00:3213#include "net/http/http_response_headers.h"
14#include "net/http/http_response_info.h"
15#include "net/http/http_util.h"
[email protected]080b77932014-08-04 01:22:4616#include "net/http/transport_security_state.h"
[email protected]c49ff182013-09-28 08:33:2617#include "net/quic/crypto/crypto_handshake.h"
[email protected]b694e48c2014-03-18 17:10:1318#include "net/quic/crypto/proof_verifier_chromium.h"
[email protected]4df69842013-02-27 06:32:1619#include "net/quic/crypto/quic_decrypter.h"
20#include "net/quic/crypto/quic_encrypter.h"
rtenneti38f5cd52014-10-28 20:28:2821#include "net/quic/crypto/quic_server_info.h"
[email protected]e13201d82012-12-12 05:00:3222#include "net/quic/quic_http_stream.h"
[email protected]257f24f2014-04-01 09:15:3723#include "net/quic/quic_server_id.h"
[email protected]e13201d82012-12-12 05:00:3224#include "net/quic/test_tools/mock_clock.h"
[email protected]e8ff26842013-03-22 21:02:0525#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
[email protected]9558c5d32012-12-22 00:08:1426#include "net/quic/test_tools/mock_random.h"
[email protected]1e960032013-12-20 19:00:2027#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]e13201d82012-12-12 05:00:3228#include "net/quic/test_tools/quic_test_utils.h"
rtenneti38f5cd52014-10-28 20:28:2829#include "net/quic/test_tools/test_task_runner.h"
[email protected]e13201d82012-12-12 05:00:3230#include "net/socket/socket_test_util.h"
[email protected]5db452202014-08-19 05:22:1531#include "net/spdy/spdy_test_utils.h"
[email protected]6b8a3c742014-07-25 00:25:3532#include "net/ssl/channel_id_service.h"
33#include "net/ssl/default_channel_id_store.h"
[email protected]eed749f92013-12-23 18:57:3834#include "net/test/cert_test_util.h"
[email protected]e13201d82012-12-12 05:00:3235#include "testing/gtest/include/gtest/gtest.h"
36
[email protected]6e12d702013-11-13 00:17:1737using base::StringPiece;
rtenneti14abd312015-02-06 21:56:0138using std::ostream;
[email protected]6e12d702013-11-13 00:17:1739using std::string;
40using std::vector;
41
[email protected]e13201d82012-12-12 05:00:3242namespace net {
[email protected]e13201d82012-12-12 05:00:3243namespace test {
44
[email protected]3c772402013-12-18 21:38:1145namespace {
46const char kDefaultServerHostName[] = "www.google.com";
47const int kDefaultServerPort = 443;
rtenneti14abd312015-02-06 21:56:0148
49// Run all tests with all the combinations of versions and
50// enable_connection_racing.
51struct TestParams {
52 TestParams(const QuicVersion version, bool enable_connection_racing)
53 : version(version), enable_connection_racing(enable_connection_racing) {}
54
55 friend ostream& operator<<(ostream& os, const TestParams& p) {
56 os << "{ version: " << QuicVersionToString(p.version);
57 os << " enable_connection_racing: " << p.enable_connection_racing << " }";
58 return os;
59 }
60
61 QuicVersion version;
62 bool enable_connection_racing;
63};
64
65// Constructs various test permutations.
66vector<TestParams> GetTestParams() {
67 vector<TestParams> params;
68 QuicVersionVector all_supported_versions = QuicSupportedVersions();
69 for (const QuicVersion version : all_supported_versions) {
70 params.push_back(TestParams(version, false));
71 params.push_back(TestParams(version, true));
72 }
73 return params;
74}
75
[email protected]3c772402013-12-18 21:38:1176} // namespace anonymous
77
[email protected]c49ff182013-09-28 08:33:2678class QuicStreamFactoryPeer {
79 public:
[email protected]59c0bbd2014-03-22 04:08:1280 static QuicCryptoClientConfig* GetCryptoConfig(QuicStreamFactory* factory) {
81 return &factory->crypto_config_;
[email protected]c49ff182013-09-28 08:33:2682 }
[email protected]4d283b32013-10-17 12:57:2783
84 static bool HasActiveSession(QuicStreamFactory* factory,
[email protected]bf4ea2f2014-03-10 22:57:5385 const HostPortPair& host_port_pair,
[email protected]df157d9d2014-03-10 07:27:2786 bool is_https) {
[email protected]257f24f2014-04-01 09:15:3787 QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED);
88 return factory->HasActiveSession(server_id);
[email protected]4d283b32013-10-17 12:57:2789 }
90
91 static QuicClientSession* GetActiveSession(
92 QuicStreamFactory* factory,
[email protected]bf4ea2f2014-03-10 22:57:5393 const HostPortPair& host_port_pair,
[email protected]df157d9d2014-03-10 07:27:2794 bool is_https) {
[email protected]257f24f2014-04-01 09:15:3795 QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED);
96 DCHECK(factory->HasActiveSession(server_id));
97 return factory->active_sessions_[server_id];
[email protected]df157d9d2014-03-10 07:27:2798 }
99
bnccb7ff3c2015-05-21 20:51:55100 static scoped_ptr<QuicHttpStream> CreateFromSession(
[email protected]df157d9d2014-03-10 07:27:27101 QuicStreamFactory* factory,
bnccb7ff3c2015-05-21 20:51:55102 QuicClientSession* session) {
103 return factory->CreateFromSession(session);
[email protected]4d283b32013-10-17 12:57:27104 }
105
106 static bool IsLiveSession(QuicStreamFactory* factory,
107 QuicClientSession* session) {
[email protected]4d590c9c2014-05-02 05:14:33108 for (QuicStreamFactory::SessionIdMap::iterator it =
[email protected]4d283b32013-10-17 12:57:27109 factory->all_sessions_.begin();
110 it != factory->all_sessions_.end(); ++it) {
[email protected]4d590c9c2014-05-02 05:14:33111 if (it->first == session)
[email protected]4d283b32013-10-17 12:57:27112 return true;
113 }
114 return false;
115 }
jri584002d12014-09-09 00:51:28116
117 static void DisableConnectionPooling(QuicStreamFactory* factory) {
118 factory->disable_connection_pooling_ = true;
119 }
rtenneti38f5cd52014-10-28 20:28:28120
121 static void SetTaskRunner(QuicStreamFactory* factory,
122 base::TaskRunner* task_runner) {
123 factory->task_runner_ = task_runner;
124 }
125
rtenneti14abd312015-02-06 21:56:01126 static void SetEnableConnectionRacing(QuicStreamFactory* factory,
127 bool enable_connection_racing) {
128 factory->enable_connection_racing_ = enable_connection_racing;
129 }
130
rtenneti34dffe752015-02-24 23:27:32131 static void SetDisableDiskCache(QuicStreamFactory* factory,
132 bool disable_disk_cache) {
133 factory->disable_disk_cache_ = disable_disk_cache;
134 }
135
rtenneti85dcfac22015-03-27 20:22:19136 static void SetMaxNumberOfLossyConnections(
137 QuicStreamFactory* factory,
138 int max_number_of_lossy_connections) {
139 factory->max_number_of_lossy_connections_ = max_number_of_lossy_connections;
140 }
141
142 static int GetNumberOfLossyConnections(QuicStreamFactory* factory,
143 uint16 port) {
144 return factory->number_of_lossy_connections_[port];
145 }
146
147 static bool IsQuicDisabled(QuicStreamFactory* factory, uint16 port) {
148 return factory->IsQuicDisabled(port);
149 }
150
rtenneti14abd312015-02-06 21:56:01151 static size_t GetNumberOfActiveJobs(QuicStreamFactory* factory,
152 const QuicServerId& server_id) {
153 return (factory->active_jobs_[server_id]).size();
154 }
ckrasic1e53b642015-07-08 22:39:35155
156 static void SetThresholdTimeoutsWithOpenStreams(
157 QuicStreamFactory* factory,
158 int threshold_timeouts_with_open_streams) {
159 factory->threshold_timeouts_with_open_streams_ =
160 threshold_timeouts_with_open_streams;
161 }
162
163 static int GetNumTimeoutsWithOpenStreams(QuicStreamFactory* factory) {
164 return factory->num_timeouts_with_open_streams_;
165 }
166
167 static void SetThresholdPublicResetsPostHandshake(
168 QuicStreamFactory* factory,
169 int threshold_public_resets_post_handshake) {
170 factory->threshold_public_resets_post_handshake_ =
171 threshold_public_resets_post_handshake;
172 }
173
174 static int GetNumPublicResetsPostHandshake(QuicStreamFactory* factory) {
175 return factory->num_public_resets_post_handshake_;
176 }
[email protected]c49ff182013-09-28 08:33:26177};
178
rtenneti38f5cd52014-10-28 20:28:28179class MockQuicServerInfo : public QuicServerInfo {
180 public:
181 MockQuicServerInfo(const QuicServerId& server_id)
182 : QuicServerInfo(server_id) {}
dcheng2339883c2014-12-23 00:23:05183 ~MockQuicServerInfo() override {}
rtenneti38f5cd52014-10-28 20:28:28184
dcheng2339883c2014-12-23 00:23:05185 void Start() override {}
rtenneti38f5cd52014-10-28 20:28:28186
dcheng2339883c2014-12-23 00:23:05187 int WaitForDataReady(const CompletionCallback& callback) override {
rtenneti38f5cd52014-10-28 20:28:28188 return ERR_IO_PENDING;
189 }
190
rtenneti170f36a2015-02-10 19:13:45191 void ResetWaitForDataReadyCallback() override {}
192
dcheng2339883c2014-12-23 00:23:05193 void CancelWaitForDataReadyCallback() override {}
rtenneti38f5cd52014-10-28 20:28:28194
dcheng2339883c2014-12-23 00:23:05195 bool IsDataReady() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28196
dcheng2339883c2014-12-23 00:23:05197 bool IsReadyToPersist() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28198
dcheng2339883c2014-12-23 00:23:05199 void Persist() override {}
rtennetif0b832b2014-11-07 02:32:30200
dcheng2339883c2014-12-23 00:23:05201 void OnExternalCacheHit() override {}
rtenneti38f5cd52014-10-28 20:28:28202};
203
204class MockQuicServerInfoFactory : public QuicServerInfoFactory {
205 public:
206 MockQuicServerInfoFactory() {}
dcheng2339883c2014-12-23 00:23:05207 ~MockQuicServerInfoFactory() override {}
rtenneti38f5cd52014-10-28 20:28:28208
dcheng2339883c2014-12-23 00:23:05209 QuicServerInfo* GetForServer(const QuicServerId& server_id) override {
rtenneti38f5cd52014-10-28 20:28:28210 return new MockQuicServerInfo(server_id);
211 }
212};
213
rtenneti14abd312015-02-06 21:56:01214class QuicStreamFactoryTest : public ::testing::TestWithParam<TestParams> {
[email protected]e13201d82012-12-12 05:00:32215 protected:
216 QuicStreamFactoryTest()
[email protected]457d6952013-12-13 09:24:58217 : random_generator_(0),
218 clock_(new MockClock()),
rtenneti38f5cd52014-10-28 20:28:28219 runner_(new TestTaskRunner(clock_)),
bncb07c05532015-05-14 19:07:20220 maker_(GetParam().version, 0, clock_, kDefaultServerHostName),
[email protected]59c0bbd2014-03-22 04:08:12221 cert_verifier_(CertVerifier::CreateDefault()),
jri2b966f22014-09-02 22:25:36222 channel_id_service_(
rtennetibe635732014-10-02 22:51:42223 new ChannelIDService(new DefaultChannelIDStore(nullptr),
skyostil4891b25b2015-06-11 11:43:45224 base::ThreadTaskRunnerHandle::Get())),
jri2b966f22014-09-02 22:25:36225 factory_(&host_resolver_,
226 &socket_factory_,
227 base::WeakPtr<HttpServerProperties>(),
228 cert_verifier_.get(),
229 channel_id_service_.get(),
230 &transport_security_state_,
231 &crypto_client_stream_factory_,
232 &random_generator_,
233 clock_,
234 kDefaultMaxPacketSize,
235 std::string(),
rtenneti14abd312015-02-06 21:56:01236 SupportedVersions(GetParam().version),
jri2b966f22014-09-02 22:25:36237 /*enable_port_selection=*/true,
jri584002d12014-09-09 00:51:28238 /*always_require_handshake_confirmation=*/false,
239 /*disable_connection_pooling=*/false,
rtenneti2912825c2015-01-06 01:19:46240 /*load_server_info_timeout_srtt_multiplier=*/0.0f,
rtenneti4f809972015-02-11 19:38:34241 /*enable_connection_racing=*/false,
qyearsley3257b7de2015-02-28 06:59:03242 /*enable_non_blocking_io=*/true,
rtenneti34dffe752015-02-24 23:27:32243 /*disable_disk_cache=*/false,
rch9976b0c2015-06-10 21:27:23244 /*prefer_aes=*/false,
rtenneti85dcfac22015-03-27 20:22:19245 /*max_number_of_lossy_connections=*/0,
246 /*packet_loss_threshold=*/1.0f,
ckrasic1e53b642015-07-08 22:39:35247 /*max_disabled_reasons=*/3,
248 /*threshold_timeouts_with_open_streams=*/2,
249 /*threshold_pulic_resets_post_handshake=*/2,
rchc7433572015-02-27 18:16:51250 /*receive_buffer_size=*/0,
jri2b966f22014-09-02 22:25:36251 QuicTagVector()),
[email protected]bf4ea2f2014-03-10 22:57:53252 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
[email protected]9dd3ff0f2014-03-26 09:51:28253 is_https_(false),
[email protected]314b03992014-04-01 01:28:53254 privacy_mode_(PRIVACY_MODE_DISABLED) {
[email protected]11c05872013-08-20 02:04:12255 factory_.set_require_confirmation(false);
[email protected]ca4e0d92014-08-22 16:33:22256 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
rtenneti14abd312015-02-06 21:56:01257 QuicStreamFactoryPeer::SetEnableConnectionRacing(
258 &factory_, GetParam().enable_connection_racing);
[email protected]e13201d82012-12-12 05:00:32259 }
260
bnccb7ff3c2015-05-21 20:51:55261 bool HasActiveSession(const HostPortPair& host_port_pair) {
262 return QuicStreamFactoryPeer::HasActiveSession(&factory_, host_port_pair,
263 /*is_https_=*/false);
264 }
265
266 scoped_ptr<QuicHttpStream> CreateFromSession(
267 const HostPortPair& host_port_pair) {
268 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
269 &factory_, host_port_pair, /*is_https=*/false);
270 return QuicStreamFactoryPeer::CreateFromSession(&factory_, session);
[email protected]df157d9d2014-03-10 07:27:27271 }
[email protected]e13201d82012-12-12 05:00:32272
[email protected]bf4ea2f2014-03-10 22:57:53273 int GetSourcePortForNewSession(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10274 return GetSourcePortForNewSessionInner(destination, false);
275 }
276
277 int GetSourcePortForNewSessionAndGoAway(
[email protected]bf4ea2f2014-03-10 22:57:53278 const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10279 return GetSourcePortForNewSessionInner(destination, true);
280 }
281
[email protected]bf4ea2f2014-03-10 22:57:53282 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
[email protected]d8e2abf82014-03-06 10:30:10283 bool goaway_received) {
[email protected]3c772402013-12-18 21:38:11284 // Should only be called if there is no active session for this destination.
bnccb7ff3c2015-05-21 20:51:55285 EXPECT_FALSE(HasActiveSession(destination));
[email protected]3c772402013-12-18 21:38:11286 size_t socket_count = socket_factory_.udp_client_sockets().size();
287
288 MockRead reads[] = {
289 MockRead(ASYNC, OK, 0) // EOF
290 };
rtennetibe635732014-10-02 22:51:42291 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]3c772402013-12-18 21:38:11292 socket_data.StopAfter(1);
293 socket_factory_.AddSocketDataProvider(&socket_data);
294
295 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59296 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:48297 request.Request(destination, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50298 /*cert_verify_flags=*/0, destination.host(),
299 "GET", net_log_, callback_.callback()));
[email protected]3c772402013-12-18 21:38:11300
301 EXPECT_EQ(OK, callback_.WaitForResult());
302 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
303 EXPECT_TRUE(stream.get());
304 stream.reset();
305
306 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
[email protected]df157d9d2014-03-10 07:27:27307 &factory_, destination, is_https_);
[email protected]3c772402013-12-18 21:38:11308
309 if (socket_count + 1 != socket_factory_.udp_client_sockets().size()) {
310 EXPECT_TRUE(false);
311 return 0;
312 }
313
314 IPEndPoint endpoint;
315 socket_factory_.
316 udp_client_sockets()[socket_count]->GetLocalAddress(&endpoint);
317 int port = endpoint.port();
[email protected]d8e2abf82014-03-06 10:30:10318 if (goaway_received) {
319 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, "");
320 session->OnGoAway(goaway);
321 }
[email protected]3c772402013-12-18 21:38:11322
323 factory_.OnSessionClosed(session);
bnccb7ff3c2015-05-21 20:51:55324 EXPECT_FALSE(HasActiveSession(destination));
rch37de576c2015-05-17 20:28:17325 EXPECT_TRUE(socket_data.AllReadDataConsumed());
326 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:11327 return port;
328 }
329
[email protected]459a7402014-02-10 12:58:52330 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() {
[email protected]66ae5962014-05-22 11:13:05331 QuicStreamId stream_id = kClientDataStreamId1;
[email protected]51cc1342014-04-18 23:44:37332 return maker_.MakeRstPacket(
333 1, true, stream_id,
rtenneti14abd312015-02-06 21:56:01334 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam().version));
[email protected]459a7402014-02-10 12:58:52335 }
336
bncf8bf0722015-05-19 20:04:13337 static ProofVerifyDetailsChromium DefaultProofVerifyDetails() {
338 // Load a certificate that is valid for www.example.org, mail.example.org,
339 // and mail.example.com.
340 scoped_refptr<X509Certificate> test_cert(
341 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
342 EXPECT_TRUE(test_cert.get());
343 ProofVerifyDetailsChromium verify_details;
344 verify_details.cert_verify_result.verified_cert = test_cert;
345 verify_details.cert_verify_result.is_issued_by_known_root = true;
346 return verify_details;
347 }
348
rtenneti38f5cd52014-10-28 20:28:28349 MockQuicServerInfoFactory quic_server_info_factory_;
[email protected]e13201d82012-12-12 05:00:32350 MockHostResolver host_resolver_;
[email protected]0edce6a2013-05-08 18:02:40351 DeterministicMockClientSocketFactory socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05352 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]9558c5d32012-12-22 00:08:14353 MockRandom random_generator_;
[email protected]872edd9e2013-01-16 08:51:15354 MockClock* clock_; // Owned by factory_.
rtenneti38f5cd52014-10-28 20:28:28355 scoped_refptr<TestTaskRunner> runner_;
rtenneti4b06ae72014-08-26 03:43:43356 QuicTestPacketMaker maker_;
[email protected]59c0bbd2014-03-22 04:08:12357 scoped_ptr<CertVerifier> cert_verifier_;
[email protected]6b8a3c742014-07-25 00:25:35358 scoped_ptr<ChannelIDService> channel_id_service_;
[email protected]080b77932014-08-04 01:22:46359 TransportSecurityState transport_security_state_;
[email protected]e13201d82012-12-12 05:00:32360 QuicStreamFactory factory_;
[email protected]bf4ea2f2014-03-10 22:57:53361 HostPortPair host_port_pair_;
[email protected]6d1b4ed2013-07-10 03:57:54362 bool is_https_;
[email protected]9dd3ff0f2014-03-26 09:51:28363 PrivacyMode privacy_mode_;
[email protected]e13201d82012-12-12 05:00:32364 BoundNetLog net_log_;
365 TestCompletionCallback callback_;
[email protected]e13201d82012-12-12 05:00:32366};
367
rtenneti14abd312015-02-06 21:56:01368INSTANTIATE_TEST_CASE_P(Version,
369 QuicStreamFactoryTest,
370 ::testing::ValuesIn(GetTestParams()));
[email protected]1e960032013-12-20 19:00:20371
[email protected]1e960032013-12-20 19:00:20372TEST_P(QuicStreamFactoryTest, Create) {
[email protected]69dfd1b2013-06-04 22:20:12373 MockRead reads[] = {
[email protected]25c31dc2013-06-05 17:56:04374 MockRead(ASYNC, OK, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:12375 };
rtennetibe635732014-10-02 22:51:42376 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:32377 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]25c31dc2013-06-05 17:56:04378 socket_data.StopAfter(1);
[email protected]e13201d82012-12-12 05:00:32379
380 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59381 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:48382 request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50383 /*cert_verify_flags=*/0, host_port_pair_.host(),
384 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32385
386 EXPECT_EQ(OK, callback_.WaitForResult());
387 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0edce6a2013-05-08 18:02:40388 EXPECT_TRUE(stream.get());
[email protected]e13201d82012-12-12 05:00:32389
390 // Will reset stream 3.
bnccb7ff3c2015-05-21 20:51:55391 stream = CreateFromSession(host_port_pair_);
[email protected]e13201d82012-12-12 05:00:32392 EXPECT_TRUE(stream.get());
393
[email protected]6d1b4ed2013-07-10 03:57:54394 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
395 // in streams on different sessions.
[email protected]e13201d82012-12-12 05:00:32396 QuicStreamRequest request2(&factory_);
rtennetia75df622015-06-21 23:59:50397 EXPECT_EQ(OK,
398 request2.Request(host_port_pair_, is_https_, privacy_mode_,
399 /*cert_verify_flags=*/0, host_port_pair_.host(),
400 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32401 stream = request2.ReleaseStream(); // Will reset stream 5.
402 stream.reset(); // Will reset stream 7.
403
rch37de576c2015-05-17 20:28:17404 EXPECT_TRUE(socket_data.AllReadDataConsumed());
405 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:32406}
407
[email protected]8bd2b812014-03-26 04:01:17408TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
409 MockRead reads[] = {
410 MockRead(ASYNC, OK, 0) // EOF
411 };
rtennetibe635732014-10-02 22:51:42412 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17413 socket_factory_.AddSocketDataProvider(&socket_data);
414 socket_data.StopAfter(1);
415
416 crypto_client_stream_factory_.set_handshake_mode(
417 MockCryptoClientStream::ZERO_RTT);
418 host_resolver_.set_synchronous_mode(true);
419 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
420 "192.168.0.1", "");
421
422 QuicStreamRequest request(&factory_);
bnc68d401dd2015-05-18 20:31:48423 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50424 /*cert_verify_flags=*/0, host_port_pair_.host(),
425 "GET", net_log_, callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17426
427 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
428 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17429 EXPECT_TRUE(socket_data.AllReadDataConsumed());
430 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17431}
432
433TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
434 MockRead reads[] = {
435 MockRead(ASYNC, OK, 0) // EOF
436 };
rtennetibe635732014-10-02 22:51:42437 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17438 socket_factory_.AddSocketDataProvider(&socket_data);
439 socket_data.StopAfter(1);
440
441 crypto_client_stream_factory_.set_handshake_mode(
442 MockCryptoClientStream::ZERO_RTT);
443 host_resolver_.set_synchronous_mode(true);
444 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
445 "192.168.0.1", "");
446
447 QuicStreamRequest request(&factory_);
448 // Posts require handshake confirmation, so this will return asynchronously.
449 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:48450 request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50451 /*cert_verify_flags=*/0, host_port_pair_.host(),
452 "POST", net_log_, callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17453
454 // Confirm the handshake and verify that the stream is created.
455 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
456 QuicSession::HANDSHAKE_CONFIRMED);
457
458 EXPECT_EQ(OK, callback_.WaitForResult());
459 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
460 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17461 EXPECT_TRUE(socket_data.AllReadDataConsumed());
462 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17463}
464
bnc68d401dd2015-05-18 20:31:48465TEST_P(QuicStreamFactoryTest, NoZeroRttForDifferentHost) {
466 MockRead reads[] = {
467 MockRead(ASYNC, OK, 0),
468 };
469 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
470 socket_factory_.AddSocketDataProvider(&socket_data);
471 socket_data.StopAfter(1);
472
473 crypto_client_stream_factory_.set_handshake_mode(
474 MockCryptoClientStream::ZERO_RTT);
475 host_resolver_.set_synchronous_mode(true);
476 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
477 "192.168.0.1", "");
478
479 QuicStreamRequest request(&factory_);
rtennetia75df622015-06-21 23:59:50480 int rv = request.Request(
481 host_port_pair_, is_https_, privacy_mode_, /*cert_verify_flags=*/0,
482 "different.host.example.com", "GET", net_log_, callback_.callback());
bnc68d401dd2015-05-18 20:31:48483 // If server and origin have different hostnames, then handshake confirmation
484 // should be required, so Request will return asynchronously.
485 EXPECT_EQ(ERR_IO_PENDING, rv);
486 // Confirm handshake.
487 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
488 QuicSession::HANDSHAKE_CONFIRMED);
489 EXPECT_EQ(OK, callback_.WaitForResult());
490
491 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
492 EXPECT_TRUE(stream.get());
493 EXPECT_TRUE(socket_data.AllReadDataConsumed());
494 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
495}
496
[email protected]df157d9d2014-03-10 07:27:27497TEST_P(QuicStreamFactoryTest, CreateHttpVsHttps) {
498 MockRead reads[] = {
499 MockRead(ASYNC, OK, 0) // EOF
500 };
rtennetibe635732014-10-02 22:51:42501 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
502 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]df157d9d2014-03-10 07:27:27503 socket_factory_.AddSocketDataProvider(&socket_data1);
504 socket_factory_.AddSocketDataProvider(&socket_data2);
505 socket_data1.StopAfter(1);
506 socket_data2.StopAfter(1);
507
508 QuicStreamRequest request(&factory_);
509 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:48510 request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50511 /*cert_verify_flags=*/0, host_port_pair_.host(),
512 "GET", net_log_, callback_.callback()));
[email protected]df157d9d2014-03-10 07:27:27513
514 EXPECT_EQ(OK, callback_.WaitForResult());
515 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
516 EXPECT_TRUE(stream.get());
517
518 QuicStreamRequest request2(&factory_);
519 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:48520 request2.Request(host_port_pair_, !is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50521 /*cert_verify_flags=*/0, host_port_pair_.host(),
522 "GET", net_log_, callback_.callback()));
[email protected]df157d9d2014-03-10 07:27:27523 EXPECT_EQ(OK, callback_.WaitForResult());
524 stream = request2.ReleaseStream();
525 EXPECT_TRUE(stream.get());
526 stream.reset();
527
528 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53529 &factory_, host_port_pair_, is_https_),
[email protected]df157d9d2014-03-10 07:27:27530 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53531 &factory_, host_port_pair_, !is_https_));
[email protected]df157d9d2014-03-10 07:27:27532
rch37de576c2015-05-17 20:28:17533 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
534 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
535 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
536 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]df157d9d2014-03-10 07:27:27537}
538
[email protected]5db452202014-08-19 05:22:15539TEST_P(QuicStreamFactoryTest, Pooling) {
[email protected]eed749f92013-12-23 18:57:38540 MockRead reads[] = {
541 MockRead(ASYNC, OK, 0) // EOF
542 };
rtennetibe635732014-10-02 22:51:42543 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38544 socket_factory_.AddSocketDataProvider(&socket_data);
545 socket_data.StopAfter(1);
546
[email protected]bf4ea2f2014-03-10 22:57:53547 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38548 host_resolver_.set_synchronous_mode(true);
549 host_resolver_.rules()->AddIPLiteralRule(
550 kDefaultServerHostName, "192.168.0.1", "");
551 host_resolver_.rules()->AddIPLiteralRule(
552 "mail.google.com", "192.168.0.1", "");
553
554 QuicStreamRequest request(&factory_);
bnc68d401dd2015-05-18 20:31:48555 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50556 /*cert_verify_flags=*/0, host_port_pair_.host(),
557 "GET", net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38558 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
559 EXPECT_TRUE(stream.get());
560
561 TestCompletionCallback callback;
562 QuicStreamRequest request2(&factory_);
rtennetia75df622015-06-21 23:59:50563 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
564 /*cert_verify_flags=*/0, server2.host(), "GET",
565 net_log_, callback.callback()));
[email protected]eed749f92013-12-23 18:57:38566 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
567 EXPECT_TRUE(stream2.get());
568
569 EXPECT_EQ(
[email protected]df157d9d2014-03-10 07:27:27570 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53571 &factory_, host_port_pair_, is_https_),
[email protected]df157d9d2014-03-10 07:27:27572 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38573
rch37de576c2015-05-17 20:28:17574 EXPECT_TRUE(socket_data.AllReadDataConsumed());
575 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38576}
577
jri584002d12014-09-09 00:51:28578TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) {
579 MockRead reads[] = {
580 MockRead(ASYNC, OK, 0) // EOF
581 };
rtennetibe635732014-10-02 22:51:42582 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
583 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28584 socket_factory_.AddSocketDataProvider(&socket_data1);
585 socket_factory_.AddSocketDataProvider(&socket_data2);
586 socket_data1.StopAfter(1);
587 socket_data2.StopAfter(1);
588
589 HostPortPair server2("mail.google.com", kDefaultServerPort);
590 host_resolver_.set_synchronous_mode(true);
591 host_resolver_.rules()->AddIPLiteralRule(
592 kDefaultServerHostName, "192.168.0.1", "");
593 host_resolver_.rules()->AddIPLiteralRule(
594 "mail.google.com", "192.168.0.1", "");
595
596 // Disable connection pooling.
597 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
598
599 QuicStreamRequest request(&factory_);
bnc68d401dd2015-05-18 20:31:48600 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50601 /*cert_verify_flags=*/0, host_port_pair_.host(),
602 "GET", net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28603 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
604 EXPECT_TRUE(stream.get());
605
606 TestCompletionCallback callback;
607 QuicStreamRequest request2(&factory_);
rtennetia75df622015-06-21 23:59:50608 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
609 /*cert_verify_flags=*/0, server2.host(), "GET",
610 net_log_, callback.callback()));
jri584002d12014-09-09 00:51:28611 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
612 EXPECT_TRUE(stream2.get());
613
614 EXPECT_NE(
615 QuicStreamFactoryPeer::GetActiveSession(
616 &factory_, host_port_pair_, is_https_),
617 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_));
618
rch37de576c2015-05-17 20:28:17619 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
620 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
621 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
622 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28623}
624
[email protected]eed749f92013-12-23 18:57:38625TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
626 MockRead reads[] = {
627 MockRead(ASYNC, OK, 0) // EOF
628 };
rtennetibe635732014-10-02 22:51:42629 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
630 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38631 socket_factory_.AddSocketDataProvider(&socket_data1);
632 socket_factory_.AddSocketDataProvider(&socket_data2);
633 socket_data1.StopAfter(1);
634 socket_data2.StopAfter(1);
635
[email protected]bf4ea2f2014-03-10 22:57:53636 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38637 host_resolver_.set_synchronous_mode(true);
638 host_resolver_.rules()->AddIPLiteralRule(
639 kDefaultServerHostName, "192.168.0.1", "");
640 host_resolver_.rules()->AddIPLiteralRule(
641 "mail.google.com", "192.168.0.1", "");
642
643 QuicStreamRequest request(&factory_);
bnc68d401dd2015-05-18 20:31:48644 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50645 /*cert_verify_flags=*/0, host_port_pair_.host(),
646 "GET", net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38647 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
648 EXPECT_TRUE(stream.get());
649
650 TestCompletionCallback callback;
651 QuicStreamRequest request2(&factory_);
rtennetia75df622015-06-21 23:59:50652 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
653 /*cert_verify_flags=*/0, server2.host(), "GET",
654 net_log_, callback.callback()));
[email protected]eed749f92013-12-23 18:57:38655 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
656 EXPECT_TRUE(stream2.get());
657
[email protected]df157d9d2014-03-10 07:27:27658 factory_.OnSessionGoingAway(QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53659 &factory_, host_port_pair_, is_https_));
[email protected]df157d9d2014-03-10 07:27:27660 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53661 &factory_, host_port_pair_, is_https_));
[email protected]df157d9d2014-03-10 07:27:27662 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
663 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38664
665 TestCompletionCallback callback3;
666 QuicStreamRequest request3(&factory_);
rtennetia75df622015-06-21 23:59:50667 EXPECT_EQ(OK, request3.Request(server2, is_https_, privacy_mode_,
668 /*cert_verify_flags=*/0, server2.host(), "GET",
669 net_log_, callback3.callback()));
[email protected]eed749f92013-12-23 18:57:38670 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
671 EXPECT_TRUE(stream3.get());
672
[email protected]df157d9d2014-03-10 07:27:27673 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(
674 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38675
rch37de576c2015-05-17 20:28:17676 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
677 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
678 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
679 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38680}
681
[email protected]5db452202014-08-19 05:22:15682TEST_P(QuicStreamFactoryTest, HttpsPooling) {
[email protected]eed749f92013-12-23 18:57:38683 MockRead reads[] = {
684 MockRead(ASYNC, OK, 0) // EOF
685 };
rtennetibe635732014-10-02 22:51:42686 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38687 socket_factory_.AddSocketDataProvider(&socket_data);
688 socket_data.StopAfter(1);
689
[email protected]bf4ea2f2014-03-10 22:57:53690 HostPortPair server1("www.example.org", 443);
691 HostPortPair server2("mail.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38692
bncf8bf0722015-05-19 20:04:13693 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01694 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38695
696 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53697 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
698 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38699
700 QuicStreamRequest request(&factory_);
701 is_https_ = true;
rtennetia75df622015-06-21 23:59:50702 EXPECT_EQ(OK, request.Request(server1, is_https_, privacy_mode_,
703 /*cert_verify_flags=*/0, server1.host(), "GET",
704 net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38705 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
706 EXPECT_TRUE(stream.get());
707
708 TestCompletionCallback callback;
709 QuicStreamRequest request2(&factory_);
rtennetia75df622015-06-21 23:59:50710 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
711 /*cert_verify_flags=*/0, server2.host(), "GET",
712 net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38713 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
714 EXPECT_TRUE(stream2.get());
715
[email protected]df157d9d2014-03-10 07:27:27716 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
717 &factory_, server1, is_https_),
718 QuicStreamFactoryPeer::GetActiveSession(
719 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38720
rch37de576c2015-05-17 20:28:17721 EXPECT_TRUE(socket_data.AllReadDataConsumed());
722 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38723}
724
jri584002d12014-09-09 00:51:28725TEST_P(QuicStreamFactoryTest, NoHttpsPoolingIfDisabled) {
726 MockRead reads[] = {
727 MockRead(ASYNC, OK, 0) // EOF
728 };
rtennetibe635732014-10-02 22:51:42729 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
730 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28731 socket_factory_.AddSocketDataProvider(&socket_data1);
732 socket_factory_.AddSocketDataProvider(&socket_data2);
733 socket_data1.StopAfter(1);
734 socket_data2.StopAfter(1);
735
736 HostPortPair server1("www.example.org", 443);
737 HostPortPair server2("mail.example.org", 443);
738
bncf8bf0722015-05-19 20:04:13739 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01740 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28741
742 host_resolver_.set_synchronous_mode(true);
743 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
744 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
745
746 // Disable connection pooling.
747 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
748
749 QuicStreamRequest request(&factory_);
750 is_https_ = true;
rtennetia75df622015-06-21 23:59:50751 EXPECT_EQ(OK, request.Request(server1, is_https_, privacy_mode_,
752 /*cert_verify_flags=*/0, server1.host(), "GET",
753 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28754 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
755 EXPECT_TRUE(stream.get());
756
757 TestCompletionCallback callback;
758 QuicStreamRequest request2(&factory_);
rtennetia75df622015-06-21 23:59:50759 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
760 /*cert_verify_flags=*/0, server2.host(), "GET",
761 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28762 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
763 EXPECT_TRUE(stream2.get());
764
765 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
766 &factory_, server1, is_https_),
767 QuicStreamFactoryPeer::GetActiveSession(
768 &factory_, server2, is_https_));
769
rch37de576c2015-05-17 20:28:17770 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
771 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
772 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
773 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28774}
775
bnccb7ff3c2015-05-21 20:51:55776class QuicAlternativeServiceCertificateValidationPooling
777 : public QuicStreamFactoryTest {
778 public:
779 void Run(bool valid) {
780 MockRead reads[] = {
781 MockRead(ASYNC, OK, 0) // EOF
782 };
783 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
784 socket_factory_.AddSocketDataProvider(&socket_data1);
785 socket_data1.StopAfter(1);
[email protected]eed749f92013-12-23 18:57:38786
bnccb7ff3c2015-05-21 20:51:55787 HostPortPair server1("www.example.org", 443);
788 HostPortPair server2("mail.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38789
bnccb7ff3c2015-05-21 20:51:55790 std::string origin_host(valid ? "mail.example.org" : "invalid.example.org");
791 HostPortPair alternative("www.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38792
bnccb7ff3c2015-05-21 20:51:55793 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
794 bool common_name_fallback_used;
795 EXPECT_EQ(valid,
796 verify_details.cert_verify_result.verified_cert->VerifyNameMatch(
797 origin_host, &common_name_fallback_used));
798 EXPECT_TRUE(
799 verify_details.cert_verify_result.verified_cert->VerifyNameMatch(
800 alternative.host(), &common_name_fallback_used));
801 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38802
bnccb7ff3c2015-05-21 20:51:55803 host_resolver_.set_synchronous_mode(true);
804 host_resolver_.rules()->AddIPLiteralRule(alternative.host(), "192.168.0.1",
805 "");
[email protected]eed749f92013-12-23 18:57:38806
bnccb7ff3c2015-05-21 20:51:55807 // Open first stream to alternative.
808 QuicStreamRequest request1(&factory_);
809 is_https_ = true;
810 EXPECT_EQ(OK, request1.Request(alternative, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50811 /*cert_verify_flags=*/0, alternative.host(),
812 "GET", net_log_, callback_.callback()));
bnccb7ff3c2015-05-21 20:51:55813 scoped_ptr<QuicHttpStream> stream1 = request1.ReleaseStream();
814 EXPECT_TRUE(stream1.get());
[email protected]eed749f92013-12-23 18:57:38815
bnccb7ff3c2015-05-21 20:51:55816 QuicStreamRequest request2(&factory_);
rtennetia75df622015-06-21 23:59:50817 int rv = request2.Request(alternative, is_https_, privacy_mode_,
818 /*cert_verify_flags=*/0, origin_host, "GET",
819 net_log_, callback_.callback());
bnccb7ff3c2015-05-21 20:51:55820 if (valid) {
821 // Alternative service of origin to |alternative| should pool to session
822 // of |stream1| even if origin is different. Since only one
823 // SocketDataProvider is set up, the second request succeeding means that
824 // it pooled to the session opened by the first one.
825 EXPECT_EQ(OK, rv);
826 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
827 EXPECT_TRUE(stream2.get());
828 } else {
829 EXPECT_EQ(ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN, rv);
830 }
[email protected]eed749f92013-12-23 18:57:38831
bnccb7ff3c2015-05-21 20:51:55832 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
833 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
834 }
835};
836
837INSTANTIATE_TEST_CASE_P(Version,
838 QuicAlternativeServiceCertificateValidationPooling,
839 ::testing::ValuesIn(GetTestParams()));
840
841TEST_P(QuicAlternativeServiceCertificateValidationPooling, Valid) {
842 Run(true);
843}
844
845TEST_P(QuicAlternativeServiceCertificateValidationPooling, Invalid) {
846 Run(false);
[email protected]eed749f92013-12-23 18:57:38847}
848
[email protected]5db452202014-08-19 05:22:15849TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
850 MockRead reads[] = {
851 MockRead(ASYNC, OK, 0) // EOF
852 };
rtennetibe635732014-10-02 22:51:42853 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15854 socket_factory_.AddSocketDataProvider(&socket_data);
855 socket_data.StopAfter(1);
856
857 HostPortPair server1("www.example.org", 443);
858 HostPortPair server2("mail.example.org", 443);
859 uint8 primary_pin = 1;
860 uint8 backup_pin = 2;
861 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
862 backup_pin);
863
bncf8bf0722015-05-19 20:04:13864 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
[email protected]5db452202014-08-19 05:22:15865 verify_details.cert_verify_result.public_key_hashes.push_back(
866 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01867 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]5db452202014-08-19 05:22:15868
869 host_resolver_.set_synchronous_mode(true);
870 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
871 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
872
873 QuicStreamRequest request(&factory_);
874 is_https_ = true;
rtennetia75df622015-06-21 23:59:50875 EXPECT_EQ(OK, request.Request(server1, is_https_, privacy_mode_,
876 /*cert_verify_flags=*/0, server1.host(), "GET",
877 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15878 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
879 EXPECT_TRUE(stream.get());
880
881 TestCompletionCallback callback;
882 QuicStreamRequest request2(&factory_);
rtennetia75df622015-06-21 23:59:50883 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
884 /*cert_verify_flags=*/0, server2.host(), "GET",
885 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15886 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
887 EXPECT_TRUE(stream2.get());
888
889 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
890 &factory_, server1, is_https_),
891 QuicStreamFactoryPeer::GetActiveSession(
892 &factory_, server2, is_https_));
893
rch37de576c2015-05-17 20:28:17894 EXPECT_TRUE(socket_data.AllReadDataConsumed());
895 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:15896}
897
jri584002d12014-09-09 00:51:28898TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithMatchingPinsIfDisabled) {
899 MockRead reads[] = {
900 MockRead(ASYNC, OK, 0) // EOF
901 };
rtennetibe635732014-10-02 22:51:42902 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
903 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28904 socket_factory_.AddSocketDataProvider(&socket_data1);
905 socket_factory_.AddSocketDataProvider(&socket_data2);
906 socket_data1.StopAfter(1);
907 socket_data2.StopAfter(1);
908
909 HostPortPair server1("www.example.org", 443);
910 HostPortPair server2("mail.example.org", 443);
911 uint8 primary_pin = 1;
912 uint8 backup_pin = 2;
913 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
914 backup_pin);
915
bncf8bf0722015-05-19 20:04:13916 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
jri584002d12014-09-09 00:51:28917 verify_details.cert_verify_result.public_key_hashes.push_back(
918 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01919 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28920
921 host_resolver_.set_synchronous_mode(true);
922 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
923 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
924
925 // Disable connection pooling.
926 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
927
928 QuicStreamRequest request(&factory_);
929 is_https_ = true;
rtennetia75df622015-06-21 23:59:50930 EXPECT_EQ(OK, request.Request(server1, is_https_, privacy_mode_,
931 /*cert_verify_flags=*/0, server1.host(), "GET",
932 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28933 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
934 EXPECT_TRUE(stream.get());
935
936 TestCompletionCallback callback;
937 QuicStreamRequest request2(&factory_);
rtennetia75df622015-06-21 23:59:50938 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
939 /*cert_verify_flags=*/0, server2.host(), "GET",
940 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28941 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
942 EXPECT_TRUE(stream2.get());
943
944 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
945 &factory_, server1, is_https_),
946 QuicStreamFactoryPeer::GetActiveSession(
947 &factory_, server2, is_https_));
948
rch37de576c2015-05-17 20:28:17949 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
950 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
951 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
952 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28953}
954
[email protected]5db452202014-08-19 05:22:15955TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
956 MockRead reads[] = {
957 MockRead(ASYNC, OK, 0) // EOF
958 };
rtennetibe635732014-10-02 22:51:42959 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
960 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15961 socket_factory_.AddSocketDataProvider(&socket_data1);
962 socket_factory_.AddSocketDataProvider(&socket_data2);
963 socket_data1.StopAfter(1);
964 socket_data2.StopAfter(1);
965
966 HostPortPair server1("www.example.org", 443);
967 HostPortPair server2("mail.example.org", 443);
968 uint8 primary_pin = 1;
969 uint8 backup_pin = 2;
970 uint8 bad_pin = 3;
971 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
972 backup_pin);
973
bncf8bf0722015-05-19 20:04:13974 ProofVerifyDetailsChromium verify_details1 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01975 verify_details1.cert_verify_result.public_key_hashes.push_back(
976 test::GetTestHashValue(bad_pin));
977 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
978
bncf8bf0722015-05-19 20:04:13979 ProofVerifyDetailsChromium verify_details2 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01980 verify_details2.cert_verify_result.public_key_hashes.push_back(
981 test::GetTestHashValue(primary_pin));
982 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
[email protected]5db452202014-08-19 05:22:15983
984 host_resolver_.set_synchronous_mode(true);
985 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
986 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
987
988 QuicStreamRequest request(&factory_);
989 is_https_ = true;
rtennetia75df622015-06-21 23:59:50990 EXPECT_EQ(OK, request.Request(server1, is_https_, privacy_mode_,
991 /*cert_verify_flags=*/0, server1.host(), "GET",
992 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15993 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
994 EXPECT_TRUE(stream.get());
995
996 TestCompletionCallback callback;
997 QuicStreamRequest request2(&factory_);
rtennetia75df622015-06-21 23:59:50998 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
999 /*cert_verify_flags=*/0, server2.host(), "GET",
1000 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:151001 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1002 EXPECT_TRUE(stream2.get());
1003
1004 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
1005 &factory_, server1, is_https_),
1006 QuicStreamFactoryPeer::GetActiveSession(
1007 &factory_, server2, is_https_));
1008
rch37de576c2015-05-17 20:28:171009 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1010 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1011 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1012 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:151013}
1014
[email protected]1e960032013-12-20 19:00:201015TEST_P(QuicStreamFactoryTest, Goaway) {
[email protected]4d283b32013-10-17 12:57:271016 MockRead reads[] = {
1017 MockRead(ASYNC, OK, 0) // EOF
1018 };
rtennetibe635732014-10-02 22:51:421019 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271020 socket_data.StopAfter(1);
1021 socket_factory_.AddSocketDataProvider(&socket_data);
rtennetibe635732014-10-02 22:51:421022 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271023 socket_data2.StopAfter(1);
1024 socket_factory_.AddSocketDataProvider(&socket_data2);
1025
1026 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591027 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481028 request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501029 /*cert_verify_flags=*/0, host_port_pair_.host(),
1030 "GET", net_log_, callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271031
1032 EXPECT_EQ(OK, callback_.WaitForResult());
1033 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1034 EXPECT_TRUE(stream.get());
1035
1036 // Mark the session as going away. Ensure that while it is still alive
1037 // that it is no longer active.
1038 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:531039 &factory_, host_port_pair_, is_https_);
[email protected]4d283b32013-10-17 12:57:271040 factory_.OnSessionGoingAway(session);
1041 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
[email protected]df157d9d2014-03-10 07:27:271042 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:531043 &factory_, host_port_pair_, is_https_));
bnccb7ff3c2015-05-21 20:51:551044 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]4d283b32013-10-17 12:57:271045
1046 // Create a new request for the same destination and verify that a
1047 // new session is created.
1048 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591049 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481050 request2.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501051 /*cert_verify_flags=*/0, host_port_pair_.host(),
1052 "GET", net_log_, callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271053 EXPECT_EQ(OK, callback_.WaitForResult());
1054 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1055 EXPECT_TRUE(stream2.get());
1056
1057 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(&factory_,
[email protected]bf4ea2f2014-03-10 22:57:531058 host_port_pair_,
[email protected]df157d9d2014-03-10 07:27:271059 is_https_));
[email protected]4d283b32013-10-17 12:57:271060 EXPECT_NE(session,
1061 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:531062 &factory_, host_port_pair_, is_https_));
[email protected]4d283b32013-10-17 12:57:271063 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
1064
1065 stream2.reset();
1066 stream.reset();
1067
rch37de576c2015-05-17 20:28:171068 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1069 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1070 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1071 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]4d283b32013-10-17 12:57:271072}
1073
[email protected]1e960032013-12-20 19:00:201074TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
[email protected]0b2294d32013-08-02 00:46:361075 MockRead reads[] = {
1076 MockRead(ASYNC, OK, 0) // EOF
1077 };
[email protected]66ae5962014-05-22 11:13:051078 QuicStreamId stream_id = kClientDataStreamId1;
[email protected]1e960032013-12-20 19:00:201079 scoped_ptr<QuicEncryptedPacket> rst(
1080 maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
[email protected]06ff5152013-08-29 01:03:051081 MockWrite writes[] = {
1082 MockWrite(ASYNC, rst->data(), rst->length(), 1),
1083 };
1084 DeterministicSocketData socket_data(reads, arraysize(reads),
1085 writes, arraysize(writes));
[email protected]0b2294d32013-08-02 00:46:361086 socket_factory_.AddSocketDataProvider(&socket_data);
1087 socket_data.StopAfter(1);
1088
1089 HttpRequestInfo request_info;
1090 std::vector<QuicHttpStream*> streams;
1091 // The MockCryptoClientStream sets max_open_streams to be
rtenneti6a4cf3b2015-01-09 03:41:151092 // kDefaultMaxStreamsPerConnection / 2.
1093 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection / 2; i++) {
[email protected]0b2294d32013-08-02 00:46:361094 QuicStreamRequest request(&factory_);
bnc68d401dd2015-05-18 20:31:481095 int rv = request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501096 /*cert_verify_flags=*/0, host_port_pair_.host(),
1097 "GET", net_log_, callback_.callback());
[email protected]0b2294d32013-08-02 00:46:361098 if (i == 0) {
1099 EXPECT_EQ(ERR_IO_PENDING, rv);
1100 EXPECT_EQ(OK, callback_.WaitForResult());
1101 } else {
1102 EXPECT_EQ(OK, rv);
1103 }
1104 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1105 EXPECT_TRUE(stream);
1106 EXPECT_EQ(OK, stream->InitializeStream(
1107 &request_info, DEFAULT_PRIORITY, net_log_, CompletionCallback()));
1108 streams.push_back(stream.release());
1109 }
1110
1111 QuicStreamRequest request(&factory_);
bnc68d401dd2015-05-18 20:31:481112 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501113 /*cert_verify_flags=*/0, host_port_pair_.host(),
1114 "GET", net_log_, CompletionCallback()));
[email protected]0b2294d32013-08-02 00:46:361115 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1116 EXPECT_TRUE(stream);
1117 EXPECT_EQ(ERR_IO_PENDING, stream->InitializeStream(
1118 &request_info, DEFAULT_PRIORITY, net_log_, callback_.callback()));
1119
1120 // Close the first stream.
1121 streams.front()->Close(false);
1122
1123 ASSERT_TRUE(callback_.have_result());
1124
1125 EXPECT_EQ(OK, callback_.WaitForResult());
1126
rch37de576c2015-05-17 20:28:171127 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1128 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]0b2294d32013-08-02 00:46:361129 STLDeleteElements(&streams);
1130}
1131
[email protected]1e960032013-12-20 19:00:201132TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
rtennetibe635732014-10-02 22:51:421133 DeterministicSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321134 socket_factory_.AddSocketDataProvider(&socket_data);
1135
[email protected]3c772402013-12-18 21:38:111136 host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName);
[email protected]e13201d82012-12-12 05:00:321137
1138 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591139 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481140 request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501141 /*cert_verify_flags=*/0, host_port_pair_.host(),
1142 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321143
1144 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
1145
rch37de576c2015-05-17 20:28:171146 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1147 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321148}
1149
[email protected]1e960032013-12-20 19:00:201150TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
[email protected]3c772402013-12-18 21:38:111151 MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
rtennetibe635732014-10-02 22:51:421152 DeterministicSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]3c772402013-12-18 21:38:111153 socket_data.set_connect_data(connect);
1154 socket_factory_.AddSocketDataProvider(&socket_data);
1155 socket_data.StopAfter(1);
1156
1157 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591158 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481159 request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501160 /*cert_verify_flags=*/0, host_port_pair_.host(),
1161 "GET", net_log_, callback_.callback()));
[email protected]3c772402013-12-18 21:38:111162
1163 EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult());
1164
rch37de576c2015-05-17 20:28:171165 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1166 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:111167}
1168
[email protected]1e960032013-12-20 19:00:201169TEST_P(QuicStreamFactoryTest, CancelCreate) {
[email protected]69dfd1b2013-06-04 22:20:121170 MockRead reads[] = {
[email protected]25c31dc2013-06-05 17:56:041171 MockRead(ASYNC, OK, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121172 };
rtennetibe635732014-10-02 22:51:421173 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321174 socket_factory_.AddSocketDataProvider(&socket_data);
1175 {
1176 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591177 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481178 request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501179 /*cert_verify_flags=*/0, host_port_pair_.host(),
1180 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321181 }
1182
[email protected]25c31dc2013-06-05 17:56:041183 socket_data.StopAfter(1);
[email protected]e13201d82012-12-12 05:00:321184 base::RunLoop run_loop;
1185 run_loop.RunUntilIdle();
1186
bnccb7ff3c2015-05-21 20:51:551187 scoped_ptr<QuicHttpStream> stream(CreateFromSession(host_port_pair_));
[email protected]e13201d82012-12-12 05:00:321188 EXPECT_TRUE(stream.get());
1189 stream.reset();
1190
rch37de576c2015-05-17 20:28:171191 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1192 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321193}
1194
[email protected]1e960032013-12-20 19:00:201195TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) {
[email protected]3c772402013-12-18 21:38:111196 // Sequentially connect to the default host, then another host, and then the
1197 // default host. Verify that the default host gets a consistent ephemeral
1198 // port, that is different from the other host's connection.
1199
1200 std::string other_server_name = "other.google.com";
1201 EXPECT_NE(kDefaultServerHostName, other_server_name);
1202 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort);
[email protected]3c772402013-12-18 21:38:111203
[email protected]bf4ea2f2014-03-10 22:57:531204 int original_port = GetSourcePortForNewSession(host_port_pair_);
1205 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2));
1206 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]3c772402013-12-18 21:38:111207}
1208
[email protected]d8e2abf82014-03-06 10:30:101209TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) {
1210 // Get a session to the host using the port suggester.
1211 int original_port =
[email protected]bf4ea2f2014-03-10 22:57:531212 GetSourcePortForNewSessionAndGoAway(host_port_pair_);
[email protected]d8e2abf82014-03-06 10:30:101213 // Verify that the port is different after the goaway.
[email protected]bf4ea2f2014-03-10 22:57:531214 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101215 // Since the previous session did not goaway we should see the original port.
[email protected]bf4ea2f2014-03-10 22:57:531216 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101217}
1218
[email protected]1e960032013-12-20 19:00:201219TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
[email protected]56dfb902013-01-03 23:17:551220 MockRead reads[] = {
[email protected]0edce6a2013-05-08 18:02:401221 MockRead(ASYNC, 0, 0) // EOF
[email protected]56dfb902013-01-03 23:17:551222 };
[email protected]459a7402014-02-10 12:58:521223 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1224 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311225 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521226 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421227 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521228 writes.size());
[email protected]56dfb902013-01-03 23:17:551229 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0edce6a2013-05-08 18:02:401230 socket_data.StopAfter(1);
[email protected]56dfb902013-01-03 23:17:551231
[email protected]69dfd1b2013-06-04 22:20:121232 MockRead reads2[] = {
[email protected]25c31dc2013-06-05 17:56:041233 MockRead(ASYNC, 0, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121234 };
rtennetibe635732014-10-02 22:51:421235 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]56dfb902013-01-03 23:17:551236 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]0edce6a2013-05-08 18:02:401237 socket_data2.StopAfter(1);
[email protected]56dfb902013-01-03 23:17:551238
1239 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591240 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481241 request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501242 /*cert_verify_flags=*/0, host_port_pair_.host(),
1243 "GET", net_log_, callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551244
1245 EXPECT_EQ(OK, callback_.WaitForResult());
1246 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361247 HttpRequestInfo request_info;
1248 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1249 DEFAULT_PRIORITY,
1250 net_log_, CompletionCallback()));
[email protected]56dfb902013-01-03 23:17:551251
1252 // Close the session and verify that stream saw the error.
1253 factory_.CloseAllSessions(ERR_INTERNET_DISCONNECTED);
1254 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1255 stream->ReadResponseHeaders(callback_.callback()));
1256
1257 // Now attempting to request a stream to the same origin should create
1258 // a new session.
1259
1260 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591261 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481262 request2.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501263 /*cert_verify_flags=*/0, host_port_pair_.host(),
1264 "GET", net_log_, callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551265
1266 EXPECT_EQ(OK, callback_.WaitForResult());
1267 stream = request2.ReleaseStream();
1268 stream.reset(); // Will reset stream 3.
1269
rch37de576c2015-05-17 20:28:171270 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1271 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1272 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1273 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]56dfb902013-01-03 23:17:551274}
1275
[email protected]1e960032013-12-20 19:00:201276TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
[email protected]f698a012013-05-06 20:18:591277 MockRead reads[] = {
[email protected]0edce6a2013-05-08 18:02:401278 MockRead(ASYNC, 0, 0) // EOF
[email protected]f698a012013-05-06 20:18:591279 };
[email protected]459a7402014-02-10 12:58:521280 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1281 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311282 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521283 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421284 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521285 writes.size());
[email protected]f698a012013-05-06 20:18:591286 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0edce6a2013-05-08 18:02:401287 socket_data.StopAfter(1);
[email protected]f698a012013-05-06 20:18:591288
[email protected]69dfd1b2013-06-04 22:20:121289 MockRead reads2[] = {
[email protected]25c31dc2013-06-05 17:56:041290 MockRead(ASYNC, 0, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121291 };
rtennetibe635732014-10-02 22:51:421292 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]f698a012013-05-06 20:18:591293 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]0edce6a2013-05-08 18:02:401294 socket_data2.StopAfter(1);
[email protected]f698a012013-05-06 20:18:591295
1296 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591297 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481298 request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501299 /*cert_verify_flags=*/0, host_port_pair_.host(),
1300 "GET", net_log_, callback_.callback()));
[email protected]f698a012013-05-06 20:18:591301
1302 EXPECT_EQ(OK, callback_.WaitForResult());
1303 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361304 HttpRequestInfo request_info;
1305 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1306 DEFAULT_PRIORITY,
1307 net_log_, CompletionCallback()));
[email protected]f698a012013-05-06 20:18:591308
1309 // Change the IP address and verify that stream saw the error.
1310 factory_.OnIPAddressChanged();
1311 EXPECT_EQ(ERR_NETWORK_CHANGED,
1312 stream->ReadResponseHeaders(callback_.callback()));
[email protected]11c05872013-08-20 02:04:121313 EXPECT_TRUE(factory_.require_confirmation());
[email protected]f698a012013-05-06 20:18:591314
1315 // Now attempting to request a stream to the same origin should create
1316 // a new session.
1317
1318 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591319 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481320 request2.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501321 /*cert_verify_flags=*/0, host_port_pair_.host(),
1322 "GET", net_log_, callback_.callback()));
[email protected]f698a012013-05-06 20:18:591323
1324 EXPECT_EQ(OK, callback_.WaitForResult());
1325 stream = request2.ReleaseStream();
1326 stream.reset(); // Will reset stream 3.
1327
rch37de576c2015-05-17 20:28:171328 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1329 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1330 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1331 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]f698a012013-05-06 20:18:591332}
1333
[email protected]1e960032013-12-20 19:00:201334TEST_P(QuicStreamFactoryTest, OnCertAdded) {
[email protected]d7d1e50b2013-11-25 22:08:091335 MockRead reads[] = {
1336 MockRead(ASYNC, 0, 0) // EOF
1337 };
[email protected]459a7402014-02-10 12:58:521338 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1339 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311340 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521341 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421342 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521343 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:091344 socket_factory_.AddSocketDataProvider(&socket_data);
1345 socket_data.StopAfter(1);
1346
1347 MockRead reads2[] = {
1348 MockRead(ASYNC, 0, 0) // EOF
1349 };
rtennetibe635732014-10-02 22:51:421350 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:091351 socket_factory_.AddSocketDataProvider(&socket_data2);
1352 socket_data2.StopAfter(1);
1353
1354 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591355 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481356 request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501357 /*cert_verify_flags=*/0, host_port_pair_.host(),
1358 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091359
1360 EXPECT_EQ(OK, callback_.WaitForResult());
1361 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1362 HttpRequestInfo request_info;
1363 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1364 DEFAULT_PRIORITY,
1365 net_log_, CompletionCallback()));
1366
1367 // Add a cert and verify that stream saw the event.
rtennetibe635732014-10-02 22:51:421368 factory_.OnCertAdded(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:091369 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1370 stream->ReadResponseHeaders(callback_.callback()));
1371 EXPECT_FALSE(factory_.require_confirmation());
1372
1373 // Now attempting to request a stream to the same origin should create
1374 // a new session.
1375
1376 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591377 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481378 request2.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501379 /*cert_verify_flags=*/0, host_port_pair_.host(),
1380 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091381
1382 EXPECT_EQ(OK, callback_.WaitForResult());
1383 stream = request2.ReleaseStream();
1384 stream.reset(); // Will reset stream 3.
1385
rch37de576c2015-05-17 20:28:171386 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1387 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1388 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1389 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:091390}
1391
[email protected]1e960032013-12-20 19:00:201392TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
[email protected]d7d1e50b2013-11-25 22:08:091393 MockRead reads[] = {
1394 MockRead(ASYNC, 0, 0) // EOF
1395 };
[email protected]459a7402014-02-10 12:58:521396 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1397 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311398 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521399 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421400 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521401 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:091402 socket_factory_.AddSocketDataProvider(&socket_data);
1403 socket_data.StopAfter(1);
1404
1405 MockRead reads2[] = {
1406 MockRead(ASYNC, 0, 0) // EOF
1407 };
rtennetibe635732014-10-02 22:51:421408 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:091409 socket_factory_.AddSocketDataProvider(&socket_data2);
1410 socket_data2.StopAfter(1);
1411
1412 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591413 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481414 request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501415 /*cert_verify_flags=*/0, host_port_pair_.host(),
1416 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091417
1418 EXPECT_EQ(OK, callback_.WaitForResult());
1419 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1420 HttpRequestInfo request_info;
1421 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1422 DEFAULT_PRIORITY,
1423 net_log_, CompletionCallback()));
1424
1425 // Change the CA cert and verify that stream saw the event.
rtennetibe635732014-10-02 22:51:421426 factory_.OnCACertChanged(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:091427 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1428 stream->ReadResponseHeaders(callback_.callback()));
1429 EXPECT_FALSE(factory_.require_confirmation());
1430
1431 // Now attempting to request a stream to the same origin should create
1432 // a new session.
1433
1434 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591435 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481436 request2.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501437 /*cert_verify_flags=*/0, host_port_pair_.host(),
1438 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091439
1440 EXPECT_EQ(OK, callback_.WaitForResult());
1441 stream = request2.ReleaseStream();
1442 stream.reset(); // Will reset stream 3.
1443
rch37de576c2015-05-17 20:28:171444 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1445 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1446 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1447 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:091448}
1449
[email protected]1e960032013-12-20 19:00:201450TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
[email protected]6e12d702013-11-13 00:17:171451 vector<string> cannoncial_suffixes;
1452 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1453 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]c49ff182013-09-28 08:33:261454
[email protected]6e12d702013-11-13 00:17:171455 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1456 string r1_host_name("r1");
1457 string r2_host_name("r2");
1458 r1_host_name.append(cannoncial_suffixes[i]);
1459 r2_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141460
[email protected]bf4ea2f2014-03-10 22:57:531461 HostPortPair host_port_pair1(r1_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121462 QuicCryptoClientConfig* crypto_config =
1463 QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
[email protected]257f24f2014-04-01 09:15:371464 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171465 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371466 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171467 EXPECT_FALSE(cached1->proof_valid());
1468 EXPECT_TRUE(cached1->source_address_token().empty());
1469
1470 // Mutate the cached1 to have different data.
1471 // TODO(rtenneti): mutate other members of CachedState.
1472 cached1->set_source_address_token(r1_host_name);
1473 cached1->SetProofValid();
1474
[email protected]bf4ea2f2014-03-10 22:57:531475 HostPortPair host_port_pair2(r2_host_name, 80);
[email protected]257f24f2014-04-01 09:15:371476 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171477 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371478 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171479 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
1480 EXPECT_TRUE(cached2->proof_valid());
1481 }
[email protected]b70fdb792013-10-25 19:04:141482}
1483
[email protected]1e960032013-12-20 19:00:201484TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
[email protected]6e12d702013-11-13 00:17:171485 vector<string> cannoncial_suffixes;
1486 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1487 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]b70fdb792013-10-25 19:04:141488
[email protected]6e12d702013-11-13 00:17:171489 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1490 string r3_host_name("r3");
1491 string r4_host_name("r4");
1492 r3_host_name.append(cannoncial_suffixes[i]);
1493 r4_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141494
[email protected]bf4ea2f2014-03-10 22:57:531495 HostPortPair host_port_pair1(r3_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121496 QuicCryptoClientConfig* crypto_config =
1497 QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
[email protected]257f24f2014-04-01 09:15:371498 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171499 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371500 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171501 EXPECT_FALSE(cached1->proof_valid());
1502 EXPECT_TRUE(cached1->source_address_token().empty());
1503
1504 // Mutate the cached1 to have different data.
1505 // TODO(rtenneti): mutate other members of CachedState.
1506 cached1->set_source_address_token(r3_host_name);
1507 cached1->SetProofInvalid();
1508
[email protected]bf4ea2f2014-03-10 22:57:531509 HostPortPair host_port_pair2(r4_host_name, 80);
[email protected]257f24f2014-04-01 09:15:371510 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171511 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371512 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171513 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
1514 EXPECT_TRUE(cached2->source_address_token().empty());
1515 EXPECT_FALSE(cached2->proof_valid());
1516 }
[email protected]c49ff182013-09-28 08:33:261517}
1518
rtenneti14abd312015-02-06 21:56:011519TEST_P(QuicStreamFactoryTest, RacingConnections) {
1520 if (!GetParam().enable_connection_racing)
1521 return;
1522 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
1523 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
rtenneti14abd312015-02-06 21:56:011524 MockRead reads[] = {
1525 MockRead(ASYNC, OK, 0) // EOF
1526 };
1527 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1528 socket_factory_.AddSocketDataProvider(&socket_data);
1529 socket_data.StopAfter(1);
1530
1531 MockRead reads2[] = {
1532 MockRead(ASYNC, 0, 0) // EOF
1533 };
1534 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1535 socket_factory_.AddSocketDataProvider(&socket_data2);
1536 socket_data2.StopAfter(1);
1537
1538 crypto_client_stream_factory_.set_handshake_mode(
1539 MockCryptoClientStream::ZERO_RTT);
1540 host_resolver_.set_synchronous_mode(true);
1541 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1542 "192.168.0.1", "");
1543
1544 QuicStreamRequest request(&factory_);
1545 QuicServerId server_id(host_port_pair_, is_https_, privacy_mode_);
1546 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481547 request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501548 /*cert_verify_flags=*/0, host_port_pair_.host(),
1549 "GET", net_log_, callback_.callback()));
rtenneti14abd312015-02-06 21:56:011550 EXPECT_EQ(2u,
1551 QuicStreamFactoryPeer::GetNumberOfActiveJobs(&factory_, server_id));
1552
1553 runner_->RunNextTask();
1554
1555 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1556 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:171557 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1558 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti14abd312015-02-06 21:56:011559 EXPECT_EQ(0u,
1560 QuicStreamFactoryPeer::GetNumberOfActiveJobs(&factory_, server_id));
1561}
1562
rtenneti34dffe752015-02-24 23:27:321563TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) {
1564 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
1565 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
rtenneti34dffe752015-02-24 23:27:321566 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_, true);
1567
1568 MockRead reads[] = {
1569 MockRead(ASYNC, OK, 0) // EOF
1570 };
1571 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1572 socket_factory_.AddSocketDataProvider(&socket_data);
1573 socket_data.StopAfter(1);
1574
1575 crypto_client_stream_factory_.set_handshake_mode(
1576 MockCryptoClientStream::ZERO_RTT);
1577 host_resolver_.set_synchronous_mode(true);
1578 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1579 "192.168.0.1", "");
1580
1581 QuicStreamRequest request(&factory_);
1582 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501583 /*cert_verify_flags=*/0, host_port_pair_.host(),
1584 "GET", net_log_, callback_.callback()));
rtenneti34dffe752015-02-24 23:27:321585
1586 // If we are waiting for disk cache, we would have posted a task. Verify that
1587 // the CancelWaitForDataReady task hasn't been posted.
1588 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
1589
1590 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1591 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:171592 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1593 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti34dffe752015-02-24 23:27:321594}
1595
rtenneti85dcfac22015-03-27 20:22:191596TEST_P(QuicStreamFactoryTest, BadPacketLoss) {
1597 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
1598 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
1599 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_, true);
1600 QuicStreamFactoryPeer::SetMaxNumberOfLossyConnections(&factory_, 2);
1601 EXPECT_FALSE(
1602 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
1603 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1604 &factory_, host_port_pair_.port()));
1605
1606 MockRead reads[] = {
1607 MockRead(ASYNC, OK, 0) // EOF
1608 };
1609 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1610 socket_factory_.AddSocketDataProvider(&socket_data);
1611 socket_data.StopAfter(1);
1612
rtenneti97137a92015-06-18 06:00:311613 DeterministicSocketData socket_data2(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:191614 socket_factory_.AddSocketDataProvider(&socket_data2);
1615 socket_data2.StopAfter(1);
1616
rtenneti97137a92015-06-18 06:00:311617 DeterministicSocketData socket_data3(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:191618 socket_factory_.AddSocketDataProvider(&socket_data3);
1619 socket_data3.StopAfter(1);
1620
rtenneti97137a92015-06-18 06:00:311621 DeterministicSocketData socket_data4(nullptr, 0, nullptr, 0);
1622 socket_factory_.AddSocketDataProvider(&socket_data4);
1623 socket_data4.StopAfter(1);
1624
rtenneti85dcfac22015-03-27 20:22:191625 HostPortPair server2("mail.example.org", kDefaultServerPort);
1626 HostPortPair server3("docs.example.org", kDefaultServerPort);
rtenneti97137a92015-06-18 06:00:311627 HostPortPair server4("images.example.org", kDefaultServerPort);
rtenneti85dcfac22015-03-27 20:22:191628
1629 crypto_client_stream_factory_.set_handshake_mode(
1630 MockCryptoClientStream::ZERO_RTT);
1631 host_resolver_.set_synchronous_mode(true);
1632 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1633 "192.168.0.1", "");
1634 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1635 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
rtenneti97137a92015-06-18 06:00:311636 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
rtenneti85dcfac22015-03-27 20:22:191637
1638 QuicStreamRequest request(&factory_);
1639 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501640 /*cert_verify_flags=*/0, host_port_pair_.host(),
1641 "GET", net_log_, callback_.callback()));
rtenneti85dcfac22015-03-27 20:22:191642
1643 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
1644 &factory_, host_port_pair_, is_https_);
1645
1646 DVLOG(1) << "Create 1st session and test packet loss";
1647
1648 // Set packet_loss_rate to a lower value than packet_loss_threshold.
1649 EXPECT_FALSE(
1650 factory_.OnHandshakeConfirmed(session, /*packet_loss_rate=*/0.9f));
rtenneti41633b1f2015-04-05 18:19:531651 EXPECT_TRUE(session->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:191652 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(
1653 &factory_, host_port_pair_, is_https_));
1654 EXPECT_FALSE(
1655 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
1656 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1657 &factory_, host_port_pair_.port()));
1658
1659 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:311660 // and that shouldn't close the session and it shouldn't disable QUIC.
1661 EXPECT_FALSE(
rtenneti85dcfac22015-03-27 20:22:191662 factory_.OnHandshakeConfirmed(session, /*packet_loss_rate=*/1.0f));
1663 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1664 &factory_, host_port_pair_.port()));
rtenneti97137a92015-06-18 06:00:311665 EXPECT_TRUE(session->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:191666 EXPECT_FALSE(
1667 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
rtenneti97137a92015-06-18 06:00:311668 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(
rtenneti85dcfac22015-03-27 20:22:191669 &factory_, host_port_pair_, is_https_));
rtenneti85dcfac22015-03-27 20:22:191670
1671 // Test N-in-a-row high packet loss connections.
1672
1673 DVLOG(1) << "Create 2nd session and test packet loss";
1674
1675 TestCompletionCallback callback2;
1676 QuicStreamRequest request2(&factory_);
rtennetia75df622015-06-21 23:59:501677 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
1678 /*cert_verify_flags=*/0, server2.host(), "GET",
1679 net_log_, callback2.callback()));
rtenneti85dcfac22015-03-27 20:22:191680 QuicClientSession* session2 =
1681 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_);
1682
1683 // If there is no packet loss during handshake confirmation, number of lossy
1684 // connections for the port should be 0.
1685 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1686 &factory_, server2.port()));
1687 EXPECT_FALSE(
1688 factory_.OnHandshakeConfirmed(session2, /*packet_loss_rate=*/0.9f));
1689 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1690 &factory_, server2.port()));
1691 EXPECT_FALSE(
1692 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, server2.port()));
1693
1694 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:311695 // and that shouldn't close the session and it shouldn't disable QUIC.
1696 EXPECT_FALSE(
rtenneti85dcfac22015-03-27 20:22:191697 factory_.OnHandshakeConfirmed(session2, /*packet_loss_rate=*/1.0f));
1698 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1699 &factory_, server2.port()));
rtenneti97137a92015-06-18 06:00:311700 EXPECT_TRUE(session2->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:191701 EXPECT_FALSE(
1702 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, server2.port()));
rtenneti97137a92015-06-18 06:00:311703 EXPECT_TRUE(
rtenneti85dcfac22015-03-27 20:22:191704 QuicStreamFactoryPeer::HasActiveSession(&factory_, server2, is_https_));
rtenneti85dcfac22015-03-27 20:22:191705
1706 DVLOG(1) << "Create 3rd session which also has packet loss";
1707
1708 TestCompletionCallback callback3;
1709 QuicStreamRequest request3(&factory_);
rtennetia75df622015-06-21 23:59:501710 EXPECT_EQ(OK, request3.Request(server3, is_https_, privacy_mode_,
1711 /*cert_verify_flags=*/0, server3.host(), "GET",
1712 net_log_, callback3.callback()));
rtenneti85dcfac22015-03-27 20:22:191713 QuicClientSession* session3 =
1714 QuicStreamFactoryPeer::GetActiveSession(&factory_, server3, is_https_);
1715
rtenneti97137a92015-06-18 06:00:311716 DVLOG(1) << "Create 4th session with packet loss and test IsQuicDisabled()";
1717 TestCompletionCallback callback4;
1718 QuicStreamRequest request4(&factory_);
rtennetia75df622015-06-21 23:59:501719 EXPECT_EQ(OK, request4.Request(server4, is_https_, privacy_mode_,
1720 /*cert_verify_flags=*/0, server4.host(), "GET",
1721 net_log_, callback4.callback()));
rtenneti97137a92015-06-18 06:00:311722 QuicClientSession* session4 =
1723 QuicStreamFactoryPeer::GetActiveSession(&factory_, server4, is_https_);
1724
rtenneti85dcfac22015-03-27 20:22:191725 // Set packet_loss_rate to higher value than packet_loss_threshold 2nd time in
1726 // a row and that should close the session and disable QUIC.
1727 EXPECT_TRUE(
1728 factory_.OnHandshakeConfirmed(session3, /*packet_loss_rate=*/1.0f));
1729 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1730 &factory_, server3.port()));
rtenneti97137a92015-06-18 06:00:311731 EXPECT_FALSE(session3->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:191732 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(&factory_, server3.port()));
1733 EXPECT_FALSE(
1734 QuicStreamFactoryPeer::HasActiveSession(&factory_, server3, is_https_));
bnccb7ff3c2015-05-21 20:51:551735 EXPECT_FALSE(HasActiveSession(server3));
rtenneti85dcfac22015-03-27 20:22:191736
rtenneti97137a92015-06-18 06:00:311737 // Set packet_loss_rate to higher value than packet_loss_threshold 3rd time in
1738 // a row and IsQuicDisabled() should close the session.
1739 EXPECT_TRUE(
1740 factory_.OnHandshakeConfirmed(session4, /*packet_loss_rate=*/1.0f));
1741 EXPECT_EQ(3, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1742 &factory_, server4.port()));
1743 EXPECT_FALSE(session4->connection()->connected());
1744 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(&factory_, server4.port()));
1745 EXPECT_FALSE(
1746 QuicStreamFactoryPeer::HasActiveSession(&factory_, server4, is_https_));
1747 EXPECT_FALSE(HasActiveSession(server4));
1748
rtenneti85dcfac22015-03-27 20:22:191749 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1750 EXPECT_TRUE(stream.get());
1751 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1752 EXPECT_TRUE(stream2.get());
1753 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
1754 EXPECT_TRUE(stream3.get());
rtenneti97137a92015-06-18 06:00:311755 scoped_ptr<QuicHttpStream> stream4 = request4.ReleaseStream();
1756 EXPECT_TRUE(stream4.get());
rch37de576c2015-05-17 20:28:171757 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1758 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1759 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1760 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1761 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
1762 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
rtenneti97137a92015-06-18 06:00:311763 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
1764 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
rtenneti85dcfac22015-03-27 20:22:191765}
1766
ckrasic1e53b642015-07-08 22:39:351767TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfTwo) {
1768 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
1769 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
1770 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_, true);
1771 QuicStreamFactoryPeer::SetThresholdPublicResetsPostHandshake(&factory_, 2);
1772 EXPECT_FALSE(
1773 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
1774 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1775 &factory_, host_port_pair_.port()));
1776
1777 MockRead reads[] = {
1778 MockRead(ASYNC, OK, 0) // EOF
1779 };
1780 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1781 socket_factory_.AddSocketDataProvider(&socket_data);
1782 socket_data.StopAfter(1);
1783
1784 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
1785 socket_factory_.AddSocketDataProvider(&socket_data2);
1786 socket_data2.StopAfter(1);
1787
1788 HostPortPair server2("mail.example.org", kDefaultServerPort);
1789
1790 crypto_client_stream_factory_.set_handshake_mode(
1791 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1792 host_resolver_.set_synchronous_mode(true);
1793 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1794 "192.168.0.1", "");
1795 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1796
1797 QuicStreamRequest request(&factory_);
1798 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
1799 /*cert_verify_flags=*/0, host_port_pair_.host(),
1800 "GET", net_log_, callback_.callback()));
1801
1802 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
1803 &factory_, host_port_pair_, is_https_);
1804
1805 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
1806 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
1807 // Need to spin the loop now to ensure that
1808 // QuicStreamFactory::OnSessionClosed() runs.
1809 base::RunLoop run_loop;
1810 run_loop.RunUntilIdle();
1811
1812 EXPECT_EQ(1,
1813 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_));
1814 EXPECT_FALSE(
1815 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
1816
1817 // Test two-in-a-row public reset post handshakes..
1818 DVLOG(1) << "Create 2nd session and trigger public reset post handshake";
1819 TestCompletionCallback callback2;
1820 QuicStreamRequest request2(&factory_);
1821 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
1822 /*cert_verify_flags=*/0, server2.host(), "GET",
1823 net_log_, callback2.callback()));
1824 QuicClientSession* session2 =
1825 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_);
1826
1827 session2->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
1828 // Need to spin the loop now to ensure that
1829 // QuicStreamFactory::OnSessionClosed() runs.
1830 base::RunLoop run_loop2;
1831 run_loop2.RunUntilIdle();
1832 EXPECT_EQ(2,
1833 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_));
1834 EXPECT_TRUE(
1835 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
1836 EXPECT_EQ(QuicClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
1837 factory_.QuicDisabledReason(host_port_pair_.port()));
1838
1839 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1840 EXPECT_TRUE(stream.get());
1841 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1842 EXPECT_TRUE(stream2.get());
1843 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1844 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1845 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1846 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1847}
1848
1849TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfTwo) {
1850 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
1851 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
1852 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_, true);
1853 QuicStreamFactoryPeer::SetThresholdTimeoutsWithOpenStreams(&factory_, 2);
1854 EXPECT_FALSE(
1855 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
1856 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1857 &factory_, host_port_pair_.port()));
1858
1859 MockRead reads[] = {
1860 MockRead(ASYNC, OK, 0) // EOF
1861 };
1862 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1863 socket_factory_.AddSocketDataProvider(&socket_data);
1864 socket_data.StopAfter(1);
1865
1866 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
1867 socket_factory_.AddSocketDataProvider(&socket_data2);
1868 socket_data2.StopAfter(1);
1869
1870 HostPortPair server2("mail.example.org", kDefaultServerPort);
1871
1872 crypto_client_stream_factory_.set_handshake_mode(
1873 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1874 host_resolver_.set_synchronous_mode(true);
1875 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1876 "192.168.0.1", "");
1877 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1878
1879 QuicStreamRequest request(&factory_);
1880 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
1881 /*cert_verify_flags=*/0, host_port_pair_.host(),
1882 "GET", net_log_, callback_.callback()));
1883
1884 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
1885 &factory_, host_port_pair_, is_https_);
1886
1887 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1888 EXPECT_TRUE(stream.get());
1889 HttpRequestInfo request_info;
1890 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1891 net_log_, CompletionCallback()));
1892
1893 DVLOG(1)
1894 << "Created 1st session and initialized a stream. Now trigger timeout";
1895 session->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
1896 // Need to spin the loop now to ensure that
1897 // QuicStreamFactory::OnSessionClosed() runs.
1898 base::RunLoop run_loop;
1899 run_loop.RunUntilIdle();
1900
1901 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_));
1902 EXPECT_FALSE(
1903 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
1904
1905 // Test two-in-a-row timeouts with open streams.
1906 DVLOG(1) << "Create 2nd session and timeout with open stream";
1907 TestCompletionCallback callback2;
1908 QuicStreamRequest request2(&factory_);
1909 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
1910 /*cert_verify_flags=*/0, server2.host(), "GET",
1911 net_log_, callback2.callback()));
1912 QuicClientSession* session2 =
1913 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_);
1914
1915 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1916 EXPECT_TRUE(stream2.get());
1917 EXPECT_EQ(OK, stream2->InitializeStream(&request_info, DEFAULT_PRIORITY,
1918 net_log_, CompletionCallback()));
1919
1920 session2->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
1921 // Need to spin the loop now to ensure that
1922 // QuicStreamFactory::OnSessionClosed() runs.
1923 base::RunLoop run_loop2;
1924 run_loop2.RunUntilIdle();
1925 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_));
1926 EXPECT_TRUE(
1927 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
1928 EXPECT_EQ(QuicClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
1929 factory_.QuicDisabledReason(host_port_pair_.port()));
1930
1931 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1932 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1933 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1934 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1935}
1936
1937TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfThree) {
1938 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
1939 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
1940 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_, true);
1941 QuicStreamFactoryPeer::SetThresholdPublicResetsPostHandshake(&factory_, 2);
1942 EXPECT_FALSE(
1943 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
1944 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1945 &factory_, host_port_pair_.port()));
1946
1947 MockRead reads[] = {
1948 MockRead(ASYNC, OK, 0) // EOF
1949 };
1950 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1951 socket_factory_.AddSocketDataProvider(&socket_data);
1952 socket_data.StopAfter(1);
1953
1954 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
1955 socket_factory_.AddSocketDataProvider(&socket_data2);
1956 socket_data2.StopAfter(1);
1957
1958 DeterministicSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
1959 socket_factory_.AddSocketDataProvider(&socket_data3);
1960 socket_data3.StopAfter(1);
1961
1962 HostPortPair server2("mail.example.org", kDefaultServerPort);
1963 HostPortPair server3("docs.example.org", kDefaultServerPort);
1964
1965 crypto_client_stream_factory_.set_handshake_mode(
1966 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1967 host_resolver_.set_synchronous_mode(true);
1968 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1969 "192.168.0.1", "");
1970 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1971 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
1972
1973 // Test first and third out of three public reset post handshakes.
1974 QuicStreamRequest request(&factory_);
1975 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
1976 /*cert_verify_flags=*/0, host_port_pair_.host(),
1977 "GET", net_log_, callback_.callback()));
1978
1979 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
1980 &factory_, host_port_pair_, is_https_);
1981
1982 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
1983 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
1984 // Need to spin the loop now to ensure that
1985 // QuicStreamFactory::OnSessionClosed() runs.
1986 base::RunLoop run_loop;
1987 run_loop.RunUntilIdle();
1988
1989 EXPECT_EQ(1,
1990 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_));
1991 EXPECT_FALSE(
1992 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
1993
1994 DVLOG(1) << "Create 2nd session without disable trigger";
1995 TestCompletionCallback callback2;
1996 QuicStreamRequest request2(&factory_);
1997 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
1998 /*cert_verify_flags=*/0, server2.host(), "GET",
1999 net_log_, callback2.callback()));
2000 QuicClientSession* session2 =
2001 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_);
2002
2003 session2->connection()->CloseConnection(QUIC_NO_ERROR, false);
2004 // Need to spin the loop now to ensure that
2005 // QuicStreamFactory::OnSessionClosed() runs.
2006 base::RunLoop run_loop2;
2007 run_loop2.RunUntilIdle();
2008 EXPECT_EQ(1,
2009 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_));
2010 EXPECT_FALSE(
2011 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2012
2013 DVLOG(1) << "Create 3rd session with public reset post handshake,"
2014 << " will disable QUIC";
2015 TestCompletionCallback callback3;
2016 QuicStreamRequest request3(&factory_);
2017 EXPECT_EQ(OK, request3.Request(server3, is_https_, privacy_mode_,
2018 /*cert_verify_flags=*/0, server3.host(), "GET",
2019 net_log_, callback3.callback()));
2020 QuicClientSession* session3 =
2021 QuicStreamFactoryPeer::GetActiveSession(&factory_, server3, is_https_);
2022
2023 session3->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
2024 // Need to spin the loop now to ensure that
2025 // QuicStreamFactory::OnSessionClosed() runs.
2026 base::RunLoop run_loop3;
2027 run_loop3.RunUntilIdle();
2028 EXPECT_EQ(2,
2029 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_));
2030 EXPECT_TRUE(
2031 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2032 EXPECT_EQ(QuicClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
2033 factory_.QuicDisabledReason(host_port_pair_.port()));
2034
2035 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2036 EXPECT_TRUE(stream.get());
2037 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2038 EXPECT_TRUE(stream2.get());
2039 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2040 EXPECT_TRUE(stream3.get());
2041
2042 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2043 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2044 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2045 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2046 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2047 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
2048}
2049
2050TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfThree) {
2051 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
2052 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
2053 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_, true);
2054 QuicStreamFactoryPeer::SetThresholdTimeoutsWithOpenStreams(&factory_, 2);
2055 EXPECT_FALSE(
2056 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2057 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
2058 &factory_, host_port_pair_.port()));
2059
2060 MockRead reads[] = {
2061 MockRead(ASYNC, OK, 0) // EOF
2062 };
2063 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
2064 socket_factory_.AddSocketDataProvider(&socket_data);
2065 socket_data.StopAfter(1);
2066
2067 // DeterministicSocketData socket_data2(nullptr, 0, nullptr, 0);
2068 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
2069 socket_factory_.AddSocketDataProvider(&socket_data2);
2070 socket_data2.StopAfter(1);
2071
2072 DeterministicSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
2073 socket_factory_.AddSocketDataProvider(&socket_data3);
2074 socket_data3.StopAfter(1);
2075
2076 HostPortPair server2("mail.example.org", kDefaultServerPort);
2077 HostPortPair server3("docs.example.org", kDefaultServerPort);
2078
2079 crypto_client_stream_factory_.set_handshake_mode(
2080 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2081 host_resolver_.set_synchronous_mode(true);
2082 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2083 "192.168.0.1", "");
2084 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2085 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
2086
2087 // Test first and third out of three timeouts with open streams.
2088 QuicStreamRequest request(&factory_);
2089 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
2090 /*cert_verify_flags=*/0, host_port_pair_.host(),
2091 "GET", net_log_, callback_.callback()));
2092
2093 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
2094 &factory_, host_port_pair_, is_https_);
2095
2096 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2097 EXPECT_TRUE(stream.get());
2098 HttpRequestInfo request_info;
2099 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2100 net_log_, CompletionCallback()));
2101
2102 DVLOG(1)
2103 << "Created 1st session and initialized a stream. Now trigger timeout";
2104 session->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2105 // Need to spin the loop now to ensure that
2106 // QuicStreamFactory::OnSessionClosed() runs.
2107 base::RunLoop run_loop;
2108 run_loop.RunUntilIdle();
2109
2110 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_));
2111 EXPECT_FALSE(
2112 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2113
2114 // Test two-in-a-row timeouts with open streams.
2115 DVLOG(1) << "Create 2nd session without timeout";
2116 TestCompletionCallback callback2;
2117 QuicStreamRequest request2(&factory_);
2118 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
2119 /*cert_verify_flags=*/0, server2.host(), "GET",
2120 net_log_, callback2.callback()));
2121 QuicClientSession* session2 =
2122 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_);
2123
2124 session2->connection()->CloseConnection(QUIC_NO_ERROR, true);
2125 // Need to spin the loop now to ensure that
2126 // QuicStreamFactory::OnSessionClosed() runs.
2127 base::RunLoop run_loop2;
2128 run_loop2.RunUntilIdle();
2129 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_));
2130 EXPECT_FALSE(
2131 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2132
2133 DVLOG(1) << "Create 3rd session with timeout with open streams,"
2134 << " will disable QUIC";
2135
2136 TestCompletionCallback callback3;
2137 QuicStreamRequest request3(&factory_);
2138 EXPECT_EQ(OK, request3.Request(server3, is_https_, privacy_mode_,
2139 /*cert_verify_flags=*/0, server3.host(), "GET",
2140 net_log_, callback3.callback()));
2141 QuicClientSession* session3 =
2142 QuicStreamFactoryPeer::GetActiveSession(&factory_, server3, is_https_);
2143
2144 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2145 EXPECT_TRUE(stream3.get());
2146 EXPECT_EQ(OK, stream3->InitializeStream(&request_info, DEFAULT_PRIORITY,
2147 net_log_, CompletionCallback()));
2148 session3->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2149 // Need to spin the loop now to ensure that
2150 // QuicStreamFactory::OnSessionClosed() runs.
2151 base::RunLoop run_loop3;
2152 run_loop3.RunUntilIdle();
2153 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_));
2154 EXPECT_TRUE(
2155 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2156 EXPECT_EQ(QuicClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
2157 factory_.QuicDisabledReason(host_port_pair_.port()));
2158
2159 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2160 EXPECT_TRUE(stream2.get());
2161 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2162 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2163 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2164 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2165 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2166 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
2167}
2168
2169TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfFour) {
2170 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
2171 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
2172 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_, true);
2173 QuicStreamFactoryPeer::SetThresholdPublicResetsPostHandshake(&factory_, 2);
2174 EXPECT_FALSE(
2175 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2176 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
2177 &factory_, host_port_pair_.port()));
2178
2179 MockRead reads[] = {
2180 MockRead(ASYNC, OK, 0) // EOF
2181 };
2182 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
2183 socket_factory_.AddSocketDataProvider(&socket_data);
2184 socket_data.StopAfter(1);
2185
2186 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
2187 socket_factory_.AddSocketDataProvider(&socket_data2);
2188 socket_data2.StopAfter(1);
2189
2190 DeterministicSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
2191 socket_factory_.AddSocketDataProvider(&socket_data3);
2192 socket_data3.StopAfter(1);
2193
2194 DeterministicSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
2195 socket_factory_.AddSocketDataProvider(&socket_data4);
2196 socket_data4.StopAfter(1);
2197
2198 HostPortPair server2("mail.example.org", kDefaultServerPort);
2199 HostPortPair server3("docs.example.org", kDefaultServerPort);
2200 HostPortPair server4("images.example.org", kDefaultServerPort);
2201
2202 crypto_client_stream_factory_.set_handshake_mode(
2203 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2204 host_resolver_.set_synchronous_mode(true);
2205 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2206 "192.168.0.1", "");
2207 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2208 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
2209 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
2210
2211 // Test first and fourth out of four public reset post handshakes.
2212 QuicStreamRequest request(&factory_);
2213 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
2214 /*cert_verify_flags=*/0, host_port_pair_.host(),
2215 "GET", net_log_, callback_.callback()));
2216
2217 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
2218 &factory_, host_port_pair_, is_https_);
2219
2220 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
2221 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
2222 // Need to spin the loop now to ensure that
2223 // QuicStreamFactory::OnSessionClosed() runs.
2224 base::RunLoop run_loop;
2225 run_loop.RunUntilIdle();
2226
2227 EXPECT_EQ(1,
2228 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_));
2229 EXPECT_FALSE(
2230 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2231
2232 DVLOG(1) << "Create 2nd and 3rd sessions without disable trigger";
2233 TestCompletionCallback callback2;
2234 QuicStreamRequest request2(&factory_);
2235 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
2236 /*cert_verify_flags=*/0, server2.host(), "GET",
2237 net_log_, callback2.callback()));
2238 QuicClientSession* session2 =
2239 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_);
2240
2241 session2->connection()->CloseConnection(QUIC_NO_ERROR, false);
2242 // Need to spin the loop now to ensure that
2243 // QuicStreamFactory::OnSessionClosed() runs.
2244 base::RunLoop run_loop2;
2245 run_loop2.RunUntilIdle();
2246 EXPECT_EQ(1,
2247 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_));
2248 EXPECT_FALSE(
2249 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2250
2251 TestCompletionCallback callback3;
2252 QuicStreamRequest request3(&factory_);
2253 EXPECT_EQ(OK, request3.Request(server3, is_https_, privacy_mode_,
2254 /*cert_verify_flags=*/0, server3.host(), "GET",
2255 net_log_, callback3.callback()));
2256 QuicClientSession* session3 =
2257 QuicStreamFactoryPeer::GetActiveSession(&factory_, server3, is_https_);
2258
2259 session3->connection()->CloseConnection(QUIC_NO_ERROR, false);
2260 // Need to spin the loop now to ensure that
2261 // QuicStreamFactory::OnSessionClosed() runs.
2262 base::RunLoop run_loop3;
2263 run_loop3.RunUntilIdle();
2264 EXPECT_EQ(1,
2265 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_));
2266 EXPECT_FALSE(
2267 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2268
2269 DVLOG(1) << "Create 4rd session with public reset post handshake,"
2270 << " will not disable QUIC";
2271 TestCompletionCallback callback4;
2272 QuicStreamRequest request4(&factory_);
2273 EXPECT_EQ(OK, request4.Request(server4, is_https_, privacy_mode_,
2274 /*cert_verify_flags=*/0, server4.host(), "GET",
2275 net_log_, callback4.callback()));
2276 QuicClientSession* session4 =
2277 QuicStreamFactoryPeer::GetActiveSession(&factory_, server4, is_https_);
2278
2279 session4->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
2280 // Need to spin the loop now to ensure that
2281 // QuicStreamFactory::OnSessionClosed() runs.
2282 base::RunLoop run_loop4;
2283 run_loop4.RunUntilIdle();
2284 EXPECT_EQ(1,
2285 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_));
2286 EXPECT_FALSE(
2287 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2288
2289 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2290 EXPECT_TRUE(stream.get());
2291 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2292 EXPECT_TRUE(stream2.get());
2293 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2294 EXPECT_TRUE(stream3.get());
2295 scoped_ptr<QuicHttpStream> stream4 = request4.ReleaseStream();
2296 EXPECT_TRUE(stream4.get());
2297
2298 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2299 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2300 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2301 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2302 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2303 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
2304 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
2305 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
2306}
2307
2308TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfFour) {
2309 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
2310 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
2311 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_, true);
2312 QuicStreamFactoryPeer::SetThresholdTimeoutsWithOpenStreams(&factory_, 2);
2313 EXPECT_FALSE(
2314 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2315 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
2316 &factory_, host_port_pair_.port()));
2317
2318 MockRead reads[] = {
2319 MockRead(ASYNC, OK, 0) // EOF
2320 };
2321 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
2322 socket_factory_.AddSocketDataProvider(&socket_data);
2323 socket_data.StopAfter(1);
2324
2325 // DeterministicSocketData socket_data2(nullptr, 0, nullptr, 0);
2326 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
2327 socket_factory_.AddSocketDataProvider(&socket_data2);
2328 socket_data2.StopAfter(1);
2329
2330 DeterministicSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
2331 socket_factory_.AddSocketDataProvider(&socket_data3);
2332 socket_data3.StopAfter(1);
2333
2334 DeterministicSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
2335 socket_factory_.AddSocketDataProvider(&socket_data4);
2336 socket_data4.StopAfter(1);
2337
2338 HostPortPair server2("mail.example.org", kDefaultServerPort);
2339 HostPortPair server3("docs.example.org", kDefaultServerPort);
2340 HostPortPair server4("images.example.org", kDefaultServerPort);
2341
2342 crypto_client_stream_factory_.set_handshake_mode(
2343 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2344 host_resolver_.set_synchronous_mode(true);
2345 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2346 "192.168.0.1", "");
2347 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2348 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
2349 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
2350
2351 // Test first and fourth out of three timeouts with open streams.
2352 QuicStreamRequest request(&factory_);
2353 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
2354 /*cert_verify_flags=*/0, host_port_pair_.host(),
2355 "GET", net_log_, callback_.callback()));
2356
2357 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
2358 &factory_, host_port_pair_, is_https_);
2359
2360 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2361 EXPECT_TRUE(stream.get());
2362 HttpRequestInfo request_info;
2363 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2364 net_log_, CompletionCallback()));
2365
2366 DVLOG(1)
2367 << "Created 1st session and initialized a stream. Now trigger timeout";
2368 session->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2369 // Need to spin the loop now to ensure that
2370 // QuicStreamFactory::OnSessionClosed() runs.
2371 base::RunLoop run_loop;
2372 run_loop.RunUntilIdle();
2373
2374 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_));
2375 EXPECT_FALSE(
2376 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2377
2378 DVLOG(1) << "Create 2nd and 3rd sessions without timeout";
2379 TestCompletionCallback callback2;
2380 QuicStreamRequest request2(&factory_);
2381 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
2382 /*cert_verify_flags=*/0, server2.host(), "GET",
2383 net_log_, callback2.callback()));
2384 QuicClientSession* session2 =
2385 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_);
2386
2387 session2->connection()->CloseConnection(QUIC_NO_ERROR, true);
2388 // Need to spin the loop now to ensure that
2389 // QuicStreamFactory::OnSessionClosed() runs.
2390 base::RunLoop run_loop2;
2391 run_loop2.RunUntilIdle();
2392 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_));
2393 EXPECT_FALSE(
2394 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2395
2396 TestCompletionCallback callback3;
2397 QuicStreamRequest request3(&factory_);
2398 EXPECT_EQ(OK, request3.Request(server3, is_https_, privacy_mode_,
2399 /*cert_verify_flags=*/0, server3.host(), "GET",
2400 net_log_, callback3.callback()));
2401 QuicClientSession* session3 =
2402 QuicStreamFactoryPeer::GetActiveSession(&factory_, server3, is_https_);
2403
2404 session3->connection()->CloseConnection(QUIC_NO_ERROR, true);
2405 // Need to spin the loop now to ensure that
2406 // QuicStreamFactory::OnSessionClosed() runs.
2407 base::RunLoop run_loop3;
2408 run_loop3.RunUntilIdle();
2409 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_));
2410 EXPECT_FALSE(
2411 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2412
2413 DVLOG(1) << "Create 4th session with timeout with open streams,"
2414 << " will not disable QUIC";
2415
2416 TestCompletionCallback callback4;
2417 QuicStreamRequest request4(&factory_);
2418 EXPECT_EQ(OK, request4.Request(server4, is_https_, privacy_mode_,
2419 /*cert_verify_flags=*/0, server4.host(), "GET",
2420 net_log_, callback4.callback()));
2421 QuicClientSession* session4 =
2422 QuicStreamFactoryPeer::GetActiveSession(&factory_, server4, is_https_);
2423
2424 scoped_ptr<QuicHttpStream> stream4 = request4.ReleaseStream();
2425 EXPECT_TRUE(stream4.get());
2426 EXPECT_EQ(OK, stream4->InitializeStream(&request_info, DEFAULT_PRIORITY,
2427 net_log_, CompletionCallback()));
2428 session4->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2429 // Need to spin the loop now to ensure that
2430 // QuicStreamFactory::OnSessionClosed() runs.
2431 base::RunLoop run_loop4;
2432 run_loop4.RunUntilIdle();
2433 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_));
2434 EXPECT_FALSE(
2435 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2436
2437 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2438 EXPECT_TRUE(stream2.get());
2439 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2440 EXPECT_TRUE(stream3.get());
2441 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2442 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2443 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2444 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2445 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2446 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
2447 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
2448 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
2449}
2450
[email protected]e13201d82012-12-12 05:00:322451} // namespace test
[email protected]e13201d82012-12-12 05:00:322452} // namespace net