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/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"
20 #include "net/quic/quic_http_stream.h"
21 #include "net/quic/quic_server_id.h"
22 #include "net/quic/test_tools/mock_clock.h"
23 #include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
24 #include "net/quic/test_tools/mock_random.h"
25 #include "net/quic/test_tools/quic_test_packet_maker.h"
26 #include "net/quic/test_tools/quic_test_utils.h"
27 #include "net/socket/socket_test_util.h"
28 #include "net/test/cert_test_util.h"
29 #include "testing/gtest/include/gtest/gtest.h"
31 using base::StringPiece;
39 const char kDefaultServerHostName[] = "www.google.com";
40 const int kDefaultServerPort = 443;
41 } // namespace anonymous
43 class QuicStreamFactoryPeer {
45 static QuicCryptoClientConfig* GetCryptoConfig(QuicStreamFactory* factory) {
46 return &factory->crypto_config_;
49 static bool HasActiveSession(QuicStreamFactory* factory,
50 const HostPortPair& host_port_pair,
52 QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED);
53 return factory->HasActiveSession(server_id);
56 static QuicClientSession* GetActiveSession(
57 QuicStreamFactory* factory,
58 const HostPortPair& host_port_pair,
60 QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED);
61 DCHECK(factory->HasActiveSession(server_id));
62 return factory->active_sessions_[server_id];
65 static scoped_ptr<QuicHttpStream> CreateIfSessionExists(
66 QuicStreamFactory* factory,
67 const HostPortPair& host_port_pair,
69 const BoundNetLog& net_log) {
70 QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED);
71 return factory->CreateIfSessionExists(server_id, net_log);
74 static bool IsLiveSession(QuicStreamFactory* factory,
75 QuicClientSession* session) {
76 for (QuicStreamFactory::SessionIdMap::iterator it =
77 factory->all_sessions_.begin();
78 it != factory->all_sessions_.end(); ++it) {
79 if (it->first == session)
86 class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> {
88 QuicStreamFactoryTest()
89 : random_generator_(0),
90 maker_(GetParam(), 0),
91 clock_(new MockClock()),
92 cert_verifier_(CertVerifier::CreateDefault()),
93 factory_(&host_resolver_, &socket_factory_,
94 base::WeakPtr<HttpServerProperties>(), cert_verifier_.get(),
95 &transport_security_state_,
96 &crypto_client_stream_factory_, &random_generator_, clock_,
97 kDefaultMaxPacketSize, std::string(),
98 SupportedVersions(GetParam()), true, true, true),
99 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
101 privacy_mode_(PRIVACY_MODE_DISABLED) {
102 factory_.set_require_confirmation(false);
105 scoped_ptr<QuicHttpStream> CreateIfSessionExists(
106 const HostPortPair& host_port_pair,
107 const BoundNetLog& net_log) {
108 return QuicStreamFactoryPeer::CreateIfSessionExists(
109 &factory_, host_port_pair, false, net_log_);
112 int GetSourcePortForNewSession(const HostPortPair& destination) {
113 return GetSourcePortForNewSessionInner(destination, false);
116 int GetSourcePortForNewSessionAndGoAway(
117 const HostPortPair& destination) {
118 return GetSourcePortForNewSessionInner(destination, true);
121 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
122 bool goaway_received) {
123 // Should only be called if there is no active session for this destination.
124 EXPECT_EQ(NULL, CreateIfSessionExists(destination, net_log_).get());
125 size_t socket_count = socket_factory_.udp_client_sockets().size();
128 MockRead(ASYNC, OK, 0) // EOF
130 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
131 socket_data.StopAfter(1);
132 socket_factory_.AddSocketDataProvider(&socket_data);
134 QuicStreamRequest request(&factory_);
135 EXPECT_EQ(ERR_IO_PENDING,
136 request.Request(destination,
141 callback_.callback()));
143 EXPECT_EQ(OK, callback_.WaitForResult());
144 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
145 EXPECT_TRUE(stream.get());
148 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
149 &factory_, destination, is_https_);
151 if (socket_count + 1 != socket_factory_.udp_client_sockets().size()) {
158 udp_client_sockets()[socket_count]->GetLocalAddress(&endpoint);
159 int port = endpoint.port();
160 if (goaway_received) {
161 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, "");
162 session->OnGoAway(goaway);
165 factory_.OnSessionClosed(session);
166 EXPECT_EQ(NULL, CreateIfSessionExists(destination, net_log_).get());
167 EXPECT_TRUE(socket_data.at_read_eof());
168 EXPECT_TRUE(socket_data.at_write_eof());
172 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() {
173 QuicStreamId stream_id = kClientDataStreamId1;
174 return maker_.MakeRstPacket(
176 AdjustErrorForVersion(QUIC_RST_FLOW_CONTROL_ACCOUNTING, GetParam()));
179 MockHostResolver host_resolver_;
180 DeterministicMockClientSocketFactory socket_factory_;
181 MockCryptoClientStreamFactory crypto_client_stream_factory_;
182 MockRandom random_generator_;
183 QuicTestPacketMaker maker_;
184 MockClock* clock_; // Owned by factory_.
185 scoped_ptr<CertVerifier> cert_verifier_;
186 TransportSecurityState transport_security_state_;
187 QuicStreamFactory factory_;
188 HostPortPair host_port_pair_;
190 PrivacyMode privacy_mode_;
191 BoundNetLog net_log_;
192 TestCompletionCallback callback_;
195 INSTANTIATE_TEST_CASE_P(Version, QuicStreamFactoryTest,
196 ::testing::ValuesIn(QuicSupportedVersions()));
198 TEST_P(QuicStreamFactoryTest, CreateIfSessionExists) {
199 EXPECT_EQ(NULL, CreateIfSessionExists(host_port_pair_, net_log_).get());
202 TEST_P(QuicStreamFactoryTest, Create) {
204 MockRead(ASYNC, OK, 0) // EOF
206 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
207 socket_factory_.AddSocketDataProvider(&socket_data);
208 socket_data.StopAfter(1);
210 QuicStreamRequest request(&factory_);
211 EXPECT_EQ(ERR_IO_PENDING,
212 request.Request(host_port_pair_,
217 callback_.callback()));
219 EXPECT_EQ(OK, callback_.WaitForResult());
220 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
221 EXPECT_TRUE(stream.get());
223 // Will reset stream 3.
224 stream = CreateIfSessionExists(host_port_pair_, net_log_);
225 EXPECT_TRUE(stream.get());
227 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
228 // in streams on different sessions.
229 QuicStreamRequest request2(&factory_);
231 request2.Request(host_port_pair_,
236 callback_.callback()));
237 stream = request2.ReleaseStream(); // Will reset stream 5.
238 stream.reset(); // Will reset stream 7.
240 EXPECT_TRUE(socket_data.at_read_eof());
241 EXPECT_TRUE(socket_data.at_write_eof());
244 TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
246 MockRead(ASYNC, OK, 0) // EOF
248 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
249 socket_factory_.AddSocketDataProvider(&socket_data);
250 socket_data.StopAfter(1);
252 crypto_client_stream_factory_.set_handshake_mode(
253 MockCryptoClientStream::ZERO_RTT);
254 host_resolver_.set_synchronous_mode(true);
255 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
258 QuicStreamRequest request(&factory_);
260 request.Request(host_port_pair_,
265 callback_.callback()));
267 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
268 EXPECT_TRUE(stream.get());
269 EXPECT_TRUE(socket_data.at_read_eof());
270 EXPECT_TRUE(socket_data.at_write_eof());
273 TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
275 MockRead(ASYNC, OK, 0) // EOF
277 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
278 socket_factory_.AddSocketDataProvider(&socket_data);
279 socket_data.StopAfter(1);
281 crypto_client_stream_factory_.set_handshake_mode(
282 MockCryptoClientStream::ZERO_RTT);
283 host_resolver_.set_synchronous_mode(true);
284 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
287 QuicStreamRequest request(&factory_);
288 // Posts require handshake confirmation, so this will return asynchronously.
289 EXPECT_EQ(ERR_IO_PENDING,
290 request.Request(host_port_pair_,
295 callback_.callback()));
297 // Confirm the handshake and verify that the stream is created.
298 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
299 QuicSession::HANDSHAKE_CONFIRMED);
301 EXPECT_EQ(OK, callback_.WaitForResult());
302 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
303 EXPECT_TRUE(stream.get());
304 EXPECT_TRUE(socket_data.at_read_eof());
305 EXPECT_TRUE(socket_data.at_write_eof());
308 TEST_P(QuicStreamFactoryTest, CreateHttpVsHttps) {
310 MockRead(ASYNC, OK, 0) // EOF
312 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0);
313 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
314 socket_factory_.AddSocketDataProvider(&socket_data1);
315 socket_factory_.AddSocketDataProvider(&socket_data2);
316 socket_data1.StopAfter(1);
317 socket_data2.StopAfter(1);
319 QuicStreamRequest request(&factory_);
320 EXPECT_EQ(ERR_IO_PENDING,
321 request.Request(host_port_pair_,
326 callback_.callback()));
328 EXPECT_EQ(OK, callback_.WaitForResult());
329 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
330 EXPECT_TRUE(stream.get());
332 QuicStreamRequest request2(&factory_);
333 EXPECT_EQ(ERR_IO_PENDING,
334 request2.Request(host_port_pair_,
339 callback_.callback()));
340 EXPECT_EQ(OK, callback_.WaitForResult());
341 stream = request2.ReleaseStream();
342 EXPECT_TRUE(stream.get());
345 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
346 &factory_, host_port_pair_, is_https_),
347 QuicStreamFactoryPeer::GetActiveSession(
348 &factory_, host_port_pair_, !is_https_));
350 EXPECT_TRUE(socket_data1.at_read_eof());
351 EXPECT_TRUE(socket_data1.at_write_eof());
352 EXPECT_TRUE(socket_data2.at_read_eof());
353 EXPECT_TRUE(socket_data2.at_write_eof());
356 // TODO(rch): re-enable this.
357 TEST_P(QuicStreamFactoryTest, DISABLED_Pooling) {
359 MockRead(ASYNC, OK, 0) // EOF
361 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
362 socket_factory_.AddSocketDataProvider(&socket_data);
363 socket_data.StopAfter(1);
365 HostPortPair server2("mail.google.com", kDefaultServerPort);
366 host_resolver_.set_synchronous_mode(true);
367 host_resolver_.rules()->AddIPLiteralRule(
368 kDefaultServerHostName, "192.168.0.1", "");
369 host_resolver_.rules()->AddIPLiteralRule(
370 "mail.google.com", "192.168.0.1", "");
372 QuicStreamRequest request(&factory_);
374 request.Request(host_port_pair_,
379 callback_.callback()));
380 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
381 EXPECT_TRUE(stream.get());
383 TestCompletionCallback callback;
384 QuicStreamRequest request2(&factory_);
386 request2.Request(server2,
391 callback.callback()));
392 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
393 EXPECT_TRUE(stream2.get());
396 QuicStreamFactoryPeer::GetActiveSession(
397 &factory_, host_port_pair_, is_https_),
398 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_));
400 EXPECT_TRUE(socket_data.at_read_eof());
401 EXPECT_TRUE(socket_data.at_write_eof());
404 TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
406 MockRead(ASYNC, OK, 0) // EOF
408 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0);
409 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
410 socket_factory_.AddSocketDataProvider(&socket_data1);
411 socket_factory_.AddSocketDataProvider(&socket_data2);
412 socket_data1.StopAfter(1);
413 socket_data2.StopAfter(1);
415 HostPortPair server2("mail.google.com", kDefaultServerPort);
416 host_resolver_.set_synchronous_mode(true);
417 host_resolver_.rules()->AddIPLiteralRule(
418 kDefaultServerHostName, "192.168.0.1", "");
419 host_resolver_.rules()->AddIPLiteralRule(
420 "mail.google.com", "192.168.0.1", "");
422 QuicStreamRequest request(&factory_);
424 request.Request(host_port_pair_,
429 callback_.callback()));
430 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
431 EXPECT_TRUE(stream.get());
433 TestCompletionCallback callback;
434 QuicStreamRequest request2(&factory_);
436 request2.Request(server2,
441 callback.callback()));
442 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
443 EXPECT_TRUE(stream2.get());
445 factory_.OnSessionGoingAway(QuicStreamFactoryPeer::GetActiveSession(
446 &factory_, host_port_pair_, is_https_));
447 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
448 &factory_, host_port_pair_, is_https_));
449 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
450 &factory_, server2, is_https_));
452 TestCompletionCallback callback3;
453 QuicStreamRequest request3(&factory_);
455 request3.Request(server2,
460 callback3.callback()));
461 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
462 EXPECT_TRUE(stream3.get());
464 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(
465 &factory_, server2, is_https_));
467 EXPECT_TRUE(socket_data1.at_read_eof());
468 EXPECT_TRUE(socket_data1.at_write_eof());
469 EXPECT_TRUE(socket_data2.at_read_eof());
470 EXPECT_TRUE(socket_data2.at_write_eof());
473 // TODO(rch): re-enable this.
474 TEST_P(QuicStreamFactoryTest, DISABLED_HttpsPooling) {
476 MockRead(ASYNC, OK, 0) // EOF
478 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
479 socket_factory_.AddSocketDataProvider(&socket_data);
480 socket_data.StopAfter(1);
482 HostPortPair server1("www.example.org", 443);
483 HostPortPair server2("mail.example.org", 443);
485 // Load a cert that is valid for:
486 // www.example.org (server1)
487 // mail.example.org (server2)
489 base::FilePath certs_dir = GetTestCertsDirectory();
490 scoped_refptr<X509Certificate> test_cert(
491 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
492 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert);
493 ProofVerifyDetailsChromium verify_details;
494 verify_details.cert_verify_result.verified_cert = test_cert;
495 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
497 host_resolver_.set_synchronous_mode(true);
498 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
499 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
501 QuicStreamRequest request(&factory_);
504 request.Request(server1,
509 callback_.callback()));
510 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
511 EXPECT_TRUE(stream.get());
513 TestCompletionCallback callback;
514 QuicStreamRequest request2(&factory_);
516 request2.Request(server2,
521 callback_.callback()));
522 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
523 EXPECT_TRUE(stream2.get());
525 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
526 &factory_, server1, is_https_),
527 QuicStreamFactoryPeer::GetActiveSession(
528 &factory_, server2, is_https_));
530 EXPECT_TRUE(socket_data.at_read_eof());
531 EXPECT_TRUE(socket_data.at_write_eof());
534 TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithCertMismatch) {
536 MockRead(ASYNC, OK, 0) // EOF
538 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0);
539 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
540 socket_factory_.AddSocketDataProvider(&socket_data1);
541 socket_factory_.AddSocketDataProvider(&socket_data2);
542 socket_data1.StopAfter(1);
543 socket_data2.StopAfter(1);
545 HostPortPair server1("www.example.org", 443);
546 HostPortPair server2("mail.google.com", 443);
548 // Load a cert that is valid for:
549 // www.example.org (server1)
552 // But is not valid for mail.google.com (server2).
553 base::FilePath certs_dir = GetTestCertsDirectory();
554 scoped_refptr<X509Certificate> test_cert(
555 ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
556 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert);
557 ProofVerifyDetailsChromium verify_details;
558 verify_details.cert_verify_result.verified_cert = test_cert;
559 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
562 host_resolver_.set_synchronous_mode(true);
563 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
564 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
566 QuicStreamRequest request(&factory_);
569 request.Request(server1,
574 callback_.callback()));
575 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
576 EXPECT_TRUE(stream.get());
578 TestCompletionCallback callback;
579 QuicStreamRequest request2(&factory_);
581 request2.Request(server2,
586 callback_.callback()));
587 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
588 EXPECT_TRUE(stream2.get());
590 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
591 &factory_, server1, is_https_),
592 QuicStreamFactoryPeer::GetActiveSession(
593 &factory_, server2, is_https_));
595 EXPECT_TRUE(socket_data1.at_read_eof());
596 EXPECT_TRUE(socket_data1.at_write_eof());
597 EXPECT_TRUE(socket_data2.at_read_eof());
598 EXPECT_TRUE(socket_data2.at_write_eof());
601 TEST_P(QuicStreamFactoryTest, Goaway) {
603 MockRead(ASYNC, OK, 0) // EOF
605 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
606 socket_data.StopAfter(1);
607 socket_factory_.AddSocketDataProvider(&socket_data);
608 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
609 socket_data2.StopAfter(1);
610 socket_factory_.AddSocketDataProvider(&socket_data2);
612 QuicStreamRequest request(&factory_);
613 EXPECT_EQ(ERR_IO_PENDING,
614 request.Request(host_port_pair_,
619 callback_.callback()));
621 EXPECT_EQ(OK, callback_.WaitForResult());
622 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
623 EXPECT_TRUE(stream.get());
625 // Mark the session as going away. Ensure that while it is still alive
626 // that it is no longer active.
627 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
628 &factory_, host_port_pair_, is_https_);
629 factory_.OnSessionGoingAway(session);
630 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
631 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
632 &factory_, host_port_pair_, is_https_));
633 EXPECT_EQ(NULL, CreateIfSessionExists(host_port_pair_, net_log_).get());
635 // Create a new request for the same destination and verify that a
636 // new session is created.
637 QuicStreamRequest request2(&factory_);
638 EXPECT_EQ(ERR_IO_PENDING,
639 request2.Request(host_port_pair_,
644 callback_.callback()));
645 EXPECT_EQ(OK, callback_.WaitForResult());
646 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
647 EXPECT_TRUE(stream2.get());
649 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(&factory_,
653 QuicStreamFactoryPeer::GetActiveSession(
654 &factory_, host_port_pair_, is_https_));
655 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
660 EXPECT_TRUE(socket_data.at_read_eof());
661 EXPECT_TRUE(socket_data.at_write_eof());
662 EXPECT_TRUE(socket_data2.at_read_eof());
663 EXPECT_TRUE(socket_data2.at_write_eof());
666 TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
668 MockRead(ASYNC, OK, 0) // EOF
670 QuicStreamId stream_id = kClientDataStreamId1;
671 scoped_ptr<QuicEncryptedPacket> rst(
672 maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
673 MockWrite writes[] = {
674 MockWrite(ASYNC, rst->data(), rst->length(), 1),
676 DeterministicSocketData socket_data(reads, arraysize(reads),
677 writes, arraysize(writes));
678 socket_factory_.AddSocketDataProvider(&socket_data);
679 socket_data.StopAfter(1);
681 HttpRequestInfo request_info;
682 std::vector<QuicHttpStream*> streams;
683 // The MockCryptoClientStream sets max_open_streams to be
684 // 2 * kDefaultMaxStreamsPerConnection.
685 for (size_t i = 0; i < 2 * kDefaultMaxStreamsPerConnection; i++) {
686 QuicStreamRequest request(&factory_);
687 int rv = request.Request(host_port_pair_,
692 callback_.callback());
694 EXPECT_EQ(ERR_IO_PENDING, rv);
695 EXPECT_EQ(OK, callback_.WaitForResult());
699 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
701 EXPECT_EQ(OK, stream->InitializeStream(
702 &request_info, DEFAULT_PRIORITY, net_log_, CompletionCallback()));
703 streams.push_back(stream.release());
706 QuicStreamRequest request(&factory_);
708 request.Request(host_port_pair_,
713 CompletionCallback()));
714 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
716 EXPECT_EQ(ERR_IO_PENDING, stream->InitializeStream(
717 &request_info, DEFAULT_PRIORITY, net_log_, callback_.callback()));
719 // Close the first stream.
720 streams.front()->Close(false);
722 ASSERT_TRUE(callback_.have_result());
724 EXPECT_EQ(OK, callback_.WaitForResult());
726 EXPECT_TRUE(socket_data.at_read_eof());
727 EXPECT_TRUE(socket_data.at_write_eof());
728 STLDeleteElements(&streams);
731 TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
732 DeterministicSocketData socket_data(NULL, 0, NULL, 0);
733 socket_factory_.AddSocketDataProvider(&socket_data);
735 host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName);
737 QuicStreamRequest request(&factory_);
738 EXPECT_EQ(ERR_IO_PENDING,
739 request.Request(host_port_pair_,
744 callback_.callback()));
746 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
748 EXPECT_TRUE(socket_data.at_read_eof());
749 EXPECT_TRUE(socket_data.at_write_eof());
752 TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
753 MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
754 DeterministicSocketData socket_data(NULL, 0, NULL, 0);
755 socket_data.set_connect_data(connect);
756 socket_factory_.AddSocketDataProvider(&socket_data);
757 socket_data.StopAfter(1);
759 QuicStreamRequest request(&factory_);
760 EXPECT_EQ(ERR_IO_PENDING,
761 request.Request(host_port_pair_,
766 callback_.callback()));
768 EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult());
770 EXPECT_TRUE(socket_data.at_read_eof());
771 EXPECT_TRUE(socket_data.at_write_eof());
774 TEST_P(QuicStreamFactoryTest, CancelCreate) {
776 MockRead(ASYNC, OK, 0) // EOF
778 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
779 socket_factory_.AddSocketDataProvider(&socket_data);
781 QuicStreamRequest request(&factory_);
782 EXPECT_EQ(ERR_IO_PENDING,
783 request.Request(host_port_pair_,
788 callback_.callback()));
791 socket_data.StopAfter(1);
792 base::RunLoop run_loop;
793 run_loop.RunUntilIdle();
795 scoped_ptr<QuicHttpStream> stream(
796 CreateIfSessionExists(host_port_pair_, net_log_));
797 EXPECT_TRUE(stream.get());
800 EXPECT_TRUE(socket_data.at_read_eof());
801 EXPECT_TRUE(socket_data.at_write_eof());
804 TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) {
805 // Sequentially connect to the default host, then another host, and then the
806 // default host. Verify that the default host gets a consistent ephemeral
807 // port, that is different from the other host's connection.
809 std::string other_server_name = "other.google.com";
810 EXPECT_NE(kDefaultServerHostName, other_server_name);
811 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort);
813 int original_port = GetSourcePortForNewSession(host_port_pair_);
814 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2));
815 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
818 TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) {
819 // Get a session to the host using the port suggester.
821 GetSourcePortForNewSessionAndGoAway(host_port_pair_);
822 // Verify that the port is different after the goaway.
823 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_));
824 // Since the previous session did not goaway we should see the original port.
825 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
828 TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
830 MockRead(ASYNC, 0, 0) // EOF
832 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
833 std::vector<MockWrite> writes;
834 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
835 DeterministicSocketData socket_data(reads, arraysize(reads),
836 writes.empty() ? NULL : &writes[0],
838 socket_factory_.AddSocketDataProvider(&socket_data);
839 socket_data.StopAfter(1);
841 MockRead reads2[] = {
842 MockRead(ASYNC, 0, 0) // EOF
844 DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0);
845 socket_factory_.AddSocketDataProvider(&socket_data2);
846 socket_data2.StopAfter(1);
848 QuicStreamRequest request(&factory_);
849 EXPECT_EQ(ERR_IO_PENDING,
850 request.Request(host_port_pair_,
855 callback_.callback()));
857 EXPECT_EQ(OK, callback_.WaitForResult());
858 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
859 HttpRequestInfo request_info;
860 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
862 net_log_, CompletionCallback()));
864 // Close the session and verify that stream saw the error.
865 factory_.CloseAllSessions(ERR_INTERNET_DISCONNECTED);
866 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
867 stream->ReadResponseHeaders(callback_.callback()));
869 // Now attempting to request a stream to the same origin should create
872 QuicStreamRequest request2(&factory_);
873 EXPECT_EQ(ERR_IO_PENDING,
874 request2.Request(host_port_pair_,
879 callback_.callback()));
881 EXPECT_EQ(OK, callback_.WaitForResult());
882 stream = request2.ReleaseStream();
883 stream.reset(); // Will reset stream 3.
885 EXPECT_TRUE(socket_data.at_read_eof());
886 EXPECT_TRUE(socket_data.at_write_eof());
887 EXPECT_TRUE(socket_data2.at_read_eof());
888 EXPECT_TRUE(socket_data2.at_write_eof());
891 TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
893 MockRead(ASYNC, 0, 0) // EOF
895 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
896 std::vector<MockWrite> writes;
897 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
898 DeterministicSocketData socket_data(reads, arraysize(reads),
899 writes.empty() ? NULL : &writes[0],
901 socket_factory_.AddSocketDataProvider(&socket_data);
902 socket_data.StopAfter(1);
904 MockRead reads2[] = {
905 MockRead(ASYNC, 0, 0) // EOF
907 DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0);
908 socket_factory_.AddSocketDataProvider(&socket_data2);
909 socket_data2.StopAfter(1);
911 QuicStreamRequest request(&factory_);
912 EXPECT_EQ(ERR_IO_PENDING,
913 request.Request(host_port_pair_,
918 callback_.callback()));
920 EXPECT_EQ(OK, callback_.WaitForResult());
921 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
922 HttpRequestInfo request_info;
923 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
925 net_log_, CompletionCallback()));
927 // Change the IP address and verify that stream saw the error.
928 factory_.OnIPAddressChanged();
929 EXPECT_EQ(ERR_NETWORK_CHANGED,
930 stream->ReadResponseHeaders(callback_.callback()));
931 EXPECT_TRUE(factory_.require_confirmation());
933 // Now attempting to request a stream to the same origin should create
936 QuicStreamRequest request2(&factory_);
937 EXPECT_EQ(ERR_IO_PENDING,
938 request2.Request(host_port_pair_,
943 callback_.callback()));
945 EXPECT_EQ(OK, callback_.WaitForResult());
946 stream = request2.ReleaseStream();
947 stream.reset(); // Will reset stream 3.
949 EXPECT_TRUE(socket_data.at_read_eof());
950 EXPECT_TRUE(socket_data.at_write_eof());
951 EXPECT_TRUE(socket_data2.at_read_eof());
952 EXPECT_TRUE(socket_data2.at_write_eof());
955 TEST_P(QuicStreamFactoryTest, OnCertAdded) {
957 MockRead(ASYNC, 0, 0) // EOF
959 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
960 std::vector<MockWrite> writes;
961 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
962 DeterministicSocketData socket_data(reads, arraysize(reads),
963 writes.empty() ? NULL : &writes[0],
965 socket_factory_.AddSocketDataProvider(&socket_data);
966 socket_data.StopAfter(1);
968 MockRead reads2[] = {
969 MockRead(ASYNC, 0, 0) // EOF
971 DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0);
972 socket_factory_.AddSocketDataProvider(&socket_data2);
973 socket_data2.StopAfter(1);
975 QuicStreamRequest request(&factory_);
976 EXPECT_EQ(ERR_IO_PENDING,
977 request.Request(host_port_pair_,
982 callback_.callback()));
984 EXPECT_EQ(OK, callback_.WaitForResult());
985 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
986 HttpRequestInfo request_info;
987 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
989 net_log_, CompletionCallback()));
991 // Add a cert and verify that stream saw the event.
992 factory_.OnCertAdded(NULL);
993 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
994 stream->ReadResponseHeaders(callback_.callback()));
995 EXPECT_FALSE(factory_.require_confirmation());
997 // Now attempting to request a stream to the same origin should create
1000 QuicStreamRequest request2(&factory_);
1001 EXPECT_EQ(ERR_IO_PENDING,
1002 request2.Request(host_port_pair_,
1007 callback_.callback()));
1009 EXPECT_EQ(OK, callback_.WaitForResult());
1010 stream = request2.ReleaseStream();
1011 stream.reset(); // Will reset stream 3.
1013 EXPECT_TRUE(socket_data.at_read_eof());
1014 EXPECT_TRUE(socket_data.at_write_eof());
1015 EXPECT_TRUE(socket_data2.at_read_eof());
1016 EXPECT_TRUE(socket_data2.at_write_eof());
1019 TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
1020 MockRead reads[] = {
1021 MockRead(ASYNC, 0, 0) // EOF
1023 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1024 std::vector<MockWrite> writes;
1025 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
1026 DeterministicSocketData socket_data(reads, arraysize(reads),
1027 writes.empty() ? NULL : &writes[0],
1029 socket_factory_.AddSocketDataProvider(&socket_data);
1030 socket_data.StopAfter(1);
1032 MockRead reads2[] = {
1033 MockRead(ASYNC, 0, 0) // EOF
1035 DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0);
1036 socket_factory_.AddSocketDataProvider(&socket_data2);
1037 socket_data2.StopAfter(1);
1039 QuicStreamRequest request(&factory_);
1040 EXPECT_EQ(ERR_IO_PENDING,
1041 request.Request(host_port_pair_,
1046 callback_.callback()));
1048 EXPECT_EQ(OK, callback_.WaitForResult());
1049 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1050 HttpRequestInfo request_info;
1051 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1053 net_log_, CompletionCallback()));
1055 // Change the CA cert and verify that stream saw the event.
1056 factory_.OnCACertChanged(NULL);
1057 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1058 stream->ReadResponseHeaders(callback_.callback()));
1059 EXPECT_FALSE(factory_.require_confirmation());
1061 // Now attempting to request a stream to the same origin should create
1064 QuicStreamRequest request2(&factory_);
1065 EXPECT_EQ(ERR_IO_PENDING,
1066 request2.Request(host_port_pair_,
1071 callback_.callback()));
1073 EXPECT_EQ(OK, callback_.WaitForResult());
1074 stream = request2.ReleaseStream();
1075 stream.reset(); // Will reset stream 3.
1077 EXPECT_TRUE(socket_data.at_read_eof());
1078 EXPECT_TRUE(socket_data.at_write_eof());
1079 EXPECT_TRUE(socket_data2.at_read_eof());
1080 EXPECT_TRUE(socket_data2.at_write_eof());
1083 TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
1084 vector<string> cannoncial_suffixes;
1085 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1086 cannoncial_suffixes.push_back(string(".googlevideo.com"));
1088 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1089 string r1_host_name("r1");
1090 string r2_host_name("r2");
1091 r1_host_name.append(cannoncial_suffixes[i]);
1092 r2_host_name.append(cannoncial_suffixes[i]);
1094 HostPortPair host_port_pair1(r1_host_name, 80);
1095 QuicCryptoClientConfig* crypto_config =
1096 QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
1097 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
1098 QuicCryptoClientConfig::CachedState* cached1 =
1099 crypto_config->LookupOrCreate(server_id1);
1100 EXPECT_FALSE(cached1->proof_valid());
1101 EXPECT_TRUE(cached1->source_address_token().empty());
1103 // Mutate the cached1 to have different data.
1104 // TODO(rtenneti): mutate other members of CachedState.
1105 cached1->set_source_address_token(r1_host_name);
1106 cached1->SetProofValid();
1108 HostPortPair host_port_pair2(r2_host_name, 80);
1109 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
1110 QuicCryptoClientConfig::CachedState* cached2 =
1111 crypto_config->LookupOrCreate(server_id2);
1112 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
1113 EXPECT_TRUE(cached2->proof_valid());
1117 TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
1118 vector<string> cannoncial_suffixes;
1119 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1120 cannoncial_suffixes.push_back(string(".googlevideo.com"));
1122 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1123 string r3_host_name("r3");
1124 string r4_host_name("r4");
1125 r3_host_name.append(cannoncial_suffixes[i]);
1126 r4_host_name.append(cannoncial_suffixes[i]);
1128 HostPortPair host_port_pair1(r3_host_name, 80);
1129 QuicCryptoClientConfig* crypto_config =
1130 QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
1131 QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
1132 QuicCryptoClientConfig::CachedState* cached1 =
1133 crypto_config->LookupOrCreate(server_id1);
1134 EXPECT_FALSE(cached1->proof_valid());
1135 EXPECT_TRUE(cached1->source_address_token().empty());
1137 // Mutate the cached1 to have different data.
1138 // TODO(rtenneti): mutate other members of CachedState.
1139 cached1->set_source_address_token(r3_host_name);
1140 cached1->SetProofInvalid();
1142 HostPortPair host_port_pair2(r4_host_name, 80);
1143 QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
1144 QuicCryptoClientConfig::CachedState* cached2 =
1145 crypto_config->LookupOrCreate(server_id2);
1146 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
1147 EXPECT_TRUE(cached2->source_address_token().empty());
1148 EXPECT_FALSE(cached2->proof_valid());