diff options
Diffstat (limited to 'chromium/net/quic/quic_stream_factory_test.cc')
-rw-r--r-- | chromium/net/quic/quic_stream_factory_test.cc | 893 |
1 files changed, 688 insertions, 205 deletions
diff --git a/chromium/net/quic/quic_stream_factory_test.cc b/chromium/net/quic/quic_stream_factory_test.cc index 03cc6f7e8bc..e88ea4b8052 100644 --- a/chromium/net/quic/quic_stream_factory_test.cc +++ b/chromium/net/quic/quic_stream_factory_test.cc @@ -6,20 +6,25 @@ #include "base/run_loop.h" #include "base/strings/string_util.h" +#include "net/base/test_data_directory.h" #include "net/cert/cert_verifier.h" #include "net/dns/mock_host_resolver.h" #include "net/http/http_response_headers.h" #include "net/http/http_response_info.h" #include "net/http/http_util.h" #include "net/quic/crypto/crypto_handshake.h" +#include "net/quic/crypto/proof_verifier_chromium.h" #include "net/quic/crypto/quic_decrypter.h" #include "net/quic/crypto/quic_encrypter.h" #include "net/quic/quic_http_stream.h" +#include "net/quic/quic_server_id.h" #include "net/quic/test_tools/mock_clock.h" #include "net/quic/test_tools/mock_crypto_client_stream_factory.h" #include "net/quic/test_tools/mock_random.h" +#include "net/quic/test_tools/quic_test_packet_maker.h" #include "net/quic/test_tools/quic_test_utils.h" #include "net/socket/socket_test_util.h" +#include "net/test/cert_test_util.h" #include "testing/gtest/include/gtest/gtest.h" using base::StringPiece; @@ -29,152 +34,169 @@ using std::vector; namespace net { namespace test { +namespace { +const char kDefaultServerHostName[] = "www.google.com"; +const int kDefaultServerPort = 443; +} // namespace anonymous + class QuicStreamFactoryPeer { public: - static QuicCryptoClientConfig* GetOrCreateCryptoConfig( - QuicStreamFactory* factory, - const HostPortProxyPair& host_port_proxy_pair) { - return factory->GetOrCreateCryptoConfig(host_port_proxy_pair); + static QuicCryptoClientConfig* GetCryptoConfig(QuicStreamFactory* factory) { + return &factory->crypto_config_; } static bool HasActiveSession(QuicStreamFactory* factory, - const HostPortProxyPair& host_port_proxy_pair) { - return factory->HasActiveSession(host_port_proxy_pair); + const HostPortPair& host_port_pair, + bool is_https) { + QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED); + return factory->HasActiveSession(server_id); } static QuicClientSession* GetActiveSession( QuicStreamFactory* factory, - const HostPortProxyPair& host_port_proxy_pair) { - DCHECK(factory->HasActiveSession(host_port_proxy_pair)); - return factory->active_sessions_[host_port_proxy_pair]; + const HostPortPair& host_port_pair, + bool is_https) { + QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED); + DCHECK(factory->HasActiveSession(server_id)); + return factory->active_sessions_[server_id]; + } + + static scoped_ptr<QuicHttpStream> CreateIfSessionExists( + QuicStreamFactory* factory, + const HostPortPair& host_port_pair, + bool is_https, + const BoundNetLog& net_log) { + QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED); + return factory->CreateIfSessionExists(server_id, net_log); } static bool IsLiveSession(QuicStreamFactory* factory, QuicClientSession* session) { - for (QuicStreamFactory::SessionSet::iterator it = + for (QuicStreamFactory::SessionIdMap::iterator it = factory->all_sessions_.begin(); it != factory->all_sessions_.end(); ++it) { - if (*it == session) + if (it->first == session) return true; } return false; } }; -class QuicStreamFactoryTest : public ::testing::Test { +class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> { protected: QuicStreamFactoryTest() : random_generator_(0), + maker_(GetParam(), 0), clock_(new MockClock()), + cert_verifier_(CertVerifier::CreateDefault()), factory_(&host_resolver_, &socket_factory_, - base::WeakPtr<HttpServerProperties>(), - &crypto_client_stream_factory_, - &random_generator_, clock_, kDefaultMaxPacketSize), - host_port_proxy_pair_(HostPortPair("www.google.com", 443), - ProxyServer::Direct()), + base::WeakPtr<HttpServerProperties>(), cert_verifier_.get(), + &crypto_client_stream_factory_, &random_generator_, clock_, + kDefaultMaxPacketSize, std::string(), + SupportedVersions(GetParam()), true, true, true), + host_port_pair_(kDefaultServerHostName, kDefaultServerPort), is_https_(false), - cert_verifier_(CertVerifier::CreateDefault()) { + privacy_mode_(PRIVACY_MODE_DISABLED) { factory_.set_require_confirmation(false); } - scoped_ptr<QuicEncryptedPacket> ConstructRstPacket( - QuicPacketSequenceNumber num, - QuicStreamId stream_id) { - QuicPacketHeader header; - header.public_header.guid = random_generator_.RandUint64(); - header.public_header.reset_flag = false; - header.public_header.version_flag = true; - header.packet_sequence_number = num; - header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; - header.entropy_flag = false; - header.fec_flag = false; - header.fec_group = 0; - - QuicRstStreamFrame rst(stream_id, QUIC_STREAM_CANCELLED); - return scoped_ptr<QuicEncryptedPacket>( - ConstructPacket(header, QuicFrame(&rst))); + scoped_ptr<QuicHttpStream> CreateIfSessionExists( + const HostPortPair& host_port_pair, + const BoundNetLog& net_log) { + return QuicStreamFactoryPeer::CreateIfSessionExists( + &factory_, host_port_pair, false, net_log_); } - scoped_ptr<QuicEncryptedPacket> ConstructAckPacket( - QuicPacketSequenceNumber largest_received, - QuicPacketSequenceNumber least_unacked) { - QuicPacketHeader header; - header.public_header.guid = random_generator_.RandUint64(); - header.public_header.reset_flag = false; - header.public_header.version_flag = false; - header.packet_sequence_number = 2; - header.entropy_flag = false; - header.fec_flag = false; - header.fec_group = 0; - - QuicAckFrame ack(largest_received, QuicTime::Zero(), least_unacked); - QuicCongestionFeedbackFrame feedback; - feedback.type = kTCP; - feedback.tcp.accumulated_number_of_lost_packets = 0; - feedback.tcp.receive_window = 16000; - - QuicFramer framer(QuicSupportedVersions(), QuicTime::Zero(), false); - QuicFrames frames; - frames.push_back(QuicFrame(&ack)); - frames.push_back(QuicFrame(&feedback)); - scoped_ptr<QuicPacket> packet( - framer.BuildUnsizedDataPacket(header, frames).packet); - return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket( - ENCRYPTION_NONE, header.packet_sequence_number, *packet)); + int GetSourcePortForNewSession(const HostPortPair& destination) { + return GetSourcePortForNewSessionInner(destination, false); } - // Returns a newly created packet to send congestion feedback data. - scoped_ptr<QuicEncryptedPacket> ConstructFeedbackPacket( - QuicPacketSequenceNumber sequence_number) { - QuicPacketHeader header; - header.public_header.guid = random_generator_.RandUint64(); - header.public_header.reset_flag = false; - header.public_header.version_flag = false; - header.packet_sequence_number = sequence_number; - header.entropy_flag = false; - header.fec_flag = false; - header.fec_group = 0; - - QuicCongestionFeedbackFrame frame; - frame.type = kTCP; - frame.tcp.accumulated_number_of_lost_packets = 0; - frame.tcp.receive_window = 16000; - - return scoped_ptr<QuicEncryptedPacket>( - ConstructPacket(header, QuicFrame(&frame))); + int GetSourcePortForNewSessionAndGoAway( + const HostPortPair& destination) { + return GetSourcePortForNewSessionInner(destination, true); } - scoped_ptr<QuicEncryptedPacket> ConstructPacket( - const QuicPacketHeader& header, - const QuicFrame& frame) { - QuicFramer framer(QuicSupportedVersions(), QuicTime::Zero(), false); - QuicFrames frames; - frames.push_back(frame); - scoped_ptr<QuicPacket> packet( - framer.BuildUnsizedDataPacket(header, frames).packet); - return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket( - ENCRYPTION_NONE, header.packet_sequence_number, *packet)); + int GetSourcePortForNewSessionInner(const HostPortPair& destination, + bool goaway_received) { + // Should only be called if there is no active session for this destination. + EXPECT_EQ(NULL, CreateIfSessionExists(destination, net_log_).get()); + size_t socket_count = socket_factory_.udp_client_sockets().size(); + + MockRead reads[] = { + MockRead(ASYNC, OK, 0) // EOF + }; + DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); + socket_data.StopAfter(1); + socket_factory_.AddSocketDataProvider(&socket_data); + + QuicStreamRequest request(&factory_); + EXPECT_EQ(ERR_IO_PENDING, + request.Request(destination, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback_.callback())); + + EXPECT_EQ(OK, callback_.WaitForResult()); + scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); + EXPECT_TRUE(stream.get()); + stream.reset(); + + QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession( + &factory_, destination, is_https_); + + if (socket_count + 1 != socket_factory_.udp_client_sockets().size()) { + EXPECT_TRUE(false); + return 0; + } + + IPEndPoint endpoint; + socket_factory_. + udp_client_sockets()[socket_count]->GetLocalAddress(&endpoint); + int port = endpoint.port(); + if (goaway_received) { + QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, ""); + session->OnGoAway(goaway); + } + + factory_.OnSessionClosed(session); + EXPECT_EQ(NULL, CreateIfSessionExists(destination, net_log_).get()); + EXPECT_TRUE(socket_data.at_read_eof()); + EXPECT_TRUE(socket_data.at_write_eof()); + return port; + } + + scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() { + QuicStreamId stream_id = kClientDataStreamId1; + return maker_.MakeRstPacket( + 1, true, stream_id, + AdjustErrorForVersion(QUIC_RST_FLOW_CONTROL_ACCOUNTING, GetParam())); } MockHostResolver host_resolver_; DeterministicMockClientSocketFactory socket_factory_; MockCryptoClientStreamFactory crypto_client_stream_factory_; MockRandom random_generator_; + QuicTestPacketMaker maker_; MockClock* clock_; // Owned by factory_. + scoped_ptr<CertVerifier> cert_verifier_; QuicStreamFactory factory_; - HostPortProxyPair host_port_proxy_pair_; + HostPortPair host_port_pair_; bool is_https_; - scoped_ptr<CertVerifier> cert_verifier_; + PrivacyMode privacy_mode_; BoundNetLog net_log_; TestCompletionCallback callback_; }; -TEST_F(QuicStreamFactoryTest, CreateIfSessionExists) { - EXPECT_EQ(NULL, factory_.CreateIfSessionExists(host_port_proxy_pair_, - net_log_).get()); +INSTANTIATE_TEST_CASE_P(Version, QuicStreamFactoryTest, + ::testing::ValuesIn(QuicSupportedVersions())); + +TEST_P(QuicStreamFactoryTest, CreateIfSessionExists) { + EXPECT_EQ(NULL, CreateIfSessionExists(host_port_pair_, net_log_).get()); } -TEST_F(QuicStreamFactoryTest, Create) { +TEST_P(QuicStreamFactoryTest, Create) { MockRead reads[] = { MockRead(ASYNC, OK, 0) // EOF }; @@ -183,24 +205,32 @@ TEST_F(QuicStreamFactoryTest, Create) { socket_data.StopAfter(1); QuicStreamRequest request(&factory_); - EXPECT_EQ(ERR_IO_PENDING, request.Request(host_port_proxy_pair_, is_https_, - cert_verifier_.get(), net_log_, - callback_.callback())); + EXPECT_EQ(ERR_IO_PENDING, + request.Request(host_port_pair_, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); EXPECT_TRUE(stream.get()); // Will reset stream 3. - stream = factory_.CreateIfSessionExists(host_port_proxy_pair_, net_log_); + stream = CreateIfSessionExists(host_port_pair_, net_log_); EXPECT_TRUE(stream.get()); // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result // in streams on different sessions. QuicStreamRequest request2(&factory_); - EXPECT_EQ(OK, request2.Request(host_port_proxy_pair_, is_https_, - cert_verifier_.get(), net_log_, - callback_.callback())); + EXPECT_EQ(OK, + request2.Request(host_port_pair_, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback_.callback())); stream = request2.ReleaseStream(); // Will reset stream 5. stream.reset(); // Will reset stream 7. @@ -208,36 +238,382 @@ TEST_F(QuicStreamFactoryTest, Create) { EXPECT_TRUE(socket_data.at_write_eof()); } -TEST_F(QuicStreamFactoryTest, FailedCreate) { - MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE); - DeterministicSocketData socket_data(NULL, 0, NULL, 0); - socket_data.set_connect_data(connect); +TEST_P(QuicStreamFactoryTest, CreateZeroRtt) { + MockRead reads[] = { + MockRead(ASYNC, OK, 0) // EOF + }; + DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); socket_factory_.AddSocketDataProvider(&socket_data); socket_data.StopAfter(1); + crypto_client_stream_factory_.set_handshake_mode( + MockCryptoClientStream::ZERO_RTT); + host_resolver_.set_synchronous_mode(true); + host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(), + "192.168.0.1", ""); + QuicStreamRequest request(&factory_); - EXPECT_EQ(ERR_IO_PENDING, request.Request(host_port_proxy_pair_, is_https_, - cert_verifier_.get(), net_log_, - callback_.callback())); + EXPECT_EQ(OK, + request.Request(host_port_pair_, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback_.callback())); - EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult()); + scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); + EXPECT_TRUE(stream.get()); + EXPECT_TRUE(socket_data.at_read_eof()); + EXPECT_TRUE(socket_data.at_write_eof()); } -TEST_F(QuicStreamFactoryTest, Goaway) { +TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) { MockRead reads[] = { MockRead(ASYNC, OK, 0) // EOF }; DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); + socket_factory_.AddSocketDataProvider(&socket_data); socket_data.StopAfter(1); + + crypto_client_stream_factory_.set_handshake_mode( + MockCryptoClientStream::ZERO_RTT); + host_resolver_.set_synchronous_mode(true); + host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(), + "192.168.0.1", ""); + + QuicStreamRequest request(&factory_); + // Posts require handshake confirmation, so this will return asynchronously. + EXPECT_EQ(ERR_IO_PENDING, + request.Request(host_port_pair_, + is_https_, + privacy_mode_, + "POST", + net_log_, + callback_.callback())); + + // Confirm the handshake and verify that the stream is created. + crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent( + QuicSession::HANDSHAKE_CONFIRMED); + + EXPECT_EQ(OK, callback_.WaitForResult()); + scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); + EXPECT_TRUE(stream.get()); + EXPECT_TRUE(socket_data.at_read_eof()); + EXPECT_TRUE(socket_data.at_write_eof()); +} + +TEST_P(QuicStreamFactoryTest, CreateHttpVsHttps) { + MockRead reads[] = { + MockRead(ASYNC, OK, 0) // EOF + }; + DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0); + DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0); + socket_factory_.AddSocketDataProvider(&socket_data1); + socket_factory_.AddSocketDataProvider(&socket_data2); + socket_data1.StopAfter(1); + socket_data2.StopAfter(1); + + QuicStreamRequest request(&factory_); + EXPECT_EQ(ERR_IO_PENDING, + request.Request(host_port_pair_, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback_.callback())); + + EXPECT_EQ(OK, callback_.WaitForResult()); + scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); + EXPECT_TRUE(stream.get()); + + QuicStreamRequest request2(&factory_); + EXPECT_EQ(ERR_IO_PENDING, + request2.Request(host_port_pair_, + !is_https_, + privacy_mode_, + "GET", + net_log_, + callback_.callback())); + EXPECT_EQ(OK, callback_.WaitForResult()); + stream = request2.ReleaseStream(); + EXPECT_TRUE(stream.get()); + stream.reset(); + + EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession( + &factory_, host_port_pair_, is_https_), + QuicStreamFactoryPeer::GetActiveSession( + &factory_, host_port_pair_, !is_https_)); + + EXPECT_TRUE(socket_data1.at_read_eof()); + EXPECT_TRUE(socket_data1.at_write_eof()); + EXPECT_TRUE(socket_data2.at_read_eof()); + EXPECT_TRUE(socket_data2.at_write_eof()); +} + +// TODO(rch): re-enable this. +TEST_P(QuicStreamFactoryTest, DISABLED_Pooling) { + MockRead reads[] = { + MockRead(ASYNC, OK, 0) // EOF + }; + DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); socket_factory_.AddSocketDataProvider(&socket_data); + socket_data.StopAfter(1); + + HostPortPair server2("mail.google.com", kDefaultServerPort); + host_resolver_.set_synchronous_mode(true); + host_resolver_.rules()->AddIPLiteralRule( + kDefaultServerHostName, "192.168.0.1", ""); + host_resolver_.rules()->AddIPLiteralRule( + "mail.google.com", "192.168.0.1", ""); + + QuicStreamRequest request(&factory_); + EXPECT_EQ(OK, + request.Request(host_port_pair_, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback_.callback())); + scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); + EXPECT_TRUE(stream.get()); + + TestCompletionCallback callback; + QuicStreamRequest request2(&factory_); + EXPECT_EQ(OK, + request2.Request(server2, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback.callback())); + scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); + EXPECT_TRUE(stream2.get()); + + EXPECT_EQ( + QuicStreamFactoryPeer::GetActiveSession( + &factory_, host_port_pair_, is_https_), + QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_)); + + EXPECT_TRUE(socket_data.at_read_eof()); + EXPECT_TRUE(socket_data.at_write_eof()); +} + +TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) { + MockRead reads[] = { + MockRead(ASYNC, OK, 0) // EOF + }; + DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0); DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0); + socket_factory_.AddSocketDataProvider(&socket_data1); + socket_factory_.AddSocketDataProvider(&socket_data2); + socket_data1.StopAfter(1); socket_data2.StopAfter(1); + + HostPortPair server2("mail.google.com", kDefaultServerPort); + host_resolver_.set_synchronous_mode(true); + host_resolver_.rules()->AddIPLiteralRule( + kDefaultServerHostName, "192.168.0.1", ""); + host_resolver_.rules()->AddIPLiteralRule( + "mail.google.com", "192.168.0.1", ""); + + QuicStreamRequest request(&factory_); + EXPECT_EQ(OK, + request.Request(host_port_pair_, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback_.callback())); + scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); + EXPECT_TRUE(stream.get()); + + TestCompletionCallback callback; + QuicStreamRequest request2(&factory_); + EXPECT_EQ(OK, + request2.Request(server2, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback.callback())); + scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); + EXPECT_TRUE(stream2.get()); + + factory_.OnSessionGoingAway(QuicStreamFactoryPeer::GetActiveSession( + &factory_, host_port_pair_, is_https_)); + EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession( + &factory_, host_port_pair_, is_https_)); + EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession( + &factory_, server2, is_https_)); + + TestCompletionCallback callback3; + QuicStreamRequest request3(&factory_); + EXPECT_EQ(OK, + request3.Request(server2, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback3.callback())); + scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream(); + EXPECT_TRUE(stream3.get()); + + EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession( + &factory_, server2, is_https_)); + + EXPECT_TRUE(socket_data1.at_read_eof()); + EXPECT_TRUE(socket_data1.at_write_eof()); + EXPECT_TRUE(socket_data2.at_read_eof()); + EXPECT_TRUE(socket_data2.at_write_eof()); +} + +// TODO(rch): re-enable this. +TEST_P(QuicStreamFactoryTest, DISABLED_HttpsPooling) { + MockRead reads[] = { + MockRead(ASYNC, OK, 0) // EOF + }; + DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); + socket_factory_.AddSocketDataProvider(&socket_data); + socket_data.StopAfter(1); + + HostPortPair server1("www.example.org", 443); + HostPortPair server2("mail.example.org", 443); + + // Load a cert that is valid for: + // www.example.org (server1) + // mail.example.org (server2) + // www.example.com + base::FilePath certs_dir = GetTestCertsDirectory(); + scoped_refptr<X509Certificate> test_cert( + ImportCertFromFile(certs_dir, "spdy_pooling.pem")); + ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert); + ProofVerifyDetailsChromium verify_details; + verify_details.cert_verify_result.verified_cert = test_cert; + crypto_client_stream_factory_.set_proof_verify_details(&verify_details); + + host_resolver_.set_synchronous_mode(true); + host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", ""); + host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); + + QuicStreamRequest request(&factory_); + is_https_ = true; + EXPECT_EQ(OK, + request.Request(server1, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback_.callback())); + scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); + EXPECT_TRUE(stream.get()); + + TestCompletionCallback callback; + QuicStreamRequest request2(&factory_); + EXPECT_EQ(OK, + request2.Request(server2, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback_.callback())); + scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); + EXPECT_TRUE(stream2.get()); + + EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession( + &factory_, server1, is_https_), + QuicStreamFactoryPeer::GetActiveSession( + &factory_, server2, is_https_)); + + EXPECT_TRUE(socket_data.at_read_eof()); + EXPECT_TRUE(socket_data.at_write_eof()); +} + +TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithCertMismatch) { + MockRead reads[] = { + MockRead(ASYNC, OK, 0) // EOF + }; + DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0); + DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0); + socket_factory_.AddSocketDataProvider(&socket_data1); socket_factory_.AddSocketDataProvider(&socket_data2); + socket_data1.StopAfter(1); + socket_data2.StopAfter(1); + + HostPortPair server1("www.example.org", 443); + HostPortPair server2("mail.google.com", 443); + + // Load a cert that is valid for: + // www.example.org (server1) + // mail.example.org + // www.example.com + // But is not valid for mail.google.com (server2). + base::FilePath certs_dir = GetTestCertsDirectory(); + scoped_refptr<X509Certificate> test_cert( + ImportCertFromFile(certs_dir, "spdy_pooling.pem")); + ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert); + ProofVerifyDetailsChromium verify_details; + verify_details.cert_verify_result.verified_cert = test_cert; + crypto_client_stream_factory_.set_proof_verify_details(&verify_details); + + + host_resolver_.set_synchronous_mode(true); + host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", ""); + host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); QuicStreamRequest request(&factory_); - EXPECT_EQ(ERR_IO_PENDING, request.Request(host_port_proxy_pair_, is_https_, - cert_verifier_.get(), net_log_, - callback_.callback())); + is_https_ = true; + EXPECT_EQ(OK, + request.Request(server1, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback_.callback())); + scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); + EXPECT_TRUE(stream.get()); + + TestCompletionCallback callback; + QuicStreamRequest request2(&factory_); + EXPECT_EQ(OK, + request2.Request(server2, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback_.callback())); + scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); + EXPECT_TRUE(stream2.get()); + + EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession( + &factory_, server1, is_https_), + QuicStreamFactoryPeer::GetActiveSession( + &factory_, server2, is_https_)); + + EXPECT_TRUE(socket_data1.at_read_eof()); + EXPECT_TRUE(socket_data1.at_write_eof()); + EXPECT_TRUE(socket_data2.at_read_eof()); + EXPECT_TRUE(socket_data2.at_write_eof()); +} + +TEST_P(QuicStreamFactoryTest, Goaway) { + MockRead reads[] = { + MockRead(ASYNC, OK, 0) // EOF + }; + DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); + socket_data.StopAfter(1); + socket_factory_.AddSocketDataProvider(&socket_data); + DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0); + socket_data2.StopAfter(1); + socket_factory_.AddSocketDataProvider(&socket_data2); + + QuicStreamRequest request(&factory_); + EXPECT_EQ(ERR_IO_PENDING, + request.Request(host_port_pair_, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); @@ -246,29 +622,33 @@ TEST_F(QuicStreamFactoryTest, Goaway) { // Mark the session as going away. Ensure that while it is still alive // that it is no longer active. QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession( - &factory_, host_port_proxy_pair_); + &factory_, host_port_pair_, is_https_); factory_.OnSessionGoingAway(session); EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session)); - EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(&factory_, - host_port_proxy_pair_)); - EXPECT_EQ(NULL, factory_.CreateIfSessionExists(host_port_proxy_pair_, - net_log_).get()); + EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession( + &factory_, host_port_pair_, is_https_)); + EXPECT_EQ(NULL, CreateIfSessionExists(host_port_pair_, net_log_).get()); // Create a new request for the same destination and verify that a // new session is created. QuicStreamRequest request2(&factory_); - EXPECT_EQ(ERR_IO_PENDING, request2.Request(host_port_proxy_pair_, is_https_, - cert_verifier_.get(), net_log_, - callback_.callback())); + EXPECT_EQ(ERR_IO_PENDING, + request2.Request(host_port_pair_, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); EXPECT_TRUE(stream2.get()); EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(&factory_, - host_port_proxy_pair_)); + host_port_pair_, + is_https_)); EXPECT_NE(session, QuicStreamFactoryPeer::GetActiveSession( - &factory_, host_port_proxy_pair_)); + &factory_, host_port_pair_, is_https_)); EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session)); stream2.reset(); @@ -276,13 +656,17 @@ TEST_F(QuicStreamFactoryTest, Goaway) { EXPECT_TRUE(socket_data.at_read_eof()); EXPECT_TRUE(socket_data.at_write_eof()); + EXPECT_TRUE(socket_data2.at_read_eof()); + EXPECT_TRUE(socket_data2.at_write_eof()); } -TEST_F(QuicStreamFactoryTest, MaxOpenStream) { +TEST_P(QuicStreamFactoryTest, MaxOpenStream) { MockRead reads[] = { MockRead(ASYNC, OK, 0) // EOF }; - scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket(1, 3)); + QuicStreamId stream_id = kClientDataStreamId1; + scoped_ptr<QuicEncryptedPacket> rst( + maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED)); MockWrite writes[] = { MockWrite(ASYNC, rst->data(), rst->length(), 1), }; @@ -297,8 +681,11 @@ TEST_F(QuicStreamFactoryTest, MaxOpenStream) { // 2 * kDefaultMaxStreamsPerConnection. for (size_t i = 0; i < 2 * kDefaultMaxStreamsPerConnection; i++) { QuicStreamRequest request(&factory_); - int rv = request.Request(host_port_proxy_pair_, is_https_, - cert_verifier_.get(), net_log_, + int rv = request.Request(host_port_pair_, + is_https_, + privacy_mode_, + "GET", + net_log_, callback_.callback()); if (i == 0) { EXPECT_EQ(ERR_IO_PENDING, rv); @@ -314,9 +701,13 @@ TEST_F(QuicStreamFactoryTest, MaxOpenStream) { } QuicStreamRequest request(&factory_); - EXPECT_EQ(OK, request.Request(host_port_proxy_pair_, is_https_, - cert_verifier_.get(), net_log_, - CompletionCallback())); + EXPECT_EQ(OK, + request.Request(host_port_pair_, + is_https_, + privacy_mode_, + "GET", + net_log_, + CompletionCallback())); scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); EXPECT_TRUE(stream); EXPECT_EQ(ERR_IO_PENDING, stream->InitializeStream( @@ -334,16 +725,20 @@ TEST_F(QuicStreamFactoryTest, MaxOpenStream) { STLDeleteElements(&streams); } -TEST_F(QuicStreamFactoryTest, CreateError) { +TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) { DeterministicSocketData socket_data(NULL, 0, NULL, 0); socket_factory_.AddSocketDataProvider(&socket_data); - host_resolver_.rules()->AddSimulatedFailure("www.google.com"); + host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName); QuicStreamRequest request(&factory_); - EXPECT_EQ(ERR_IO_PENDING, request.Request(host_port_proxy_pair_, is_https_, - cert_verifier_.get(), net_log_, - callback_.callback())); + EXPECT_EQ(ERR_IO_PENDING, + request.Request(host_port_pair_, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback_.callback())); EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult()); @@ -351,7 +746,29 @@ TEST_F(QuicStreamFactoryTest, CreateError) { EXPECT_TRUE(socket_data.at_write_eof()); } -TEST_F(QuicStreamFactoryTest, CancelCreate) { +TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) { + MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE); + DeterministicSocketData socket_data(NULL, 0, NULL, 0); + socket_data.set_connect_data(connect); + socket_factory_.AddSocketDataProvider(&socket_data); + socket_data.StopAfter(1); + + QuicStreamRequest request(&factory_); + EXPECT_EQ(ERR_IO_PENDING, + request.Request(host_port_pair_, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback_.callback())); + + EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult()); + + EXPECT_TRUE(socket_data.at_read_eof()); + EXPECT_TRUE(socket_data.at_write_eof()); +} + +TEST_P(QuicStreamFactoryTest, CancelCreate) { MockRead reads[] = { MockRead(ASYNC, OK, 0) // EOF }; @@ -359,9 +776,13 @@ TEST_F(QuicStreamFactoryTest, CancelCreate) { socket_factory_.AddSocketDataProvider(&socket_data); { QuicStreamRequest request(&factory_); - EXPECT_EQ(ERR_IO_PENDING, request.Request(host_port_proxy_pair_, is_https_, - cert_verifier_.get(), net_log_, - callback_.callback())); + EXPECT_EQ(ERR_IO_PENDING, + request.Request(host_port_pair_, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback_.callback())); } socket_data.StopAfter(1); @@ -369,7 +790,7 @@ TEST_F(QuicStreamFactoryTest, CancelCreate) { run_loop.RunUntilIdle(); scoped_ptr<QuicHttpStream> stream( - factory_.CreateIfSessionExists(host_port_proxy_pair_, net_log_)); + CreateIfSessionExists(host_port_pair_, net_log_)); EXPECT_TRUE(stream.get()); stream.reset(); @@ -377,11 +798,40 @@ TEST_F(QuicStreamFactoryTest, CancelCreate) { EXPECT_TRUE(socket_data.at_write_eof()); } -TEST_F(QuicStreamFactoryTest, CloseAllSessions) { +TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) { + // Sequentially connect to the default host, then another host, and then the + // default host. Verify that the default host gets a consistent ephemeral + // port, that is different from the other host's connection. + + std::string other_server_name = "other.google.com"; + EXPECT_NE(kDefaultServerHostName, other_server_name); + HostPortPair host_port_pair2(other_server_name, kDefaultServerPort); + + int original_port = GetSourcePortForNewSession(host_port_pair_); + EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2)); + EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_)); +} + +TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) { + // Get a session to the host using the port suggester. + int original_port = + GetSourcePortForNewSessionAndGoAway(host_port_pair_); + // Verify that the port is different after the goaway. + EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_)); + // Since the previous session did not goaway we should see the original port. + EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_)); +} + +TEST_P(QuicStreamFactoryTest, CloseAllSessions) { MockRead reads[] = { MockRead(ASYNC, 0, 0) // EOF }; - DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); + scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket()); + std::vector<MockWrite> writes; + writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1)); + DeterministicSocketData socket_data(reads, arraysize(reads), + writes.empty() ? NULL : &writes[0], + writes.size()); socket_factory_.AddSocketDataProvider(&socket_data); socket_data.StopAfter(1); @@ -393,9 +843,13 @@ TEST_F(QuicStreamFactoryTest, CloseAllSessions) { socket_data2.StopAfter(1); QuicStreamRequest request(&factory_); - EXPECT_EQ(ERR_IO_PENDING, request.Request(host_port_proxy_pair_, is_https_, - cert_verifier_.get(), net_log_, - callback_.callback())); + EXPECT_EQ(ERR_IO_PENDING, + request.Request(host_port_pair_, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); @@ -413,9 +867,13 @@ TEST_F(QuicStreamFactoryTest, CloseAllSessions) { // a new session. QuicStreamRequest request2(&factory_); - EXPECT_EQ(ERR_IO_PENDING, request2.Request(host_port_proxy_pair_, is_https_, - cert_verifier_.get(), net_log_, - callback_.callback())); + EXPECT_EQ(ERR_IO_PENDING, + request2.Request(host_port_pair_, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); stream = request2.ReleaseStream(); @@ -427,11 +885,16 @@ TEST_F(QuicStreamFactoryTest, CloseAllSessions) { EXPECT_TRUE(socket_data2.at_write_eof()); } -TEST_F(QuicStreamFactoryTest, OnIPAddressChanged) { +TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) { MockRead reads[] = { MockRead(ASYNC, 0, 0) // EOF }; - DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); + scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket()); + std::vector<MockWrite> writes; + writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1)); + DeterministicSocketData socket_data(reads, arraysize(reads), + writes.empty() ? NULL : &writes[0], + writes.size()); socket_factory_.AddSocketDataProvider(&socket_data); socket_data.StopAfter(1); @@ -443,9 +906,13 @@ TEST_F(QuicStreamFactoryTest, OnIPAddressChanged) { socket_data2.StopAfter(1); QuicStreamRequest request(&factory_); - EXPECT_EQ(ERR_IO_PENDING, request.Request(host_port_proxy_pair_, is_https_, - cert_verifier_.get(), net_log_, - callback_.callback())); + EXPECT_EQ(ERR_IO_PENDING, + request.Request(host_port_pair_, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); @@ -464,9 +931,13 @@ TEST_F(QuicStreamFactoryTest, OnIPAddressChanged) { // a new session. QuicStreamRequest request2(&factory_); - EXPECT_EQ(ERR_IO_PENDING, request2.Request(host_port_proxy_pair_, is_https_, - cert_verifier_.get(), net_log_, - callback_.callback())); + EXPECT_EQ(ERR_IO_PENDING, + request2.Request(host_port_pair_, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); stream = request2.ReleaseStream(); @@ -478,11 +949,16 @@ TEST_F(QuicStreamFactoryTest, OnIPAddressChanged) { EXPECT_TRUE(socket_data2.at_write_eof()); } -TEST_F(QuicStreamFactoryTest, OnCertAdded) { +TEST_P(QuicStreamFactoryTest, OnCertAdded) { MockRead reads[] = { MockRead(ASYNC, 0, 0) // EOF }; - DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); + scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket()); + std::vector<MockWrite> writes; + writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1)); + DeterministicSocketData socket_data(reads, arraysize(reads), + writes.empty() ? NULL : &writes[0], + writes.size()); socket_factory_.AddSocketDataProvider(&socket_data); socket_data.StopAfter(1); @@ -494,9 +970,13 @@ TEST_F(QuicStreamFactoryTest, OnCertAdded) { socket_data2.StopAfter(1); QuicStreamRequest request(&factory_); - EXPECT_EQ(ERR_IO_PENDING, request.Request(host_port_proxy_pair_, is_https_, - cert_verifier_.get(), net_log_, - callback_.callback())); + EXPECT_EQ(ERR_IO_PENDING, + request.Request(host_port_pair_, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); @@ -515,9 +995,13 @@ TEST_F(QuicStreamFactoryTest, OnCertAdded) { // a new session. QuicStreamRequest request2(&factory_); - EXPECT_EQ(ERR_IO_PENDING, request2.Request(host_port_proxy_pair_, is_https_, - cert_verifier_.get(), net_log_, - callback_.callback())); + EXPECT_EQ(ERR_IO_PENDING, + request2.Request(host_port_pair_, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); stream = request2.ReleaseStream(); @@ -529,11 +1013,16 @@ TEST_F(QuicStreamFactoryTest, OnCertAdded) { EXPECT_TRUE(socket_data2.at_write_eof()); } -TEST_F(QuicStreamFactoryTest, OnCACertChanged) { +TEST_P(QuicStreamFactoryTest, OnCACertChanged) { MockRead reads[] = { MockRead(ASYNC, 0, 0) // EOF }; - DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); + scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket()); + std::vector<MockWrite> writes; + writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1)); + DeterministicSocketData socket_data(reads, arraysize(reads), + writes.empty() ? NULL : &writes[0], + writes.size()); socket_factory_.AddSocketDataProvider(&socket_data); socket_data.StopAfter(1); @@ -545,9 +1034,13 @@ TEST_F(QuicStreamFactoryTest, OnCACertChanged) { socket_data2.StopAfter(1); QuicStreamRequest request(&factory_); - EXPECT_EQ(ERR_IO_PENDING, request.Request(host_port_proxy_pair_, is_https_, - cert_verifier_.get(), net_log_, - callback_.callback())); + EXPECT_EQ(ERR_IO_PENDING, + request.Request(host_port_pair_, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); @@ -566,9 +1059,13 @@ TEST_F(QuicStreamFactoryTest, OnCACertChanged) { // a new session. QuicStreamRequest request2(&factory_); - EXPECT_EQ(ERR_IO_PENDING, request2.Request(host_port_proxy_pair_, is_https_, - cert_verifier_.get(), net_log_, - callback_.callback())); + EXPECT_EQ(ERR_IO_PENDING, + request2.Request(host_port_pair_, + is_https_, + privacy_mode_, + "GET", + net_log_, + callback_.callback())); EXPECT_EQ(OK, callback_.WaitForResult()); stream = request2.ReleaseStream(); @@ -580,7 +1077,7 @@ TEST_F(QuicStreamFactoryTest, OnCACertChanged) { EXPECT_TRUE(socket_data2.at_write_eof()); } -TEST_F(QuicStreamFactoryTest, SharedCryptoConfig) { +TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) { vector<string> cannoncial_suffixes; cannoncial_suffixes.push_back(string(".c.youtube.com")); cannoncial_suffixes.push_back(string(".googlevideo.com")); @@ -591,15 +1088,12 @@ TEST_F(QuicStreamFactoryTest, SharedCryptoConfig) { r1_host_name.append(cannoncial_suffixes[i]); r2_host_name.append(cannoncial_suffixes[i]); - HostPortProxyPair host_port_proxy_pair1(HostPortPair(r1_host_name, 80), - ProxyServer::Direct()); - - QuicCryptoClientConfig* crypto_config1 = - QuicStreamFactoryPeer::GetOrCreateCryptoConfig(&factory_, - host_port_proxy_pair1); - DCHECK(crypto_config1); + HostPortPair host_port_pair1(r1_host_name, 80); + QuicCryptoClientConfig* crypto_config = + QuicStreamFactoryPeer::GetCryptoConfig(&factory_); + QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_); QuicCryptoClientConfig::CachedState* cached1 = - crypto_config1->LookupOrCreate(host_port_proxy_pair1.first.host()); + crypto_config->LookupOrCreate(server_id1); EXPECT_FALSE(cached1->proof_valid()); EXPECT_TRUE(cached1->source_address_token().empty()); @@ -608,20 +1102,16 @@ TEST_F(QuicStreamFactoryTest, SharedCryptoConfig) { cached1->set_source_address_token(r1_host_name); cached1->SetProofValid(); - HostPortProxyPair host_port_proxy_pair2(HostPortPair(r2_host_name, 80), - ProxyServer::Direct()); - QuicCryptoClientConfig* crypto_config2 = - QuicStreamFactoryPeer::GetOrCreateCryptoConfig(&factory_, - host_port_proxy_pair2); - DCHECK(crypto_config2); + HostPortPair host_port_pair2(r2_host_name, 80); + QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_); QuicCryptoClientConfig::CachedState* cached2 = - crypto_config2->LookupOrCreate(host_port_proxy_pair2.first.host()); + crypto_config->LookupOrCreate(server_id2); EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token()); EXPECT_TRUE(cached2->proof_valid()); } } -TEST_F(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) { +TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) { vector<string> cannoncial_suffixes; cannoncial_suffixes.push_back(string(".c.youtube.com")); cannoncial_suffixes.push_back(string(".googlevideo.com")); @@ -632,15 +1122,12 @@ TEST_F(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) { r3_host_name.append(cannoncial_suffixes[i]); r4_host_name.append(cannoncial_suffixes[i]); - HostPortProxyPair host_port_proxy_pair1(HostPortPair(r3_host_name, 80), - ProxyServer::Direct()); - - QuicCryptoClientConfig* crypto_config1 = - QuicStreamFactoryPeer::GetOrCreateCryptoConfig(&factory_, - host_port_proxy_pair1); - DCHECK(crypto_config1); + HostPortPair host_port_pair1(r3_host_name, 80); + QuicCryptoClientConfig* crypto_config = + QuicStreamFactoryPeer::GetCryptoConfig(&factory_); + QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_); QuicCryptoClientConfig::CachedState* cached1 = - crypto_config1->LookupOrCreate(host_port_proxy_pair1.first.host()); + crypto_config->LookupOrCreate(server_id1); EXPECT_FALSE(cached1->proof_valid()); EXPECT_TRUE(cached1->source_address_token().empty()); @@ -649,14 +1136,10 @@ TEST_F(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) { cached1->set_source_address_token(r3_host_name); cached1->SetProofInvalid(); - HostPortProxyPair host_port_proxy_pair2(HostPortPair(r4_host_name, 80), - ProxyServer::Direct()); - QuicCryptoClientConfig* crypto_config2 = - QuicStreamFactoryPeer::GetOrCreateCryptoConfig(&factory_, - host_port_proxy_pair2); - DCHECK(crypto_config2); + HostPortPair host_port_pair2(r4_host_name, 80); + QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_); QuicCryptoClientConfig::CachedState* cached2 = - crypto_config2->LookupOrCreate(host_port_proxy_pair2.first.host()); + crypto_config->LookupOrCreate(server_id2); EXPECT_NE(cached1->source_address_token(), cached2->source_address_token()); EXPECT_TRUE(cached2->source_address_token().empty()); EXPECT_FALSE(cached2->proof_valid()); |