Index: net/quic/quic_network_transaction_unittest.cc |
diff --git a/net/quic/quic_network_transaction_unittest.cc b/net/quic/quic_network_transaction_unittest.cc |
index 3a3b6a1015c95e1fcf62b74728fb5734934330c5..c6b4527922c48554e773fbde942353b12ace78c2 100644 |
--- a/net/quic/quic_network_transaction_unittest.cc |
+++ b/net/quic/quic_network_transaction_unittest.cc |
@@ -528,6 +528,18 @@ class QuicNetworkTransactionTest |
host_port_pair, alternative_service, 1.0, expiration); |
} |
+ void AddQuicRemoteAlternativeServiceMapping( |
+ MockCryptoClientStream::HandshakeMode handshake_mode, |
+ const HostPortPair& alternative) { |
+ crypto_client_stream_factory_.set_handshake_mode(handshake_mode); |
+ HostPortPair host_port_pair = HostPortPair::FromURL(request_.url); |
+ AlternativeService alternative_service(QUIC, alternative.host(), |
+ alternative.port()); |
+ base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
+ http_server_properties_.SetAlternativeService( |
+ host_port_pair, alternative_service, 1.0, expiration); |
+ } |
+ |
void ExpectBrokenAlternateProtocolMapping() { |
const HostPortPair origin = HostPortPair::FromURL(request_.url); |
const AlternativeServiceVector alternative_service_vector = |
@@ -743,6 +755,48 @@ TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) { |
SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70); |
} |
+TEST_P(QuicNetworkTransactionTest, AlternativeServicesDifferentHost) { |
+ params_.enable_alternative_service_with_different_host = true; |
+ HostPortPair origin("www.example.org", 443); |
+ HostPortPair alternative("mail.example.org", 443); |
+ |
+ base::FilePath certs_dir = GetTestCertsDirectory(); |
+ scoped_refptr<X509Certificate> cert( |
+ ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem")); |
+ ASSERT_TRUE(cert.get()); |
+ // TODO(rch): the connection should be "to" the origin, so if the cert is |
+ // valid for the origin but not the alternative, that should work too. |
+ bool common_name_fallback_used; |
+ EXPECT_TRUE(cert->VerifyNameMatch(origin.host(), &common_name_fallback_used)); |
+ EXPECT_TRUE( |
+ cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used)); |
+ ProofVerifyDetailsChromium verify_details; |
+ verify_details.cert_verify_result.verified_cert = cert; |
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
+ |
+ maker_.set_hostname(origin.host()); |
+ MockQuicData mock_quic_data; |
+ mock_quic_data.AddWrite( |
+ ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
+ GetRequestHeaders("GET", "https", "/"))); |
+ mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
+ 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); |
+ mock_quic_data.AddRead( |
+ ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
+ mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
+ mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
+ mock_quic_data.AddRead(ASYNC, 0); |
+ mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
+ |
+ request_.url = GURL("https://" + origin.host()); |
+ AddQuicRemoteAlternativeServiceMapping( |
+ MockCryptoClientStream::CONFIRM_HANDSHAKE, alternative); |
+ AddHangingNonAlternateProtocolSocketData(); |
+ CreateSessionWithNextProtos(); |
+ |
+ SendRequestAndExpectQuicResponse("hello!"); |
+} |
+ |
TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) { |
params_.origin_to_force_quic_on = |
HostPortPair::FromString("mail.example.org:443"); |