| Index: net/quic/quic_stream_factory_test.cc
|
| diff --git a/net/quic/quic_stream_factory_test.cc b/net/quic/quic_stream_factory_test.cc
|
| index 76501847436fecdb8c5f8e85383b9baaa7132688..374eda4cc748990b07ba993f9bc6c3f8fe18f5a7 100644
|
| --- a/net/quic/quic_stream_factory_test.cc
|
| +++ b/net/quic/quic_stream_factory_test.cc
|
| @@ -84,6 +84,10 @@ class QuicStreamFactoryPeer {
|
| }
|
| return false;
|
| }
|
| +
|
| + static void DisableConnectionPooling(QuicStreamFactory* factory) {
|
| + factory->disable_connection_pooling_ = true;
|
| + }
|
| };
|
|
|
| class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> {
|
| @@ -110,7 +114,8 @@ class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> {
|
| SupportedVersions(GetParam()),
|
| /*enable_port_selection=*/true,
|
| /*enable_time_based_loss_detection=*/true,
|
| - /*always_require_handshake_confirmation=*/true,
|
| + /*always_require_handshake_confirmation=*/false,
|
| + /*disable_connection_pooling=*/false,
|
| QuicTagVector()),
|
| host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
|
| is_https_(false),
|
| @@ -418,6 +423,61 @@ TEST_P(QuicStreamFactoryTest, Pooling) {
|
| EXPECT_TRUE(socket_data.at_write_eof());
|
| }
|
|
|
| +TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) {
|
| + 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", "");
|
| +
|
| + // Disable connection pooling.
|
| + QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
|
| +
|
| + 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_NE(
|
| + QuicStreamFactoryPeer::GetActiveSession(
|
| + &factory_, host_port_pair_, 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, NoPoolingAfterGoAway) {
|
| MockRead reads[] = {
|
| MockRead(ASYNC, OK, 0) // EOF
|
| @@ -548,6 +608,75 @@ TEST_P(QuicStreamFactoryTest, HttpsPooling) {
|
| EXPECT_TRUE(socket_data.at_write_eof());
|
| }
|
|
|
| +TEST_P(QuicStreamFactoryTest, NoHttpsPoolingIfDisabled) {
|
| + 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.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.get());
|
| + ProofVerifyDetailsChromium verify_details;
|
| + verify_details.cert_verify_result.verified_cert = test_cert;
|
| + verify_details.cert_verify_result.is_issued_by_known_root = true;
|
| + 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", "");
|
| +
|
| + // Disable connection pooling.
|
| + QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
|
| +
|
| + 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_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, NoHttpsPoolingWithCertMismatch) {
|
| MockRead reads[] = {
|
| MockRead(ASYNC, OK, 0) // EOF
|
| @@ -682,6 +811,81 @@ TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
|
| EXPECT_TRUE(socket_data.at_write_eof());
|
| }
|
|
|
| +TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithMatchingPinsIfDisabled) {
|
| + 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.example.org", 443);
|
| + uint8 primary_pin = 1;
|
| + uint8 backup_pin = 2;
|
| + test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
|
| + backup_pin);
|
| +
|
| + // Load a cert that is valid for:
|
| + // www.example.org (server1)
|
| + // mail.example.org (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.get());
|
| + ProofVerifyDetailsChromium verify_details;
|
| + verify_details.cert_verify_result.verified_cert = test_cert;
|
| + verify_details.cert_verify_result.is_issued_by_known_root = true;
|
| + verify_details.cert_verify_result.public_key_hashes.push_back(
|
| + test::GetTestHashValue(primary_pin));
|
| + 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", "");
|
| +
|
| + // Disable connection pooling.
|
| + QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
|
| +
|
| + 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_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, NoHttpsPoolingWithDifferentPins) {
|
| MockRead reads[] = {
|
| MockRead(ASYNC, OK, 0) // EOF
|
|
|