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 |