blob: 2e62d5ead4cef7b83f1d0a0d7321aa6f8d507db6 [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"
[email protected]eed749f92013-12-23 18:57:389#include "net/base/test_data_directory.h"
[email protected]6d1b4ed2013-07-10 03:57:5410#include "net/cert/cert_verifier.h"
[email protected]f2cb3cf2013-03-21 01:40:5311#include "net/dns/mock_host_resolver.h"
[email protected]e13201d82012-12-12 05:00:3212#include "net/http/http_response_headers.h"
13#include "net/http/http_response_info.h"
14#include "net/http/http_util.h"
[email protected]080b77932014-08-04 01:22:4615#include "net/http/transport_security_state.h"
[email protected]c49ff182013-09-28 08:33:2616#include "net/quic/crypto/crypto_handshake.h"
[email protected]b694e48c2014-03-18 17:10:1317#include "net/quic/crypto/proof_verifier_chromium.h"
[email protected]4df69842013-02-27 06:32:1618#include "net/quic/crypto/quic_decrypter.h"
19#include "net/quic/crypto/quic_encrypter.h"
rtenneti38f5cd52014-10-28 20:28:2820#include "net/quic/crypto/quic_server_info.h"
[email protected]e13201d82012-12-12 05:00:3221#include "net/quic/quic_http_stream.h"
[email protected]257f24f2014-04-01 09:15:3722#include "net/quic/quic_server_id.h"
[email protected]e13201d82012-12-12 05:00:3223#include "net/quic/test_tools/mock_clock.h"
[email protected]e8ff26842013-03-22 21:02:0524#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
[email protected]9558c5d32012-12-22 00:08:1425#include "net/quic/test_tools/mock_random.h"
[email protected]1e960032013-12-20 19:00:2026#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]e13201d82012-12-12 05:00:3227#include "net/quic/test_tools/quic_test_utils.h"
rtenneti38f5cd52014-10-28 20:28:2828#include "net/quic/test_tools/test_task_runner.h"
[email protected]e13201d82012-12-12 05:00:3229#include "net/socket/socket_test_util.h"
[email protected]5db452202014-08-19 05:22:1530#include "net/spdy/spdy_test_utils.h"
[email protected]6b8a3c742014-07-25 00:25:3531#include "net/ssl/channel_id_service.h"
32#include "net/ssl/default_channel_id_store.h"
[email protected]eed749f92013-12-23 18:57:3833#include "net/test/cert_test_util.h"
[email protected]e13201d82012-12-12 05:00:3234#include "testing/gtest/include/gtest/gtest.h"
35
[email protected]6e12d702013-11-13 00:17:1736using base::StringPiece;
rtenneti14abd312015-02-06 21:56:0137using std::ostream;
[email protected]6e12d702013-11-13 00:17:1738using std::string;
39using std::vector;
40
[email protected]e13201d82012-12-12 05:00:3241namespace net {
[email protected]e13201d82012-12-12 05:00:3242namespace test {
43
[email protected]3c772402013-12-18 21:38:1144namespace {
45const char kDefaultServerHostName[] = "www.google.com";
46const int kDefaultServerPort = 443;
rtenneti14abd312015-02-06 21:56:0147
48// Run all tests with all the combinations of versions and
49// enable_connection_racing.
50struct TestParams {
51 TestParams(const QuicVersion version, bool enable_connection_racing)
52 : version(version), enable_connection_racing(enable_connection_racing) {}
53
54 friend ostream& operator<<(ostream& os, const TestParams& p) {
55 os << "{ version: " << QuicVersionToString(p.version);
56 os << " enable_connection_racing: " << p.enable_connection_racing << " }";
57 return os;
58 }
59
60 QuicVersion version;
61 bool enable_connection_racing;
62};
63
64// Constructs various test permutations.
65vector<TestParams> GetTestParams() {
66 vector<TestParams> params;
67 QuicVersionVector all_supported_versions = QuicSupportedVersions();
68 for (const QuicVersion version : all_supported_versions) {
69 params.push_back(TestParams(version, false));
70 params.push_back(TestParams(version, true));
71 }
72 return params;
73}
74
[email protected]3c772402013-12-18 21:38:1175} // namespace anonymous
76
[email protected]c49ff182013-09-28 08:33:2677class QuicStreamFactoryPeer {
78 public:
[email protected]59c0bbd2014-03-22 04:08:1279 static QuicCryptoClientConfig* GetCryptoConfig(QuicStreamFactory* factory) {
80 return &factory->crypto_config_;
[email protected]c49ff182013-09-28 08:33:2681 }
[email protected]4d283b32013-10-17 12:57:2782
83 static bool HasActiveSession(QuicStreamFactory* factory,
[email protected]bf4ea2f2014-03-10 22:57:5384 const HostPortPair& host_port_pair,
[email protected]df157d9d2014-03-10 07:27:2785 bool is_https) {
[email protected]257f24f2014-04-01 09:15:3786 QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED);
87 return factory->HasActiveSession(server_id);
[email protected]4d283b32013-10-17 12:57:2788 }
89
90 static QuicClientSession* GetActiveSession(
91 QuicStreamFactory* factory,
[email protected]bf4ea2f2014-03-10 22:57:5392 const HostPortPair& host_port_pair,
[email protected]df157d9d2014-03-10 07:27:2793 bool is_https) {
[email protected]257f24f2014-04-01 09:15:3794 QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED);
95 DCHECK(factory->HasActiveSession(server_id));
96 return factory->active_sessions_[server_id];
[email protected]df157d9d2014-03-10 07:27:2797 }
98
99 static scoped_ptr<QuicHttpStream> CreateIfSessionExists(
100 QuicStreamFactory* factory,
[email protected]bf4ea2f2014-03-10 22:57:53101 const HostPortPair& host_port_pair,
[email protected]df157d9d2014-03-10 07:27:27102 bool is_https,
103 const BoundNetLog& net_log) {
[email protected]257f24f2014-04-01 09:15:37104 QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED);
105 return factory->CreateIfSessionExists(server_id, net_log);
[email protected]4d283b32013-10-17 12:57:27106 }
107
108 static bool IsLiveSession(QuicStreamFactory* factory,
109 QuicClientSession* session) {
[email protected]4d590c9c2014-05-02 05:14:33110 for (QuicStreamFactory::SessionIdMap::iterator it =
[email protected]4d283b32013-10-17 12:57:27111 factory->all_sessions_.begin();
112 it != factory->all_sessions_.end(); ++it) {
[email protected]4d590c9c2014-05-02 05:14:33113 if (it->first == session)
[email protected]4d283b32013-10-17 12:57:27114 return true;
115 }
116 return false;
117 }
jri584002d12014-09-09 00:51:28118
119 static void DisableConnectionPooling(QuicStreamFactory* factory) {
120 factory->disable_connection_pooling_ = true;
121 }
rtenneti38f5cd52014-10-28 20:28:28122
123 static void SetTaskRunner(QuicStreamFactory* factory,
124 base::TaskRunner* task_runner) {
125 factory->task_runner_ = task_runner;
126 }
127
128 static void SetLoadServerInfoTimeout(QuicStreamFactory* factory,
129 size_t load_server_info_timeout) {
130 factory->load_server_info_timeout_ms_ = load_server_info_timeout;
131 }
rtenneti14abd312015-02-06 21:56:01132
133 static void SetEnableConnectionRacing(QuicStreamFactory* factory,
134 bool enable_connection_racing) {
135 factory->enable_connection_racing_ = enable_connection_racing;
136 }
137
rtenneti34dffe752015-02-24 23:27:32138 static void SetDisableDiskCache(QuicStreamFactory* factory,
139 bool disable_disk_cache) {
140 factory->disable_disk_cache_ = disable_disk_cache;
141 }
142
rtenneti14abd312015-02-06 21:56:01143 static size_t GetNumberOfActiveJobs(QuicStreamFactory* factory,
144 const QuicServerId& server_id) {
145 return (factory->active_jobs_[server_id]).size();
146 }
[email protected]c49ff182013-09-28 08:33:26147};
148
rtenneti38f5cd52014-10-28 20:28:28149class MockQuicServerInfo : public QuicServerInfo {
150 public:
151 MockQuicServerInfo(const QuicServerId& server_id)
152 : QuicServerInfo(server_id) {}
dcheng2339883c2014-12-23 00:23:05153 ~MockQuicServerInfo() override {}
rtenneti38f5cd52014-10-28 20:28:28154
dcheng2339883c2014-12-23 00:23:05155 void Start() override {}
rtenneti38f5cd52014-10-28 20:28:28156
dcheng2339883c2014-12-23 00:23:05157 int WaitForDataReady(const CompletionCallback& callback) override {
rtenneti38f5cd52014-10-28 20:28:28158 return ERR_IO_PENDING;
159 }
160
rtenneti170f36a2015-02-10 19:13:45161 void ResetWaitForDataReadyCallback() override {}
162
dcheng2339883c2014-12-23 00:23:05163 void CancelWaitForDataReadyCallback() override {}
rtenneti38f5cd52014-10-28 20:28:28164
dcheng2339883c2014-12-23 00:23:05165 bool IsDataReady() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28166
dcheng2339883c2014-12-23 00:23:05167 bool IsReadyToPersist() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28168
dcheng2339883c2014-12-23 00:23:05169 void Persist() override {}
rtennetif0b832b2014-11-07 02:32:30170
dcheng2339883c2014-12-23 00:23:05171 void OnExternalCacheHit() override {}
rtenneti38f5cd52014-10-28 20:28:28172};
173
174class MockQuicServerInfoFactory : public QuicServerInfoFactory {
175 public:
176 MockQuicServerInfoFactory() {}
dcheng2339883c2014-12-23 00:23:05177 ~MockQuicServerInfoFactory() override {}
rtenneti38f5cd52014-10-28 20:28:28178
dcheng2339883c2014-12-23 00:23:05179 QuicServerInfo* GetForServer(const QuicServerId& server_id) override {
rtenneti38f5cd52014-10-28 20:28:28180 return new MockQuicServerInfo(server_id);
181 }
182};
183
rtenneti14abd312015-02-06 21:56:01184class QuicStreamFactoryTest : public ::testing::TestWithParam<TestParams> {
[email protected]e13201d82012-12-12 05:00:32185 protected:
186 QuicStreamFactoryTest()
[email protected]457d6952013-12-13 09:24:58187 : random_generator_(0),
188 clock_(new MockClock()),
rtenneti38f5cd52014-10-28 20:28:28189 runner_(new TestTaskRunner(clock_)),
rtenneti14abd312015-02-06 21:56:01190 maker_(GetParam().version, 0, clock_),
[email protected]59c0bbd2014-03-22 04:08:12191 cert_verifier_(CertVerifier::CreateDefault()),
jri2b966f22014-09-02 22:25:36192 channel_id_service_(
rtennetibe635732014-10-02 22:51:42193 new ChannelIDService(new DefaultChannelIDStore(nullptr),
jri2b966f22014-09-02 22:25:36194 base::MessageLoopProxy::current())),
195 factory_(&host_resolver_,
196 &socket_factory_,
197 base::WeakPtr<HttpServerProperties>(),
198 cert_verifier_.get(),
199 channel_id_service_.get(),
200 &transport_security_state_,
201 &crypto_client_stream_factory_,
202 &random_generator_,
203 clock_,
204 kDefaultMaxPacketSize,
205 std::string(),
rtenneti14abd312015-02-06 21:56:01206 SupportedVersions(GetParam().version),
jri2b966f22014-09-02 22:25:36207 /*enable_port_selection=*/true,
jri584002d12014-09-09 00:51:28208 /*always_require_handshake_confirmation=*/false,
209 /*disable_connection_pooling=*/false,
rtenneti38f5cd52014-10-28 20:28:28210 /*load_server_info_timeout=*/0u,
rtenneti2912825c2015-01-06 01:19:46211 /*load_server_info_timeout_srtt_multiplier=*/0.0f,
rtenneti6a4cf3b2015-01-09 03:41:15212 /*enable_truncated_connection_ids=*/true,
rtenneti4f809972015-02-11 19:38:34213 /*enable_connection_racing=*/false,
qyearsley3257b7de2015-02-28 06:59:03214 /*enable_non_blocking_io=*/true,
rtenneti34dffe752015-02-24 23:27:32215 /*disable_disk_cache=*/false,
rchc7433572015-02-27 18:16:51216 /*receive_buffer_size=*/0,
jri2b966f22014-09-02 22:25:36217 QuicTagVector()),
[email protected]bf4ea2f2014-03-10 22:57:53218 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
[email protected]9dd3ff0f2014-03-26 09:51:28219 is_https_(false),
[email protected]314b03992014-04-01 01:28:53220 privacy_mode_(PRIVACY_MODE_DISABLED) {
[email protected]11c05872013-08-20 02:04:12221 factory_.set_require_confirmation(false);
[email protected]ca4e0d92014-08-22 16:33:22222 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
rtenneti14abd312015-02-06 21:56:01223 QuicStreamFactoryPeer::SetEnableConnectionRacing(
224 &factory_, GetParam().enable_connection_racing);
[email protected]e13201d82012-12-12 05:00:32225 }
226
[email protected]df157d9d2014-03-10 07:27:27227 scoped_ptr<QuicHttpStream> CreateIfSessionExists(
[email protected]bf4ea2f2014-03-10 22:57:53228 const HostPortPair& host_port_pair,
[email protected]df157d9d2014-03-10 07:27:27229 const BoundNetLog& net_log) {
230 return QuicStreamFactoryPeer::CreateIfSessionExists(
[email protected]bf4ea2f2014-03-10 22:57:53231 &factory_, host_port_pair, false, net_log_);
[email protected]df157d9d2014-03-10 07:27:27232 }
[email protected]e13201d82012-12-12 05:00:32233
[email protected]bf4ea2f2014-03-10 22:57:53234 int GetSourcePortForNewSession(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10235 return GetSourcePortForNewSessionInner(destination, false);
236 }
237
238 int GetSourcePortForNewSessionAndGoAway(
[email protected]bf4ea2f2014-03-10 22:57:53239 const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10240 return GetSourcePortForNewSessionInner(destination, true);
241 }
242
[email protected]bf4ea2f2014-03-10 22:57:53243 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
[email protected]d8e2abf82014-03-06 10:30:10244 bool goaway_received) {
[email protected]3c772402013-12-18 21:38:11245 // Should only be called if there is no active session for this destination.
rtennetibe635732014-10-02 22:51:42246 EXPECT_EQ(nullptr, CreateIfSessionExists(destination, net_log_).get());
[email protected]3c772402013-12-18 21:38:11247 size_t socket_count = socket_factory_.udp_client_sockets().size();
248
249 MockRead reads[] = {
250 MockRead(ASYNC, OK, 0) // EOF
251 };
rtennetibe635732014-10-02 22:51:42252 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]3c772402013-12-18 21:38:11253 socket_data.StopAfter(1);
254 socket_factory_.AddSocketDataProvider(&socket_data);
255
256 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59257 EXPECT_EQ(ERR_IO_PENDING,
258 request.Request(destination,
259 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28260 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59261 "GET",
[email protected]974849d2014-02-06 01:32:59262 net_log_,
263 callback_.callback()));
[email protected]3c772402013-12-18 21:38:11264
265 EXPECT_EQ(OK, callback_.WaitForResult());
266 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
267 EXPECT_TRUE(stream.get());
268 stream.reset();
269
270 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
[email protected]df157d9d2014-03-10 07:27:27271 &factory_, destination, is_https_);
[email protected]3c772402013-12-18 21:38:11272
273 if (socket_count + 1 != socket_factory_.udp_client_sockets().size()) {
274 EXPECT_TRUE(false);
275 return 0;
276 }
277
278 IPEndPoint endpoint;
279 socket_factory_.
280 udp_client_sockets()[socket_count]->GetLocalAddress(&endpoint);
281 int port = endpoint.port();
[email protected]d8e2abf82014-03-06 10:30:10282 if (goaway_received) {
283 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, "");
284 session->OnGoAway(goaway);
285 }
[email protected]3c772402013-12-18 21:38:11286
287 factory_.OnSessionClosed(session);
rtennetibe635732014-10-02 22:51:42288 EXPECT_EQ(nullptr, CreateIfSessionExists(destination, net_log_).get());
[email protected]3c772402013-12-18 21:38:11289 EXPECT_TRUE(socket_data.at_read_eof());
290 EXPECT_TRUE(socket_data.at_write_eof());
291 return port;
292 }
293
[email protected]459a7402014-02-10 12:58:52294 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() {
[email protected]66ae5962014-05-22 11:13:05295 QuicStreamId stream_id = kClientDataStreamId1;
[email protected]51cc1342014-04-18 23:44:37296 return maker_.MakeRstPacket(
297 1, true, stream_id,
rtenneti14abd312015-02-06 21:56:01298 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam().version));
[email protected]459a7402014-02-10 12:58:52299 }
300
rtenneti38f5cd52014-10-28 20:28:28301 MockQuicServerInfoFactory quic_server_info_factory_;
[email protected]e13201d82012-12-12 05:00:32302 MockHostResolver host_resolver_;
[email protected]0edce6a2013-05-08 18:02:40303 DeterministicMockClientSocketFactory socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05304 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]9558c5d32012-12-22 00:08:14305 MockRandom random_generator_;
[email protected]872edd9e2013-01-16 08:51:15306 MockClock* clock_; // Owned by factory_.
rtenneti38f5cd52014-10-28 20:28:28307 scoped_refptr<TestTaskRunner> runner_;
rtenneti4b06ae72014-08-26 03:43:43308 QuicTestPacketMaker maker_;
[email protected]59c0bbd2014-03-22 04:08:12309 scoped_ptr<CertVerifier> cert_verifier_;
[email protected]6b8a3c742014-07-25 00:25:35310 scoped_ptr<ChannelIDService> channel_id_service_;
[email protected]080b77932014-08-04 01:22:46311 TransportSecurityState transport_security_state_;
[email protected]e13201d82012-12-12 05:00:32312 QuicStreamFactory factory_;
[email protected]bf4ea2f2014-03-10 22:57:53313 HostPortPair host_port_pair_;
[email protected]6d1b4ed2013-07-10 03:57:54314 bool is_https_;
[email protected]9dd3ff0f2014-03-26 09:51:28315 PrivacyMode privacy_mode_;
[email protected]e13201d82012-12-12 05:00:32316 BoundNetLog net_log_;
317 TestCompletionCallback callback_;
[email protected]e13201d82012-12-12 05:00:32318};
319
rtenneti14abd312015-02-06 21:56:01320INSTANTIATE_TEST_CASE_P(Version,
321 QuicStreamFactoryTest,
322 ::testing::ValuesIn(GetTestParams()));
[email protected]1e960032013-12-20 19:00:20323
324TEST_P(QuicStreamFactoryTest, CreateIfSessionExists) {
rtennetibe635732014-10-02 22:51:42325 EXPECT_EQ(nullptr, CreateIfSessionExists(host_port_pair_, net_log_).get());
[email protected]e13201d82012-12-12 05:00:32326}
327
[email protected]1e960032013-12-20 19:00:20328TEST_P(QuicStreamFactoryTest, Create) {
[email protected]69dfd1b2013-06-04 22:20:12329 MockRead reads[] = {
[email protected]25c31dc2013-06-05 17:56:04330 MockRead(ASYNC, OK, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:12331 };
rtennetibe635732014-10-02 22:51:42332 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:32333 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]25c31dc2013-06-05 17:56:04334 socket_data.StopAfter(1);
[email protected]e13201d82012-12-12 05:00:32335
336 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59337 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53338 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59339 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28340 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59341 "GET",
[email protected]974849d2014-02-06 01:32:59342 net_log_,
343 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32344
345 EXPECT_EQ(OK, callback_.WaitForResult());
346 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0edce6a2013-05-08 18:02:40347 EXPECT_TRUE(stream.get());
[email protected]e13201d82012-12-12 05:00:32348
349 // Will reset stream 3.
[email protected]bf4ea2f2014-03-10 22:57:53350 stream = CreateIfSessionExists(host_port_pair_, net_log_);
[email protected]e13201d82012-12-12 05:00:32351 EXPECT_TRUE(stream.get());
352
[email protected]6d1b4ed2013-07-10 03:57:54353 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
354 // in streams on different sessions.
[email protected]e13201d82012-12-12 05:00:32355 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59356 EXPECT_EQ(OK,
[email protected]bf4ea2f2014-03-10 22:57:53357 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59358 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28359 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59360 "GET",
[email protected]974849d2014-02-06 01:32:59361 net_log_,
362 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32363 stream = request2.ReleaseStream(); // Will reset stream 5.
364 stream.reset(); // Will reset stream 7.
365
366 EXPECT_TRUE(socket_data.at_read_eof());
367 EXPECT_TRUE(socket_data.at_write_eof());
368}
369
[email protected]8bd2b812014-03-26 04:01:17370TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
371 MockRead reads[] = {
372 MockRead(ASYNC, OK, 0) // EOF
373 };
rtennetibe635732014-10-02 22:51:42374 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17375 socket_factory_.AddSocketDataProvider(&socket_data);
376 socket_data.StopAfter(1);
377
378 crypto_client_stream_factory_.set_handshake_mode(
379 MockCryptoClientStream::ZERO_RTT);
380 host_resolver_.set_synchronous_mode(true);
381 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
382 "192.168.0.1", "");
383
384 QuicStreamRequest request(&factory_);
385 EXPECT_EQ(OK,
386 request.Request(host_port_pair_,
387 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28388 privacy_mode_,
[email protected]8bd2b812014-03-26 04:01:17389 "GET",
390 net_log_,
391 callback_.callback()));
392
393 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
394 EXPECT_TRUE(stream.get());
395 EXPECT_TRUE(socket_data.at_read_eof());
396 EXPECT_TRUE(socket_data.at_write_eof());
397}
398
399TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
400 MockRead reads[] = {
401 MockRead(ASYNC, OK, 0) // EOF
402 };
rtennetibe635732014-10-02 22:51:42403 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17404 socket_factory_.AddSocketDataProvider(&socket_data);
405 socket_data.StopAfter(1);
406
407 crypto_client_stream_factory_.set_handshake_mode(
408 MockCryptoClientStream::ZERO_RTT);
409 host_resolver_.set_synchronous_mode(true);
410 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
411 "192.168.0.1", "");
412
413 QuicStreamRequest request(&factory_);
414 // Posts require handshake confirmation, so this will return asynchronously.
415 EXPECT_EQ(ERR_IO_PENDING,
416 request.Request(host_port_pair_,
417 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28418 privacy_mode_,
[email protected]8bd2b812014-03-26 04:01:17419 "POST",
420 net_log_,
421 callback_.callback()));
422
423 // Confirm the handshake and verify that the stream is created.
424 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
425 QuicSession::HANDSHAKE_CONFIRMED);
426
427 EXPECT_EQ(OK, callback_.WaitForResult());
428 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
429 EXPECT_TRUE(stream.get());
430 EXPECT_TRUE(socket_data.at_read_eof());
431 EXPECT_TRUE(socket_data.at_write_eof());
432}
433
[email protected]df157d9d2014-03-10 07:27:27434TEST_P(QuicStreamFactoryTest, CreateHttpVsHttps) {
435 MockRead reads[] = {
436 MockRead(ASYNC, OK, 0) // EOF
437 };
rtennetibe635732014-10-02 22:51:42438 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
439 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]df157d9d2014-03-10 07:27:27440 socket_factory_.AddSocketDataProvider(&socket_data1);
441 socket_factory_.AddSocketDataProvider(&socket_data2);
442 socket_data1.StopAfter(1);
443 socket_data2.StopAfter(1);
444
445 QuicStreamRequest request(&factory_);
446 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53447 request.Request(host_port_pair_,
[email protected]df157d9d2014-03-10 07:27:27448 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28449 privacy_mode_,
[email protected]df157d9d2014-03-10 07:27:27450 "GET",
[email protected]df157d9d2014-03-10 07:27:27451 net_log_,
452 callback_.callback()));
453
454 EXPECT_EQ(OK, callback_.WaitForResult());
455 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
456 EXPECT_TRUE(stream.get());
457
458 QuicStreamRequest request2(&factory_);
459 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53460 request2.Request(host_port_pair_,
[email protected]df157d9d2014-03-10 07:27:27461 !is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28462 privacy_mode_,
[email protected]df157d9d2014-03-10 07:27:27463 "GET",
[email protected]df157d9d2014-03-10 07:27:27464 net_log_,
465 callback_.callback()));
466 EXPECT_EQ(OK, callback_.WaitForResult());
467 stream = request2.ReleaseStream();
468 EXPECT_TRUE(stream.get());
469 stream.reset();
470
471 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53472 &factory_, host_port_pair_, is_https_),
[email protected]df157d9d2014-03-10 07:27:27473 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53474 &factory_, host_port_pair_, !is_https_));
[email protected]df157d9d2014-03-10 07:27:27475
476 EXPECT_TRUE(socket_data1.at_read_eof());
477 EXPECT_TRUE(socket_data1.at_write_eof());
478 EXPECT_TRUE(socket_data2.at_read_eof());
479 EXPECT_TRUE(socket_data2.at_write_eof());
480}
481
[email protected]5db452202014-08-19 05:22:15482TEST_P(QuicStreamFactoryTest, Pooling) {
[email protected]eed749f92013-12-23 18:57:38483 MockRead reads[] = {
484 MockRead(ASYNC, OK, 0) // EOF
485 };
rtennetibe635732014-10-02 22:51:42486 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38487 socket_factory_.AddSocketDataProvider(&socket_data);
488 socket_data.StopAfter(1);
489
[email protected]bf4ea2f2014-03-10 22:57:53490 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38491 host_resolver_.set_synchronous_mode(true);
492 host_resolver_.rules()->AddIPLiteralRule(
493 kDefaultServerHostName, "192.168.0.1", "");
494 host_resolver_.rules()->AddIPLiteralRule(
495 "mail.google.com", "192.168.0.1", "");
496
497 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59498 EXPECT_EQ(OK,
[email protected]bf4ea2f2014-03-10 22:57:53499 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59500 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28501 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59502 "GET",
[email protected]974849d2014-02-06 01:32:59503 net_log_,
504 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38505 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
506 EXPECT_TRUE(stream.get());
507
508 TestCompletionCallback callback;
509 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59510 EXPECT_EQ(OK,
511 request2.Request(server2,
512 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28513 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59514 "GET",
[email protected]974849d2014-02-06 01:32:59515 net_log_,
516 callback.callback()));
[email protected]eed749f92013-12-23 18:57:38517 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
518 EXPECT_TRUE(stream2.get());
519
520 EXPECT_EQ(
[email protected]df157d9d2014-03-10 07:27:27521 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53522 &factory_, host_port_pair_, is_https_),
[email protected]df157d9d2014-03-10 07:27:27523 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38524
525 EXPECT_TRUE(socket_data.at_read_eof());
526 EXPECT_TRUE(socket_data.at_write_eof());
527}
528
jri584002d12014-09-09 00:51:28529TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) {
530 MockRead reads[] = {
531 MockRead(ASYNC, OK, 0) // EOF
532 };
rtennetibe635732014-10-02 22:51:42533 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
534 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28535 socket_factory_.AddSocketDataProvider(&socket_data1);
536 socket_factory_.AddSocketDataProvider(&socket_data2);
537 socket_data1.StopAfter(1);
538 socket_data2.StopAfter(1);
539
540 HostPortPair server2("mail.google.com", kDefaultServerPort);
541 host_resolver_.set_synchronous_mode(true);
542 host_resolver_.rules()->AddIPLiteralRule(
543 kDefaultServerHostName, "192.168.0.1", "");
544 host_resolver_.rules()->AddIPLiteralRule(
545 "mail.google.com", "192.168.0.1", "");
546
547 // Disable connection pooling.
548 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
549
550 QuicStreamRequest request(&factory_);
551 EXPECT_EQ(OK,
552 request.Request(host_port_pair_,
553 is_https_,
554 privacy_mode_,
555 "GET",
556 net_log_,
557 callback_.callback()));
558 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
559 EXPECT_TRUE(stream.get());
560
561 TestCompletionCallback callback;
562 QuicStreamRequest request2(&factory_);
563 EXPECT_EQ(OK,
564 request2.Request(server2,
565 is_https_,
566 privacy_mode_,
567 "GET",
568 net_log_,
569 callback.callback()));
570 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
571 EXPECT_TRUE(stream2.get());
572
573 EXPECT_NE(
574 QuicStreamFactoryPeer::GetActiveSession(
575 &factory_, host_port_pair_, is_https_),
576 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_));
577
578 EXPECT_TRUE(socket_data1.at_read_eof());
579 EXPECT_TRUE(socket_data1.at_write_eof());
580 EXPECT_TRUE(socket_data2.at_read_eof());
581 EXPECT_TRUE(socket_data2.at_write_eof());
582}
583
[email protected]eed749f92013-12-23 18:57:38584TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
585 MockRead reads[] = {
586 MockRead(ASYNC, OK, 0) // EOF
587 };
rtennetibe635732014-10-02 22:51:42588 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
589 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38590 socket_factory_.AddSocketDataProvider(&socket_data1);
591 socket_factory_.AddSocketDataProvider(&socket_data2);
592 socket_data1.StopAfter(1);
593 socket_data2.StopAfter(1);
594
[email protected]bf4ea2f2014-03-10 22:57:53595 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38596 host_resolver_.set_synchronous_mode(true);
597 host_resolver_.rules()->AddIPLiteralRule(
598 kDefaultServerHostName, "192.168.0.1", "");
599 host_resolver_.rules()->AddIPLiteralRule(
600 "mail.google.com", "192.168.0.1", "");
601
602 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59603 EXPECT_EQ(OK,
[email protected]bf4ea2f2014-03-10 22:57:53604 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59605 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28606 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59607 "GET",
[email protected]974849d2014-02-06 01:32:59608 net_log_,
609 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38610 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
611 EXPECT_TRUE(stream.get());
612
613 TestCompletionCallback callback;
614 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59615 EXPECT_EQ(OK,
616 request2.Request(server2,
617 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28618 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59619 "GET",
[email protected]974849d2014-02-06 01:32:59620 net_log_,
621 callback.callback()));
[email protected]eed749f92013-12-23 18:57:38622 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
623 EXPECT_TRUE(stream2.get());
624
[email protected]df157d9d2014-03-10 07:27:27625 factory_.OnSessionGoingAway(QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53626 &factory_, host_port_pair_, is_https_));
[email protected]df157d9d2014-03-10 07:27:27627 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53628 &factory_, host_port_pair_, is_https_));
[email protected]df157d9d2014-03-10 07:27:27629 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
630 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38631
632 TestCompletionCallback callback3;
633 QuicStreamRequest request3(&factory_);
[email protected]974849d2014-02-06 01:32:59634 EXPECT_EQ(OK,
635 request3.Request(server2,
636 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28637 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59638 "GET",
[email protected]974849d2014-02-06 01:32:59639 net_log_,
640 callback3.callback()));
[email protected]eed749f92013-12-23 18:57:38641 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
642 EXPECT_TRUE(stream3.get());
643
[email protected]df157d9d2014-03-10 07:27:27644 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(
645 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38646
647 EXPECT_TRUE(socket_data1.at_read_eof());
648 EXPECT_TRUE(socket_data1.at_write_eof());
649 EXPECT_TRUE(socket_data2.at_read_eof());
650 EXPECT_TRUE(socket_data2.at_write_eof());
651}
652
[email protected]5db452202014-08-19 05:22:15653TEST_P(QuicStreamFactoryTest, HttpsPooling) {
[email protected]eed749f92013-12-23 18:57:38654 MockRead reads[] = {
655 MockRead(ASYNC, OK, 0) // EOF
656 };
rtennetibe635732014-10-02 22:51:42657 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38658 socket_factory_.AddSocketDataProvider(&socket_data);
659 socket_data.StopAfter(1);
660
[email protected]bf4ea2f2014-03-10 22:57:53661 HostPortPair server1("www.example.org", 443);
662 HostPortPair server2("mail.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38663
664 // Load a cert that is valid for:
665 // www.example.org (server1)
666 // mail.example.org (server2)
667 // www.example.com
668 base::FilePath certs_dir = GetTestCertsDirectory();
669 scoped_refptr<X509Certificate> test_cert(
670 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
rtennetibe635732014-10-02 22:51:42671 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
[email protected]b694e48c2014-03-18 17:10:13672 ProofVerifyDetailsChromium verify_details;
673 verify_details.cert_verify_result.verified_cert = test_cert;
[email protected]5db452202014-08-19 05:22:15674 verify_details.cert_verify_result.is_issued_by_known_root = true;
[email protected]b694e48c2014-03-18 17:10:13675 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
[email protected]eed749f92013-12-23 18:57:38676
677 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53678 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
679 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38680
681 QuicStreamRequest request(&factory_);
682 is_https_ = true;
[email protected]974849d2014-02-06 01:32:59683 EXPECT_EQ(OK,
684 request.Request(server1,
685 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28686 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59687 "GET",
[email protected]974849d2014-02-06 01:32:59688 net_log_,
689 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38690 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
691 EXPECT_TRUE(stream.get());
692
693 TestCompletionCallback callback;
694 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59695 EXPECT_EQ(OK,
696 request2.Request(server2,
697 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28698 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59699 "GET",
[email protected]974849d2014-02-06 01:32:59700 net_log_,
701 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38702 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
703 EXPECT_TRUE(stream2.get());
704
[email protected]df157d9d2014-03-10 07:27:27705 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
706 &factory_, server1, is_https_),
707 QuicStreamFactoryPeer::GetActiveSession(
708 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38709
710 EXPECT_TRUE(socket_data.at_read_eof());
711 EXPECT_TRUE(socket_data.at_write_eof());
712}
713
jri584002d12014-09-09 00:51:28714TEST_P(QuicStreamFactoryTest, NoHttpsPoolingIfDisabled) {
715 MockRead reads[] = {
716 MockRead(ASYNC, OK, 0) // EOF
717 };
rtennetibe635732014-10-02 22:51:42718 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
719 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28720 socket_factory_.AddSocketDataProvider(&socket_data1);
721 socket_factory_.AddSocketDataProvider(&socket_data2);
722 socket_data1.StopAfter(1);
723 socket_data2.StopAfter(1);
724
725 HostPortPair server1("www.example.org", 443);
726 HostPortPair server2("mail.example.org", 443);
727
728 // Load a cert that is valid for:
729 // www.example.org (server1)
730 // mail.example.org (server2)
731 // www.example.com
732 base::FilePath certs_dir = GetTestCertsDirectory();
733 scoped_refptr<X509Certificate> test_cert(
734 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
rtennetibe635732014-10-02 22:51:42735 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
jri584002d12014-09-09 00:51:28736 ProofVerifyDetailsChromium verify_details;
737 verify_details.cert_verify_result.verified_cert = test_cert;
738 verify_details.cert_verify_result.is_issued_by_known_root = true;
739 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
740
741 host_resolver_.set_synchronous_mode(true);
742 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
743 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
744
745 // Disable connection pooling.
746 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
747
748 QuicStreamRequest request(&factory_);
749 is_https_ = true;
750 EXPECT_EQ(OK,
751 request.Request(server1,
752 is_https_,
753 privacy_mode_,
754 "GET",
755 net_log_,
756 callback_.callback()));
757 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
758 EXPECT_TRUE(stream.get());
759
760 TestCompletionCallback callback;
761 QuicStreamRequest request2(&factory_);
762 EXPECT_EQ(OK,
763 request2.Request(server2,
764 is_https_,
765 privacy_mode_,
766 "GET",
767 net_log_,
768 callback_.callback()));
769 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
770 EXPECT_TRUE(stream2.get());
771
772 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
773 &factory_, server1, is_https_),
774 QuicStreamFactoryPeer::GetActiveSession(
775 &factory_, server2, is_https_));
776
777 EXPECT_TRUE(socket_data1.at_read_eof());
778 EXPECT_TRUE(socket_data1.at_write_eof());
779 EXPECT_TRUE(socket_data2.at_read_eof());
780 EXPECT_TRUE(socket_data2.at_write_eof());
781}
782
[email protected]eed749f92013-12-23 18:57:38783TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithCertMismatch) {
784 MockRead reads[] = {
785 MockRead(ASYNC, OK, 0) // EOF
786 };
rtennetibe635732014-10-02 22:51:42787 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
788 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38789 socket_factory_.AddSocketDataProvider(&socket_data1);
790 socket_factory_.AddSocketDataProvider(&socket_data2);
791 socket_data1.StopAfter(1);
792 socket_data2.StopAfter(1);
793
[email protected]bf4ea2f2014-03-10 22:57:53794 HostPortPair server1("www.example.org", 443);
795 HostPortPair server2("mail.google.com", 443);
[email protected]eed749f92013-12-23 18:57:38796
797 // Load a cert that is valid for:
798 // www.example.org (server1)
799 // mail.example.org
800 // www.example.com
801 // But is not valid for mail.google.com (server2).
802 base::FilePath certs_dir = GetTestCertsDirectory();
803 scoped_refptr<X509Certificate> test_cert(
804 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
rtennetibe635732014-10-02 22:51:42805 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
[email protected]b694e48c2014-03-18 17:10:13806 ProofVerifyDetailsChromium verify_details;
807 verify_details.cert_verify_result.verified_cert = test_cert;
808 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
809
[email protected]eed749f92013-12-23 18:57:38810
811 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53812 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
813 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38814
815 QuicStreamRequest request(&factory_);
816 is_https_ = true;
[email protected]974849d2014-02-06 01:32:59817 EXPECT_EQ(OK,
818 request.Request(server1,
819 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28820 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59821 "GET",
[email protected]974849d2014-02-06 01:32:59822 net_log_,
823 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38824 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
825 EXPECT_TRUE(stream.get());
826
827 TestCompletionCallback callback;
828 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59829 EXPECT_EQ(OK,
830 request2.Request(server2,
831 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28832 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59833 "GET",
[email protected]974849d2014-02-06 01:32:59834 net_log_,
835 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38836 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
837 EXPECT_TRUE(stream2.get());
838
[email protected]df157d9d2014-03-10 07:27:27839 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
840 &factory_, server1, is_https_),
841 QuicStreamFactoryPeer::GetActiveSession(
842 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38843
844 EXPECT_TRUE(socket_data1.at_read_eof());
845 EXPECT_TRUE(socket_data1.at_write_eof());
846 EXPECT_TRUE(socket_data2.at_read_eof());
847 EXPECT_TRUE(socket_data2.at_write_eof());
848}
849
[email protected]5db452202014-08-19 05:22:15850TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
851 MockRead reads[] = {
852 MockRead(ASYNC, OK, 0) // EOF
853 };
rtennetibe635732014-10-02 22:51:42854 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15855 socket_factory_.AddSocketDataProvider(&socket_data);
856 socket_data.StopAfter(1);
857
858 HostPortPair server1("www.example.org", 443);
859 HostPortPair server2("mail.example.org", 443);
860 uint8 primary_pin = 1;
861 uint8 backup_pin = 2;
862 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
863 backup_pin);
864
865 // Load a cert that is valid for:
866 // www.example.org (server1)
867 // mail.example.org (server2)
868 base::FilePath certs_dir = GetTestCertsDirectory();
869 scoped_refptr<X509Certificate> test_cert(
870 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
rtennetibe635732014-10-02 22:51:42871 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
[email protected]5db452202014-08-19 05:22:15872 ProofVerifyDetailsChromium verify_details;
873 verify_details.cert_verify_result.verified_cert = test_cert;
874 verify_details.cert_verify_result.is_issued_by_known_root = true;
875 verify_details.cert_verify_result.public_key_hashes.push_back(
876 test::GetTestHashValue(primary_pin));
877 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
878
879
880 host_resolver_.set_synchronous_mode(true);
881 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
882 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
883
884 QuicStreamRequest request(&factory_);
885 is_https_ = true;
886 EXPECT_EQ(OK,
887 request.Request(server1,
888 is_https_,
889 privacy_mode_,
890 "GET",
891 net_log_,
892 callback_.callback()));
893 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
894 EXPECT_TRUE(stream.get());
895
896 TestCompletionCallback callback;
897 QuicStreamRequest request2(&factory_);
898 EXPECT_EQ(OK,
899 request2.Request(server2,
900 is_https_,
901 privacy_mode_,
902 "GET",
903 net_log_,
904 callback_.callback()));
905 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
906 EXPECT_TRUE(stream2.get());
907
908 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
909 &factory_, server1, is_https_),
910 QuicStreamFactoryPeer::GetActiveSession(
911 &factory_, server2, is_https_));
912
913 EXPECT_TRUE(socket_data.at_read_eof());
914 EXPECT_TRUE(socket_data.at_write_eof());
915}
916
jri584002d12014-09-09 00:51:28917TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithMatchingPinsIfDisabled) {
918 MockRead reads[] = {
919 MockRead(ASYNC, OK, 0) // EOF
920 };
rtennetibe635732014-10-02 22:51:42921 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
922 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28923 socket_factory_.AddSocketDataProvider(&socket_data1);
924 socket_factory_.AddSocketDataProvider(&socket_data2);
925 socket_data1.StopAfter(1);
926 socket_data2.StopAfter(1);
927
928 HostPortPair server1("www.example.org", 443);
929 HostPortPair server2("mail.example.org", 443);
930 uint8 primary_pin = 1;
931 uint8 backup_pin = 2;
932 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
933 backup_pin);
934
935 // Load a cert that is valid for:
936 // www.example.org (server1)
937 // mail.example.org (server2)
938 base::FilePath certs_dir = GetTestCertsDirectory();
939 scoped_refptr<X509Certificate> test_cert(
940 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
rtennetibe635732014-10-02 22:51:42941 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
jri584002d12014-09-09 00:51:28942 ProofVerifyDetailsChromium verify_details;
943 verify_details.cert_verify_result.verified_cert = test_cert;
944 verify_details.cert_verify_result.is_issued_by_known_root = true;
945 verify_details.cert_verify_result.public_key_hashes.push_back(
946 test::GetTestHashValue(primary_pin));
947 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
948
949
950 host_resolver_.set_synchronous_mode(true);
951 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
952 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
953
954 // Disable connection pooling.
955 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
956
957 QuicStreamRequest request(&factory_);
958 is_https_ = true;
959 EXPECT_EQ(OK,
960 request.Request(server1,
961 is_https_,
962 privacy_mode_,
963 "GET",
964 net_log_,
965 callback_.callback()));
966 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
967 EXPECT_TRUE(stream.get());
968
969 TestCompletionCallback callback;
970 QuicStreamRequest request2(&factory_);
971 EXPECT_EQ(OK,
972 request2.Request(server2,
973 is_https_,
974 privacy_mode_,
975 "GET",
976 net_log_,
977 callback_.callback()));
978 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
979 EXPECT_TRUE(stream2.get());
980
981 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
982 &factory_, server1, is_https_),
983 QuicStreamFactoryPeer::GetActiveSession(
984 &factory_, server2, is_https_));
985
986 EXPECT_TRUE(socket_data1.at_read_eof());
987 EXPECT_TRUE(socket_data1.at_write_eof());
988 EXPECT_TRUE(socket_data2.at_read_eof());
989 EXPECT_TRUE(socket_data2.at_write_eof());
990}
991
[email protected]5db452202014-08-19 05:22:15992TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
993 MockRead reads[] = {
994 MockRead(ASYNC, OK, 0) // EOF
995 };
rtennetibe635732014-10-02 22:51:42996 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
997 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15998 socket_factory_.AddSocketDataProvider(&socket_data1);
999 socket_factory_.AddSocketDataProvider(&socket_data2);
1000 socket_data1.StopAfter(1);
1001 socket_data2.StopAfter(1);
1002
1003 HostPortPair server1("www.example.org", 443);
1004 HostPortPair server2("mail.example.org", 443);
1005 uint8 primary_pin = 1;
1006 uint8 backup_pin = 2;
1007 uint8 bad_pin = 3;
1008 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
1009 backup_pin);
1010
1011 // Load a cert that is valid for:
1012 // www.example.org (server1)
1013 // mail.example.org (server2)
1014 base::FilePath certs_dir = GetTestCertsDirectory();
1015 scoped_refptr<X509Certificate> test_cert(
1016 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
rtennetibe635732014-10-02 22:51:421017 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
[email protected]5db452202014-08-19 05:22:151018 ProofVerifyDetailsChromium verify_details;
1019 verify_details.cert_verify_result.verified_cert = test_cert;
1020 verify_details.cert_verify_result.is_issued_by_known_root = true;
1021 verify_details.cert_verify_result.public_key_hashes.push_back(
1022 test::GetTestHashValue(bad_pin));
1023 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
1024
1025
1026 host_resolver_.set_synchronous_mode(true);
1027 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1028 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1029
1030 QuicStreamRequest request(&factory_);
1031 is_https_ = true;
1032 EXPECT_EQ(OK,
1033 request.Request(server1,
1034 is_https_,
1035 privacy_mode_,
1036 "GET",
1037 net_log_,
1038 callback_.callback()));
1039 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1040 EXPECT_TRUE(stream.get());
1041
1042 TestCompletionCallback callback;
1043 QuicStreamRequest request2(&factory_);
1044 EXPECT_EQ(OK,
1045 request2.Request(server2,
1046 is_https_,
1047 privacy_mode_,
1048 "GET",
1049 net_log_,
1050 callback_.callback()));
1051 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1052 EXPECT_TRUE(stream2.get());
1053
1054 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
1055 &factory_, server1, is_https_),
1056 QuicStreamFactoryPeer::GetActiveSession(
1057 &factory_, server2, is_https_));
1058
1059 EXPECT_TRUE(socket_data1.at_read_eof());
1060 EXPECT_TRUE(socket_data1.at_write_eof());
1061 EXPECT_TRUE(socket_data2.at_read_eof());
1062 EXPECT_TRUE(socket_data2.at_write_eof());
1063}
1064
[email protected]1e960032013-12-20 19:00:201065TEST_P(QuicStreamFactoryTest, Goaway) {
[email protected]4d283b32013-10-17 12:57:271066 MockRead reads[] = {
1067 MockRead(ASYNC, OK, 0) // EOF
1068 };
rtennetibe635732014-10-02 22:51:421069 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271070 socket_data.StopAfter(1);
1071 socket_factory_.AddSocketDataProvider(&socket_data);
rtennetibe635732014-10-02 22:51:421072 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271073 socket_data2.StopAfter(1);
1074 socket_factory_.AddSocketDataProvider(&socket_data2);
1075
1076 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591077 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531078 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591079 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281080 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591081 "GET",
[email protected]974849d2014-02-06 01:32:591082 net_log_,
1083 callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271084
1085 EXPECT_EQ(OK, callback_.WaitForResult());
1086 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1087 EXPECT_TRUE(stream.get());
1088
1089 // Mark the session as going away. Ensure that while it is still alive
1090 // that it is no longer active.
1091 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:531092 &factory_, host_port_pair_, is_https_);
[email protected]4d283b32013-10-17 12:57:271093 factory_.OnSessionGoingAway(session);
1094 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
[email protected]df157d9d2014-03-10 07:27:271095 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:531096 &factory_, host_port_pair_, is_https_));
rtennetibe635732014-10-02 22:51:421097 EXPECT_EQ(nullptr, CreateIfSessionExists(host_port_pair_, net_log_).get());
[email protected]4d283b32013-10-17 12:57:271098
1099 // Create a new request for the same destination and verify that a
1100 // new session is created.
1101 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591102 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531103 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591104 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281105 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591106 "GET",
[email protected]974849d2014-02-06 01:32:591107 net_log_,
1108 callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271109 EXPECT_EQ(OK, callback_.WaitForResult());
1110 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1111 EXPECT_TRUE(stream2.get());
1112
1113 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(&factory_,
[email protected]bf4ea2f2014-03-10 22:57:531114 host_port_pair_,
[email protected]df157d9d2014-03-10 07:27:271115 is_https_));
[email protected]4d283b32013-10-17 12:57:271116 EXPECT_NE(session,
1117 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:531118 &factory_, host_port_pair_, is_https_));
[email protected]4d283b32013-10-17 12:57:271119 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
1120
1121 stream2.reset();
1122 stream.reset();
1123
1124 EXPECT_TRUE(socket_data.at_read_eof());
1125 EXPECT_TRUE(socket_data.at_write_eof());
[email protected]3c772402013-12-18 21:38:111126 EXPECT_TRUE(socket_data2.at_read_eof());
1127 EXPECT_TRUE(socket_data2.at_write_eof());
[email protected]4d283b32013-10-17 12:57:271128}
1129
[email protected]1e960032013-12-20 19:00:201130TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
[email protected]0b2294d32013-08-02 00:46:361131 MockRead reads[] = {
1132 MockRead(ASYNC, OK, 0) // EOF
1133 };
[email protected]66ae5962014-05-22 11:13:051134 QuicStreamId stream_id = kClientDataStreamId1;
[email protected]1e960032013-12-20 19:00:201135 scoped_ptr<QuicEncryptedPacket> rst(
1136 maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
[email protected]06ff5152013-08-29 01:03:051137 MockWrite writes[] = {
1138 MockWrite(ASYNC, rst->data(), rst->length(), 1),
1139 };
1140 DeterministicSocketData socket_data(reads, arraysize(reads),
1141 writes, arraysize(writes));
[email protected]0b2294d32013-08-02 00:46:361142 socket_factory_.AddSocketDataProvider(&socket_data);
1143 socket_data.StopAfter(1);
1144
1145 HttpRequestInfo request_info;
1146 std::vector<QuicHttpStream*> streams;
1147 // The MockCryptoClientStream sets max_open_streams to be
rtenneti6a4cf3b2015-01-09 03:41:151148 // kDefaultMaxStreamsPerConnection / 2.
1149 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection / 2; i++) {
[email protected]0b2294d32013-08-02 00:46:361150 QuicStreamRequest request(&factory_);
[email protected]bf4ea2f2014-03-10 22:57:531151 int rv = request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591152 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281153 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591154 "GET",
[email protected]974849d2014-02-06 01:32:591155 net_log_,
[email protected]0b2294d32013-08-02 00:46:361156 callback_.callback());
1157 if (i == 0) {
1158 EXPECT_EQ(ERR_IO_PENDING, rv);
1159 EXPECT_EQ(OK, callback_.WaitForResult());
1160 } else {
1161 EXPECT_EQ(OK, rv);
1162 }
1163 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1164 EXPECT_TRUE(stream);
1165 EXPECT_EQ(OK, stream->InitializeStream(
1166 &request_info, DEFAULT_PRIORITY, net_log_, CompletionCallback()));
1167 streams.push_back(stream.release());
1168 }
1169
1170 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591171 EXPECT_EQ(OK,
[email protected]bf4ea2f2014-03-10 22:57:531172 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591173 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281174 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591175 "GET",
[email protected]974849d2014-02-06 01:32:591176 net_log_,
1177 CompletionCallback()));
[email protected]0b2294d32013-08-02 00:46:361178 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1179 EXPECT_TRUE(stream);
1180 EXPECT_EQ(ERR_IO_PENDING, stream->InitializeStream(
1181 &request_info, DEFAULT_PRIORITY, net_log_, callback_.callback()));
1182
1183 // Close the first stream.
1184 streams.front()->Close(false);
1185
1186 ASSERT_TRUE(callback_.have_result());
1187
1188 EXPECT_EQ(OK, callback_.WaitForResult());
1189
1190 EXPECT_TRUE(socket_data.at_read_eof());
1191 EXPECT_TRUE(socket_data.at_write_eof());
1192 STLDeleteElements(&streams);
1193}
1194
[email protected]1e960032013-12-20 19:00:201195TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
rtennetibe635732014-10-02 22:51:421196 DeterministicSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321197 socket_factory_.AddSocketDataProvider(&socket_data);
1198
[email protected]3c772402013-12-18 21:38:111199 host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName);
[email protected]e13201d82012-12-12 05:00:321200
1201 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591202 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531203 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591204 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281205 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591206 "GET",
[email protected]974849d2014-02-06 01:32:591207 net_log_,
1208 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321209
1210 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
1211
1212 EXPECT_TRUE(socket_data.at_read_eof());
1213 EXPECT_TRUE(socket_data.at_write_eof());
1214}
1215
[email protected]1e960032013-12-20 19:00:201216TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
[email protected]3c772402013-12-18 21:38:111217 MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
rtennetibe635732014-10-02 22:51:421218 DeterministicSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]3c772402013-12-18 21:38:111219 socket_data.set_connect_data(connect);
1220 socket_factory_.AddSocketDataProvider(&socket_data);
1221 socket_data.StopAfter(1);
1222
1223 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591224 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531225 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591226 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281227 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591228 "GET",
[email protected]974849d2014-02-06 01:32:591229 net_log_,
1230 callback_.callback()));
[email protected]3c772402013-12-18 21:38:111231
1232 EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult());
1233
1234 EXPECT_TRUE(socket_data.at_read_eof());
1235 EXPECT_TRUE(socket_data.at_write_eof());
1236}
1237
[email protected]1e960032013-12-20 19:00:201238TEST_P(QuicStreamFactoryTest, CancelCreate) {
[email protected]69dfd1b2013-06-04 22:20:121239 MockRead reads[] = {
[email protected]25c31dc2013-06-05 17:56:041240 MockRead(ASYNC, OK, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121241 };
rtennetibe635732014-10-02 22:51:421242 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321243 socket_factory_.AddSocketDataProvider(&socket_data);
1244 {
1245 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591246 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531247 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591248 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281249 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591250 "GET",
[email protected]974849d2014-02-06 01:32:591251 net_log_,
1252 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321253 }
1254
[email protected]25c31dc2013-06-05 17:56:041255 socket_data.StopAfter(1);
[email protected]e13201d82012-12-12 05:00:321256 base::RunLoop run_loop;
1257 run_loop.RunUntilIdle();
1258
1259 scoped_ptr<QuicHttpStream> stream(
[email protected]bf4ea2f2014-03-10 22:57:531260 CreateIfSessionExists(host_port_pair_, net_log_));
[email protected]e13201d82012-12-12 05:00:321261 EXPECT_TRUE(stream.get());
1262 stream.reset();
1263
1264 EXPECT_TRUE(socket_data.at_read_eof());
1265 EXPECT_TRUE(socket_data.at_write_eof());
1266}
1267
[email protected]1e960032013-12-20 19:00:201268TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) {
[email protected]3c772402013-12-18 21:38:111269 // Sequentially connect to the default host, then another host, and then the
1270 // default host. Verify that the default host gets a consistent ephemeral
1271 // port, that is different from the other host's connection.
1272
1273 std::string other_server_name = "other.google.com";
1274 EXPECT_NE(kDefaultServerHostName, other_server_name);
1275 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort);
[email protected]3c772402013-12-18 21:38:111276
[email protected]bf4ea2f2014-03-10 22:57:531277 int original_port = GetSourcePortForNewSession(host_port_pair_);
1278 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2));
1279 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]3c772402013-12-18 21:38:111280}
1281
[email protected]d8e2abf82014-03-06 10:30:101282TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) {
1283 // Get a session to the host using the port suggester.
1284 int original_port =
[email protected]bf4ea2f2014-03-10 22:57:531285 GetSourcePortForNewSessionAndGoAway(host_port_pair_);
[email protected]d8e2abf82014-03-06 10:30:101286 // Verify that the port is different after the goaway.
[email protected]bf4ea2f2014-03-10 22:57:531287 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101288 // Since the previous session did not goaway we should see the original port.
[email protected]bf4ea2f2014-03-10 22:57:531289 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101290}
1291
[email protected]1e960032013-12-20 19:00:201292TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
[email protected]56dfb902013-01-03 23:17:551293 MockRead reads[] = {
[email protected]0edce6a2013-05-08 18:02:401294 MockRead(ASYNC, 0, 0) // EOF
[email protected]56dfb902013-01-03 23:17:551295 };
[email protected]459a7402014-02-10 12:58:521296 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1297 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311298 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521299 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421300 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521301 writes.size());
[email protected]56dfb902013-01-03 23:17:551302 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0edce6a2013-05-08 18:02:401303 socket_data.StopAfter(1);
[email protected]56dfb902013-01-03 23:17:551304
[email protected]69dfd1b2013-06-04 22:20:121305 MockRead reads2[] = {
[email protected]25c31dc2013-06-05 17:56:041306 MockRead(ASYNC, 0, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121307 };
rtennetibe635732014-10-02 22:51:421308 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]56dfb902013-01-03 23:17:551309 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]0edce6a2013-05-08 18:02:401310 socket_data2.StopAfter(1);
[email protected]56dfb902013-01-03 23:17:551311
1312 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591313 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531314 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591315 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281316 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591317 "GET",
[email protected]974849d2014-02-06 01:32:591318 net_log_,
1319 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551320
1321 EXPECT_EQ(OK, callback_.WaitForResult());
1322 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361323 HttpRequestInfo request_info;
1324 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1325 DEFAULT_PRIORITY,
1326 net_log_, CompletionCallback()));
[email protected]56dfb902013-01-03 23:17:551327
1328 // Close the session and verify that stream saw the error.
1329 factory_.CloseAllSessions(ERR_INTERNET_DISCONNECTED);
1330 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1331 stream->ReadResponseHeaders(callback_.callback()));
1332
1333 // Now attempting to request a stream to the same origin should create
1334 // a new session.
1335
1336 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591337 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531338 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591339 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281340 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591341 "GET",
[email protected]974849d2014-02-06 01:32:591342 net_log_,
1343 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551344
1345 EXPECT_EQ(OK, callback_.WaitForResult());
1346 stream = request2.ReleaseStream();
1347 stream.reset(); // Will reset stream 3.
1348
1349 EXPECT_TRUE(socket_data.at_read_eof());
1350 EXPECT_TRUE(socket_data.at_write_eof());
1351 EXPECT_TRUE(socket_data2.at_read_eof());
1352 EXPECT_TRUE(socket_data2.at_write_eof());
1353}
1354
[email protected]1e960032013-12-20 19:00:201355TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
[email protected]f698a012013-05-06 20:18:591356 MockRead reads[] = {
[email protected]0edce6a2013-05-08 18:02:401357 MockRead(ASYNC, 0, 0) // EOF
[email protected]f698a012013-05-06 20:18:591358 };
[email protected]459a7402014-02-10 12:58:521359 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1360 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311361 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521362 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421363 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521364 writes.size());
[email protected]f698a012013-05-06 20:18:591365 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0edce6a2013-05-08 18:02:401366 socket_data.StopAfter(1);
[email protected]f698a012013-05-06 20:18:591367
[email protected]69dfd1b2013-06-04 22:20:121368 MockRead reads2[] = {
[email protected]25c31dc2013-06-05 17:56:041369 MockRead(ASYNC, 0, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121370 };
rtennetibe635732014-10-02 22:51:421371 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]f698a012013-05-06 20:18:591372 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]0edce6a2013-05-08 18:02:401373 socket_data2.StopAfter(1);
[email protected]f698a012013-05-06 20:18:591374
1375 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591376 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531377 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591378 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281379 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591380 "GET",
[email protected]974849d2014-02-06 01:32:591381 net_log_,
1382 callback_.callback()));
[email protected]f698a012013-05-06 20:18:591383
1384 EXPECT_EQ(OK, callback_.WaitForResult());
1385 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361386 HttpRequestInfo request_info;
1387 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1388 DEFAULT_PRIORITY,
1389 net_log_, CompletionCallback()));
[email protected]f698a012013-05-06 20:18:591390
1391 // Change the IP address and verify that stream saw the error.
1392 factory_.OnIPAddressChanged();
1393 EXPECT_EQ(ERR_NETWORK_CHANGED,
1394 stream->ReadResponseHeaders(callback_.callback()));
[email protected]11c05872013-08-20 02:04:121395 EXPECT_TRUE(factory_.require_confirmation());
[email protected]f698a012013-05-06 20:18:591396
1397 // Now attempting to request a stream to the same origin should create
1398 // a new session.
1399
1400 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591401 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531402 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591403 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281404 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591405 "GET",
[email protected]974849d2014-02-06 01:32:591406 net_log_,
1407 callback_.callback()));
[email protected]f698a012013-05-06 20:18:591408
1409 EXPECT_EQ(OK, callback_.WaitForResult());
1410 stream = request2.ReleaseStream();
1411 stream.reset(); // Will reset stream 3.
1412
1413 EXPECT_TRUE(socket_data.at_read_eof());
1414 EXPECT_TRUE(socket_data.at_write_eof());
1415 EXPECT_TRUE(socket_data2.at_read_eof());
1416 EXPECT_TRUE(socket_data2.at_write_eof());
1417}
1418
[email protected]1e960032013-12-20 19:00:201419TEST_P(QuicStreamFactoryTest, OnCertAdded) {
[email protected]d7d1e50b2013-11-25 22:08:091420 MockRead reads[] = {
1421 MockRead(ASYNC, 0, 0) // EOF
1422 };
[email protected]459a7402014-02-10 12:58:521423 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1424 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311425 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521426 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421427 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521428 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:091429 socket_factory_.AddSocketDataProvider(&socket_data);
1430 socket_data.StopAfter(1);
1431
1432 MockRead reads2[] = {
1433 MockRead(ASYNC, 0, 0) // EOF
1434 };
rtennetibe635732014-10-02 22:51:421435 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:091436 socket_factory_.AddSocketDataProvider(&socket_data2);
1437 socket_data2.StopAfter(1);
1438
1439 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591440 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531441 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591442 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281443 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591444 "GET",
[email protected]974849d2014-02-06 01:32:591445 net_log_,
1446 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091447
1448 EXPECT_EQ(OK, callback_.WaitForResult());
1449 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1450 HttpRequestInfo request_info;
1451 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1452 DEFAULT_PRIORITY,
1453 net_log_, CompletionCallback()));
1454
1455 // Add a cert and verify that stream saw the event.
rtennetibe635732014-10-02 22:51:421456 factory_.OnCertAdded(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:091457 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1458 stream->ReadResponseHeaders(callback_.callback()));
1459 EXPECT_FALSE(factory_.require_confirmation());
1460
1461 // Now attempting to request a stream to the same origin should create
1462 // a new session.
1463
1464 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591465 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531466 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591467 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281468 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591469 "GET",
[email protected]974849d2014-02-06 01:32:591470 net_log_,
1471 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091472
1473 EXPECT_EQ(OK, callback_.WaitForResult());
1474 stream = request2.ReleaseStream();
1475 stream.reset(); // Will reset stream 3.
1476
1477 EXPECT_TRUE(socket_data.at_read_eof());
1478 EXPECT_TRUE(socket_data.at_write_eof());
1479 EXPECT_TRUE(socket_data2.at_read_eof());
1480 EXPECT_TRUE(socket_data2.at_write_eof());
1481}
1482
[email protected]1e960032013-12-20 19:00:201483TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
[email protected]d7d1e50b2013-11-25 22:08:091484 MockRead reads[] = {
1485 MockRead(ASYNC, 0, 0) // EOF
1486 };
[email protected]459a7402014-02-10 12:58:521487 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1488 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311489 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521490 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421491 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521492 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:091493 socket_factory_.AddSocketDataProvider(&socket_data);
1494 socket_data.StopAfter(1);
1495
1496 MockRead reads2[] = {
1497 MockRead(ASYNC, 0, 0) // EOF
1498 };
rtennetibe635732014-10-02 22:51:421499 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:091500 socket_factory_.AddSocketDataProvider(&socket_data2);
1501 socket_data2.StopAfter(1);
1502
1503 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591504 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531505 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591506 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281507 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591508 "GET",
[email protected]974849d2014-02-06 01:32:591509 net_log_,
1510 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091511
1512 EXPECT_EQ(OK, callback_.WaitForResult());
1513 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1514 HttpRequestInfo request_info;
1515 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1516 DEFAULT_PRIORITY,
1517 net_log_, CompletionCallback()));
1518
1519 // Change the CA cert and verify that stream saw the event.
rtennetibe635732014-10-02 22:51:421520 factory_.OnCACertChanged(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:091521 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1522 stream->ReadResponseHeaders(callback_.callback()));
1523 EXPECT_FALSE(factory_.require_confirmation());
1524
1525 // Now attempting to request a stream to the same origin should create
1526 // a new session.
1527
1528 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591529 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531530 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591531 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281532 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591533 "GET",
[email protected]974849d2014-02-06 01:32:591534 net_log_,
1535 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091536
1537 EXPECT_EQ(OK, callback_.WaitForResult());
1538 stream = request2.ReleaseStream();
1539 stream.reset(); // Will reset stream 3.
1540
1541 EXPECT_TRUE(socket_data.at_read_eof());
1542 EXPECT_TRUE(socket_data.at_write_eof());
1543 EXPECT_TRUE(socket_data2.at_read_eof());
1544 EXPECT_TRUE(socket_data2.at_write_eof());
1545}
1546
[email protected]1e960032013-12-20 19:00:201547TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
[email protected]6e12d702013-11-13 00:17:171548 vector<string> cannoncial_suffixes;
1549 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1550 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]c49ff182013-09-28 08:33:261551
[email protected]6e12d702013-11-13 00:17:171552 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1553 string r1_host_name("r1");
1554 string r2_host_name("r2");
1555 r1_host_name.append(cannoncial_suffixes[i]);
1556 r2_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141557
[email protected]bf4ea2f2014-03-10 22:57:531558 HostPortPair host_port_pair1(r1_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121559 QuicCryptoClientConfig* crypto_config =
1560 QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
[email protected]257f24f2014-04-01 09:15:371561 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171562 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371563 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171564 EXPECT_FALSE(cached1->proof_valid());
1565 EXPECT_TRUE(cached1->source_address_token().empty());
1566
1567 // Mutate the cached1 to have different data.
1568 // TODO(rtenneti): mutate other members of CachedState.
1569 cached1->set_source_address_token(r1_host_name);
1570 cached1->SetProofValid();
1571
[email protected]bf4ea2f2014-03-10 22:57:531572 HostPortPair host_port_pair2(r2_host_name, 80);
[email protected]257f24f2014-04-01 09:15:371573 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171574 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371575 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171576 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
1577 EXPECT_TRUE(cached2->proof_valid());
1578 }
[email protected]b70fdb792013-10-25 19:04:141579}
1580
[email protected]1e960032013-12-20 19:00:201581TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
[email protected]6e12d702013-11-13 00:17:171582 vector<string> cannoncial_suffixes;
1583 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1584 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]b70fdb792013-10-25 19:04:141585
[email protected]6e12d702013-11-13 00:17:171586 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1587 string r3_host_name("r3");
1588 string r4_host_name("r4");
1589 r3_host_name.append(cannoncial_suffixes[i]);
1590 r4_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141591
[email protected]bf4ea2f2014-03-10 22:57:531592 HostPortPair host_port_pair1(r3_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121593 QuicCryptoClientConfig* crypto_config =
1594 QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
[email protected]257f24f2014-04-01 09:15:371595 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171596 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371597 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171598 EXPECT_FALSE(cached1->proof_valid());
1599 EXPECT_TRUE(cached1->source_address_token().empty());
1600
1601 // Mutate the cached1 to have different data.
1602 // TODO(rtenneti): mutate other members of CachedState.
1603 cached1->set_source_address_token(r3_host_name);
1604 cached1->SetProofInvalid();
1605
[email protected]bf4ea2f2014-03-10 22:57:531606 HostPortPair host_port_pair2(r4_host_name, 80);
[email protected]257f24f2014-04-01 09:15:371607 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171608 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371609 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171610 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
1611 EXPECT_TRUE(cached2->source_address_token().empty());
1612 EXPECT_FALSE(cached2->proof_valid());
1613 }
[email protected]c49ff182013-09-28 08:33:261614}
1615
rtenneti38f5cd52014-10-28 20:28:281616TEST_P(QuicStreamFactoryTest, CancelWaitForDataReady) {
rtenneti14abd312015-02-06 21:56:011617 // Don't race quic connections when testing cancel reading of server config
1618 // from disk cache.
1619 if (GetParam().enable_connection_racing)
1620 return;
rtenneti38f5cd52014-10-28 20:28:281621 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
1622 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
1623 const size_t kLoadServerInfoTimeoutMs = 50;
1624 QuicStreamFactoryPeer::SetLoadServerInfoTimeout(
1625 &factory_, kLoadServerInfoTimeoutMs);
1626
1627 MockRead reads[] = {
1628 MockRead(ASYNC, OK, 0) // EOF
1629 };
1630 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1631 socket_factory_.AddSocketDataProvider(&socket_data);
1632 socket_data.StopAfter(1);
1633
1634 crypto_client_stream_factory_.set_handshake_mode(
1635 MockCryptoClientStream::ZERO_RTT);
1636 host_resolver_.set_synchronous_mode(true);
1637 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1638 "192.168.0.1", "");
1639
1640 QuicStreamRequest request(&factory_);
1641 EXPECT_EQ(ERR_IO_PENDING,
1642 request.Request(host_port_pair_,
1643 is_https_,
1644 privacy_mode_,
1645 "GET",
1646 net_log_,
1647 callback_.callback()));
1648
1649 // Verify that the CancelWaitForDataReady task has been posted.
1650 ASSERT_EQ(1u, runner_->GetPostedTasks().size());
1651 EXPECT_EQ(base::TimeDelta::FromMilliseconds(kLoadServerInfoTimeoutMs),
1652 runner_->GetPostedTasks()[0].delay);
1653
1654 runner_->RunNextTask();
1655 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
1656
1657 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1658 EXPECT_TRUE(stream.get());
1659 EXPECT_TRUE(socket_data.at_read_eof());
1660 EXPECT_TRUE(socket_data.at_write_eof());
1661}
1662
rtenneti14abd312015-02-06 21:56:011663TEST_P(QuicStreamFactoryTest, RacingConnections) {
1664 if (!GetParam().enable_connection_racing)
1665 return;
1666 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
1667 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
1668 const size_t kLoadServerInfoTimeoutMs = 50;
1669 QuicStreamFactoryPeer::SetLoadServerInfoTimeout(&factory_,
1670 kLoadServerInfoTimeoutMs);
1671
1672 MockRead reads[] = {
1673 MockRead(ASYNC, OK, 0) // EOF
1674 };
1675 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1676 socket_factory_.AddSocketDataProvider(&socket_data);
1677 socket_data.StopAfter(1);
1678
1679 MockRead reads2[] = {
1680 MockRead(ASYNC, 0, 0) // EOF
1681 };
1682 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1683 socket_factory_.AddSocketDataProvider(&socket_data2);
1684 socket_data2.StopAfter(1);
1685
1686 crypto_client_stream_factory_.set_handshake_mode(
1687 MockCryptoClientStream::ZERO_RTT);
1688 host_resolver_.set_synchronous_mode(true);
1689 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1690 "192.168.0.1", "");
1691
1692 QuicStreamRequest request(&factory_);
1693 QuicServerId server_id(host_port_pair_, is_https_, privacy_mode_);
1694 EXPECT_EQ(ERR_IO_PENDING,
1695 request.Request(host_port_pair_, is_https_, privacy_mode_, "GET",
1696 net_log_, callback_.callback()));
1697 EXPECT_EQ(2u,
1698 QuicStreamFactoryPeer::GetNumberOfActiveJobs(&factory_, server_id));
1699
1700 runner_->RunNextTask();
1701
1702 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1703 EXPECT_TRUE(stream.get());
1704 EXPECT_TRUE(socket_data.at_read_eof());
1705 EXPECT_TRUE(socket_data.at_write_eof());
1706 EXPECT_EQ(0u,
1707 QuicStreamFactoryPeer::GetNumberOfActiveJobs(&factory_, server_id));
1708}
1709
rtenneti34dffe752015-02-24 23:27:321710TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) {
1711 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
1712 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
1713 const size_t kLoadServerInfoTimeoutMs = 50;
1714 QuicStreamFactoryPeer::SetLoadServerInfoTimeout(&factory_,
1715 kLoadServerInfoTimeoutMs);
1716 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_, true);
1717
1718 MockRead reads[] = {
1719 MockRead(ASYNC, OK, 0) // EOF
1720 };
1721 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1722 socket_factory_.AddSocketDataProvider(&socket_data);
1723 socket_data.StopAfter(1);
1724
1725 crypto_client_stream_factory_.set_handshake_mode(
1726 MockCryptoClientStream::ZERO_RTT);
1727 host_resolver_.set_synchronous_mode(true);
1728 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1729 "192.168.0.1", "");
1730
1731 QuicStreamRequest request(&factory_);
1732 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
1733 "GET", net_log_, callback_.callback()));
1734
1735 // If we are waiting for disk cache, we would have posted a task. Verify that
1736 // the CancelWaitForDataReady task hasn't been posted.
1737 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
1738
1739 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1740 EXPECT_TRUE(stream.get());
1741 EXPECT_TRUE(socket_data.at_read_eof());
1742 EXPECT_TRUE(socket_data.at_write_eof());
1743}
1744
[email protected]e13201d82012-12-12 05:00:321745} // namespace test
[email protected]e13201d82012-12-12 05:00:321746} // namespace net