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 106882003805807dc8a2d858e94b68d71403716c..c8da53ce761c46ee916fa88bd5dfb89cdd6bf715 100644 |
--- a/net/quic/quic_stream_factory_test.cc |
+++ b/net/quic/quic_stream_factory_test.cc |
@@ -4277,6 +4277,74 @@ TEST_P(QuicStreamFactoryWithDestinationTest, SharedCertificate) { |
EXPECT_TRUE(AllDataConsumed()); |
} |
+// QuicStreamRequest is not pooled if PrivacyMode differs. |
+TEST_P(QuicStreamFactoryWithDestinationTest, DifferentPrivacyMode) { |
+ Initialize(); |
+ |
+ GURL url1("https://www.example.org/"); |
+ GURL url2("https://mail.example.org/"); |
+ origin1_ = HostPortPair::FromURL(url1); |
+ origin2_ = HostPortPair::FromURL(url2); |
+ |
+ HostPortPair destination = GetDestination(); |
+ |
+ scoped_refptr<X509Certificate> cert( |
+ ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem")); |
+ bool unused; |
+ ASSERT_TRUE(cert->VerifyNameMatch(origin1_.host(), &unused)); |
+ ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host(), &unused)); |
+ ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname, &unused)); |
+ |
+ ProofVerifyDetailsChromium verify_details1; |
+ verify_details1.cert_verify_result.verified_cert = cert; |
+ verify_details1.cert_verify_result.is_issued_by_known_root = true; |
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1); |
+ |
+ ProofVerifyDetailsChromium verify_details2; |
+ verify_details2.cert_verify_result.verified_cert = cert; |
+ verify_details2.cert_verify_result.is_issued_by_known_root = true; |
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2); |
+ |
+ AddHangingSocketData(); |
+ AddHangingSocketData(); |
+ |
+ QuicStreamRequest request1(factory_.get()); |
+ EXPECT_EQ(ERR_IO_PENDING, |
+ request1.Request(destination, PRIVACY_MODE_DISABLED, |
+ /*cert_verify_flags=*/0, url1, "GET", net_log_, |
+ callback_.callback())); |
+ EXPECT_EQ(OK, callback_.WaitForResult()); |
+ std::unique_ptr<QuicHttpStream> stream1 = request1.CreateStream(); |
+ EXPECT_TRUE(stream1.get()); |
+ EXPECT_TRUE(HasActiveSession(origin1_)); |
+ |
+ TestCompletionCallback callback2; |
+ QuicStreamRequest request2(factory_.get()); |
+ EXPECT_EQ(ERR_IO_PENDING, |
+ request2.Request(destination, PRIVACY_MODE_ENABLED, |
+ /*cert_verify_flags=*/0, url2, "GET", net_log_, |
+ callback2.callback())); |
+ EXPECT_EQ(OK, callback2.WaitForResult()); |
+ std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream(); |
+ EXPECT_TRUE(stream2.get()); |
+ |
+ // |request2| does not pool to the first session, because PrivacyMode does not |
+ // match. Instead, another session is opened to the same destination, but |
+ // with a different QuicServerId. |
+ QuicChromiumClientSession* session1 = |
+ QuicHttpStreamPeer::GetSession(stream1.get()); |
+ QuicChromiumClientSession* session2 = |
+ QuicHttpStreamPeer::GetSession(stream2.get()); |
+ EXPECT_NE(session1, session2); |
+ |
+ EXPECT_EQ(QuicServerId(origin1_, PRIVACY_MODE_DISABLED), |
+ session1->server_id()); |
+ EXPECT_EQ(QuicServerId(origin2_, PRIVACY_MODE_ENABLED), |
+ session2->server_id()); |
+ |
+ EXPECT_TRUE(AllDataConsumed()); |
+} |
+ |
// QuicStreamRequest is not pooled if certificate does not match its origin. |
TEST_P(QuicStreamFactoryWithDestinationTest, DisjointCertificate) { |
Initialize(); |