blob: 195e410ff72517f6ee587ffc27ad0eae6460a58c [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_,
rtennetia75df622015-06-21 23:59:50273 /*cert_verify_flags=*/0, destination.host(),
274 "GET", net_log_, 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_,
rtennetia75df622015-06-21 23:59:50358 /*cert_verify_flags=*/0, host_port_pair_.host(),
359 "GET", net_log_, 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_);
rtennetia75df622015-06-21 23:59:50372 EXPECT_EQ(OK,
373 request2.Request(host_port_pair_, is_https_, privacy_mode_,
374 /*cert_verify_flags=*/0, host_port_pair_.host(),
375 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32376 stream = request2.ReleaseStream(); // Will reset stream 5.
377 stream.reset(); // Will reset stream 7.
378
rch37de576c2015-05-17 20:28:17379 EXPECT_TRUE(socket_data.AllReadDataConsumed());
380 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:32381}
382
[email protected]8bd2b812014-03-26 04:01:17383TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
384 MockRead reads[] = {
385 MockRead(ASYNC, OK, 0) // EOF
386 };
rtennetibe635732014-10-02 22:51:42387 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17388 socket_factory_.AddSocketDataProvider(&socket_data);
389 socket_data.StopAfter(1);
390
391 crypto_client_stream_factory_.set_handshake_mode(
392 MockCryptoClientStream::ZERO_RTT);
393 host_resolver_.set_synchronous_mode(true);
394 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
395 "192.168.0.1", "");
396
397 QuicStreamRequest request(&factory_);
bnc68d401dd2015-05-18 20:31:48398 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50399 /*cert_verify_flags=*/0, host_port_pair_.host(),
400 "GET", net_log_, callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17401
402 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
403 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17404 EXPECT_TRUE(socket_data.AllReadDataConsumed());
405 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17406}
407
408TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
409 MockRead reads[] = {
410 MockRead(ASYNC, OK, 0) // EOF
411 };
rtennetibe635732014-10-02 22:51:42412 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17413 socket_factory_.AddSocketDataProvider(&socket_data);
414 socket_data.StopAfter(1);
415
416 crypto_client_stream_factory_.set_handshake_mode(
417 MockCryptoClientStream::ZERO_RTT);
418 host_resolver_.set_synchronous_mode(true);
419 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
420 "192.168.0.1", "");
421
422 QuicStreamRequest request(&factory_);
423 // Posts require handshake confirmation, so this will return asynchronously.
424 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:48425 request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50426 /*cert_verify_flags=*/0, host_port_pair_.host(),
427 "POST", net_log_, callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17428
429 // Confirm the handshake and verify that the stream is created.
430 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
431 QuicSession::HANDSHAKE_CONFIRMED);
432
433 EXPECT_EQ(OK, callback_.WaitForResult());
434 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
435 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17436 EXPECT_TRUE(socket_data.AllReadDataConsumed());
437 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17438}
439
bnc68d401dd2015-05-18 20:31:48440TEST_P(QuicStreamFactoryTest, NoZeroRttForDifferentHost) {
441 MockRead reads[] = {
442 MockRead(ASYNC, OK, 0),
443 };
444 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
445 socket_factory_.AddSocketDataProvider(&socket_data);
446 socket_data.StopAfter(1);
447
448 crypto_client_stream_factory_.set_handshake_mode(
449 MockCryptoClientStream::ZERO_RTT);
450 host_resolver_.set_synchronous_mode(true);
451 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
452 "192.168.0.1", "");
453
454 QuicStreamRequest request(&factory_);
rtennetia75df622015-06-21 23:59:50455 int rv = request.Request(
456 host_port_pair_, is_https_, privacy_mode_, /*cert_verify_flags=*/0,
457 "different.host.example.com", "GET", net_log_, callback_.callback());
bnc68d401dd2015-05-18 20:31:48458 // If server and origin have different hostnames, then handshake confirmation
459 // should be required, so Request will return asynchronously.
460 EXPECT_EQ(ERR_IO_PENDING, rv);
461 // Confirm handshake.
462 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
463 QuicSession::HANDSHAKE_CONFIRMED);
464 EXPECT_EQ(OK, callback_.WaitForResult());
465
466 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
467 EXPECT_TRUE(stream.get());
468 EXPECT_TRUE(socket_data.AllReadDataConsumed());
469 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
470}
471
[email protected]df157d9d2014-03-10 07:27:27472TEST_P(QuicStreamFactoryTest, CreateHttpVsHttps) {
473 MockRead reads[] = {
474 MockRead(ASYNC, OK, 0) // EOF
475 };
rtennetibe635732014-10-02 22:51:42476 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
477 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]df157d9d2014-03-10 07:27:27478 socket_factory_.AddSocketDataProvider(&socket_data1);
479 socket_factory_.AddSocketDataProvider(&socket_data2);
480 socket_data1.StopAfter(1);
481 socket_data2.StopAfter(1);
482
483 QuicStreamRequest request(&factory_);
484 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:48485 request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50486 /*cert_verify_flags=*/0, host_port_pair_.host(),
487 "GET", net_log_, callback_.callback()));
[email protected]df157d9d2014-03-10 07:27:27488
489 EXPECT_EQ(OK, callback_.WaitForResult());
490 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
491 EXPECT_TRUE(stream.get());
492
493 QuicStreamRequest request2(&factory_);
494 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:48495 request2.Request(host_port_pair_, !is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50496 /*cert_verify_flags=*/0, host_port_pair_.host(),
497 "GET", net_log_, callback_.callback()));
[email protected]df157d9d2014-03-10 07:27:27498 EXPECT_EQ(OK, callback_.WaitForResult());
499 stream = request2.ReleaseStream();
500 EXPECT_TRUE(stream.get());
501 stream.reset();
502
503 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53504 &factory_, host_port_pair_, is_https_),
[email protected]df157d9d2014-03-10 07:27:27505 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53506 &factory_, host_port_pair_, !is_https_));
[email protected]df157d9d2014-03-10 07:27:27507
rch37de576c2015-05-17 20:28:17508 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
509 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
510 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
511 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]df157d9d2014-03-10 07:27:27512}
513
[email protected]5db452202014-08-19 05:22:15514TEST_P(QuicStreamFactoryTest, Pooling) {
[email protected]eed749f92013-12-23 18:57:38515 MockRead reads[] = {
516 MockRead(ASYNC, OK, 0) // EOF
517 };
rtennetibe635732014-10-02 22:51:42518 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38519 socket_factory_.AddSocketDataProvider(&socket_data);
520 socket_data.StopAfter(1);
521
[email protected]bf4ea2f2014-03-10 22:57:53522 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38523 host_resolver_.set_synchronous_mode(true);
524 host_resolver_.rules()->AddIPLiteralRule(
525 kDefaultServerHostName, "192.168.0.1", "");
526 host_resolver_.rules()->AddIPLiteralRule(
527 "mail.google.com", "192.168.0.1", "");
528
529 QuicStreamRequest request(&factory_);
bnc68d401dd2015-05-18 20:31:48530 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50531 /*cert_verify_flags=*/0, host_port_pair_.host(),
532 "GET", net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38533 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
534 EXPECT_TRUE(stream.get());
535
536 TestCompletionCallback callback;
537 QuicStreamRequest request2(&factory_);
rtennetia75df622015-06-21 23:59:50538 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
539 /*cert_verify_flags=*/0, server2.host(), "GET",
540 net_log_, callback.callback()));
[email protected]eed749f92013-12-23 18:57:38541 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
542 EXPECT_TRUE(stream2.get());
543
544 EXPECT_EQ(
[email protected]df157d9d2014-03-10 07:27:27545 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53546 &factory_, host_port_pair_, is_https_),
[email protected]df157d9d2014-03-10 07:27:27547 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38548
rch37de576c2015-05-17 20:28:17549 EXPECT_TRUE(socket_data.AllReadDataConsumed());
550 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38551}
552
jri584002d12014-09-09 00:51:28553TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) {
554 MockRead reads[] = {
555 MockRead(ASYNC, OK, 0) // EOF
556 };
rtennetibe635732014-10-02 22:51:42557 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
558 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28559 socket_factory_.AddSocketDataProvider(&socket_data1);
560 socket_factory_.AddSocketDataProvider(&socket_data2);
561 socket_data1.StopAfter(1);
562 socket_data2.StopAfter(1);
563
564 HostPortPair server2("mail.google.com", kDefaultServerPort);
565 host_resolver_.set_synchronous_mode(true);
566 host_resolver_.rules()->AddIPLiteralRule(
567 kDefaultServerHostName, "192.168.0.1", "");
568 host_resolver_.rules()->AddIPLiteralRule(
569 "mail.google.com", "192.168.0.1", "");
570
571 // Disable connection pooling.
572 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
573
574 QuicStreamRequest request(&factory_);
bnc68d401dd2015-05-18 20:31:48575 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50576 /*cert_verify_flags=*/0, host_port_pair_.host(),
577 "GET", net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28578 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
579 EXPECT_TRUE(stream.get());
580
581 TestCompletionCallback callback;
582 QuicStreamRequest request2(&factory_);
rtennetia75df622015-06-21 23:59:50583 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
584 /*cert_verify_flags=*/0, server2.host(), "GET",
585 net_log_, callback.callback()));
jri584002d12014-09-09 00:51:28586 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
587 EXPECT_TRUE(stream2.get());
588
589 EXPECT_NE(
590 QuicStreamFactoryPeer::GetActiveSession(
591 &factory_, host_port_pair_, is_https_),
592 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_));
593
rch37de576c2015-05-17 20:28:17594 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
595 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
596 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
597 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28598}
599
[email protected]eed749f92013-12-23 18:57:38600TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
601 MockRead reads[] = {
602 MockRead(ASYNC, OK, 0) // EOF
603 };
rtennetibe635732014-10-02 22:51:42604 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
605 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38606 socket_factory_.AddSocketDataProvider(&socket_data1);
607 socket_factory_.AddSocketDataProvider(&socket_data2);
608 socket_data1.StopAfter(1);
609 socket_data2.StopAfter(1);
610
[email protected]bf4ea2f2014-03-10 22:57:53611 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38612 host_resolver_.set_synchronous_mode(true);
613 host_resolver_.rules()->AddIPLiteralRule(
614 kDefaultServerHostName, "192.168.0.1", "");
615 host_resolver_.rules()->AddIPLiteralRule(
616 "mail.google.com", "192.168.0.1", "");
617
618 QuicStreamRequest request(&factory_);
bnc68d401dd2015-05-18 20:31:48619 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50620 /*cert_verify_flags=*/0, host_port_pair_.host(),
621 "GET", net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38622 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
623 EXPECT_TRUE(stream.get());
624
625 TestCompletionCallback callback;
626 QuicStreamRequest request2(&factory_);
rtennetia75df622015-06-21 23:59:50627 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
628 /*cert_verify_flags=*/0, server2.host(), "GET",
629 net_log_, callback.callback()));
[email protected]eed749f92013-12-23 18:57:38630 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
631 EXPECT_TRUE(stream2.get());
632
[email protected]df157d9d2014-03-10 07:27:27633 factory_.OnSessionGoingAway(QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53634 &factory_, host_port_pair_, is_https_));
[email protected]df157d9d2014-03-10 07:27:27635 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53636 &factory_, host_port_pair_, is_https_));
[email protected]df157d9d2014-03-10 07:27:27637 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
638 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38639
640 TestCompletionCallback callback3;
641 QuicStreamRequest request3(&factory_);
rtennetia75df622015-06-21 23:59:50642 EXPECT_EQ(OK, request3.Request(server2, is_https_, privacy_mode_,
643 /*cert_verify_flags=*/0, server2.host(), "GET",
644 net_log_, callback3.callback()));
[email protected]eed749f92013-12-23 18:57:38645 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
646 EXPECT_TRUE(stream3.get());
647
[email protected]df157d9d2014-03-10 07:27:27648 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(
649 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38650
rch37de576c2015-05-17 20:28:17651 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
652 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
653 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
654 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38655}
656
[email protected]5db452202014-08-19 05:22:15657TEST_P(QuicStreamFactoryTest, HttpsPooling) {
[email protected]eed749f92013-12-23 18:57:38658 MockRead reads[] = {
659 MockRead(ASYNC, OK, 0) // EOF
660 };
rtennetibe635732014-10-02 22:51:42661 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38662 socket_factory_.AddSocketDataProvider(&socket_data);
663 socket_data.StopAfter(1);
664
[email protected]bf4ea2f2014-03-10 22:57:53665 HostPortPair server1("www.example.org", 443);
666 HostPortPair server2("mail.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38667
bncf8bf0722015-05-19 20:04:13668 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01669 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38670
671 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53672 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
673 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38674
675 QuicStreamRequest request(&factory_);
676 is_https_ = true;
rtennetia75df622015-06-21 23:59:50677 EXPECT_EQ(OK, request.Request(server1, is_https_, privacy_mode_,
678 /*cert_verify_flags=*/0, server1.host(), "GET",
679 net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38680 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
681 EXPECT_TRUE(stream.get());
682
683 TestCompletionCallback callback;
684 QuicStreamRequest request2(&factory_);
rtennetia75df622015-06-21 23:59:50685 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
686 /*cert_verify_flags=*/0, server2.host(), "GET",
687 net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38688 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
689 EXPECT_TRUE(stream2.get());
690
[email protected]df157d9d2014-03-10 07:27:27691 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
692 &factory_, server1, is_https_),
693 QuicStreamFactoryPeer::GetActiveSession(
694 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38695
rch37de576c2015-05-17 20:28:17696 EXPECT_TRUE(socket_data.AllReadDataConsumed());
697 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38698}
699
jri584002d12014-09-09 00:51:28700TEST_P(QuicStreamFactoryTest, NoHttpsPoolingIfDisabled) {
701 MockRead reads[] = {
702 MockRead(ASYNC, OK, 0) // EOF
703 };
rtennetibe635732014-10-02 22:51:42704 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
705 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28706 socket_factory_.AddSocketDataProvider(&socket_data1);
707 socket_factory_.AddSocketDataProvider(&socket_data2);
708 socket_data1.StopAfter(1);
709 socket_data2.StopAfter(1);
710
711 HostPortPair server1("www.example.org", 443);
712 HostPortPair server2("mail.example.org", 443);
713
bncf8bf0722015-05-19 20:04:13714 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01715 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28716
717 host_resolver_.set_synchronous_mode(true);
718 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
719 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
720
721 // Disable connection pooling.
722 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
723
724 QuicStreamRequest request(&factory_);
725 is_https_ = true;
rtennetia75df622015-06-21 23:59:50726 EXPECT_EQ(OK, request.Request(server1, is_https_, privacy_mode_,
727 /*cert_verify_flags=*/0, server1.host(), "GET",
728 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28729 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
730 EXPECT_TRUE(stream.get());
731
732 TestCompletionCallback callback;
733 QuicStreamRequest request2(&factory_);
rtennetia75df622015-06-21 23:59:50734 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
735 /*cert_verify_flags=*/0, server2.host(), "GET",
736 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28737 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
738 EXPECT_TRUE(stream2.get());
739
740 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
741 &factory_, server1, is_https_),
742 QuicStreamFactoryPeer::GetActiveSession(
743 &factory_, server2, is_https_));
744
rch37de576c2015-05-17 20:28:17745 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
746 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
747 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
748 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28749}
750
bnccb7ff3c2015-05-21 20:51:55751class QuicAlternativeServiceCertificateValidationPooling
752 : public QuicStreamFactoryTest {
753 public:
754 void Run(bool valid) {
755 MockRead reads[] = {
756 MockRead(ASYNC, OK, 0) // EOF
757 };
758 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
759 socket_factory_.AddSocketDataProvider(&socket_data1);
760 socket_data1.StopAfter(1);
[email protected]eed749f92013-12-23 18:57:38761
bnccb7ff3c2015-05-21 20:51:55762 HostPortPair server1("www.example.org", 443);
763 HostPortPair server2("mail.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38764
bnccb7ff3c2015-05-21 20:51:55765 std::string origin_host(valid ? "mail.example.org" : "invalid.example.org");
766 HostPortPair alternative("www.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38767
bnccb7ff3c2015-05-21 20:51:55768 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
769 bool common_name_fallback_used;
770 EXPECT_EQ(valid,
771 verify_details.cert_verify_result.verified_cert->VerifyNameMatch(
772 origin_host, &common_name_fallback_used));
773 EXPECT_TRUE(
774 verify_details.cert_verify_result.verified_cert->VerifyNameMatch(
775 alternative.host(), &common_name_fallback_used));
776 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38777
bnccb7ff3c2015-05-21 20:51:55778 host_resolver_.set_synchronous_mode(true);
779 host_resolver_.rules()->AddIPLiteralRule(alternative.host(), "192.168.0.1",
780 "");
[email protected]eed749f92013-12-23 18:57:38781
bnccb7ff3c2015-05-21 20:51:55782 // Open first stream to alternative.
783 QuicStreamRequest request1(&factory_);
784 is_https_ = true;
785 EXPECT_EQ(OK, request1.Request(alternative, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50786 /*cert_verify_flags=*/0, alternative.host(),
787 "GET", net_log_, callback_.callback()));
bnccb7ff3c2015-05-21 20:51:55788 scoped_ptr<QuicHttpStream> stream1 = request1.ReleaseStream();
789 EXPECT_TRUE(stream1.get());
[email protected]eed749f92013-12-23 18:57:38790
bnccb7ff3c2015-05-21 20:51:55791 QuicStreamRequest request2(&factory_);
rtennetia75df622015-06-21 23:59:50792 int rv = request2.Request(alternative, is_https_, privacy_mode_,
793 /*cert_verify_flags=*/0, origin_host, "GET",
794 net_log_, callback_.callback());
bnccb7ff3c2015-05-21 20:51:55795 if (valid) {
796 // Alternative service of origin to |alternative| should pool to session
797 // of |stream1| even if origin is different. Since only one
798 // SocketDataProvider is set up, the second request succeeding means that
799 // it pooled to the session opened by the first one.
800 EXPECT_EQ(OK, rv);
801 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
802 EXPECT_TRUE(stream2.get());
803 } else {
804 EXPECT_EQ(ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN, rv);
805 }
[email protected]eed749f92013-12-23 18:57:38806
bnccb7ff3c2015-05-21 20:51:55807 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
808 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
809 }
810};
811
812INSTANTIATE_TEST_CASE_P(Version,
813 QuicAlternativeServiceCertificateValidationPooling,
814 ::testing::ValuesIn(GetTestParams()));
815
816TEST_P(QuicAlternativeServiceCertificateValidationPooling, Valid) {
817 Run(true);
818}
819
820TEST_P(QuicAlternativeServiceCertificateValidationPooling, Invalid) {
821 Run(false);
[email protected]eed749f92013-12-23 18:57:38822}
823
[email protected]5db452202014-08-19 05:22:15824TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
825 MockRead reads[] = {
826 MockRead(ASYNC, OK, 0) // EOF
827 };
rtennetibe635732014-10-02 22:51:42828 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15829 socket_factory_.AddSocketDataProvider(&socket_data);
830 socket_data.StopAfter(1);
831
832 HostPortPair server1("www.example.org", 443);
833 HostPortPair server2("mail.example.org", 443);
834 uint8 primary_pin = 1;
835 uint8 backup_pin = 2;
836 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
837 backup_pin);
838
bncf8bf0722015-05-19 20:04:13839 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
[email protected]5db452202014-08-19 05:22:15840 verify_details.cert_verify_result.public_key_hashes.push_back(
841 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01842 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]5db452202014-08-19 05:22:15843
844 host_resolver_.set_synchronous_mode(true);
845 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
846 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
847
848 QuicStreamRequest request(&factory_);
849 is_https_ = true;
rtennetia75df622015-06-21 23:59:50850 EXPECT_EQ(OK, request.Request(server1, is_https_, privacy_mode_,
851 /*cert_verify_flags=*/0, server1.host(), "GET",
852 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15853 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
854 EXPECT_TRUE(stream.get());
855
856 TestCompletionCallback callback;
857 QuicStreamRequest request2(&factory_);
rtennetia75df622015-06-21 23:59:50858 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
859 /*cert_verify_flags=*/0, server2.host(), "GET",
860 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15861 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
862 EXPECT_TRUE(stream2.get());
863
864 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
865 &factory_, server1, is_https_),
866 QuicStreamFactoryPeer::GetActiveSession(
867 &factory_, server2, is_https_));
868
rch37de576c2015-05-17 20:28:17869 EXPECT_TRUE(socket_data.AllReadDataConsumed());
870 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:15871}
872
jri584002d12014-09-09 00:51:28873TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithMatchingPinsIfDisabled) {
874 MockRead reads[] = {
875 MockRead(ASYNC, OK, 0) // EOF
876 };
rtennetibe635732014-10-02 22:51:42877 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
878 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28879 socket_factory_.AddSocketDataProvider(&socket_data1);
880 socket_factory_.AddSocketDataProvider(&socket_data2);
881 socket_data1.StopAfter(1);
882 socket_data2.StopAfter(1);
883
884 HostPortPair server1("www.example.org", 443);
885 HostPortPair server2("mail.example.org", 443);
886 uint8 primary_pin = 1;
887 uint8 backup_pin = 2;
888 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
889 backup_pin);
890
bncf8bf0722015-05-19 20:04:13891 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
jri584002d12014-09-09 00:51:28892 verify_details.cert_verify_result.public_key_hashes.push_back(
893 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01894 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28895
896 host_resolver_.set_synchronous_mode(true);
897 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
898 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
899
900 // Disable connection pooling.
901 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
902
903 QuicStreamRequest request(&factory_);
904 is_https_ = true;
rtennetia75df622015-06-21 23:59:50905 EXPECT_EQ(OK, request.Request(server1, is_https_, privacy_mode_,
906 /*cert_verify_flags=*/0, server1.host(), "GET",
907 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28908 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
909 EXPECT_TRUE(stream.get());
910
911 TestCompletionCallback callback;
912 QuicStreamRequest request2(&factory_);
rtennetia75df622015-06-21 23:59:50913 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
914 /*cert_verify_flags=*/0, server2.host(), "GET",
915 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28916 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
917 EXPECT_TRUE(stream2.get());
918
919 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
920 &factory_, server1, is_https_),
921 QuicStreamFactoryPeer::GetActiveSession(
922 &factory_, server2, is_https_));
923
rch37de576c2015-05-17 20:28:17924 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
925 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
926 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
927 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28928}
929
[email protected]5db452202014-08-19 05:22:15930TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
931 MockRead reads[] = {
932 MockRead(ASYNC, OK, 0) // EOF
933 };
rtennetibe635732014-10-02 22:51:42934 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
935 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15936 socket_factory_.AddSocketDataProvider(&socket_data1);
937 socket_factory_.AddSocketDataProvider(&socket_data2);
938 socket_data1.StopAfter(1);
939 socket_data2.StopAfter(1);
940
941 HostPortPair server1("www.example.org", 443);
942 HostPortPair server2("mail.example.org", 443);
943 uint8 primary_pin = 1;
944 uint8 backup_pin = 2;
945 uint8 bad_pin = 3;
946 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
947 backup_pin);
948
bncf8bf0722015-05-19 20:04:13949 ProofVerifyDetailsChromium verify_details1 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01950 verify_details1.cert_verify_result.public_key_hashes.push_back(
951 test::GetTestHashValue(bad_pin));
952 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
953
bncf8bf0722015-05-19 20:04:13954 ProofVerifyDetailsChromium verify_details2 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01955 verify_details2.cert_verify_result.public_key_hashes.push_back(
956 test::GetTestHashValue(primary_pin));
957 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
[email protected]5db452202014-08-19 05:22:15958
959 host_resolver_.set_synchronous_mode(true);
960 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
961 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
962
963 QuicStreamRequest request(&factory_);
964 is_https_ = true;
rtennetia75df622015-06-21 23:59:50965 EXPECT_EQ(OK, request.Request(server1, is_https_, privacy_mode_,
966 /*cert_verify_flags=*/0, server1.host(), "GET",
967 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15968 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
969 EXPECT_TRUE(stream.get());
970
971 TestCompletionCallback callback;
972 QuicStreamRequest request2(&factory_);
rtennetia75df622015-06-21 23:59:50973 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
974 /*cert_verify_flags=*/0, server2.host(), "GET",
975 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15976 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
977 EXPECT_TRUE(stream2.get());
978
979 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
980 &factory_, server1, is_https_),
981 QuicStreamFactoryPeer::GetActiveSession(
982 &factory_, server2, is_https_));
983
rch37de576c2015-05-17 20:28:17984 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
985 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
986 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
987 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:15988}
989
[email protected]1e960032013-12-20 19:00:20990TEST_P(QuicStreamFactoryTest, Goaway) {
[email protected]4d283b32013-10-17 12:57:27991 MockRead reads[] = {
992 MockRead(ASYNC, OK, 0) // EOF
993 };
rtennetibe635732014-10-02 22:51:42994 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:27995 socket_data.StopAfter(1);
996 socket_factory_.AddSocketDataProvider(&socket_data);
rtennetibe635732014-10-02 22:51:42997 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:27998 socket_data2.StopAfter(1);
999 socket_factory_.AddSocketDataProvider(&socket_data2);
1000
1001 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591002 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481003 request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501004 /*cert_verify_flags=*/0, host_port_pair_.host(),
1005 "GET", net_log_, callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271006
1007 EXPECT_EQ(OK, callback_.WaitForResult());
1008 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1009 EXPECT_TRUE(stream.get());
1010
1011 // Mark the session as going away. Ensure that while it is still alive
1012 // that it is no longer active.
1013 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:531014 &factory_, host_port_pair_, is_https_);
[email protected]4d283b32013-10-17 12:57:271015 factory_.OnSessionGoingAway(session);
1016 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
[email protected]df157d9d2014-03-10 07:27:271017 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:531018 &factory_, host_port_pair_, is_https_));
bnccb7ff3c2015-05-21 20:51:551019 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]4d283b32013-10-17 12:57:271020
1021 // Create a new request for the same destination and verify that a
1022 // new session is created.
1023 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591024 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481025 request2.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501026 /*cert_verify_flags=*/0, host_port_pair_.host(),
1027 "GET", net_log_, callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271028 EXPECT_EQ(OK, callback_.WaitForResult());
1029 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1030 EXPECT_TRUE(stream2.get());
1031
1032 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(&factory_,
[email protected]bf4ea2f2014-03-10 22:57:531033 host_port_pair_,
[email protected]df157d9d2014-03-10 07:27:271034 is_https_));
[email protected]4d283b32013-10-17 12:57:271035 EXPECT_NE(session,
1036 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:531037 &factory_, host_port_pair_, is_https_));
[email protected]4d283b32013-10-17 12:57:271038 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
1039
1040 stream2.reset();
1041 stream.reset();
1042
rch37de576c2015-05-17 20:28:171043 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1044 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1045 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1046 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]4d283b32013-10-17 12:57:271047}
1048
[email protected]1e960032013-12-20 19:00:201049TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
[email protected]0b2294d32013-08-02 00:46:361050 MockRead reads[] = {
1051 MockRead(ASYNC, OK, 0) // EOF
1052 };
[email protected]66ae5962014-05-22 11:13:051053 QuicStreamId stream_id = kClientDataStreamId1;
[email protected]1e960032013-12-20 19:00:201054 scoped_ptr<QuicEncryptedPacket> rst(
1055 maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
[email protected]06ff5152013-08-29 01:03:051056 MockWrite writes[] = {
1057 MockWrite(ASYNC, rst->data(), rst->length(), 1),
1058 };
1059 DeterministicSocketData socket_data(reads, arraysize(reads),
1060 writes, arraysize(writes));
[email protected]0b2294d32013-08-02 00:46:361061 socket_factory_.AddSocketDataProvider(&socket_data);
1062 socket_data.StopAfter(1);
1063
1064 HttpRequestInfo request_info;
1065 std::vector<QuicHttpStream*> streams;
1066 // The MockCryptoClientStream sets max_open_streams to be
rtenneti6a4cf3b2015-01-09 03:41:151067 // kDefaultMaxStreamsPerConnection / 2.
1068 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection / 2; i++) {
[email protected]0b2294d32013-08-02 00:46:361069 QuicStreamRequest request(&factory_);
bnc68d401dd2015-05-18 20:31:481070 int rv = request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501071 /*cert_verify_flags=*/0, host_port_pair_.host(),
1072 "GET", net_log_, callback_.callback());
[email protected]0b2294d32013-08-02 00:46:361073 if (i == 0) {
1074 EXPECT_EQ(ERR_IO_PENDING, rv);
1075 EXPECT_EQ(OK, callback_.WaitForResult());
1076 } else {
1077 EXPECT_EQ(OK, rv);
1078 }
1079 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1080 EXPECT_TRUE(stream);
1081 EXPECT_EQ(OK, stream->InitializeStream(
1082 &request_info, DEFAULT_PRIORITY, net_log_, CompletionCallback()));
1083 streams.push_back(stream.release());
1084 }
1085
1086 QuicStreamRequest request(&factory_);
bnc68d401dd2015-05-18 20:31:481087 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501088 /*cert_verify_flags=*/0, host_port_pair_.host(),
1089 "GET", net_log_, CompletionCallback()));
[email protected]0b2294d32013-08-02 00:46:361090 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1091 EXPECT_TRUE(stream);
1092 EXPECT_EQ(ERR_IO_PENDING, stream->InitializeStream(
1093 &request_info, DEFAULT_PRIORITY, net_log_, callback_.callback()));
1094
1095 // Close the first stream.
1096 streams.front()->Close(false);
1097
1098 ASSERT_TRUE(callback_.have_result());
1099
1100 EXPECT_EQ(OK, callback_.WaitForResult());
1101
rch37de576c2015-05-17 20:28:171102 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1103 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]0b2294d32013-08-02 00:46:361104 STLDeleteElements(&streams);
1105}
1106
[email protected]1e960032013-12-20 19:00:201107TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
rtennetibe635732014-10-02 22:51:421108 DeterministicSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321109 socket_factory_.AddSocketDataProvider(&socket_data);
1110
[email protected]3c772402013-12-18 21:38:111111 host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName);
[email protected]e13201d82012-12-12 05:00:321112
1113 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591114 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481115 request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501116 /*cert_verify_flags=*/0, host_port_pair_.host(),
1117 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321118
1119 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
1120
rch37de576c2015-05-17 20:28:171121 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1122 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321123}
1124
[email protected]1e960032013-12-20 19:00:201125TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
[email protected]3c772402013-12-18 21:38:111126 MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
rtennetibe635732014-10-02 22:51:421127 DeterministicSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]3c772402013-12-18 21:38:111128 socket_data.set_connect_data(connect);
1129 socket_factory_.AddSocketDataProvider(&socket_data);
1130 socket_data.StopAfter(1);
1131
1132 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591133 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481134 request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501135 /*cert_verify_flags=*/0, host_port_pair_.host(),
1136 "GET", net_log_, callback_.callback()));
[email protected]3c772402013-12-18 21:38:111137
1138 EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult());
1139
rch37de576c2015-05-17 20:28:171140 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1141 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:111142}
1143
[email protected]1e960032013-12-20 19:00:201144TEST_P(QuicStreamFactoryTest, CancelCreate) {
[email protected]69dfd1b2013-06-04 22:20:121145 MockRead reads[] = {
[email protected]25c31dc2013-06-05 17:56:041146 MockRead(ASYNC, OK, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121147 };
rtennetibe635732014-10-02 22:51:421148 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321149 socket_factory_.AddSocketDataProvider(&socket_data);
1150 {
1151 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591152 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481153 request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501154 /*cert_verify_flags=*/0, host_port_pair_.host(),
1155 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321156 }
1157
[email protected]25c31dc2013-06-05 17:56:041158 socket_data.StopAfter(1);
[email protected]e13201d82012-12-12 05:00:321159 base::RunLoop run_loop;
1160 run_loop.RunUntilIdle();
1161
bnccb7ff3c2015-05-21 20:51:551162 scoped_ptr<QuicHttpStream> stream(CreateFromSession(host_port_pair_));
[email protected]e13201d82012-12-12 05:00:321163 EXPECT_TRUE(stream.get());
1164 stream.reset();
1165
rch37de576c2015-05-17 20:28:171166 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1167 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321168}
1169
[email protected]1e960032013-12-20 19:00:201170TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) {
[email protected]3c772402013-12-18 21:38:111171 // Sequentially connect to the default host, then another host, and then the
1172 // default host. Verify that the default host gets a consistent ephemeral
1173 // port, that is different from the other host's connection.
1174
1175 std::string other_server_name = "other.google.com";
1176 EXPECT_NE(kDefaultServerHostName, other_server_name);
1177 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort);
[email protected]3c772402013-12-18 21:38:111178
[email protected]bf4ea2f2014-03-10 22:57:531179 int original_port = GetSourcePortForNewSession(host_port_pair_);
1180 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2));
1181 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]3c772402013-12-18 21:38:111182}
1183
[email protected]d8e2abf82014-03-06 10:30:101184TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) {
1185 // Get a session to the host using the port suggester.
1186 int original_port =
[email protected]bf4ea2f2014-03-10 22:57:531187 GetSourcePortForNewSessionAndGoAway(host_port_pair_);
[email protected]d8e2abf82014-03-06 10:30:101188 // Verify that the port is different after the goaway.
[email protected]bf4ea2f2014-03-10 22:57:531189 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101190 // Since the previous session did not goaway we should see the original port.
[email protected]bf4ea2f2014-03-10 22:57:531191 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101192}
1193
[email protected]1e960032013-12-20 19:00:201194TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
[email protected]56dfb902013-01-03 23:17:551195 MockRead reads[] = {
[email protected]0edce6a2013-05-08 18:02:401196 MockRead(ASYNC, 0, 0) // EOF
[email protected]56dfb902013-01-03 23:17:551197 };
[email protected]459a7402014-02-10 12:58:521198 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1199 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311200 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521201 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421202 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521203 writes.size());
[email protected]56dfb902013-01-03 23:17:551204 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0edce6a2013-05-08 18:02:401205 socket_data.StopAfter(1);
[email protected]56dfb902013-01-03 23:17:551206
[email protected]69dfd1b2013-06-04 22:20:121207 MockRead reads2[] = {
[email protected]25c31dc2013-06-05 17:56:041208 MockRead(ASYNC, 0, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121209 };
rtennetibe635732014-10-02 22:51:421210 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]56dfb902013-01-03 23:17:551211 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]0edce6a2013-05-08 18:02:401212 socket_data2.StopAfter(1);
[email protected]56dfb902013-01-03 23:17:551213
1214 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591215 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481216 request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501217 /*cert_verify_flags=*/0, host_port_pair_.host(),
1218 "GET", net_log_, callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551219
1220 EXPECT_EQ(OK, callback_.WaitForResult());
1221 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361222 HttpRequestInfo request_info;
1223 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1224 DEFAULT_PRIORITY,
1225 net_log_, CompletionCallback()));
[email protected]56dfb902013-01-03 23:17:551226
1227 // Close the session and verify that stream saw the error.
1228 factory_.CloseAllSessions(ERR_INTERNET_DISCONNECTED);
1229 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1230 stream->ReadResponseHeaders(callback_.callback()));
1231
1232 // Now attempting to request a stream to the same origin should create
1233 // a new session.
1234
1235 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591236 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481237 request2.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501238 /*cert_verify_flags=*/0, host_port_pair_.host(),
1239 "GET", net_log_, callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551240
1241 EXPECT_EQ(OK, callback_.WaitForResult());
1242 stream = request2.ReleaseStream();
1243 stream.reset(); // Will reset stream 3.
1244
rch37de576c2015-05-17 20:28:171245 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1246 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1247 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1248 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]56dfb902013-01-03 23:17:551249}
1250
[email protected]1e960032013-12-20 19:00:201251TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
[email protected]f698a012013-05-06 20:18:591252 MockRead reads[] = {
[email protected]0edce6a2013-05-08 18:02:401253 MockRead(ASYNC, 0, 0) // EOF
[email protected]f698a012013-05-06 20:18:591254 };
[email protected]459a7402014-02-10 12:58:521255 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1256 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311257 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521258 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421259 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521260 writes.size());
[email protected]f698a012013-05-06 20:18:591261 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0edce6a2013-05-08 18:02:401262 socket_data.StopAfter(1);
[email protected]f698a012013-05-06 20:18:591263
[email protected]69dfd1b2013-06-04 22:20:121264 MockRead reads2[] = {
[email protected]25c31dc2013-06-05 17:56:041265 MockRead(ASYNC, 0, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121266 };
rtennetibe635732014-10-02 22:51:421267 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]f698a012013-05-06 20:18:591268 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]0edce6a2013-05-08 18:02:401269 socket_data2.StopAfter(1);
[email protected]f698a012013-05-06 20:18:591270
1271 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591272 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481273 request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501274 /*cert_verify_flags=*/0, host_port_pair_.host(),
1275 "GET", net_log_, callback_.callback()));
[email protected]f698a012013-05-06 20:18:591276
1277 EXPECT_EQ(OK, callback_.WaitForResult());
1278 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361279 HttpRequestInfo request_info;
1280 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1281 DEFAULT_PRIORITY,
1282 net_log_, CompletionCallback()));
[email protected]f698a012013-05-06 20:18:591283
1284 // Change the IP address and verify that stream saw the error.
1285 factory_.OnIPAddressChanged();
1286 EXPECT_EQ(ERR_NETWORK_CHANGED,
1287 stream->ReadResponseHeaders(callback_.callback()));
[email protected]11c05872013-08-20 02:04:121288 EXPECT_TRUE(factory_.require_confirmation());
[email protected]f698a012013-05-06 20:18:591289
1290 // Now attempting to request a stream to the same origin should create
1291 // a new session.
1292
1293 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591294 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481295 request2.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501296 /*cert_verify_flags=*/0, host_port_pair_.host(),
1297 "GET", net_log_, callback_.callback()));
[email protected]f698a012013-05-06 20:18:591298
1299 EXPECT_EQ(OK, callback_.WaitForResult());
1300 stream = request2.ReleaseStream();
1301 stream.reset(); // Will reset stream 3.
1302
rch37de576c2015-05-17 20:28:171303 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1304 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1305 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1306 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]f698a012013-05-06 20:18:591307}
1308
[email protected]1e960032013-12-20 19:00:201309TEST_P(QuicStreamFactoryTest, OnCertAdded) {
[email protected]d7d1e50b2013-11-25 22:08:091310 MockRead reads[] = {
1311 MockRead(ASYNC, 0, 0) // EOF
1312 };
[email protected]459a7402014-02-10 12:58:521313 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1314 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311315 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521316 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421317 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521318 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:091319 socket_factory_.AddSocketDataProvider(&socket_data);
1320 socket_data.StopAfter(1);
1321
1322 MockRead reads2[] = {
1323 MockRead(ASYNC, 0, 0) // EOF
1324 };
rtennetibe635732014-10-02 22:51:421325 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:091326 socket_factory_.AddSocketDataProvider(&socket_data2);
1327 socket_data2.StopAfter(1);
1328
1329 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591330 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481331 request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501332 /*cert_verify_flags=*/0, host_port_pair_.host(),
1333 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091334
1335 EXPECT_EQ(OK, callback_.WaitForResult());
1336 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1337 HttpRequestInfo request_info;
1338 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1339 DEFAULT_PRIORITY,
1340 net_log_, CompletionCallback()));
1341
1342 // Add a cert and verify that stream saw the event.
rtennetibe635732014-10-02 22:51:421343 factory_.OnCertAdded(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:091344 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1345 stream->ReadResponseHeaders(callback_.callback()));
1346 EXPECT_FALSE(factory_.require_confirmation());
1347
1348 // Now attempting to request a stream to the same origin should create
1349 // a new session.
1350
1351 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591352 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481353 request2.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501354 /*cert_verify_flags=*/0, host_port_pair_.host(),
1355 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091356
1357 EXPECT_EQ(OK, callback_.WaitForResult());
1358 stream = request2.ReleaseStream();
1359 stream.reset(); // Will reset stream 3.
1360
rch37de576c2015-05-17 20:28:171361 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1362 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1363 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1364 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:091365}
1366
[email protected]1e960032013-12-20 19:00:201367TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
[email protected]d7d1e50b2013-11-25 22:08:091368 MockRead reads[] = {
1369 MockRead(ASYNC, 0, 0) // EOF
1370 };
[email protected]459a7402014-02-10 12:58:521371 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1372 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311373 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521374 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421375 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521376 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:091377 socket_factory_.AddSocketDataProvider(&socket_data);
1378 socket_data.StopAfter(1);
1379
1380 MockRead reads2[] = {
1381 MockRead(ASYNC, 0, 0) // EOF
1382 };
rtennetibe635732014-10-02 22:51:421383 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:091384 socket_factory_.AddSocketDataProvider(&socket_data2);
1385 socket_data2.StopAfter(1);
1386
1387 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591388 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481389 request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501390 /*cert_verify_flags=*/0, host_port_pair_.host(),
1391 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091392
1393 EXPECT_EQ(OK, callback_.WaitForResult());
1394 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1395 HttpRequestInfo request_info;
1396 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1397 DEFAULT_PRIORITY,
1398 net_log_, CompletionCallback()));
1399
1400 // Change the CA cert and verify that stream saw the event.
rtennetibe635732014-10-02 22:51:421401 factory_.OnCACertChanged(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:091402 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1403 stream->ReadResponseHeaders(callback_.callback()));
1404 EXPECT_FALSE(factory_.require_confirmation());
1405
1406 // Now attempting to request a stream to the same origin should create
1407 // a new session.
1408
1409 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591410 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481411 request2.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501412 /*cert_verify_flags=*/0, host_port_pair_.host(),
1413 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091414
1415 EXPECT_EQ(OK, callback_.WaitForResult());
1416 stream = request2.ReleaseStream();
1417 stream.reset(); // Will reset stream 3.
1418
rch37de576c2015-05-17 20:28:171419 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1420 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1421 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1422 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:091423}
1424
[email protected]1e960032013-12-20 19:00:201425TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
[email protected]6e12d702013-11-13 00:17:171426 vector<string> cannoncial_suffixes;
1427 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1428 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]c49ff182013-09-28 08:33:261429
[email protected]6e12d702013-11-13 00:17:171430 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1431 string r1_host_name("r1");
1432 string r2_host_name("r2");
1433 r1_host_name.append(cannoncial_suffixes[i]);
1434 r2_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141435
[email protected]bf4ea2f2014-03-10 22:57:531436 HostPortPair host_port_pair1(r1_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121437 QuicCryptoClientConfig* crypto_config =
1438 QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
[email protected]257f24f2014-04-01 09:15:371439 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171440 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371441 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171442 EXPECT_FALSE(cached1->proof_valid());
1443 EXPECT_TRUE(cached1->source_address_token().empty());
1444
1445 // Mutate the cached1 to have different data.
1446 // TODO(rtenneti): mutate other members of CachedState.
1447 cached1->set_source_address_token(r1_host_name);
1448 cached1->SetProofValid();
1449
[email protected]bf4ea2f2014-03-10 22:57:531450 HostPortPair host_port_pair2(r2_host_name, 80);
[email protected]257f24f2014-04-01 09:15:371451 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171452 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371453 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171454 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
1455 EXPECT_TRUE(cached2->proof_valid());
1456 }
[email protected]b70fdb792013-10-25 19:04:141457}
1458
[email protected]1e960032013-12-20 19:00:201459TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
[email protected]6e12d702013-11-13 00:17:171460 vector<string> cannoncial_suffixes;
1461 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1462 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]b70fdb792013-10-25 19:04:141463
[email protected]6e12d702013-11-13 00:17:171464 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1465 string r3_host_name("r3");
1466 string r4_host_name("r4");
1467 r3_host_name.append(cannoncial_suffixes[i]);
1468 r4_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141469
[email protected]bf4ea2f2014-03-10 22:57:531470 HostPortPair host_port_pair1(r3_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121471 QuicCryptoClientConfig* crypto_config =
1472 QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
[email protected]257f24f2014-04-01 09:15:371473 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171474 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371475 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171476 EXPECT_FALSE(cached1->proof_valid());
1477 EXPECT_TRUE(cached1->source_address_token().empty());
1478
1479 // Mutate the cached1 to have different data.
1480 // TODO(rtenneti): mutate other members of CachedState.
1481 cached1->set_source_address_token(r3_host_name);
1482 cached1->SetProofInvalid();
1483
[email protected]bf4ea2f2014-03-10 22:57:531484 HostPortPair host_port_pair2(r4_host_name, 80);
[email protected]257f24f2014-04-01 09:15:371485 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171486 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371487 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171488 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
1489 EXPECT_TRUE(cached2->source_address_token().empty());
1490 EXPECT_FALSE(cached2->proof_valid());
1491 }
[email protected]c49ff182013-09-28 08:33:261492}
1493
rtenneti14abd312015-02-06 21:56:011494TEST_P(QuicStreamFactoryTest, RacingConnections) {
1495 if (!GetParam().enable_connection_racing)
1496 return;
1497 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
1498 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
rtenneti14abd312015-02-06 21:56:011499 MockRead reads[] = {
1500 MockRead(ASYNC, OK, 0) // EOF
1501 };
1502 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1503 socket_factory_.AddSocketDataProvider(&socket_data);
1504 socket_data.StopAfter(1);
1505
1506 MockRead reads2[] = {
1507 MockRead(ASYNC, 0, 0) // EOF
1508 };
1509 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1510 socket_factory_.AddSocketDataProvider(&socket_data2);
1511 socket_data2.StopAfter(1);
1512
1513 crypto_client_stream_factory_.set_handshake_mode(
1514 MockCryptoClientStream::ZERO_RTT);
1515 host_resolver_.set_synchronous_mode(true);
1516 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1517 "192.168.0.1", "");
1518
1519 QuicStreamRequest request(&factory_);
1520 QuicServerId server_id(host_port_pair_, is_https_, privacy_mode_);
1521 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481522 request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501523 /*cert_verify_flags=*/0, host_port_pair_.host(),
1524 "GET", net_log_, callback_.callback()));
rtenneti14abd312015-02-06 21:56:011525 EXPECT_EQ(2u,
1526 QuicStreamFactoryPeer::GetNumberOfActiveJobs(&factory_, server_id));
1527
1528 runner_->RunNextTask();
1529
1530 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1531 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:171532 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1533 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti14abd312015-02-06 21:56:011534 EXPECT_EQ(0u,
1535 QuicStreamFactoryPeer::GetNumberOfActiveJobs(&factory_, server_id));
1536}
1537
rtenneti34dffe752015-02-24 23:27:321538TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) {
1539 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
1540 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
rtenneti34dffe752015-02-24 23:27:321541 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_, true);
1542
1543 MockRead reads[] = {
1544 MockRead(ASYNC, OK, 0) // EOF
1545 };
1546 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1547 socket_factory_.AddSocketDataProvider(&socket_data);
1548 socket_data.StopAfter(1);
1549
1550 crypto_client_stream_factory_.set_handshake_mode(
1551 MockCryptoClientStream::ZERO_RTT);
1552 host_resolver_.set_synchronous_mode(true);
1553 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1554 "192.168.0.1", "");
1555
1556 QuicStreamRequest request(&factory_);
1557 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501558 /*cert_verify_flags=*/0, host_port_pair_.host(),
1559 "GET", net_log_, callback_.callback()));
rtenneti34dffe752015-02-24 23:27:321560
1561 // If we are waiting for disk cache, we would have posted a task. Verify that
1562 // the CancelWaitForDataReady task hasn't been posted.
1563 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
1564
1565 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1566 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:171567 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1568 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti34dffe752015-02-24 23:27:321569}
1570
rtenneti85dcfac22015-03-27 20:22:191571TEST_P(QuicStreamFactoryTest, BadPacketLoss) {
1572 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
1573 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
1574 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_, true);
1575 QuicStreamFactoryPeer::SetMaxNumberOfLossyConnections(&factory_, 2);
1576 EXPECT_FALSE(
1577 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
1578 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1579 &factory_, host_port_pair_.port()));
1580
1581 MockRead reads[] = {
1582 MockRead(ASYNC, OK, 0) // EOF
1583 };
1584 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1585 socket_factory_.AddSocketDataProvider(&socket_data);
1586 socket_data.StopAfter(1);
1587
rtenneti97137a92015-06-18 06:00:311588 DeterministicSocketData socket_data2(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:191589 socket_factory_.AddSocketDataProvider(&socket_data2);
1590 socket_data2.StopAfter(1);
1591
rtenneti97137a92015-06-18 06:00:311592 DeterministicSocketData socket_data3(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:191593 socket_factory_.AddSocketDataProvider(&socket_data3);
1594 socket_data3.StopAfter(1);
1595
rtenneti97137a92015-06-18 06:00:311596 DeterministicSocketData socket_data4(nullptr, 0, nullptr, 0);
1597 socket_factory_.AddSocketDataProvider(&socket_data4);
1598 socket_data4.StopAfter(1);
1599
rtenneti85dcfac22015-03-27 20:22:191600 HostPortPair server2("mail.example.org", kDefaultServerPort);
1601 HostPortPair server3("docs.example.org", kDefaultServerPort);
rtenneti97137a92015-06-18 06:00:311602 HostPortPair server4("images.example.org", kDefaultServerPort);
rtenneti85dcfac22015-03-27 20:22:191603
1604 crypto_client_stream_factory_.set_handshake_mode(
1605 MockCryptoClientStream::ZERO_RTT);
1606 host_resolver_.set_synchronous_mode(true);
1607 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1608 "192.168.0.1", "");
1609 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1610 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
rtenneti97137a92015-06-18 06:00:311611 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
rtenneti85dcfac22015-03-27 20:22:191612
1613 QuicStreamRequest request(&factory_);
1614 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501615 /*cert_verify_flags=*/0, host_port_pair_.host(),
1616 "GET", net_log_, callback_.callback()));
rtenneti85dcfac22015-03-27 20:22:191617
1618 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
1619 &factory_, host_port_pair_, is_https_);
1620
1621 DVLOG(1) << "Create 1st session and test packet loss";
1622
1623 // Set packet_loss_rate to a lower value than packet_loss_threshold.
1624 EXPECT_FALSE(
1625 factory_.OnHandshakeConfirmed(session, /*packet_loss_rate=*/0.9f));
rtenneti41633b1f2015-04-05 18:19:531626 EXPECT_TRUE(session->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:191627 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(
1628 &factory_, host_port_pair_, is_https_));
1629 EXPECT_FALSE(
1630 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
1631 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1632 &factory_, host_port_pair_.port()));
1633
1634 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:311635 // and that shouldn't close the session and it shouldn't disable QUIC.
1636 EXPECT_FALSE(
rtenneti85dcfac22015-03-27 20:22:191637 factory_.OnHandshakeConfirmed(session, /*packet_loss_rate=*/1.0f));
1638 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1639 &factory_, host_port_pair_.port()));
rtenneti97137a92015-06-18 06:00:311640 EXPECT_TRUE(session->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:191641 EXPECT_FALSE(
1642 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
rtenneti97137a92015-06-18 06:00:311643 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(
rtenneti85dcfac22015-03-27 20:22:191644 &factory_, host_port_pair_, is_https_));
rtenneti85dcfac22015-03-27 20:22:191645
1646 // Test N-in-a-row high packet loss connections.
1647
1648 DVLOG(1) << "Create 2nd session and test packet loss";
1649
1650 TestCompletionCallback callback2;
1651 QuicStreamRequest request2(&factory_);
rtennetia75df622015-06-21 23:59:501652 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
1653 /*cert_verify_flags=*/0, server2.host(), "GET",
1654 net_log_, callback2.callback()));
rtenneti85dcfac22015-03-27 20:22:191655 QuicClientSession* session2 =
1656 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_);
1657
1658 // If there is no packet loss during handshake confirmation, number of lossy
1659 // connections for the port should be 0.
1660 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1661 &factory_, server2.port()));
1662 EXPECT_FALSE(
1663 factory_.OnHandshakeConfirmed(session2, /*packet_loss_rate=*/0.9f));
1664 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1665 &factory_, server2.port()));
1666 EXPECT_FALSE(
1667 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, server2.port()));
1668
1669 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:311670 // and that shouldn't close the session and it shouldn't disable QUIC.
1671 EXPECT_FALSE(
rtenneti85dcfac22015-03-27 20:22:191672 factory_.OnHandshakeConfirmed(session2, /*packet_loss_rate=*/1.0f));
1673 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1674 &factory_, server2.port()));
rtenneti97137a92015-06-18 06:00:311675 EXPECT_TRUE(session2->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:191676 EXPECT_FALSE(
1677 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, server2.port()));
rtenneti97137a92015-06-18 06:00:311678 EXPECT_TRUE(
rtenneti85dcfac22015-03-27 20:22:191679 QuicStreamFactoryPeer::HasActiveSession(&factory_, server2, is_https_));
rtenneti85dcfac22015-03-27 20:22:191680
1681 DVLOG(1) << "Create 3rd session which also has packet loss";
1682
1683 TestCompletionCallback callback3;
1684 QuicStreamRequest request3(&factory_);
rtennetia75df622015-06-21 23:59:501685 EXPECT_EQ(OK, request3.Request(server3, is_https_, privacy_mode_,
1686 /*cert_verify_flags=*/0, server3.host(), "GET",
1687 net_log_, callback3.callback()));
rtenneti85dcfac22015-03-27 20:22:191688 QuicClientSession* session3 =
1689 QuicStreamFactoryPeer::GetActiveSession(&factory_, server3, is_https_);
1690
rtenneti97137a92015-06-18 06:00:311691 DVLOG(1) << "Create 4th session with packet loss and test IsQuicDisabled()";
1692 TestCompletionCallback callback4;
1693 QuicStreamRequest request4(&factory_);
rtennetia75df622015-06-21 23:59:501694 EXPECT_EQ(OK, request4.Request(server4, is_https_, privacy_mode_,
1695 /*cert_verify_flags=*/0, server4.host(), "GET",
1696 net_log_, callback4.callback()));
rtenneti97137a92015-06-18 06:00:311697 QuicClientSession* session4 =
1698 QuicStreamFactoryPeer::GetActiveSession(&factory_, server4, is_https_);
1699
rtenneti85dcfac22015-03-27 20:22:191700 // Set packet_loss_rate to higher value than packet_loss_threshold 2nd time in
1701 // a row and that should close the session and disable QUIC.
1702 EXPECT_TRUE(
1703 factory_.OnHandshakeConfirmed(session3, /*packet_loss_rate=*/1.0f));
1704 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1705 &factory_, server3.port()));
rtenneti97137a92015-06-18 06:00:311706 EXPECT_FALSE(session3->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:191707 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(&factory_, server3.port()));
1708 EXPECT_FALSE(
1709 QuicStreamFactoryPeer::HasActiveSession(&factory_, server3, is_https_));
bnccb7ff3c2015-05-21 20:51:551710 EXPECT_FALSE(HasActiveSession(server3));
rtenneti85dcfac22015-03-27 20:22:191711
rtenneti97137a92015-06-18 06:00:311712 // Set packet_loss_rate to higher value than packet_loss_threshold 3rd time in
1713 // a row and IsQuicDisabled() should close the session.
1714 EXPECT_TRUE(
1715 factory_.OnHandshakeConfirmed(session4, /*packet_loss_rate=*/1.0f));
1716 EXPECT_EQ(3, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1717 &factory_, server4.port()));
1718 EXPECT_FALSE(session4->connection()->connected());
1719 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(&factory_, server4.port()));
1720 EXPECT_FALSE(
1721 QuicStreamFactoryPeer::HasActiveSession(&factory_, server4, is_https_));
1722 EXPECT_FALSE(HasActiveSession(server4));
1723
rtenneti85dcfac22015-03-27 20:22:191724 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1725 EXPECT_TRUE(stream.get());
1726 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1727 EXPECT_TRUE(stream2.get());
1728 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
1729 EXPECT_TRUE(stream3.get());
rtenneti97137a92015-06-18 06:00:311730 scoped_ptr<QuicHttpStream> stream4 = request4.ReleaseStream();
1731 EXPECT_TRUE(stream4.get());
rch37de576c2015-05-17 20:28:171732 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1733 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1734 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1735 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1736 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
1737 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
rtenneti97137a92015-06-18 06:00:311738 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
1739 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
rtenneti85dcfac22015-03-27 20:22:191740}
1741
[email protected]e13201d82012-12-12 05:00:321742} // namespace test
[email protected]e13201d82012-12-12 05:00:321743} // namespace net