blob: 05234c0fc245d71a55d048cce750a670ec6e0e79 [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 {};
rtennetif0b832b2014-11-07 02:32:30124
125 virtual void OnExternalCacheHit() override {};
rtenneti38f5cd52014-10-28 20:28:28126};
127
128class MockQuicServerInfoFactory : public QuicServerInfoFactory {
129 public:
130 MockQuicServerInfoFactory() {}
131 virtual ~MockQuicServerInfoFactory() {}
132
133 virtual QuicServerInfo* GetForServer(const QuicServerId& server_id) override {
134 return new MockQuicServerInfo(server_id);
135 }
136};
137
138
[email protected]1e960032013-12-20 19:00:20139class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> {
[email protected]e13201d82012-12-12 05:00:32140 protected:
141 QuicStreamFactoryTest()
[email protected]457d6952013-12-13 09:24:58142 : random_generator_(0),
143 clock_(new MockClock()),
rtenneti38f5cd52014-10-28 20:28:28144 runner_(new TestTaskRunner(clock_)),
rtenneti4b06ae72014-08-26 03:43:43145 maker_(GetParam(), 0, clock_),
[email protected]59c0bbd2014-03-22 04:08:12146 cert_verifier_(CertVerifier::CreateDefault()),
jri2b966f22014-09-02 22:25:36147 channel_id_service_(
rtennetibe635732014-10-02 22:51:42148 new ChannelIDService(new DefaultChannelIDStore(nullptr),
jri2b966f22014-09-02 22:25:36149 base::MessageLoopProxy::current())),
150 factory_(&host_resolver_,
151 &socket_factory_,
152 base::WeakPtr<HttpServerProperties>(),
153 cert_verifier_.get(),
154 channel_id_service_.get(),
155 &transport_security_state_,
156 &crypto_client_stream_factory_,
157 &random_generator_,
158 clock_,
159 kDefaultMaxPacketSize,
160 std::string(),
161 SupportedVersions(GetParam()),
162 /*enable_port_selection=*/true,
jri584002d12014-09-09 00:51:28163 /*always_require_handshake_confirmation=*/false,
164 /*disable_connection_pooling=*/false,
rtenneti38f5cd52014-10-28 20:28:28165 /*load_server_info_timeout=*/0u,
jri2b966f22014-09-02 22:25:36166 QuicTagVector()),
[email protected]bf4ea2f2014-03-10 22:57:53167 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
[email protected]9dd3ff0f2014-03-26 09:51:28168 is_https_(false),
[email protected]314b03992014-04-01 01:28:53169 privacy_mode_(PRIVACY_MODE_DISABLED) {
[email protected]11c05872013-08-20 02:04:12170 factory_.set_require_confirmation(false);
[email protected]ca4e0d92014-08-22 16:33:22171 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
[email protected]e13201d82012-12-12 05:00:32172 }
173
[email protected]df157d9d2014-03-10 07:27:27174 scoped_ptr<QuicHttpStream> CreateIfSessionExists(
[email protected]bf4ea2f2014-03-10 22:57:53175 const HostPortPair& host_port_pair,
[email protected]df157d9d2014-03-10 07:27:27176 const BoundNetLog& net_log) {
177 return QuicStreamFactoryPeer::CreateIfSessionExists(
[email protected]bf4ea2f2014-03-10 22:57:53178 &factory_, host_port_pair, false, net_log_);
[email protected]df157d9d2014-03-10 07:27:27179 }
[email protected]e13201d82012-12-12 05:00:32180
[email protected]bf4ea2f2014-03-10 22:57:53181 int GetSourcePortForNewSession(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10182 return GetSourcePortForNewSessionInner(destination, false);
183 }
184
185 int GetSourcePortForNewSessionAndGoAway(
[email protected]bf4ea2f2014-03-10 22:57:53186 const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10187 return GetSourcePortForNewSessionInner(destination, true);
188 }
189
[email protected]bf4ea2f2014-03-10 22:57:53190 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
[email protected]d8e2abf82014-03-06 10:30:10191 bool goaway_received) {
[email protected]3c772402013-12-18 21:38:11192 // Should only be called if there is no active session for this destination.
rtennetibe635732014-10-02 22:51:42193 EXPECT_EQ(nullptr, CreateIfSessionExists(destination, net_log_).get());
[email protected]3c772402013-12-18 21:38:11194 size_t socket_count = socket_factory_.udp_client_sockets().size();
195
196 MockRead reads[] = {
197 MockRead(ASYNC, OK, 0) // EOF
198 };
rtennetibe635732014-10-02 22:51:42199 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]3c772402013-12-18 21:38:11200 socket_data.StopAfter(1);
201 socket_factory_.AddSocketDataProvider(&socket_data);
202
203 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59204 EXPECT_EQ(ERR_IO_PENDING,
205 request.Request(destination,
206 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28207 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59208 "GET",
[email protected]974849d2014-02-06 01:32:59209 net_log_,
210 callback_.callback()));
[email protected]3c772402013-12-18 21:38:11211
212 EXPECT_EQ(OK, callback_.WaitForResult());
213 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
214 EXPECT_TRUE(stream.get());
215 stream.reset();
216
217 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
[email protected]df157d9d2014-03-10 07:27:27218 &factory_, destination, is_https_);
[email protected]3c772402013-12-18 21:38:11219
220 if (socket_count + 1 != socket_factory_.udp_client_sockets().size()) {
221 EXPECT_TRUE(false);
222 return 0;
223 }
224
225 IPEndPoint endpoint;
226 socket_factory_.
227 udp_client_sockets()[socket_count]->GetLocalAddress(&endpoint);
228 int port = endpoint.port();
[email protected]d8e2abf82014-03-06 10:30:10229 if (goaway_received) {
230 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, "");
231 session->OnGoAway(goaway);
232 }
[email protected]3c772402013-12-18 21:38:11233
234 factory_.OnSessionClosed(session);
rtennetibe635732014-10-02 22:51:42235 EXPECT_EQ(nullptr, CreateIfSessionExists(destination, net_log_).get());
[email protected]3c772402013-12-18 21:38:11236 EXPECT_TRUE(socket_data.at_read_eof());
237 EXPECT_TRUE(socket_data.at_write_eof());
238 return port;
239 }
240
[email protected]459a7402014-02-10 12:58:52241 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() {
[email protected]66ae5962014-05-22 11:13:05242 QuicStreamId stream_id = kClientDataStreamId1;
[email protected]51cc1342014-04-18 23:44:37243 return maker_.MakeRstPacket(
244 1, true, stream_id,
rtenneti4a5df262014-11-07 00:43:58245 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam()));
[email protected]459a7402014-02-10 12:58:52246 }
247
rtenneti38f5cd52014-10-28 20:28:28248 MockQuicServerInfoFactory quic_server_info_factory_;
[email protected]e13201d82012-12-12 05:00:32249 MockHostResolver host_resolver_;
[email protected]0edce6a2013-05-08 18:02:40250 DeterministicMockClientSocketFactory socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05251 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]9558c5d32012-12-22 00:08:14252 MockRandom random_generator_;
[email protected]872edd9e2013-01-16 08:51:15253 MockClock* clock_; // Owned by factory_.
rtenneti38f5cd52014-10-28 20:28:28254 scoped_refptr<TestTaskRunner> runner_;
rtenneti4b06ae72014-08-26 03:43:43255 QuicTestPacketMaker maker_;
[email protected]59c0bbd2014-03-22 04:08:12256 scoped_ptr<CertVerifier> cert_verifier_;
[email protected]6b8a3c742014-07-25 00:25:35257 scoped_ptr<ChannelIDService> channel_id_service_;
[email protected]080b77932014-08-04 01:22:46258 TransportSecurityState transport_security_state_;
[email protected]e13201d82012-12-12 05:00:32259 QuicStreamFactory factory_;
[email protected]bf4ea2f2014-03-10 22:57:53260 HostPortPair host_port_pair_;
[email protected]6d1b4ed2013-07-10 03:57:54261 bool is_https_;
[email protected]9dd3ff0f2014-03-26 09:51:28262 PrivacyMode privacy_mode_;
[email protected]e13201d82012-12-12 05:00:32263 BoundNetLog net_log_;
264 TestCompletionCallback callback_;
[email protected]e13201d82012-12-12 05:00:32265};
266
[email protected]1e960032013-12-20 19:00:20267INSTANTIATE_TEST_CASE_P(Version, QuicStreamFactoryTest,
268 ::testing::ValuesIn(QuicSupportedVersions()));
269
270TEST_P(QuicStreamFactoryTest, CreateIfSessionExists) {
rtennetibe635732014-10-02 22:51:42271 EXPECT_EQ(nullptr, CreateIfSessionExists(host_port_pair_, net_log_).get());
[email protected]e13201d82012-12-12 05:00:32272}
273
[email protected]1e960032013-12-20 19:00:20274TEST_P(QuicStreamFactoryTest, Create) {
[email protected]69dfd1b2013-06-04 22:20:12275 MockRead reads[] = {
[email protected]25c31dc2013-06-05 17:56:04276 MockRead(ASYNC, OK, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:12277 };
rtennetibe635732014-10-02 22:51:42278 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:32279 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]25c31dc2013-06-05 17:56:04280 socket_data.StopAfter(1);
[email protected]e13201d82012-12-12 05:00:32281
282 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59283 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53284 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59285 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28286 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59287 "GET",
[email protected]974849d2014-02-06 01:32:59288 net_log_,
289 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32290
291 EXPECT_EQ(OK, callback_.WaitForResult());
292 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0edce6a2013-05-08 18:02:40293 EXPECT_TRUE(stream.get());
[email protected]e13201d82012-12-12 05:00:32294
295 // Will reset stream 3.
[email protected]bf4ea2f2014-03-10 22:57:53296 stream = CreateIfSessionExists(host_port_pair_, net_log_);
[email protected]e13201d82012-12-12 05:00:32297 EXPECT_TRUE(stream.get());
298
[email protected]6d1b4ed2013-07-10 03:57:54299 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
300 // in streams on different sessions.
[email protected]e13201d82012-12-12 05:00:32301 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59302 EXPECT_EQ(OK,
[email protected]bf4ea2f2014-03-10 22:57:53303 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59304 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28305 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59306 "GET",
[email protected]974849d2014-02-06 01:32:59307 net_log_,
308 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32309 stream = request2.ReleaseStream(); // Will reset stream 5.
310 stream.reset(); // Will reset stream 7.
311
312 EXPECT_TRUE(socket_data.at_read_eof());
313 EXPECT_TRUE(socket_data.at_write_eof());
314}
315
[email protected]8bd2b812014-03-26 04:01:17316TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
317 MockRead reads[] = {
318 MockRead(ASYNC, OK, 0) // EOF
319 };
rtennetibe635732014-10-02 22:51:42320 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17321 socket_factory_.AddSocketDataProvider(&socket_data);
322 socket_data.StopAfter(1);
323
324 crypto_client_stream_factory_.set_handshake_mode(
325 MockCryptoClientStream::ZERO_RTT);
326 host_resolver_.set_synchronous_mode(true);
327 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
328 "192.168.0.1", "");
329
330 QuicStreamRequest request(&factory_);
331 EXPECT_EQ(OK,
332 request.Request(host_port_pair_,
333 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28334 privacy_mode_,
[email protected]8bd2b812014-03-26 04:01:17335 "GET",
336 net_log_,
337 callback_.callback()));
338
339 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
340 EXPECT_TRUE(stream.get());
341 EXPECT_TRUE(socket_data.at_read_eof());
342 EXPECT_TRUE(socket_data.at_write_eof());
343}
344
345TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
346 MockRead reads[] = {
347 MockRead(ASYNC, OK, 0) // EOF
348 };
rtennetibe635732014-10-02 22:51:42349 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17350 socket_factory_.AddSocketDataProvider(&socket_data);
351 socket_data.StopAfter(1);
352
353 crypto_client_stream_factory_.set_handshake_mode(
354 MockCryptoClientStream::ZERO_RTT);
355 host_resolver_.set_synchronous_mode(true);
356 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
357 "192.168.0.1", "");
358
359 QuicStreamRequest request(&factory_);
360 // Posts require handshake confirmation, so this will return asynchronously.
361 EXPECT_EQ(ERR_IO_PENDING,
362 request.Request(host_port_pair_,
363 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28364 privacy_mode_,
[email protected]8bd2b812014-03-26 04:01:17365 "POST",
366 net_log_,
367 callback_.callback()));
368
369 // Confirm the handshake and verify that the stream is created.
370 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
371 QuicSession::HANDSHAKE_CONFIRMED);
372
373 EXPECT_EQ(OK, callback_.WaitForResult());
374 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
375 EXPECT_TRUE(stream.get());
376 EXPECT_TRUE(socket_data.at_read_eof());
377 EXPECT_TRUE(socket_data.at_write_eof());
378}
379
[email protected]df157d9d2014-03-10 07:27:27380TEST_P(QuicStreamFactoryTest, CreateHttpVsHttps) {
381 MockRead reads[] = {
382 MockRead(ASYNC, OK, 0) // EOF
383 };
rtennetibe635732014-10-02 22:51:42384 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
385 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]df157d9d2014-03-10 07:27:27386 socket_factory_.AddSocketDataProvider(&socket_data1);
387 socket_factory_.AddSocketDataProvider(&socket_data2);
388 socket_data1.StopAfter(1);
389 socket_data2.StopAfter(1);
390
391 QuicStreamRequest request(&factory_);
392 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53393 request.Request(host_port_pair_,
[email protected]df157d9d2014-03-10 07:27:27394 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28395 privacy_mode_,
[email protected]df157d9d2014-03-10 07:27:27396 "GET",
[email protected]df157d9d2014-03-10 07:27:27397 net_log_,
398 callback_.callback()));
399
400 EXPECT_EQ(OK, callback_.WaitForResult());
401 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
402 EXPECT_TRUE(stream.get());
403
404 QuicStreamRequest request2(&factory_);
405 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53406 request2.Request(host_port_pair_,
[email protected]df157d9d2014-03-10 07:27:27407 !is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28408 privacy_mode_,
[email protected]df157d9d2014-03-10 07:27:27409 "GET",
[email protected]df157d9d2014-03-10 07:27:27410 net_log_,
411 callback_.callback()));
412 EXPECT_EQ(OK, callback_.WaitForResult());
413 stream = request2.ReleaseStream();
414 EXPECT_TRUE(stream.get());
415 stream.reset();
416
417 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53418 &factory_, host_port_pair_, is_https_),
[email protected]df157d9d2014-03-10 07:27:27419 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53420 &factory_, host_port_pair_, !is_https_));
[email protected]df157d9d2014-03-10 07:27:27421
422 EXPECT_TRUE(socket_data1.at_read_eof());
423 EXPECT_TRUE(socket_data1.at_write_eof());
424 EXPECT_TRUE(socket_data2.at_read_eof());
425 EXPECT_TRUE(socket_data2.at_write_eof());
426}
427
[email protected]5db452202014-08-19 05:22:15428TEST_P(QuicStreamFactoryTest, Pooling) {
[email protected]eed749f92013-12-23 18:57:38429 MockRead reads[] = {
430 MockRead(ASYNC, OK, 0) // EOF
431 };
rtennetibe635732014-10-02 22:51:42432 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38433 socket_factory_.AddSocketDataProvider(&socket_data);
434 socket_data.StopAfter(1);
435
[email protected]bf4ea2f2014-03-10 22:57:53436 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38437 host_resolver_.set_synchronous_mode(true);
438 host_resolver_.rules()->AddIPLiteralRule(
439 kDefaultServerHostName, "192.168.0.1", "");
440 host_resolver_.rules()->AddIPLiteralRule(
441 "mail.google.com", "192.168.0.1", "");
442
443 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59444 EXPECT_EQ(OK,
[email protected]bf4ea2f2014-03-10 22:57:53445 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59446 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28447 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59448 "GET",
[email protected]974849d2014-02-06 01:32:59449 net_log_,
450 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38451 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
452 EXPECT_TRUE(stream.get());
453
454 TestCompletionCallback callback;
455 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59456 EXPECT_EQ(OK,
457 request2.Request(server2,
458 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28459 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59460 "GET",
[email protected]974849d2014-02-06 01:32:59461 net_log_,
462 callback.callback()));
[email protected]eed749f92013-12-23 18:57:38463 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
464 EXPECT_TRUE(stream2.get());
465
466 EXPECT_EQ(
[email protected]df157d9d2014-03-10 07:27:27467 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53468 &factory_, host_port_pair_, is_https_),
[email protected]df157d9d2014-03-10 07:27:27469 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38470
471 EXPECT_TRUE(socket_data.at_read_eof());
472 EXPECT_TRUE(socket_data.at_write_eof());
473}
474
jri584002d12014-09-09 00:51:28475TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) {
476 MockRead reads[] = {
477 MockRead(ASYNC, OK, 0) // EOF
478 };
rtennetibe635732014-10-02 22:51:42479 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
480 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28481 socket_factory_.AddSocketDataProvider(&socket_data1);
482 socket_factory_.AddSocketDataProvider(&socket_data2);
483 socket_data1.StopAfter(1);
484 socket_data2.StopAfter(1);
485
486 HostPortPair server2("mail.google.com", kDefaultServerPort);
487 host_resolver_.set_synchronous_mode(true);
488 host_resolver_.rules()->AddIPLiteralRule(
489 kDefaultServerHostName, "192.168.0.1", "");
490 host_resolver_.rules()->AddIPLiteralRule(
491 "mail.google.com", "192.168.0.1", "");
492
493 // Disable connection pooling.
494 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
495
496 QuicStreamRequest request(&factory_);
497 EXPECT_EQ(OK,
498 request.Request(host_port_pair_,
499 is_https_,
500 privacy_mode_,
501 "GET",
502 net_log_,
503 callback_.callback()));
504 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
505 EXPECT_TRUE(stream.get());
506
507 TestCompletionCallback callback;
508 QuicStreamRequest request2(&factory_);
509 EXPECT_EQ(OK,
510 request2.Request(server2,
511 is_https_,
512 privacy_mode_,
513 "GET",
514 net_log_,
515 callback.callback()));
516 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
517 EXPECT_TRUE(stream2.get());
518
519 EXPECT_NE(
520 QuicStreamFactoryPeer::GetActiveSession(
521 &factory_, host_port_pair_, is_https_),
522 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_));
523
524 EXPECT_TRUE(socket_data1.at_read_eof());
525 EXPECT_TRUE(socket_data1.at_write_eof());
526 EXPECT_TRUE(socket_data2.at_read_eof());
527 EXPECT_TRUE(socket_data2.at_write_eof());
528}
529
[email protected]eed749f92013-12-23 18:57:38530TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
531 MockRead reads[] = {
532 MockRead(ASYNC, OK, 0) // EOF
533 };
rtennetibe635732014-10-02 22:51:42534 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
535 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38536 socket_factory_.AddSocketDataProvider(&socket_data1);
537 socket_factory_.AddSocketDataProvider(&socket_data2);
538 socket_data1.StopAfter(1);
539 socket_data2.StopAfter(1);
540
[email protected]bf4ea2f2014-03-10 22:57:53541 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38542 host_resolver_.set_synchronous_mode(true);
543 host_resolver_.rules()->AddIPLiteralRule(
544 kDefaultServerHostName, "192.168.0.1", "");
545 host_resolver_.rules()->AddIPLiteralRule(
546 "mail.google.com", "192.168.0.1", "");
547
548 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59549 EXPECT_EQ(OK,
[email protected]bf4ea2f2014-03-10 22:57:53550 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59551 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28552 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59553 "GET",
[email protected]974849d2014-02-06 01:32:59554 net_log_,
555 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38556 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
557 EXPECT_TRUE(stream.get());
558
559 TestCompletionCallback callback;
560 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59561 EXPECT_EQ(OK,
562 request2.Request(server2,
563 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28564 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59565 "GET",
[email protected]974849d2014-02-06 01:32:59566 net_log_,
567 callback.callback()));
[email protected]eed749f92013-12-23 18:57:38568 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
569 EXPECT_TRUE(stream2.get());
570
[email protected]df157d9d2014-03-10 07:27:27571 factory_.OnSessionGoingAway(QuicStreamFactoryPeer::GetActiveSession(
[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(
[email protected]bf4ea2f2014-03-10 22:57:53574 &factory_, host_port_pair_, is_https_));
[email protected]df157d9d2014-03-10 07:27:27575 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
576 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38577
578 TestCompletionCallback callback3;
579 QuicStreamRequest request3(&factory_);
[email protected]974849d2014-02-06 01:32:59580 EXPECT_EQ(OK,
581 request3.Request(server2,
582 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28583 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59584 "GET",
[email protected]974849d2014-02-06 01:32:59585 net_log_,
586 callback3.callback()));
[email protected]eed749f92013-12-23 18:57:38587 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
588 EXPECT_TRUE(stream3.get());
589
[email protected]df157d9d2014-03-10 07:27:27590 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(
591 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38592
593 EXPECT_TRUE(socket_data1.at_read_eof());
594 EXPECT_TRUE(socket_data1.at_write_eof());
595 EXPECT_TRUE(socket_data2.at_read_eof());
596 EXPECT_TRUE(socket_data2.at_write_eof());
597}
598
[email protected]5db452202014-08-19 05:22:15599TEST_P(QuicStreamFactoryTest, HttpsPooling) {
[email protected]eed749f92013-12-23 18:57:38600 MockRead reads[] = {
601 MockRead(ASYNC, OK, 0) // EOF
602 };
rtennetibe635732014-10-02 22:51:42603 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38604 socket_factory_.AddSocketDataProvider(&socket_data);
605 socket_data.StopAfter(1);
606
[email protected]bf4ea2f2014-03-10 22:57:53607 HostPortPair server1("www.example.org", 443);
608 HostPortPair server2("mail.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38609
610 // Load a cert that is valid for:
611 // www.example.org (server1)
612 // mail.example.org (server2)
613 // www.example.com
614 base::FilePath certs_dir = GetTestCertsDirectory();
615 scoped_refptr<X509Certificate> test_cert(
616 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
rtennetibe635732014-10-02 22:51:42617 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
[email protected]b694e48c2014-03-18 17:10:13618 ProofVerifyDetailsChromium verify_details;
619 verify_details.cert_verify_result.verified_cert = test_cert;
[email protected]5db452202014-08-19 05:22:15620 verify_details.cert_verify_result.is_issued_by_known_root = true;
[email protected]b694e48c2014-03-18 17:10:13621 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
[email protected]eed749f92013-12-23 18:57:38622
623 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53624 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
625 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38626
627 QuicStreamRequest request(&factory_);
628 is_https_ = true;
[email protected]974849d2014-02-06 01:32:59629 EXPECT_EQ(OK,
630 request.Request(server1,
631 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28632 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59633 "GET",
[email protected]974849d2014-02-06 01:32:59634 net_log_,
635 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38636 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
637 EXPECT_TRUE(stream.get());
638
639 TestCompletionCallback callback;
640 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59641 EXPECT_EQ(OK,
642 request2.Request(server2,
643 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28644 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59645 "GET",
[email protected]974849d2014-02-06 01:32:59646 net_log_,
647 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38648 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
649 EXPECT_TRUE(stream2.get());
650
[email protected]df157d9d2014-03-10 07:27:27651 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
652 &factory_, server1, is_https_),
653 QuicStreamFactoryPeer::GetActiveSession(
654 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38655
656 EXPECT_TRUE(socket_data.at_read_eof());
657 EXPECT_TRUE(socket_data.at_write_eof());
658}
659
jri584002d12014-09-09 00:51:28660TEST_P(QuicStreamFactoryTest, NoHttpsPoolingIfDisabled) {
661 MockRead reads[] = {
662 MockRead(ASYNC, OK, 0) // EOF
663 };
rtennetibe635732014-10-02 22:51:42664 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
665 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28666 socket_factory_.AddSocketDataProvider(&socket_data1);
667 socket_factory_.AddSocketDataProvider(&socket_data2);
668 socket_data1.StopAfter(1);
669 socket_data2.StopAfter(1);
670
671 HostPortPair server1("www.example.org", 443);
672 HostPortPair server2("mail.example.org", 443);
673
674 // Load a cert that is valid for:
675 // www.example.org (server1)
676 // mail.example.org (server2)
677 // www.example.com
678 base::FilePath certs_dir = GetTestCertsDirectory();
679 scoped_refptr<X509Certificate> test_cert(
680 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
rtennetibe635732014-10-02 22:51:42681 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
jri584002d12014-09-09 00:51:28682 ProofVerifyDetailsChromium verify_details;
683 verify_details.cert_verify_result.verified_cert = test_cert;
684 verify_details.cert_verify_result.is_issued_by_known_root = true;
685 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
686
687 host_resolver_.set_synchronous_mode(true);
688 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
689 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
690
691 // Disable connection pooling.
692 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
693
694 QuicStreamRequest request(&factory_);
695 is_https_ = true;
696 EXPECT_EQ(OK,
697 request.Request(server1,
698 is_https_,
699 privacy_mode_,
700 "GET",
701 net_log_,
702 callback_.callback()));
703 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
704 EXPECT_TRUE(stream.get());
705
706 TestCompletionCallback callback;
707 QuicStreamRequest request2(&factory_);
708 EXPECT_EQ(OK,
709 request2.Request(server2,
710 is_https_,
711 privacy_mode_,
712 "GET",
713 net_log_,
714 callback_.callback()));
715 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
716 EXPECT_TRUE(stream2.get());
717
718 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
719 &factory_, server1, is_https_),
720 QuicStreamFactoryPeer::GetActiveSession(
721 &factory_, server2, is_https_));
722
723 EXPECT_TRUE(socket_data1.at_read_eof());
724 EXPECT_TRUE(socket_data1.at_write_eof());
725 EXPECT_TRUE(socket_data2.at_read_eof());
726 EXPECT_TRUE(socket_data2.at_write_eof());
727}
728
[email protected]eed749f92013-12-23 18:57:38729TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithCertMismatch) {
730 MockRead reads[] = {
731 MockRead(ASYNC, OK, 0) // EOF
732 };
rtennetibe635732014-10-02 22:51:42733 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
734 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38735 socket_factory_.AddSocketDataProvider(&socket_data1);
736 socket_factory_.AddSocketDataProvider(&socket_data2);
737 socket_data1.StopAfter(1);
738 socket_data2.StopAfter(1);
739
[email protected]bf4ea2f2014-03-10 22:57:53740 HostPortPair server1("www.example.org", 443);
741 HostPortPair server2("mail.google.com", 443);
[email protected]eed749f92013-12-23 18:57:38742
743 // Load a cert that is valid for:
744 // www.example.org (server1)
745 // mail.example.org
746 // www.example.com
747 // But is not valid for mail.google.com (server2).
748 base::FilePath certs_dir = GetTestCertsDirectory();
749 scoped_refptr<X509Certificate> test_cert(
750 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
rtennetibe635732014-10-02 22:51:42751 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
[email protected]b694e48c2014-03-18 17:10:13752 ProofVerifyDetailsChromium verify_details;
753 verify_details.cert_verify_result.verified_cert = test_cert;
754 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
755
[email protected]eed749f92013-12-23 18:57:38756
757 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53758 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
759 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38760
761 QuicStreamRequest request(&factory_);
762 is_https_ = true;
[email protected]974849d2014-02-06 01:32:59763 EXPECT_EQ(OK,
764 request.Request(server1,
765 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28766 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59767 "GET",
[email protected]974849d2014-02-06 01:32:59768 net_log_,
769 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38770 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
771 EXPECT_TRUE(stream.get());
772
773 TestCompletionCallback callback;
774 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59775 EXPECT_EQ(OK,
776 request2.Request(server2,
777 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28778 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59779 "GET",
[email protected]974849d2014-02-06 01:32:59780 net_log_,
781 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38782 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
783 EXPECT_TRUE(stream2.get());
784
[email protected]df157d9d2014-03-10 07:27:27785 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
786 &factory_, server1, is_https_),
787 QuicStreamFactoryPeer::GetActiveSession(
788 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38789
790 EXPECT_TRUE(socket_data1.at_read_eof());
791 EXPECT_TRUE(socket_data1.at_write_eof());
792 EXPECT_TRUE(socket_data2.at_read_eof());
793 EXPECT_TRUE(socket_data2.at_write_eof());
794}
795
[email protected]5db452202014-08-19 05:22:15796TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
797 MockRead reads[] = {
798 MockRead(ASYNC, OK, 0) // EOF
799 };
rtennetibe635732014-10-02 22:51:42800 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15801 socket_factory_.AddSocketDataProvider(&socket_data);
802 socket_data.StopAfter(1);
803
804 HostPortPair server1("www.example.org", 443);
805 HostPortPair server2("mail.example.org", 443);
806 uint8 primary_pin = 1;
807 uint8 backup_pin = 2;
808 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
809 backup_pin);
810
811 // Load a cert that is valid for:
812 // www.example.org (server1)
813 // mail.example.org (server2)
814 base::FilePath certs_dir = GetTestCertsDirectory();
815 scoped_refptr<X509Certificate> test_cert(
816 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
rtennetibe635732014-10-02 22:51:42817 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
[email protected]5db452202014-08-19 05:22:15818 ProofVerifyDetailsChromium verify_details;
819 verify_details.cert_verify_result.verified_cert = test_cert;
820 verify_details.cert_verify_result.is_issued_by_known_root = true;
821 verify_details.cert_verify_result.public_key_hashes.push_back(
822 test::GetTestHashValue(primary_pin));
823 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
824
825
826 host_resolver_.set_synchronous_mode(true);
827 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
828 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
829
830 QuicStreamRequest request(&factory_);
831 is_https_ = true;
832 EXPECT_EQ(OK,
833 request.Request(server1,
834 is_https_,
835 privacy_mode_,
836 "GET",
837 net_log_,
838 callback_.callback()));
839 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
840 EXPECT_TRUE(stream.get());
841
842 TestCompletionCallback callback;
843 QuicStreamRequest request2(&factory_);
844 EXPECT_EQ(OK,
845 request2.Request(server2,
846 is_https_,
847 privacy_mode_,
848 "GET",
849 net_log_,
850 callback_.callback()));
851 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
852 EXPECT_TRUE(stream2.get());
853
854 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
855 &factory_, server1, is_https_),
856 QuicStreamFactoryPeer::GetActiveSession(
857 &factory_, server2, is_https_));
858
859 EXPECT_TRUE(socket_data.at_read_eof());
860 EXPECT_TRUE(socket_data.at_write_eof());
861}
862
jri584002d12014-09-09 00:51:28863TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithMatchingPinsIfDisabled) {
864 MockRead reads[] = {
865 MockRead(ASYNC, OK, 0) // EOF
866 };
rtennetibe635732014-10-02 22:51:42867 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
868 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28869 socket_factory_.AddSocketDataProvider(&socket_data1);
870 socket_factory_.AddSocketDataProvider(&socket_data2);
871 socket_data1.StopAfter(1);
872 socket_data2.StopAfter(1);
873
874 HostPortPair server1("www.example.org", 443);
875 HostPortPair server2("mail.example.org", 443);
876 uint8 primary_pin = 1;
877 uint8 backup_pin = 2;
878 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
879 backup_pin);
880
881 // Load a cert that is valid for:
882 // www.example.org (server1)
883 // mail.example.org (server2)
884 base::FilePath certs_dir = GetTestCertsDirectory();
885 scoped_refptr<X509Certificate> test_cert(
886 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
rtennetibe635732014-10-02 22:51:42887 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
jri584002d12014-09-09 00:51:28888 ProofVerifyDetailsChromium verify_details;
889 verify_details.cert_verify_result.verified_cert = test_cert;
890 verify_details.cert_verify_result.is_issued_by_known_root = true;
891 verify_details.cert_verify_result.public_key_hashes.push_back(
892 test::GetTestHashValue(primary_pin));
893 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
894
895
896 host_resolver_.set_synchronous_mode(true);
897 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
898 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
899
900 // Disable connection pooling.
901 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
902
903 QuicStreamRequest request(&factory_);
904 is_https_ = true;
905 EXPECT_EQ(OK,
906 request.Request(server1,
907 is_https_,
908 privacy_mode_,
909 "GET",
910 net_log_,
911 callback_.callback()));
912 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
913 EXPECT_TRUE(stream.get());
914
915 TestCompletionCallback callback;
916 QuicStreamRequest request2(&factory_);
917 EXPECT_EQ(OK,
918 request2.Request(server2,
919 is_https_,
920 privacy_mode_,
921 "GET",
922 net_log_,
923 callback_.callback()));
924 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
925 EXPECT_TRUE(stream2.get());
926
927 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
928 &factory_, server1, is_https_),
929 QuicStreamFactoryPeer::GetActiveSession(
930 &factory_, server2, is_https_));
931
932 EXPECT_TRUE(socket_data1.at_read_eof());
933 EXPECT_TRUE(socket_data1.at_write_eof());
934 EXPECT_TRUE(socket_data2.at_read_eof());
935 EXPECT_TRUE(socket_data2.at_write_eof());
936}
937
[email protected]5db452202014-08-19 05:22:15938TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
939 MockRead reads[] = {
940 MockRead(ASYNC, OK, 0) // EOF
941 };
rtennetibe635732014-10-02 22:51:42942 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
943 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15944 socket_factory_.AddSocketDataProvider(&socket_data1);
945 socket_factory_.AddSocketDataProvider(&socket_data2);
946 socket_data1.StopAfter(1);
947 socket_data2.StopAfter(1);
948
949 HostPortPair server1("www.example.org", 443);
950 HostPortPair server2("mail.example.org", 443);
951 uint8 primary_pin = 1;
952 uint8 backup_pin = 2;
953 uint8 bad_pin = 3;
954 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
955 backup_pin);
956
957 // Load a cert that is valid for:
958 // www.example.org (server1)
959 // mail.example.org (server2)
960 base::FilePath certs_dir = GetTestCertsDirectory();
961 scoped_refptr<X509Certificate> test_cert(
962 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
rtennetibe635732014-10-02 22:51:42963 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
[email protected]5db452202014-08-19 05:22:15964 ProofVerifyDetailsChromium verify_details;
965 verify_details.cert_verify_result.verified_cert = test_cert;
966 verify_details.cert_verify_result.is_issued_by_known_root = true;
967 verify_details.cert_verify_result.public_key_hashes.push_back(
968 test::GetTestHashValue(bad_pin));
969 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
970
971
972 host_resolver_.set_synchronous_mode(true);
973 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
974 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
975
976 QuicStreamRequest request(&factory_);
977 is_https_ = true;
978 EXPECT_EQ(OK,
979 request.Request(server1,
980 is_https_,
981 privacy_mode_,
982 "GET",
983 net_log_,
984 callback_.callback()));
985 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
986 EXPECT_TRUE(stream.get());
987
988 TestCompletionCallback callback;
989 QuicStreamRequest request2(&factory_);
990 EXPECT_EQ(OK,
991 request2.Request(server2,
992 is_https_,
993 privacy_mode_,
994 "GET",
995 net_log_,
996 callback_.callback()));
997 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
998 EXPECT_TRUE(stream2.get());
999
1000 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
1001 &factory_, server1, is_https_),
1002 QuicStreamFactoryPeer::GetActiveSession(
1003 &factory_, server2, is_https_));
1004
1005 EXPECT_TRUE(socket_data1.at_read_eof());
1006 EXPECT_TRUE(socket_data1.at_write_eof());
1007 EXPECT_TRUE(socket_data2.at_read_eof());
1008 EXPECT_TRUE(socket_data2.at_write_eof());
1009}
1010
[email protected]1e960032013-12-20 19:00:201011TEST_P(QuicStreamFactoryTest, Goaway) {
[email protected]4d283b32013-10-17 12:57:271012 MockRead reads[] = {
1013 MockRead(ASYNC, OK, 0) // EOF
1014 };
rtennetibe635732014-10-02 22:51:421015 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271016 socket_data.StopAfter(1);
1017 socket_factory_.AddSocketDataProvider(&socket_data);
rtennetibe635732014-10-02 22:51:421018 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271019 socket_data2.StopAfter(1);
1020 socket_factory_.AddSocketDataProvider(&socket_data2);
1021
1022 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591023 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531024 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591025 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281026 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591027 "GET",
[email protected]974849d2014-02-06 01:32:591028 net_log_,
1029 callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271030
1031 EXPECT_EQ(OK, callback_.WaitForResult());
1032 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1033 EXPECT_TRUE(stream.get());
1034
1035 // Mark the session as going away. Ensure that while it is still alive
1036 // that it is no longer active.
1037 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:531038 &factory_, host_port_pair_, is_https_);
[email protected]4d283b32013-10-17 12:57:271039 factory_.OnSessionGoingAway(session);
1040 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
[email protected]df157d9d2014-03-10 07:27:271041 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:531042 &factory_, host_port_pair_, is_https_));
rtennetibe635732014-10-02 22:51:421043 EXPECT_EQ(nullptr, CreateIfSessionExists(host_port_pair_, net_log_).get());
[email protected]4d283b32013-10-17 12:57:271044
1045 // Create a new request for the same destination and verify that a
1046 // new session is created.
1047 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591048 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531049 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591050 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281051 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591052 "GET",
[email protected]974849d2014-02-06 01:32:591053 net_log_,
1054 callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271055 EXPECT_EQ(OK, callback_.WaitForResult());
1056 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1057 EXPECT_TRUE(stream2.get());
1058
1059 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(&factory_,
[email protected]bf4ea2f2014-03-10 22:57:531060 host_port_pair_,
[email protected]df157d9d2014-03-10 07:27:271061 is_https_));
[email protected]4d283b32013-10-17 12:57:271062 EXPECT_NE(session,
1063 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:531064 &factory_, host_port_pair_, is_https_));
[email protected]4d283b32013-10-17 12:57:271065 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
1066
1067 stream2.reset();
1068 stream.reset();
1069
1070 EXPECT_TRUE(socket_data.at_read_eof());
1071 EXPECT_TRUE(socket_data.at_write_eof());
[email protected]3c772402013-12-18 21:38:111072 EXPECT_TRUE(socket_data2.at_read_eof());
1073 EXPECT_TRUE(socket_data2.at_write_eof());
[email protected]4d283b32013-10-17 12:57:271074}
1075
[email protected]1e960032013-12-20 19:00:201076TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
[email protected]0b2294d32013-08-02 00:46:361077 MockRead reads[] = {
1078 MockRead(ASYNC, OK, 0) // EOF
1079 };
[email protected]66ae5962014-05-22 11:13:051080 QuicStreamId stream_id = kClientDataStreamId1;
[email protected]1e960032013-12-20 19:00:201081 scoped_ptr<QuicEncryptedPacket> rst(
1082 maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
[email protected]06ff5152013-08-29 01:03:051083 MockWrite writes[] = {
1084 MockWrite(ASYNC, rst->data(), rst->length(), 1),
1085 };
1086 DeterministicSocketData socket_data(reads, arraysize(reads),
1087 writes, arraysize(writes));
[email protected]0b2294d32013-08-02 00:46:361088 socket_factory_.AddSocketDataProvider(&socket_data);
1089 socket_data.StopAfter(1);
1090
1091 HttpRequestInfo request_info;
1092 std::vector<QuicHttpStream*> streams;
1093 // The MockCryptoClientStream sets max_open_streams to be
1094 // 2 * kDefaultMaxStreamsPerConnection.
1095 for (size_t i = 0; i < 2 * kDefaultMaxStreamsPerConnection; i++) {
1096 QuicStreamRequest request(&factory_);
[email protected]bf4ea2f2014-03-10 22:57:531097 int rv = request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591098 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281099 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591100 "GET",
[email protected]974849d2014-02-06 01:32:591101 net_log_,
[email protected]0b2294d32013-08-02 00:46:361102 callback_.callback());
1103 if (i == 0) {
1104 EXPECT_EQ(ERR_IO_PENDING, rv);
1105 EXPECT_EQ(OK, callback_.WaitForResult());
1106 } else {
1107 EXPECT_EQ(OK, rv);
1108 }
1109 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1110 EXPECT_TRUE(stream);
1111 EXPECT_EQ(OK, stream->InitializeStream(
1112 &request_info, DEFAULT_PRIORITY, net_log_, CompletionCallback()));
1113 streams.push_back(stream.release());
1114 }
1115
1116 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591117 EXPECT_EQ(OK,
[email protected]bf4ea2f2014-03-10 22:57:531118 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591119 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281120 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591121 "GET",
[email protected]974849d2014-02-06 01:32:591122 net_log_,
1123 CompletionCallback()));
[email protected]0b2294d32013-08-02 00:46:361124 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1125 EXPECT_TRUE(stream);
1126 EXPECT_EQ(ERR_IO_PENDING, stream->InitializeStream(
1127 &request_info, DEFAULT_PRIORITY, net_log_, callback_.callback()));
1128
1129 // Close the first stream.
1130 streams.front()->Close(false);
1131
1132 ASSERT_TRUE(callback_.have_result());
1133
1134 EXPECT_EQ(OK, callback_.WaitForResult());
1135
1136 EXPECT_TRUE(socket_data.at_read_eof());
1137 EXPECT_TRUE(socket_data.at_write_eof());
1138 STLDeleteElements(&streams);
1139}
1140
[email protected]1e960032013-12-20 19:00:201141TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
rtennetibe635732014-10-02 22:51:421142 DeterministicSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321143 socket_factory_.AddSocketDataProvider(&socket_data);
1144
[email protected]3c772402013-12-18 21:38:111145 host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName);
[email protected]e13201d82012-12-12 05:00:321146
1147 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591148 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531149 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591150 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281151 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591152 "GET",
[email protected]974849d2014-02-06 01:32:591153 net_log_,
1154 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321155
1156 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
1157
1158 EXPECT_TRUE(socket_data.at_read_eof());
1159 EXPECT_TRUE(socket_data.at_write_eof());
1160}
1161
[email protected]1e960032013-12-20 19:00:201162TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
[email protected]3c772402013-12-18 21:38:111163 MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
rtennetibe635732014-10-02 22:51:421164 DeterministicSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]3c772402013-12-18 21:38:111165 socket_data.set_connect_data(connect);
1166 socket_factory_.AddSocketDataProvider(&socket_data);
1167 socket_data.StopAfter(1);
1168
1169 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591170 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531171 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591172 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281173 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591174 "GET",
[email protected]974849d2014-02-06 01:32:591175 net_log_,
1176 callback_.callback()));
[email protected]3c772402013-12-18 21:38:111177
1178 EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult());
1179
1180 EXPECT_TRUE(socket_data.at_read_eof());
1181 EXPECT_TRUE(socket_data.at_write_eof());
1182}
1183
[email protected]1e960032013-12-20 19:00:201184TEST_P(QuicStreamFactoryTest, CancelCreate) {
[email protected]69dfd1b2013-06-04 22:20:121185 MockRead reads[] = {
[email protected]25c31dc2013-06-05 17:56:041186 MockRead(ASYNC, OK, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121187 };
rtennetibe635732014-10-02 22:51:421188 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321189 socket_factory_.AddSocketDataProvider(&socket_data);
1190 {
1191 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591192 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531193 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591194 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281195 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591196 "GET",
[email protected]974849d2014-02-06 01:32:591197 net_log_,
1198 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321199 }
1200
[email protected]25c31dc2013-06-05 17:56:041201 socket_data.StopAfter(1);
[email protected]e13201d82012-12-12 05:00:321202 base::RunLoop run_loop;
1203 run_loop.RunUntilIdle();
1204
1205 scoped_ptr<QuicHttpStream> stream(
[email protected]bf4ea2f2014-03-10 22:57:531206 CreateIfSessionExists(host_port_pair_, net_log_));
[email protected]e13201d82012-12-12 05:00:321207 EXPECT_TRUE(stream.get());
1208 stream.reset();
1209
1210 EXPECT_TRUE(socket_data.at_read_eof());
1211 EXPECT_TRUE(socket_data.at_write_eof());
1212}
1213
[email protected]1e960032013-12-20 19:00:201214TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) {
[email protected]3c772402013-12-18 21:38:111215 // Sequentially connect to the default host, then another host, and then the
1216 // default host. Verify that the default host gets a consistent ephemeral
1217 // port, that is different from the other host's connection.
1218
1219 std::string other_server_name = "other.google.com";
1220 EXPECT_NE(kDefaultServerHostName, other_server_name);
1221 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort);
[email protected]3c772402013-12-18 21:38:111222
[email protected]bf4ea2f2014-03-10 22:57:531223 int original_port = GetSourcePortForNewSession(host_port_pair_);
1224 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2));
1225 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]3c772402013-12-18 21:38:111226}
1227
[email protected]d8e2abf82014-03-06 10:30:101228TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) {
1229 // Get a session to the host using the port suggester.
1230 int original_port =
[email protected]bf4ea2f2014-03-10 22:57:531231 GetSourcePortForNewSessionAndGoAway(host_port_pair_);
[email protected]d8e2abf82014-03-06 10:30:101232 // Verify that the port is different after the goaway.
[email protected]bf4ea2f2014-03-10 22:57:531233 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101234 // Since the previous session did not goaway we should see the original port.
[email protected]bf4ea2f2014-03-10 22:57:531235 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101236}
1237
[email protected]1e960032013-12-20 19:00:201238TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
[email protected]56dfb902013-01-03 23:17:551239 MockRead reads[] = {
[email protected]0edce6a2013-05-08 18:02:401240 MockRead(ASYNC, 0, 0) // EOF
[email protected]56dfb902013-01-03 23:17:551241 };
[email protected]459a7402014-02-10 12:58:521242 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1243 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311244 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521245 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421246 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521247 writes.size());
[email protected]56dfb902013-01-03 23:17:551248 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0edce6a2013-05-08 18:02:401249 socket_data.StopAfter(1);
[email protected]56dfb902013-01-03 23:17:551250
[email protected]69dfd1b2013-06-04 22:20:121251 MockRead reads2[] = {
[email protected]25c31dc2013-06-05 17:56:041252 MockRead(ASYNC, 0, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121253 };
rtennetibe635732014-10-02 22:51:421254 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]56dfb902013-01-03 23:17:551255 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]0edce6a2013-05-08 18:02:401256 socket_data2.StopAfter(1);
[email protected]56dfb902013-01-03 23:17:551257
1258 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591259 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531260 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591261 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281262 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591263 "GET",
[email protected]974849d2014-02-06 01:32:591264 net_log_,
1265 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551266
1267 EXPECT_EQ(OK, callback_.WaitForResult());
1268 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361269 HttpRequestInfo request_info;
1270 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1271 DEFAULT_PRIORITY,
1272 net_log_, CompletionCallback()));
[email protected]56dfb902013-01-03 23:17:551273
1274 // Close the session and verify that stream saw the error.
1275 factory_.CloseAllSessions(ERR_INTERNET_DISCONNECTED);
1276 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1277 stream->ReadResponseHeaders(callback_.callback()));
1278
1279 // Now attempting to request a stream to the same origin should create
1280 // a new session.
1281
1282 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591283 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531284 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591285 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281286 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591287 "GET",
[email protected]974849d2014-02-06 01:32:591288 net_log_,
1289 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551290
1291 EXPECT_EQ(OK, callback_.WaitForResult());
1292 stream = request2.ReleaseStream();
1293 stream.reset(); // Will reset stream 3.
1294
1295 EXPECT_TRUE(socket_data.at_read_eof());
1296 EXPECT_TRUE(socket_data.at_write_eof());
1297 EXPECT_TRUE(socket_data2.at_read_eof());
1298 EXPECT_TRUE(socket_data2.at_write_eof());
1299}
1300
[email protected]1e960032013-12-20 19:00:201301TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
[email protected]f698a012013-05-06 20:18:591302 MockRead reads[] = {
[email protected]0edce6a2013-05-08 18:02:401303 MockRead(ASYNC, 0, 0) // EOF
[email protected]f698a012013-05-06 20:18:591304 };
[email protected]459a7402014-02-10 12:58:521305 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1306 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311307 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521308 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421309 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521310 writes.size());
[email protected]f698a012013-05-06 20:18:591311 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0edce6a2013-05-08 18:02:401312 socket_data.StopAfter(1);
[email protected]f698a012013-05-06 20:18:591313
[email protected]69dfd1b2013-06-04 22:20:121314 MockRead reads2[] = {
[email protected]25c31dc2013-06-05 17:56:041315 MockRead(ASYNC, 0, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121316 };
rtennetibe635732014-10-02 22:51:421317 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]f698a012013-05-06 20:18:591318 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]0edce6a2013-05-08 18:02:401319 socket_data2.StopAfter(1);
[email protected]f698a012013-05-06 20:18:591320
1321 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591322 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531323 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591324 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281325 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591326 "GET",
[email protected]974849d2014-02-06 01:32:591327 net_log_,
1328 callback_.callback()));
[email protected]f698a012013-05-06 20:18:591329
1330 EXPECT_EQ(OK, callback_.WaitForResult());
1331 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361332 HttpRequestInfo request_info;
1333 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1334 DEFAULT_PRIORITY,
1335 net_log_, CompletionCallback()));
[email protected]f698a012013-05-06 20:18:591336
1337 // Change the IP address and verify that stream saw the error.
1338 factory_.OnIPAddressChanged();
1339 EXPECT_EQ(ERR_NETWORK_CHANGED,
1340 stream->ReadResponseHeaders(callback_.callback()));
[email protected]11c05872013-08-20 02:04:121341 EXPECT_TRUE(factory_.require_confirmation());
[email protected]f698a012013-05-06 20:18:591342
1343 // Now attempting to request a stream to the same origin should create
1344 // a new session.
1345
1346 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591347 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531348 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591349 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281350 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591351 "GET",
[email protected]974849d2014-02-06 01:32:591352 net_log_,
1353 callback_.callback()));
[email protected]f698a012013-05-06 20:18:591354
1355 EXPECT_EQ(OK, callback_.WaitForResult());
1356 stream = request2.ReleaseStream();
1357 stream.reset(); // Will reset stream 3.
1358
1359 EXPECT_TRUE(socket_data.at_read_eof());
1360 EXPECT_TRUE(socket_data.at_write_eof());
1361 EXPECT_TRUE(socket_data2.at_read_eof());
1362 EXPECT_TRUE(socket_data2.at_write_eof());
1363}
1364
[email protected]1e960032013-12-20 19:00:201365TEST_P(QuicStreamFactoryTest, OnCertAdded) {
[email protected]d7d1e50b2013-11-25 22:08:091366 MockRead reads[] = {
1367 MockRead(ASYNC, 0, 0) // EOF
1368 };
[email protected]459a7402014-02-10 12:58:521369 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1370 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311371 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521372 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421373 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521374 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:091375 socket_factory_.AddSocketDataProvider(&socket_data);
1376 socket_data.StopAfter(1);
1377
1378 MockRead reads2[] = {
1379 MockRead(ASYNC, 0, 0) // EOF
1380 };
rtennetibe635732014-10-02 22:51:421381 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:091382 socket_factory_.AddSocketDataProvider(&socket_data2);
1383 socket_data2.StopAfter(1);
1384
1385 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591386 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531387 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591388 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281389 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591390 "GET",
[email protected]974849d2014-02-06 01:32:591391 net_log_,
1392 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091393
1394 EXPECT_EQ(OK, callback_.WaitForResult());
1395 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1396 HttpRequestInfo request_info;
1397 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1398 DEFAULT_PRIORITY,
1399 net_log_, CompletionCallback()));
1400
1401 // Add a cert and verify that stream saw the event.
rtennetibe635732014-10-02 22:51:421402 factory_.OnCertAdded(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:091403 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1404 stream->ReadResponseHeaders(callback_.callback()));
1405 EXPECT_FALSE(factory_.require_confirmation());
1406
1407 // Now attempting to request a stream to the same origin should create
1408 // a new session.
1409
1410 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591411 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531412 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591413 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281414 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591415 "GET",
[email protected]974849d2014-02-06 01:32:591416 net_log_,
1417 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091418
1419 EXPECT_EQ(OK, callback_.WaitForResult());
1420 stream = request2.ReleaseStream();
1421 stream.reset(); // Will reset stream 3.
1422
1423 EXPECT_TRUE(socket_data.at_read_eof());
1424 EXPECT_TRUE(socket_data.at_write_eof());
1425 EXPECT_TRUE(socket_data2.at_read_eof());
1426 EXPECT_TRUE(socket_data2.at_write_eof());
1427}
1428
[email protected]1e960032013-12-20 19:00:201429TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
[email protected]d7d1e50b2013-11-25 22:08:091430 MockRead reads[] = {
1431 MockRead(ASYNC, 0, 0) // EOF
1432 };
[email protected]459a7402014-02-10 12:58:521433 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1434 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311435 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521436 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421437 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521438 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:091439 socket_factory_.AddSocketDataProvider(&socket_data);
1440 socket_data.StopAfter(1);
1441
1442 MockRead reads2[] = {
1443 MockRead(ASYNC, 0, 0) // EOF
1444 };
rtennetibe635732014-10-02 22:51:421445 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:091446 socket_factory_.AddSocketDataProvider(&socket_data2);
1447 socket_data2.StopAfter(1);
1448
1449 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591450 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531451 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591452 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281453 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591454 "GET",
[email protected]974849d2014-02-06 01:32:591455 net_log_,
1456 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091457
1458 EXPECT_EQ(OK, callback_.WaitForResult());
1459 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1460 HttpRequestInfo request_info;
1461 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1462 DEFAULT_PRIORITY,
1463 net_log_, CompletionCallback()));
1464
1465 // Change the CA cert and verify that stream saw the event.
rtennetibe635732014-10-02 22:51:421466 factory_.OnCACertChanged(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:091467 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1468 stream->ReadResponseHeaders(callback_.callback()));
1469 EXPECT_FALSE(factory_.require_confirmation());
1470
1471 // Now attempting to request a stream to the same origin should create
1472 // a new session.
1473
1474 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591475 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531476 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591477 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281478 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591479 "GET",
[email protected]974849d2014-02-06 01:32:591480 net_log_,
1481 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091482
1483 EXPECT_EQ(OK, callback_.WaitForResult());
1484 stream = request2.ReleaseStream();
1485 stream.reset(); // Will reset stream 3.
1486
1487 EXPECT_TRUE(socket_data.at_read_eof());
1488 EXPECT_TRUE(socket_data.at_write_eof());
1489 EXPECT_TRUE(socket_data2.at_read_eof());
1490 EXPECT_TRUE(socket_data2.at_write_eof());
1491}
1492
[email protected]1e960032013-12-20 19:00:201493TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
[email protected]6e12d702013-11-13 00:17:171494 vector<string> cannoncial_suffixes;
1495 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1496 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]c49ff182013-09-28 08:33:261497
[email protected]6e12d702013-11-13 00:17:171498 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1499 string r1_host_name("r1");
1500 string r2_host_name("r2");
1501 r1_host_name.append(cannoncial_suffixes[i]);
1502 r2_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141503
[email protected]bf4ea2f2014-03-10 22:57:531504 HostPortPair host_port_pair1(r1_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121505 QuicCryptoClientConfig* crypto_config =
1506 QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
[email protected]257f24f2014-04-01 09:15:371507 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171508 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371509 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171510 EXPECT_FALSE(cached1->proof_valid());
1511 EXPECT_TRUE(cached1->source_address_token().empty());
1512
1513 // Mutate the cached1 to have different data.
1514 // TODO(rtenneti): mutate other members of CachedState.
1515 cached1->set_source_address_token(r1_host_name);
1516 cached1->SetProofValid();
1517
[email protected]bf4ea2f2014-03-10 22:57:531518 HostPortPair host_port_pair2(r2_host_name, 80);
[email protected]257f24f2014-04-01 09:15:371519 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171520 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371521 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171522 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
1523 EXPECT_TRUE(cached2->proof_valid());
1524 }
[email protected]b70fdb792013-10-25 19:04:141525}
1526
[email protected]1e960032013-12-20 19:00:201527TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
[email protected]6e12d702013-11-13 00:17:171528 vector<string> cannoncial_suffixes;
1529 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1530 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]b70fdb792013-10-25 19:04:141531
[email protected]6e12d702013-11-13 00:17:171532 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1533 string r3_host_name("r3");
1534 string r4_host_name("r4");
1535 r3_host_name.append(cannoncial_suffixes[i]);
1536 r4_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141537
[email protected]bf4ea2f2014-03-10 22:57:531538 HostPortPair host_port_pair1(r3_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121539 QuicCryptoClientConfig* crypto_config =
1540 QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
[email protected]257f24f2014-04-01 09:15:371541 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171542 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371543 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171544 EXPECT_FALSE(cached1->proof_valid());
1545 EXPECT_TRUE(cached1->source_address_token().empty());
1546
1547 // Mutate the cached1 to have different data.
1548 // TODO(rtenneti): mutate other members of CachedState.
1549 cached1->set_source_address_token(r3_host_name);
1550 cached1->SetProofInvalid();
1551
[email protected]bf4ea2f2014-03-10 22:57:531552 HostPortPair host_port_pair2(r4_host_name, 80);
[email protected]257f24f2014-04-01 09:15:371553 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171554 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371555 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171556 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
1557 EXPECT_TRUE(cached2->source_address_token().empty());
1558 EXPECT_FALSE(cached2->proof_valid());
1559 }
[email protected]c49ff182013-09-28 08:33:261560}
1561
rtenneti38f5cd52014-10-28 20:28:281562TEST_P(QuicStreamFactoryTest, CancelWaitForDataReady) {
1563 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
1564 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
1565 const size_t kLoadServerInfoTimeoutMs = 50;
1566 QuicStreamFactoryPeer::SetLoadServerInfoTimeout(
1567 &factory_, kLoadServerInfoTimeoutMs);
1568
1569 MockRead reads[] = {
1570 MockRead(ASYNC, OK, 0) // EOF
1571 };
1572 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1573 socket_factory_.AddSocketDataProvider(&socket_data);
1574 socket_data.StopAfter(1);
1575
1576 crypto_client_stream_factory_.set_handshake_mode(
1577 MockCryptoClientStream::ZERO_RTT);
1578 host_resolver_.set_synchronous_mode(true);
1579 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1580 "192.168.0.1", "");
1581
1582 QuicStreamRequest request(&factory_);
1583 EXPECT_EQ(ERR_IO_PENDING,
1584 request.Request(host_port_pair_,
1585 is_https_,
1586 privacy_mode_,
1587 "GET",
1588 net_log_,
1589 callback_.callback()));
1590
1591 // Verify that the CancelWaitForDataReady task has been posted.
1592 ASSERT_EQ(1u, runner_->GetPostedTasks().size());
1593 EXPECT_EQ(base::TimeDelta::FromMilliseconds(kLoadServerInfoTimeoutMs),
1594 runner_->GetPostedTasks()[0].delay);
1595
1596 runner_->RunNextTask();
1597 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
1598
1599 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1600 EXPECT_TRUE(stream.get());
1601 EXPECT_TRUE(socket_data.at_read_eof());
1602 EXPECT_TRUE(socket_data.at_write_eof());
1603}
1604
[email protected]e13201d82012-12-12 05:00:321605} // namespace test
[email protected]e13201d82012-12-12 05:00:321606} // namespace net