blob: 05234c0fc245d71a55d048cce750a670ec6e0e79 [file] [log] [blame]
James Robinson646469d2014-10-03 15:33:28 -07001// 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
7#include "base/run_loop.h"
8#include "base/strings/string_util.h"
9#include "net/base/test_data_directory.h"
10#include "net/cert/cert_verifier.h"
11#include "net/dns/mock_host_resolver.h"
12#include "net/http/http_response_headers.h"
13#include "net/http/http_response_info.h"
14#include "net/http/http_util.h"
15#include "net/http/transport_security_state.h"
16#include "net/quic/crypto/crypto_handshake.h"
17#include "net/quic/crypto/proof_verifier_chromium.h"
18#include "net/quic/crypto/quic_decrypter.h"
19#include "net/quic/crypto/quic_encrypter.h"
James Robinson53b77582014-10-28 17:00:48 -070020#include "net/quic/crypto/quic_server_info.h"
James Robinson646469d2014-10-03 15:33:28 -070021#include "net/quic/quic_http_stream.h"
22#include "net/quic/quic_server_id.h"
23#include "net/quic/test_tools/mock_clock.h"
24#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
25#include "net/quic/test_tools/mock_random.h"
26#include "net/quic/test_tools/quic_test_packet_maker.h"
27#include "net/quic/test_tools/quic_test_utils.h"
James Robinson53b77582014-10-28 17:00:48 -070028#include "net/quic/test_tools/test_task_runner.h"
James Robinson646469d2014-10-03 15:33:28 -070029#include "net/socket/socket_test_util.h"
30#include "net/spdy/spdy_test_utils.h"
31#include "net/ssl/channel_id_service.h"
32#include "net/ssl/default_channel_id_store.h"
33#include "net/test/cert_test_util.h"
34#include "testing/gtest/include/gtest/gtest.h"
35
36using base::StringPiece;
37using std::string;
38using std::vector;
39
40namespace net {
41namespace test {
42
43namespace {
44const char kDefaultServerHostName[] = "www.google.com";
45const int kDefaultServerPort = 443;
46} // namespace anonymous
47
48class QuicStreamFactoryPeer {
49 public:
50 static QuicCryptoClientConfig* GetCryptoConfig(QuicStreamFactory* factory) {
51 return &factory->crypto_config_;
52 }
53
54 static bool HasActiveSession(QuicStreamFactory* factory,
55 const HostPortPair& host_port_pair,
56 bool is_https) {
57 QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED);
58 return factory->HasActiveSession(server_id);
59 }
60
61 static QuicClientSession* GetActiveSession(
62 QuicStreamFactory* factory,
63 const HostPortPair& host_port_pair,
64 bool is_https) {
65 QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED);
66 DCHECK(factory->HasActiveSession(server_id));
67 return factory->active_sessions_[server_id];
68 }
69
70 static scoped_ptr<QuicHttpStream> CreateIfSessionExists(
71 QuicStreamFactory* factory,
72 const HostPortPair& host_port_pair,
73 bool is_https,
74 const BoundNetLog& net_log) {
75 QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED);
76 return factory->CreateIfSessionExists(server_id, net_log);
77 }
78
79 static bool IsLiveSession(QuicStreamFactory* factory,
80 QuicClientSession* session) {
81 for (QuicStreamFactory::SessionIdMap::iterator it =
82 factory->all_sessions_.begin();
83 it != factory->all_sessions_.end(); ++it) {
84 if (it->first == session)
85 return true;
86 }
87 return false;
88 }
89
90 static void DisableConnectionPooling(QuicStreamFactory* factory) {
91 factory->disable_connection_pooling_ = true;
92 }
James Robinson53b77582014-10-28 17:00:48 -070093
94 static void SetTaskRunner(QuicStreamFactory* factory,
95 base::TaskRunner* task_runner) {
96 factory->task_runner_ = task_runner;
97 }
98
99 static void SetLoadServerInfoTimeout(QuicStreamFactory* factory,
100 size_t load_server_info_timeout) {
101 factory->load_server_info_timeout_ms_ = load_server_info_timeout;
102 }
James Robinson646469d2014-10-03 15:33:28 -0700103};
104
James Robinson53b77582014-10-28 17:00:48 -0700105class MockQuicServerInfo : public QuicServerInfo {
106 public:
107 MockQuicServerInfo(const QuicServerId& server_id)
108 : QuicServerInfo(server_id) {}
109 virtual ~MockQuicServerInfo() {}
110
111 virtual void Start() override {};
112
113 virtual int WaitForDataReady(const CompletionCallback& callback) override {
114 return ERR_IO_PENDING;
115 }
116
117 virtual void CancelWaitForDataReadyCallback() override {}
118
119 virtual bool IsDataReady() override { return false; }
120
121 virtual bool IsReadyToPersist() override { return false; }
122
123 virtual void Persist() override {};
James Robinson6e9a1c92014-11-13 17:05:42 -0800124
125 virtual void OnExternalCacheHit() override {};
James Robinson53b77582014-10-28 17:00:48 -0700126};
127
128class MockQuicServerInfoFactory : public QuicServerInfoFactory {
129 public:
130 MockQuicServerInfoFactory() {}
131 virtual ~MockQuicServerInfoFactory() {}
132
133 virtual QuicServerInfo* GetForServer(const QuicServerId& server_id) override {
134 return new MockQuicServerInfo(server_id);
135 }
136};
137
138
James Robinson646469d2014-10-03 15:33:28 -0700139class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> {
140 protected:
141 QuicStreamFactoryTest()
142 : random_generator_(0),
143 clock_(new MockClock()),
James Robinson53b77582014-10-28 17:00:48 -0700144 runner_(new TestTaskRunner(clock_)),
James Robinson646469d2014-10-03 15:33:28 -0700145 maker_(GetParam(), 0, clock_),
146 cert_verifier_(CertVerifier::CreateDefault()),
147 channel_id_service_(
148 new ChannelIDService(new DefaultChannelIDStore(nullptr),
149 base::MessageLoopProxy::current())),
150 factory_(&host_resolver_,
151 &socket_factory_,
152 base::WeakPtr<HttpServerProperties>(),
153 cert_verifier_.get(),
154 channel_id_service_.get(),
155 &transport_security_state_,
156 &crypto_client_stream_factory_,
157 &random_generator_,
158 clock_,
159 kDefaultMaxPacketSize,
160 std::string(),
161 SupportedVersions(GetParam()),
162 /*enable_port_selection=*/true,
163 /*always_require_handshake_confirmation=*/false,
164 /*disable_connection_pooling=*/false,
James Robinson53b77582014-10-28 17:00:48 -0700165 /*load_server_info_timeout=*/0u,
James Robinson646469d2014-10-03 15:33:28 -0700166 QuicTagVector()),
167 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
168 is_https_(false),
169 privacy_mode_(PRIVACY_MODE_DISABLED) {
170 factory_.set_require_confirmation(false);
171 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
172 }
173
174 scoped_ptr<QuicHttpStream> CreateIfSessionExists(
175 const HostPortPair& host_port_pair,
176 const BoundNetLog& net_log) {
177 return QuicStreamFactoryPeer::CreateIfSessionExists(
178 &factory_, host_port_pair, false, net_log_);
179 }
180
181 int GetSourcePortForNewSession(const HostPortPair& destination) {
182 return GetSourcePortForNewSessionInner(destination, false);
183 }
184
185 int GetSourcePortForNewSessionAndGoAway(
186 const HostPortPair& destination) {
187 return GetSourcePortForNewSessionInner(destination, true);
188 }
189
190 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
191 bool goaway_received) {
192 // Should only be called if there is no active session for this destination.
193 EXPECT_EQ(nullptr, CreateIfSessionExists(destination, net_log_).get());
194 size_t socket_count = socket_factory_.udp_client_sockets().size();
195
196 MockRead reads[] = {
197 MockRead(ASYNC, OK, 0) // EOF
198 };
199 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
200 socket_data.StopAfter(1);
201 socket_factory_.AddSocketDataProvider(&socket_data);
202
203 QuicStreamRequest request(&factory_);
204 EXPECT_EQ(ERR_IO_PENDING,
205 request.Request(destination,
206 is_https_,
207 privacy_mode_,
208 "GET",
209 net_log_,
210 callback_.callback()));
211
212 EXPECT_EQ(OK, callback_.WaitForResult());
213 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
214 EXPECT_TRUE(stream.get());
215 stream.reset();
216
217 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
218 &factory_, destination, is_https_);
219
220 if (socket_count + 1 != socket_factory_.udp_client_sockets().size()) {
221 EXPECT_TRUE(false);
222 return 0;
223 }
224
225 IPEndPoint endpoint;
226 socket_factory_.
227 udp_client_sockets()[socket_count]->GetLocalAddress(&endpoint);
228 int port = endpoint.port();
229 if (goaway_received) {
230 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, "");
231 session->OnGoAway(goaway);
232 }
233
234 factory_.OnSessionClosed(session);
235 EXPECT_EQ(nullptr, CreateIfSessionExists(destination, net_log_).get());
236 EXPECT_TRUE(socket_data.at_read_eof());
237 EXPECT_TRUE(socket_data.at_write_eof());
238 return port;
239 }
240
241 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() {
242 QuicStreamId stream_id = kClientDataStreamId1;
243 return maker_.MakeRstPacket(
244 1, true, stream_id,
James Robinson1ae030a2014-11-07 08:32:47 -0800245 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam()));
James Robinson646469d2014-10-03 15:33:28 -0700246 }
247
James Robinson53b77582014-10-28 17:00:48 -0700248 MockQuicServerInfoFactory quic_server_info_factory_;
James Robinson646469d2014-10-03 15:33:28 -0700249 MockHostResolver host_resolver_;
250 DeterministicMockClientSocketFactory socket_factory_;
251 MockCryptoClientStreamFactory crypto_client_stream_factory_;
252 MockRandom random_generator_;
253 MockClock* clock_; // Owned by factory_.
James Robinson53b77582014-10-28 17:00:48 -0700254 scoped_refptr<TestTaskRunner> runner_;
James Robinson646469d2014-10-03 15:33:28 -0700255 QuicTestPacketMaker maker_;
256 scoped_ptr<CertVerifier> cert_verifier_;
257 scoped_ptr<ChannelIDService> channel_id_service_;
258 TransportSecurityState transport_security_state_;
259 QuicStreamFactory factory_;
260 HostPortPair host_port_pair_;
261 bool is_https_;
262 PrivacyMode privacy_mode_;
263 BoundNetLog net_log_;
264 TestCompletionCallback callback_;
265};
266
267INSTANTIATE_TEST_CASE_P(Version, QuicStreamFactoryTest,
268 ::testing::ValuesIn(QuicSupportedVersions()));
269
270TEST_P(QuicStreamFactoryTest, CreateIfSessionExists) {
271 EXPECT_EQ(nullptr, CreateIfSessionExists(host_port_pair_, net_log_).get());
272}
273
274TEST_P(QuicStreamFactoryTest, Create) {
275 MockRead reads[] = {
276 MockRead(ASYNC, OK, 0) // EOF
277 };
278 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
279 socket_factory_.AddSocketDataProvider(&socket_data);
280 socket_data.StopAfter(1);
281
282 QuicStreamRequest request(&factory_);
283 EXPECT_EQ(ERR_IO_PENDING,
284 request.Request(host_port_pair_,
285 is_https_,
286 privacy_mode_,
287 "GET",
288 net_log_,
289 callback_.callback()));
290
291 EXPECT_EQ(OK, callback_.WaitForResult());
292 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
293 EXPECT_TRUE(stream.get());
294
295 // Will reset stream 3.
296 stream = CreateIfSessionExists(host_port_pair_, net_log_);
297 EXPECT_TRUE(stream.get());
298
299 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
300 // in streams on different sessions.
301 QuicStreamRequest request2(&factory_);
302 EXPECT_EQ(OK,
303 request2.Request(host_port_pair_,
304 is_https_,
305 privacy_mode_,
306 "GET",
307 net_log_,
308 callback_.callback()));
309 stream = request2.ReleaseStream(); // Will reset stream 5.
310 stream.reset(); // Will reset stream 7.
311
312 EXPECT_TRUE(socket_data.at_read_eof());
313 EXPECT_TRUE(socket_data.at_write_eof());
314}
315
316TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
317 MockRead reads[] = {
318 MockRead(ASYNC, OK, 0) // EOF
319 };
320 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
321 socket_factory_.AddSocketDataProvider(&socket_data);
322 socket_data.StopAfter(1);
323
324 crypto_client_stream_factory_.set_handshake_mode(
325 MockCryptoClientStream::ZERO_RTT);
326 host_resolver_.set_synchronous_mode(true);
327 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
328 "192.168.0.1", "");
329
330 QuicStreamRequest request(&factory_);
331 EXPECT_EQ(OK,
332 request.Request(host_port_pair_,
333 is_https_,
334 privacy_mode_,
335 "GET",
336 net_log_,
337 callback_.callback()));
338
339 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
340 EXPECT_TRUE(stream.get());
341 EXPECT_TRUE(socket_data.at_read_eof());
342 EXPECT_TRUE(socket_data.at_write_eof());
343}
344
345TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
346 MockRead reads[] = {
347 MockRead(ASYNC, OK, 0) // EOF
348 };
349 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
350 socket_factory_.AddSocketDataProvider(&socket_data);
351 socket_data.StopAfter(1);
352
353 crypto_client_stream_factory_.set_handshake_mode(
354 MockCryptoClientStream::ZERO_RTT);
355 host_resolver_.set_synchronous_mode(true);
356 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
357 "192.168.0.1", "");
358
359 QuicStreamRequest request(&factory_);
360 // Posts require handshake confirmation, so this will return asynchronously.
361 EXPECT_EQ(ERR_IO_PENDING,
362 request.Request(host_port_pair_,
363 is_https_,
364 privacy_mode_,
365 "POST",
366 net_log_,
367 callback_.callback()));
368
369 // Confirm the handshake and verify that the stream is created.
370 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
371 QuicSession::HANDSHAKE_CONFIRMED);
372
373 EXPECT_EQ(OK, callback_.WaitForResult());
374 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
375 EXPECT_TRUE(stream.get());
376 EXPECT_TRUE(socket_data.at_read_eof());
377 EXPECT_TRUE(socket_data.at_write_eof());
378}
379
380TEST_P(QuicStreamFactoryTest, CreateHttpVsHttps) {
381 MockRead reads[] = {
382 MockRead(ASYNC, OK, 0) // EOF
383 };
384 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
385 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
386 socket_factory_.AddSocketDataProvider(&socket_data1);
387 socket_factory_.AddSocketDataProvider(&socket_data2);
388 socket_data1.StopAfter(1);
389 socket_data2.StopAfter(1);
390
391 QuicStreamRequest request(&factory_);
392 EXPECT_EQ(ERR_IO_PENDING,
393 request.Request(host_port_pair_,
394 is_https_,
395 privacy_mode_,
396 "GET",
397 net_log_,
398 callback_.callback()));
399
400 EXPECT_EQ(OK, callback_.WaitForResult());
401 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
402 EXPECT_TRUE(stream.get());
403
404 QuicStreamRequest request2(&factory_);
405 EXPECT_EQ(ERR_IO_PENDING,
406 request2.Request(host_port_pair_,
407 !is_https_,
408 privacy_mode_,
409 "GET",
410 net_log_,
411 callback_.callback()));
412 EXPECT_EQ(OK, callback_.WaitForResult());
413 stream = request2.ReleaseStream();
414 EXPECT_TRUE(stream.get());
415 stream.reset();
416
417 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
418 &factory_, host_port_pair_, is_https_),
419 QuicStreamFactoryPeer::GetActiveSession(
420 &factory_, host_port_pair_, !is_https_));
421
422 EXPECT_TRUE(socket_data1.at_read_eof());
423 EXPECT_TRUE(socket_data1.at_write_eof());
424 EXPECT_TRUE(socket_data2.at_read_eof());
425 EXPECT_TRUE(socket_data2.at_write_eof());
426}
427
428TEST_P(QuicStreamFactoryTest, Pooling) {
429 MockRead reads[] = {
430 MockRead(ASYNC, OK, 0) // EOF
431 };
432 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
433 socket_factory_.AddSocketDataProvider(&socket_data);
434 socket_data.StopAfter(1);
435
436 HostPortPair server2("mail.google.com", kDefaultServerPort);
437 host_resolver_.set_synchronous_mode(true);
438 host_resolver_.rules()->AddIPLiteralRule(
439 kDefaultServerHostName, "192.168.0.1", "");
440 host_resolver_.rules()->AddIPLiteralRule(
441 "mail.google.com", "192.168.0.1", "");
442
443 QuicStreamRequest request(&factory_);
444 EXPECT_EQ(OK,
445 request.Request(host_port_pair_,
446 is_https_,
447 privacy_mode_,
448 "GET",
449 net_log_,
450 callback_.callback()));
451 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
452 EXPECT_TRUE(stream.get());
453
454 TestCompletionCallback callback;
455 QuicStreamRequest request2(&factory_);
456 EXPECT_EQ(OK,
457 request2.Request(server2,
458 is_https_,
459 privacy_mode_,
460 "GET",
461 net_log_,
462 callback.callback()));
463 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
464 EXPECT_TRUE(stream2.get());
465
466 EXPECT_EQ(
467 QuicStreamFactoryPeer::GetActiveSession(
468 &factory_, host_port_pair_, is_https_),
469 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_));
470
471 EXPECT_TRUE(socket_data.at_read_eof());
472 EXPECT_TRUE(socket_data.at_write_eof());
473}
474
475TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) {
476 MockRead reads[] = {
477 MockRead(ASYNC, OK, 0) // EOF
478 };
479 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
480 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
481 socket_factory_.AddSocketDataProvider(&socket_data1);
482 socket_factory_.AddSocketDataProvider(&socket_data2);
483 socket_data1.StopAfter(1);
484 socket_data2.StopAfter(1);
485
486 HostPortPair server2("mail.google.com", kDefaultServerPort);
487 host_resolver_.set_synchronous_mode(true);
488 host_resolver_.rules()->AddIPLiteralRule(
489 kDefaultServerHostName, "192.168.0.1", "");
490 host_resolver_.rules()->AddIPLiteralRule(
491 "mail.google.com", "192.168.0.1", "");
492
493 // Disable connection pooling.
494 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
495
496 QuicStreamRequest request(&factory_);
497 EXPECT_EQ(OK,
498 request.Request(host_port_pair_,
499 is_https_,
500 privacy_mode_,
501 "GET",
502 net_log_,
503 callback_.callback()));
504 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
505 EXPECT_TRUE(stream.get());
506
507 TestCompletionCallback callback;
508 QuicStreamRequest request2(&factory_);
509 EXPECT_EQ(OK,
510 request2.Request(server2,
511 is_https_,
512 privacy_mode_,
513 "GET",
514 net_log_,
515 callback.callback()));
516 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
517 EXPECT_TRUE(stream2.get());
518
519 EXPECT_NE(
520 QuicStreamFactoryPeer::GetActiveSession(
521 &factory_, host_port_pair_, is_https_),
522 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_));
523
524 EXPECT_TRUE(socket_data1.at_read_eof());
525 EXPECT_TRUE(socket_data1.at_write_eof());
526 EXPECT_TRUE(socket_data2.at_read_eof());
527 EXPECT_TRUE(socket_data2.at_write_eof());
528}
529
530TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
531 MockRead reads[] = {
532 MockRead(ASYNC, OK, 0) // EOF
533 };
534 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
535 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
536 socket_factory_.AddSocketDataProvider(&socket_data1);
537 socket_factory_.AddSocketDataProvider(&socket_data2);
538 socket_data1.StopAfter(1);
539 socket_data2.StopAfter(1);
540
541 HostPortPair server2("mail.google.com", kDefaultServerPort);
542 host_resolver_.set_synchronous_mode(true);
543 host_resolver_.rules()->AddIPLiteralRule(
544 kDefaultServerHostName, "192.168.0.1", "");
545 host_resolver_.rules()->AddIPLiteralRule(
546 "mail.google.com", "192.168.0.1", "");
547
548 QuicStreamRequest request(&factory_);
549 EXPECT_EQ(OK,
550 request.Request(host_port_pair_,
551 is_https_,
552 privacy_mode_,
553 "GET",
554 net_log_,
555 callback_.callback()));
556 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
557 EXPECT_TRUE(stream.get());
558
559 TestCompletionCallback callback;
560 QuicStreamRequest request2(&factory_);
561 EXPECT_EQ(OK,
562 request2.Request(server2,
563 is_https_,
564 privacy_mode_,
565 "GET",
566 net_log_,
567 callback.callback()));
568 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
569 EXPECT_TRUE(stream2.get());
570
571 factory_.OnSessionGoingAway(QuicStreamFactoryPeer::GetActiveSession(
572 &factory_, host_port_pair_, is_https_));
573 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
574 &factory_, host_port_pair_, is_https_));
575 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
576 &factory_, server2, is_https_));
577
578 TestCompletionCallback callback3;
579 QuicStreamRequest request3(&factory_);
580 EXPECT_EQ(OK,
581 request3.Request(server2,
582 is_https_,
583 privacy_mode_,
584 "GET",
585 net_log_,
586 callback3.callback()));
587 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
588 EXPECT_TRUE(stream3.get());
589
590 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(
591 &factory_, server2, is_https_));
592
593 EXPECT_TRUE(socket_data1.at_read_eof());
594 EXPECT_TRUE(socket_data1.at_write_eof());
595 EXPECT_TRUE(socket_data2.at_read_eof());
596 EXPECT_TRUE(socket_data2.at_write_eof());
597}
598
599TEST_P(QuicStreamFactoryTest, HttpsPooling) {
600 MockRead reads[] = {
601 MockRead(ASYNC, OK, 0) // EOF
602 };
603 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
604 socket_factory_.AddSocketDataProvider(&socket_data);
605 socket_data.StopAfter(1);
606
607 HostPortPair server1("www.example.org", 443);
608 HostPortPair server2("mail.example.org", 443);
609
610 // Load a cert that is valid for:
611 // www.example.org (server1)
612 // mail.example.org (server2)
613 // www.example.com
614 base::FilePath certs_dir = GetTestCertsDirectory();
615 scoped_refptr<X509Certificate> test_cert(
616 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
617 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
618 ProofVerifyDetailsChromium verify_details;
619 verify_details.cert_verify_result.verified_cert = test_cert;
620 verify_details.cert_verify_result.is_issued_by_known_root = true;
621 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
622
623 host_resolver_.set_synchronous_mode(true);
624 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
625 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
626
627 QuicStreamRequest request(&factory_);
628 is_https_ = true;
629 EXPECT_EQ(OK,
630 request.Request(server1,
631 is_https_,
632 privacy_mode_,
633 "GET",
634 net_log_,
635 callback_.callback()));
636 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
637 EXPECT_TRUE(stream.get());
638
639 TestCompletionCallback callback;
640 QuicStreamRequest request2(&factory_);
641 EXPECT_EQ(OK,
642 request2.Request(server2,
643 is_https_,
644 privacy_mode_,
645 "GET",
646 net_log_,
647 callback_.callback()));
648 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
649 EXPECT_TRUE(stream2.get());
650
651 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
652 &factory_, server1, is_https_),
653 QuicStreamFactoryPeer::GetActiveSession(
654 &factory_, server2, is_https_));
655
656 EXPECT_TRUE(socket_data.at_read_eof());
657 EXPECT_TRUE(socket_data.at_write_eof());
658}
659
660TEST_P(QuicStreamFactoryTest, NoHttpsPoolingIfDisabled) {
661 MockRead reads[] = {
662 MockRead(ASYNC, OK, 0) // EOF
663 };
664 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
665 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
666 socket_factory_.AddSocketDataProvider(&socket_data1);
667 socket_factory_.AddSocketDataProvider(&socket_data2);
668 socket_data1.StopAfter(1);
669 socket_data2.StopAfter(1);
670
671 HostPortPair server1("www.example.org", 443);
672 HostPortPair server2("mail.example.org", 443);
673
674 // Load a cert that is valid for:
675 // www.example.org (server1)
676 // mail.example.org (server2)
677 // www.example.com
678 base::FilePath certs_dir = GetTestCertsDirectory();
679 scoped_refptr<X509Certificate> test_cert(
680 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
681 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
682 ProofVerifyDetailsChromium verify_details;
683 verify_details.cert_verify_result.verified_cert = test_cert;
684 verify_details.cert_verify_result.is_issued_by_known_root = true;
685 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
686
687 host_resolver_.set_synchronous_mode(true);
688 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
689 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
690
691 // Disable connection pooling.
692 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
693
694 QuicStreamRequest request(&factory_);
695 is_https_ = true;
696 EXPECT_EQ(OK,
697 request.Request(server1,
698 is_https_,
699 privacy_mode_,
700 "GET",
701 net_log_,
702 callback_.callback()));
703 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
704 EXPECT_TRUE(stream.get());
705
706 TestCompletionCallback callback;
707 QuicStreamRequest request2(&factory_);
708 EXPECT_EQ(OK,
709 request2.Request(server2,
710 is_https_,
711 privacy_mode_,
712 "GET",
713 net_log_,
714 callback_.callback()));
715 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
716 EXPECT_TRUE(stream2.get());
717
718 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
719 &factory_, server1, is_https_),
720 QuicStreamFactoryPeer::GetActiveSession(
721 &factory_, server2, is_https_));
722
723 EXPECT_TRUE(socket_data1.at_read_eof());
724 EXPECT_TRUE(socket_data1.at_write_eof());
725 EXPECT_TRUE(socket_data2.at_read_eof());
726 EXPECT_TRUE(socket_data2.at_write_eof());
727}
728
729TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithCertMismatch) {
730 MockRead reads[] = {
731 MockRead(ASYNC, OK, 0) // EOF
732 };
733 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
734 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
735 socket_factory_.AddSocketDataProvider(&socket_data1);
736 socket_factory_.AddSocketDataProvider(&socket_data2);
737 socket_data1.StopAfter(1);
738 socket_data2.StopAfter(1);
739
740 HostPortPair server1("www.example.org", 443);
741 HostPortPair server2("mail.google.com", 443);
742
743 // Load a cert that is valid for:
744 // www.example.org (server1)
745 // mail.example.org
746 // www.example.com
747 // But is not valid for mail.google.com (server2).
748 base::FilePath certs_dir = GetTestCertsDirectory();
749 scoped_refptr<X509Certificate> test_cert(
750 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
751 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
752 ProofVerifyDetailsChromium verify_details;
753 verify_details.cert_verify_result.verified_cert = test_cert;
754 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
755
756
757 host_resolver_.set_synchronous_mode(true);
758 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
759 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
760
761 QuicStreamRequest request(&factory_);
762 is_https_ = true;
763 EXPECT_EQ(OK,
764 request.Request(server1,
765 is_https_,
766 privacy_mode_,
767 "GET",
768 net_log_,
769 callback_.callback()));
770 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
771 EXPECT_TRUE(stream.get());
772
773 TestCompletionCallback callback;
774 QuicStreamRequest request2(&factory_);
775 EXPECT_EQ(OK,
776 request2.Request(server2,
777 is_https_,
778 privacy_mode_,
779 "GET",
780 net_log_,
781 callback_.callback()));
782 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
783 EXPECT_TRUE(stream2.get());
784
785 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
786 &factory_, server1, is_https_),
787 QuicStreamFactoryPeer::GetActiveSession(
788 &factory_, server2, is_https_));
789
790 EXPECT_TRUE(socket_data1.at_read_eof());
791 EXPECT_TRUE(socket_data1.at_write_eof());
792 EXPECT_TRUE(socket_data2.at_read_eof());
793 EXPECT_TRUE(socket_data2.at_write_eof());
794}
795
796TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
797 MockRead reads[] = {
798 MockRead(ASYNC, OK, 0) // EOF
799 };
800 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
801 socket_factory_.AddSocketDataProvider(&socket_data);
802 socket_data.StopAfter(1);
803
804 HostPortPair server1("www.example.org", 443);
805 HostPortPair server2("mail.example.org", 443);
806 uint8 primary_pin = 1;
807 uint8 backup_pin = 2;
808 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
809 backup_pin);
810
811 // Load a cert that is valid for:
812 // www.example.org (server1)
813 // mail.example.org (server2)
814 base::FilePath certs_dir = GetTestCertsDirectory();
815 scoped_refptr<X509Certificate> test_cert(
816 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
817 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
818 ProofVerifyDetailsChromium verify_details;
819 verify_details.cert_verify_result.verified_cert = test_cert;
820 verify_details.cert_verify_result.is_issued_by_known_root = true;
821 verify_details.cert_verify_result.public_key_hashes.push_back(
822 test::GetTestHashValue(primary_pin));
823 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
824
825
826 host_resolver_.set_synchronous_mode(true);
827 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
828 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
829
830 QuicStreamRequest request(&factory_);
831 is_https_ = true;
832 EXPECT_EQ(OK,
833 request.Request(server1,
834 is_https_,
835 privacy_mode_,
836 "GET",
837 net_log_,
838 callback_.callback()));
839 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
840 EXPECT_TRUE(stream.get());
841
842 TestCompletionCallback callback;
843 QuicStreamRequest request2(&factory_);
844 EXPECT_EQ(OK,
845 request2.Request(server2,
846 is_https_,
847 privacy_mode_,
848 "GET",
849 net_log_,
850 callback_.callback()));
851 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
852 EXPECT_TRUE(stream2.get());
853
854 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
855 &factory_, server1, is_https_),
856 QuicStreamFactoryPeer::GetActiveSession(
857 &factory_, server2, is_https_));
858
859 EXPECT_TRUE(socket_data.at_read_eof());
860 EXPECT_TRUE(socket_data.at_write_eof());
861}
862
863TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithMatchingPinsIfDisabled) {
864 MockRead reads[] = {
865 MockRead(ASYNC, OK, 0) // EOF
866 };
867 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
868 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
869 socket_factory_.AddSocketDataProvider(&socket_data1);
870 socket_factory_.AddSocketDataProvider(&socket_data2);
871 socket_data1.StopAfter(1);
872 socket_data2.StopAfter(1);
873
874 HostPortPair server1("www.example.org", 443);
875 HostPortPair server2("mail.example.org", 443);
876 uint8 primary_pin = 1;
877 uint8 backup_pin = 2;
878 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
879 backup_pin);
880
881 // Load a cert that is valid for:
882 // www.example.org (server1)
883 // mail.example.org (server2)
884 base::FilePath certs_dir = GetTestCertsDirectory();
885 scoped_refptr<X509Certificate> test_cert(
886 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
887 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
888 ProofVerifyDetailsChromium verify_details;
889 verify_details.cert_verify_result.verified_cert = test_cert;
890 verify_details.cert_verify_result.is_issued_by_known_root = true;
891 verify_details.cert_verify_result.public_key_hashes.push_back(
892 test::GetTestHashValue(primary_pin));
893 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
894
895
896 host_resolver_.set_synchronous_mode(true);
897 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
898 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
899
900 // Disable connection pooling.
901 QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
902
903 QuicStreamRequest request(&factory_);
904 is_https_ = true;
905 EXPECT_EQ(OK,
906 request.Request(server1,
907 is_https_,
908 privacy_mode_,
909 "GET",
910 net_log_,
911 callback_.callback()));
912 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
913 EXPECT_TRUE(stream.get());
914
915 TestCompletionCallback callback;
916 QuicStreamRequest request2(&factory_);
917 EXPECT_EQ(OK,
918 request2.Request(server2,
919 is_https_,
920 privacy_mode_,
921 "GET",
922 net_log_,
923 callback_.callback()));
924 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
925 EXPECT_TRUE(stream2.get());
926
927 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
928 &factory_, server1, is_https_),
929 QuicStreamFactoryPeer::GetActiveSession(
930 &factory_, server2, is_https_));
931
932 EXPECT_TRUE(socket_data1.at_read_eof());
933 EXPECT_TRUE(socket_data1.at_write_eof());
934 EXPECT_TRUE(socket_data2.at_read_eof());
935 EXPECT_TRUE(socket_data2.at_write_eof());
936}
937
938TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
939 MockRead reads[] = {
940 MockRead(ASYNC, OK, 0) // EOF
941 };
942 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
943 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
944 socket_factory_.AddSocketDataProvider(&socket_data1);
945 socket_factory_.AddSocketDataProvider(&socket_data2);
946 socket_data1.StopAfter(1);
947 socket_data2.StopAfter(1);
948
949 HostPortPair server1("www.example.org", 443);
950 HostPortPair server2("mail.example.org", 443);
951 uint8 primary_pin = 1;
952 uint8 backup_pin = 2;
953 uint8 bad_pin = 3;
954 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
955 backup_pin);
956
957 // Load a cert that is valid for:
958 // www.example.org (server1)
959 // mail.example.org (server2)
960 base::FilePath certs_dir = GetTestCertsDirectory();
961 scoped_refptr<X509Certificate> test_cert(
962 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
963 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
964 ProofVerifyDetailsChromium verify_details;
965 verify_details.cert_verify_result.verified_cert = test_cert;
966 verify_details.cert_verify_result.is_issued_by_known_root = true;
967 verify_details.cert_verify_result.public_key_hashes.push_back(
968 test::GetTestHashValue(bad_pin));
969 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
970
971
972 host_resolver_.set_synchronous_mode(true);
973 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
974 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
975
976 QuicStreamRequest request(&factory_);
977 is_https_ = true;
978 EXPECT_EQ(OK,
979 request.Request(server1,
980 is_https_,
981 privacy_mode_,
982 "GET",
983 net_log_,
984 callback_.callback()));
985 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
986 EXPECT_TRUE(stream.get());
987
988 TestCompletionCallback callback;
989 QuicStreamRequest request2(&factory_);
990 EXPECT_EQ(OK,
991 request2.Request(server2,
992 is_https_,
993 privacy_mode_,
994 "GET",
995 net_log_,
996 callback_.callback()));
997 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
998 EXPECT_TRUE(stream2.get());
999
1000 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
1001 &factory_, server1, is_https_),
1002 QuicStreamFactoryPeer::GetActiveSession(
1003 &factory_, server2, is_https_));
1004
1005 EXPECT_TRUE(socket_data1.at_read_eof());
1006 EXPECT_TRUE(socket_data1.at_write_eof());
1007 EXPECT_TRUE(socket_data2.at_read_eof());
1008 EXPECT_TRUE(socket_data2.at_write_eof());
1009}
1010
1011TEST_P(QuicStreamFactoryTest, Goaway) {
1012 MockRead reads[] = {
1013 MockRead(ASYNC, OK, 0) // EOF
1014 };
1015 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1016 socket_data.StopAfter(1);
1017 socket_factory_.AddSocketDataProvider(&socket_data);
1018 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
1019 socket_data2.StopAfter(1);
1020 socket_factory_.AddSocketDataProvider(&socket_data2);
1021
1022 QuicStreamRequest request(&factory_);
1023 EXPECT_EQ(ERR_IO_PENDING,
1024 request.Request(host_port_pair_,
1025 is_https_,
1026 privacy_mode_,
1027 "GET",
1028 net_log_,
1029 callback_.callback()));
1030
1031 EXPECT_EQ(OK, callback_.WaitForResult());
1032 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1033 EXPECT_TRUE(stream.get());
1034
1035 // Mark the session as going away. Ensure that while it is still alive
1036 // that it is no longer active.
1037 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
1038 &factory_, host_port_pair_, is_https_);
1039 factory_.OnSessionGoingAway(session);
1040 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
1041 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
1042 &factory_, host_port_pair_, is_https_));
1043 EXPECT_EQ(nullptr, CreateIfSessionExists(host_port_pair_, net_log_).get());
1044
1045 // Create a new request for the same destination and verify that a
1046 // new session is created.
1047 QuicStreamRequest request2(&factory_);
1048 EXPECT_EQ(ERR_IO_PENDING,
1049 request2.Request(host_port_pair_,
1050 is_https_,
1051 privacy_mode_,
1052 "GET",
1053 net_log_,
1054 callback_.callback()));
1055 EXPECT_EQ(OK, callback_.WaitForResult());
1056 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1057 EXPECT_TRUE(stream2.get());
1058
1059 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(&factory_,
1060 host_port_pair_,
1061 is_https_));
1062 EXPECT_NE(session,
1063 QuicStreamFactoryPeer::GetActiveSession(
1064 &factory_, host_port_pair_, is_https_));
1065 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
1066
1067 stream2.reset();
1068 stream.reset();
1069
1070 EXPECT_TRUE(socket_data.at_read_eof());
1071 EXPECT_TRUE(socket_data.at_write_eof());
1072 EXPECT_TRUE(socket_data2.at_read_eof());
1073 EXPECT_TRUE(socket_data2.at_write_eof());
1074}
1075
1076TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
1077 MockRead reads[] = {
1078 MockRead(ASYNC, OK, 0) // EOF
1079 };
1080 QuicStreamId stream_id = kClientDataStreamId1;
1081 scoped_ptr<QuicEncryptedPacket> rst(
1082 maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
1083 MockWrite writes[] = {
1084 MockWrite(ASYNC, rst->data(), rst->length(), 1),
1085 };
1086 DeterministicSocketData socket_data(reads, arraysize(reads),
1087 writes, arraysize(writes));
1088 socket_factory_.AddSocketDataProvider(&socket_data);
1089 socket_data.StopAfter(1);
1090
1091 HttpRequestInfo request_info;
1092 std::vector<QuicHttpStream*> streams;
1093 // The MockCryptoClientStream sets max_open_streams to be
1094 // 2 * kDefaultMaxStreamsPerConnection.
1095 for (size_t i = 0; i < 2 * kDefaultMaxStreamsPerConnection; i++) {
1096 QuicStreamRequest request(&factory_);
1097 int rv = request.Request(host_port_pair_,
1098 is_https_,
1099 privacy_mode_,
1100 "GET",
1101 net_log_,
1102 callback_.callback());
1103 if (i == 0) {
1104 EXPECT_EQ(ERR_IO_PENDING, rv);
1105 EXPECT_EQ(OK, callback_.WaitForResult());
1106 } else {
1107 EXPECT_EQ(OK, rv);
1108 }
1109 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1110 EXPECT_TRUE(stream);
1111 EXPECT_EQ(OK, stream->InitializeStream(
1112 &request_info, DEFAULT_PRIORITY, net_log_, CompletionCallback()));
1113 streams.push_back(stream.release());
1114 }
1115
1116 QuicStreamRequest request(&factory_);
1117 EXPECT_EQ(OK,
1118 request.Request(host_port_pair_,
1119 is_https_,
1120 privacy_mode_,
1121 "GET",
1122 net_log_,
1123 CompletionCallback()));
1124 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1125 EXPECT_TRUE(stream);
1126 EXPECT_EQ(ERR_IO_PENDING, stream->InitializeStream(
1127 &request_info, DEFAULT_PRIORITY, net_log_, callback_.callback()));
1128
1129 // Close the first stream.
1130 streams.front()->Close(false);
1131
1132 ASSERT_TRUE(callback_.have_result());
1133
1134 EXPECT_EQ(OK, callback_.WaitForResult());
1135
1136 EXPECT_TRUE(socket_data.at_read_eof());
1137 EXPECT_TRUE(socket_data.at_write_eof());
1138 STLDeleteElements(&streams);
1139}
1140
1141TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
1142 DeterministicSocketData socket_data(nullptr, 0, nullptr, 0);
1143 socket_factory_.AddSocketDataProvider(&socket_data);
1144
1145 host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName);
1146
1147 QuicStreamRequest request(&factory_);
1148 EXPECT_EQ(ERR_IO_PENDING,
1149 request.Request(host_port_pair_,
1150 is_https_,
1151 privacy_mode_,
1152 "GET",
1153 net_log_,
1154 callback_.callback()));
1155
1156 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
1157
1158 EXPECT_TRUE(socket_data.at_read_eof());
1159 EXPECT_TRUE(socket_data.at_write_eof());
1160}
1161
1162TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
1163 MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
1164 DeterministicSocketData socket_data(nullptr, 0, nullptr, 0);
1165 socket_data.set_connect_data(connect);
1166 socket_factory_.AddSocketDataProvider(&socket_data);
1167 socket_data.StopAfter(1);
1168
1169 QuicStreamRequest request(&factory_);
1170 EXPECT_EQ(ERR_IO_PENDING,
1171 request.Request(host_port_pair_,
1172 is_https_,
1173 privacy_mode_,
1174 "GET",
1175 net_log_,
1176 callback_.callback()));
1177
1178 EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult());
1179
1180 EXPECT_TRUE(socket_data.at_read_eof());
1181 EXPECT_TRUE(socket_data.at_write_eof());
1182}
1183
1184TEST_P(QuicStreamFactoryTest, CancelCreate) {
1185 MockRead reads[] = {
1186 MockRead(ASYNC, OK, 0) // EOF
1187 };
1188 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1189 socket_factory_.AddSocketDataProvider(&socket_data);
1190 {
1191 QuicStreamRequest request(&factory_);
1192 EXPECT_EQ(ERR_IO_PENDING,
1193 request.Request(host_port_pair_,
1194 is_https_,
1195 privacy_mode_,
1196 "GET",
1197 net_log_,
1198 callback_.callback()));
1199 }
1200
1201 socket_data.StopAfter(1);
1202 base::RunLoop run_loop;
1203 run_loop.RunUntilIdle();
1204
1205 scoped_ptr<QuicHttpStream> stream(
1206 CreateIfSessionExists(host_port_pair_, net_log_));
1207 EXPECT_TRUE(stream.get());
1208 stream.reset();
1209
1210 EXPECT_TRUE(socket_data.at_read_eof());
1211 EXPECT_TRUE(socket_data.at_write_eof());
1212}
1213
1214TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) {
1215 // Sequentially connect to the default host, then another host, and then the
1216 // default host. Verify that the default host gets a consistent ephemeral
1217 // port, that is different from the other host's connection.
1218
1219 std::string other_server_name = "other.google.com";
1220 EXPECT_NE(kDefaultServerHostName, other_server_name);
1221 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort);
1222
1223 int original_port = GetSourcePortForNewSession(host_port_pair_);
1224 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2));
1225 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
1226}
1227
1228TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) {
1229 // Get a session to the host using the port suggester.
1230 int original_port =
1231 GetSourcePortForNewSessionAndGoAway(host_port_pair_);
1232 // Verify that the port is different after the goaway.
1233 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_));
1234 // Since the previous session did not goaway we should see the original port.
1235 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
1236}
1237
1238TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
1239 MockRead reads[] = {
1240 MockRead(ASYNC, 0, 0) // EOF
1241 };
1242 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1243 std::vector<MockWrite> writes;
1244 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
1245 DeterministicSocketData socket_data(reads, arraysize(reads),
1246 writes.empty() ? nullptr : &writes[0],
1247 writes.size());
1248 socket_factory_.AddSocketDataProvider(&socket_data);
1249 socket_data.StopAfter(1);
1250
1251 MockRead reads2[] = {
1252 MockRead(ASYNC, 0, 0) // EOF
1253 };
1254 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1255 socket_factory_.AddSocketDataProvider(&socket_data2);
1256 socket_data2.StopAfter(1);
1257
1258 QuicStreamRequest request(&factory_);
1259 EXPECT_EQ(ERR_IO_PENDING,
1260 request.Request(host_port_pair_,
1261 is_https_,
1262 privacy_mode_,
1263 "GET",
1264 net_log_,
1265 callback_.callback()));
1266
1267 EXPECT_EQ(OK, callback_.WaitForResult());
1268 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1269 HttpRequestInfo request_info;
1270 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1271 DEFAULT_PRIORITY,
1272 net_log_, CompletionCallback()));
1273
1274 // Close the session and verify that stream saw the error.
1275 factory_.CloseAllSessions(ERR_INTERNET_DISCONNECTED);
1276 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1277 stream->ReadResponseHeaders(callback_.callback()));
1278
1279 // Now attempting to request a stream to the same origin should create
1280 // a new session.
1281
1282 QuicStreamRequest request2(&factory_);
1283 EXPECT_EQ(ERR_IO_PENDING,
1284 request2.Request(host_port_pair_,
1285 is_https_,
1286 privacy_mode_,
1287 "GET",
1288 net_log_,
1289 callback_.callback()));
1290
1291 EXPECT_EQ(OK, callback_.WaitForResult());
1292 stream = request2.ReleaseStream();
1293 stream.reset(); // Will reset stream 3.
1294
1295 EXPECT_TRUE(socket_data.at_read_eof());
1296 EXPECT_TRUE(socket_data.at_write_eof());
1297 EXPECT_TRUE(socket_data2.at_read_eof());
1298 EXPECT_TRUE(socket_data2.at_write_eof());
1299}
1300
1301TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
1302 MockRead reads[] = {
1303 MockRead(ASYNC, 0, 0) // EOF
1304 };
1305 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1306 std::vector<MockWrite> writes;
1307 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
1308 DeterministicSocketData socket_data(reads, arraysize(reads),
1309 writes.empty() ? nullptr : &writes[0],
1310 writes.size());
1311 socket_factory_.AddSocketDataProvider(&socket_data);
1312 socket_data.StopAfter(1);
1313
1314 MockRead reads2[] = {
1315 MockRead(ASYNC, 0, 0) // EOF
1316 };
1317 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1318 socket_factory_.AddSocketDataProvider(&socket_data2);
1319 socket_data2.StopAfter(1);
1320
1321 QuicStreamRequest request(&factory_);
1322 EXPECT_EQ(ERR_IO_PENDING,
1323 request.Request(host_port_pair_,
1324 is_https_,
1325 privacy_mode_,
1326 "GET",
1327 net_log_,
1328 callback_.callback()));
1329
1330 EXPECT_EQ(OK, callback_.WaitForResult());
1331 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1332 HttpRequestInfo request_info;
1333 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1334 DEFAULT_PRIORITY,
1335 net_log_, CompletionCallback()));
1336
1337 // Change the IP address and verify that stream saw the error.
1338 factory_.OnIPAddressChanged();
1339 EXPECT_EQ(ERR_NETWORK_CHANGED,
1340 stream->ReadResponseHeaders(callback_.callback()));
1341 EXPECT_TRUE(factory_.require_confirmation());
1342
1343 // Now attempting to request a stream to the same origin should create
1344 // a new session.
1345
1346 QuicStreamRequest request2(&factory_);
1347 EXPECT_EQ(ERR_IO_PENDING,
1348 request2.Request(host_port_pair_,
1349 is_https_,
1350 privacy_mode_,
1351 "GET",
1352 net_log_,
1353 callback_.callback()));
1354
1355 EXPECT_EQ(OK, callback_.WaitForResult());
1356 stream = request2.ReleaseStream();
1357 stream.reset(); // Will reset stream 3.
1358
1359 EXPECT_TRUE(socket_data.at_read_eof());
1360 EXPECT_TRUE(socket_data.at_write_eof());
1361 EXPECT_TRUE(socket_data2.at_read_eof());
1362 EXPECT_TRUE(socket_data2.at_write_eof());
1363}
1364
1365TEST_P(QuicStreamFactoryTest, OnCertAdded) {
1366 MockRead reads[] = {
1367 MockRead(ASYNC, 0, 0) // EOF
1368 };
1369 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1370 std::vector<MockWrite> writes;
1371 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
1372 DeterministicSocketData socket_data(reads, arraysize(reads),
1373 writes.empty() ? nullptr : &writes[0],
1374 writes.size());
1375 socket_factory_.AddSocketDataProvider(&socket_data);
1376 socket_data.StopAfter(1);
1377
1378 MockRead reads2[] = {
1379 MockRead(ASYNC, 0, 0) // EOF
1380 };
1381 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1382 socket_factory_.AddSocketDataProvider(&socket_data2);
1383 socket_data2.StopAfter(1);
1384
1385 QuicStreamRequest request(&factory_);
1386 EXPECT_EQ(ERR_IO_PENDING,
1387 request.Request(host_port_pair_,
1388 is_https_,
1389 privacy_mode_,
1390 "GET",
1391 net_log_,
1392 callback_.callback()));
1393
1394 EXPECT_EQ(OK, callback_.WaitForResult());
1395 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1396 HttpRequestInfo request_info;
1397 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1398 DEFAULT_PRIORITY,
1399 net_log_, CompletionCallback()));
1400
1401 // Add a cert and verify that stream saw the event.
1402 factory_.OnCertAdded(nullptr);
1403 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1404 stream->ReadResponseHeaders(callback_.callback()));
1405 EXPECT_FALSE(factory_.require_confirmation());
1406
1407 // Now attempting to request a stream to the same origin should create
1408 // a new session.
1409
1410 QuicStreamRequest request2(&factory_);
1411 EXPECT_EQ(ERR_IO_PENDING,
1412 request2.Request(host_port_pair_,
1413 is_https_,
1414 privacy_mode_,
1415 "GET",
1416 net_log_,
1417 callback_.callback()));
1418
1419 EXPECT_EQ(OK, callback_.WaitForResult());
1420 stream = request2.ReleaseStream();
1421 stream.reset(); // Will reset stream 3.
1422
1423 EXPECT_TRUE(socket_data.at_read_eof());
1424 EXPECT_TRUE(socket_data.at_write_eof());
1425 EXPECT_TRUE(socket_data2.at_read_eof());
1426 EXPECT_TRUE(socket_data2.at_write_eof());
1427}
1428
1429TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
1430 MockRead reads[] = {
1431 MockRead(ASYNC, 0, 0) // EOF
1432 };
1433 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1434 std::vector<MockWrite> writes;
1435 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
1436 DeterministicSocketData socket_data(reads, arraysize(reads),
1437 writes.empty() ? nullptr : &writes[0],
1438 writes.size());
1439 socket_factory_.AddSocketDataProvider(&socket_data);
1440 socket_data.StopAfter(1);
1441
1442 MockRead reads2[] = {
1443 MockRead(ASYNC, 0, 0) // EOF
1444 };
1445 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1446 socket_factory_.AddSocketDataProvider(&socket_data2);
1447 socket_data2.StopAfter(1);
1448
1449 QuicStreamRequest request(&factory_);
1450 EXPECT_EQ(ERR_IO_PENDING,
1451 request.Request(host_port_pair_,
1452 is_https_,
1453 privacy_mode_,
1454 "GET",
1455 net_log_,
1456 callback_.callback()));
1457
1458 EXPECT_EQ(OK, callback_.WaitForResult());
1459 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1460 HttpRequestInfo request_info;
1461 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1462 DEFAULT_PRIORITY,
1463 net_log_, CompletionCallback()));
1464
1465 // Change the CA cert and verify that stream saw the event.
1466 factory_.OnCACertChanged(nullptr);
1467 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1468 stream->ReadResponseHeaders(callback_.callback()));
1469 EXPECT_FALSE(factory_.require_confirmation());
1470
1471 // Now attempting to request a stream to the same origin should create
1472 // a new session.
1473
1474 QuicStreamRequest request2(&factory_);
1475 EXPECT_EQ(ERR_IO_PENDING,
1476 request2.Request(host_port_pair_,
1477 is_https_,
1478 privacy_mode_,
1479 "GET",
1480 net_log_,
1481 callback_.callback()));
1482
1483 EXPECT_EQ(OK, callback_.WaitForResult());
1484 stream = request2.ReleaseStream();
1485 stream.reset(); // Will reset stream 3.
1486
1487 EXPECT_TRUE(socket_data.at_read_eof());
1488 EXPECT_TRUE(socket_data.at_write_eof());
1489 EXPECT_TRUE(socket_data2.at_read_eof());
1490 EXPECT_TRUE(socket_data2.at_write_eof());
1491}
1492
1493TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
1494 vector<string> cannoncial_suffixes;
1495 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1496 cannoncial_suffixes.push_back(string(".googlevideo.com"));
1497
1498 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1499 string r1_host_name("r1");
1500 string r2_host_name("r2");
1501 r1_host_name.append(cannoncial_suffixes[i]);
1502 r2_host_name.append(cannoncial_suffixes[i]);
1503
1504 HostPortPair host_port_pair1(r1_host_name, 80);
1505 QuicCryptoClientConfig* crypto_config =
1506 QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
1507 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
1508 QuicCryptoClientConfig::CachedState* cached1 =
1509 crypto_config->LookupOrCreate(server_id1);
1510 EXPECT_FALSE(cached1->proof_valid());
1511 EXPECT_TRUE(cached1->source_address_token().empty());
1512
1513 // Mutate the cached1 to have different data.
1514 // TODO(rtenneti): mutate other members of CachedState.
1515 cached1->set_source_address_token(r1_host_name);
1516 cached1->SetProofValid();
1517
1518 HostPortPair host_port_pair2(r2_host_name, 80);
1519 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
1520 QuicCryptoClientConfig::CachedState* cached2 =
1521 crypto_config->LookupOrCreate(server_id2);
1522 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
1523 EXPECT_TRUE(cached2->proof_valid());
1524 }
1525}
1526
1527TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
1528 vector<string> cannoncial_suffixes;
1529 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1530 cannoncial_suffixes.push_back(string(".googlevideo.com"));
1531
1532 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1533 string r3_host_name("r3");
1534 string r4_host_name("r4");
1535 r3_host_name.append(cannoncial_suffixes[i]);
1536 r4_host_name.append(cannoncial_suffixes[i]);
1537
1538 HostPortPair host_port_pair1(r3_host_name, 80);
1539 QuicCryptoClientConfig* crypto_config =
1540 QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
1541 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
1542 QuicCryptoClientConfig::CachedState* cached1 =
1543 crypto_config->LookupOrCreate(server_id1);
1544 EXPECT_FALSE(cached1->proof_valid());
1545 EXPECT_TRUE(cached1->source_address_token().empty());
1546
1547 // Mutate the cached1 to have different data.
1548 // TODO(rtenneti): mutate other members of CachedState.
1549 cached1->set_source_address_token(r3_host_name);
1550 cached1->SetProofInvalid();
1551
1552 HostPortPair host_port_pair2(r4_host_name, 80);
1553 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
1554 QuicCryptoClientConfig::CachedState* cached2 =
1555 crypto_config->LookupOrCreate(server_id2);
1556 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
1557 EXPECT_TRUE(cached2->source_address_token().empty());
1558 EXPECT_FALSE(cached2->proof_valid());
1559 }
1560}
1561
James Robinson53b77582014-10-28 17:00:48 -07001562TEST_P(QuicStreamFactoryTest, CancelWaitForDataReady) {
1563 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
1564 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
1565 const size_t kLoadServerInfoTimeoutMs = 50;
1566 QuicStreamFactoryPeer::SetLoadServerInfoTimeout(
1567 &factory_, kLoadServerInfoTimeoutMs);
1568
1569 MockRead reads[] = {
1570 MockRead(ASYNC, OK, 0) // EOF
1571 };
1572 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1573 socket_factory_.AddSocketDataProvider(&socket_data);
1574 socket_data.StopAfter(1);
1575
1576 crypto_client_stream_factory_.set_handshake_mode(
1577 MockCryptoClientStream::ZERO_RTT);
1578 host_resolver_.set_synchronous_mode(true);
1579 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1580 "192.168.0.1", "");
1581
1582 QuicStreamRequest request(&factory_);
1583 EXPECT_EQ(ERR_IO_PENDING,
1584 request.Request(host_port_pair_,
1585 is_https_,
1586 privacy_mode_,
1587 "GET",
1588 net_log_,
1589 callback_.callback()));
1590
1591 // Verify that the CancelWaitForDataReady task has been posted.
1592 ASSERT_EQ(1u, runner_->GetPostedTasks().size());
1593 EXPECT_EQ(base::TimeDelta::FromMilliseconds(kLoadServerInfoTimeoutMs),
1594 runner_->GetPostedTasks()[0].delay);
1595
1596 runner_->RunNextTask();
1597 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
1598
1599 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1600 EXPECT_TRUE(stream.get());
1601 EXPECT_TRUE(socket_data.at_read_eof());
1602 EXPECT_TRUE(socket_data.at_write_eof());
1603}
1604
James Robinson646469d2014-10-03 15:33:28 -07001605} // namespace test
1606} // namespace net