blob: ae1e5d6dd628b968b51279308e410d5e249a599f [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 }
[email protected]c49ff182013-09-28 08:33:26155};
156
rtenneti38f5cd52014-10-28 20:28:28157class MockQuicServerInfo : public QuicServerInfo {
158 public:
159 MockQuicServerInfo(const QuicServerId& server_id)
160 : QuicServerInfo(server_id) {}
dcheng2339883c2014-12-23 00:23:05161 ~MockQuicServerInfo() override {}
rtenneti38f5cd52014-10-28 20:28:28162
dcheng2339883c2014-12-23 00:23:05163 void Start() override {}
rtenneti38f5cd52014-10-28 20:28:28164
dcheng2339883c2014-12-23 00:23:05165 int WaitForDataReady(const CompletionCallback& callback) override {
rtenneti38f5cd52014-10-28 20:28:28166 return ERR_IO_PENDING;
167 }
168
rtenneti170f36a2015-02-10 19:13:45169 void ResetWaitForDataReadyCallback() override {}
170
dcheng2339883c2014-12-23 00:23:05171 void CancelWaitForDataReadyCallback() override {}
rtenneti38f5cd52014-10-28 20:28:28172
dcheng2339883c2014-12-23 00:23:05173 bool IsDataReady() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28174
dcheng2339883c2014-12-23 00:23:05175 bool IsReadyToPersist() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28176
dcheng2339883c2014-12-23 00:23:05177 void Persist() override {}
rtennetif0b832b2014-11-07 02:32:30178
dcheng2339883c2014-12-23 00:23:05179 void OnExternalCacheHit() override {}
rtenneti38f5cd52014-10-28 20:28:28180};
181
182class MockQuicServerInfoFactory : public QuicServerInfoFactory {
183 public:
184 MockQuicServerInfoFactory() {}
dcheng2339883c2014-12-23 00:23:05185 ~MockQuicServerInfoFactory() override {}
rtenneti38f5cd52014-10-28 20:28:28186
dcheng2339883c2014-12-23 00:23:05187 QuicServerInfo* GetForServer(const QuicServerId& server_id) override {
rtenneti38f5cd52014-10-28 20:28:28188 return new MockQuicServerInfo(server_id);
189 }
190};
191
rtenneti14abd312015-02-06 21:56:01192class QuicStreamFactoryTest : public ::testing::TestWithParam<TestParams> {
[email protected]e13201d82012-12-12 05:00:32193 protected:
194 QuicStreamFactoryTest()
[email protected]457d6952013-12-13 09:24:58195 : random_generator_(0),
196 clock_(new MockClock()),
rtenneti38f5cd52014-10-28 20:28:28197 runner_(new TestTaskRunner(clock_)),
bncb07c05532015-05-14 19:07:20198 maker_(GetParam().version, 0, clock_, kDefaultServerHostName),
[email protected]59c0bbd2014-03-22 04:08:12199 cert_verifier_(CertVerifier::CreateDefault()),
jri2b966f22014-09-02 22:25:36200 channel_id_service_(
rtennetibe635732014-10-02 22:51:42201 new ChannelIDService(new DefaultChannelIDStore(nullptr),
skyostil4891b25b2015-06-11 11:43:45202 base::ThreadTaskRunnerHandle::Get())),
jri2b966f22014-09-02 22:25:36203 factory_(&host_resolver_,
204 &socket_factory_,
205 base::WeakPtr<HttpServerProperties>(),
206 cert_verifier_.get(),
207 channel_id_service_.get(),
208 &transport_security_state_,
209 &crypto_client_stream_factory_,
210 &random_generator_,
211 clock_,
212 kDefaultMaxPacketSize,
213 std::string(),
rtenneti14abd312015-02-06 21:56:01214 SupportedVersions(GetParam().version),
jri2b966f22014-09-02 22:25:36215 /*enable_port_selection=*/true,
jri584002d12014-09-09 00:51:28216 /*always_require_handshake_confirmation=*/false,
217 /*disable_connection_pooling=*/false,
rtenneti2912825c2015-01-06 01:19:46218 /*load_server_info_timeout_srtt_multiplier=*/0.0f,
rtenneti4f809972015-02-11 19:38:34219 /*enable_connection_racing=*/false,
qyearsley3257b7de2015-02-28 06:59:03220 /*enable_non_blocking_io=*/true,
rtenneti34dffe752015-02-24 23:27:32221 /*disable_disk_cache=*/false,
rch9976b0c2015-06-10 21:27:23222 /*prefer_aes=*/false,
rtenneti85dcfac22015-03-27 20:22:19223 /*max_number_of_lossy_connections=*/0,
224 /*packet_loss_threshold=*/1.0f,
rchc7433572015-02-27 18:16:51225 /*receive_buffer_size=*/0,
jri2b966f22014-09-02 22:25:36226 QuicTagVector()),
[email protected]bf4ea2f2014-03-10 22:57:53227 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
[email protected]9dd3ff0f2014-03-26 09:51:28228 is_https_(false),
[email protected]314b03992014-04-01 01:28:53229 privacy_mode_(PRIVACY_MODE_DISABLED) {
[email protected]11c05872013-08-20 02:04:12230 factory_.set_require_confirmation(false);
[email protected]ca4e0d92014-08-22 16:33:22231 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
rtenneti14abd312015-02-06 21:56:01232 QuicStreamFactoryPeer::SetEnableConnectionRacing(
233 &factory_, GetParam().enable_connection_racing);
[email protected]e13201d82012-12-12 05:00:32234 }
235
bnccb7ff3c2015-05-21 20:51:55236 bool HasActiveSession(const HostPortPair& host_port_pair) {
237 return QuicStreamFactoryPeer::HasActiveSession(&factory_, host_port_pair,
238 /*is_https_=*/false);
239 }
240
241 scoped_ptr<QuicHttpStream> CreateFromSession(
242 const HostPortPair& host_port_pair) {
243 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
244 &factory_, host_port_pair, /*is_https=*/false);
245 return QuicStreamFactoryPeer::CreateFromSession(&factory_, session);
[email protected]df157d9d2014-03-10 07:27:27246 }
[email protected]e13201d82012-12-12 05:00:32247
[email protected]bf4ea2f2014-03-10 22:57:53248 int GetSourcePortForNewSession(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10249 return GetSourcePortForNewSessionInner(destination, false);
250 }
251
252 int GetSourcePortForNewSessionAndGoAway(
[email protected]bf4ea2f2014-03-10 22:57:53253 const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10254 return GetSourcePortForNewSessionInner(destination, true);
255 }
256
[email protected]bf4ea2f2014-03-10 22:57:53257 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
[email protected]d8e2abf82014-03-06 10:30:10258 bool goaway_received) {
[email protected]3c772402013-12-18 21:38:11259 // Should only be called if there is no active session for this destination.
bnccb7ff3c2015-05-21 20:51:55260 EXPECT_FALSE(HasActiveSession(destination));
[email protected]3c772402013-12-18 21:38:11261 size_t socket_count = socket_factory_.udp_client_sockets().size();
262
263 MockRead reads[] = {
264 MockRead(ASYNC, OK, 0) // EOF
265 };
rtennetibe635732014-10-02 22:51:42266 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]3c772402013-12-18 21:38:11267 socket_data.StopAfter(1);
268 socket_factory_.AddSocketDataProvider(&socket_data);
269
270 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59271 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:48272 request.Request(destination, is_https_, privacy_mode_,
273 destination.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:59274 callback_.callback()));
[email protected]3c772402013-12-18 21:38:11275
276 EXPECT_EQ(OK, callback_.WaitForResult());
277 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
278 EXPECT_TRUE(stream.get());
279 stream.reset();
280
281 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
[email protected]df157d9d2014-03-10 07:27:27282 &factory_, destination, is_https_);
[email protected]3c772402013-12-18 21:38:11283
284 if (socket_count + 1 != socket_factory_.udp_client_sockets().size()) {
285 EXPECT_TRUE(false);
286 return 0;
287 }
288
289 IPEndPoint endpoint;
290 socket_factory_.
291 udp_client_sockets()[socket_count]->GetLocalAddress(&endpoint);
292 int port = endpoint.port();
[email protected]d8e2abf82014-03-06 10:30:10293 if (goaway_received) {
294 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, "");
295 session->OnGoAway(goaway);
296 }
[email protected]3c772402013-12-18 21:38:11297
298 factory_.OnSessionClosed(session);
bnccb7ff3c2015-05-21 20:51:55299 EXPECT_FALSE(HasActiveSession(destination));
rch37de576c2015-05-17 20:28:17300 EXPECT_TRUE(socket_data.AllReadDataConsumed());
301 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:11302 return port;
303 }
304
[email protected]459a7402014-02-10 12:58:52305 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() {
[email protected]66ae5962014-05-22 11:13:05306 QuicStreamId stream_id = kClientDataStreamId1;
[email protected]51cc1342014-04-18 23:44:37307 return maker_.MakeRstPacket(
308 1, true, stream_id,
rtenneti14abd312015-02-06 21:56:01309 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam().version));
[email protected]459a7402014-02-10 12:58:52310 }
311
bncf8bf0722015-05-19 20:04:13312 static ProofVerifyDetailsChromium DefaultProofVerifyDetails() {
313 // Load a certificate that is valid for www.example.org, mail.example.org,
314 // and mail.example.com.
315 scoped_refptr<X509Certificate> test_cert(
316 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
317 EXPECT_TRUE(test_cert.get());
318 ProofVerifyDetailsChromium verify_details;
319 verify_details.cert_verify_result.verified_cert = test_cert;
320 verify_details.cert_verify_result.is_issued_by_known_root = true;
321 return verify_details;
322 }
323
rtenneti38f5cd52014-10-28 20:28:28324 MockQuicServerInfoFactory quic_server_info_factory_;
[email protected]e13201d82012-12-12 05:00:32325 MockHostResolver host_resolver_;
[email protected]0edce6a2013-05-08 18:02:40326 DeterministicMockClientSocketFactory socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05327 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]9558c5d32012-12-22 00:08:14328 MockRandom random_generator_;
[email protected]872edd9e2013-01-16 08:51:15329 MockClock* clock_; // Owned by factory_.
rtenneti38f5cd52014-10-28 20:28:28330 scoped_refptr<TestTaskRunner> runner_;
rtenneti4b06ae72014-08-26 03:43:43331 QuicTestPacketMaker maker_;
[email protected]59c0bbd2014-03-22 04:08:12332 scoped_ptr<CertVerifier> cert_verifier_;
[email protected]6b8a3c742014-07-25 00:25:35333 scoped_ptr<ChannelIDService> channel_id_service_;
[email protected]080b77932014-08-04 01:22:46334 TransportSecurityState transport_security_state_;
[email protected]e13201d82012-12-12 05:00:32335 QuicStreamFactory factory_;
[email protected]bf4ea2f2014-03-10 22:57:53336 HostPortPair host_port_pair_;
[email protected]6d1b4ed2013-07-10 03:57:54337 bool is_https_;
[email protected]9dd3ff0f2014-03-26 09:51:28338 PrivacyMode privacy_mode_;
[email protected]e13201d82012-12-12 05:00:32339 BoundNetLog net_log_;
340 TestCompletionCallback callback_;
[email protected]e13201d82012-12-12 05:00:32341};
342
rtenneti14abd312015-02-06 21:56:01343INSTANTIATE_TEST_CASE_P(Version,
344 QuicStreamFactoryTest,
345 ::testing::ValuesIn(GetTestParams()));
[email protected]1e960032013-12-20 19:00:20346
[email protected]1e960032013-12-20 19:00:20347TEST_P(QuicStreamFactoryTest, Create) {
[email protected]69dfd1b2013-06-04 22:20:12348 MockRead reads[] = {
[email protected]25c31dc2013-06-05 17:56:04349 MockRead(ASYNC, OK, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:12350 };
rtennetibe635732014-10-02 22:51:42351 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:32352 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]25c31dc2013-06-05 17:56:04353 socket_data.StopAfter(1);
[email protected]e13201d82012-12-12 05:00:32354
355 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59356 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:48357 request.Request(host_port_pair_, is_https_, privacy_mode_,
358 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:59359 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32360
361 EXPECT_EQ(OK, callback_.WaitForResult());
362 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0edce6a2013-05-08 18:02:40363 EXPECT_TRUE(stream.get());
[email protected]e13201d82012-12-12 05:00:32364
365 // Will reset stream 3.
bnccb7ff3c2015-05-21 20:51:55366 stream = CreateFromSession(host_port_pair_);
[email protected]e13201d82012-12-12 05:00:32367 EXPECT_TRUE(stream.get());
368
[email protected]6d1b4ed2013-07-10 03:57:54369 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
370 // in streams on different sessions.
[email protected]e13201d82012-12-12 05:00:32371 QuicStreamRequest request2(&factory_);
bnc68d401dd2015-05-18 20:31:48372 EXPECT_EQ(OK, request2.Request(host_port_pair_, is_https_, privacy_mode_,
373 host_port_pair_.host(), "GET", net_log_,
374 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32375 stream = request2.ReleaseStream(); // Will reset stream 5.
376 stream.reset(); // Will reset stream 7.
377
rch37de576c2015-05-17 20:28:17378 EXPECT_TRUE(socket_data.AllReadDataConsumed());
379 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:32380}
381
[email protected]8bd2b812014-03-26 04:01:17382TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
383 MockRead reads[] = {
384 MockRead(ASYNC, OK, 0) // EOF
385 };
rtennetibe635732014-10-02 22:51:42386 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17387 socket_factory_.AddSocketDataProvider(&socket_data);
388 socket_data.StopAfter(1);
389
390 crypto_client_stream_factory_.set_handshake_mode(
391 MockCryptoClientStream::ZERO_RTT);
392 host_resolver_.set_synchronous_mode(true);
393 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
394 "192.168.0.1", "");
395
396 QuicStreamRequest request(&factory_);
bnc68d401dd2015-05-18 20:31:48397 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
398 host_port_pair_.host(), "GET", net_log_,
399 callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17400
401 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
402 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17403 EXPECT_TRUE(socket_data.AllReadDataConsumed());
404 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17405}
406
407TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
408 MockRead reads[] = {
409 MockRead(ASYNC, OK, 0) // EOF
410 };
rtennetibe635732014-10-02 22:51:42411 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17412 socket_factory_.AddSocketDataProvider(&socket_data);
413 socket_data.StopAfter(1);
414
415 crypto_client_stream_factory_.set_handshake_mode(
416 MockCryptoClientStream::ZERO_RTT);
417 host_resolver_.set_synchronous_mode(true);
418 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
419 "192.168.0.1", "");
420
421 QuicStreamRequest request(&factory_);
422 // Posts require handshake confirmation, so this will return asynchronously.
423 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:48424 request.Request(host_port_pair_, is_https_, privacy_mode_,
425 host_port_pair_.host(), "POST", net_log_,
[email protected]8bd2b812014-03-26 04:01:17426 callback_.callback()));
427
428 // Confirm the handshake and verify that the stream is created.
429 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
430 QuicSession::HANDSHAKE_CONFIRMED);
431
432 EXPECT_EQ(OK, callback_.WaitForResult());
433 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
434 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17435 EXPECT_TRUE(socket_data.AllReadDataConsumed());
436 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17437}
438
bnc68d401dd2015-05-18 20:31:48439TEST_P(QuicStreamFactoryTest, NoZeroRttForDifferentHost) {
440 MockRead reads[] = {
441 MockRead(ASYNC, OK, 0),
442 };
443 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
444 socket_factory_.AddSocketDataProvider(&socket_data);
445 socket_data.StopAfter(1);
446
447 crypto_client_stream_factory_.set_handshake_mode(
448 MockCryptoClientStream::ZERO_RTT);
449 host_resolver_.set_synchronous_mode(true);
450 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
451 "192.168.0.1", "");
452
453 QuicStreamRequest request(&factory_);
454 int rv = request.Request(host_port_pair_, is_https_, privacy_mode_,
455 "different.host.example.com", "GET", net_log_,
456 callback_.callback());
457 // If server and origin have different hostnames, then handshake confirmation
458 // should be required, so Request will return asynchronously.
459 EXPECT_EQ(ERR_IO_PENDING, rv);
460 // Confirm handshake.
461 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
462 QuicSession::HANDSHAKE_CONFIRMED);
463 EXPECT_EQ(OK, callback_.WaitForResult());
464
465 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
466 EXPECT_TRUE(stream.get());
467 EXPECT_TRUE(socket_data.AllReadDataConsumed());
468 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
469}
470
[email protected]df157d9d2014-03-10 07:27:27471TEST_P(QuicStreamFactoryTest, CreateHttpVsHttps) {
472 MockRead reads[] = {
473 MockRead(ASYNC, OK, 0) // EOF
474 };
rtennetibe635732014-10-02 22:51:42475 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
476 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]df157d9d2014-03-10 07:27:27477 socket_factory_.AddSocketDataProvider(&socket_data1);
478 socket_factory_.AddSocketDataProvider(&socket_data2);
479 socket_data1.StopAfter(1);
480 socket_data2.StopAfter(1);
481
482 QuicStreamRequest request(&factory_);
483 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:48484 request.Request(host_port_pair_, is_https_, privacy_mode_,
485 host_port_pair_.host(), "GET", net_log_,
[email protected]df157d9d2014-03-10 07:27:27486 callback_.callback()));
487
488 EXPECT_EQ(OK, callback_.WaitForResult());
489 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
490 EXPECT_TRUE(stream.get());
491
492 QuicStreamRequest request2(&factory_);
493 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:48494 request2.Request(host_port_pair_, !is_https_, privacy_mode_,
495 host_port_pair_.host(), "GET", net_log_,
[email protected]df157d9d2014-03-10 07:27:27496 callback_.callback()));
497 EXPECT_EQ(OK, callback_.WaitForResult());
498 stream = request2.ReleaseStream();
499 EXPECT_TRUE(stream.get());
500 stream.reset();
501
502 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53503 &factory_, host_port_pair_, is_https_),
[email protected]df157d9d2014-03-10 07:27:27504 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53505 &factory_, host_port_pair_, !is_https_));
[email protected]df157d9d2014-03-10 07:27:27506
rch37de576c2015-05-17 20:28:17507 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
508 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
509 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
510 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]df157d9d2014-03-10 07:27:27511}
512
[email protected]5db452202014-08-19 05:22:15513TEST_P(QuicStreamFactoryTest, Pooling) {
[email protected]eed749f92013-12-23 18:57:38514 MockRead reads[] = {
515 MockRead(ASYNC, OK, 0) // EOF
516 };
rtennetibe635732014-10-02 22:51:42517 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38518 socket_factory_.AddSocketDataProvider(&socket_data);
519 socket_data.StopAfter(1);
520
[email protected]bf4ea2f2014-03-10 22:57:53521 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38522 host_resolver_.set_synchronous_mode(true);
523 host_resolver_.rules()->AddIPLiteralRule(
524 kDefaultServerHostName, "192.168.0.1", "");
525 host_resolver_.rules()->AddIPLiteralRule(
526 "mail.google.com", "192.168.0.1", "");
527
528 QuicStreamRequest request(&factory_);
bnc68d401dd2015-05-18 20:31:48529 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
530 host_port_pair_.host(), "GET", net_log_,
531 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38532 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
533 EXPECT_TRUE(stream.get());
534
535 TestCompletionCallback callback;
536 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59537 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48538 request2.Request(server2, is_https_, privacy_mode_, server2.host(),
539 "GET", net_log_, callback.callback()));
[email protected]eed749f92013-12-23 18:57:38540 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
541 EXPECT_TRUE(stream2.get());
542
543 EXPECT_EQ(
[email protected]df157d9d2014-03-10 07:27:27544 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53545 &factory_, host_port_pair_, is_https_),
[email protected]df157d9d2014-03-10 07:27:27546 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38547
rch37de576c2015-05-17 20:28:17548 EXPECT_TRUE(socket_data.AllReadDataConsumed());
549 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38550}
551
jri584002d12014-09-09 00:51:28552TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) {
553 MockRead reads[] = {
554 MockRead(ASYNC, OK, 0) // EOF
555 };
rtennetibe635732014-10-02 22:51:42556 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
557 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28558 socket_factory_.AddSocketDataProvider(&socket_data1);
559 socket_factory_.AddSocketDataProvider(&socket_data2);
560 socket_data1.StopAfter(1);
561 socket_data2.StopAfter(1);
562
563 HostPortPair server2("mail.google.com", kDefaultServerPort);
564 host_resolver_.set_synchronous_mode(true);
565 host_resolver_.rules()->AddIPLiteralRule(
566 kDefaultServerHostName, "192.168.0.1", "");
567 host_resolver_.rules()->AddIPLiteralRule(
568 "mail.google.com", "192.168.0.1", "");
569
570 // Disable connection pooling.
571 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
572
573 QuicStreamRequest request(&factory_);
bnc68d401dd2015-05-18 20:31:48574 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
575 host_port_pair_.host(), "GET", net_log_,
576 callback_.callback()));
jri584002d12014-09-09 00:51:28577 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
578 EXPECT_TRUE(stream.get());
579
580 TestCompletionCallback callback;
581 QuicStreamRequest request2(&factory_);
582 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48583 request2.Request(server2, is_https_, privacy_mode_, server2.host(),
584 "GET", net_log_, callback.callback()));
jri584002d12014-09-09 00:51:28585 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
586 EXPECT_TRUE(stream2.get());
587
588 EXPECT_NE(
589 QuicStreamFactoryPeer::GetActiveSession(
590 &factory_, host_port_pair_, is_https_),
591 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_));
592
rch37de576c2015-05-17 20:28:17593 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
594 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
595 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
596 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28597}
598
[email protected]eed749f92013-12-23 18:57:38599TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
600 MockRead reads[] = {
601 MockRead(ASYNC, OK, 0) // EOF
602 };
rtennetibe635732014-10-02 22:51:42603 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
604 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38605 socket_factory_.AddSocketDataProvider(&socket_data1);
606 socket_factory_.AddSocketDataProvider(&socket_data2);
607 socket_data1.StopAfter(1);
608 socket_data2.StopAfter(1);
609
[email protected]bf4ea2f2014-03-10 22:57:53610 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38611 host_resolver_.set_synchronous_mode(true);
612 host_resolver_.rules()->AddIPLiteralRule(
613 kDefaultServerHostName, "192.168.0.1", "");
614 host_resolver_.rules()->AddIPLiteralRule(
615 "mail.google.com", "192.168.0.1", "");
616
617 QuicStreamRequest request(&factory_);
bnc68d401dd2015-05-18 20:31:48618 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
619 host_port_pair_.host(), "GET", net_log_,
620 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38621 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
622 EXPECT_TRUE(stream.get());
623
624 TestCompletionCallback callback;
625 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59626 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48627 request2.Request(server2, is_https_, privacy_mode_, server2.host(),
628 "GET", net_log_, callback.callback()));
[email protected]eed749f92013-12-23 18:57:38629 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
630 EXPECT_TRUE(stream2.get());
631
[email protected]df157d9d2014-03-10 07:27:27632 factory_.OnSessionGoingAway(QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53633 &factory_, host_port_pair_, is_https_));
[email protected]df157d9d2014-03-10 07:27:27634 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53635 &factory_, host_port_pair_, is_https_));
[email protected]df157d9d2014-03-10 07:27:27636 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
637 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38638
639 TestCompletionCallback callback3;
640 QuicStreamRequest request3(&factory_);
[email protected]974849d2014-02-06 01:32:59641 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48642 request3.Request(server2, is_https_, privacy_mode_, server2.host(),
643 "GET", net_log_, callback3.callback()));
[email protected]eed749f92013-12-23 18:57:38644 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
645 EXPECT_TRUE(stream3.get());
646
[email protected]df157d9d2014-03-10 07:27:27647 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(
648 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38649
rch37de576c2015-05-17 20:28:17650 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
651 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
652 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
653 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38654}
655
[email protected]5db452202014-08-19 05:22:15656TEST_P(QuicStreamFactoryTest, HttpsPooling) {
[email protected]eed749f92013-12-23 18:57:38657 MockRead reads[] = {
658 MockRead(ASYNC, OK, 0) // EOF
659 };
rtennetibe635732014-10-02 22:51:42660 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38661 socket_factory_.AddSocketDataProvider(&socket_data);
662 socket_data.StopAfter(1);
663
[email protected]bf4ea2f2014-03-10 22:57:53664 HostPortPair server1("www.example.org", 443);
665 HostPortPair server2("mail.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38666
bncf8bf0722015-05-19 20:04:13667 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01668 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38669
670 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53671 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
672 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38673
674 QuicStreamRequest request(&factory_);
675 is_https_ = true;
[email protected]974849d2014-02-06 01:32:59676 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48677 request.Request(server1, is_https_, privacy_mode_, server1.host(),
678 "GET", net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38679 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
680 EXPECT_TRUE(stream.get());
681
682 TestCompletionCallback callback;
683 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59684 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48685 request2.Request(server2, is_https_, privacy_mode_, server2.host(),
686 "GET", net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38687 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
688 EXPECT_TRUE(stream2.get());
689
[email protected]df157d9d2014-03-10 07:27:27690 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
691 &factory_, server1, is_https_),
692 QuicStreamFactoryPeer::GetActiveSession(
693 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38694
rch37de576c2015-05-17 20:28:17695 EXPECT_TRUE(socket_data.AllReadDataConsumed());
696 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38697}
698
jri584002d12014-09-09 00:51:28699TEST_P(QuicStreamFactoryTest, NoHttpsPoolingIfDisabled) {
700 MockRead reads[] = {
701 MockRead(ASYNC, OK, 0) // EOF
702 };
rtennetibe635732014-10-02 22:51:42703 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
704 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28705 socket_factory_.AddSocketDataProvider(&socket_data1);
706 socket_factory_.AddSocketDataProvider(&socket_data2);
707 socket_data1.StopAfter(1);
708 socket_data2.StopAfter(1);
709
710 HostPortPair server1("www.example.org", 443);
711 HostPortPair server2("mail.example.org", 443);
712
bncf8bf0722015-05-19 20:04:13713 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01714 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28715
716 host_resolver_.set_synchronous_mode(true);
717 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
718 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
719
720 // Disable connection pooling.
721 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
722
723 QuicStreamRequest request(&factory_);
724 is_https_ = true;
725 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48726 request.Request(server1, is_https_, privacy_mode_, server1.host(),
727 "GET", net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28728 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
729 EXPECT_TRUE(stream.get());
730
731 TestCompletionCallback callback;
732 QuicStreamRequest request2(&factory_);
733 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48734 request2.Request(server2, is_https_, privacy_mode_, server2.host(),
735 "GET", net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28736 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
737 EXPECT_TRUE(stream2.get());
738
739 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
740 &factory_, server1, is_https_),
741 QuicStreamFactoryPeer::GetActiveSession(
742 &factory_, server2, is_https_));
743
rch37de576c2015-05-17 20:28:17744 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
745 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
746 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
747 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28748}
749
bnccb7ff3c2015-05-21 20:51:55750class QuicAlternativeServiceCertificateValidationPooling
751 : public QuicStreamFactoryTest {
752 public:
753 void Run(bool valid) {
754 MockRead reads[] = {
755 MockRead(ASYNC, OK, 0) // EOF
756 };
757 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
758 socket_factory_.AddSocketDataProvider(&socket_data1);
759 socket_data1.StopAfter(1);
[email protected]eed749f92013-12-23 18:57:38760
bnccb7ff3c2015-05-21 20:51:55761 HostPortPair server1("www.example.org", 443);
762 HostPortPair server2("mail.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38763
bnccb7ff3c2015-05-21 20:51:55764 std::string origin_host(valid ? "mail.example.org" : "invalid.example.org");
765 HostPortPair alternative("www.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38766
bnccb7ff3c2015-05-21 20:51:55767 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
768 bool common_name_fallback_used;
769 EXPECT_EQ(valid,
770 verify_details.cert_verify_result.verified_cert->VerifyNameMatch(
771 origin_host, &common_name_fallback_used));
772 EXPECT_TRUE(
773 verify_details.cert_verify_result.verified_cert->VerifyNameMatch(
774 alternative.host(), &common_name_fallback_used));
775 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38776
bnccb7ff3c2015-05-21 20:51:55777 host_resolver_.set_synchronous_mode(true);
778 host_resolver_.rules()->AddIPLiteralRule(alternative.host(), "192.168.0.1",
779 "");
[email protected]eed749f92013-12-23 18:57:38780
bnccb7ff3c2015-05-21 20:51:55781 // Open first stream to alternative.
782 QuicStreamRequest request1(&factory_);
783 is_https_ = true;
784 EXPECT_EQ(OK, request1.Request(alternative, is_https_, privacy_mode_,
785 alternative.host(), "GET", net_log_,
786 callback_.callback()));
787 scoped_ptr<QuicHttpStream> stream1 = request1.ReleaseStream();
788 EXPECT_TRUE(stream1.get());
[email protected]eed749f92013-12-23 18:57:38789
bnccb7ff3c2015-05-21 20:51:55790 QuicStreamRequest request2(&factory_);
791 int rv =
792 request2.Request(alternative, is_https_, privacy_mode_, origin_host,
793 "GET", net_log_, callback_.callback());
794 if (valid) {
795 // Alternative service of origin to |alternative| should pool to session
796 // of |stream1| even if origin is different. Since only one
797 // SocketDataProvider is set up, the second request succeeding means that
798 // it pooled to the session opened by the first one.
799 EXPECT_EQ(OK, rv);
800 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
801 EXPECT_TRUE(stream2.get());
802 } else {
803 EXPECT_EQ(ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN, rv);
804 }
[email protected]eed749f92013-12-23 18:57:38805
bnccb7ff3c2015-05-21 20:51:55806 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
807 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
808 }
809};
810
811INSTANTIATE_TEST_CASE_P(Version,
812 QuicAlternativeServiceCertificateValidationPooling,
813 ::testing::ValuesIn(GetTestParams()));
814
815TEST_P(QuicAlternativeServiceCertificateValidationPooling, Valid) {
816 Run(true);
817}
818
819TEST_P(QuicAlternativeServiceCertificateValidationPooling, Invalid) {
820 Run(false);
[email protected]eed749f92013-12-23 18:57:38821}
822
[email protected]5db452202014-08-19 05:22:15823TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
824 MockRead reads[] = {
825 MockRead(ASYNC, OK, 0) // EOF
826 };
rtennetibe635732014-10-02 22:51:42827 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15828 socket_factory_.AddSocketDataProvider(&socket_data);
829 socket_data.StopAfter(1);
830
831 HostPortPair server1("www.example.org", 443);
832 HostPortPair server2("mail.example.org", 443);
833 uint8 primary_pin = 1;
834 uint8 backup_pin = 2;
835 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
836 backup_pin);
837
bncf8bf0722015-05-19 20:04:13838 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
[email protected]5db452202014-08-19 05:22:15839 verify_details.cert_verify_result.public_key_hashes.push_back(
840 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01841 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]5db452202014-08-19 05:22:15842
843 host_resolver_.set_synchronous_mode(true);
844 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
845 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
846
847 QuicStreamRequest request(&factory_);
848 is_https_ = true;
849 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48850 request.Request(server1, is_https_, privacy_mode_, server1.host(),
851 "GET", net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15852 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
853 EXPECT_TRUE(stream.get());
854
855 TestCompletionCallback callback;
856 QuicStreamRequest request2(&factory_);
857 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48858 request2.Request(server2, is_https_, privacy_mode_, server2.host(),
859 "GET", net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15860 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
861 EXPECT_TRUE(stream2.get());
862
863 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
864 &factory_, server1, is_https_),
865 QuicStreamFactoryPeer::GetActiveSession(
866 &factory_, server2, is_https_));
867
rch37de576c2015-05-17 20:28:17868 EXPECT_TRUE(socket_data.AllReadDataConsumed());
869 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:15870}
871
jri584002d12014-09-09 00:51:28872TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithMatchingPinsIfDisabled) {
873 MockRead reads[] = {
874 MockRead(ASYNC, OK, 0) // EOF
875 };
rtennetibe635732014-10-02 22:51:42876 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
877 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28878 socket_factory_.AddSocketDataProvider(&socket_data1);
879 socket_factory_.AddSocketDataProvider(&socket_data2);
880 socket_data1.StopAfter(1);
881 socket_data2.StopAfter(1);
882
883 HostPortPair server1("www.example.org", 443);
884 HostPortPair server2("mail.example.org", 443);
885 uint8 primary_pin = 1;
886 uint8 backup_pin = 2;
887 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
888 backup_pin);
889
bncf8bf0722015-05-19 20:04:13890 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
jri584002d12014-09-09 00:51:28891 verify_details.cert_verify_result.public_key_hashes.push_back(
892 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01893 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28894
895 host_resolver_.set_synchronous_mode(true);
896 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
897 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
898
899 // Disable connection pooling.
900 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
901
902 QuicStreamRequest request(&factory_);
903 is_https_ = true;
904 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48905 request.Request(server1, is_https_, privacy_mode_, server1.host(),
906 "GET", net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28907 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
908 EXPECT_TRUE(stream.get());
909
910 TestCompletionCallback callback;
911 QuicStreamRequest request2(&factory_);
912 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48913 request2.Request(server2, is_https_, privacy_mode_, server2.host(),
914 "GET", net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28915 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
916 EXPECT_TRUE(stream2.get());
917
918 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
919 &factory_, server1, is_https_),
920 QuicStreamFactoryPeer::GetActiveSession(
921 &factory_, server2, is_https_));
922
rch37de576c2015-05-17 20:28:17923 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
924 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
925 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
926 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28927}
928
[email protected]5db452202014-08-19 05:22:15929TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
930 MockRead reads[] = {
931 MockRead(ASYNC, OK, 0) // EOF
932 };
rtennetibe635732014-10-02 22:51:42933 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
934 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15935 socket_factory_.AddSocketDataProvider(&socket_data1);
936 socket_factory_.AddSocketDataProvider(&socket_data2);
937 socket_data1.StopAfter(1);
938 socket_data2.StopAfter(1);
939
940 HostPortPair server1("www.example.org", 443);
941 HostPortPair server2("mail.example.org", 443);
942 uint8 primary_pin = 1;
943 uint8 backup_pin = 2;
944 uint8 bad_pin = 3;
945 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
946 backup_pin);
947
bncf8bf0722015-05-19 20:04:13948 ProofVerifyDetailsChromium verify_details1 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01949 verify_details1.cert_verify_result.public_key_hashes.push_back(
950 test::GetTestHashValue(bad_pin));
951 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
952
bncf8bf0722015-05-19 20:04:13953 ProofVerifyDetailsChromium verify_details2 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01954 verify_details2.cert_verify_result.public_key_hashes.push_back(
955 test::GetTestHashValue(primary_pin));
956 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
[email protected]5db452202014-08-19 05:22:15957
958 host_resolver_.set_synchronous_mode(true);
959 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
960 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
961
962 QuicStreamRequest request(&factory_);
963 is_https_ = true;
964 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48965 request.Request(server1, is_https_, privacy_mode_, server1.host(),
966 "GET", net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15967 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
968 EXPECT_TRUE(stream.get());
969
970 TestCompletionCallback callback;
971 QuicStreamRequest request2(&factory_);
972 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48973 request2.Request(server2, is_https_, privacy_mode_, server2.host(),
974 "GET", net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15975 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
976 EXPECT_TRUE(stream2.get());
977
978 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
979 &factory_, server1, is_https_),
980 QuicStreamFactoryPeer::GetActiveSession(
981 &factory_, server2, is_https_));
982
rch37de576c2015-05-17 20:28:17983 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
984 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
985 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
986 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:15987}
988
[email protected]1e960032013-12-20 19:00:20989TEST_P(QuicStreamFactoryTest, Goaway) {
[email protected]4d283b32013-10-17 12:57:27990 MockRead reads[] = {
991 MockRead(ASYNC, OK, 0) // EOF
992 };
rtennetibe635732014-10-02 22:51:42993 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:27994 socket_data.StopAfter(1);
995 socket_factory_.AddSocketDataProvider(&socket_data);
rtennetibe635732014-10-02 22:51:42996 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:27997 socket_data2.StopAfter(1);
998 socket_factory_.AddSocketDataProvider(&socket_data2);
999
1000 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591001 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481002 request.Request(host_port_pair_, is_https_, privacy_mode_,
1003 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591004 callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271005
1006 EXPECT_EQ(OK, callback_.WaitForResult());
1007 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1008 EXPECT_TRUE(stream.get());
1009
1010 // Mark the session as going away. Ensure that while it is still alive
1011 // that it is no longer active.
1012 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:531013 &factory_, host_port_pair_, is_https_);
[email protected]4d283b32013-10-17 12:57:271014 factory_.OnSessionGoingAway(session);
1015 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
[email protected]df157d9d2014-03-10 07:27:271016 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:531017 &factory_, host_port_pair_, is_https_));
bnccb7ff3c2015-05-21 20:51:551018 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]4d283b32013-10-17 12:57:271019
1020 // Create a new request for the same destination and verify that a
1021 // new session is created.
1022 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591023 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481024 request2.Request(host_port_pair_, is_https_, privacy_mode_,
1025 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591026 callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271027 EXPECT_EQ(OK, callback_.WaitForResult());
1028 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1029 EXPECT_TRUE(stream2.get());
1030
1031 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(&factory_,
[email protected]bf4ea2f2014-03-10 22:57:531032 host_port_pair_,
[email protected]df157d9d2014-03-10 07:27:271033 is_https_));
[email protected]4d283b32013-10-17 12:57:271034 EXPECT_NE(session,
1035 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:531036 &factory_, host_port_pair_, is_https_));
[email protected]4d283b32013-10-17 12:57:271037 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
1038
1039 stream2.reset();
1040 stream.reset();
1041
rch37de576c2015-05-17 20:28:171042 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1043 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1044 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1045 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]4d283b32013-10-17 12:57:271046}
1047
[email protected]1e960032013-12-20 19:00:201048TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
[email protected]0b2294d32013-08-02 00:46:361049 MockRead reads[] = {
1050 MockRead(ASYNC, OK, 0) // EOF
1051 };
[email protected]66ae5962014-05-22 11:13:051052 QuicStreamId stream_id = kClientDataStreamId1;
[email protected]1e960032013-12-20 19:00:201053 scoped_ptr<QuicEncryptedPacket> rst(
1054 maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
[email protected]06ff5152013-08-29 01:03:051055 MockWrite writes[] = {
1056 MockWrite(ASYNC, rst->data(), rst->length(), 1),
1057 };
1058 DeterministicSocketData socket_data(reads, arraysize(reads),
1059 writes, arraysize(writes));
[email protected]0b2294d32013-08-02 00:46:361060 socket_factory_.AddSocketDataProvider(&socket_data);
1061 socket_data.StopAfter(1);
1062
1063 HttpRequestInfo request_info;
1064 std::vector<QuicHttpStream*> streams;
1065 // The MockCryptoClientStream sets max_open_streams to be
rtenneti6a4cf3b2015-01-09 03:41:151066 // kDefaultMaxStreamsPerConnection / 2.
1067 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection / 2; i++) {
[email protected]0b2294d32013-08-02 00:46:361068 QuicStreamRequest request(&factory_);
bnc68d401dd2015-05-18 20:31:481069 int rv = request.Request(host_port_pair_, is_https_, privacy_mode_,
1070 host_port_pair_.host(), "GET", net_log_,
[email protected]0b2294d32013-08-02 00:46:361071 callback_.callback());
1072 if (i == 0) {
1073 EXPECT_EQ(ERR_IO_PENDING, rv);
1074 EXPECT_EQ(OK, callback_.WaitForResult());
1075 } else {
1076 EXPECT_EQ(OK, rv);
1077 }
1078 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1079 EXPECT_TRUE(stream);
1080 EXPECT_EQ(OK, stream->InitializeStream(
1081 &request_info, DEFAULT_PRIORITY, net_log_, CompletionCallback()));
1082 streams.push_back(stream.release());
1083 }
1084
1085 QuicStreamRequest request(&factory_);
bnc68d401dd2015-05-18 20:31:481086 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
1087 host_port_pair_.host(), "GET", net_log_,
1088 CompletionCallback()));
[email protected]0b2294d32013-08-02 00:46:361089 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1090 EXPECT_TRUE(stream);
1091 EXPECT_EQ(ERR_IO_PENDING, stream->InitializeStream(
1092 &request_info, DEFAULT_PRIORITY, net_log_, callback_.callback()));
1093
1094 // Close the first stream.
1095 streams.front()->Close(false);
1096
1097 ASSERT_TRUE(callback_.have_result());
1098
1099 EXPECT_EQ(OK, callback_.WaitForResult());
1100
rch37de576c2015-05-17 20:28:171101 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1102 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]0b2294d32013-08-02 00:46:361103 STLDeleteElements(&streams);
1104}
1105
[email protected]1e960032013-12-20 19:00:201106TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
rtennetibe635732014-10-02 22:51:421107 DeterministicSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321108 socket_factory_.AddSocketDataProvider(&socket_data);
1109
[email protected]3c772402013-12-18 21:38:111110 host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName);
[email protected]e13201d82012-12-12 05:00:321111
1112 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591113 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481114 request.Request(host_port_pair_, is_https_, privacy_mode_,
1115 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591116 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321117
1118 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
1119
rch37de576c2015-05-17 20:28:171120 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1121 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321122}
1123
[email protected]1e960032013-12-20 19:00:201124TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
[email protected]3c772402013-12-18 21:38:111125 MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
rtennetibe635732014-10-02 22:51:421126 DeterministicSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]3c772402013-12-18 21:38:111127 socket_data.set_connect_data(connect);
1128 socket_factory_.AddSocketDataProvider(&socket_data);
1129 socket_data.StopAfter(1);
1130
1131 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591132 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481133 request.Request(host_port_pair_, is_https_, privacy_mode_,
1134 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591135 callback_.callback()));
[email protected]3c772402013-12-18 21:38:111136
1137 EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult());
1138
rch37de576c2015-05-17 20:28:171139 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1140 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:111141}
1142
[email protected]1e960032013-12-20 19:00:201143TEST_P(QuicStreamFactoryTest, CancelCreate) {
[email protected]69dfd1b2013-06-04 22:20:121144 MockRead reads[] = {
[email protected]25c31dc2013-06-05 17:56:041145 MockRead(ASYNC, OK, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121146 };
rtennetibe635732014-10-02 22:51:421147 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321148 socket_factory_.AddSocketDataProvider(&socket_data);
1149 {
1150 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591151 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481152 request.Request(host_port_pair_, is_https_, privacy_mode_,
1153 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591154 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321155 }
1156
[email protected]25c31dc2013-06-05 17:56:041157 socket_data.StopAfter(1);
[email protected]e13201d82012-12-12 05:00:321158 base::RunLoop run_loop;
1159 run_loop.RunUntilIdle();
1160
bnccb7ff3c2015-05-21 20:51:551161 scoped_ptr<QuicHttpStream> stream(CreateFromSession(host_port_pair_));
[email protected]e13201d82012-12-12 05:00:321162 EXPECT_TRUE(stream.get());
1163 stream.reset();
1164
rch37de576c2015-05-17 20:28:171165 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1166 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321167}
1168
[email protected]1e960032013-12-20 19:00:201169TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) {
[email protected]3c772402013-12-18 21:38:111170 // Sequentially connect to the default host, then another host, and then the
1171 // default host. Verify that the default host gets a consistent ephemeral
1172 // port, that is different from the other host's connection.
1173
1174 std::string other_server_name = "other.google.com";
1175 EXPECT_NE(kDefaultServerHostName, other_server_name);
1176 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort);
[email protected]3c772402013-12-18 21:38:111177
[email protected]bf4ea2f2014-03-10 22:57:531178 int original_port = GetSourcePortForNewSession(host_port_pair_);
1179 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2));
1180 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]3c772402013-12-18 21:38:111181}
1182
[email protected]d8e2abf82014-03-06 10:30:101183TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) {
1184 // Get a session to the host using the port suggester.
1185 int original_port =
[email protected]bf4ea2f2014-03-10 22:57:531186 GetSourcePortForNewSessionAndGoAway(host_port_pair_);
[email protected]d8e2abf82014-03-06 10:30:101187 // Verify that the port is different after the goaway.
[email protected]bf4ea2f2014-03-10 22:57:531188 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101189 // Since the previous session did not goaway we should see the original port.
[email protected]bf4ea2f2014-03-10 22:57:531190 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101191}
1192
[email protected]1e960032013-12-20 19:00:201193TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
[email protected]56dfb902013-01-03 23:17:551194 MockRead reads[] = {
[email protected]0edce6a2013-05-08 18:02:401195 MockRead(ASYNC, 0, 0) // EOF
[email protected]56dfb902013-01-03 23:17:551196 };
[email protected]459a7402014-02-10 12:58:521197 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1198 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311199 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521200 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421201 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521202 writes.size());
[email protected]56dfb902013-01-03 23:17:551203 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0edce6a2013-05-08 18:02:401204 socket_data.StopAfter(1);
[email protected]56dfb902013-01-03 23:17:551205
[email protected]69dfd1b2013-06-04 22:20:121206 MockRead reads2[] = {
[email protected]25c31dc2013-06-05 17:56:041207 MockRead(ASYNC, 0, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121208 };
rtennetibe635732014-10-02 22:51:421209 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]56dfb902013-01-03 23:17:551210 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]0edce6a2013-05-08 18:02:401211 socket_data2.StopAfter(1);
[email protected]56dfb902013-01-03 23:17:551212
1213 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591214 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481215 request.Request(host_port_pair_, is_https_, privacy_mode_,
1216 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591217 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551218
1219 EXPECT_EQ(OK, callback_.WaitForResult());
1220 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361221 HttpRequestInfo request_info;
1222 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1223 DEFAULT_PRIORITY,
1224 net_log_, CompletionCallback()));
[email protected]56dfb902013-01-03 23:17:551225
1226 // Close the session and verify that stream saw the error.
1227 factory_.CloseAllSessions(ERR_INTERNET_DISCONNECTED);
1228 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1229 stream->ReadResponseHeaders(callback_.callback()));
1230
1231 // Now attempting to request a stream to the same origin should create
1232 // a new session.
1233
1234 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591235 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481236 request2.Request(host_port_pair_, is_https_, privacy_mode_,
1237 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591238 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551239
1240 EXPECT_EQ(OK, callback_.WaitForResult());
1241 stream = request2.ReleaseStream();
1242 stream.reset(); // Will reset stream 3.
1243
rch37de576c2015-05-17 20:28:171244 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1245 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1246 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1247 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]56dfb902013-01-03 23:17:551248}
1249
[email protected]1e960032013-12-20 19:00:201250TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
[email protected]f698a012013-05-06 20:18:591251 MockRead reads[] = {
[email protected]0edce6a2013-05-08 18:02:401252 MockRead(ASYNC, 0, 0) // EOF
[email protected]f698a012013-05-06 20:18:591253 };
[email protected]459a7402014-02-10 12:58:521254 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1255 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311256 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521257 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421258 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521259 writes.size());
[email protected]f698a012013-05-06 20:18:591260 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0edce6a2013-05-08 18:02:401261 socket_data.StopAfter(1);
[email protected]f698a012013-05-06 20:18:591262
[email protected]69dfd1b2013-06-04 22:20:121263 MockRead reads2[] = {
[email protected]25c31dc2013-06-05 17:56:041264 MockRead(ASYNC, 0, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121265 };
rtennetibe635732014-10-02 22:51:421266 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]f698a012013-05-06 20:18:591267 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]0edce6a2013-05-08 18:02:401268 socket_data2.StopAfter(1);
[email protected]f698a012013-05-06 20:18:591269
1270 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591271 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481272 request.Request(host_port_pair_, is_https_, privacy_mode_,
1273 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591274 callback_.callback()));
[email protected]f698a012013-05-06 20:18:591275
1276 EXPECT_EQ(OK, callback_.WaitForResult());
1277 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361278 HttpRequestInfo request_info;
1279 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1280 DEFAULT_PRIORITY,
1281 net_log_, CompletionCallback()));
[email protected]f698a012013-05-06 20:18:591282
1283 // Change the IP address and verify that stream saw the error.
1284 factory_.OnIPAddressChanged();
1285 EXPECT_EQ(ERR_NETWORK_CHANGED,
1286 stream->ReadResponseHeaders(callback_.callback()));
[email protected]11c05872013-08-20 02:04:121287 EXPECT_TRUE(factory_.require_confirmation());
[email protected]f698a012013-05-06 20:18:591288
1289 // Now attempting to request a stream to the same origin should create
1290 // a new session.
1291
1292 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591293 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481294 request2.Request(host_port_pair_, is_https_, privacy_mode_,
1295 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591296 callback_.callback()));
[email protected]f698a012013-05-06 20:18:591297
1298 EXPECT_EQ(OK, callback_.WaitForResult());
1299 stream = request2.ReleaseStream();
1300 stream.reset(); // Will reset stream 3.
1301
rch37de576c2015-05-17 20:28:171302 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1303 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1304 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1305 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]f698a012013-05-06 20:18:591306}
1307
[email protected]1e960032013-12-20 19:00:201308TEST_P(QuicStreamFactoryTest, OnCertAdded) {
[email protected]d7d1e50b2013-11-25 22:08:091309 MockRead reads[] = {
1310 MockRead(ASYNC, 0, 0) // EOF
1311 };
[email protected]459a7402014-02-10 12:58:521312 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1313 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311314 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521315 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421316 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521317 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:091318 socket_factory_.AddSocketDataProvider(&socket_data);
1319 socket_data.StopAfter(1);
1320
1321 MockRead reads2[] = {
1322 MockRead(ASYNC, 0, 0) // EOF
1323 };
rtennetibe635732014-10-02 22:51:421324 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:091325 socket_factory_.AddSocketDataProvider(&socket_data2);
1326 socket_data2.StopAfter(1);
1327
1328 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591329 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481330 request.Request(host_port_pair_, is_https_, privacy_mode_,
1331 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591332 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091333
1334 EXPECT_EQ(OK, callback_.WaitForResult());
1335 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1336 HttpRequestInfo request_info;
1337 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1338 DEFAULT_PRIORITY,
1339 net_log_, CompletionCallback()));
1340
1341 // Add a cert and verify that stream saw the event.
rtennetibe635732014-10-02 22:51:421342 factory_.OnCertAdded(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:091343 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1344 stream->ReadResponseHeaders(callback_.callback()));
1345 EXPECT_FALSE(factory_.require_confirmation());
1346
1347 // Now attempting to request a stream to the same origin should create
1348 // a new session.
1349
1350 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591351 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481352 request2.Request(host_port_pair_, is_https_, privacy_mode_,
1353 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591354 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091355
1356 EXPECT_EQ(OK, callback_.WaitForResult());
1357 stream = request2.ReleaseStream();
1358 stream.reset(); // Will reset stream 3.
1359
rch37de576c2015-05-17 20:28:171360 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1361 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1362 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1363 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:091364}
1365
[email protected]1e960032013-12-20 19:00:201366TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
[email protected]d7d1e50b2013-11-25 22:08:091367 MockRead reads[] = {
1368 MockRead(ASYNC, 0, 0) // EOF
1369 };
[email protected]459a7402014-02-10 12:58:521370 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1371 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311372 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521373 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421374 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521375 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:091376 socket_factory_.AddSocketDataProvider(&socket_data);
1377 socket_data.StopAfter(1);
1378
1379 MockRead reads2[] = {
1380 MockRead(ASYNC, 0, 0) // EOF
1381 };
rtennetibe635732014-10-02 22:51:421382 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:091383 socket_factory_.AddSocketDataProvider(&socket_data2);
1384 socket_data2.StopAfter(1);
1385
1386 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591387 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481388 request.Request(host_port_pair_, is_https_, privacy_mode_,
1389 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591390 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091391
1392 EXPECT_EQ(OK, callback_.WaitForResult());
1393 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1394 HttpRequestInfo request_info;
1395 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1396 DEFAULT_PRIORITY,
1397 net_log_, CompletionCallback()));
1398
1399 // Change the CA cert and verify that stream saw the event.
rtennetibe635732014-10-02 22:51:421400 factory_.OnCACertChanged(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:091401 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1402 stream->ReadResponseHeaders(callback_.callback()));
1403 EXPECT_FALSE(factory_.require_confirmation());
1404
1405 // Now attempting to request a stream to the same origin should create
1406 // a new session.
1407
1408 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591409 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481410 request2.Request(host_port_pair_, is_https_, privacy_mode_,
1411 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591412 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091413
1414 EXPECT_EQ(OK, callback_.WaitForResult());
1415 stream = request2.ReleaseStream();
1416 stream.reset(); // Will reset stream 3.
1417
rch37de576c2015-05-17 20:28:171418 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1419 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1420 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1421 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:091422}
1423
[email protected]1e960032013-12-20 19:00:201424TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
[email protected]6e12d702013-11-13 00:17:171425 vector<string> cannoncial_suffixes;
1426 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1427 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]c49ff182013-09-28 08:33:261428
[email protected]6e12d702013-11-13 00:17:171429 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1430 string r1_host_name("r1");
1431 string r2_host_name("r2");
1432 r1_host_name.append(cannoncial_suffixes[i]);
1433 r2_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141434
[email protected]bf4ea2f2014-03-10 22:57:531435 HostPortPair host_port_pair1(r1_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121436 QuicCryptoClientConfig* crypto_config =
1437 QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
[email protected]257f24f2014-04-01 09:15:371438 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171439 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371440 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171441 EXPECT_FALSE(cached1->proof_valid());
1442 EXPECT_TRUE(cached1->source_address_token().empty());
1443
1444 // Mutate the cached1 to have different data.
1445 // TODO(rtenneti): mutate other members of CachedState.
1446 cached1->set_source_address_token(r1_host_name);
1447 cached1->SetProofValid();
1448
[email protected]bf4ea2f2014-03-10 22:57:531449 HostPortPair host_port_pair2(r2_host_name, 80);
[email protected]257f24f2014-04-01 09:15:371450 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171451 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371452 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171453 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
1454 EXPECT_TRUE(cached2->proof_valid());
1455 }
[email protected]b70fdb792013-10-25 19:04:141456}
1457
[email protected]1e960032013-12-20 19:00:201458TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
[email protected]6e12d702013-11-13 00:17:171459 vector<string> cannoncial_suffixes;
1460 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1461 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]b70fdb792013-10-25 19:04:141462
[email protected]6e12d702013-11-13 00:17:171463 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1464 string r3_host_name("r3");
1465 string r4_host_name("r4");
1466 r3_host_name.append(cannoncial_suffixes[i]);
1467 r4_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141468
[email protected]bf4ea2f2014-03-10 22:57:531469 HostPortPair host_port_pair1(r3_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121470 QuicCryptoClientConfig* crypto_config =
1471 QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
[email protected]257f24f2014-04-01 09:15:371472 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171473 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371474 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171475 EXPECT_FALSE(cached1->proof_valid());
1476 EXPECT_TRUE(cached1->source_address_token().empty());
1477
1478 // Mutate the cached1 to have different data.
1479 // TODO(rtenneti): mutate other members of CachedState.
1480 cached1->set_source_address_token(r3_host_name);
1481 cached1->SetProofInvalid();
1482
[email protected]bf4ea2f2014-03-10 22:57:531483 HostPortPair host_port_pair2(r4_host_name, 80);
[email protected]257f24f2014-04-01 09:15:371484 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171485 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371486 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171487 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
1488 EXPECT_TRUE(cached2->source_address_token().empty());
1489 EXPECT_FALSE(cached2->proof_valid());
1490 }
[email protected]c49ff182013-09-28 08:33:261491}
1492
rtenneti14abd312015-02-06 21:56:011493TEST_P(QuicStreamFactoryTest, RacingConnections) {
1494 if (!GetParam().enable_connection_racing)
1495 return;
1496 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
1497 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
rtenneti14abd312015-02-06 21:56:011498 MockRead reads[] = {
1499 MockRead(ASYNC, OK, 0) // EOF
1500 };
1501 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1502 socket_factory_.AddSocketDataProvider(&socket_data);
1503 socket_data.StopAfter(1);
1504
1505 MockRead reads2[] = {
1506 MockRead(ASYNC, 0, 0) // EOF
1507 };
1508 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1509 socket_factory_.AddSocketDataProvider(&socket_data2);
1510 socket_data2.StopAfter(1);
1511
1512 crypto_client_stream_factory_.set_handshake_mode(
1513 MockCryptoClientStream::ZERO_RTT);
1514 host_resolver_.set_synchronous_mode(true);
1515 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1516 "192.168.0.1", "");
1517
1518 QuicStreamRequest request(&factory_);
1519 QuicServerId server_id(host_port_pair_, is_https_, privacy_mode_);
1520 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481521 request.Request(host_port_pair_, is_https_, privacy_mode_,
1522 host_port_pair_.host(), "GET", net_log_,
1523 callback_.callback()));
rtenneti14abd312015-02-06 21:56:011524 EXPECT_EQ(2u,
1525 QuicStreamFactoryPeer::GetNumberOfActiveJobs(&factory_, server_id));
1526
1527 runner_->RunNextTask();
1528
1529 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1530 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:171531 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1532 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti14abd312015-02-06 21:56:011533 EXPECT_EQ(0u,
1534 QuicStreamFactoryPeer::GetNumberOfActiveJobs(&factory_, server_id));
1535}
1536
rtenneti34dffe752015-02-24 23:27:321537TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) {
1538 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
1539 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
rtenneti34dffe752015-02-24 23:27:321540 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_, true);
1541
1542 MockRead reads[] = {
1543 MockRead(ASYNC, OK, 0) // EOF
1544 };
1545 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1546 socket_factory_.AddSocketDataProvider(&socket_data);
1547 socket_data.StopAfter(1);
1548
1549 crypto_client_stream_factory_.set_handshake_mode(
1550 MockCryptoClientStream::ZERO_RTT);
1551 host_resolver_.set_synchronous_mode(true);
1552 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1553 "192.168.0.1", "");
1554
1555 QuicStreamRequest request(&factory_);
1556 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
bnc68d401dd2015-05-18 20:31:481557 host_port_pair_.host(), "GET", net_log_,
1558 callback_.callback()));
rtenneti34dffe752015-02-24 23:27:321559
1560 // If we are waiting for disk cache, we would have posted a task. Verify that
1561 // the CancelWaitForDataReady task hasn't been posted.
1562 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
1563
1564 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1565 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:171566 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1567 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti34dffe752015-02-24 23:27:321568}
1569
rtenneti85dcfac22015-03-27 20:22:191570TEST_P(QuicStreamFactoryTest, BadPacketLoss) {
1571 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
1572 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
1573 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_, true);
1574 QuicStreamFactoryPeer::SetMaxNumberOfLossyConnections(&factory_, 2);
1575 EXPECT_FALSE(
1576 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
1577 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1578 &factory_, host_port_pair_.port()));
1579
1580 MockRead reads[] = {
1581 MockRead(ASYNC, OK, 0) // EOF
1582 };
1583 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1584 socket_factory_.AddSocketDataProvider(&socket_data);
1585 socket_data.StopAfter(1);
1586
rtenneti97137a92015-06-18 06:00:311587 DeterministicSocketData socket_data2(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:191588 socket_factory_.AddSocketDataProvider(&socket_data2);
1589 socket_data2.StopAfter(1);
1590
rtenneti97137a92015-06-18 06:00:311591 DeterministicSocketData socket_data3(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:191592 socket_factory_.AddSocketDataProvider(&socket_data3);
1593 socket_data3.StopAfter(1);
1594
rtenneti97137a92015-06-18 06:00:311595 DeterministicSocketData socket_data4(nullptr, 0, nullptr, 0);
1596 socket_factory_.AddSocketDataProvider(&socket_data4);
1597 socket_data4.StopAfter(1);
1598
rtenneti85dcfac22015-03-27 20:22:191599 HostPortPair server2("mail.example.org", kDefaultServerPort);
1600 HostPortPair server3("docs.example.org", kDefaultServerPort);
rtenneti97137a92015-06-18 06:00:311601 HostPortPair server4("images.example.org", kDefaultServerPort);
rtenneti85dcfac22015-03-27 20:22:191602
1603 crypto_client_stream_factory_.set_handshake_mode(
1604 MockCryptoClientStream::ZERO_RTT);
1605 host_resolver_.set_synchronous_mode(true);
1606 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1607 "192.168.0.1", "");
1608 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1609 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
rtenneti97137a92015-06-18 06:00:311610 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
rtenneti85dcfac22015-03-27 20:22:191611
1612 QuicStreamRequest request(&factory_);
1613 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
bnc68d401dd2015-05-18 20:31:481614 host_port_pair_.host(), "GET", net_log_,
1615 callback_.callback()));
rtenneti85dcfac22015-03-27 20:22:191616
1617 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
1618 &factory_, host_port_pair_, is_https_);
1619
1620 DVLOG(1) << "Create 1st session and test packet loss";
1621
1622 // Set packet_loss_rate to a lower value than packet_loss_threshold.
1623 EXPECT_FALSE(
1624 factory_.OnHandshakeConfirmed(session, /*packet_loss_rate=*/0.9f));
rtenneti41633b1f2015-04-05 18:19:531625 EXPECT_TRUE(session->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:191626 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(
1627 &factory_, host_port_pair_, is_https_));
1628 EXPECT_FALSE(
1629 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
1630 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1631 &factory_, host_port_pair_.port()));
1632
1633 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:311634 // and that shouldn't close the session and it shouldn't disable QUIC.
1635 EXPECT_FALSE(
rtenneti85dcfac22015-03-27 20:22:191636 factory_.OnHandshakeConfirmed(session, /*packet_loss_rate=*/1.0f));
1637 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1638 &factory_, host_port_pair_.port()));
rtenneti97137a92015-06-18 06:00:311639 EXPECT_TRUE(session->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:191640 EXPECT_FALSE(
1641 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
rtenneti97137a92015-06-18 06:00:311642 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(
rtenneti85dcfac22015-03-27 20:22:191643 &factory_, host_port_pair_, is_https_));
rtenneti85dcfac22015-03-27 20:22:191644
1645 // Test N-in-a-row high packet loss connections.
1646
1647 DVLOG(1) << "Create 2nd session and test packet loss";
1648
1649 TestCompletionCallback callback2;
1650 QuicStreamRequest request2(&factory_);
bnc68d401dd2015-05-18 20:31:481651 EXPECT_EQ(OK,
1652 request2.Request(server2, is_https_, privacy_mode_, server2.host(),
1653 "GET", net_log_, callback2.callback()));
rtenneti85dcfac22015-03-27 20:22:191654 QuicClientSession* session2 =
1655 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_);
1656
1657 // If there is no packet loss during handshake confirmation, number of lossy
1658 // connections for the port should be 0.
1659 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1660 &factory_, server2.port()));
1661 EXPECT_FALSE(
1662 factory_.OnHandshakeConfirmed(session2, /*packet_loss_rate=*/0.9f));
1663 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1664 &factory_, server2.port()));
1665 EXPECT_FALSE(
1666 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, server2.port()));
1667
1668 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:311669 // and that shouldn't close the session and it shouldn't disable QUIC.
1670 EXPECT_FALSE(
rtenneti85dcfac22015-03-27 20:22:191671 factory_.OnHandshakeConfirmed(session2, /*packet_loss_rate=*/1.0f));
1672 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1673 &factory_, server2.port()));
rtenneti97137a92015-06-18 06:00:311674 EXPECT_TRUE(session2->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:191675 EXPECT_FALSE(
1676 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, server2.port()));
rtenneti97137a92015-06-18 06:00:311677 EXPECT_TRUE(
rtenneti85dcfac22015-03-27 20:22:191678 QuicStreamFactoryPeer::HasActiveSession(&factory_, server2, is_https_));
rtenneti85dcfac22015-03-27 20:22:191679
1680 DVLOG(1) << "Create 3rd session which also has packet loss";
1681
1682 TestCompletionCallback callback3;
1683 QuicStreamRequest request3(&factory_);
bnc68d401dd2015-05-18 20:31:481684 EXPECT_EQ(OK,
1685 request3.Request(server3, is_https_, privacy_mode_, server3.host(),
1686 "GET", net_log_, callback3.callback()));
rtenneti85dcfac22015-03-27 20:22:191687 QuicClientSession* session3 =
1688 QuicStreamFactoryPeer::GetActiveSession(&factory_, server3, is_https_);
1689
rtenneti97137a92015-06-18 06:00:311690 DVLOG(1) << "Create 4th session with packet loss and test IsQuicDisabled()";
1691 TestCompletionCallback callback4;
1692 QuicStreamRequest request4(&factory_);
1693 EXPECT_EQ(OK,
1694 request4.Request(server4, is_https_, privacy_mode_, server4.host(),
1695 "GET", net_log_, callback4.callback()));
1696 QuicClientSession* session4 =
1697 QuicStreamFactoryPeer::GetActiveSession(&factory_, server4, is_https_);
1698
rtenneti85dcfac22015-03-27 20:22:191699 // Set packet_loss_rate to higher value than packet_loss_threshold 2nd time in
1700 // a row and that should close the session and disable QUIC.
1701 EXPECT_TRUE(
1702 factory_.OnHandshakeConfirmed(session3, /*packet_loss_rate=*/1.0f));
1703 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1704 &factory_, server3.port()));
rtenneti97137a92015-06-18 06:00:311705 EXPECT_FALSE(session3->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:191706 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(&factory_, server3.port()));
1707 EXPECT_FALSE(
1708 QuicStreamFactoryPeer::HasActiveSession(&factory_, server3, is_https_));
bnccb7ff3c2015-05-21 20:51:551709 EXPECT_FALSE(HasActiveSession(server3));
rtenneti85dcfac22015-03-27 20:22:191710
rtenneti97137a92015-06-18 06:00:311711 // Set packet_loss_rate to higher value than packet_loss_threshold 3rd time in
1712 // a row and IsQuicDisabled() should close the session.
1713 EXPECT_TRUE(
1714 factory_.OnHandshakeConfirmed(session4, /*packet_loss_rate=*/1.0f));
1715 EXPECT_EQ(3, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1716 &factory_, server4.port()));
1717 EXPECT_FALSE(session4->connection()->connected());
1718 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(&factory_, server4.port()));
1719 EXPECT_FALSE(
1720 QuicStreamFactoryPeer::HasActiveSession(&factory_, server4, is_https_));
1721 EXPECT_FALSE(HasActiveSession(server4));
1722
rtenneti85dcfac22015-03-27 20:22:191723 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1724 EXPECT_TRUE(stream.get());
1725 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1726 EXPECT_TRUE(stream2.get());
1727 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
1728 EXPECT_TRUE(stream3.get());
rtenneti97137a92015-06-18 06:00:311729 scoped_ptr<QuicHttpStream> stream4 = request4.ReleaseStream();
1730 EXPECT_TRUE(stream4.get());
rch37de576c2015-05-17 20:28:171731 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1732 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1733 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1734 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1735 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
1736 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
rtenneti97137a92015-06-18 06:00:311737 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
1738 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
rtenneti85dcfac22015-03-27 20:22:191739}
1740
[email protected]e13201d82012-12-12 05:00:321741} // namespace test
[email protected]e13201d82012-12-12 05:00:321742} // namespace net