blob: 27903e9473ffb319ba59b2bd78803d059774096e [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]c49ff182013-09-28 08:33:2615#include "net/quic/crypto/crypto_handshake.h"
[email protected]b694e48c2014-03-18 17:10:1316#include "net/quic/crypto/proof_verifier_chromium.h"
[email protected]4df69842013-02-27 06:32:1617#include "net/quic/crypto/quic_decrypter.h"
18#include "net/quic/crypto/quic_encrypter.h"
[email protected]e13201d82012-12-12 05:00:3219#include "net/quic/quic_http_stream.h"
[email protected]257f24f2014-04-01 09:15:3720#include "net/quic/quic_server_id.h"
[email protected]e13201d82012-12-12 05:00:3221#include "net/quic/test_tools/mock_clock.h"
[email protected]e8ff26842013-03-22 21:02:0522#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
[email protected]9558c5d32012-12-22 00:08:1423#include "net/quic/test_tools/mock_random.h"
[email protected]1e960032013-12-20 19:00:2024#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]e13201d82012-12-12 05:00:3225#include "net/quic/test_tools/quic_test_utils.h"
26#include "net/socket/socket_test_util.h"
[email protected]eed749f92013-12-23 18:57:3827#include "net/test/cert_test_util.h"
[email protected]e13201d82012-12-12 05:00:3228#include "testing/gtest/include/gtest/gtest.h"
29
[email protected]6e12d702013-11-13 00:17:1730using base::StringPiece;
31using std::string;
32using std::vector;
33
[email protected]e13201d82012-12-12 05:00:3234namespace net {
[email protected]e13201d82012-12-12 05:00:3235namespace test {
36
[email protected]3c772402013-12-18 21:38:1137namespace {
38const char kDefaultServerHostName[] = "www.google.com";
39const int kDefaultServerPort = 443;
40} // namespace anonymous
41
[email protected]c49ff182013-09-28 08:33:2642class QuicStreamFactoryPeer {
43 public:
[email protected]59c0bbd2014-03-22 04:08:1244 static QuicCryptoClientConfig* GetCryptoConfig(QuicStreamFactory* factory) {
45 return &factory->crypto_config_;
[email protected]c49ff182013-09-28 08:33:2646 }
[email protected]4d283b32013-10-17 12:57:2747
48 static bool HasActiveSession(QuicStreamFactory* factory,
[email protected]bf4ea2f2014-03-10 22:57:5349 const HostPortPair& host_port_pair,
[email protected]df157d9d2014-03-10 07:27:2750 bool is_https) {
[email protected]257f24f2014-04-01 09:15:3751 QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED);
52 return factory->HasActiveSession(server_id);
[email protected]4d283b32013-10-17 12:57:2753 }
54
55 static QuicClientSession* GetActiveSession(
56 QuicStreamFactory* factory,
[email protected]bf4ea2f2014-03-10 22:57:5357 const HostPortPair& host_port_pair,
[email protected]df157d9d2014-03-10 07:27:2758 bool is_https) {
[email protected]257f24f2014-04-01 09:15:3759 QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED);
60 DCHECK(factory->HasActiveSession(server_id));
61 return factory->active_sessions_[server_id];
[email protected]df157d9d2014-03-10 07:27:2762 }
63
64 static scoped_ptr<QuicHttpStream> CreateIfSessionExists(
65 QuicStreamFactory* factory,
[email protected]bf4ea2f2014-03-10 22:57:5366 const HostPortPair& host_port_pair,
[email protected]df157d9d2014-03-10 07:27:2767 bool is_https,
68 const BoundNetLog& net_log) {
[email protected]257f24f2014-04-01 09:15:3769 QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED);
70 return factory->CreateIfSessionExists(server_id, net_log);
[email protected]4d283b32013-10-17 12:57:2771 }
72
73 static bool IsLiveSession(QuicStreamFactory* factory,
74 QuicClientSession* session) {
[email protected]4d590c9c2014-05-02 05:14:3375 for (QuicStreamFactory::SessionIdMap::iterator it =
[email protected]4d283b32013-10-17 12:57:2776 factory->all_sessions_.begin();
77 it != factory->all_sessions_.end(); ++it) {
[email protected]4d590c9c2014-05-02 05:14:3378 if (it->first == session)
[email protected]4d283b32013-10-17 12:57:2779 return true;
80 }
81 return false;
82 }
[email protected]c49ff182013-09-28 08:33:2683};
84
[email protected]1e960032013-12-20 19:00:2085class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> {
[email protected]e13201d82012-12-12 05:00:3286 protected:
87 QuicStreamFactoryTest()
[email protected]457d6952013-12-13 09:24:5888 : random_generator_(0),
[email protected]1e960032013-12-20 19:00:2089 maker_(GetParam(), 0),
[email protected]457d6952013-12-13 09:24:5890 clock_(new MockClock()),
[email protected]59c0bbd2014-03-22 04:08:1291 cert_verifier_(CertVerifier::CreateDefault()),
[email protected]872edd9e2013-01-16 08:51:1592 factory_(&host_resolver_, &socket_factory_,
[email protected]77c6c162013-08-17 02:57:4593 base::WeakPtr<HttpServerProperties>(),
[email protected]59c0bbd2014-03-22 04:08:1294 cert_verifier_.get(),
[email protected]e8ff26842013-03-22 21:02:0595 &crypto_client_stream_factory_,
[email protected]1e960032013-12-20 19:00:2096 &random_generator_, clock_, kDefaultMaxPacketSize,
[email protected]ebb3ad52014-04-30 20:01:3997 SupportedVersions(GetParam()), true, true, true),
[email protected]bf4ea2f2014-03-10 22:57:5398 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
[email protected]9dd3ff0f2014-03-26 09:51:2899 is_https_(false),
[email protected]314b03992014-04-01 01:28:53100 privacy_mode_(PRIVACY_MODE_DISABLED) {
[email protected]11c05872013-08-20 02:04:12101 factory_.set_require_confirmation(false);
[email protected]e13201d82012-12-12 05:00:32102 }
103
[email protected]df157d9d2014-03-10 07:27:27104 scoped_ptr<QuicHttpStream> CreateIfSessionExists(
[email protected]bf4ea2f2014-03-10 22:57:53105 const HostPortPair& host_port_pair,
[email protected]df157d9d2014-03-10 07:27:27106 const BoundNetLog& net_log) {
107 return QuicStreamFactoryPeer::CreateIfSessionExists(
[email protected]bf4ea2f2014-03-10 22:57:53108 &factory_, host_port_pair, false, net_log_);
[email protected]df157d9d2014-03-10 07:27:27109 }
[email protected]e13201d82012-12-12 05:00:32110
[email protected]bf4ea2f2014-03-10 22:57:53111 int GetSourcePortForNewSession(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10112 return GetSourcePortForNewSessionInner(destination, false);
113 }
114
115 int GetSourcePortForNewSessionAndGoAway(
[email protected]bf4ea2f2014-03-10 22:57:53116 const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10117 return GetSourcePortForNewSessionInner(destination, true);
118 }
119
[email protected]bf4ea2f2014-03-10 22:57:53120 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
[email protected]d8e2abf82014-03-06 10:30:10121 bool goaway_received) {
[email protected]3c772402013-12-18 21:38:11122 // Should only be called if there is no active session for this destination.
[email protected]df157d9d2014-03-10 07:27:27123 EXPECT_EQ(NULL, CreateIfSessionExists(destination, net_log_).get());
[email protected]3c772402013-12-18 21:38:11124 size_t socket_count = socket_factory_.udp_client_sockets().size();
125
126 MockRead reads[] = {
127 MockRead(ASYNC, OK, 0) // EOF
128 };
129 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
130 socket_data.StopAfter(1);
131 socket_factory_.AddSocketDataProvider(&socket_data);
132
133 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59134 EXPECT_EQ(ERR_IO_PENDING,
135 request.Request(destination,
136 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28137 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59138 "GET",
[email protected]974849d2014-02-06 01:32:59139 net_log_,
140 callback_.callback()));
[email protected]3c772402013-12-18 21:38:11141
142 EXPECT_EQ(OK, callback_.WaitForResult());
143 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
144 EXPECT_TRUE(stream.get());
145 stream.reset();
146
147 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
[email protected]df157d9d2014-03-10 07:27:27148 &factory_, destination, is_https_);
[email protected]3c772402013-12-18 21:38:11149
150 if (socket_count + 1 != socket_factory_.udp_client_sockets().size()) {
151 EXPECT_TRUE(false);
152 return 0;
153 }
154
155 IPEndPoint endpoint;
156 socket_factory_.
157 udp_client_sockets()[socket_count]->GetLocalAddress(&endpoint);
158 int port = endpoint.port();
[email protected]d8e2abf82014-03-06 10:30:10159 if (goaway_received) {
160 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, "");
161 session->OnGoAway(goaway);
162 }
[email protected]3c772402013-12-18 21:38:11163
164 factory_.OnSessionClosed(session);
[email protected]df157d9d2014-03-10 07:27:27165 EXPECT_EQ(NULL, CreateIfSessionExists(destination, net_log_).get());
[email protected]3c772402013-12-18 21:38:11166 EXPECT_TRUE(socket_data.at_read_eof());
167 EXPECT_TRUE(socket_data.at_write_eof());
168 return port;
169 }
170
[email protected]459a7402014-02-10 12:58:52171 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() {
[email protected]92bf17c2014-03-03 21:14:03172 QuicStreamId stream_id = 5;
[email protected]51cc1342014-04-18 23:44:37173 return maker_.MakeRstPacket(
174 1, true, stream_id,
175 AdjustErrorForVersion(QUIC_RST_FLOW_CONTROL_ACCOUNTING, GetParam()));
[email protected]459a7402014-02-10 12:58:52176 }
177
[email protected]e13201d82012-12-12 05:00:32178 MockHostResolver host_resolver_;
[email protected]0edce6a2013-05-08 18:02:40179 DeterministicMockClientSocketFactory socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05180 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]9558c5d32012-12-22 00:08:14181 MockRandom random_generator_;
[email protected]1e960032013-12-20 19:00:20182 QuicTestPacketMaker maker_;
[email protected]872edd9e2013-01-16 08:51:15183 MockClock* clock_; // Owned by factory_.
[email protected]59c0bbd2014-03-22 04:08:12184 scoped_ptr<CertVerifier> cert_verifier_;
[email protected]e13201d82012-12-12 05:00:32185 QuicStreamFactory factory_;
[email protected]bf4ea2f2014-03-10 22:57:53186 HostPortPair host_port_pair_;
[email protected]6d1b4ed2013-07-10 03:57:54187 bool is_https_;
[email protected]9dd3ff0f2014-03-26 09:51:28188 PrivacyMode privacy_mode_;
[email protected]e13201d82012-12-12 05:00:32189 BoundNetLog net_log_;
190 TestCompletionCallback callback_;
[email protected]e13201d82012-12-12 05:00:32191};
192
[email protected]1e960032013-12-20 19:00:20193INSTANTIATE_TEST_CASE_P(Version, QuicStreamFactoryTest,
194 ::testing::ValuesIn(QuicSupportedVersions()));
195
196TEST_P(QuicStreamFactoryTest, CreateIfSessionExists) {
[email protected]bf4ea2f2014-03-10 22:57:53197 EXPECT_EQ(NULL, CreateIfSessionExists(host_port_pair_, net_log_).get());
[email protected]e13201d82012-12-12 05:00:32198}
199
[email protected]1e960032013-12-20 19:00:20200TEST_P(QuicStreamFactoryTest, Create) {
[email protected]69dfd1b2013-06-04 22:20:12201 MockRead reads[] = {
[email protected]25c31dc2013-06-05 17:56:04202 MockRead(ASYNC, OK, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:12203 };
[email protected]25c31dc2013-06-05 17:56:04204 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
[email protected]e13201d82012-12-12 05:00:32205 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]25c31dc2013-06-05 17:56:04206 socket_data.StopAfter(1);
[email protected]e13201d82012-12-12 05:00:32207
208 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59209 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53210 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59211 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28212 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59213 "GET",
[email protected]974849d2014-02-06 01:32:59214 net_log_,
215 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32216
217 EXPECT_EQ(OK, callback_.WaitForResult());
218 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0edce6a2013-05-08 18:02:40219 EXPECT_TRUE(stream.get());
[email protected]e13201d82012-12-12 05:00:32220
221 // Will reset stream 3.
[email protected]bf4ea2f2014-03-10 22:57:53222 stream = CreateIfSessionExists(host_port_pair_, net_log_);
[email protected]e13201d82012-12-12 05:00:32223 EXPECT_TRUE(stream.get());
224
[email protected]6d1b4ed2013-07-10 03:57:54225 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
226 // in streams on different sessions.
[email protected]e13201d82012-12-12 05:00:32227 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59228 EXPECT_EQ(OK,
[email protected]bf4ea2f2014-03-10 22:57:53229 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59230 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28231 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59232 "GET",
[email protected]974849d2014-02-06 01:32:59233 net_log_,
234 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32235 stream = request2.ReleaseStream(); // Will reset stream 5.
236 stream.reset(); // Will reset stream 7.
237
238 EXPECT_TRUE(socket_data.at_read_eof());
239 EXPECT_TRUE(socket_data.at_write_eof());
240}
241
[email protected]8bd2b812014-03-26 04:01:17242TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
243 MockRead reads[] = {
244 MockRead(ASYNC, OK, 0) // EOF
245 };
246 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
247 socket_factory_.AddSocketDataProvider(&socket_data);
248 socket_data.StopAfter(1);
249
250 crypto_client_stream_factory_.set_handshake_mode(
251 MockCryptoClientStream::ZERO_RTT);
252 host_resolver_.set_synchronous_mode(true);
253 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
254 "192.168.0.1", "");
255
256 QuicStreamRequest request(&factory_);
257 EXPECT_EQ(OK,
258 request.Request(host_port_pair_,
259 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28260 privacy_mode_,
[email protected]8bd2b812014-03-26 04:01:17261 "GET",
262 net_log_,
263 callback_.callback()));
264
265 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
266 EXPECT_TRUE(stream.get());
267 EXPECT_TRUE(socket_data.at_read_eof());
268 EXPECT_TRUE(socket_data.at_write_eof());
269}
270
271TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
272 MockRead reads[] = {
273 MockRead(ASYNC, OK, 0) // EOF
274 };
275 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
276 socket_factory_.AddSocketDataProvider(&socket_data);
277 socket_data.StopAfter(1);
278
279 crypto_client_stream_factory_.set_handshake_mode(
280 MockCryptoClientStream::ZERO_RTT);
281 host_resolver_.set_synchronous_mode(true);
282 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
283 "192.168.0.1", "");
284
285 QuicStreamRequest request(&factory_);
286 // Posts require handshake confirmation, so this will return asynchronously.
287 EXPECT_EQ(ERR_IO_PENDING,
288 request.Request(host_port_pair_,
289 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28290 privacy_mode_,
[email protected]8bd2b812014-03-26 04:01:17291 "POST",
292 net_log_,
293 callback_.callback()));
294
295 // Confirm the handshake and verify that the stream is created.
296 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
297 QuicSession::HANDSHAKE_CONFIRMED);
298
299 EXPECT_EQ(OK, callback_.WaitForResult());
300 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
301 EXPECT_TRUE(stream.get());
302 EXPECT_TRUE(socket_data.at_read_eof());
303 EXPECT_TRUE(socket_data.at_write_eof());
304}
305
[email protected]df157d9d2014-03-10 07:27:27306TEST_P(QuicStreamFactoryTest, CreateHttpVsHttps) {
307 MockRead reads[] = {
308 MockRead(ASYNC, OK, 0) // EOF
309 };
310 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0);
311 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
312 socket_factory_.AddSocketDataProvider(&socket_data1);
313 socket_factory_.AddSocketDataProvider(&socket_data2);
314 socket_data1.StopAfter(1);
315 socket_data2.StopAfter(1);
316
317 QuicStreamRequest request(&factory_);
318 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53319 request.Request(host_port_pair_,
[email protected]df157d9d2014-03-10 07:27:27320 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28321 privacy_mode_,
[email protected]df157d9d2014-03-10 07:27:27322 "GET",
[email protected]df157d9d2014-03-10 07:27:27323 net_log_,
324 callback_.callback()));
325
326 EXPECT_EQ(OK, callback_.WaitForResult());
327 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
328 EXPECT_TRUE(stream.get());
329
330 QuicStreamRequest request2(&factory_);
331 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53332 request2.Request(host_port_pair_,
[email protected]df157d9d2014-03-10 07:27:27333 !is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28334 privacy_mode_,
[email protected]df157d9d2014-03-10 07:27:27335 "GET",
[email protected]df157d9d2014-03-10 07:27:27336 net_log_,
337 callback_.callback()));
338 EXPECT_EQ(OK, callback_.WaitForResult());
339 stream = request2.ReleaseStream();
340 EXPECT_TRUE(stream.get());
341 stream.reset();
342
343 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53344 &factory_, host_port_pair_, is_https_),
[email protected]df157d9d2014-03-10 07:27:27345 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53346 &factory_, host_port_pair_, !is_https_));
[email protected]df157d9d2014-03-10 07:27:27347
348 EXPECT_TRUE(socket_data1.at_read_eof());
349 EXPECT_TRUE(socket_data1.at_write_eof());
350 EXPECT_TRUE(socket_data2.at_read_eof());
351 EXPECT_TRUE(socket_data2.at_write_eof());
352}
353
[email protected]eed749f92013-12-23 18:57:38354TEST_P(QuicStreamFactoryTest, Pooling) {
355 MockRead reads[] = {
356 MockRead(ASYNC, OK, 0) // EOF
357 };
358 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
359 socket_factory_.AddSocketDataProvider(&socket_data);
360 socket_data.StopAfter(1);
361
[email protected]bf4ea2f2014-03-10 22:57:53362 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38363 host_resolver_.set_synchronous_mode(true);
364 host_resolver_.rules()->AddIPLiteralRule(
365 kDefaultServerHostName, "192.168.0.1", "");
366 host_resolver_.rules()->AddIPLiteralRule(
367 "mail.google.com", "192.168.0.1", "");
368
369 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59370 EXPECT_EQ(OK,
[email protected]bf4ea2f2014-03-10 22:57:53371 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59372 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28373 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59374 "GET",
[email protected]974849d2014-02-06 01:32:59375 net_log_,
376 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38377 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
378 EXPECT_TRUE(stream.get());
379
380 TestCompletionCallback callback;
381 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59382 EXPECT_EQ(OK,
383 request2.Request(server2,
384 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28385 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59386 "GET",
[email protected]974849d2014-02-06 01:32:59387 net_log_,
388 callback.callback()));
[email protected]eed749f92013-12-23 18:57:38389 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
390 EXPECT_TRUE(stream2.get());
391
392 EXPECT_EQ(
[email protected]df157d9d2014-03-10 07:27:27393 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53394 &factory_, host_port_pair_, is_https_),
[email protected]df157d9d2014-03-10 07:27:27395 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38396
397 EXPECT_TRUE(socket_data.at_read_eof());
398 EXPECT_TRUE(socket_data.at_write_eof());
399}
400
401TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
402 MockRead reads[] = {
403 MockRead(ASYNC, OK, 0) // EOF
404 };
405 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0);
406 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
407 socket_factory_.AddSocketDataProvider(&socket_data1);
408 socket_factory_.AddSocketDataProvider(&socket_data2);
409 socket_data1.StopAfter(1);
410 socket_data2.StopAfter(1);
411
[email protected]bf4ea2f2014-03-10 22:57:53412 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38413 host_resolver_.set_synchronous_mode(true);
414 host_resolver_.rules()->AddIPLiteralRule(
415 kDefaultServerHostName, "192.168.0.1", "");
416 host_resolver_.rules()->AddIPLiteralRule(
417 "mail.google.com", "192.168.0.1", "");
418
419 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59420 EXPECT_EQ(OK,
[email protected]bf4ea2f2014-03-10 22:57:53421 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59422 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28423 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59424 "GET",
[email protected]974849d2014-02-06 01:32:59425 net_log_,
426 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38427 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
428 EXPECT_TRUE(stream.get());
429
430 TestCompletionCallback callback;
431 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59432 EXPECT_EQ(OK,
433 request2.Request(server2,
434 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28435 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59436 "GET",
[email protected]974849d2014-02-06 01:32:59437 net_log_,
438 callback.callback()));
[email protected]eed749f92013-12-23 18:57:38439 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
440 EXPECT_TRUE(stream2.get());
441
[email protected]df157d9d2014-03-10 07:27:27442 factory_.OnSessionGoingAway(QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53443 &factory_, host_port_pair_, is_https_));
[email protected]df157d9d2014-03-10 07:27:27444 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53445 &factory_, host_port_pair_, is_https_));
[email protected]df157d9d2014-03-10 07:27:27446 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
447 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38448
449 TestCompletionCallback callback3;
450 QuicStreamRequest request3(&factory_);
[email protected]974849d2014-02-06 01:32:59451 EXPECT_EQ(OK,
452 request3.Request(server2,
453 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28454 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59455 "GET",
[email protected]974849d2014-02-06 01:32:59456 net_log_,
457 callback3.callback()));
[email protected]eed749f92013-12-23 18:57:38458 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
459 EXPECT_TRUE(stream3.get());
460
[email protected]df157d9d2014-03-10 07:27:27461 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(
462 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38463
464 EXPECT_TRUE(socket_data1.at_read_eof());
465 EXPECT_TRUE(socket_data1.at_write_eof());
466 EXPECT_TRUE(socket_data2.at_read_eof());
467 EXPECT_TRUE(socket_data2.at_write_eof());
468}
469
470TEST_P(QuicStreamFactoryTest, HttpsPooling) {
471 MockRead reads[] = {
472 MockRead(ASYNC, OK, 0) // EOF
473 };
474 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
475 socket_factory_.AddSocketDataProvider(&socket_data);
476 socket_data.StopAfter(1);
477
[email protected]bf4ea2f2014-03-10 22:57:53478 HostPortPair server1("www.example.org", 443);
479 HostPortPair server2("mail.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38480
481 // Load a cert that is valid for:
482 // www.example.org (server1)
483 // mail.example.org (server2)
484 // www.example.com
485 base::FilePath certs_dir = GetTestCertsDirectory();
486 scoped_refptr<X509Certificate> test_cert(
487 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
488 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert);
[email protected]b694e48c2014-03-18 17:10:13489 ProofVerifyDetailsChromium verify_details;
490 verify_details.cert_verify_result.verified_cert = test_cert;
491 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
[email protected]eed749f92013-12-23 18:57:38492
493 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53494 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
495 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38496
497 QuicStreamRequest request(&factory_);
498 is_https_ = true;
[email protected]974849d2014-02-06 01:32:59499 EXPECT_EQ(OK,
500 request.Request(server1,
501 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28502 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59503 "GET",
[email protected]974849d2014-02-06 01:32:59504 net_log_,
505 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38506 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
507 EXPECT_TRUE(stream.get());
508
509 TestCompletionCallback callback;
510 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59511 EXPECT_EQ(OK,
512 request2.Request(server2,
513 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28514 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59515 "GET",
[email protected]974849d2014-02-06 01:32:59516 net_log_,
517 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38518 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
519 EXPECT_TRUE(stream2.get());
520
[email protected]df157d9d2014-03-10 07:27:27521 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
522 &factory_, server1, is_https_),
523 QuicStreamFactoryPeer::GetActiveSession(
524 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38525
526 EXPECT_TRUE(socket_data.at_read_eof());
527 EXPECT_TRUE(socket_data.at_write_eof());
528}
529
530TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithCertMismatch) {
531 MockRead reads[] = {
532 MockRead(ASYNC, OK, 0) // EOF
533 };
534 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0);
535 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
536 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 server1("www.example.org", 443);
542 HostPortPair server2("mail.google.com", 443);
[email protected]eed749f92013-12-23 18:57:38543
544 // Load a cert that is valid for:
545 // www.example.org (server1)
546 // mail.example.org
547 // www.example.com
548 // But is not valid for mail.google.com (server2).
549 base::FilePath certs_dir = GetTestCertsDirectory();
550 scoped_refptr<X509Certificate> test_cert(
551 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
552 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert);
[email protected]b694e48c2014-03-18 17:10:13553 ProofVerifyDetailsChromium verify_details;
554 verify_details.cert_verify_result.verified_cert = test_cert;
555 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
556
[email protected]eed749f92013-12-23 18:57:38557
558 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53559 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
560 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38561
562 QuicStreamRequest request(&factory_);
563 is_https_ = true;
[email protected]974849d2014-02-06 01:32:59564 EXPECT_EQ(OK,
565 request.Request(server1,
566 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28567 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59568 "GET",
[email protected]974849d2014-02-06 01:32:59569 net_log_,
570 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38571 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
572 EXPECT_TRUE(stream.get());
573
574 TestCompletionCallback callback;
575 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59576 EXPECT_EQ(OK,
577 request2.Request(server2,
578 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28579 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59580 "GET",
[email protected]974849d2014-02-06 01:32:59581 net_log_,
582 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38583 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
584 EXPECT_TRUE(stream2.get());
585
[email protected]df157d9d2014-03-10 07:27:27586 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
587 &factory_, server1, is_https_),
588 QuicStreamFactoryPeer::GetActiveSession(
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]1e960032013-12-20 19:00:20597TEST_P(QuicStreamFactoryTest, Goaway) {
[email protected]4d283b32013-10-17 12:57:27598 MockRead reads[] = {
599 MockRead(ASYNC, OK, 0) // EOF
600 };
601 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
602 socket_data.StopAfter(1);
603 socket_factory_.AddSocketDataProvider(&socket_data);
604 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
605 socket_data2.StopAfter(1);
606 socket_factory_.AddSocketDataProvider(&socket_data2);
607
608 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59609 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53610 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59611 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28612 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59613 "GET",
[email protected]974849d2014-02-06 01:32:59614 net_log_,
615 callback_.callback()));
[email protected]4d283b32013-10-17 12:57:27616
617 EXPECT_EQ(OK, callback_.WaitForResult());
618 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
619 EXPECT_TRUE(stream.get());
620
621 // Mark the session as going away. Ensure that while it is still alive
622 // that it is no longer active.
623 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53624 &factory_, host_port_pair_, is_https_);
[email protected]4d283b32013-10-17 12:57:27625 factory_.OnSessionGoingAway(session);
626 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
[email protected]df157d9d2014-03-10 07:27:27627 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53628 &factory_, host_port_pair_, is_https_));
629 EXPECT_EQ(NULL, CreateIfSessionExists(host_port_pair_, net_log_).get());
[email protected]4d283b32013-10-17 12:57:27630
631 // Create a new request for the same destination and verify that a
632 // new session is created.
633 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59634 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53635 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59636 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28637 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59638 "GET",
[email protected]974849d2014-02-06 01:32:59639 net_log_,
640 callback_.callback()));
[email protected]4d283b32013-10-17 12:57:27641 EXPECT_EQ(OK, callback_.WaitForResult());
642 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
643 EXPECT_TRUE(stream2.get());
644
645 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(&factory_,
[email protected]bf4ea2f2014-03-10 22:57:53646 host_port_pair_,
[email protected]df157d9d2014-03-10 07:27:27647 is_https_));
[email protected]4d283b32013-10-17 12:57:27648 EXPECT_NE(session,
649 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53650 &factory_, host_port_pair_, is_https_));
[email protected]4d283b32013-10-17 12:57:27651 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
652
653 stream2.reset();
654 stream.reset();
655
656 EXPECT_TRUE(socket_data.at_read_eof());
657 EXPECT_TRUE(socket_data.at_write_eof());
[email protected]3c772402013-12-18 21:38:11658 EXPECT_TRUE(socket_data2.at_read_eof());
659 EXPECT_TRUE(socket_data2.at_write_eof());
[email protected]4d283b32013-10-17 12:57:27660}
661
[email protected]1e960032013-12-20 19:00:20662TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
[email protected]0b2294d32013-08-02 00:46:36663 MockRead reads[] = {
664 MockRead(ASYNC, OK, 0) // EOF
665 };
[email protected]92bf17c2014-03-03 21:14:03666 QuicStreamId stream_id = 5;
[email protected]1e960032013-12-20 19:00:20667 scoped_ptr<QuicEncryptedPacket> rst(
668 maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
[email protected]06ff5152013-08-29 01:03:05669 MockWrite writes[] = {
670 MockWrite(ASYNC, rst->data(), rst->length(), 1),
671 };
672 DeterministicSocketData socket_data(reads, arraysize(reads),
673 writes, arraysize(writes));
[email protected]0b2294d32013-08-02 00:46:36674 socket_factory_.AddSocketDataProvider(&socket_data);
675 socket_data.StopAfter(1);
676
677 HttpRequestInfo request_info;
678 std::vector<QuicHttpStream*> streams;
679 // The MockCryptoClientStream sets max_open_streams to be
680 // 2 * kDefaultMaxStreamsPerConnection.
681 for (size_t i = 0; i < 2 * kDefaultMaxStreamsPerConnection; i++) {
682 QuicStreamRequest request(&factory_);
[email protected]bf4ea2f2014-03-10 22:57:53683 int rv = request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59684 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28685 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59686 "GET",
[email protected]974849d2014-02-06 01:32:59687 net_log_,
[email protected]0b2294d32013-08-02 00:46:36688 callback_.callback());
689 if (i == 0) {
690 EXPECT_EQ(ERR_IO_PENDING, rv);
691 EXPECT_EQ(OK, callback_.WaitForResult());
692 } else {
693 EXPECT_EQ(OK, rv);
694 }
695 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
696 EXPECT_TRUE(stream);
697 EXPECT_EQ(OK, stream->InitializeStream(
698 &request_info, DEFAULT_PRIORITY, net_log_, CompletionCallback()));
699 streams.push_back(stream.release());
700 }
701
702 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59703 EXPECT_EQ(OK,
[email protected]bf4ea2f2014-03-10 22:57:53704 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59705 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28706 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59707 "GET",
[email protected]974849d2014-02-06 01:32:59708 net_log_,
709 CompletionCallback()));
[email protected]0b2294d32013-08-02 00:46:36710 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
711 EXPECT_TRUE(stream);
712 EXPECT_EQ(ERR_IO_PENDING, stream->InitializeStream(
713 &request_info, DEFAULT_PRIORITY, net_log_, callback_.callback()));
714
715 // Close the first stream.
716 streams.front()->Close(false);
717
718 ASSERT_TRUE(callback_.have_result());
719
720 EXPECT_EQ(OK, callback_.WaitForResult());
721
722 EXPECT_TRUE(socket_data.at_read_eof());
723 EXPECT_TRUE(socket_data.at_write_eof());
724 STLDeleteElements(&streams);
725}
726
[email protected]1e960032013-12-20 19:00:20727TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
[email protected]0edce6a2013-05-08 18:02:40728 DeterministicSocketData socket_data(NULL, 0, NULL, 0);
[email protected]e13201d82012-12-12 05:00:32729 socket_factory_.AddSocketDataProvider(&socket_data);
730
[email protected]3c772402013-12-18 21:38:11731 host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName);
[email protected]e13201d82012-12-12 05:00:32732
733 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59734 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53735 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59736 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28737 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59738 "GET",
[email protected]974849d2014-02-06 01:32:59739 net_log_,
740 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32741
742 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
743
744 EXPECT_TRUE(socket_data.at_read_eof());
745 EXPECT_TRUE(socket_data.at_write_eof());
746}
747
[email protected]1e960032013-12-20 19:00:20748TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
[email protected]3c772402013-12-18 21:38:11749 MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
750 DeterministicSocketData socket_data(NULL, 0, NULL, 0);
751 socket_data.set_connect_data(connect);
752 socket_factory_.AddSocketDataProvider(&socket_data);
753 socket_data.StopAfter(1);
754
755 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59756 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53757 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59758 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28759 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59760 "GET",
[email protected]974849d2014-02-06 01:32:59761 net_log_,
762 callback_.callback()));
[email protected]3c772402013-12-18 21:38:11763
764 EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult());
765
766 EXPECT_TRUE(socket_data.at_read_eof());
767 EXPECT_TRUE(socket_data.at_write_eof());
768}
769
[email protected]1e960032013-12-20 19:00:20770TEST_P(QuicStreamFactoryTest, CancelCreate) {
[email protected]69dfd1b2013-06-04 22:20:12771 MockRead reads[] = {
[email protected]25c31dc2013-06-05 17:56:04772 MockRead(ASYNC, OK, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:12773 };
[email protected]25c31dc2013-06-05 17:56:04774 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
[email protected]e13201d82012-12-12 05:00:32775 socket_factory_.AddSocketDataProvider(&socket_data);
776 {
777 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59778 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53779 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59780 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28781 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59782 "GET",
[email protected]974849d2014-02-06 01:32:59783 net_log_,
784 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32785 }
786
[email protected]25c31dc2013-06-05 17:56:04787 socket_data.StopAfter(1);
[email protected]e13201d82012-12-12 05:00:32788 base::RunLoop run_loop;
789 run_loop.RunUntilIdle();
790
791 scoped_ptr<QuicHttpStream> stream(
[email protected]bf4ea2f2014-03-10 22:57:53792 CreateIfSessionExists(host_port_pair_, net_log_));
[email protected]e13201d82012-12-12 05:00:32793 EXPECT_TRUE(stream.get());
794 stream.reset();
795
796 EXPECT_TRUE(socket_data.at_read_eof());
797 EXPECT_TRUE(socket_data.at_write_eof());
798}
799
[email protected]1e960032013-12-20 19:00:20800TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) {
[email protected]3c772402013-12-18 21:38:11801 // Sequentially connect to the default host, then another host, and then the
802 // default host. Verify that the default host gets a consistent ephemeral
803 // port, that is different from the other host's connection.
804
805 std::string other_server_name = "other.google.com";
806 EXPECT_NE(kDefaultServerHostName, other_server_name);
807 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort);
[email protected]3c772402013-12-18 21:38:11808
[email protected]bf4ea2f2014-03-10 22:57:53809 int original_port = GetSourcePortForNewSession(host_port_pair_);
810 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2));
811 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]3c772402013-12-18 21:38:11812}
813
[email protected]d8e2abf82014-03-06 10:30:10814TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) {
815 // Get a session to the host using the port suggester.
816 int original_port =
[email protected]bf4ea2f2014-03-10 22:57:53817 GetSourcePortForNewSessionAndGoAway(host_port_pair_);
[email protected]d8e2abf82014-03-06 10:30:10818 // Verify that the port is different after the goaway.
[email protected]bf4ea2f2014-03-10 22:57:53819 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:10820 // Since the previous session did not goaway we should see the original port.
[email protected]bf4ea2f2014-03-10 22:57:53821 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:10822}
823
[email protected]1e960032013-12-20 19:00:20824TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
[email protected]56dfb902013-01-03 23:17:55825 MockRead reads[] = {
[email protected]0edce6a2013-05-08 18:02:40826 MockRead(ASYNC, 0, 0) // EOF
[email protected]56dfb902013-01-03 23:17:55827 };
[email protected]459a7402014-02-10 12:58:52828 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
829 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:31830 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:52831 DeterministicSocketData socket_data(reads, arraysize(reads),
832 writes.empty() ? NULL : &writes[0],
833 writes.size());
[email protected]56dfb902013-01-03 23:17:55834 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0edce6a2013-05-08 18:02:40835 socket_data.StopAfter(1);
[email protected]56dfb902013-01-03 23:17:55836
[email protected]69dfd1b2013-06-04 22:20:12837 MockRead reads2[] = {
[email protected]25c31dc2013-06-05 17:56:04838 MockRead(ASYNC, 0, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:12839 };
[email protected]25c31dc2013-06-05 17:56:04840 DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0);
[email protected]56dfb902013-01-03 23:17:55841 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]0edce6a2013-05-08 18:02:40842 socket_data2.StopAfter(1);
[email protected]56dfb902013-01-03 23:17:55843
844 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59845 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53846 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59847 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28848 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59849 "GET",
[email protected]974849d2014-02-06 01:32:59850 net_log_,
851 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:55852
853 EXPECT_EQ(OK, callback_.WaitForResult());
854 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:36855 HttpRequestInfo request_info;
856 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
857 DEFAULT_PRIORITY,
858 net_log_, CompletionCallback()));
[email protected]56dfb902013-01-03 23:17:55859
860 // Close the session and verify that stream saw the error.
861 factory_.CloseAllSessions(ERR_INTERNET_DISCONNECTED);
862 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
863 stream->ReadResponseHeaders(callback_.callback()));
864
865 // Now attempting to request a stream to the same origin should create
866 // a new session.
867
868 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59869 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53870 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59871 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28872 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59873 "GET",
[email protected]974849d2014-02-06 01:32:59874 net_log_,
875 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:55876
877 EXPECT_EQ(OK, callback_.WaitForResult());
878 stream = request2.ReleaseStream();
879 stream.reset(); // Will reset stream 3.
880
881 EXPECT_TRUE(socket_data.at_read_eof());
882 EXPECT_TRUE(socket_data.at_write_eof());
883 EXPECT_TRUE(socket_data2.at_read_eof());
884 EXPECT_TRUE(socket_data2.at_write_eof());
885}
886
[email protected]1e960032013-12-20 19:00:20887TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
[email protected]f698a012013-05-06 20:18:59888 MockRead reads[] = {
[email protected]0edce6a2013-05-08 18:02:40889 MockRead(ASYNC, 0, 0) // EOF
[email protected]f698a012013-05-06 20:18:59890 };
[email protected]459a7402014-02-10 12:58:52891 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
892 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:31893 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:52894 DeterministicSocketData socket_data(reads, arraysize(reads),
895 writes.empty() ? NULL : &writes[0],
896 writes.size());
[email protected]f698a012013-05-06 20:18:59897 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0edce6a2013-05-08 18:02:40898 socket_data.StopAfter(1);
[email protected]f698a012013-05-06 20:18:59899
[email protected]69dfd1b2013-06-04 22:20:12900 MockRead reads2[] = {
[email protected]25c31dc2013-06-05 17:56:04901 MockRead(ASYNC, 0, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:12902 };
[email protected]25c31dc2013-06-05 17:56:04903 DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0);
[email protected]f698a012013-05-06 20:18:59904 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]0edce6a2013-05-08 18:02:40905 socket_data2.StopAfter(1);
[email protected]f698a012013-05-06 20:18:59906
907 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59908 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53909 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59910 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28911 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59912 "GET",
[email protected]974849d2014-02-06 01:32:59913 net_log_,
914 callback_.callback()));
[email protected]f698a012013-05-06 20:18:59915
916 EXPECT_EQ(OK, callback_.WaitForResult());
917 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:36918 HttpRequestInfo request_info;
919 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
920 DEFAULT_PRIORITY,
921 net_log_, CompletionCallback()));
[email protected]f698a012013-05-06 20:18:59922
923 // Change the IP address and verify that stream saw the error.
924 factory_.OnIPAddressChanged();
925 EXPECT_EQ(ERR_NETWORK_CHANGED,
926 stream->ReadResponseHeaders(callback_.callback()));
[email protected]11c05872013-08-20 02:04:12927 EXPECT_TRUE(factory_.require_confirmation());
[email protected]f698a012013-05-06 20:18:59928
929 // Now attempting to request a stream to the same origin should create
930 // a new session.
931
932 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59933 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53934 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59935 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28936 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59937 "GET",
[email protected]974849d2014-02-06 01:32:59938 net_log_,
939 callback_.callback()));
[email protected]f698a012013-05-06 20:18:59940
941 EXPECT_EQ(OK, callback_.WaitForResult());
942 stream = request2.ReleaseStream();
943 stream.reset(); // Will reset stream 3.
944
945 EXPECT_TRUE(socket_data.at_read_eof());
946 EXPECT_TRUE(socket_data.at_write_eof());
947 EXPECT_TRUE(socket_data2.at_read_eof());
948 EXPECT_TRUE(socket_data2.at_write_eof());
949}
950
[email protected]1e960032013-12-20 19:00:20951TEST_P(QuicStreamFactoryTest, OnCertAdded) {
[email protected]d7d1e50b2013-11-25 22:08:09952 MockRead reads[] = {
953 MockRead(ASYNC, 0, 0) // EOF
954 };
[email protected]459a7402014-02-10 12:58:52955 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
956 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:31957 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:52958 DeterministicSocketData socket_data(reads, arraysize(reads),
959 writes.empty() ? NULL : &writes[0],
960 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:09961 socket_factory_.AddSocketDataProvider(&socket_data);
962 socket_data.StopAfter(1);
963
964 MockRead reads2[] = {
965 MockRead(ASYNC, 0, 0) // EOF
966 };
967 DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0);
968 socket_factory_.AddSocketDataProvider(&socket_data2);
969 socket_data2.StopAfter(1);
970
971 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59972 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53973 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59974 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28975 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59976 "GET",
[email protected]974849d2014-02-06 01:32:59977 net_log_,
978 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:09979
980 EXPECT_EQ(OK, callback_.WaitForResult());
981 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
982 HttpRequestInfo request_info;
983 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
984 DEFAULT_PRIORITY,
985 net_log_, CompletionCallback()));
986
987 // Add a cert and verify that stream saw the event.
988 factory_.OnCertAdded(NULL);
989 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
990 stream->ReadResponseHeaders(callback_.callback()));
991 EXPECT_FALSE(factory_.require_confirmation());
992
993 // Now attempting to request a stream to the same origin should create
994 // a new session.
995
996 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59997 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53998 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59999 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281000 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591001 "GET",
[email protected]974849d2014-02-06 01:32:591002 net_log_,
1003 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091004
1005 EXPECT_EQ(OK, callback_.WaitForResult());
1006 stream = request2.ReleaseStream();
1007 stream.reset(); // Will reset stream 3.
1008
1009 EXPECT_TRUE(socket_data.at_read_eof());
1010 EXPECT_TRUE(socket_data.at_write_eof());
1011 EXPECT_TRUE(socket_data2.at_read_eof());
1012 EXPECT_TRUE(socket_data2.at_write_eof());
1013}
1014
[email protected]1e960032013-12-20 19:00:201015TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
[email protected]d7d1e50b2013-11-25 22:08:091016 MockRead reads[] = {
1017 MockRead(ASYNC, 0, 0) // EOF
1018 };
[email protected]459a7402014-02-10 12:58:521019 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1020 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311021 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521022 DeterministicSocketData socket_data(reads, arraysize(reads),
1023 writes.empty() ? NULL : &writes[0],
1024 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:091025 socket_factory_.AddSocketDataProvider(&socket_data);
1026 socket_data.StopAfter(1);
1027
1028 MockRead reads2[] = {
1029 MockRead(ASYNC, 0, 0) // EOF
1030 };
1031 DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0);
1032 socket_factory_.AddSocketDataProvider(&socket_data2);
1033 socket_data2.StopAfter(1);
1034
1035 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591036 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531037 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591038 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281039 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591040 "GET",
[email protected]974849d2014-02-06 01:32:591041 net_log_,
1042 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091043
1044 EXPECT_EQ(OK, callback_.WaitForResult());
1045 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1046 HttpRequestInfo request_info;
1047 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1048 DEFAULT_PRIORITY,
1049 net_log_, CompletionCallback()));
1050
1051 // Change the CA cert and verify that stream saw the event.
1052 factory_.OnCACertChanged(NULL);
1053 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1054 stream->ReadResponseHeaders(callback_.callback()));
1055 EXPECT_FALSE(factory_.require_confirmation());
1056
1057 // Now attempting to request a stream to the same origin should create
1058 // a new session.
1059
1060 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591061 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531062 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591063 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281064 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591065 "GET",
[email protected]974849d2014-02-06 01:32:591066 net_log_,
1067 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091068
1069 EXPECT_EQ(OK, callback_.WaitForResult());
1070 stream = request2.ReleaseStream();
1071 stream.reset(); // Will reset stream 3.
1072
1073 EXPECT_TRUE(socket_data.at_read_eof());
1074 EXPECT_TRUE(socket_data.at_write_eof());
1075 EXPECT_TRUE(socket_data2.at_read_eof());
1076 EXPECT_TRUE(socket_data2.at_write_eof());
1077}
1078
[email protected]1e960032013-12-20 19:00:201079TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
[email protected]6e12d702013-11-13 00:17:171080 vector<string> cannoncial_suffixes;
1081 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1082 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]c49ff182013-09-28 08:33:261083
[email protected]6e12d702013-11-13 00:17:171084 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1085 string r1_host_name("r1");
1086 string r2_host_name("r2");
1087 r1_host_name.append(cannoncial_suffixes[i]);
1088 r2_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141089
[email protected]bf4ea2f2014-03-10 22:57:531090 HostPortPair host_port_pair1(r1_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121091 QuicCryptoClientConfig* crypto_config =
1092 QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
[email protected]257f24f2014-04-01 09:15:371093 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171094 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371095 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171096 EXPECT_FALSE(cached1->proof_valid());
1097 EXPECT_TRUE(cached1->source_address_token().empty());
1098
1099 // Mutate the cached1 to have different data.
1100 // TODO(rtenneti): mutate other members of CachedState.
1101 cached1->set_source_address_token(r1_host_name);
1102 cached1->SetProofValid();
1103
[email protected]bf4ea2f2014-03-10 22:57:531104 HostPortPair host_port_pair2(r2_host_name, 80);
[email protected]257f24f2014-04-01 09:15:371105 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171106 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371107 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171108 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
1109 EXPECT_TRUE(cached2->proof_valid());
1110 }
[email protected]b70fdb792013-10-25 19:04:141111}
1112
[email protected]1e960032013-12-20 19:00:201113TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
[email protected]6e12d702013-11-13 00:17:171114 vector<string> cannoncial_suffixes;
1115 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1116 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]b70fdb792013-10-25 19:04:141117
[email protected]6e12d702013-11-13 00:17:171118 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1119 string r3_host_name("r3");
1120 string r4_host_name("r4");
1121 r3_host_name.append(cannoncial_suffixes[i]);
1122 r4_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141123
[email protected]bf4ea2f2014-03-10 22:57:531124 HostPortPair host_port_pair1(r3_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121125 QuicCryptoClientConfig* crypto_config =
1126 QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
[email protected]257f24f2014-04-01 09:15:371127 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171128 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371129 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171130 EXPECT_FALSE(cached1->proof_valid());
1131 EXPECT_TRUE(cached1->source_address_token().empty());
1132
1133 // Mutate the cached1 to have different data.
1134 // TODO(rtenneti): mutate other members of CachedState.
1135 cached1->set_source_address_token(r3_host_name);
1136 cached1->SetProofInvalid();
1137
[email protected]bf4ea2f2014-03-10 22:57:531138 HostPortPair host_port_pair2(r4_host_name, 80);
[email protected]257f24f2014-04-01 09:15:371139 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171140 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371141 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171142 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
1143 EXPECT_TRUE(cached2->source_address_token().empty());
1144 EXPECT_FALSE(cached2->proof_valid());
1145 }
[email protected]c49ff182013-09-28 08:33:261146}
1147
[email protected]e13201d82012-12-12 05:00:321148} // namespace test
[email protected]e13201d82012-12-12 05:00:321149} // namespace net