1 // 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.
5 #include "net/quic/quic_stream_factory.h"
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/quic/crypto/crypto_handshake.h"
16 #include "net/quic/crypto/proof_verifier_chromium.h"
17 #include "net/quic/crypto/quic_decrypter.h"
18 #include "net/quic/crypto/quic_encrypter.h"
19 #include "net/quic/quic_http_stream.h"
20 #include "net/quic/quic_session_key.h"
21 #include "net/quic/test_tools/mock_clock.h"
22 #include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
23 #include "net/quic/test_tools/mock_random.h"
24 #include "net/quic/test_tools/quic_test_packet_maker.h"
25 #include "net/quic/test_tools/quic_test_utils.h"
26 #include "net/socket/socket_test_util.h"
27 #include "net/test/cert_test_util.h"
28 #include "testing/gtest/include/gtest/gtest.h"
30 using base::StringPiece;
38 const char kDefaultServerHostName[] = "www.google.com";
39 const int kDefaultServerPort = 443;
40 } // namespace anonymous
42 class QuicStreamFactoryPeer {
44 static QuicCryptoClientConfig* GetCryptoConfig(QuicStreamFactory* factory) {
45 return &factory->crypto_config_;
48 static bool HasActiveSession(QuicStreamFactory* factory,
49 const HostPortPair& host_port_pair,
51 QuicSessionKey server_key(host_port_pair, is_https, kPrivacyModeDisabled);
52 return factory->HasActiveSession(server_key);
55 static QuicClientSession* GetActiveSession(
56 QuicStreamFactory* factory,
57 const HostPortPair& host_port_pair,
59 QuicSessionKey server_key(host_port_pair, is_https, kPrivacyModeDisabled);
60 DCHECK(factory->HasActiveSession(server_key));
61 return factory->active_sessions_[server_key];
64 static scoped_ptr<QuicHttpStream> CreateIfSessionExists(
65 QuicStreamFactory* factory,
66 const HostPortPair& host_port_pair,
68 const BoundNetLog& net_log) {
69 QuicSessionKey server_key(host_port_pair, is_https, kPrivacyModeDisabled);
70 return factory->CreateIfSessionExists(server_key, net_log);
73 static bool IsLiveSession(QuicStreamFactory* factory,
74 QuicClientSession* session) {
75 for (QuicStreamFactory::SessionSet::iterator it =
76 factory->all_sessions_.begin();
77 it != factory->all_sessions_.end(); ++it) {
85 class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> {
87 QuicStreamFactoryTest()
88 : random_generator_(0),
89 maker_(GetParam(), 0),
90 clock_(new MockClock()),
91 cert_verifier_(CertVerifier::CreateDefault()),
92 factory_(&host_resolver_, &socket_factory_,
93 base::WeakPtr<HttpServerProperties>(),
95 &crypto_client_stream_factory_,
96 &random_generator_, clock_, kDefaultMaxPacketSize,
97 SupportedVersions(GetParam()), true, true),
98 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
100 privacy_mode_(kPrivacyModeDisabled) {
101 factory_.set_require_confirmation(false);
104 scoped_ptr<QuicHttpStream> CreateIfSessionExists(
105 const HostPortPair& host_port_pair,
106 const BoundNetLog& net_log) {
107 return QuicStreamFactoryPeer::CreateIfSessionExists(
108 &factory_, host_port_pair, false, net_log_);
111 int GetSourcePortForNewSession(const HostPortPair& destination) {
112 return GetSourcePortForNewSessionInner(destination, false);
115 int GetSourcePortForNewSessionAndGoAway(
116 const HostPortPair& destination) {
117 return GetSourcePortForNewSessionInner(destination, true);
120 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
121 bool goaway_received) {
122 // Should only be called if there is no active session for this destination.
123 EXPECT_EQ(NULL, CreateIfSessionExists(destination, net_log_).get());
124 size_t socket_count = socket_factory_.udp_client_sockets().size();
127 MockRead(ASYNC, OK, 0) // EOF
129 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
130 socket_data.StopAfter(1);
131 socket_factory_.AddSocketDataProvider(&socket_data);
133 QuicStreamRequest request(&factory_);
134 EXPECT_EQ(ERR_IO_PENDING,
135 request.Request(destination,
140 callback_.callback()));
142 EXPECT_EQ(OK, callback_.WaitForResult());
143 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
144 EXPECT_TRUE(stream.get());
147 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
148 &factory_, destination, is_https_);
150 if (socket_count + 1 != socket_factory_.udp_client_sockets().size()) {
157 udp_client_sockets()[socket_count]->GetLocalAddress(&endpoint);
158 int port = endpoint.port();
159 if (goaway_received) {
160 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, "");
161 session->OnGoAway(goaway);
164 factory_.OnSessionClosed(session);
165 EXPECT_EQ(NULL, CreateIfSessionExists(destination, net_log_).get());
166 EXPECT_TRUE(socket_data.at_read_eof());
167 EXPECT_TRUE(socket_data.at_write_eof());
171 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() {
172 QuicStreamId stream_id = 5;
173 return maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_NO_ERROR);
176 MockHostResolver host_resolver_;
177 DeterministicMockClientSocketFactory socket_factory_;
178 MockCryptoClientStreamFactory crypto_client_stream_factory_;
179 MockRandom random_generator_;
180 QuicTestPacketMaker maker_;
181 MockClock* clock_; // Owned by factory_.
182 scoped_ptr<CertVerifier> cert_verifier_;
183 QuicStreamFactory factory_;
184 HostPortPair host_port_pair_;
186 PrivacyMode privacy_mode_;
187 BoundNetLog net_log_;
188 TestCompletionCallback callback_;
191 INSTANTIATE_TEST_CASE_P(Version, QuicStreamFactoryTest,
192 ::testing::ValuesIn(QuicSupportedVersions()));
194 TEST_P(QuicStreamFactoryTest, CreateIfSessionExists) {
195 EXPECT_EQ(NULL, CreateIfSessionExists(host_port_pair_, net_log_).get());
198 TEST_P(QuicStreamFactoryTest, Create) {
200 MockRead(ASYNC, OK, 0) // EOF
202 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
203 socket_factory_.AddSocketDataProvider(&socket_data);
204 socket_data.StopAfter(1);
206 QuicStreamRequest request(&factory_);
207 EXPECT_EQ(ERR_IO_PENDING,
208 request.Request(host_port_pair_,
213 callback_.callback()));
215 EXPECT_EQ(OK, callback_.WaitForResult());
216 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
217 EXPECT_TRUE(stream.get());
219 // Will reset stream 3.
220 stream = CreateIfSessionExists(host_port_pair_, net_log_);
221 EXPECT_TRUE(stream.get());
223 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
224 // in streams on different sessions.
225 QuicStreamRequest request2(&factory_);
227 request2.Request(host_port_pair_,
232 callback_.callback()));
233 stream = request2.ReleaseStream(); // Will reset stream 5.
234 stream.reset(); // Will reset stream 7.
236 EXPECT_TRUE(socket_data.at_read_eof());
237 EXPECT_TRUE(socket_data.at_write_eof());
240 TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
242 MockRead(ASYNC, OK, 0) // EOF
244 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
245 socket_factory_.AddSocketDataProvider(&socket_data);
246 socket_data.StopAfter(1);
248 crypto_client_stream_factory_.set_handshake_mode(
249 MockCryptoClientStream::ZERO_RTT);
250 host_resolver_.set_synchronous_mode(true);
251 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
254 QuicStreamRequest request(&factory_);
256 request.Request(host_port_pair_,
261 callback_.callback()));
263 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
264 EXPECT_TRUE(stream.get());
265 EXPECT_TRUE(socket_data.at_read_eof());
266 EXPECT_TRUE(socket_data.at_write_eof());
269 TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
271 MockRead(ASYNC, OK, 0) // EOF
273 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
274 socket_factory_.AddSocketDataProvider(&socket_data);
275 socket_data.StopAfter(1);
277 crypto_client_stream_factory_.set_handshake_mode(
278 MockCryptoClientStream::ZERO_RTT);
279 host_resolver_.set_synchronous_mode(true);
280 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
283 QuicStreamRequest request(&factory_);
284 // Posts require handshake confirmation, so this will return asynchronously.
285 EXPECT_EQ(ERR_IO_PENDING,
286 request.Request(host_port_pair_,
291 callback_.callback()));
293 // Confirm the handshake and verify that the stream is created.
294 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
295 QuicSession::HANDSHAKE_CONFIRMED);
297 EXPECT_EQ(OK, callback_.WaitForResult());
298 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
299 EXPECT_TRUE(stream.get());
300 EXPECT_TRUE(socket_data.at_read_eof());
301 EXPECT_TRUE(socket_data.at_write_eof());
304 TEST_P(QuicStreamFactoryTest, CreateHttpVsHttps) {
306 MockRead(ASYNC, OK, 0) // EOF
308 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0);
309 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
310 socket_factory_.AddSocketDataProvider(&socket_data1);
311 socket_factory_.AddSocketDataProvider(&socket_data2);
312 socket_data1.StopAfter(1);
313 socket_data2.StopAfter(1);
315 QuicStreamRequest request(&factory_);
316 EXPECT_EQ(ERR_IO_PENDING,
317 request.Request(host_port_pair_,
322 callback_.callback()));
324 EXPECT_EQ(OK, callback_.WaitForResult());
325 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
326 EXPECT_TRUE(stream.get());
328 QuicStreamRequest request2(&factory_);
329 EXPECT_EQ(ERR_IO_PENDING,
330 request2.Request(host_port_pair_,
335 callback_.callback()));
336 EXPECT_EQ(OK, callback_.WaitForResult());
337 stream = request2.ReleaseStream();
338 EXPECT_TRUE(stream.get());
341 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
342 &factory_, host_port_pair_, is_https_),
343 QuicStreamFactoryPeer::GetActiveSession(
344 &factory_, host_port_pair_, !is_https_));
346 EXPECT_TRUE(socket_data1.at_read_eof());
347 EXPECT_TRUE(socket_data1.at_write_eof());
348 EXPECT_TRUE(socket_data2.at_read_eof());
349 EXPECT_TRUE(socket_data2.at_write_eof());
352 TEST_P(QuicStreamFactoryTest, Pooling) {
354 MockRead(ASYNC, OK, 0) // EOF
356 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
357 socket_factory_.AddSocketDataProvider(&socket_data);
358 socket_data.StopAfter(1);
360 HostPortPair server2("mail.google.com", kDefaultServerPort);
361 host_resolver_.set_synchronous_mode(true);
362 host_resolver_.rules()->AddIPLiteralRule(
363 kDefaultServerHostName, "192.168.0.1", "");
364 host_resolver_.rules()->AddIPLiteralRule(
365 "mail.google.com", "192.168.0.1", "");
367 QuicStreamRequest request(&factory_);
369 request.Request(host_port_pair_,
374 callback_.callback()));
375 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
376 EXPECT_TRUE(stream.get());
378 TestCompletionCallback callback;
379 QuicStreamRequest request2(&factory_);
381 request2.Request(server2,
386 callback.callback()));
387 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
388 EXPECT_TRUE(stream2.get());
391 QuicStreamFactoryPeer::GetActiveSession(
392 &factory_, host_port_pair_, is_https_),
393 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_));
395 EXPECT_TRUE(socket_data.at_read_eof());
396 EXPECT_TRUE(socket_data.at_write_eof());
399 TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
401 MockRead(ASYNC, OK, 0) // EOF
403 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0);
404 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
405 socket_factory_.AddSocketDataProvider(&socket_data1);
406 socket_factory_.AddSocketDataProvider(&socket_data2);
407 socket_data1.StopAfter(1);
408 socket_data2.StopAfter(1);
410 HostPortPair server2("mail.google.com", kDefaultServerPort);
411 host_resolver_.set_synchronous_mode(true);
412 host_resolver_.rules()->AddIPLiteralRule(
413 kDefaultServerHostName, "192.168.0.1", "");
414 host_resolver_.rules()->AddIPLiteralRule(
415 "mail.google.com", "192.168.0.1", "");
417 QuicStreamRequest request(&factory_);
419 request.Request(host_port_pair_,
424 callback_.callback()));
425 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
426 EXPECT_TRUE(stream.get());
428 TestCompletionCallback callback;
429 QuicStreamRequest request2(&factory_);
431 request2.Request(server2,
436 callback.callback()));
437 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
438 EXPECT_TRUE(stream2.get());
440 factory_.OnSessionGoingAway(QuicStreamFactoryPeer::GetActiveSession(
441 &factory_, host_port_pair_, is_https_));
442 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
443 &factory_, host_port_pair_, is_https_));
444 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
445 &factory_, server2, is_https_));
447 TestCompletionCallback callback3;
448 QuicStreamRequest request3(&factory_);
450 request3.Request(server2,
455 callback3.callback()));
456 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
457 EXPECT_TRUE(stream3.get());
459 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(
460 &factory_, server2, is_https_));
462 EXPECT_TRUE(socket_data1.at_read_eof());
463 EXPECT_TRUE(socket_data1.at_write_eof());
464 EXPECT_TRUE(socket_data2.at_read_eof());
465 EXPECT_TRUE(socket_data2.at_write_eof());
468 TEST_P(QuicStreamFactoryTest, HttpsPooling) {
470 MockRead(ASYNC, OK, 0) // EOF
472 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
473 socket_factory_.AddSocketDataProvider(&socket_data);
474 socket_data.StopAfter(1);
476 HostPortPair server1("www.example.org", 443);
477 HostPortPair server2("mail.example.org", 443);
479 // Load a cert that is valid for:
480 // www.example.org (server1)
481 // mail.example.org (server2)
483 base::FilePath certs_dir = GetTestCertsDirectory();
484 scoped_refptr<X509Certificate> test_cert(
485 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
486 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert);
487 ProofVerifyDetailsChromium verify_details;
488 verify_details.cert_verify_result.verified_cert = test_cert;
489 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
491 host_resolver_.set_synchronous_mode(true);
492 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
493 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
495 QuicStreamRequest request(&factory_);
498 request.Request(server1,
503 callback_.callback()));
504 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
505 EXPECT_TRUE(stream.get());
507 TestCompletionCallback callback;
508 QuicStreamRequest request2(&factory_);
510 request2.Request(server2,
515 callback_.callback()));
516 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
517 EXPECT_TRUE(stream2.get());
519 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
520 &factory_, server1, is_https_),
521 QuicStreamFactoryPeer::GetActiveSession(
522 &factory_, server2, is_https_));
524 EXPECT_TRUE(socket_data.at_read_eof());
525 EXPECT_TRUE(socket_data.at_write_eof());
528 TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithCertMismatch) {
530 MockRead(ASYNC, OK, 0) // EOF
532 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0);
533 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
534 socket_factory_.AddSocketDataProvider(&socket_data1);
535 socket_factory_.AddSocketDataProvider(&socket_data2);
536 socket_data1.StopAfter(1);
537 socket_data2.StopAfter(1);
539 HostPortPair server1("www.example.org", 443);
540 HostPortPair server2("mail.google.com", 443);
542 // Load a cert that is valid for:
543 // www.example.org (server1)
546 // But is not valid for mail.google.com (server2).
547 base::FilePath certs_dir = GetTestCertsDirectory();
548 scoped_refptr<X509Certificate> test_cert(
549 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
550 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert);
551 ProofVerifyDetailsChromium verify_details;
552 verify_details.cert_verify_result.verified_cert = test_cert;
553 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
556 host_resolver_.set_synchronous_mode(true);
557 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
558 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
560 QuicStreamRequest request(&factory_);
563 request.Request(server1,
568 callback_.callback()));
569 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
570 EXPECT_TRUE(stream.get());
572 TestCompletionCallback callback;
573 QuicStreamRequest request2(&factory_);
575 request2.Request(server2,
580 callback_.callback()));
581 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
582 EXPECT_TRUE(stream2.get());
584 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
585 &factory_, server1, is_https_),
586 QuicStreamFactoryPeer::GetActiveSession(
587 &factory_, server2, is_https_));
589 EXPECT_TRUE(socket_data1.at_read_eof());
590 EXPECT_TRUE(socket_data1.at_write_eof());
591 EXPECT_TRUE(socket_data2.at_read_eof());
592 EXPECT_TRUE(socket_data2.at_write_eof());
595 TEST_P(QuicStreamFactoryTest, Goaway) {
597 MockRead(ASYNC, OK, 0) // EOF
599 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
600 socket_data.StopAfter(1);
601 socket_factory_.AddSocketDataProvider(&socket_data);
602 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
603 socket_data2.StopAfter(1);
604 socket_factory_.AddSocketDataProvider(&socket_data2);
606 QuicStreamRequest request(&factory_);
607 EXPECT_EQ(ERR_IO_PENDING,
608 request.Request(host_port_pair_,
613 callback_.callback()));
615 EXPECT_EQ(OK, callback_.WaitForResult());
616 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
617 EXPECT_TRUE(stream.get());
619 // Mark the session as going away. Ensure that while it is still alive
620 // that it is no longer active.
621 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
622 &factory_, host_port_pair_, is_https_);
623 factory_.OnSessionGoingAway(session);
624 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
625 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
626 &factory_, host_port_pair_, is_https_));
627 EXPECT_EQ(NULL, CreateIfSessionExists(host_port_pair_, net_log_).get());
629 // Create a new request for the same destination and verify that a
630 // new session is created.
631 QuicStreamRequest request2(&factory_);
632 EXPECT_EQ(ERR_IO_PENDING,
633 request2.Request(host_port_pair_,
638 callback_.callback()));
639 EXPECT_EQ(OK, callback_.WaitForResult());
640 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
641 EXPECT_TRUE(stream2.get());
643 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(&factory_,
647 QuicStreamFactoryPeer::GetActiveSession(
648 &factory_, host_port_pair_, is_https_));
649 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
654 EXPECT_TRUE(socket_data.at_read_eof());
655 EXPECT_TRUE(socket_data.at_write_eof());
656 EXPECT_TRUE(socket_data2.at_read_eof());
657 EXPECT_TRUE(socket_data2.at_write_eof());
660 TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
662 MockRead(ASYNC, OK, 0) // EOF
664 QuicStreamId stream_id = 5;
665 scoped_ptr<QuicEncryptedPacket> rst(
666 maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
667 MockWrite writes[] = {
668 MockWrite(ASYNC, rst->data(), rst->length(), 1),
670 DeterministicSocketData socket_data(reads, arraysize(reads),
671 writes, arraysize(writes));
672 socket_factory_.AddSocketDataProvider(&socket_data);
673 socket_data.StopAfter(1);
675 HttpRequestInfo request_info;
676 std::vector<QuicHttpStream*> streams;
677 // The MockCryptoClientStream sets max_open_streams to be
678 // 2 * kDefaultMaxStreamsPerConnection.
679 for (size_t i = 0; i < 2 * kDefaultMaxStreamsPerConnection; i++) {
680 QuicStreamRequest request(&factory_);
681 int rv = request.Request(host_port_pair_,
686 callback_.callback());
688 EXPECT_EQ(ERR_IO_PENDING, rv);
689 EXPECT_EQ(OK, callback_.WaitForResult());
693 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
695 EXPECT_EQ(OK, stream->InitializeStream(
696 &request_info, DEFAULT_PRIORITY, net_log_, CompletionCallback()));
697 streams.push_back(stream.release());
700 QuicStreamRequest request(&factory_);
702 request.Request(host_port_pair_,
707 CompletionCallback()));
708 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
710 EXPECT_EQ(ERR_IO_PENDING, stream->InitializeStream(
711 &request_info, DEFAULT_PRIORITY, net_log_, callback_.callback()));
713 // Close the first stream.
714 streams.front()->Close(false);
716 ASSERT_TRUE(callback_.have_result());
718 EXPECT_EQ(OK, callback_.WaitForResult());
720 EXPECT_TRUE(socket_data.at_read_eof());
721 EXPECT_TRUE(socket_data.at_write_eof());
722 STLDeleteElements(&streams);
725 TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
726 DeterministicSocketData socket_data(NULL, 0, NULL, 0);
727 socket_factory_.AddSocketDataProvider(&socket_data);
729 host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName);
731 QuicStreamRequest request(&factory_);
732 EXPECT_EQ(ERR_IO_PENDING,
733 request.Request(host_port_pair_,
738 callback_.callback()));
740 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
742 EXPECT_TRUE(socket_data.at_read_eof());
743 EXPECT_TRUE(socket_data.at_write_eof());
746 TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
747 MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
748 DeterministicSocketData socket_data(NULL, 0, NULL, 0);
749 socket_data.set_connect_data(connect);
750 socket_factory_.AddSocketDataProvider(&socket_data);
751 socket_data.StopAfter(1);
753 QuicStreamRequest request(&factory_);
754 EXPECT_EQ(ERR_IO_PENDING,
755 request.Request(host_port_pair_,
760 callback_.callback()));
762 EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult());
764 EXPECT_TRUE(socket_data.at_read_eof());
765 EXPECT_TRUE(socket_data.at_write_eof());
768 TEST_P(QuicStreamFactoryTest, CancelCreate) {
770 MockRead(ASYNC, OK, 0) // EOF
772 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
773 socket_factory_.AddSocketDataProvider(&socket_data);
775 QuicStreamRequest request(&factory_);
776 EXPECT_EQ(ERR_IO_PENDING,
777 request.Request(host_port_pair_,
782 callback_.callback()));
785 socket_data.StopAfter(1);
786 base::RunLoop run_loop;
787 run_loop.RunUntilIdle();
789 scoped_ptr<QuicHttpStream> stream(
790 CreateIfSessionExists(host_port_pair_, net_log_));
791 EXPECT_TRUE(stream.get());
794 EXPECT_TRUE(socket_data.at_read_eof());
795 EXPECT_TRUE(socket_data.at_write_eof());
798 TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) {
799 // Sequentially connect to the default host, then another host, and then the
800 // default host. Verify that the default host gets a consistent ephemeral
801 // port, that is different from the other host's connection.
803 std::string other_server_name = "other.google.com";
804 EXPECT_NE(kDefaultServerHostName, other_server_name);
805 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort);
807 int original_port = GetSourcePortForNewSession(host_port_pair_);
808 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2));
809 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
812 TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) {
813 // Get a session to the host using the port suggester.
815 GetSourcePortForNewSessionAndGoAway(host_port_pair_);
816 // Verify that the port is different after the goaway.
817 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_));
818 // Since the previous session did not goaway we should see the original port.
819 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
822 TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
824 MockRead(ASYNC, 0, 0) // EOF
826 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
827 std::vector<MockWrite> writes;
828 if (GetParam() > QUIC_VERSION_13)
829 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
830 DeterministicSocketData socket_data(reads, arraysize(reads),
831 writes.empty() ? NULL : &writes[0],
833 socket_factory_.AddSocketDataProvider(&socket_data);
834 socket_data.StopAfter(1);
836 MockRead reads2[] = {
837 MockRead(ASYNC, 0, 0) // EOF
839 DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0);
840 socket_factory_.AddSocketDataProvider(&socket_data2);
841 socket_data2.StopAfter(1);
843 QuicStreamRequest request(&factory_);
844 EXPECT_EQ(ERR_IO_PENDING,
845 request.Request(host_port_pair_,
850 callback_.callback()));
852 EXPECT_EQ(OK, callback_.WaitForResult());
853 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
854 HttpRequestInfo request_info;
855 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
857 net_log_, CompletionCallback()));
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()));
864 // Now attempting to request a stream to the same origin should create
867 QuicStreamRequest request2(&factory_);
868 EXPECT_EQ(ERR_IO_PENDING,
869 request2.Request(host_port_pair_,
874 callback_.callback()));
876 EXPECT_EQ(OK, callback_.WaitForResult());
877 stream = request2.ReleaseStream();
878 stream.reset(); // Will reset stream 3.
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());
886 TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
888 MockRead(ASYNC, 0, 0) // EOF
890 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
891 std::vector<MockWrite> writes;
892 if (GetParam() > QUIC_VERSION_13)
893 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
894 DeterministicSocketData socket_data(reads, arraysize(reads),
895 writes.empty() ? NULL : &writes[0],
897 socket_factory_.AddSocketDataProvider(&socket_data);
898 socket_data.StopAfter(1);
900 MockRead reads2[] = {
901 MockRead(ASYNC, 0, 0) // EOF
903 DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0);
904 socket_factory_.AddSocketDataProvider(&socket_data2);
905 socket_data2.StopAfter(1);
907 QuicStreamRequest request(&factory_);
908 EXPECT_EQ(ERR_IO_PENDING,
909 request.Request(host_port_pair_,
914 callback_.callback()));
916 EXPECT_EQ(OK, callback_.WaitForResult());
917 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
918 HttpRequestInfo request_info;
919 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
921 net_log_, CompletionCallback()));
923 // Change the IP address and verify that stream saw the error.
924 factory_.OnIPAddressChanged();
925 EXPECT_EQ(ERR_NETWORK_CHANGED,
926 stream->ReadResponseHeaders(callback_.callback()));
927 EXPECT_TRUE(factory_.require_confirmation());
929 // Now attempting to request a stream to the same origin should create
932 QuicStreamRequest request2(&factory_);
933 EXPECT_EQ(ERR_IO_PENDING,
934 request2.Request(host_port_pair_,
939 callback_.callback()));
941 EXPECT_EQ(OK, callback_.WaitForResult());
942 stream = request2.ReleaseStream();
943 stream.reset(); // Will reset stream 3.
945 EXPECT_TRUE(socket_data.at_read_eof());
946 EXPECT_TRUE(socket_data.at_write_eof());
947 EXPECT_TRUE(socket_data2.at_read_eof());
948 EXPECT_TRUE(socket_data2.at_write_eof());
951 TEST_P(QuicStreamFactoryTest, OnCertAdded) {
953 MockRead(ASYNC, 0, 0) // EOF
955 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
956 std::vector<MockWrite> writes;
957 if (GetParam() > QUIC_VERSION_13)
958 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
959 DeterministicSocketData socket_data(reads, arraysize(reads),
960 writes.empty() ? NULL : &writes[0],
962 socket_factory_.AddSocketDataProvider(&socket_data);
963 socket_data.StopAfter(1);
965 MockRead reads2[] = {
966 MockRead(ASYNC, 0, 0) // EOF
968 DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0);
969 socket_factory_.AddSocketDataProvider(&socket_data2);
970 socket_data2.StopAfter(1);
972 QuicStreamRequest request(&factory_);
973 EXPECT_EQ(ERR_IO_PENDING,
974 request.Request(host_port_pair_,
979 callback_.callback()));
981 EXPECT_EQ(OK, callback_.WaitForResult());
982 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
983 HttpRequestInfo request_info;
984 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
986 net_log_, CompletionCallback()));
988 // Add a cert and verify that stream saw the event.
989 factory_.OnCertAdded(NULL);
990 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
991 stream->ReadResponseHeaders(callback_.callback()));
992 EXPECT_FALSE(factory_.require_confirmation());
994 // Now attempting to request a stream to the same origin should create
997 QuicStreamRequest request2(&factory_);
998 EXPECT_EQ(ERR_IO_PENDING,
999 request2.Request(host_port_pair_,
1004 callback_.callback()));
1006 EXPECT_EQ(OK, callback_.WaitForResult());
1007 stream = request2.ReleaseStream();
1008 stream.reset(); // Will reset stream 3.
1010 EXPECT_TRUE(socket_data.at_read_eof());
1011 EXPECT_TRUE(socket_data.at_write_eof());
1012 EXPECT_TRUE(socket_data2.at_read_eof());
1013 EXPECT_TRUE(socket_data2.at_write_eof());
1016 TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
1017 MockRead reads[] = {
1018 MockRead(ASYNC, 0, 0) // EOF
1020 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1021 std::vector<MockWrite> writes;
1022 if (GetParam() > QUIC_VERSION_13)
1023 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
1024 DeterministicSocketData socket_data(reads, arraysize(reads),
1025 writes.empty() ? NULL : &writes[0],
1027 socket_factory_.AddSocketDataProvider(&socket_data);
1028 socket_data.StopAfter(1);
1030 MockRead reads2[] = {
1031 MockRead(ASYNC, 0, 0) // EOF
1033 DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0);
1034 socket_factory_.AddSocketDataProvider(&socket_data2);
1035 socket_data2.StopAfter(1);
1037 QuicStreamRequest request(&factory_);
1038 EXPECT_EQ(ERR_IO_PENDING,
1039 request.Request(host_port_pair_,
1044 callback_.callback()));
1046 EXPECT_EQ(OK, callback_.WaitForResult());
1047 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1048 HttpRequestInfo request_info;
1049 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1051 net_log_, CompletionCallback()));
1053 // Change the CA cert and verify that stream saw the event.
1054 factory_.OnCACertChanged(NULL);
1055 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1056 stream->ReadResponseHeaders(callback_.callback()));
1057 EXPECT_FALSE(factory_.require_confirmation());
1059 // Now attempting to request a stream to the same origin should create
1062 QuicStreamRequest request2(&factory_);
1063 EXPECT_EQ(ERR_IO_PENDING,
1064 request2.Request(host_port_pair_,
1069 callback_.callback()));
1071 EXPECT_EQ(OK, callback_.WaitForResult());
1072 stream = request2.ReleaseStream();
1073 stream.reset(); // Will reset stream 3.
1075 EXPECT_TRUE(socket_data.at_read_eof());
1076 EXPECT_TRUE(socket_data.at_write_eof());
1077 EXPECT_TRUE(socket_data2.at_read_eof());
1078 EXPECT_TRUE(socket_data2.at_write_eof());
1081 TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
1082 vector<string> cannoncial_suffixes;
1083 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1084 cannoncial_suffixes.push_back(string(".googlevideo.com"));
1086 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1087 string r1_host_name("r1");
1088 string r2_host_name("r2");
1089 r1_host_name.append(cannoncial_suffixes[i]);
1090 r2_host_name.append(cannoncial_suffixes[i]);
1092 HostPortPair host_port_pair1(r1_host_name, 80);
1093 QuicCryptoClientConfig* crypto_config =
1094 QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
1095 QuicSessionKey server_key1(host_port_pair1, is_https_, privacy_mode_);
1096 QuicCryptoClientConfig::CachedState* cached1 =
1097 crypto_config->LookupOrCreate(server_key1);
1098 EXPECT_FALSE(cached1->proof_valid());
1099 EXPECT_TRUE(cached1->source_address_token().empty());
1101 // Mutate the cached1 to have different data.
1102 // TODO(rtenneti): mutate other members of CachedState.
1103 cached1->set_source_address_token(r1_host_name);
1104 cached1->SetProofValid();
1106 HostPortPair host_port_pair2(r2_host_name, 80);
1107 QuicSessionKey server_key2(host_port_pair2, is_https_, privacy_mode_);
1108 QuicCryptoClientConfig::CachedState* cached2 =
1109 crypto_config->LookupOrCreate(server_key2);
1110 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
1111 EXPECT_TRUE(cached2->proof_valid());
1115 TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
1116 vector<string> cannoncial_suffixes;
1117 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1118 cannoncial_suffixes.push_back(string(".googlevideo.com"));
1120 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1121 string r3_host_name("r3");
1122 string r4_host_name("r4");
1123 r3_host_name.append(cannoncial_suffixes[i]);
1124 r4_host_name.append(cannoncial_suffixes[i]);
1126 HostPortPair host_port_pair1(r3_host_name, 80);
1127 QuicCryptoClientConfig* crypto_config =
1128 QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
1129 QuicSessionKey server_key1(host_port_pair1, is_https_, privacy_mode_);
1130 QuicCryptoClientConfig::CachedState* cached1 =
1131 crypto_config->LookupOrCreate(server_key1);
1132 EXPECT_FALSE(cached1->proof_valid());
1133 EXPECT_TRUE(cached1->source_address_token().empty());
1135 // Mutate the cached1 to have different data.
1136 // TODO(rtenneti): mutate other members of CachedState.
1137 cached1->set_source_address_token(r3_host_name);
1138 cached1->SetProofInvalid();
1140 HostPortPair host_port_pair2(r4_host_name, 80);
1141 QuicSessionKey server_key2(host_port_pair2, is_https_, privacy_mode_);
1142 QuicCryptoClientConfig::CachedState* cached2 =
1143 crypto_config->LookupOrCreate(server_key2);
1144 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
1145 EXPECT_TRUE(cached2->source_address_token().empty());
1146 EXPECT_FALSE(cached2->proof_valid());