blob: 1165b9c972cce250a9bb7865b7ece48c9a2c9057 [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;
37using std::string;
38using std::vector;
39
[email protected]e13201d82012-12-12 05:00:3240namespace net {
[email protected]e13201d82012-12-12 05:00:3241namespace test {
42
[email protected]3c772402013-12-18 21:38:1143namespace {
44const char kDefaultServerHostName[] = "www.google.com";
45const int kDefaultServerPort = 443;
46} // namespace anonymous
47
[email protected]c49ff182013-09-28 08:33:2648class QuicStreamFactoryPeer {
49 public:
[email protected]59c0bbd2014-03-22 04:08:1250 static QuicCryptoClientConfig* GetCryptoConfig(QuicStreamFactory* factory) {
51 return &factory->crypto_config_;
[email protected]c49ff182013-09-28 08:33:2652 }
[email protected]4d283b32013-10-17 12:57:2753
54 static bool HasActiveSession(QuicStreamFactory* factory,
[email protected]bf4ea2f2014-03-10 22:57:5355 const HostPortPair& host_port_pair,
[email protected]df157d9d2014-03-10 07:27:2756 bool is_https) {
[email protected]257f24f2014-04-01 09:15:3757 QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED);
58 return factory->HasActiveSession(server_id);
[email protected]4d283b32013-10-17 12:57:2759 }
60
61 static QuicClientSession* GetActiveSession(
62 QuicStreamFactory* factory,
[email protected]bf4ea2f2014-03-10 22:57:5363 const HostPortPair& host_port_pair,
[email protected]df157d9d2014-03-10 07:27:2764 bool is_https) {
[email protected]257f24f2014-04-01 09:15:3765 QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED);
66 DCHECK(factory->HasActiveSession(server_id));
67 return factory->active_sessions_[server_id];
[email protected]df157d9d2014-03-10 07:27:2768 }
69
70 static scoped_ptr<QuicHttpStream> CreateIfSessionExists(
71 QuicStreamFactory* factory,
[email protected]bf4ea2f2014-03-10 22:57:5372 const HostPortPair& host_port_pair,
[email protected]df157d9d2014-03-10 07:27:2773 bool is_https,
74 const BoundNetLog& net_log) {
[email protected]257f24f2014-04-01 09:15:3775 QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED);
76 return factory->CreateIfSessionExists(server_id, net_log);
[email protected]4d283b32013-10-17 12:57:2777 }
78
79 static bool IsLiveSession(QuicStreamFactory* factory,
80 QuicClientSession* session) {
[email protected]4d590c9c2014-05-02 05:14:3381 for (QuicStreamFactory::SessionIdMap::iterator it =
[email protected]4d283b32013-10-17 12:57:2782 factory->all_sessions_.begin();
83 it != factory->all_sessions_.end(); ++it) {
[email protected]4d590c9c2014-05-02 05:14:3384 if (it->first == session)
[email protected]4d283b32013-10-17 12:57:2785 return true;
86 }
87 return false;
88 }
jri584002d12014-09-09 00:51:2889
90 static void DisableConnectionPooling(QuicStreamFactory* factory) {
91 factory->disable_connection_pooling_ = true;
92 }
rtenneti38f5cd52014-10-28 20:28:2893
94 static void SetTaskRunner(QuicStreamFactory* factory,
95 base::TaskRunner* task_runner) {
96 factory->task_runner_ = task_runner;
97 }
98
99 static void SetLoadServerInfoTimeout(QuicStreamFactory* factory,
100 size_t load_server_info_timeout) {
101 factory->load_server_info_timeout_ms_ = load_server_info_timeout;
102 }
[email protected]c49ff182013-09-28 08:33:26103};
104
rtenneti38f5cd52014-10-28 20:28:28105class MockQuicServerInfo : public QuicServerInfo {
106 public:
107 MockQuicServerInfo(const QuicServerId& server_id)
108 : QuicServerInfo(server_id) {}
109 virtual ~MockQuicServerInfo() {}
110
111 virtual void Start() override {};
112
113 virtual int WaitForDataReady(const CompletionCallback& callback) override {
114 return ERR_IO_PENDING;
115 }
116
117 virtual void CancelWaitForDataReadyCallback() override {}
118
119 virtual bool IsDataReady() override { return false; }
120
121 virtual bool IsReadyToPersist() override { return false; }
122
123 virtual void Persist() override {};
124};
125
126class MockQuicServerInfoFactory : public QuicServerInfoFactory {
127 public:
128 MockQuicServerInfoFactory() {}
129 virtual ~MockQuicServerInfoFactory() {}
130
131 virtual QuicServerInfo* GetForServer(const QuicServerId& server_id) override {
132 return new MockQuicServerInfo(server_id);
133 }
134};
135
136
[email protected]1e960032013-12-20 19:00:20137class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> {
[email protected]e13201d82012-12-12 05:00:32138 protected:
139 QuicStreamFactoryTest()
[email protected]457d6952013-12-13 09:24:58140 : random_generator_(0),
141 clock_(new MockClock()),
rtenneti38f5cd52014-10-28 20:28:28142 runner_(new TestTaskRunner(clock_)),
rtenneti4b06ae72014-08-26 03:43:43143 maker_(GetParam(), 0, clock_),
[email protected]59c0bbd2014-03-22 04:08:12144 cert_verifier_(CertVerifier::CreateDefault()),
jri2b966f22014-09-02 22:25:36145 channel_id_service_(
rtennetibe635732014-10-02 22:51:42146 new ChannelIDService(new DefaultChannelIDStore(nullptr),
jri2b966f22014-09-02 22:25:36147 base::MessageLoopProxy::current())),
148 factory_(&host_resolver_,
149 &socket_factory_,
150 base::WeakPtr<HttpServerProperties>(),
151 cert_verifier_.get(),
152 channel_id_service_.get(),
153 &transport_security_state_,
154 &crypto_client_stream_factory_,
155 &random_generator_,
156 clock_,
157 kDefaultMaxPacketSize,
158 std::string(),
159 SupportedVersions(GetParam()),
160 /*enable_port_selection=*/true,
jri584002d12014-09-09 00:51:28161 /*always_require_handshake_confirmation=*/false,
162 /*disable_connection_pooling=*/false,
rtenneti38f5cd52014-10-28 20:28:28163 /*load_server_info_timeout=*/0u,
jri2b966f22014-09-02 22:25:36164 QuicTagVector()),
[email protected]bf4ea2f2014-03-10 22:57:53165 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
[email protected]9dd3ff0f2014-03-26 09:51:28166 is_https_(false),
[email protected]314b03992014-04-01 01:28:53167 privacy_mode_(PRIVACY_MODE_DISABLED) {
[email protected]11c05872013-08-20 02:04:12168 factory_.set_require_confirmation(false);
[email protected]ca4e0d92014-08-22 16:33:22169 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
[email protected]e13201d82012-12-12 05:00:32170 }
171
[email protected]df157d9d2014-03-10 07:27:27172 scoped_ptr<QuicHttpStream> CreateIfSessionExists(
[email protected]bf4ea2f2014-03-10 22:57:53173 const HostPortPair& host_port_pair,
[email protected]df157d9d2014-03-10 07:27:27174 const BoundNetLog& net_log) {
175 return QuicStreamFactoryPeer::CreateIfSessionExists(
[email protected]bf4ea2f2014-03-10 22:57:53176 &factory_, host_port_pair, false, net_log_);
[email protected]df157d9d2014-03-10 07:27:27177 }
[email protected]e13201d82012-12-12 05:00:32178
[email protected]bf4ea2f2014-03-10 22:57:53179 int GetSourcePortForNewSession(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10180 return GetSourcePortForNewSessionInner(destination, false);
181 }
182
183 int GetSourcePortForNewSessionAndGoAway(
[email protected]bf4ea2f2014-03-10 22:57:53184 const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10185 return GetSourcePortForNewSessionInner(destination, true);
186 }
187
[email protected]bf4ea2f2014-03-10 22:57:53188 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
[email protected]d8e2abf82014-03-06 10:30:10189 bool goaway_received) {
[email protected]3c772402013-12-18 21:38:11190 // Should only be called if there is no active session for this destination.
rtennetibe635732014-10-02 22:51:42191 EXPECT_EQ(nullptr, CreateIfSessionExists(destination, net_log_).get());
[email protected]3c772402013-12-18 21:38:11192 size_t socket_count = socket_factory_.udp_client_sockets().size();
193
194 MockRead reads[] = {
195 MockRead(ASYNC, OK, 0) // EOF
196 };
rtennetibe635732014-10-02 22:51:42197 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]3c772402013-12-18 21:38:11198 socket_data.StopAfter(1);
199 socket_factory_.AddSocketDataProvider(&socket_data);
200
201 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59202 EXPECT_EQ(ERR_IO_PENDING,
203 request.Request(destination,
204 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28205 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59206 "GET",
[email protected]974849d2014-02-06 01:32:59207 net_log_,
208 callback_.callback()));
[email protected]3c772402013-12-18 21:38:11209
210 EXPECT_EQ(OK, callback_.WaitForResult());
211 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
212 EXPECT_TRUE(stream.get());
213 stream.reset();
214
215 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
[email protected]df157d9d2014-03-10 07:27:27216 &factory_, destination, is_https_);
[email protected]3c772402013-12-18 21:38:11217
218 if (socket_count + 1 != socket_factory_.udp_client_sockets().size()) {
219 EXPECT_TRUE(false);
220 return 0;
221 }
222
223 IPEndPoint endpoint;
224 socket_factory_.
225 udp_client_sockets()[socket_count]->GetLocalAddress(&endpoint);
226 int port = endpoint.port();
[email protected]d8e2abf82014-03-06 10:30:10227 if (goaway_received) {
228 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, "");
229 session->OnGoAway(goaway);
230 }
[email protected]3c772402013-12-18 21:38:11231
232 factory_.OnSessionClosed(session);
rtennetibe635732014-10-02 22:51:42233 EXPECT_EQ(nullptr, CreateIfSessionExists(destination, net_log_).get());
[email protected]3c772402013-12-18 21:38:11234 EXPECT_TRUE(socket_data.at_read_eof());
235 EXPECT_TRUE(socket_data.at_write_eof());
236 return port;
237 }
238
[email protected]459a7402014-02-10 12:58:52239 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() {
[email protected]66ae5962014-05-22 11:13:05240 QuicStreamId stream_id = kClientDataStreamId1;
[email protected]51cc1342014-04-18 23:44:37241 return maker_.MakeRstPacket(
242 1, true, stream_id,
rtenneti4a5df262014-11-07 00:43:58243 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam()));
[email protected]459a7402014-02-10 12:58:52244 }
245
rtenneti38f5cd52014-10-28 20:28:28246 MockQuicServerInfoFactory quic_server_info_factory_;
[email protected]e13201d82012-12-12 05:00:32247 MockHostResolver host_resolver_;
[email protected]0edce6a2013-05-08 18:02:40248 DeterministicMockClientSocketFactory socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05249 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]9558c5d32012-12-22 00:08:14250 MockRandom random_generator_;
[email protected]872edd9e2013-01-16 08:51:15251 MockClock* clock_; // Owned by factory_.
rtenneti38f5cd52014-10-28 20:28:28252 scoped_refptr<TestTaskRunner> runner_;
rtenneti4b06ae72014-08-26 03:43:43253 QuicTestPacketMaker maker_;
[email protected]59c0bbd2014-03-22 04:08:12254 scoped_ptr<CertVerifier> cert_verifier_;
[email protected]6b8a3c742014-07-25 00:25:35255 scoped_ptr<ChannelIDService> channel_id_service_;
[email protected]080b77932014-08-04 01:22:46256 TransportSecurityState transport_security_state_;
[email protected]e13201d82012-12-12 05:00:32257 QuicStreamFactory factory_;
[email protected]bf4ea2f2014-03-10 22:57:53258 HostPortPair host_port_pair_;
[email protected]6d1b4ed2013-07-10 03:57:54259 bool is_https_;
[email protected]9dd3ff0f2014-03-26 09:51:28260 PrivacyMode privacy_mode_;
[email protected]e13201d82012-12-12 05:00:32261 BoundNetLog net_log_;
262 TestCompletionCallback callback_;
[email protected]e13201d82012-12-12 05:00:32263};
264
[email protected]1e960032013-12-20 19:00:20265INSTANTIATE_TEST_CASE_P(Version, QuicStreamFactoryTest,
266 ::testing::ValuesIn(QuicSupportedVersions()));
267
268TEST_P(QuicStreamFactoryTest, CreateIfSessionExists) {
rtennetibe635732014-10-02 22:51:42269 EXPECT_EQ(nullptr, CreateIfSessionExists(host_port_pair_, net_log_).get());
[email protected]e13201d82012-12-12 05:00:32270}
271
[email protected]1e960032013-12-20 19:00:20272TEST_P(QuicStreamFactoryTest, Create) {
[email protected]69dfd1b2013-06-04 22:20:12273 MockRead reads[] = {
[email protected]25c31dc2013-06-05 17:56:04274 MockRead(ASYNC, OK, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:12275 };
rtennetibe635732014-10-02 22:51:42276 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:32277 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]25c31dc2013-06-05 17:56:04278 socket_data.StopAfter(1);
[email protected]e13201d82012-12-12 05:00:32279
280 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59281 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53282 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59283 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28284 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59285 "GET",
[email protected]974849d2014-02-06 01:32:59286 net_log_,
287 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32288
289 EXPECT_EQ(OK, callback_.WaitForResult());
290 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0edce6a2013-05-08 18:02:40291 EXPECT_TRUE(stream.get());
[email protected]e13201d82012-12-12 05:00:32292
293 // Will reset stream 3.
[email protected]bf4ea2f2014-03-10 22:57:53294 stream = CreateIfSessionExists(host_port_pair_, net_log_);
[email protected]e13201d82012-12-12 05:00:32295 EXPECT_TRUE(stream.get());
296
[email protected]6d1b4ed2013-07-10 03:57:54297 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
298 // in streams on different sessions.
[email protected]e13201d82012-12-12 05:00:32299 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59300 EXPECT_EQ(OK,
[email protected]bf4ea2f2014-03-10 22:57:53301 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59302 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28303 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59304 "GET",
[email protected]974849d2014-02-06 01:32:59305 net_log_,
306 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32307 stream = request2.ReleaseStream(); // Will reset stream 5.
308 stream.reset(); // Will reset stream 7.
309
310 EXPECT_TRUE(socket_data.at_read_eof());
311 EXPECT_TRUE(socket_data.at_write_eof());
312}
313
[email protected]8bd2b812014-03-26 04:01:17314TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
315 MockRead reads[] = {
316 MockRead(ASYNC, OK, 0) // EOF
317 };
rtennetibe635732014-10-02 22:51:42318 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17319 socket_factory_.AddSocketDataProvider(&socket_data);
320 socket_data.StopAfter(1);
321
322 crypto_client_stream_factory_.set_handshake_mode(
323 MockCryptoClientStream::ZERO_RTT);
324 host_resolver_.set_synchronous_mode(true);
325 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
326 "192.168.0.1", "");
327
328 QuicStreamRequest request(&factory_);
329 EXPECT_EQ(OK,
330 request.Request(host_port_pair_,
331 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28332 privacy_mode_,
[email protected]8bd2b812014-03-26 04:01:17333 "GET",
334 net_log_,
335 callback_.callback()));
336
337 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
338 EXPECT_TRUE(stream.get());
339 EXPECT_TRUE(socket_data.at_read_eof());
340 EXPECT_TRUE(socket_data.at_write_eof());
341}
342
343TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
344 MockRead reads[] = {
345 MockRead(ASYNC, OK, 0) // EOF
346 };
rtennetibe635732014-10-02 22:51:42347 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17348 socket_factory_.AddSocketDataProvider(&socket_data);
349 socket_data.StopAfter(1);
350
351 crypto_client_stream_factory_.set_handshake_mode(
352 MockCryptoClientStream::ZERO_RTT);
353 host_resolver_.set_synchronous_mode(true);
354 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
355 "192.168.0.1", "");
356
357 QuicStreamRequest request(&factory_);
358 // Posts require handshake confirmation, so this will return asynchronously.
359 EXPECT_EQ(ERR_IO_PENDING,
360 request.Request(host_port_pair_,
361 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28362 privacy_mode_,
[email protected]8bd2b812014-03-26 04:01:17363 "POST",
364 net_log_,
365 callback_.callback()));
366
367 // Confirm the handshake and verify that the stream is created.
368 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
369 QuicSession::HANDSHAKE_CONFIRMED);
370
371 EXPECT_EQ(OK, callback_.WaitForResult());
372 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
373 EXPECT_TRUE(stream.get());
374 EXPECT_TRUE(socket_data.at_read_eof());
375 EXPECT_TRUE(socket_data.at_write_eof());
376}
377
[email protected]df157d9d2014-03-10 07:27:27378TEST_P(QuicStreamFactoryTest, CreateHttpVsHttps) {
379 MockRead reads[] = {
380 MockRead(ASYNC, OK, 0) // EOF
381 };
rtennetibe635732014-10-02 22:51:42382 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
383 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]df157d9d2014-03-10 07:27:27384 socket_factory_.AddSocketDataProvider(&socket_data1);
385 socket_factory_.AddSocketDataProvider(&socket_data2);
386 socket_data1.StopAfter(1);
387 socket_data2.StopAfter(1);
388
389 QuicStreamRequest request(&factory_);
390 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53391 request.Request(host_port_pair_,
[email protected]df157d9d2014-03-10 07:27:27392 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28393 privacy_mode_,
[email protected]df157d9d2014-03-10 07:27:27394 "GET",
[email protected]df157d9d2014-03-10 07:27:27395 net_log_,
396 callback_.callback()));
397
398 EXPECT_EQ(OK, callback_.WaitForResult());
399 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
400 EXPECT_TRUE(stream.get());
401
402 QuicStreamRequest request2(&factory_);
403 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53404 request2.Request(host_port_pair_,
[email protected]df157d9d2014-03-10 07:27:27405 !is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28406 privacy_mode_,
[email protected]df157d9d2014-03-10 07:27:27407 "GET",
[email protected]df157d9d2014-03-10 07:27:27408 net_log_,
409 callback_.callback()));
410 EXPECT_EQ(OK, callback_.WaitForResult());
411 stream = request2.ReleaseStream();
412 EXPECT_TRUE(stream.get());
413 stream.reset();
414
415 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53416 &factory_, host_port_pair_, is_https_),
[email protected]df157d9d2014-03-10 07:27:27417 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53418 &factory_, host_port_pair_, !is_https_));
[email protected]df157d9d2014-03-10 07:27:27419
420 EXPECT_TRUE(socket_data1.at_read_eof());
421 EXPECT_TRUE(socket_data1.at_write_eof());
422 EXPECT_TRUE(socket_data2.at_read_eof());
423 EXPECT_TRUE(socket_data2.at_write_eof());
424}
425
[email protected]5db452202014-08-19 05:22:15426TEST_P(QuicStreamFactoryTest, Pooling) {
[email protected]eed749f92013-12-23 18:57:38427 MockRead reads[] = {
428 MockRead(ASYNC, OK, 0) // EOF
429 };
rtennetibe635732014-10-02 22:51:42430 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38431 socket_factory_.AddSocketDataProvider(&socket_data);
432 socket_data.StopAfter(1);
433
[email protected]bf4ea2f2014-03-10 22:57:53434 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38435 host_resolver_.set_synchronous_mode(true);
436 host_resolver_.rules()->AddIPLiteralRule(
437 kDefaultServerHostName, "192.168.0.1", "");
438 host_resolver_.rules()->AddIPLiteralRule(
439 "mail.google.com", "192.168.0.1", "");
440
441 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59442 EXPECT_EQ(OK,
[email protected]bf4ea2f2014-03-10 22:57:53443 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59444 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28445 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59446 "GET",
[email protected]974849d2014-02-06 01:32:59447 net_log_,
448 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38449 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
450 EXPECT_TRUE(stream.get());
451
452 TestCompletionCallback callback;
453 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59454 EXPECT_EQ(OK,
455 request2.Request(server2,
456 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28457 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59458 "GET",
[email protected]974849d2014-02-06 01:32:59459 net_log_,
460 callback.callback()));
[email protected]eed749f92013-12-23 18:57:38461 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
462 EXPECT_TRUE(stream2.get());
463
464 EXPECT_EQ(
[email protected]df157d9d2014-03-10 07:27:27465 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53466 &factory_, host_port_pair_, is_https_),
[email protected]df157d9d2014-03-10 07:27:27467 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38468
469 EXPECT_TRUE(socket_data.at_read_eof());
470 EXPECT_TRUE(socket_data.at_write_eof());
471}
472
jri584002d12014-09-09 00:51:28473TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) {
474 MockRead reads[] = {
475 MockRead(ASYNC, OK, 0) // EOF
476 };
rtennetibe635732014-10-02 22:51:42477 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
478 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28479 socket_factory_.AddSocketDataProvider(&socket_data1);
480 socket_factory_.AddSocketDataProvider(&socket_data2);
481 socket_data1.StopAfter(1);
482 socket_data2.StopAfter(1);
483
484 HostPortPair server2("mail.google.com", kDefaultServerPort);
485 host_resolver_.set_synchronous_mode(true);
486 host_resolver_.rules()->AddIPLiteralRule(
487 kDefaultServerHostName, "192.168.0.1", "");
488 host_resolver_.rules()->AddIPLiteralRule(
489 "mail.google.com", "192.168.0.1", "");
490
491 // Disable connection pooling.
492 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
493
494 QuicStreamRequest request(&factory_);
495 EXPECT_EQ(OK,
496 request.Request(host_port_pair_,
497 is_https_,
498 privacy_mode_,
499 "GET",
500 net_log_,
501 callback_.callback()));
502 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
503 EXPECT_TRUE(stream.get());
504
505 TestCompletionCallback callback;
506 QuicStreamRequest request2(&factory_);
507 EXPECT_EQ(OK,
508 request2.Request(server2,
509 is_https_,
510 privacy_mode_,
511 "GET",
512 net_log_,
513 callback.callback()));
514 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
515 EXPECT_TRUE(stream2.get());
516
517 EXPECT_NE(
518 QuicStreamFactoryPeer::GetActiveSession(
519 &factory_, host_port_pair_, is_https_),
520 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_));
521
522 EXPECT_TRUE(socket_data1.at_read_eof());
523 EXPECT_TRUE(socket_data1.at_write_eof());
524 EXPECT_TRUE(socket_data2.at_read_eof());
525 EXPECT_TRUE(socket_data2.at_write_eof());
526}
527
[email protected]eed749f92013-12-23 18:57:38528TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
529 MockRead reads[] = {
530 MockRead(ASYNC, OK, 0) // EOF
531 };
rtennetibe635732014-10-02 22:51:42532 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
533 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38534 socket_factory_.AddSocketDataProvider(&socket_data1);
535 socket_factory_.AddSocketDataProvider(&socket_data2);
536 socket_data1.StopAfter(1);
537 socket_data2.StopAfter(1);
538
[email protected]bf4ea2f2014-03-10 22:57:53539 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38540 host_resolver_.set_synchronous_mode(true);
541 host_resolver_.rules()->AddIPLiteralRule(
542 kDefaultServerHostName, "192.168.0.1", "");
543 host_resolver_.rules()->AddIPLiteralRule(
544 "mail.google.com", "192.168.0.1", "");
545
546 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59547 EXPECT_EQ(OK,
[email protected]bf4ea2f2014-03-10 22:57:53548 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59549 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28550 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59551 "GET",
[email protected]974849d2014-02-06 01:32:59552 net_log_,
553 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38554 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
555 EXPECT_TRUE(stream.get());
556
557 TestCompletionCallback callback;
558 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59559 EXPECT_EQ(OK,
560 request2.Request(server2,
561 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28562 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59563 "GET",
[email protected]974849d2014-02-06 01:32:59564 net_log_,
565 callback.callback()));
[email protected]eed749f92013-12-23 18:57:38566 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
567 EXPECT_TRUE(stream2.get());
568
[email protected]df157d9d2014-03-10 07:27:27569 factory_.OnSessionGoingAway(QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53570 &factory_, host_port_pair_, is_https_));
[email protected]df157d9d2014-03-10 07:27:27571 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53572 &factory_, host_port_pair_, is_https_));
[email protected]df157d9d2014-03-10 07:27:27573 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
574 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38575
576 TestCompletionCallback callback3;
577 QuicStreamRequest request3(&factory_);
[email protected]974849d2014-02-06 01:32:59578 EXPECT_EQ(OK,
579 request3.Request(server2,
580 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28581 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59582 "GET",
[email protected]974849d2014-02-06 01:32:59583 net_log_,
584 callback3.callback()));
[email protected]eed749f92013-12-23 18:57:38585 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
586 EXPECT_TRUE(stream3.get());
587
[email protected]df157d9d2014-03-10 07:27:27588 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(
589 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38590
591 EXPECT_TRUE(socket_data1.at_read_eof());
592 EXPECT_TRUE(socket_data1.at_write_eof());
593 EXPECT_TRUE(socket_data2.at_read_eof());
594 EXPECT_TRUE(socket_data2.at_write_eof());
595}
596
[email protected]5db452202014-08-19 05:22:15597TEST_P(QuicStreamFactoryTest, HttpsPooling) {
[email protected]eed749f92013-12-23 18:57:38598 MockRead reads[] = {
599 MockRead(ASYNC, OK, 0) // EOF
600 };
rtennetibe635732014-10-02 22:51:42601 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38602 socket_factory_.AddSocketDataProvider(&socket_data);
603 socket_data.StopAfter(1);
604
[email protected]bf4ea2f2014-03-10 22:57:53605 HostPortPair server1("www.example.org", 443);
606 HostPortPair server2("mail.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38607
608 // Load a cert that is valid for:
609 // www.example.org (server1)
610 // mail.example.org (server2)
611 // www.example.com
612 base::FilePath certs_dir = GetTestCertsDirectory();
613 scoped_refptr<X509Certificate> test_cert(
614 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
rtennetibe635732014-10-02 22:51:42615 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
[email protected]b694e48c2014-03-18 17:10:13616 ProofVerifyDetailsChromium verify_details;
617 verify_details.cert_verify_result.verified_cert = test_cert;
[email protected]5db452202014-08-19 05:22:15618 verify_details.cert_verify_result.is_issued_by_known_root = true;
[email protected]b694e48c2014-03-18 17:10:13619 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
[email protected]eed749f92013-12-23 18:57:38620
621 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53622 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
623 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38624
625 QuicStreamRequest request(&factory_);
626 is_https_ = true;
[email protected]974849d2014-02-06 01:32:59627 EXPECT_EQ(OK,
628 request.Request(server1,
629 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28630 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59631 "GET",
[email protected]974849d2014-02-06 01:32:59632 net_log_,
633 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38634 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
635 EXPECT_TRUE(stream.get());
636
637 TestCompletionCallback callback;
638 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59639 EXPECT_EQ(OK,
640 request2.Request(server2,
641 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28642 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59643 "GET",
[email protected]974849d2014-02-06 01:32:59644 net_log_,
645 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38646 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
647 EXPECT_TRUE(stream2.get());
648
[email protected]df157d9d2014-03-10 07:27:27649 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
650 &factory_, server1, is_https_),
651 QuicStreamFactoryPeer::GetActiveSession(
652 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38653
654 EXPECT_TRUE(socket_data.at_read_eof());
655 EXPECT_TRUE(socket_data.at_write_eof());
656}
657
jri584002d12014-09-09 00:51:28658TEST_P(QuicStreamFactoryTest, NoHttpsPoolingIfDisabled) {
659 MockRead reads[] = {
660 MockRead(ASYNC, OK, 0) // EOF
661 };
rtennetibe635732014-10-02 22:51:42662 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
663 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28664 socket_factory_.AddSocketDataProvider(&socket_data1);
665 socket_factory_.AddSocketDataProvider(&socket_data2);
666 socket_data1.StopAfter(1);
667 socket_data2.StopAfter(1);
668
669 HostPortPair server1("www.example.org", 443);
670 HostPortPair server2("mail.example.org", 443);
671
672 // Load a cert that is valid for:
673 // www.example.org (server1)
674 // mail.example.org (server2)
675 // www.example.com
676 base::FilePath certs_dir = GetTestCertsDirectory();
677 scoped_refptr<X509Certificate> test_cert(
678 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
rtennetibe635732014-10-02 22:51:42679 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
jri584002d12014-09-09 00:51:28680 ProofVerifyDetailsChromium verify_details;
681 verify_details.cert_verify_result.verified_cert = test_cert;
682 verify_details.cert_verify_result.is_issued_by_known_root = true;
683 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
684
685 host_resolver_.set_synchronous_mode(true);
686 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
687 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
688
689 // Disable connection pooling.
690 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
691
692 QuicStreamRequest request(&factory_);
693 is_https_ = true;
694 EXPECT_EQ(OK,
695 request.Request(server1,
696 is_https_,
697 privacy_mode_,
698 "GET",
699 net_log_,
700 callback_.callback()));
701 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
702 EXPECT_TRUE(stream.get());
703
704 TestCompletionCallback callback;
705 QuicStreamRequest request2(&factory_);
706 EXPECT_EQ(OK,
707 request2.Request(server2,
708 is_https_,
709 privacy_mode_,
710 "GET",
711 net_log_,
712 callback_.callback()));
713 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
714 EXPECT_TRUE(stream2.get());
715
716 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
717 &factory_, server1, is_https_),
718 QuicStreamFactoryPeer::GetActiveSession(
719 &factory_, server2, is_https_));
720
721 EXPECT_TRUE(socket_data1.at_read_eof());
722 EXPECT_TRUE(socket_data1.at_write_eof());
723 EXPECT_TRUE(socket_data2.at_read_eof());
724 EXPECT_TRUE(socket_data2.at_write_eof());
725}
726
[email protected]eed749f92013-12-23 18:57:38727TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithCertMismatch) {
728 MockRead reads[] = {
729 MockRead(ASYNC, OK, 0) // EOF
730 };
rtennetibe635732014-10-02 22:51:42731 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
732 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38733 socket_factory_.AddSocketDataProvider(&socket_data1);
734 socket_factory_.AddSocketDataProvider(&socket_data2);
735 socket_data1.StopAfter(1);
736 socket_data2.StopAfter(1);
737
[email protected]bf4ea2f2014-03-10 22:57:53738 HostPortPair server1("www.example.org", 443);
739 HostPortPair server2("mail.google.com", 443);
[email protected]eed749f92013-12-23 18:57:38740
741 // Load a cert that is valid for:
742 // www.example.org (server1)
743 // mail.example.org
744 // www.example.com
745 // But is not valid for mail.google.com (server2).
746 base::FilePath certs_dir = GetTestCertsDirectory();
747 scoped_refptr<X509Certificate> test_cert(
748 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
rtennetibe635732014-10-02 22:51:42749 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
[email protected]b694e48c2014-03-18 17:10:13750 ProofVerifyDetailsChromium verify_details;
751 verify_details.cert_verify_result.verified_cert = test_cert;
752 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
753
[email protected]eed749f92013-12-23 18:57:38754
755 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53756 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
757 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38758
759 QuicStreamRequest request(&factory_);
760 is_https_ = true;
[email protected]974849d2014-02-06 01:32:59761 EXPECT_EQ(OK,
762 request.Request(server1,
763 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28764 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59765 "GET",
[email protected]974849d2014-02-06 01:32:59766 net_log_,
767 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38768 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
769 EXPECT_TRUE(stream.get());
770
771 TestCompletionCallback callback;
772 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59773 EXPECT_EQ(OK,
774 request2.Request(server2,
775 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28776 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59777 "GET",
[email protected]974849d2014-02-06 01:32:59778 net_log_,
779 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38780 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
781 EXPECT_TRUE(stream2.get());
782
[email protected]df157d9d2014-03-10 07:27:27783 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
784 &factory_, server1, is_https_),
785 QuicStreamFactoryPeer::GetActiveSession(
786 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38787
788 EXPECT_TRUE(socket_data1.at_read_eof());
789 EXPECT_TRUE(socket_data1.at_write_eof());
790 EXPECT_TRUE(socket_data2.at_read_eof());
791 EXPECT_TRUE(socket_data2.at_write_eof());
792}
793
[email protected]5db452202014-08-19 05:22:15794TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
795 MockRead reads[] = {
796 MockRead(ASYNC, OK, 0) // EOF
797 };
rtennetibe635732014-10-02 22:51:42798 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15799 socket_factory_.AddSocketDataProvider(&socket_data);
800 socket_data.StopAfter(1);
801
802 HostPortPair server1("www.example.org", 443);
803 HostPortPair server2("mail.example.org", 443);
804 uint8 primary_pin = 1;
805 uint8 backup_pin = 2;
806 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
807 backup_pin);
808
809 // Load a cert that is valid for:
810 // www.example.org (server1)
811 // mail.example.org (server2)
812 base::FilePath certs_dir = GetTestCertsDirectory();
813 scoped_refptr<X509Certificate> test_cert(
814 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
rtennetibe635732014-10-02 22:51:42815 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
[email protected]5db452202014-08-19 05:22:15816 ProofVerifyDetailsChromium verify_details;
817 verify_details.cert_verify_result.verified_cert = test_cert;
818 verify_details.cert_verify_result.is_issued_by_known_root = true;
819 verify_details.cert_verify_result.public_key_hashes.push_back(
820 test::GetTestHashValue(primary_pin));
821 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
822
823
824 host_resolver_.set_synchronous_mode(true);
825 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
826 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
827
828 QuicStreamRequest request(&factory_);
829 is_https_ = true;
830 EXPECT_EQ(OK,
831 request.Request(server1,
832 is_https_,
833 privacy_mode_,
834 "GET",
835 net_log_,
836 callback_.callback()));
837 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
838 EXPECT_TRUE(stream.get());
839
840 TestCompletionCallback callback;
841 QuicStreamRequest request2(&factory_);
842 EXPECT_EQ(OK,
843 request2.Request(server2,
844 is_https_,
845 privacy_mode_,
846 "GET",
847 net_log_,
848 callback_.callback()));
849 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
850 EXPECT_TRUE(stream2.get());
851
852 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
853 &factory_, server1, is_https_),
854 QuicStreamFactoryPeer::GetActiveSession(
855 &factory_, server2, is_https_));
856
857 EXPECT_TRUE(socket_data.at_read_eof());
858 EXPECT_TRUE(socket_data.at_write_eof());
859}
860
jri584002d12014-09-09 00:51:28861TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithMatchingPinsIfDisabled) {
862 MockRead reads[] = {
863 MockRead(ASYNC, OK, 0) // EOF
864 };
rtennetibe635732014-10-02 22:51:42865 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
866 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28867 socket_factory_.AddSocketDataProvider(&socket_data1);
868 socket_factory_.AddSocketDataProvider(&socket_data2);
869 socket_data1.StopAfter(1);
870 socket_data2.StopAfter(1);
871
872 HostPortPair server1("www.example.org", 443);
873 HostPortPair server2("mail.example.org", 443);
874 uint8 primary_pin = 1;
875 uint8 backup_pin = 2;
876 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
877 backup_pin);
878
879 // Load a cert that is valid for:
880 // www.example.org (server1)
881 // mail.example.org (server2)
882 base::FilePath certs_dir = GetTestCertsDirectory();
883 scoped_refptr<X509Certificate> test_cert(
884 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
rtennetibe635732014-10-02 22:51:42885 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
jri584002d12014-09-09 00:51:28886 ProofVerifyDetailsChromium verify_details;
887 verify_details.cert_verify_result.verified_cert = test_cert;
888 verify_details.cert_verify_result.is_issued_by_known_root = true;
889 verify_details.cert_verify_result.public_key_hashes.push_back(
890 test::GetTestHashValue(primary_pin));
891 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
892
893
894 host_resolver_.set_synchronous_mode(true);
895 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
896 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
897
898 // Disable connection pooling.
899 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
900
901 QuicStreamRequest request(&factory_);
902 is_https_ = true;
903 EXPECT_EQ(OK,
904 request.Request(server1,
905 is_https_,
906 privacy_mode_,
907 "GET",
908 net_log_,
909 callback_.callback()));
910 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
911 EXPECT_TRUE(stream.get());
912
913 TestCompletionCallback callback;
914 QuicStreamRequest request2(&factory_);
915 EXPECT_EQ(OK,
916 request2.Request(server2,
917 is_https_,
918 privacy_mode_,
919 "GET",
920 net_log_,
921 callback_.callback()));
922 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
923 EXPECT_TRUE(stream2.get());
924
925 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
926 &factory_, server1, is_https_),
927 QuicStreamFactoryPeer::GetActiveSession(
928 &factory_, server2, is_https_));
929
930 EXPECT_TRUE(socket_data1.at_read_eof());
931 EXPECT_TRUE(socket_data1.at_write_eof());
932 EXPECT_TRUE(socket_data2.at_read_eof());
933 EXPECT_TRUE(socket_data2.at_write_eof());
934}
935
[email protected]5db452202014-08-19 05:22:15936TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
937 MockRead reads[] = {
938 MockRead(ASYNC, OK, 0) // EOF
939 };
rtennetibe635732014-10-02 22:51:42940 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
941 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15942 socket_factory_.AddSocketDataProvider(&socket_data1);
943 socket_factory_.AddSocketDataProvider(&socket_data2);
944 socket_data1.StopAfter(1);
945 socket_data2.StopAfter(1);
946
947 HostPortPair server1("www.example.org", 443);
948 HostPortPair server2("mail.example.org", 443);
949 uint8 primary_pin = 1;
950 uint8 backup_pin = 2;
951 uint8 bad_pin = 3;
952 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
953 backup_pin);
954
955 // Load a cert that is valid for:
956 // www.example.org (server1)
957 // mail.example.org (server2)
958 base::FilePath certs_dir = GetTestCertsDirectory();
959 scoped_refptr<X509Certificate> test_cert(
960 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
rtennetibe635732014-10-02 22:51:42961 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
[email protected]5db452202014-08-19 05:22:15962 ProofVerifyDetailsChromium verify_details;
963 verify_details.cert_verify_result.verified_cert = test_cert;
964 verify_details.cert_verify_result.is_issued_by_known_root = true;
965 verify_details.cert_verify_result.public_key_hashes.push_back(
966 test::GetTestHashValue(bad_pin));
967 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
968
969
970 host_resolver_.set_synchronous_mode(true);
971 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
972 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
973
974 QuicStreamRequest request(&factory_);
975 is_https_ = true;
976 EXPECT_EQ(OK,
977 request.Request(server1,
978 is_https_,
979 privacy_mode_,
980 "GET",
981 net_log_,
982 callback_.callback()));
983 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
984 EXPECT_TRUE(stream.get());
985
986 TestCompletionCallback callback;
987 QuicStreamRequest request2(&factory_);
988 EXPECT_EQ(OK,
989 request2.Request(server2,
990 is_https_,
991 privacy_mode_,
992 "GET",
993 net_log_,
994 callback_.callback()));
995 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
996 EXPECT_TRUE(stream2.get());
997
998 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
999 &factory_, server1, is_https_),
1000 QuicStreamFactoryPeer::GetActiveSession(
1001 &factory_, server2, is_https_));
1002
1003 EXPECT_TRUE(socket_data1.at_read_eof());
1004 EXPECT_TRUE(socket_data1.at_write_eof());
1005 EXPECT_TRUE(socket_data2.at_read_eof());
1006 EXPECT_TRUE(socket_data2.at_write_eof());
1007}
1008
[email protected]1e960032013-12-20 19:00:201009TEST_P(QuicStreamFactoryTest, Goaway) {
[email protected]4d283b32013-10-17 12:57:271010 MockRead reads[] = {
1011 MockRead(ASYNC, OK, 0) // EOF
1012 };
rtennetibe635732014-10-02 22:51:421013 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271014 socket_data.StopAfter(1);
1015 socket_factory_.AddSocketDataProvider(&socket_data);
rtennetibe635732014-10-02 22:51:421016 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271017 socket_data2.StopAfter(1);
1018 socket_factory_.AddSocketDataProvider(&socket_data2);
1019
1020 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591021 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531022 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591023 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281024 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591025 "GET",
[email protected]974849d2014-02-06 01:32:591026 net_log_,
1027 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,
[email protected]bf4ea2f2014-03-10 22:57:531047 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591048 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281049 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591050 "GET",
[email protected]974849d2014-02-06 01:32:591051 net_log_,
1052 callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271053 EXPECT_EQ(OK, callback_.WaitForResult());
1054 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1055 EXPECT_TRUE(stream2.get());
1056
1057 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(&factory_,
[email protected]bf4ea2f2014-03-10 22:57:531058 host_port_pair_,
[email protected]df157d9d2014-03-10 07:27:271059 is_https_));
[email protected]4d283b32013-10-17 12:57:271060 EXPECT_NE(session,
1061 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:531062 &factory_, host_port_pair_, is_https_));
[email protected]4d283b32013-10-17 12:57:271063 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
1064
1065 stream2.reset();
1066 stream.reset();
1067
1068 EXPECT_TRUE(socket_data.at_read_eof());
1069 EXPECT_TRUE(socket_data.at_write_eof());
[email protected]3c772402013-12-18 21:38:111070 EXPECT_TRUE(socket_data2.at_read_eof());
1071 EXPECT_TRUE(socket_data2.at_write_eof());
[email protected]4d283b32013-10-17 12:57:271072}
1073
[email protected]1e960032013-12-20 19:00:201074TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
[email protected]0b2294d32013-08-02 00:46:361075 MockRead reads[] = {
1076 MockRead(ASYNC, OK, 0) // EOF
1077 };
[email protected]66ae5962014-05-22 11:13:051078 QuicStreamId stream_id = kClientDataStreamId1;
[email protected]1e960032013-12-20 19:00:201079 scoped_ptr<QuicEncryptedPacket> rst(
1080 maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
[email protected]06ff5152013-08-29 01:03:051081 MockWrite writes[] = {
1082 MockWrite(ASYNC, rst->data(), rst->length(), 1),
1083 };
1084 DeterministicSocketData socket_data(reads, arraysize(reads),
1085 writes, arraysize(writes));
[email protected]0b2294d32013-08-02 00:46:361086 socket_factory_.AddSocketDataProvider(&socket_data);
1087 socket_data.StopAfter(1);
1088
1089 HttpRequestInfo request_info;
1090 std::vector<QuicHttpStream*> streams;
1091 // The MockCryptoClientStream sets max_open_streams to be
1092 // 2 * kDefaultMaxStreamsPerConnection.
1093 for (size_t i = 0; i < 2 * kDefaultMaxStreamsPerConnection; i++) {
1094 QuicStreamRequest request(&factory_);
[email protected]bf4ea2f2014-03-10 22:57:531095 int rv = request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591096 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281097 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591098 "GET",
[email protected]974849d2014-02-06 01:32:591099 net_log_,
[email protected]0b2294d32013-08-02 00:46:361100 callback_.callback());
1101 if (i == 0) {
1102 EXPECT_EQ(ERR_IO_PENDING, rv);
1103 EXPECT_EQ(OK, callback_.WaitForResult());
1104 } else {
1105 EXPECT_EQ(OK, rv);
1106 }
1107 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1108 EXPECT_TRUE(stream);
1109 EXPECT_EQ(OK, stream->InitializeStream(
1110 &request_info, DEFAULT_PRIORITY, net_log_, CompletionCallback()));
1111 streams.push_back(stream.release());
1112 }
1113
1114 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591115 EXPECT_EQ(OK,
[email protected]bf4ea2f2014-03-10 22:57:531116 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591117 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281118 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591119 "GET",
[email protected]974849d2014-02-06 01:32:591120 net_log_,
1121 CompletionCallback()));
[email protected]0b2294d32013-08-02 00:46:361122 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1123 EXPECT_TRUE(stream);
1124 EXPECT_EQ(ERR_IO_PENDING, stream->InitializeStream(
1125 &request_info, DEFAULT_PRIORITY, net_log_, callback_.callback()));
1126
1127 // Close the first stream.
1128 streams.front()->Close(false);
1129
1130 ASSERT_TRUE(callback_.have_result());
1131
1132 EXPECT_EQ(OK, callback_.WaitForResult());
1133
1134 EXPECT_TRUE(socket_data.at_read_eof());
1135 EXPECT_TRUE(socket_data.at_write_eof());
1136 STLDeleteElements(&streams);
1137}
1138
[email protected]1e960032013-12-20 19:00:201139TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
rtennetibe635732014-10-02 22:51:421140 DeterministicSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321141 socket_factory_.AddSocketDataProvider(&socket_data);
1142
[email protected]3c772402013-12-18 21:38:111143 host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName);
[email protected]e13201d82012-12-12 05:00:321144
1145 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591146 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531147 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591148 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281149 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591150 "GET",
[email protected]974849d2014-02-06 01:32:591151 net_log_,
1152 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321153
1154 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
1155
1156 EXPECT_TRUE(socket_data.at_read_eof());
1157 EXPECT_TRUE(socket_data.at_write_eof());
1158}
1159
[email protected]1e960032013-12-20 19:00:201160TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
[email protected]3c772402013-12-18 21:38:111161 MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
rtennetibe635732014-10-02 22:51:421162 DeterministicSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]3c772402013-12-18 21:38:111163 socket_data.set_connect_data(connect);
1164 socket_factory_.AddSocketDataProvider(&socket_data);
1165 socket_data.StopAfter(1);
1166
1167 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591168 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531169 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591170 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281171 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591172 "GET",
[email protected]974849d2014-02-06 01:32:591173 net_log_,
1174 callback_.callback()));
[email protected]3c772402013-12-18 21:38:111175
1176 EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult());
1177
1178 EXPECT_TRUE(socket_data.at_read_eof());
1179 EXPECT_TRUE(socket_data.at_write_eof());
1180}
1181
[email protected]1e960032013-12-20 19:00:201182TEST_P(QuicStreamFactoryTest, CancelCreate) {
[email protected]69dfd1b2013-06-04 22:20:121183 MockRead reads[] = {
[email protected]25c31dc2013-06-05 17:56:041184 MockRead(ASYNC, OK, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121185 };
rtennetibe635732014-10-02 22:51:421186 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321187 socket_factory_.AddSocketDataProvider(&socket_data);
1188 {
1189 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591190 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531191 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591192 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281193 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591194 "GET",
[email protected]974849d2014-02-06 01:32:591195 net_log_,
1196 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321197 }
1198
[email protected]25c31dc2013-06-05 17:56:041199 socket_data.StopAfter(1);
[email protected]e13201d82012-12-12 05:00:321200 base::RunLoop run_loop;
1201 run_loop.RunUntilIdle();
1202
1203 scoped_ptr<QuicHttpStream> stream(
[email protected]bf4ea2f2014-03-10 22:57:531204 CreateIfSessionExists(host_port_pair_, net_log_));
[email protected]e13201d82012-12-12 05:00:321205 EXPECT_TRUE(stream.get());
1206 stream.reset();
1207
1208 EXPECT_TRUE(socket_data.at_read_eof());
1209 EXPECT_TRUE(socket_data.at_write_eof());
1210}
1211
[email protected]1e960032013-12-20 19:00:201212TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) {
[email protected]3c772402013-12-18 21:38:111213 // Sequentially connect to the default host, then another host, and then the
1214 // default host. Verify that the default host gets a consistent ephemeral
1215 // port, that is different from the other host's connection.
1216
1217 std::string other_server_name = "other.google.com";
1218 EXPECT_NE(kDefaultServerHostName, other_server_name);
1219 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort);
[email protected]3c772402013-12-18 21:38:111220
[email protected]bf4ea2f2014-03-10 22:57:531221 int original_port = GetSourcePortForNewSession(host_port_pair_);
1222 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2));
1223 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]3c772402013-12-18 21:38:111224}
1225
[email protected]d8e2abf82014-03-06 10:30:101226TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) {
1227 // Get a session to the host using the port suggester.
1228 int original_port =
[email protected]bf4ea2f2014-03-10 22:57:531229 GetSourcePortForNewSessionAndGoAway(host_port_pair_);
[email protected]d8e2abf82014-03-06 10:30:101230 // Verify that the port is different after the goaway.
[email protected]bf4ea2f2014-03-10 22:57:531231 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101232 // Since the previous session did not goaway we should see the original port.
[email protected]bf4ea2f2014-03-10 22:57:531233 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101234}
1235
[email protected]1e960032013-12-20 19:00:201236TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
[email protected]56dfb902013-01-03 23:17:551237 MockRead reads[] = {
[email protected]0edce6a2013-05-08 18:02:401238 MockRead(ASYNC, 0, 0) // EOF
[email protected]56dfb902013-01-03 23:17:551239 };
[email protected]459a7402014-02-10 12:58:521240 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1241 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311242 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521243 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421244 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521245 writes.size());
[email protected]56dfb902013-01-03 23:17:551246 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0edce6a2013-05-08 18:02:401247 socket_data.StopAfter(1);
[email protected]56dfb902013-01-03 23:17:551248
[email protected]69dfd1b2013-06-04 22:20:121249 MockRead reads2[] = {
[email protected]25c31dc2013-06-05 17:56:041250 MockRead(ASYNC, 0, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121251 };
rtennetibe635732014-10-02 22:51:421252 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]56dfb902013-01-03 23:17:551253 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]0edce6a2013-05-08 18:02:401254 socket_data2.StopAfter(1);
[email protected]56dfb902013-01-03 23:17:551255
1256 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591257 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531258 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591259 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281260 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591261 "GET",
[email protected]974849d2014-02-06 01:32:591262 net_log_,
1263 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551264
1265 EXPECT_EQ(OK, callback_.WaitForResult());
1266 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361267 HttpRequestInfo request_info;
1268 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1269 DEFAULT_PRIORITY,
1270 net_log_, CompletionCallback()));
[email protected]56dfb902013-01-03 23:17:551271
1272 // Close the session and verify that stream saw the error.
1273 factory_.CloseAllSessions(ERR_INTERNET_DISCONNECTED);
1274 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1275 stream->ReadResponseHeaders(callback_.callback()));
1276
1277 // Now attempting to request a stream to the same origin should create
1278 // a new session.
1279
1280 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591281 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531282 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591283 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281284 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591285 "GET",
[email protected]974849d2014-02-06 01:32:591286 net_log_,
1287 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551288
1289 EXPECT_EQ(OK, callback_.WaitForResult());
1290 stream = request2.ReleaseStream();
1291 stream.reset(); // Will reset stream 3.
1292
1293 EXPECT_TRUE(socket_data.at_read_eof());
1294 EXPECT_TRUE(socket_data.at_write_eof());
1295 EXPECT_TRUE(socket_data2.at_read_eof());
1296 EXPECT_TRUE(socket_data2.at_write_eof());
1297}
1298
[email protected]1e960032013-12-20 19:00:201299TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
[email protected]f698a012013-05-06 20:18:591300 MockRead reads[] = {
[email protected]0edce6a2013-05-08 18:02:401301 MockRead(ASYNC, 0, 0) // EOF
[email protected]f698a012013-05-06 20:18:591302 };
[email protected]459a7402014-02-10 12:58:521303 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1304 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311305 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521306 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421307 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521308 writes.size());
[email protected]f698a012013-05-06 20:18:591309 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0edce6a2013-05-08 18:02:401310 socket_data.StopAfter(1);
[email protected]f698a012013-05-06 20:18:591311
[email protected]69dfd1b2013-06-04 22:20:121312 MockRead reads2[] = {
[email protected]25c31dc2013-06-05 17:56:041313 MockRead(ASYNC, 0, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121314 };
rtennetibe635732014-10-02 22:51:421315 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]f698a012013-05-06 20:18:591316 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]0edce6a2013-05-08 18:02:401317 socket_data2.StopAfter(1);
[email protected]f698a012013-05-06 20:18:591318
1319 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591320 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531321 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591322 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281323 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591324 "GET",
[email protected]974849d2014-02-06 01:32:591325 net_log_,
1326 callback_.callback()));
[email protected]f698a012013-05-06 20:18:591327
1328 EXPECT_EQ(OK, callback_.WaitForResult());
1329 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361330 HttpRequestInfo request_info;
1331 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1332 DEFAULT_PRIORITY,
1333 net_log_, CompletionCallback()));
[email protected]f698a012013-05-06 20:18:591334
1335 // Change the IP address and verify that stream saw the error.
1336 factory_.OnIPAddressChanged();
1337 EXPECT_EQ(ERR_NETWORK_CHANGED,
1338 stream->ReadResponseHeaders(callback_.callback()));
[email protected]11c05872013-08-20 02:04:121339 EXPECT_TRUE(factory_.require_confirmation());
[email protected]f698a012013-05-06 20:18:591340
1341 // Now attempting to request a stream to the same origin should create
1342 // a new session.
1343
1344 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591345 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531346 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591347 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281348 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591349 "GET",
[email protected]974849d2014-02-06 01:32:591350 net_log_,
1351 callback_.callback()));
[email protected]f698a012013-05-06 20:18:591352
1353 EXPECT_EQ(OK, callback_.WaitForResult());
1354 stream = request2.ReleaseStream();
1355 stream.reset(); // Will reset stream 3.
1356
1357 EXPECT_TRUE(socket_data.at_read_eof());
1358 EXPECT_TRUE(socket_data.at_write_eof());
1359 EXPECT_TRUE(socket_data2.at_read_eof());
1360 EXPECT_TRUE(socket_data2.at_write_eof());
1361}
1362
[email protected]1e960032013-12-20 19:00:201363TEST_P(QuicStreamFactoryTest, OnCertAdded) {
[email protected]d7d1e50b2013-11-25 22:08:091364 MockRead reads[] = {
1365 MockRead(ASYNC, 0, 0) // EOF
1366 };
[email protected]459a7402014-02-10 12:58:521367 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1368 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311369 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521370 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421371 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521372 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:091373 socket_factory_.AddSocketDataProvider(&socket_data);
1374 socket_data.StopAfter(1);
1375
1376 MockRead reads2[] = {
1377 MockRead(ASYNC, 0, 0) // EOF
1378 };
rtennetibe635732014-10-02 22:51:421379 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:091380 socket_factory_.AddSocketDataProvider(&socket_data2);
1381 socket_data2.StopAfter(1);
1382
1383 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591384 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531385 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591386 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281387 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591388 "GET",
[email protected]974849d2014-02-06 01:32:591389 net_log_,
1390 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091391
1392 EXPECT_EQ(OK, callback_.WaitForResult());
1393 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1394 HttpRequestInfo request_info;
1395 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1396 DEFAULT_PRIORITY,
1397 net_log_, CompletionCallback()));
1398
1399 // Add a cert and verify that stream saw the event.
rtennetibe635732014-10-02 22:51:421400 factory_.OnCertAdded(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:091401 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1402 stream->ReadResponseHeaders(callback_.callback()));
1403 EXPECT_FALSE(factory_.require_confirmation());
1404
1405 // Now attempting to request a stream to the same origin should create
1406 // a new session.
1407
1408 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591409 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531410 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591411 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281412 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591413 "GET",
[email protected]974849d2014-02-06 01:32:591414 net_log_,
1415 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091416
1417 EXPECT_EQ(OK, callback_.WaitForResult());
1418 stream = request2.ReleaseStream();
1419 stream.reset(); // Will reset stream 3.
1420
1421 EXPECT_TRUE(socket_data.at_read_eof());
1422 EXPECT_TRUE(socket_data.at_write_eof());
1423 EXPECT_TRUE(socket_data2.at_read_eof());
1424 EXPECT_TRUE(socket_data2.at_write_eof());
1425}
1426
[email protected]1e960032013-12-20 19:00:201427TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
[email protected]d7d1e50b2013-11-25 22:08:091428 MockRead reads[] = {
1429 MockRead(ASYNC, 0, 0) // EOF
1430 };
[email protected]459a7402014-02-10 12:58:521431 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1432 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311433 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521434 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421435 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521436 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:091437 socket_factory_.AddSocketDataProvider(&socket_data);
1438 socket_data.StopAfter(1);
1439
1440 MockRead reads2[] = {
1441 MockRead(ASYNC, 0, 0) // EOF
1442 };
rtennetibe635732014-10-02 22:51:421443 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:091444 socket_factory_.AddSocketDataProvider(&socket_data2);
1445 socket_data2.StopAfter(1);
1446
1447 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591448 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531449 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591450 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281451 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591452 "GET",
[email protected]974849d2014-02-06 01:32:591453 net_log_,
1454 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091455
1456 EXPECT_EQ(OK, callback_.WaitForResult());
1457 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1458 HttpRequestInfo request_info;
1459 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1460 DEFAULT_PRIORITY,
1461 net_log_, CompletionCallback()));
1462
1463 // Change the CA cert and verify that stream saw the event.
rtennetibe635732014-10-02 22:51:421464 factory_.OnCACertChanged(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:091465 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1466 stream->ReadResponseHeaders(callback_.callback()));
1467 EXPECT_FALSE(factory_.require_confirmation());
1468
1469 // Now attempting to request a stream to the same origin should create
1470 // a new session.
1471
1472 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591473 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531474 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591475 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281476 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591477 "GET",
[email protected]974849d2014-02-06 01:32:591478 net_log_,
1479 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091480
1481 EXPECT_EQ(OK, callback_.WaitForResult());
1482 stream = request2.ReleaseStream();
1483 stream.reset(); // Will reset stream 3.
1484
1485 EXPECT_TRUE(socket_data.at_read_eof());
1486 EXPECT_TRUE(socket_data.at_write_eof());
1487 EXPECT_TRUE(socket_data2.at_read_eof());
1488 EXPECT_TRUE(socket_data2.at_write_eof());
1489}
1490
[email protected]1e960032013-12-20 19:00:201491TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
[email protected]6e12d702013-11-13 00:17:171492 vector<string> cannoncial_suffixes;
1493 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1494 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]c49ff182013-09-28 08:33:261495
[email protected]6e12d702013-11-13 00:17:171496 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1497 string r1_host_name("r1");
1498 string r2_host_name("r2");
1499 r1_host_name.append(cannoncial_suffixes[i]);
1500 r2_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141501
[email protected]bf4ea2f2014-03-10 22:57:531502 HostPortPair host_port_pair1(r1_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121503 QuicCryptoClientConfig* crypto_config =
1504 QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
[email protected]257f24f2014-04-01 09:15:371505 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171506 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371507 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171508 EXPECT_FALSE(cached1->proof_valid());
1509 EXPECT_TRUE(cached1->source_address_token().empty());
1510
1511 // Mutate the cached1 to have different data.
1512 // TODO(rtenneti): mutate other members of CachedState.
1513 cached1->set_source_address_token(r1_host_name);
1514 cached1->SetProofValid();
1515
[email protected]bf4ea2f2014-03-10 22:57:531516 HostPortPair host_port_pair2(r2_host_name, 80);
[email protected]257f24f2014-04-01 09:15:371517 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171518 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371519 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171520 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
1521 EXPECT_TRUE(cached2->proof_valid());
1522 }
[email protected]b70fdb792013-10-25 19:04:141523}
1524
[email protected]1e960032013-12-20 19:00:201525TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
[email protected]6e12d702013-11-13 00:17:171526 vector<string> cannoncial_suffixes;
1527 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1528 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]b70fdb792013-10-25 19:04:141529
[email protected]6e12d702013-11-13 00:17:171530 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1531 string r3_host_name("r3");
1532 string r4_host_name("r4");
1533 r3_host_name.append(cannoncial_suffixes[i]);
1534 r4_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141535
[email protected]bf4ea2f2014-03-10 22:57:531536 HostPortPair host_port_pair1(r3_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121537 QuicCryptoClientConfig* crypto_config =
1538 QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
[email protected]257f24f2014-04-01 09:15:371539 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171540 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371541 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171542 EXPECT_FALSE(cached1->proof_valid());
1543 EXPECT_TRUE(cached1->source_address_token().empty());
1544
1545 // Mutate the cached1 to have different data.
1546 // TODO(rtenneti): mutate other members of CachedState.
1547 cached1->set_source_address_token(r3_host_name);
1548 cached1->SetProofInvalid();
1549
[email protected]bf4ea2f2014-03-10 22:57:531550 HostPortPair host_port_pair2(r4_host_name, 80);
[email protected]257f24f2014-04-01 09:15:371551 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171552 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371553 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171554 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
1555 EXPECT_TRUE(cached2->source_address_token().empty());
1556 EXPECT_FALSE(cached2->proof_valid());
1557 }
[email protected]c49ff182013-09-28 08:33:261558}
1559
rtenneti38f5cd52014-10-28 20:28:281560TEST_P(QuicStreamFactoryTest, CancelWaitForDataReady) {
1561 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
1562 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
1563 const size_t kLoadServerInfoTimeoutMs = 50;
1564 QuicStreamFactoryPeer::SetLoadServerInfoTimeout(
1565 &factory_, kLoadServerInfoTimeoutMs);
1566
1567 MockRead reads[] = {
1568 MockRead(ASYNC, OK, 0) // EOF
1569 };
1570 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1571 socket_factory_.AddSocketDataProvider(&socket_data);
1572 socket_data.StopAfter(1);
1573
1574 crypto_client_stream_factory_.set_handshake_mode(
1575 MockCryptoClientStream::ZERO_RTT);
1576 host_resolver_.set_synchronous_mode(true);
1577 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1578 "192.168.0.1", "");
1579
1580 QuicStreamRequest request(&factory_);
1581 EXPECT_EQ(ERR_IO_PENDING,
1582 request.Request(host_port_pair_,
1583 is_https_,
1584 privacy_mode_,
1585 "GET",
1586 net_log_,
1587 callback_.callback()));
1588
1589 // Verify that the CancelWaitForDataReady task has been posted.
1590 ASSERT_EQ(1u, runner_->GetPostedTasks().size());
1591 EXPECT_EQ(base::TimeDelta::FromMilliseconds(kLoadServerInfoTimeoutMs),
1592 runner_->GetPostedTasks()[0].delay);
1593
1594 runner_->RunNextTask();
1595 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
1596
1597 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1598 EXPECT_TRUE(stream.get());
1599 EXPECT_TRUE(socket_data.at_read_eof());
1600 EXPECT_TRUE(socket_data.at_write_eof());
1601}
1602
[email protected]e13201d82012-12-12 05:00:321603} // namespace test
[email protected]e13201d82012-12-12 05:00:321604} // namespace net