blob: 6bb57e8aa529683d3848aa72a85133389cdb349b [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
rtenneti14abd312015-02-06 21:56:01128 static void SetEnableConnectionRacing(QuicStreamFactory* factory,
129 bool enable_connection_racing) {
130 factory->enable_connection_racing_ = enable_connection_racing;
131 }
132
rtenneti34dffe752015-02-24 23:27:32133 static void SetDisableDiskCache(QuicStreamFactory* factory,
134 bool disable_disk_cache) {
135 factory->disable_disk_cache_ = disable_disk_cache;
136 }
137
rtenneti85dcfac22015-03-27 20:22:19138 static void SetMaxNumberOfLossyConnections(
139 QuicStreamFactory* factory,
140 int max_number_of_lossy_connections) {
141 factory->max_number_of_lossy_connections_ = max_number_of_lossy_connections;
142 }
143
144 static int GetNumberOfLossyConnections(QuicStreamFactory* factory,
145 uint16 port) {
146 return factory->number_of_lossy_connections_[port];
147 }
148
149 static bool IsQuicDisabled(QuicStreamFactory* factory, uint16 port) {
150 return factory->IsQuicDisabled(port);
151 }
152
rtenneti14abd312015-02-06 21:56:01153 static size_t GetNumberOfActiveJobs(QuicStreamFactory* factory,
154 const QuicServerId& server_id) {
155 return (factory->active_jobs_[server_id]).size();
156 }
[email protected]c49ff182013-09-28 08:33:26157};
158
rtenneti38f5cd52014-10-28 20:28:28159class MockQuicServerInfo : public QuicServerInfo {
160 public:
161 MockQuicServerInfo(const QuicServerId& server_id)
162 : QuicServerInfo(server_id) {}
dcheng2339883c2014-12-23 00:23:05163 ~MockQuicServerInfo() override {}
rtenneti38f5cd52014-10-28 20:28:28164
dcheng2339883c2014-12-23 00:23:05165 void Start() override {}
rtenneti38f5cd52014-10-28 20:28:28166
dcheng2339883c2014-12-23 00:23:05167 int WaitForDataReady(const CompletionCallback& callback) override {
rtenneti38f5cd52014-10-28 20:28:28168 return ERR_IO_PENDING;
169 }
170
rtenneti170f36a2015-02-10 19:13:45171 void ResetWaitForDataReadyCallback() override {}
172
dcheng2339883c2014-12-23 00:23:05173 void CancelWaitForDataReadyCallback() override {}
rtenneti38f5cd52014-10-28 20:28:28174
dcheng2339883c2014-12-23 00:23:05175 bool IsDataReady() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28176
dcheng2339883c2014-12-23 00:23:05177 bool IsReadyToPersist() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28178
dcheng2339883c2014-12-23 00:23:05179 void Persist() override {}
rtennetif0b832b2014-11-07 02:32:30180
dcheng2339883c2014-12-23 00:23:05181 void OnExternalCacheHit() override {}
rtenneti38f5cd52014-10-28 20:28:28182};
183
184class MockQuicServerInfoFactory : public QuicServerInfoFactory {
185 public:
186 MockQuicServerInfoFactory() {}
dcheng2339883c2014-12-23 00:23:05187 ~MockQuicServerInfoFactory() override {}
rtenneti38f5cd52014-10-28 20:28:28188
dcheng2339883c2014-12-23 00:23:05189 QuicServerInfo* GetForServer(const QuicServerId& server_id) override {
rtenneti38f5cd52014-10-28 20:28:28190 return new MockQuicServerInfo(server_id);
191 }
192};
193
rtenneti14abd312015-02-06 21:56:01194class QuicStreamFactoryTest : public ::testing::TestWithParam<TestParams> {
[email protected]e13201d82012-12-12 05:00:32195 protected:
196 QuicStreamFactoryTest()
[email protected]457d6952013-12-13 09:24:58197 : random_generator_(0),
198 clock_(new MockClock()),
rtenneti38f5cd52014-10-28 20:28:28199 runner_(new TestTaskRunner(clock_)),
bncb07c05532015-05-14 19:07:20200 maker_(GetParam().version, 0, clock_, kDefaultServerHostName),
[email protected]59c0bbd2014-03-22 04:08:12201 cert_verifier_(CertVerifier::CreateDefault()),
jri2b966f22014-09-02 22:25:36202 channel_id_service_(
rtennetibe635732014-10-02 22:51:42203 new ChannelIDService(new DefaultChannelIDStore(nullptr),
jri2b966f22014-09-02 22:25:36204 base::MessageLoopProxy::current())),
205 factory_(&host_resolver_,
206 &socket_factory_,
207 base::WeakPtr<HttpServerProperties>(),
208 cert_verifier_.get(),
209 channel_id_service_.get(),
210 &transport_security_state_,
211 &crypto_client_stream_factory_,
212 &random_generator_,
213 clock_,
214 kDefaultMaxPacketSize,
215 std::string(),
rtenneti14abd312015-02-06 21:56:01216 SupportedVersions(GetParam().version),
jri2b966f22014-09-02 22:25:36217 /*enable_port_selection=*/true,
jri584002d12014-09-09 00:51:28218 /*always_require_handshake_confirmation=*/false,
219 /*disable_connection_pooling=*/false,
rtenneti2912825c2015-01-06 01:19:46220 /*load_server_info_timeout_srtt_multiplier=*/0.0f,
rtenneti4f809972015-02-11 19:38:34221 /*enable_connection_racing=*/false,
qyearsley3257b7de2015-02-28 06:59:03222 /*enable_non_blocking_io=*/true,
rtenneti34dffe752015-02-24 23:27:32223 /*disable_disk_cache=*/false,
rtenneti85dcfac22015-03-27 20:22:19224 /*max_number_of_lossy_connections=*/0,
225 /*packet_loss_threshold=*/1.0f,
rchc7433572015-02-27 18:16:51226 /*receive_buffer_size=*/0,
jri2b966f22014-09-02 22:25:36227 QuicTagVector()),
[email protected]bf4ea2f2014-03-10 22:57:53228 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
[email protected]9dd3ff0f2014-03-26 09:51:28229 is_https_(false),
[email protected]314b03992014-04-01 01:28:53230 privacy_mode_(PRIVACY_MODE_DISABLED) {
[email protected]11c05872013-08-20 02:04:12231 factory_.set_require_confirmation(false);
[email protected]ca4e0d92014-08-22 16:33:22232 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
rtenneti14abd312015-02-06 21:56:01233 QuicStreamFactoryPeer::SetEnableConnectionRacing(
234 &factory_, GetParam().enable_connection_racing);
[email protected]e13201d82012-12-12 05:00:32235 }
236
[email protected]df157d9d2014-03-10 07:27:27237 scoped_ptr<QuicHttpStream> CreateIfSessionExists(
[email protected]bf4ea2f2014-03-10 22:57:53238 const HostPortPair& host_port_pair,
[email protected]df157d9d2014-03-10 07:27:27239 const BoundNetLog& net_log) {
240 return QuicStreamFactoryPeer::CreateIfSessionExists(
[email protected]bf4ea2f2014-03-10 22:57:53241 &factory_, host_port_pair, false, net_log_);
[email protected]df157d9d2014-03-10 07:27:27242 }
[email protected]e13201d82012-12-12 05:00:32243
[email protected]bf4ea2f2014-03-10 22:57:53244 int GetSourcePortForNewSession(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10245 return GetSourcePortForNewSessionInner(destination, false);
246 }
247
248 int GetSourcePortForNewSessionAndGoAway(
[email protected]bf4ea2f2014-03-10 22:57:53249 const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10250 return GetSourcePortForNewSessionInner(destination, true);
251 }
252
[email protected]bf4ea2f2014-03-10 22:57:53253 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
[email protected]d8e2abf82014-03-06 10:30:10254 bool goaway_received) {
[email protected]3c772402013-12-18 21:38:11255 // Should only be called if there is no active session for this destination.
rtennetibe635732014-10-02 22:51:42256 EXPECT_EQ(nullptr, CreateIfSessionExists(destination, net_log_).get());
[email protected]3c772402013-12-18 21:38:11257 size_t socket_count = socket_factory_.udp_client_sockets().size();
258
259 MockRead reads[] = {
260 MockRead(ASYNC, OK, 0) // EOF
261 };
rtennetibe635732014-10-02 22:51:42262 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]3c772402013-12-18 21:38:11263 socket_data.StopAfter(1);
264 socket_factory_.AddSocketDataProvider(&socket_data);
265
266 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59267 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:48268 request.Request(destination, is_https_, privacy_mode_,
269 destination.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:59270 callback_.callback()));
[email protected]3c772402013-12-18 21:38:11271
272 EXPECT_EQ(OK, callback_.WaitForResult());
273 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
274 EXPECT_TRUE(stream.get());
275 stream.reset();
276
277 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
[email protected]df157d9d2014-03-10 07:27:27278 &factory_, destination, is_https_);
[email protected]3c772402013-12-18 21:38:11279
280 if (socket_count + 1 != socket_factory_.udp_client_sockets().size()) {
281 EXPECT_TRUE(false);
282 return 0;
283 }
284
285 IPEndPoint endpoint;
286 socket_factory_.
287 udp_client_sockets()[socket_count]->GetLocalAddress(&endpoint);
288 int port = endpoint.port();
[email protected]d8e2abf82014-03-06 10:30:10289 if (goaway_received) {
290 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, "");
291 session->OnGoAway(goaway);
292 }
[email protected]3c772402013-12-18 21:38:11293
294 factory_.OnSessionClosed(session);
rtennetibe635732014-10-02 22:51:42295 EXPECT_EQ(nullptr, CreateIfSessionExists(destination, net_log_).get());
rch37de576c2015-05-17 20:28:17296 EXPECT_TRUE(socket_data.AllReadDataConsumed());
297 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:11298 return port;
299 }
300
[email protected]459a7402014-02-10 12:58:52301 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() {
[email protected]66ae5962014-05-22 11:13:05302 QuicStreamId stream_id = kClientDataStreamId1;
[email protected]51cc1342014-04-18 23:44:37303 return maker_.MakeRstPacket(
304 1, true, stream_id,
rtenneti14abd312015-02-06 21:56:01305 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam().version));
[email protected]459a7402014-02-10 12:58:52306 }
307
rtenneti38f5cd52014-10-28 20:28:28308 MockQuicServerInfoFactory quic_server_info_factory_;
[email protected]e13201d82012-12-12 05:00:32309 MockHostResolver host_resolver_;
[email protected]0edce6a2013-05-08 18:02:40310 DeterministicMockClientSocketFactory socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05311 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]9558c5d32012-12-22 00:08:14312 MockRandom random_generator_;
[email protected]872edd9e2013-01-16 08:51:15313 MockClock* clock_; // Owned by factory_.
rtenneti38f5cd52014-10-28 20:28:28314 scoped_refptr<TestTaskRunner> runner_;
rtenneti4b06ae72014-08-26 03:43:43315 QuicTestPacketMaker maker_;
[email protected]59c0bbd2014-03-22 04:08:12316 scoped_ptr<CertVerifier> cert_verifier_;
[email protected]6b8a3c742014-07-25 00:25:35317 scoped_ptr<ChannelIDService> channel_id_service_;
[email protected]080b77932014-08-04 01:22:46318 TransportSecurityState transport_security_state_;
[email protected]e13201d82012-12-12 05:00:32319 QuicStreamFactory factory_;
[email protected]bf4ea2f2014-03-10 22:57:53320 HostPortPair host_port_pair_;
[email protected]6d1b4ed2013-07-10 03:57:54321 bool is_https_;
[email protected]9dd3ff0f2014-03-26 09:51:28322 PrivacyMode privacy_mode_;
[email protected]e13201d82012-12-12 05:00:32323 BoundNetLog net_log_;
324 TestCompletionCallback callback_;
[email protected]e13201d82012-12-12 05:00:32325};
326
rtenneti14abd312015-02-06 21:56:01327INSTANTIATE_TEST_CASE_P(Version,
328 QuicStreamFactoryTest,
329 ::testing::ValuesIn(GetTestParams()));
[email protected]1e960032013-12-20 19:00:20330
331TEST_P(QuicStreamFactoryTest, CreateIfSessionExists) {
rtennetibe635732014-10-02 22:51:42332 EXPECT_EQ(nullptr, CreateIfSessionExists(host_port_pair_, net_log_).get());
[email protected]e13201d82012-12-12 05:00:32333}
334
[email protected]1e960032013-12-20 19:00:20335TEST_P(QuicStreamFactoryTest, Create) {
[email protected]69dfd1b2013-06-04 22:20:12336 MockRead reads[] = {
[email protected]25c31dc2013-06-05 17:56:04337 MockRead(ASYNC, OK, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:12338 };
rtennetibe635732014-10-02 22:51:42339 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:32340 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]25c31dc2013-06-05 17:56:04341 socket_data.StopAfter(1);
[email protected]e13201d82012-12-12 05:00:32342
343 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59344 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:48345 request.Request(host_port_pair_, is_https_, privacy_mode_,
346 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:59347 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32348
349 EXPECT_EQ(OK, callback_.WaitForResult());
350 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0edce6a2013-05-08 18:02:40351 EXPECT_TRUE(stream.get());
[email protected]e13201d82012-12-12 05:00:32352
353 // Will reset stream 3.
[email protected]bf4ea2f2014-03-10 22:57:53354 stream = CreateIfSessionExists(host_port_pair_, net_log_);
[email protected]e13201d82012-12-12 05:00:32355 EXPECT_TRUE(stream.get());
356
[email protected]6d1b4ed2013-07-10 03:57:54357 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
358 // in streams on different sessions.
[email protected]e13201d82012-12-12 05:00:32359 QuicStreamRequest request2(&factory_);
bnc68d401dd2015-05-18 20:31:48360 EXPECT_EQ(OK, request2.Request(host_port_pair_, is_https_, privacy_mode_,
361 host_port_pair_.host(), "GET", 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
rch37de576c2015-05-17 20:28:17366 EXPECT_TRUE(socket_data.AllReadDataConsumed());
367 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:32368}
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_);
bnc68d401dd2015-05-18 20:31:48385 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
386 host_port_pair_.host(), "GET", net_log_,
387 callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17388
389 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
390 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17391 EXPECT_TRUE(socket_data.AllReadDataConsumed());
392 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17393}
394
395TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
396 MockRead reads[] = {
397 MockRead(ASYNC, OK, 0) // EOF
398 };
rtennetibe635732014-10-02 22:51:42399 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17400 socket_factory_.AddSocketDataProvider(&socket_data);
401 socket_data.StopAfter(1);
402
403 crypto_client_stream_factory_.set_handshake_mode(
404 MockCryptoClientStream::ZERO_RTT);
405 host_resolver_.set_synchronous_mode(true);
406 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
407 "192.168.0.1", "");
408
409 QuicStreamRequest request(&factory_);
410 // Posts require handshake confirmation, so this will return asynchronously.
411 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:48412 request.Request(host_port_pair_, is_https_, privacy_mode_,
413 host_port_pair_.host(), "POST", net_log_,
[email protected]8bd2b812014-03-26 04:01:17414 callback_.callback()));
415
416 // Confirm the handshake and verify that the stream is created.
417 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
418 QuicSession::HANDSHAKE_CONFIRMED);
419
420 EXPECT_EQ(OK, callback_.WaitForResult());
421 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
422 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17423 EXPECT_TRUE(socket_data.AllReadDataConsumed());
424 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17425}
426
bnc68d401dd2015-05-18 20:31:48427TEST_P(QuicStreamFactoryTest, NoZeroRttForDifferentHost) {
428 MockRead reads[] = {
429 MockRead(ASYNC, OK, 0),
430 };
431 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
432 socket_factory_.AddSocketDataProvider(&socket_data);
433 socket_data.StopAfter(1);
434
435 crypto_client_stream_factory_.set_handshake_mode(
436 MockCryptoClientStream::ZERO_RTT);
437 host_resolver_.set_synchronous_mode(true);
438 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
439 "192.168.0.1", "");
440
441 QuicStreamRequest request(&factory_);
442 int rv = request.Request(host_port_pair_, is_https_, privacy_mode_,
443 "different.host.example.com", "GET", net_log_,
444 callback_.callback());
445 // If server and origin have different hostnames, then handshake confirmation
446 // should be required, so Request will return asynchronously.
447 EXPECT_EQ(ERR_IO_PENDING, rv);
448 // Confirm handshake.
449 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
450 QuicSession::HANDSHAKE_CONFIRMED);
451 EXPECT_EQ(OK, callback_.WaitForResult());
452
453 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
454 EXPECT_TRUE(stream.get());
455 EXPECT_TRUE(socket_data.AllReadDataConsumed());
456 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
457}
458
[email protected]df157d9d2014-03-10 07:27:27459TEST_P(QuicStreamFactoryTest, CreateHttpVsHttps) {
460 MockRead reads[] = {
461 MockRead(ASYNC, OK, 0) // EOF
462 };
rtennetibe635732014-10-02 22:51:42463 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
464 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]df157d9d2014-03-10 07:27:27465 socket_factory_.AddSocketDataProvider(&socket_data1);
466 socket_factory_.AddSocketDataProvider(&socket_data2);
467 socket_data1.StopAfter(1);
468 socket_data2.StopAfter(1);
469
470 QuicStreamRequest request(&factory_);
471 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:48472 request.Request(host_port_pair_, is_https_, privacy_mode_,
473 host_port_pair_.host(), "GET", net_log_,
[email protected]df157d9d2014-03-10 07:27:27474 callback_.callback()));
475
476 EXPECT_EQ(OK, callback_.WaitForResult());
477 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
478 EXPECT_TRUE(stream.get());
479
480 QuicStreamRequest request2(&factory_);
481 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:48482 request2.Request(host_port_pair_, !is_https_, privacy_mode_,
483 host_port_pair_.host(), "GET", net_log_,
[email protected]df157d9d2014-03-10 07:27:27484 callback_.callback()));
485 EXPECT_EQ(OK, callback_.WaitForResult());
486 stream = request2.ReleaseStream();
487 EXPECT_TRUE(stream.get());
488 stream.reset();
489
490 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53491 &factory_, host_port_pair_, is_https_),
[email protected]df157d9d2014-03-10 07:27:27492 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53493 &factory_, host_port_pair_, !is_https_));
[email protected]df157d9d2014-03-10 07:27:27494
rch37de576c2015-05-17 20:28:17495 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
496 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
497 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
498 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]df157d9d2014-03-10 07:27:27499}
500
[email protected]5db452202014-08-19 05:22:15501TEST_P(QuicStreamFactoryTest, Pooling) {
[email protected]eed749f92013-12-23 18:57:38502 MockRead reads[] = {
503 MockRead(ASYNC, OK, 0) // EOF
504 };
rtennetibe635732014-10-02 22:51:42505 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38506 socket_factory_.AddSocketDataProvider(&socket_data);
507 socket_data.StopAfter(1);
508
[email protected]bf4ea2f2014-03-10 22:57:53509 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38510 host_resolver_.set_synchronous_mode(true);
511 host_resolver_.rules()->AddIPLiteralRule(
512 kDefaultServerHostName, "192.168.0.1", "");
513 host_resolver_.rules()->AddIPLiteralRule(
514 "mail.google.com", "192.168.0.1", "");
515
516 QuicStreamRequest request(&factory_);
bnc68d401dd2015-05-18 20:31:48517 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
518 host_port_pair_.host(), "GET", net_log_,
519 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38520 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
521 EXPECT_TRUE(stream.get());
522
523 TestCompletionCallback callback;
524 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59525 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48526 request2.Request(server2, is_https_, privacy_mode_, server2.host(),
527 "GET", net_log_, callback.callback()));
[email protected]eed749f92013-12-23 18:57:38528 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
529 EXPECT_TRUE(stream2.get());
530
531 EXPECT_EQ(
[email protected]df157d9d2014-03-10 07:27:27532 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53533 &factory_, host_port_pair_, is_https_),
[email protected]df157d9d2014-03-10 07:27:27534 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38535
rch37de576c2015-05-17 20:28:17536 EXPECT_TRUE(socket_data.AllReadDataConsumed());
537 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38538}
539
jri584002d12014-09-09 00:51:28540TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) {
541 MockRead reads[] = {
542 MockRead(ASYNC, OK, 0) // EOF
543 };
rtennetibe635732014-10-02 22:51:42544 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
545 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28546 socket_factory_.AddSocketDataProvider(&socket_data1);
547 socket_factory_.AddSocketDataProvider(&socket_data2);
548 socket_data1.StopAfter(1);
549 socket_data2.StopAfter(1);
550
551 HostPortPair server2("mail.google.com", kDefaultServerPort);
552 host_resolver_.set_synchronous_mode(true);
553 host_resolver_.rules()->AddIPLiteralRule(
554 kDefaultServerHostName, "192.168.0.1", "");
555 host_resolver_.rules()->AddIPLiteralRule(
556 "mail.google.com", "192.168.0.1", "");
557
558 // Disable connection pooling.
559 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
560
561 QuicStreamRequest request(&factory_);
bnc68d401dd2015-05-18 20:31:48562 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
563 host_port_pair_.host(), "GET", net_log_,
564 callback_.callback()));
jri584002d12014-09-09 00:51:28565 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
566 EXPECT_TRUE(stream.get());
567
568 TestCompletionCallback callback;
569 QuicStreamRequest request2(&factory_);
570 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48571 request2.Request(server2, is_https_, privacy_mode_, server2.host(),
572 "GET", net_log_, callback.callback()));
jri584002d12014-09-09 00:51:28573 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
574 EXPECT_TRUE(stream2.get());
575
576 EXPECT_NE(
577 QuicStreamFactoryPeer::GetActiveSession(
578 &factory_, host_port_pair_, is_https_),
579 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_));
580
rch37de576c2015-05-17 20:28:17581 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
582 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
583 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
584 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28585}
586
[email protected]eed749f92013-12-23 18:57:38587TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
588 MockRead reads[] = {
589 MockRead(ASYNC, OK, 0) // EOF
590 };
rtennetibe635732014-10-02 22:51:42591 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
592 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38593 socket_factory_.AddSocketDataProvider(&socket_data1);
594 socket_factory_.AddSocketDataProvider(&socket_data2);
595 socket_data1.StopAfter(1);
596 socket_data2.StopAfter(1);
597
[email protected]bf4ea2f2014-03-10 22:57:53598 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38599 host_resolver_.set_synchronous_mode(true);
600 host_resolver_.rules()->AddIPLiteralRule(
601 kDefaultServerHostName, "192.168.0.1", "");
602 host_resolver_.rules()->AddIPLiteralRule(
603 "mail.google.com", "192.168.0.1", "");
604
605 QuicStreamRequest request(&factory_);
bnc68d401dd2015-05-18 20:31:48606 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
607 host_port_pair_.host(), "GET", net_log_,
608 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38609 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
610 EXPECT_TRUE(stream.get());
611
612 TestCompletionCallback callback;
613 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59614 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48615 request2.Request(server2, is_https_, privacy_mode_, server2.host(),
616 "GET", net_log_, callback.callback()));
[email protected]eed749f92013-12-23 18:57:38617 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
618 EXPECT_TRUE(stream2.get());
619
[email protected]df157d9d2014-03-10 07:27:27620 factory_.OnSessionGoingAway(QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53621 &factory_, host_port_pair_, is_https_));
[email protected]df157d9d2014-03-10 07:27:27622 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53623 &factory_, host_port_pair_, is_https_));
[email protected]df157d9d2014-03-10 07:27:27624 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
625 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38626
627 TestCompletionCallback callback3;
628 QuicStreamRequest request3(&factory_);
[email protected]974849d2014-02-06 01:32:59629 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48630 request3.Request(server2, is_https_, privacy_mode_, server2.host(),
631 "GET", net_log_, callback3.callback()));
[email protected]eed749f92013-12-23 18:57:38632 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
633 EXPECT_TRUE(stream3.get());
634
[email protected]df157d9d2014-03-10 07:27:27635 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(
636 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38637
rch37de576c2015-05-17 20:28:17638 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
639 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
640 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
641 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38642}
643
[email protected]5db452202014-08-19 05:22:15644TEST_P(QuicStreamFactoryTest, HttpsPooling) {
[email protected]eed749f92013-12-23 18:57:38645 MockRead reads[] = {
646 MockRead(ASYNC, OK, 0) // EOF
647 };
rtennetibe635732014-10-02 22:51:42648 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38649 socket_factory_.AddSocketDataProvider(&socket_data);
650 socket_data.StopAfter(1);
651
[email protected]bf4ea2f2014-03-10 22:57:53652 HostPortPair server1("www.example.org", 443);
653 HostPortPair server2("mail.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38654
655 // Load a cert that is valid for:
656 // www.example.org (server1)
657 // mail.example.org (server2)
658 // www.example.com
659 base::FilePath certs_dir = GetTestCertsDirectory();
660 scoped_refptr<X509Certificate> test_cert(
661 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
rtennetibe635732014-10-02 22:51:42662 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
[email protected]b694e48c2014-03-18 17:10:13663 ProofVerifyDetailsChromium verify_details;
664 verify_details.cert_verify_result.verified_cert = test_cert;
[email protected]5db452202014-08-19 05:22:15665 verify_details.cert_verify_result.is_issued_by_known_root = true;
bnc20daf9a2015-05-15 17:11:01666 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38667
668 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53669 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
670 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38671
672 QuicStreamRequest request(&factory_);
673 is_https_ = true;
[email protected]974849d2014-02-06 01:32:59674 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48675 request.Request(server1, is_https_, privacy_mode_, server1.host(),
676 "GET", net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38677 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
678 EXPECT_TRUE(stream.get());
679
680 TestCompletionCallback callback;
681 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59682 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48683 request2.Request(server2, is_https_, privacy_mode_, server2.host(),
684 "GET", net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38685 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
686 EXPECT_TRUE(stream2.get());
687
[email protected]df157d9d2014-03-10 07:27:27688 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
689 &factory_, server1, is_https_),
690 QuicStreamFactoryPeer::GetActiveSession(
691 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38692
rch37de576c2015-05-17 20:28:17693 EXPECT_TRUE(socket_data.AllReadDataConsumed());
694 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38695}
696
jri584002d12014-09-09 00:51:28697TEST_P(QuicStreamFactoryTest, NoHttpsPoolingIfDisabled) {
698 MockRead reads[] = {
699 MockRead(ASYNC, OK, 0) // EOF
700 };
rtennetibe635732014-10-02 22:51:42701 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
702 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28703 socket_factory_.AddSocketDataProvider(&socket_data1);
704 socket_factory_.AddSocketDataProvider(&socket_data2);
705 socket_data1.StopAfter(1);
706 socket_data2.StopAfter(1);
707
708 HostPortPair server1("www.example.org", 443);
709 HostPortPair server2("mail.example.org", 443);
710
711 // Load a cert that is valid for:
712 // www.example.org (server1)
713 // mail.example.org (server2)
714 // www.example.com
715 base::FilePath certs_dir = GetTestCertsDirectory();
716 scoped_refptr<X509Certificate> test_cert(
717 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
rtennetibe635732014-10-02 22:51:42718 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
jri584002d12014-09-09 00:51:28719 ProofVerifyDetailsChromium verify_details;
720 verify_details.cert_verify_result.verified_cert = test_cert;
721 verify_details.cert_verify_result.is_issued_by_known_root = true;
bnc20daf9a2015-05-15 17:11:01722 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28723
724 host_resolver_.set_synchronous_mode(true);
725 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
726 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
727
728 // Disable connection pooling.
729 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
730
731 QuicStreamRequest request(&factory_);
732 is_https_ = true;
733 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48734 request.Request(server1, is_https_, privacy_mode_, server1.host(),
735 "GET", net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28736 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
737 EXPECT_TRUE(stream.get());
738
739 TestCompletionCallback callback;
740 QuicStreamRequest request2(&factory_);
741 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48742 request2.Request(server2, is_https_, privacy_mode_, server2.host(),
743 "GET", net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28744 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
745 EXPECT_TRUE(stream2.get());
746
747 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
748 &factory_, server1, is_https_),
749 QuicStreamFactoryPeer::GetActiveSession(
750 &factory_, server2, is_https_));
751
rch37de576c2015-05-17 20:28:17752 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
753 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
754 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
755 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28756}
757
[email protected]eed749f92013-12-23 18:57:38758TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithCertMismatch) {
759 MockRead reads[] = {
760 MockRead(ASYNC, OK, 0) // EOF
761 };
rtennetibe635732014-10-02 22:51:42762 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
763 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38764 socket_factory_.AddSocketDataProvider(&socket_data1);
765 socket_factory_.AddSocketDataProvider(&socket_data2);
766 socket_data1.StopAfter(1);
767 socket_data2.StopAfter(1);
768
[email protected]bf4ea2f2014-03-10 22:57:53769 HostPortPair server1("www.example.org", 443);
770 HostPortPair server2("mail.google.com", 443);
[email protected]eed749f92013-12-23 18:57:38771
772 // Load a cert that is valid for:
773 // www.example.org (server1)
774 // mail.example.org
775 // www.example.com
776 // But is not valid for mail.google.com (server2).
777 base::FilePath certs_dir = GetTestCertsDirectory();
778 scoped_refptr<X509Certificate> test_cert(
779 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
rtennetibe635732014-10-02 22:51:42780 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
[email protected]b694e48c2014-03-18 17:10:13781 ProofVerifyDetailsChromium verify_details;
782 verify_details.cert_verify_result.verified_cert = test_cert;
bnc20daf9a2015-05-15 17:11:01783 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38784
785 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53786 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
787 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38788
789 QuicStreamRequest request(&factory_);
790 is_https_ = true;
[email protected]974849d2014-02-06 01:32:59791 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48792 request.Request(server1, is_https_, privacy_mode_, server1.host(),
793 "GET", net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38794 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
795 EXPECT_TRUE(stream.get());
796
797 TestCompletionCallback callback;
798 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59799 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48800 request2.Request(server2, is_https_, privacy_mode_, server2.host(),
801 "GET", net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38802 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
803 EXPECT_TRUE(stream2.get());
804
[email protected]df157d9d2014-03-10 07:27:27805 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
806 &factory_, server1, is_https_),
807 QuicStreamFactoryPeer::GetActiveSession(
808 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38809
rch37de576c2015-05-17 20:28:17810 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
811 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
812 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
813 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38814}
815
[email protected]5db452202014-08-19 05:22:15816TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
817 MockRead reads[] = {
818 MockRead(ASYNC, OK, 0) // EOF
819 };
rtennetibe635732014-10-02 22:51:42820 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15821 socket_factory_.AddSocketDataProvider(&socket_data);
822 socket_data.StopAfter(1);
823
824 HostPortPair server1("www.example.org", 443);
825 HostPortPair server2("mail.example.org", 443);
826 uint8 primary_pin = 1;
827 uint8 backup_pin = 2;
828 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
829 backup_pin);
830
831 // Load a cert that is valid for:
832 // www.example.org (server1)
833 // mail.example.org (server2)
834 base::FilePath certs_dir = GetTestCertsDirectory();
835 scoped_refptr<X509Certificate> test_cert(
836 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
rtennetibe635732014-10-02 22:51:42837 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
[email protected]5db452202014-08-19 05:22:15838 ProofVerifyDetailsChromium verify_details;
839 verify_details.cert_verify_result.verified_cert = test_cert;
840 verify_details.cert_verify_result.is_issued_by_known_root = true;
841 verify_details.cert_verify_result.public_key_hashes.push_back(
842 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01843 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]5db452202014-08-19 05:22:15844
845 host_resolver_.set_synchronous_mode(true);
846 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
847 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
848
849 QuicStreamRequest request(&factory_);
850 is_https_ = true;
851 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48852 request.Request(server1, is_https_, privacy_mode_, server1.host(),
853 "GET", net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15854 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
855 EXPECT_TRUE(stream.get());
856
857 TestCompletionCallback callback;
858 QuicStreamRequest request2(&factory_);
859 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48860 request2.Request(server2, is_https_, privacy_mode_, server2.host(),
861 "GET", net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15862 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
863 EXPECT_TRUE(stream2.get());
864
865 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
866 &factory_, server1, is_https_),
867 QuicStreamFactoryPeer::GetActiveSession(
868 &factory_, server2, is_https_));
869
rch37de576c2015-05-17 20:28:17870 EXPECT_TRUE(socket_data.AllReadDataConsumed());
871 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:15872}
873
jri584002d12014-09-09 00:51:28874TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithMatchingPinsIfDisabled) {
875 MockRead reads[] = {
876 MockRead(ASYNC, OK, 0) // EOF
877 };
rtennetibe635732014-10-02 22:51:42878 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
879 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28880 socket_factory_.AddSocketDataProvider(&socket_data1);
881 socket_factory_.AddSocketDataProvider(&socket_data2);
882 socket_data1.StopAfter(1);
883 socket_data2.StopAfter(1);
884
885 HostPortPair server1("www.example.org", 443);
886 HostPortPair server2("mail.example.org", 443);
887 uint8 primary_pin = 1;
888 uint8 backup_pin = 2;
889 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
890 backup_pin);
891
892 // Load a cert that is valid for:
893 // www.example.org (server1)
894 // mail.example.org (server2)
895 base::FilePath certs_dir = GetTestCertsDirectory();
896 scoped_refptr<X509Certificate> test_cert(
897 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
rtennetibe635732014-10-02 22:51:42898 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
jri584002d12014-09-09 00:51:28899 ProofVerifyDetailsChromium verify_details;
900 verify_details.cert_verify_result.verified_cert = test_cert;
901 verify_details.cert_verify_result.is_issued_by_known_root = true;
902 verify_details.cert_verify_result.public_key_hashes.push_back(
903 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01904 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28905
906 host_resolver_.set_synchronous_mode(true);
907 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
908 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
909
910 // Disable connection pooling.
911 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
912
913 QuicStreamRequest request(&factory_);
914 is_https_ = true;
915 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48916 request.Request(server1, is_https_, privacy_mode_, server1.host(),
917 "GET", net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28918 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
919 EXPECT_TRUE(stream.get());
920
921 TestCompletionCallback callback;
922 QuicStreamRequest request2(&factory_);
923 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48924 request2.Request(server2, is_https_, privacy_mode_, server2.host(),
925 "GET", net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28926 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
927 EXPECT_TRUE(stream2.get());
928
929 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
930 &factory_, server1, is_https_),
931 QuicStreamFactoryPeer::GetActiveSession(
932 &factory_, server2, is_https_));
933
rch37de576c2015-05-17 20:28:17934 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
935 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
936 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
937 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28938}
939
[email protected]5db452202014-08-19 05:22:15940TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
941 MockRead reads[] = {
942 MockRead(ASYNC, OK, 0) // EOF
943 };
rtennetibe635732014-10-02 22:51:42944 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
945 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15946 socket_factory_.AddSocketDataProvider(&socket_data1);
947 socket_factory_.AddSocketDataProvider(&socket_data2);
948 socket_data1.StopAfter(1);
949 socket_data2.StopAfter(1);
950
951 HostPortPair server1("www.example.org", 443);
952 HostPortPair server2("mail.example.org", 443);
953 uint8 primary_pin = 1;
954 uint8 backup_pin = 2;
955 uint8 bad_pin = 3;
956 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
957 backup_pin);
958
959 // Load a cert that is valid for:
960 // www.example.org (server1)
961 // mail.example.org (server2)
962 base::FilePath certs_dir = GetTestCertsDirectory();
963 scoped_refptr<X509Certificate> test_cert(
964 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
rtennetibe635732014-10-02 22:51:42965 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
[email protected]5db452202014-08-19 05:22:15966
bnc20daf9a2015-05-15 17:11:01967 ProofVerifyDetailsChromium verify_details1;
968 verify_details1.cert_verify_result.verified_cert = test_cert;
969 verify_details1.cert_verify_result.is_issued_by_known_root = true;
970 verify_details1.cert_verify_result.public_key_hashes.push_back(
971 test::GetTestHashValue(bad_pin));
972 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
973
974 ProofVerifyDetailsChromium verify_details2;
975 verify_details2.cert_verify_result.verified_cert = test_cert;
976 verify_details2.cert_verify_result.is_issued_by_known_root = true;
977 verify_details2.cert_verify_result.public_key_hashes.push_back(
978 test::GetTestHashValue(primary_pin));
979 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
[email protected]5db452202014-08-19 05:22:15980
981 host_resolver_.set_synchronous_mode(true);
982 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
983 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
984
985 QuicStreamRequest request(&factory_);
986 is_https_ = true;
987 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48988 request.Request(server1, is_https_, privacy_mode_, server1.host(),
989 "GET", net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15990 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
991 EXPECT_TRUE(stream.get());
992
993 TestCompletionCallback callback;
994 QuicStreamRequest request2(&factory_);
995 EXPECT_EQ(OK,
bnc68d401dd2015-05-18 20:31:48996 request2.Request(server2, is_https_, privacy_mode_, server2.host(),
997 "GET", net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15998 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
999 EXPECT_TRUE(stream2.get());
1000
1001 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
1002 &factory_, server1, is_https_),
1003 QuicStreamFactoryPeer::GetActiveSession(
1004 &factory_, server2, is_https_));
1005
rch37de576c2015-05-17 20:28:171006 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1007 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1008 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1009 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:151010}
1011
[email protected]1e960032013-12-20 19:00:201012TEST_P(QuicStreamFactoryTest, Goaway) {
[email protected]4d283b32013-10-17 12:57:271013 MockRead reads[] = {
1014 MockRead(ASYNC, OK, 0) // EOF
1015 };
rtennetibe635732014-10-02 22:51:421016 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271017 socket_data.StopAfter(1);
1018 socket_factory_.AddSocketDataProvider(&socket_data);
rtennetibe635732014-10-02 22:51:421019 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271020 socket_data2.StopAfter(1);
1021 socket_factory_.AddSocketDataProvider(&socket_data2);
1022
1023 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591024 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481025 request.Request(host_port_pair_, is_https_, privacy_mode_,
1026 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591027 callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271028
1029 EXPECT_EQ(OK, callback_.WaitForResult());
1030 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1031 EXPECT_TRUE(stream.get());
1032
1033 // Mark the session as going away. Ensure that while it is still alive
1034 // that it is no longer active.
1035 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:531036 &factory_, host_port_pair_, is_https_);
[email protected]4d283b32013-10-17 12:57:271037 factory_.OnSessionGoingAway(session);
1038 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
[email protected]df157d9d2014-03-10 07:27:271039 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:531040 &factory_, host_port_pair_, is_https_));
rtennetibe635732014-10-02 22:51:421041 EXPECT_EQ(nullptr, CreateIfSessionExists(host_port_pair_, net_log_).get());
[email protected]4d283b32013-10-17 12:57:271042
1043 // Create a new request for the same destination and verify that a
1044 // new session is created.
1045 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591046 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481047 request2.Request(host_port_pair_, is_https_, privacy_mode_,
1048 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591049 callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271050 EXPECT_EQ(OK, callback_.WaitForResult());
1051 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1052 EXPECT_TRUE(stream2.get());
1053
1054 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(&factory_,
[email protected]bf4ea2f2014-03-10 22:57:531055 host_port_pair_,
[email protected]df157d9d2014-03-10 07:27:271056 is_https_));
[email protected]4d283b32013-10-17 12:57:271057 EXPECT_NE(session,
1058 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:531059 &factory_, host_port_pair_, is_https_));
[email protected]4d283b32013-10-17 12:57:271060 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
1061
1062 stream2.reset();
1063 stream.reset();
1064
rch37de576c2015-05-17 20:28:171065 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1066 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1067 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1068 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]4d283b32013-10-17 12:57:271069}
1070
[email protected]1e960032013-12-20 19:00:201071TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
[email protected]0b2294d32013-08-02 00:46:361072 MockRead reads[] = {
1073 MockRead(ASYNC, OK, 0) // EOF
1074 };
[email protected]66ae5962014-05-22 11:13:051075 QuicStreamId stream_id = kClientDataStreamId1;
[email protected]1e960032013-12-20 19:00:201076 scoped_ptr<QuicEncryptedPacket> rst(
1077 maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
[email protected]06ff5152013-08-29 01:03:051078 MockWrite writes[] = {
1079 MockWrite(ASYNC, rst->data(), rst->length(), 1),
1080 };
1081 DeterministicSocketData socket_data(reads, arraysize(reads),
1082 writes, arraysize(writes));
[email protected]0b2294d32013-08-02 00:46:361083 socket_factory_.AddSocketDataProvider(&socket_data);
1084 socket_data.StopAfter(1);
1085
1086 HttpRequestInfo request_info;
1087 std::vector<QuicHttpStream*> streams;
1088 // The MockCryptoClientStream sets max_open_streams to be
rtenneti6a4cf3b2015-01-09 03:41:151089 // kDefaultMaxStreamsPerConnection / 2.
1090 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection / 2; i++) {
[email protected]0b2294d32013-08-02 00:46:361091 QuicStreamRequest request(&factory_);
bnc68d401dd2015-05-18 20:31:481092 int rv = request.Request(host_port_pair_, is_https_, privacy_mode_,
1093 host_port_pair_.host(), "GET", net_log_,
[email protected]0b2294d32013-08-02 00:46:361094 callback_.callback());
1095 if (i == 0) {
1096 EXPECT_EQ(ERR_IO_PENDING, rv);
1097 EXPECT_EQ(OK, callback_.WaitForResult());
1098 } else {
1099 EXPECT_EQ(OK, rv);
1100 }
1101 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1102 EXPECT_TRUE(stream);
1103 EXPECT_EQ(OK, stream->InitializeStream(
1104 &request_info, DEFAULT_PRIORITY, net_log_, CompletionCallback()));
1105 streams.push_back(stream.release());
1106 }
1107
1108 QuicStreamRequest request(&factory_);
bnc68d401dd2015-05-18 20:31:481109 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
1110 host_port_pair_.host(), "GET", net_log_,
1111 CompletionCallback()));
[email protected]0b2294d32013-08-02 00:46:361112 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1113 EXPECT_TRUE(stream);
1114 EXPECT_EQ(ERR_IO_PENDING, stream->InitializeStream(
1115 &request_info, DEFAULT_PRIORITY, net_log_, callback_.callback()));
1116
1117 // Close the first stream.
1118 streams.front()->Close(false);
1119
1120 ASSERT_TRUE(callback_.have_result());
1121
1122 EXPECT_EQ(OK, callback_.WaitForResult());
1123
rch37de576c2015-05-17 20:28:171124 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1125 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]0b2294d32013-08-02 00:46:361126 STLDeleteElements(&streams);
1127}
1128
[email protected]1e960032013-12-20 19:00:201129TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
rtennetibe635732014-10-02 22:51:421130 DeterministicSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321131 socket_factory_.AddSocketDataProvider(&socket_data);
1132
[email protected]3c772402013-12-18 21:38:111133 host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName);
[email protected]e13201d82012-12-12 05:00:321134
1135 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591136 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481137 request.Request(host_port_pair_, is_https_, privacy_mode_,
1138 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591139 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321140
1141 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
1142
rch37de576c2015-05-17 20:28:171143 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1144 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321145}
1146
[email protected]1e960032013-12-20 19:00:201147TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
[email protected]3c772402013-12-18 21:38:111148 MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
rtennetibe635732014-10-02 22:51:421149 DeterministicSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]3c772402013-12-18 21:38:111150 socket_data.set_connect_data(connect);
1151 socket_factory_.AddSocketDataProvider(&socket_data);
1152 socket_data.StopAfter(1);
1153
1154 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591155 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481156 request.Request(host_port_pair_, is_https_, privacy_mode_,
1157 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591158 callback_.callback()));
[email protected]3c772402013-12-18 21:38:111159
1160 EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult());
1161
rch37de576c2015-05-17 20:28:171162 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1163 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:111164}
1165
[email protected]1e960032013-12-20 19:00:201166TEST_P(QuicStreamFactoryTest, CancelCreate) {
[email protected]69dfd1b2013-06-04 22:20:121167 MockRead reads[] = {
[email protected]25c31dc2013-06-05 17:56:041168 MockRead(ASYNC, OK, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121169 };
rtennetibe635732014-10-02 22:51:421170 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321171 socket_factory_.AddSocketDataProvider(&socket_data);
1172 {
1173 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591174 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481175 request.Request(host_port_pair_, is_https_, privacy_mode_,
1176 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591177 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321178 }
1179
[email protected]25c31dc2013-06-05 17:56:041180 socket_data.StopAfter(1);
[email protected]e13201d82012-12-12 05:00:321181 base::RunLoop run_loop;
1182 run_loop.RunUntilIdle();
1183
1184 scoped_ptr<QuicHttpStream> stream(
[email protected]bf4ea2f2014-03-10 22:57:531185 CreateIfSessionExists(host_port_pair_, net_log_));
[email protected]e13201d82012-12-12 05:00:321186 EXPECT_TRUE(stream.get());
1187 stream.reset();
1188
rch37de576c2015-05-17 20:28:171189 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1190 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321191}
1192
[email protected]1e960032013-12-20 19:00:201193TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) {
[email protected]3c772402013-12-18 21:38:111194 // Sequentially connect to the default host, then another host, and then the
1195 // default host. Verify that the default host gets a consistent ephemeral
1196 // port, that is different from the other host's connection.
1197
1198 std::string other_server_name = "other.google.com";
1199 EXPECT_NE(kDefaultServerHostName, other_server_name);
1200 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort);
[email protected]3c772402013-12-18 21:38:111201
[email protected]bf4ea2f2014-03-10 22:57:531202 int original_port = GetSourcePortForNewSession(host_port_pair_);
1203 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2));
1204 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]3c772402013-12-18 21:38:111205}
1206
[email protected]d8e2abf82014-03-06 10:30:101207TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) {
1208 // Get a session to the host using the port suggester.
1209 int original_port =
[email protected]bf4ea2f2014-03-10 22:57:531210 GetSourcePortForNewSessionAndGoAway(host_port_pair_);
[email protected]d8e2abf82014-03-06 10:30:101211 // Verify that the port is different after the goaway.
[email protected]bf4ea2f2014-03-10 22:57:531212 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101213 // Since the previous session did not goaway we should see the original port.
[email protected]bf4ea2f2014-03-10 22:57:531214 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101215}
1216
[email protected]1e960032013-12-20 19:00:201217TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
[email protected]56dfb902013-01-03 23:17:551218 MockRead reads[] = {
[email protected]0edce6a2013-05-08 18:02:401219 MockRead(ASYNC, 0, 0) // EOF
[email protected]56dfb902013-01-03 23:17:551220 };
[email protected]459a7402014-02-10 12:58:521221 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1222 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311223 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521224 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421225 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521226 writes.size());
[email protected]56dfb902013-01-03 23:17:551227 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0edce6a2013-05-08 18:02:401228 socket_data.StopAfter(1);
[email protected]56dfb902013-01-03 23:17:551229
[email protected]69dfd1b2013-06-04 22:20:121230 MockRead reads2[] = {
[email protected]25c31dc2013-06-05 17:56:041231 MockRead(ASYNC, 0, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121232 };
rtennetibe635732014-10-02 22:51:421233 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]56dfb902013-01-03 23:17:551234 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]0edce6a2013-05-08 18:02:401235 socket_data2.StopAfter(1);
[email protected]56dfb902013-01-03 23:17:551236
1237 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591238 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481239 request.Request(host_port_pair_, is_https_, privacy_mode_,
1240 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591241 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551242
1243 EXPECT_EQ(OK, callback_.WaitForResult());
1244 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361245 HttpRequestInfo request_info;
1246 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1247 DEFAULT_PRIORITY,
1248 net_log_, CompletionCallback()));
[email protected]56dfb902013-01-03 23:17:551249
1250 // Close the session and verify that stream saw the error.
1251 factory_.CloseAllSessions(ERR_INTERNET_DISCONNECTED);
1252 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1253 stream->ReadResponseHeaders(callback_.callback()));
1254
1255 // Now attempting to request a stream to the same origin should create
1256 // a new session.
1257
1258 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591259 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481260 request2.Request(host_port_pair_, is_https_, privacy_mode_,
1261 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591262 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551263
1264 EXPECT_EQ(OK, callback_.WaitForResult());
1265 stream = request2.ReleaseStream();
1266 stream.reset(); // Will reset stream 3.
1267
rch37de576c2015-05-17 20:28:171268 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1269 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1270 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1271 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]56dfb902013-01-03 23:17:551272}
1273
[email protected]1e960032013-12-20 19:00:201274TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
[email protected]f698a012013-05-06 20:18:591275 MockRead reads[] = {
[email protected]0edce6a2013-05-08 18:02:401276 MockRead(ASYNC, 0, 0) // EOF
[email protected]f698a012013-05-06 20:18:591277 };
[email protected]459a7402014-02-10 12:58:521278 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1279 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311280 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521281 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421282 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521283 writes.size());
[email protected]f698a012013-05-06 20:18:591284 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0edce6a2013-05-08 18:02:401285 socket_data.StopAfter(1);
[email protected]f698a012013-05-06 20:18:591286
[email protected]69dfd1b2013-06-04 22:20:121287 MockRead reads2[] = {
[email protected]25c31dc2013-06-05 17:56:041288 MockRead(ASYNC, 0, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121289 };
rtennetibe635732014-10-02 22:51:421290 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]f698a012013-05-06 20:18:591291 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]0edce6a2013-05-08 18:02:401292 socket_data2.StopAfter(1);
[email protected]f698a012013-05-06 20:18:591293
1294 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591295 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481296 request.Request(host_port_pair_, is_https_, privacy_mode_,
1297 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591298 callback_.callback()));
[email protected]f698a012013-05-06 20:18:591299
1300 EXPECT_EQ(OK, callback_.WaitForResult());
1301 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361302 HttpRequestInfo request_info;
1303 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1304 DEFAULT_PRIORITY,
1305 net_log_, CompletionCallback()));
[email protected]f698a012013-05-06 20:18:591306
1307 // Change the IP address and verify that stream saw the error.
1308 factory_.OnIPAddressChanged();
1309 EXPECT_EQ(ERR_NETWORK_CHANGED,
1310 stream->ReadResponseHeaders(callback_.callback()));
[email protected]11c05872013-08-20 02:04:121311 EXPECT_TRUE(factory_.require_confirmation());
[email protected]f698a012013-05-06 20:18:591312
1313 // Now attempting to request a stream to the same origin should create
1314 // a new session.
1315
1316 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591317 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481318 request2.Request(host_port_pair_, is_https_, privacy_mode_,
1319 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591320 callback_.callback()));
[email protected]f698a012013-05-06 20:18:591321
1322 EXPECT_EQ(OK, callback_.WaitForResult());
1323 stream = request2.ReleaseStream();
1324 stream.reset(); // Will reset stream 3.
1325
rch37de576c2015-05-17 20:28:171326 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1327 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1328 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1329 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]f698a012013-05-06 20:18:591330}
1331
[email protected]1e960032013-12-20 19:00:201332TEST_P(QuicStreamFactoryTest, OnCertAdded) {
[email protected]d7d1e50b2013-11-25 22:08:091333 MockRead reads[] = {
1334 MockRead(ASYNC, 0, 0) // EOF
1335 };
[email protected]459a7402014-02-10 12:58:521336 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1337 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311338 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521339 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421340 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521341 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:091342 socket_factory_.AddSocketDataProvider(&socket_data);
1343 socket_data.StopAfter(1);
1344
1345 MockRead reads2[] = {
1346 MockRead(ASYNC, 0, 0) // EOF
1347 };
rtennetibe635732014-10-02 22:51:421348 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:091349 socket_factory_.AddSocketDataProvider(&socket_data2);
1350 socket_data2.StopAfter(1);
1351
1352 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591353 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481354 request.Request(host_port_pair_, is_https_, privacy_mode_,
1355 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591356 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091357
1358 EXPECT_EQ(OK, callback_.WaitForResult());
1359 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1360 HttpRequestInfo request_info;
1361 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1362 DEFAULT_PRIORITY,
1363 net_log_, CompletionCallback()));
1364
1365 // Add a cert and verify that stream saw the event.
rtennetibe635732014-10-02 22:51:421366 factory_.OnCertAdded(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:091367 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1368 stream->ReadResponseHeaders(callback_.callback()));
1369 EXPECT_FALSE(factory_.require_confirmation());
1370
1371 // Now attempting to request a stream to the same origin should create
1372 // a new session.
1373
1374 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591375 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481376 request2.Request(host_port_pair_, is_https_, privacy_mode_,
1377 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591378 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091379
1380 EXPECT_EQ(OK, callback_.WaitForResult());
1381 stream = request2.ReleaseStream();
1382 stream.reset(); // Will reset stream 3.
1383
rch37de576c2015-05-17 20:28:171384 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1385 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1386 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1387 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:091388}
1389
[email protected]1e960032013-12-20 19:00:201390TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
[email protected]d7d1e50b2013-11-25 22:08:091391 MockRead reads[] = {
1392 MockRead(ASYNC, 0, 0) // EOF
1393 };
[email protected]459a7402014-02-10 12:58:521394 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1395 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311396 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521397 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421398 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521399 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:091400 socket_factory_.AddSocketDataProvider(&socket_data);
1401 socket_data.StopAfter(1);
1402
1403 MockRead reads2[] = {
1404 MockRead(ASYNC, 0, 0) // EOF
1405 };
rtennetibe635732014-10-02 22:51:421406 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:091407 socket_factory_.AddSocketDataProvider(&socket_data2);
1408 socket_data2.StopAfter(1);
1409
1410 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591411 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481412 request.Request(host_port_pair_, is_https_, privacy_mode_,
1413 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591414 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091415
1416 EXPECT_EQ(OK, callback_.WaitForResult());
1417 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1418 HttpRequestInfo request_info;
1419 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1420 DEFAULT_PRIORITY,
1421 net_log_, CompletionCallback()));
1422
1423 // Change the CA cert and verify that stream saw the event.
rtennetibe635732014-10-02 22:51:421424 factory_.OnCACertChanged(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:091425 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1426 stream->ReadResponseHeaders(callback_.callback()));
1427 EXPECT_FALSE(factory_.require_confirmation());
1428
1429 // Now attempting to request a stream to the same origin should create
1430 // a new session.
1431
1432 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591433 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481434 request2.Request(host_port_pair_, is_https_, privacy_mode_,
1435 host_port_pair_.host(), "GET", net_log_,
[email protected]974849d2014-02-06 01:32:591436 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091437
1438 EXPECT_EQ(OK, callback_.WaitForResult());
1439 stream = request2.ReleaseStream();
1440 stream.reset(); // Will reset stream 3.
1441
rch37de576c2015-05-17 20:28:171442 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1443 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1444 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1445 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:091446}
1447
[email protected]1e960032013-12-20 19:00:201448TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
[email protected]6e12d702013-11-13 00:17:171449 vector<string> cannoncial_suffixes;
1450 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1451 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]c49ff182013-09-28 08:33:261452
[email protected]6e12d702013-11-13 00:17:171453 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1454 string r1_host_name("r1");
1455 string r2_host_name("r2");
1456 r1_host_name.append(cannoncial_suffixes[i]);
1457 r2_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141458
[email protected]bf4ea2f2014-03-10 22:57:531459 HostPortPair host_port_pair1(r1_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121460 QuicCryptoClientConfig* crypto_config =
1461 QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
[email protected]257f24f2014-04-01 09:15:371462 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171463 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371464 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171465 EXPECT_FALSE(cached1->proof_valid());
1466 EXPECT_TRUE(cached1->source_address_token().empty());
1467
1468 // Mutate the cached1 to have different data.
1469 // TODO(rtenneti): mutate other members of CachedState.
1470 cached1->set_source_address_token(r1_host_name);
1471 cached1->SetProofValid();
1472
[email protected]bf4ea2f2014-03-10 22:57:531473 HostPortPair host_port_pair2(r2_host_name, 80);
[email protected]257f24f2014-04-01 09:15:371474 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171475 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371476 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171477 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
1478 EXPECT_TRUE(cached2->proof_valid());
1479 }
[email protected]b70fdb792013-10-25 19:04:141480}
1481
[email protected]1e960032013-12-20 19:00:201482TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
[email protected]6e12d702013-11-13 00:17:171483 vector<string> cannoncial_suffixes;
1484 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1485 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]b70fdb792013-10-25 19:04:141486
[email protected]6e12d702013-11-13 00:17:171487 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1488 string r3_host_name("r3");
1489 string r4_host_name("r4");
1490 r3_host_name.append(cannoncial_suffixes[i]);
1491 r4_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141492
[email protected]bf4ea2f2014-03-10 22:57:531493 HostPortPair host_port_pair1(r3_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121494 QuicCryptoClientConfig* crypto_config =
1495 QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
[email protected]257f24f2014-04-01 09:15:371496 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171497 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371498 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171499 EXPECT_FALSE(cached1->proof_valid());
1500 EXPECT_TRUE(cached1->source_address_token().empty());
1501
1502 // Mutate the cached1 to have different data.
1503 // TODO(rtenneti): mutate other members of CachedState.
1504 cached1->set_source_address_token(r3_host_name);
1505 cached1->SetProofInvalid();
1506
[email protected]bf4ea2f2014-03-10 22:57:531507 HostPortPair host_port_pair2(r4_host_name, 80);
[email protected]257f24f2014-04-01 09:15:371508 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171509 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371510 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171511 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
1512 EXPECT_TRUE(cached2->source_address_token().empty());
1513 EXPECT_FALSE(cached2->proof_valid());
1514 }
[email protected]c49ff182013-09-28 08:33:261515}
1516
rtenneti14abd312015-02-06 21:56:011517TEST_P(QuicStreamFactoryTest, RacingConnections) {
1518 if (!GetParam().enable_connection_racing)
1519 return;
1520 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
1521 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
rtenneti14abd312015-02-06 21:56:011522 MockRead reads[] = {
1523 MockRead(ASYNC, OK, 0) // EOF
1524 };
1525 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1526 socket_factory_.AddSocketDataProvider(&socket_data);
1527 socket_data.StopAfter(1);
1528
1529 MockRead reads2[] = {
1530 MockRead(ASYNC, 0, 0) // EOF
1531 };
1532 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1533 socket_factory_.AddSocketDataProvider(&socket_data2);
1534 socket_data2.StopAfter(1);
1535
1536 crypto_client_stream_factory_.set_handshake_mode(
1537 MockCryptoClientStream::ZERO_RTT);
1538 host_resolver_.set_synchronous_mode(true);
1539 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1540 "192.168.0.1", "");
1541
1542 QuicStreamRequest request(&factory_);
1543 QuicServerId server_id(host_port_pair_, is_https_, privacy_mode_);
1544 EXPECT_EQ(ERR_IO_PENDING,
bnc68d401dd2015-05-18 20:31:481545 request.Request(host_port_pair_, is_https_, privacy_mode_,
1546 host_port_pair_.host(), "GET", net_log_,
1547 callback_.callback()));
rtenneti14abd312015-02-06 21:56:011548 EXPECT_EQ(2u,
1549 QuicStreamFactoryPeer::GetNumberOfActiveJobs(&factory_, server_id));
1550
1551 runner_->RunNextTask();
1552
1553 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1554 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:171555 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1556 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti14abd312015-02-06 21:56:011557 EXPECT_EQ(0u,
1558 QuicStreamFactoryPeer::GetNumberOfActiveJobs(&factory_, server_id));
1559}
1560
rtenneti34dffe752015-02-24 23:27:321561TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) {
1562 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
1563 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
rtenneti34dffe752015-02-24 23:27:321564 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_, true);
1565
1566 MockRead reads[] = {
1567 MockRead(ASYNC, OK, 0) // EOF
1568 };
1569 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1570 socket_factory_.AddSocketDataProvider(&socket_data);
1571 socket_data.StopAfter(1);
1572
1573 crypto_client_stream_factory_.set_handshake_mode(
1574 MockCryptoClientStream::ZERO_RTT);
1575 host_resolver_.set_synchronous_mode(true);
1576 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1577 "192.168.0.1", "");
1578
1579 QuicStreamRequest request(&factory_);
1580 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
bnc68d401dd2015-05-18 20:31:481581 host_port_pair_.host(), "GET", net_log_,
1582 callback_.callback()));
rtenneti34dffe752015-02-24 23:27:321583
1584 // If we are waiting for disk cache, we would have posted a task. Verify that
1585 // the CancelWaitForDataReady task hasn't been posted.
1586 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
1587
1588 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1589 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:171590 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1591 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti34dffe752015-02-24 23:27:321592}
1593
rtenneti85dcfac22015-03-27 20:22:191594TEST_P(QuicStreamFactoryTest, BadPacketLoss) {
1595 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
1596 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
1597 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_, true);
1598 QuicStreamFactoryPeer::SetMaxNumberOfLossyConnections(&factory_, 2);
1599 EXPECT_FALSE(
1600 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
1601 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1602 &factory_, host_port_pair_.port()));
1603
1604 MockRead reads[] = {
1605 MockRead(ASYNC, OK, 0) // EOF
1606 };
1607 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1608 socket_factory_.AddSocketDataProvider(&socket_data);
1609 socket_data.StopAfter(1);
1610
1611 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
1612 socket_factory_.AddSocketDataProvider(&socket_data2);
1613 socket_data2.StopAfter(1);
1614
1615 DeterministicSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
1616 socket_factory_.AddSocketDataProvider(&socket_data3);
1617 socket_data3.StopAfter(1);
1618
1619 HostPortPair server2("mail.example.org", kDefaultServerPort);
1620 HostPortPair server3("docs.example.org", kDefaultServerPort);
1621
1622 crypto_client_stream_factory_.set_handshake_mode(
1623 MockCryptoClientStream::ZERO_RTT);
1624 host_resolver_.set_synchronous_mode(true);
1625 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1626 "192.168.0.1", "");
1627 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1628 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
1629
1630 QuicStreamRequest request(&factory_);
1631 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
bnc68d401dd2015-05-18 20:31:481632 host_port_pair_.host(), "GET", net_log_,
1633 callback_.callback()));
rtenneti85dcfac22015-03-27 20:22:191634
1635 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
1636 &factory_, host_port_pair_, is_https_);
1637
1638 DVLOG(1) << "Create 1st session and test packet loss";
1639
1640 // Set packet_loss_rate to a lower value than packet_loss_threshold.
1641 EXPECT_FALSE(
1642 factory_.OnHandshakeConfirmed(session, /*packet_loss_rate=*/0.9f));
rtenneti41633b1f2015-04-05 18:19:531643 EXPECT_TRUE(session->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:191644 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(
1645 &factory_, host_port_pair_, is_https_));
1646 EXPECT_FALSE(
1647 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
1648 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1649 &factory_, host_port_pair_.port()));
1650
1651 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
1652 // and that should close the session, but shouldn't disable QUIC.
1653 EXPECT_TRUE(
1654 factory_.OnHandshakeConfirmed(session, /*packet_loss_rate=*/1.0f));
1655 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1656 &factory_, host_port_pair_.port()));
1657 EXPECT_FALSE(
1658 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
1659 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
1660 &factory_, host_port_pair_, is_https_));
1661 EXPECT_EQ(nullptr, CreateIfSessionExists(host_port_pair_, net_log_).get());
1662
1663 // Test N-in-a-row high packet loss connections.
1664
1665 DVLOG(1) << "Create 2nd session and test packet loss";
1666
1667 TestCompletionCallback callback2;
1668 QuicStreamRequest request2(&factory_);
bnc68d401dd2015-05-18 20:31:481669 EXPECT_EQ(OK,
1670 request2.Request(server2, is_https_, privacy_mode_, server2.host(),
1671 "GET", net_log_, callback2.callback()));
rtenneti85dcfac22015-03-27 20:22:191672 QuicClientSession* session2 =
1673 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_);
1674
1675 // If there is no packet loss during handshake confirmation, number of lossy
1676 // connections for the port should be 0.
1677 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1678 &factory_, server2.port()));
1679 EXPECT_FALSE(
1680 factory_.OnHandshakeConfirmed(session2, /*packet_loss_rate=*/0.9f));
1681 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1682 &factory_, server2.port()));
1683 EXPECT_FALSE(
1684 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, server2.port()));
1685
1686 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
1687 // and that should close the session, but shouldn't disable QUIC.
1688 EXPECT_TRUE(
1689 factory_.OnHandshakeConfirmed(session2, /*packet_loss_rate=*/1.0f));
1690 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1691 &factory_, server2.port()));
rtenneti41633b1f2015-04-05 18:19:531692 EXPECT_FALSE(session2->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:191693 EXPECT_FALSE(
1694 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, server2.port()));
1695 EXPECT_FALSE(
1696 QuicStreamFactoryPeer::HasActiveSession(&factory_, server2, is_https_));
1697 EXPECT_EQ(nullptr, CreateIfSessionExists(server2, net_log_).get());
1698
1699 DVLOG(1) << "Create 3rd session which also has packet loss";
1700
1701 TestCompletionCallback callback3;
1702 QuicStreamRequest request3(&factory_);
bnc68d401dd2015-05-18 20:31:481703 EXPECT_EQ(OK,
1704 request3.Request(server3, is_https_, privacy_mode_, server3.host(),
1705 "GET", net_log_, callback3.callback()));
rtenneti85dcfac22015-03-27 20:22:191706 QuicClientSession* session3 =
1707 QuicStreamFactoryPeer::GetActiveSession(&factory_, server3, is_https_);
1708
1709 // Set packet_loss_rate to higher value than packet_loss_threshold 2nd time in
1710 // a row and that should close the session and disable QUIC.
1711 EXPECT_TRUE(
1712 factory_.OnHandshakeConfirmed(session3, /*packet_loss_rate=*/1.0f));
1713 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1714 &factory_, server3.port()));
rtenneti41633b1f2015-04-05 18:19:531715 EXPECT_FALSE(session2->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:191716 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(&factory_, server3.port()));
1717 EXPECT_FALSE(
1718 QuicStreamFactoryPeer::HasActiveSession(&factory_, server3, is_https_));
1719 EXPECT_EQ(nullptr, CreateIfSessionExists(server3, net_log_).get());
1720
1721 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1722 EXPECT_TRUE(stream.get());
1723 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1724 EXPECT_TRUE(stream2.get());
1725 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
1726 EXPECT_TRUE(stream3.get());
rch37de576c2015-05-17 20:28:171727 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1728 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1729 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1730 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1731 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
1732 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
rtenneti85dcfac22015-03-27 20:22:191733}
1734
[email protected]e13201d82012-12-12 05:00:321735} // namespace test
[email protected]e13201d82012-12-12 05:00:321736} // namespace net