blob: f50c3878013c5c7398aa8b1f6db368ce2a5dd0ff [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]0c4017ca2014-06-06 03:30:4593 base::WeakPtr<HttpServerProperties>(), cert_verifier_.get(),
94 &crypto_client_stream_factory_, &random_generator_, clock_,
95 kDefaultMaxPacketSize, std::string(),
[email protected]ebb3ad52014-04-30 20:01:3996 SupportedVersions(GetParam()), true, true, true),
[email protected]bf4ea2f2014-03-10 22:57:5397 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
[email protected]9dd3ff0f2014-03-26 09:51:2898 is_https_(false),
[email protected]314b03992014-04-01 01:28:5399 privacy_mode_(PRIVACY_MODE_DISABLED) {
[email protected]11c05872013-08-20 02:04:12100 factory_.set_require_confirmation(false);
[email protected]e13201d82012-12-12 05:00:32101 }
102
[email protected]df157d9d2014-03-10 07:27:27103 scoped_ptr<QuicHttpStream> CreateIfSessionExists(
[email protected]bf4ea2f2014-03-10 22:57:53104 const HostPortPair& host_port_pair,
[email protected]df157d9d2014-03-10 07:27:27105 const BoundNetLog& net_log) {
106 return QuicStreamFactoryPeer::CreateIfSessionExists(
[email protected]bf4ea2f2014-03-10 22:57:53107 &factory_, host_port_pair, false, net_log_);
[email protected]df157d9d2014-03-10 07:27:27108 }
[email protected]e13201d82012-12-12 05:00:32109
[email protected]bf4ea2f2014-03-10 22:57:53110 int GetSourcePortForNewSession(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10111 return GetSourcePortForNewSessionInner(destination, false);
112 }
113
114 int GetSourcePortForNewSessionAndGoAway(
[email protected]bf4ea2f2014-03-10 22:57:53115 const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10116 return GetSourcePortForNewSessionInner(destination, true);
117 }
118
[email protected]bf4ea2f2014-03-10 22:57:53119 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
[email protected]d8e2abf82014-03-06 10:30:10120 bool goaway_received) {
[email protected]3c772402013-12-18 21:38:11121 // Should only be called if there is no active session for this destination.
[email protected]df157d9d2014-03-10 07:27:27122 EXPECT_EQ(NULL, CreateIfSessionExists(destination, net_log_).get());
[email protected]3c772402013-12-18 21:38:11123 size_t socket_count = socket_factory_.udp_client_sockets().size();
124
125 MockRead reads[] = {
126 MockRead(ASYNC, OK, 0) // EOF
127 };
128 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
129 socket_data.StopAfter(1);
130 socket_factory_.AddSocketDataProvider(&socket_data);
131
132 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59133 EXPECT_EQ(ERR_IO_PENDING,
134 request.Request(destination,
135 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28136 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59137 "GET",
[email protected]974849d2014-02-06 01:32:59138 net_log_,
139 callback_.callback()));
[email protected]3c772402013-12-18 21:38:11140
141 EXPECT_EQ(OK, callback_.WaitForResult());
142 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
143 EXPECT_TRUE(stream.get());
144 stream.reset();
145
146 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
[email protected]df157d9d2014-03-10 07:27:27147 &factory_, destination, is_https_);
[email protected]3c772402013-12-18 21:38:11148
149 if (socket_count + 1 != socket_factory_.udp_client_sockets().size()) {
150 EXPECT_TRUE(false);
151 return 0;
152 }
153
154 IPEndPoint endpoint;
155 socket_factory_.
156 udp_client_sockets()[socket_count]->GetLocalAddress(&endpoint);
157 int port = endpoint.port();
[email protected]d8e2abf82014-03-06 10:30:10158 if (goaway_received) {
159 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, "");
160 session->OnGoAway(goaway);
161 }
[email protected]3c772402013-12-18 21:38:11162
163 factory_.OnSessionClosed(session);
[email protected]df157d9d2014-03-10 07:27:27164 EXPECT_EQ(NULL, CreateIfSessionExists(destination, net_log_).get());
[email protected]3c772402013-12-18 21:38:11165 EXPECT_TRUE(socket_data.at_read_eof());
166 EXPECT_TRUE(socket_data.at_write_eof());
167 return port;
168 }
169
[email protected]459a7402014-02-10 12:58:52170 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() {
[email protected]66ae5962014-05-22 11:13:05171 QuicStreamId stream_id = kClientDataStreamId1;
[email protected]51cc1342014-04-18 23:44:37172 return maker_.MakeRstPacket(
173 1, true, stream_id,
174 AdjustErrorForVersion(QUIC_RST_FLOW_CONTROL_ACCOUNTING, GetParam()));
[email protected]459a7402014-02-10 12:58:52175 }
176
[email protected]e13201d82012-12-12 05:00:32177 MockHostResolver host_resolver_;
[email protected]0edce6a2013-05-08 18:02:40178 DeterministicMockClientSocketFactory socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05179 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]9558c5d32012-12-22 00:08:14180 MockRandom random_generator_;
[email protected]1e960032013-12-20 19:00:20181 QuicTestPacketMaker maker_;
[email protected]872edd9e2013-01-16 08:51:15182 MockClock* clock_; // Owned by factory_.
[email protected]59c0bbd2014-03-22 04:08:12183 scoped_ptr<CertVerifier> cert_verifier_;
[email protected]e13201d82012-12-12 05:00:32184 QuicStreamFactory factory_;
[email protected]bf4ea2f2014-03-10 22:57:53185 HostPortPair host_port_pair_;
[email protected]6d1b4ed2013-07-10 03:57:54186 bool is_https_;
[email protected]9dd3ff0f2014-03-26 09:51:28187 PrivacyMode privacy_mode_;
[email protected]e13201d82012-12-12 05:00:32188 BoundNetLog net_log_;
189 TestCompletionCallback callback_;
[email protected]e13201d82012-12-12 05:00:32190};
191
[email protected]1e960032013-12-20 19:00:20192INSTANTIATE_TEST_CASE_P(Version, QuicStreamFactoryTest,
193 ::testing::ValuesIn(QuicSupportedVersions()));
194
195TEST_P(QuicStreamFactoryTest, CreateIfSessionExists) {
[email protected]bf4ea2f2014-03-10 22:57:53196 EXPECT_EQ(NULL, CreateIfSessionExists(host_port_pair_, net_log_).get());
[email protected]e13201d82012-12-12 05:00:32197}
198
[email protected]1e960032013-12-20 19:00:20199TEST_P(QuicStreamFactoryTest, Create) {
[email protected]69dfd1b2013-06-04 22:20:12200 MockRead reads[] = {
[email protected]25c31dc2013-06-05 17:56:04201 MockRead(ASYNC, OK, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:12202 };
[email protected]25c31dc2013-06-05 17:56:04203 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
[email protected]e13201d82012-12-12 05:00:32204 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]25c31dc2013-06-05 17:56:04205 socket_data.StopAfter(1);
[email protected]e13201d82012-12-12 05:00:32206
207 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59208 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53209 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59210 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28211 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59212 "GET",
[email protected]974849d2014-02-06 01:32:59213 net_log_,
214 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32215
216 EXPECT_EQ(OK, callback_.WaitForResult());
217 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0edce6a2013-05-08 18:02:40218 EXPECT_TRUE(stream.get());
[email protected]e13201d82012-12-12 05:00:32219
220 // Will reset stream 3.
[email protected]bf4ea2f2014-03-10 22:57:53221 stream = CreateIfSessionExists(host_port_pair_, net_log_);
[email protected]e13201d82012-12-12 05:00:32222 EXPECT_TRUE(stream.get());
223
[email protected]6d1b4ed2013-07-10 03:57:54224 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
225 // in streams on different sessions.
[email protected]e13201d82012-12-12 05:00:32226 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59227 EXPECT_EQ(OK,
[email protected]bf4ea2f2014-03-10 22:57:53228 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59229 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28230 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59231 "GET",
[email protected]974849d2014-02-06 01:32:59232 net_log_,
233 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32234 stream = request2.ReleaseStream(); // Will reset stream 5.
235 stream.reset(); // Will reset stream 7.
236
237 EXPECT_TRUE(socket_data.at_read_eof());
238 EXPECT_TRUE(socket_data.at_write_eof());
239}
240
[email protected]8bd2b812014-03-26 04:01:17241TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
242 MockRead reads[] = {
243 MockRead(ASYNC, OK, 0) // EOF
244 };
245 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
246 socket_factory_.AddSocketDataProvider(&socket_data);
247 socket_data.StopAfter(1);
248
249 crypto_client_stream_factory_.set_handshake_mode(
250 MockCryptoClientStream::ZERO_RTT);
251 host_resolver_.set_synchronous_mode(true);
252 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
253 "192.168.0.1", "");
254
255 QuicStreamRequest request(&factory_);
256 EXPECT_EQ(OK,
257 request.Request(host_port_pair_,
258 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28259 privacy_mode_,
[email protected]8bd2b812014-03-26 04:01:17260 "GET",
261 net_log_,
262 callback_.callback()));
263
264 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
265 EXPECT_TRUE(stream.get());
266 EXPECT_TRUE(socket_data.at_read_eof());
267 EXPECT_TRUE(socket_data.at_write_eof());
268}
269
270TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
271 MockRead reads[] = {
272 MockRead(ASYNC, OK, 0) // EOF
273 };
274 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
275 socket_factory_.AddSocketDataProvider(&socket_data);
276 socket_data.StopAfter(1);
277
278 crypto_client_stream_factory_.set_handshake_mode(
279 MockCryptoClientStream::ZERO_RTT);
280 host_resolver_.set_synchronous_mode(true);
281 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
282 "192.168.0.1", "");
283
284 QuicStreamRequest request(&factory_);
285 // Posts require handshake confirmation, so this will return asynchronously.
286 EXPECT_EQ(ERR_IO_PENDING,
287 request.Request(host_port_pair_,
288 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28289 privacy_mode_,
[email protected]8bd2b812014-03-26 04:01:17290 "POST",
291 net_log_,
292 callback_.callback()));
293
294 // Confirm the handshake and verify that the stream is created.
295 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
296 QuicSession::HANDSHAKE_CONFIRMED);
297
298 EXPECT_EQ(OK, callback_.WaitForResult());
299 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
300 EXPECT_TRUE(stream.get());
301 EXPECT_TRUE(socket_data.at_read_eof());
302 EXPECT_TRUE(socket_data.at_write_eof());
303}
304
[email protected]df157d9d2014-03-10 07:27:27305TEST_P(QuicStreamFactoryTest, CreateHttpVsHttps) {
306 MockRead reads[] = {
307 MockRead(ASYNC, OK, 0) // EOF
308 };
309 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0);
310 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
311 socket_factory_.AddSocketDataProvider(&socket_data1);
312 socket_factory_.AddSocketDataProvider(&socket_data2);
313 socket_data1.StopAfter(1);
314 socket_data2.StopAfter(1);
315
316 QuicStreamRequest request(&factory_);
317 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53318 request.Request(host_port_pair_,
[email protected]df157d9d2014-03-10 07:27:27319 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28320 privacy_mode_,
[email protected]df157d9d2014-03-10 07:27:27321 "GET",
[email protected]df157d9d2014-03-10 07:27:27322 net_log_,
323 callback_.callback()));
324
325 EXPECT_EQ(OK, callback_.WaitForResult());
326 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
327 EXPECT_TRUE(stream.get());
328
329 QuicStreamRequest request2(&factory_);
330 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53331 request2.Request(host_port_pair_,
[email protected]df157d9d2014-03-10 07:27:27332 !is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28333 privacy_mode_,
[email protected]df157d9d2014-03-10 07:27:27334 "GET",
[email protected]df157d9d2014-03-10 07:27:27335 net_log_,
336 callback_.callback()));
337 EXPECT_EQ(OK, callback_.WaitForResult());
338 stream = request2.ReleaseStream();
339 EXPECT_TRUE(stream.get());
340 stream.reset();
341
342 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53343 &factory_, host_port_pair_, is_https_),
[email protected]df157d9d2014-03-10 07:27:27344 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53345 &factory_, host_port_pair_, !is_https_));
[email protected]df157d9d2014-03-10 07:27:27346
347 EXPECT_TRUE(socket_data1.at_read_eof());
348 EXPECT_TRUE(socket_data1.at_write_eof());
349 EXPECT_TRUE(socket_data2.at_read_eof());
350 EXPECT_TRUE(socket_data2.at_write_eof());
351}
352
[email protected]eed749f92013-12-23 18:57:38353TEST_P(QuicStreamFactoryTest, Pooling) {
354 MockRead reads[] = {
355 MockRead(ASYNC, OK, 0) // EOF
356 };
357 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
358 socket_factory_.AddSocketDataProvider(&socket_data);
359 socket_data.StopAfter(1);
360
[email protected]bf4ea2f2014-03-10 22:57:53361 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38362 host_resolver_.set_synchronous_mode(true);
363 host_resolver_.rules()->AddIPLiteralRule(
364 kDefaultServerHostName, "192.168.0.1", "");
365 host_resolver_.rules()->AddIPLiteralRule(
366 "mail.google.com", "192.168.0.1", "");
367
368 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59369 EXPECT_EQ(OK,
[email protected]bf4ea2f2014-03-10 22:57:53370 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59371 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28372 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59373 "GET",
[email protected]974849d2014-02-06 01:32:59374 net_log_,
375 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38376 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
377 EXPECT_TRUE(stream.get());
378
379 TestCompletionCallback callback;
380 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59381 EXPECT_EQ(OK,
382 request2.Request(server2,
383 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28384 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59385 "GET",
[email protected]974849d2014-02-06 01:32:59386 net_log_,
387 callback.callback()));
[email protected]eed749f92013-12-23 18:57:38388 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
389 EXPECT_TRUE(stream2.get());
390
391 EXPECT_EQ(
[email protected]df157d9d2014-03-10 07:27:27392 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53393 &factory_, host_port_pair_, is_https_),
[email protected]df157d9d2014-03-10 07:27:27394 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38395
396 EXPECT_TRUE(socket_data.at_read_eof());
397 EXPECT_TRUE(socket_data.at_write_eof());
398}
399
400TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
401 MockRead reads[] = {
402 MockRead(ASYNC, OK, 0) // EOF
403 };
404 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0);
405 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
406 socket_factory_.AddSocketDataProvider(&socket_data1);
407 socket_factory_.AddSocketDataProvider(&socket_data2);
408 socket_data1.StopAfter(1);
409 socket_data2.StopAfter(1);
410
[email protected]bf4ea2f2014-03-10 22:57:53411 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38412 host_resolver_.set_synchronous_mode(true);
413 host_resolver_.rules()->AddIPLiteralRule(
414 kDefaultServerHostName, "192.168.0.1", "");
415 host_resolver_.rules()->AddIPLiteralRule(
416 "mail.google.com", "192.168.0.1", "");
417
418 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59419 EXPECT_EQ(OK,
[email protected]bf4ea2f2014-03-10 22:57:53420 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59421 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28422 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59423 "GET",
[email protected]974849d2014-02-06 01:32:59424 net_log_,
425 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38426 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
427 EXPECT_TRUE(stream.get());
428
429 TestCompletionCallback callback;
430 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59431 EXPECT_EQ(OK,
432 request2.Request(server2,
433 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28434 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59435 "GET",
[email protected]974849d2014-02-06 01:32:59436 net_log_,
437 callback.callback()));
[email protected]eed749f92013-12-23 18:57:38438 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
439 EXPECT_TRUE(stream2.get());
440
[email protected]df157d9d2014-03-10 07:27:27441 factory_.OnSessionGoingAway(QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53442 &factory_, host_port_pair_, is_https_));
[email protected]df157d9d2014-03-10 07:27:27443 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53444 &factory_, host_port_pair_, is_https_));
[email protected]df157d9d2014-03-10 07:27:27445 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
446 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38447
448 TestCompletionCallback callback3;
449 QuicStreamRequest request3(&factory_);
[email protected]974849d2014-02-06 01:32:59450 EXPECT_EQ(OK,
451 request3.Request(server2,
452 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28453 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59454 "GET",
[email protected]974849d2014-02-06 01:32:59455 net_log_,
456 callback3.callback()));
[email protected]eed749f92013-12-23 18:57:38457 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
458 EXPECT_TRUE(stream3.get());
459
[email protected]df157d9d2014-03-10 07:27:27460 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(
461 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38462
463 EXPECT_TRUE(socket_data1.at_read_eof());
464 EXPECT_TRUE(socket_data1.at_write_eof());
465 EXPECT_TRUE(socket_data2.at_read_eof());
466 EXPECT_TRUE(socket_data2.at_write_eof());
467}
468
469TEST_P(QuicStreamFactoryTest, HttpsPooling) {
470 MockRead reads[] = {
471 MockRead(ASYNC, OK, 0) // EOF
472 };
473 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
474 socket_factory_.AddSocketDataProvider(&socket_data);
475 socket_data.StopAfter(1);
476
[email protected]bf4ea2f2014-03-10 22:57:53477 HostPortPair server1("www.example.org", 443);
478 HostPortPair server2("mail.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38479
480 // Load a cert that is valid for:
481 // www.example.org (server1)
482 // mail.example.org (server2)
483 // www.example.com
484 base::FilePath certs_dir = GetTestCertsDirectory();
485 scoped_refptr<X509Certificate> test_cert(
486 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
487 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert);
[email protected]b694e48c2014-03-18 17:10:13488 ProofVerifyDetailsChromium verify_details;
489 verify_details.cert_verify_result.verified_cert = test_cert;
490 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
[email protected]eed749f92013-12-23 18:57:38491
492 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53493 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
494 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38495
496 QuicStreamRequest request(&factory_);
497 is_https_ = true;
[email protected]974849d2014-02-06 01:32:59498 EXPECT_EQ(OK,
499 request.Request(server1,
500 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28501 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59502 "GET",
[email protected]974849d2014-02-06 01:32:59503 net_log_,
504 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38505 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
506 EXPECT_TRUE(stream.get());
507
508 TestCompletionCallback callback;
509 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59510 EXPECT_EQ(OK,
511 request2.Request(server2,
512 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28513 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59514 "GET",
[email protected]974849d2014-02-06 01:32:59515 net_log_,
516 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38517 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
518 EXPECT_TRUE(stream2.get());
519
[email protected]df157d9d2014-03-10 07:27:27520 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
521 &factory_, server1, is_https_),
522 QuicStreamFactoryPeer::GetActiveSession(
523 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38524
525 EXPECT_TRUE(socket_data.at_read_eof());
526 EXPECT_TRUE(socket_data.at_write_eof());
527}
528
529TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithCertMismatch) {
530 MockRead reads[] = {
531 MockRead(ASYNC, OK, 0) // EOF
532 };
533 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0);
534 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
535 socket_factory_.AddSocketDataProvider(&socket_data1);
536 socket_factory_.AddSocketDataProvider(&socket_data2);
537 socket_data1.StopAfter(1);
538 socket_data2.StopAfter(1);
539
[email protected]bf4ea2f2014-03-10 22:57:53540 HostPortPair server1("www.example.org", 443);
541 HostPortPair server2("mail.google.com", 443);
[email protected]eed749f92013-12-23 18:57:38542
543 // Load a cert that is valid for:
544 // www.example.org (server1)
545 // mail.example.org
546 // www.example.com
547 // But is not valid for mail.google.com (server2).
548 base::FilePath certs_dir = GetTestCertsDirectory();
549 scoped_refptr<X509Certificate> test_cert(
550 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
551 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert);
[email protected]b694e48c2014-03-18 17:10:13552 ProofVerifyDetailsChromium verify_details;
553 verify_details.cert_verify_result.verified_cert = test_cert;
554 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
555
[email protected]eed749f92013-12-23 18:57:38556
557 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53558 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
559 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38560
561 QuicStreamRequest request(&factory_);
562 is_https_ = true;
[email protected]974849d2014-02-06 01:32:59563 EXPECT_EQ(OK,
564 request.Request(server1,
565 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28566 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59567 "GET",
[email protected]974849d2014-02-06 01:32:59568 net_log_,
569 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38570 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
571 EXPECT_TRUE(stream.get());
572
573 TestCompletionCallback callback;
574 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59575 EXPECT_EQ(OK,
576 request2.Request(server2,
577 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28578 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59579 "GET",
[email protected]974849d2014-02-06 01:32:59580 net_log_,
581 callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38582 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
583 EXPECT_TRUE(stream2.get());
584
[email protected]df157d9d2014-03-10 07:27:27585 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
586 &factory_, server1, is_https_),
587 QuicStreamFactoryPeer::GetActiveSession(
588 &factory_, server2, is_https_));
[email protected]eed749f92013-12-23 18:57:38589
590 EXPECT_TRUE(socket_data1.at_read_eof());
591 EXPECT_TRUE(socket_data1.at_write_eof());
592 EXPECT_TRUE(socket_data2.at_read_eof());
593 EXPECT_TRUE(socket_data2.at_write_eof());
594}
595
[email protected]1e960032013-12-20 19:00:20596TEST_P(QuicStreamFactoryTest, Goaway) {
[email protected]4d283b32013-10-17 12:57:27597 MockRead reads[] = {
598 MockRead(ASYNC, OK, 0) // EOF
599 };
600 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
601 socket_data.StopAfter(1);
602 socket_factory_.AddSocketDataProvider(&socket_data);
603 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
604 socket_data2.StopAfter(1);
605 socket_factory_.AddSocketDataProvider(&socket_data2);
606
607 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59608 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53609 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59610 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28611 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59612 "GET",
[email protected]974849d2014-02-06 01:32:59613 net_log_,
614 callback_.callback()));
[email protected]4d283b32013-10-17 12:57:27615
616 EXPECT_EQ(OK, callback_.WaitForResult());
617 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
618 EXPECT_TRUE(stream.get());
619
620 // Mark the session as going away. Ensure that while it is still alive
621 // that it is no longer active.
622 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53623 &factory_, host_port_pair_, is_https_);
[email protected]4d283b32013-10-17 12:57:27624 factory_.OnSessionGoingAway(session);
625 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
[email protected]df157d9d2014-03-10 07:27:27626 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53627 &factory_, host_port_pair_, is_https_));
628 EXPECT_EQ(NULL, CreateIfSessionExists(host_port_pair_, net_log_).get());
[email protected]4d283b32013-10-17 12:57:27629
630 // Create a new request for the same destination and verify that a
631 // new session is created.
632 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59633 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53634 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59635 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28636 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59637 "GET",
[email protected]974849d2014-02-06 01:32:59638 net_log_,
639 callback_.callback()));
[email protected]4d283b32013-10-17 12:57:27640 EXPECT_EQ(OK, callback_.WaitForResult());
641 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
642 EXPECT_TRUE(stream2.get());
643
644 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(&factory_,
[email protected]bf4ea2f2014-03-10 22:57:53645 host_port_pair_,
[email protected]df157d9d2014-03-10 07:27:27646 is_https_));
[email protected]4d283b32013-10-17 12:57:27647 EXPECT_NE(session,
648 QuicStreamFactoryPeer::GetActiveSession(
[email protected]bf4ea2f2014-03-10 22:57:53649 &factory_, host_port_pair_, is_https_));
[email protected]4d283b32013-10-17 12:57:27650 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
651
652 stream2.reset();
653 stream.reset();
654
655 EXPECT_TRUE(socket_data.at_read_eof());
656 EXPECT_TRUE(socket_data.at_write_eof());
[email protected]3c772402013-12-18 21:38:11657 EXPECT_TRUE(socket_data2.at_read_eof());
658 EXPECT_TRUE(socket_data2.at_write_eof());
[email protected]4d283b32013-10-17 12:57:27659}
660
[email protected]1e960032013-12-20 19:00:20661TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
[email protected]0b2294d32013-08-02 00:46:36662 MockRead reads[] = {
663 MockRead(ASYNC, OK, 0) // EOF
664 };
[email protected]66ae5962014-05-22 11:13:05665 QuicStreamId stream_id = kClientDataStreamId1;
[email protected]1e960032013-12-20 19:00:20666 scoped_ptr<QuicEncryptedPacket> rst(
667 maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
[email protected]06ff5152013-08-29 01:03:05668 MockWrite writes[] = {
669 MockWrite(ASYNC, rst->data(), rst->length(), 1),
670 };
671 DeterministicSocketData socket_data(reads, arraysize(reads),
672 writes, arraysize(writes));
[email protected]0b2294d32013-08-02 00:46:36673 socket_factory_.AddSocketDataProvider(&socket_data);
674 socket_data.StopAfter(1);
675
676 HttpRequestInfo request_info;
677 std::vector<QuicHttpStream*> streams;
678 // The MockCryptoClientStream sets max_open_streams to be
679 // 2 * kDefaultMaxStreamsPerConnection.
680 for (size_t i = 0; i < 2 * kDefaultMaxStreamsPerConnection; i++) {
681 QuicStreamRequest request(&factory_);
[email protected]bf4ea2f2014-03-10 22:57:53682 int rv = request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59683 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28684 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59685 "GET",
[email protected]974849d2014-02-06 01:32:59686 net_log_,
[email protected]0b2294d32013-08-02 00:46:36687 callback_.callback());
688 if (i == 0) {
689 EXPECT_EQ(ERR_IO_PENDING, rv);
690 EXPECT_EQ(OK, callback_.WaitForResult());
691 } else {
692 EXPECT_EQ(OK, rv);
693 }
694 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
695 EXPECT_TRUE(stream);
696 EXPECT_EQ(OK, stream->InitializeStream(
697 &request_info, DEFAULT_PRIORITY, net_log_, CompletionCallback()));
698 streams.push_back(stream.release());
699 }
700
701 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59702 EXPECT_EQ(OK,
[email protected]bf4ea2f2014-03-10 22:57:53703 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59704 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28705 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59706 "GET",
[email protected]974849d2014-02-06 01:32:59707 net_log_,
708 CompletionCallback()));
[email protected]0b2294d32013-08-02 00:46:36709 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
710 EXPECT_TRUE(stream);
711 EXPECT_EQ(ERR_IO_PENDING, stream->InitializeStream(
712 &request_info, DEFAULT_PRIORITY, net_log_, callback_.callback()));
713
714 // Close the first stream.
715 streams.front()->Close(false);
716
717 ASSERT_TRUE(callback_.have_result());
718
719 EXPECT_EQ(OK, callback_.WaitForResult());
720
721 EXPECT_TRUE(socket_data.at_read_eof());
722 EXPECT_TRUE(socket_data.at_write_eof());
723 STLDeleteElements(&streams);
724}
725
[email protected]1e960032013-12-20 19:00:20726TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
[email protected]0edce6a2013-05-08 18:02:40727 DeterministicSocketData socket_data(NULL, 0, NULL, 0);
[email protected]e13201d82012-12-12 05:00:32728 socket_factory_.AddSocketDataProvider(&socket_data);
729
[email protected]3c772402013-12-18 21:38:11730 host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName);
[email protected]e13201d82012-12-12 05:00:32731
732 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59733 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53734 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59735 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28736 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59737 "GET",
[email protected]974849d2014-02-06 01:32:59738 net_log_,
739 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32740
741 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
742
743 EXPECT_TRUE(socket_data.at_read_eof());
744 EXPECT_TRUE(socket_data.at_write_eof());
745}
746
[email protected]1e960032013-12-20 19:00:20747TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
[email protected]3c772402013-12-18 21:38:11748 MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
749 DeterministicSocketData socket_data(NULL, 0, NULL, 0);
750 socket_data.set_connect_data(connect);
751 socket_factory_.AddSocketDataProvider(&socket_data);
752 socket_data.StopAfter(1);
753
754 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59755 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53756 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59757 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28758 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59759 "GET",
[email protected]974849d2014-02-06 01:32:59760 net_log_,
761 callback_.callback()));
[email protected]3c772402013-12-18 21:38:11762
763 EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult());
764
765 EXPECT_TRUE(socket_data.at_read_eof());
766 EXPECT_TRUE(socket_data.at_write_eof());
767}
768
[email protected]1e960032013-12-20 19:00:20769TEST_P(QuicStreamFactoryTest, CancelCreate) {
[email protected]69dfd1b2013-06-04 22:20:12770 MockRead reads[] = {
[email protected]25c31dc2013-06-05 17:56:04771 MockRead(ASYNC, OK, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:12772 };
[email protected]25c31dc2013-06-05 17:56:04773 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
[email protected]e13201d82012-12-12 05:00:32774 socket_factory_.AddSocketDataProvider(&socket_data);
775 {
776 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59777 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53778 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59779 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28780 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59781 "GET",
[email protected]974849d2014-02-06 01:32:59782 net_log_,
783 callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32784 }
785
[email protected]25c31dc2013-06-05 17:56:04786 socket_data.StopAfter(1);
[email protected]e13201d82012-12-12 05:00:32787 base::RunLoop run_loop;
788 run_loop.RunUntilIdle();
789
790 scoped_ptr<QuicHttpStream> stream(
[email protected]bf4ea2f2014-03-10 22:57:53791 CreateIfSessionExists(host_port_pair_, net_log_));
[email protected]e13201d82012-12-12 05:00:32792 EXPECT_TRUE(stream.get());
793 stream.reset();
794
795 EXPECT_TRUE(socket_data.at_read_eof());
796 EXPECT_TRUE(socket_data.at_write_eof());
797}
798
[email protected]1e960032013-12-20 19:00:20799TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) {
[email protected]3c772402013-12-18 21:38:11800 // Sequentially connect to the default host, then another host, and then the
801 // default host. Verify that the default host gets a consistent ephemeral
802 // port, that is different from the other host's connection.
803
804 std::string other_server_name = "other.google.com";
805 EXPECT_NE(kDefaultServerHostName, other_server_name);
806 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort);
[email protected]3c772402013-12-18 21:38:11807
[email protected]bf4ea2f2014-03-10 22:57:53808 int original_port = GetSourcePortForNewSession(host_port_pair_);
809 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2));
810 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]3c772402013-12-18 21:38:11811}
812
[email protected]d8e2abf82014-03-06 10:30:10813TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) {
814 // Get a session to the host using the port suggester.
815 int original_port =
[email protected]bf4ea2f2014-03-10 22:57:53816 GetSourcePortForNewSessionAndGoAway(host_port_pair_);
[email protected]d8e2abf82014-03-06 10:30:10817 // Verify that the port is different after the goaway.
[email protected]bf4ea2f2014-03-10 22:57:53818 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:10819 // Since the previous session did not goaway we should see the original port.
[email protected]bf4ea2f2014-03-10 22:57:53820 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:10821}
822
[email protected]1e960032013-12-20 19:00:20823TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
[email protected]56dfb902013-01-03 23:17:55824 MockRead reads[] = {
[email protected]0edce6a2013-05-08 18:02:40825 MockRead(ASYNC, 0, 0) // EOF
[email protected]56dfb902013-01-03 23:17:55826 };
[email protected]459a7402014-02-10 12:58:52827 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
828 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:31829 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:52830 DeterministicSocketData socket_data(reads, arraysize(reads),
831 writes.empty() ? NULL : &writes[0],
832 writes.size());
[email protected]56dfb902013-01-03 23:17:55833 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0edce6a2013-05-08 18:02:40834 socket_data.StopAfter(1);
[email protected]56dfb902013-01-03 23:17:55835
[email protected]69dfd1b2013-06-04 22:20:12836 MockRead reads2[] = {
[email protected]25c31dc2013-06-05 17:56:04837 MockRead(ASYNC, 0, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:12838 };
[email protected]25c31dc2013-06-05 17:56:04839 DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0);
[email protected]56dfb902013-01-03 23:17:55840 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]0edce6a2013-05-08 18:02:40841 socket_data2.StopAfter(1);
[email protected]56dfb902013-01-03 23:17:55842
843 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59844 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53845 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59846 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28847 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59848 "GET",
[email protected]974849d2014-02-06 01:32:59849 net_log_,
850 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:55851
852 EXPECT_EQ(OK, callback_.WaitForResult());
853 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:36854 HttpRequestInfo request_info;
855 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
856 DEFAULT_PRIORITY,
857 net_log_, CompletionCallback()));
[email protected]56dfb902013-01-03 23:17:55858
859 // Close the session and verify that stream saw the error.
860 factory_.CloseAllSessions(ERR_INTERNET_DISCONNECTED);
861 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
862 stream->ReadResponseHeaders(callback_.callback()));
863
864 // Now attempting to request a stream to the same origin should create
865 // a new session.
866
867 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59868 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53869 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59870 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28871 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59872 "GET",
[email protected]974849d2014-02-06 01:32:59873 net_log_,
874 callback_.callback()));
[email protected]56dfb902013-01-03 23:17:55875
876 EXPECT_EQ(OK, callback_.WaitForResult());
877 stream = request2.ReleaseStream();
878 stream.reset(); // Will reset stream 3.
879
880 EXPECT_TRUE(socket_data.at_read_eof());
881 EXPECT_TRUE(socket_data.at_write_eof());
882 EXPECT_TRUE(socket_data2.at_read_eof());
883 EXPECT_TRUE(socket_data2.at_write_eof());
884}
885
[email protected]1e960032013-12-20 19:00:20886TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
[email protected]f698a012013-05-06 20:18:59887 MockRead reads[] = {
[email protected]0edce6a2013-05-08 18:02:40888 MockRead(ASYNC, 0, 0) // EOF
[email protected]f698a012013-05-06 20:18:59889 };
[email protected]459a7402014-02-10 12:58:52890 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
891 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:31892 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:52893 DeterministicSocketData socket_data(reads, arraysize(reads),
894 writes.empty() ? NULL : &writes[0],
895 writes.size());
[email protected]f698a012013-05-06 20:18:59896 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0edce6a2013-05-08 18:02:40897 socket_data.StopAfter(1);
[email protected]f698a012013-05-06 20:18:59898
[email protected]69dfd1b2013-06-04 22:20:12899 MockRead reads2[] = {
[email protected]25c31dc2013-06-05 17:56:04900 MockRead(ASYNC, 0, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:12901 };
[email protected]25c31dc2013-06-05 17:56:04902 DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0);
[email protected]f698a012013-05-06 20:18:59903 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]0edce6a2013-05-08 18:02:40904 socket_data2.StopAfter(1);
[email protected]f698a012013-05-06 20:18:59905
906 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59907 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53908 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59909 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28910 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59911 "GET",
[email protected]974849d2014-02-06 01:32:59912 net_log_,
913 callback_.callback()));
[email protected]f698a012013-05-06 20:18:59914
915 EXPECT_EQ(OK, callback_.WaitForResult());
916 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:36917 HttpRequestInfo request_info;
918 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
919 DEFAULT_PRIORITY,
920 net_log_, CompletionCallback()));
[email protected]f698a012013-05-06 20:18:59921
922 // Change the IP address and verify that stream saw the error.
923 factory_.OnIPAddressChanged();
924 EXPECT_EQ(ERR_NETWORK_CHANGED,
925 stream->ReadResponseHeaders(callback_.callback()));
[email protected]11c05872013-08-20 02:04:12926 EXPECT_TRUE(factory_.require_confirmation());
[email protected]f698a012013-05-06 20:18:59927
928 // Now attempting to request a stream to the same origin should create
929 // a new session.
930
931 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59932 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53933 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59934 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28935 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59936 "GET",
[email protected]974849d2014-02-06 01:32:59937 net_log_,
938 callback_.callback()));
[email protected]f698a012013-05-06 20:18:59939
940 EXPECT_EQ(OK, callback_.WaitForResult());
941 stream = request2.ReleaseStream();
942 stream.reset(); // Will reset stream 3.
943
944 EXPECT_TRUE(socket_data.at_read_eof());
945 EXPECT_TRUE(socket_data.at_write_eof());
946 EXPECT_TRUE(socket_data2.at_read_eof());
947 EXPECT_TRUE(socket_data2.at_write_eof());
948}
949
[email protected]1e960032013-12-20 19:00:20950TEST_P(QuicStreamFactoryTest, OnCertAdded) {
[email protected]d7d1e50b2013-11-25 22:08:09951 MockRead reads[] = {
952 MockRead(ASYNC, 0, 0) // EOF
953 };
[email protected]459a7402014-02-10 12:58:52954 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
955 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:31956 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:52957 DeterministicSocketData socket_data(reads, arraysize(reads),
958 writes.empty() ? NULL : &writes[0],
959 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:09960 socket_factory_.AddSocketDataProvider(&socket_data);
961 socket_data.StopAfter(1);
962
963 MockRead reads2[] = {
964 MockRead(ASYNC, 0, 0) // EOF
965 };
966 DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0);
967 socket_factory_.AddSocketDataProvider(&socket_data2);
968 socket_data2.StopAfter(1);
969
970 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:59971 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53972 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59973 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28974 privacy_mode_,
[email protected]974849d2014-02-06 01:32:59975 "GET",
[email protected]974849d2014-02-06 01:32:59976 net_log_,
977 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:09978
979 EXPECT_EQ(OK, callback_.WaitForResult());
980 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
981 HttpRequestInfo request_info;
982 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
983 DEFAULT_PRIORITY,
984 net_log_, CompletionCallback()));
985
986 // Add a cert and verify that stream saw the event.
987 factory_.OnCertAdded(NULL);
988 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
989 stream->ReadResponseHeaders(callback_.callback()));
990 EXPECT_FALSE(factory_.require_confirmation());
991
992 // Now attempting to request a stream to the same origin should create
993 // a new session.
994
995 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:59996 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:53997 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:59998 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:28999 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591000 "GET",
[email protected]974849d2014-02-06 01:32:591001 net_log_,
1002 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091003
1004 EXPECT_EQ(OK, callback_.WaitForResult());
1005 stream = request2.ReleaseStream();
1006 stream.reset(); // Will reset stream 3.
1007
1008 EXPECT_TRUE(socket_data.at_read_eof());
1009 EXPECT_TRUE(socket_data.at_write_eof());
1010 EXPECT_TRUE(socket_data2.at_read_eof());
1011 EXPECT_TRUE(socket_data2.at_write_eof());
1012}
1013
[email protected]1e960032013-12-20 19:00:201014TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
[email protected]d7d1e50b2013-11-25 22:08:091015 MockRead reads[] = {
1016 MockRead(ASYNC, 0, 0) // EOF
1017 };
[email protected]459a7402014-02-10 12:58:521018 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1019 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311020 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521021 DeterministicSocketData socket_data(reads, arraysize(reads),
1022 writes.empty() ? NULL : &writes[0],
1023 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:091024 socket_factory_.AddSocketDataProvider(&socket_data);
1025 socket_data.StopAfter(1);
1026
1027 MockRead reads2[] = {
1028 MockRead(ASYNC, 0, 0) // EOF
1029 };
1030 DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0);
1031 socket_factory_.AddSocketDataProvider(&socket_data2);
1032 socket_data2.StopAfter(1);
1033
1034 QuicStreamRequest request(&factory_);
[email protected]974849d2014-02-06 01:32:591035 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531036 request.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591037 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281038 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591039 "GET",
[email protected]974849d2014-02-06 01:32:591040 net_log_,
1041 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091042
1043 EXPECT_EQ(OK, callback_.WaitForResult());
1044 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1045 HttpRequestInfo request_info;
1046 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1047 DEFAULT_PRIORITY,
1048 net_log_, CompletionCallback()));
1049
1050 // Change the CA cert and verify that stream saw the event.
1051 factory_.OnCACertChanged(NULL);
1052 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1053 stream->ReadResponseHeaders(callback_.callback()));
1054 EXPECT_FALSE(factory_.require_confirmation());
1055
1056 // Now attempting to request a stream to the same origin should create
1057 // a new session.
1058
1059 QuicStreamRequest request2(&factory_);
[email protected]974849d2014-02-06 01:32:591060 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bf4ea2f2014-03-10 22:57:531061 request2.Request(host_port_pair_,
[email protected]974849d2014-02-06 01:32:591062 is_https_,
[email protected]9dd3ff0f2014-03-26 09:51:281063 privacy_mode_,
[email protected]974849d2014-02-06 01:32:591064 "GET",
[email protected]974849d2014-02-06 01:32:591065 net_log_,
1066 callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091067
1068 EXPECT_EQ(OK, callback_.WaitForResult());
1069 stream = request2.ReleaseStream();
1070 stream.reset(); // Will reset stream 3.
1071
1072 EXPECT_TRUE(socket_data.at_read_eof());
1073 EXPECT_TRUE(socket_data.at_write_eof());
1074 EXPECT_TRUE(socket_data2.at_read_eof());
1075 EXPECT_TRUE(socket_data2.at_write_eof());
1076}
1077
[email protected]1e960032013-12-20 19:00:201078TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
[email protected]6e12d702013-11-13 00:17:171079 vector<string> cannoncial_suffixes;
1080 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1081 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]c49ff182013-09-28 08:33:261082
[email protected]6e12d702013-11-13 00:17:171083 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1084 string r1_host_name("r1");
1085 string r2_host_name("r2");
1086 r1_host_name.append(cannoncial_suffixes[i]);
1087 r2_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141088
[email protected]bf4ea2f2014-03-10 22:57:531089 HostPortPair host_port_pair1(r1_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121090 QuicCryptoClientConfig* crypto_config =
1091 QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
[email protected]257f24f2014-04-01 09:15:371092 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171093 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371094 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171095 EXPECT_FALSE(cached1->proof_valid());
1096 EXPECT_TRUE(cached1->source_address_token().empty());
1097
1098 // Mutate the cached1 to have different data.
1099 // TODO(rtenneti): mutate other members of CachedState.
1100 cached1->set_source_address_token(r1_host_name);
1101 cached1->SetProofValid();
1102
[email protected]bf4ea2f2014-03-10 22:57:531103 HostPortPair host_port_pair2(r2_host_name, 80);
[email protected]257f24f2014-04-01 09:15:371104 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171105 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371106 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171107 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
1108 EXPECT_TRUE(cached2->proof_valid());
1109 }
[email protected]b70fdb792013-10-25 19:04:141110}
1111
[email protected]1e960032013-12-20 19:00:201112TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
[email protected]6e12d702013-11-13 00:17:171113 vector<string> cannoncial_suffixes;
1114 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1115 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]b70fdb792013-10-25 19:04:141116
[email protected]6e12d702013-11-13 00:17:171117 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1118 string r3_host_name("r3");
1119 string r4_host_name("r4");
1120 r3_host_name.append(cannoncial_suffixes[i]);
1121 r4_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141122
[email protected]bf4ea2f2014-03-10 22:57:531123 HostPortPair host_port_pair1(r3_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121124 QuicCryptoClientConfig* crypto_config =
1125 QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
[email protected]257f24f2014-04-01 09:15:371126 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171127 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371128 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171129 EXPECT_FALSE(cached1->proof_valid());
1130 EXPECT_TRUE(cached1->source_address_token().empty());
1131
1132 // Mutate the cached1 to have different data.
1133 // TODO(rtenneti): mutate other members of CachedState.
1134 cached1->set_source_address_token(r3_host_name);
1135 cached1->SetProofInvalid();
1136
[email protected]bf4ea2f2014-03-10 22:57:531137 HostPortPair host_port_pair2(r4_host_name, 80);
[email protected]257f24f2014-04-01 09:15:371138 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171139 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371140 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171141 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
1142 EXPECT_TRUE(cached2->source_address_token().empty());
1143 EXPECT_FALSE(cached2->proof_valid());
1144 }
[email protected]c49ff182013-09-28 08:33:261145}
1146
[email protected]e13201d82012-12-12 05:00:321147} // namespace test
[email protected]e13201d82012-12-12 05:00:321148} // namespace net