Index: net/spdy/spdy_session_unittest.cc |
diff --git a/net/spdy/spdy_session_unittest.cc b/net/spdy/spdy_session_unittest.cc |
index 2bf6f2002376b6d16cd01a63aa37d36b68d5163f..2a0eab0dcfbf29e21299759d38e7a0ecbe5e7547 100644 |
--- a/net/spdy/spdy_session_unittest.cc |
+++ b/net/spdy/spdy_session_unittest.cc |
@@ -2394,7 +2394,7 @@ TEST_P(SpdySessionTest, VerifyDomainAuthentication) { |
// Load a cert that is valid for: |
// www.example.org |
// mail.example.org |
- // www.example.com |
+ // mail.example.com |
base::FilePath certs_dir = GetTestCertsDirectory(); |
scoped_refptr<X509Certificate> test_cert( |
ImportCertFromFile(certs_dir, "spdy_pooling.pem")); |
@@ -2423,7 +2423,7 @@ TEST_P(SpdySessionTest, ConnectionPooledWithTlsChannelId) { |
// Load a cert that is valid for: |
// www.example.org |
// mail.example.org |
- // www.example.com |
+ // mail.example.com |
base::FilePath certs_dir = GetTestCertsDirectory(); |
scoped_refptr<X509Certificate> test_cert( |
ImportCertFromFile(certs_dir, "spdy_pooling.pem")); |
@@ -5319,6 +5319,282 @@ TEST_P(SpdySessionTest, RejectInvalidUnknownFrames) { |
EXPECT_FALSE(session_->OnUnknownFrame(8, 0)); |
} |
+class AltSvcFrameTest : public SpdySessionTest { |
+ public: |
+ AltSvcFrameTest() |
+ : alternative_service_("quic", |
+ "alternative.example.org", |
+ 443, |
+ 86400, |
+ SpdyAltSvcWireFormat::VersionVector()), |
+ ssl_(SYNCHRONOUS, OK) {} |
+ |
+ void AddSocketData(const SpdyAltSvcIR& altsvc_ir) { |
+ altsvc_frame_ = spdy_util_.SerializeFrame(altsvc_ir); |
+ reads_.push_back(CreateMockRead(altsvc_frame_, 0)); |
+ reads_.push_back(MockRead(ASYNC, 0, 1)); |
+ |
+ data_.reset( |
+ new SequencedSocketData(reads_.data(), reads_.size(), nullptr, 0)); |
+ session_deps_.socket_factory->AddSocketDataProvider(data_.get()); |
+ } |
+ |
+ void AddSSLSocketData() { |
+ // Load a cert that is valid for |
+ // www.example.org, mail.example.org, and mail.example.com. |
+ cert_ = ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); |
+ ASSERT_TRUE(cert_); |
+ ssl_.cert = cert_; |
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_); |
+ } |
+ |
+ void CreateSecureSpdySession() { |
+ session_ = ::net::CreateSecureSpdySession(http_session_.get(), key_, |
+ BoundNetLog()); |
+ } |
+ |
+ SpdyAltSvcWireFormat::AlternativeService alternative_service_; |
+ |
+ private: |
+ SpdySerializedFrame altsvc_frame_; |
+ std::vector<MockRead> reads_; |
+ std::unique_ptr<SequencedSocketData> data_; |
+ scoped_refptr<X509Certificate> cert_; |
+ SSLSocketDataProvider ssl_; |
+}; |
+ |
+INSTANTIATE_TEST_CASE_P(HTTP2, |
+ AltSvcFrameTest, |
+ testing::Values(kTestCaseHTTP2PriorityDependencies)); |
+ |
+TEST_P(AltSvcFrameTest, ProcessAltSvcFrame) { |
+ const char origin[] = "https://mail.example.org"; |
+ SpdyAltSvcIR altsvc_ir(0); |
+ altsvc_ir.add_altsvc(alternative_service_); |
+ altsvc_ir.set_origin(origin); |
+ AddSocketData(altsvc_ir); |
+ AddSSLSocketData(); |
+ |
+ CreateNetworkSession(); |
+ CreateSecureSpdySession(); |
+ |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ const url::SchemeHostPort session_origin("https", test_url_.host(), |
+ test_url_.EffectiveIntPort()); |
+ AlternativeServiceVector altsvc_vector = |
+ spdy_session_pool_->http_server_properties()->GetAlternativeServices( |
+ session_origin); |
+ ASSERT_TRUE(altsvc_vector.empty()); |
+ |
+ altsvc_vector = |
+ spdy_session_pool_->http_server_properties()->GetAlternativeServices( |
+ url::SchemeHostPort(GURL(origin))); |
+ ASSERT_EQ(1u, altsvc_vector.size()); |
+ EXPECT_EQ(QUIC, altsvc_vector[0].protocol); |
+ EXPECT_EQ("alternative.example.org", altsvc_vector[0].host); |
+ EXPECT_EQ(443u, altsvc_vector[0].port); |
+} |
+ |
+TEST_P(AltSvcFrameTest, DoNotProcessAltSvcFrameOnInsecureSession) { |
+ const char origin[] = "https://mail.example.org"; |
+ SpdyAltSvcIR altsvc_ir(0); |
+ altsvc_ir.add_altsvc(alternative_service_); |
+ altsvc_ir.set_origin(origin); |
+ AddSocketData(altsvc_ir); |
+ AddSSLSocketData(); |
+ |
+ CreateNetworkSession(); |
+ CreateInsecureSpdySession(); |
+ |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ const url::SchemeHostPort session_origin("https", test_url_.host(), |
+ test_url_.EffectiveIntPort()); |
+ AlternativeServiceVector altsvc_vector = |
+ spdy_session_pool_->http_server_properties()->GetAlternativeServices( |
+ session_origin); |
+ ASSERT_TRUE(altsvc_vector.empty()); |
+ |
+ altsvc_vector = |
+ spdy_session_pool_->http_server_properties()->GetAlternativeServices( |
+ url::SchemeHostPort(GURL(origin))); |
+ ASSERT_TRUE(altsvc_vector.empty()); |
+} |
+ |
+TEST_P(AltSvcFrameTest, DoNotProcessAltSvcFrameForOriginNotCoveredByCert) { |
+ const char origin[] = "https://invalid.example.org"; |
+ SpdyAltSvcIR altsvc_ir(0); |
+ altsvc_ir.add_altsvc(alternative_service_); |
+ altsvc_ir.set_origin(origin); |
+ AddSocketData(altsvc_ir); |
+ AddSSLSocketData(); |
+ |
+ CreateNetworkSession(); |
+ CreateSecureSpdySession(); |
+ |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ const url::SchemeHostPort session_origin("https", test_url_.host(), |
+ test_url_.EffectiveIntPort()); |
+ AlternativeServiceVector altsvc_vector = |
+ spdy_session_pool_->http_server_properties()->GetAlternativeServices( |
+ session_origin); |
+ ASSERT_TRUE(altsvc_vector.empty()); |
+ |
+ altsvc_vector = |
+ spdy_session_pool_->http_server_properties()->GetAlternativeServices( |
+ url::SchemeHostPort(GURL(origin))); |
+ ASSERT_TRUE(altsvc_vector.empty()); |
+} |
+ |
+TEST_P(AltSvcFrameTest, DoNotProcessAltSvcFrameWithEmptyOriginOnZeroStream) { |
+ SpdyAltSvcIR altsvc_ir(0); |
+ altsvc_ir.add_altsvc(alternative_service_); |
+ AddSocketData(altsvc_ir); |
+ AddSSLSocketData(); |
+ |
+ CreateNetworkSession(); |
+ CreateSecureSpdySession(); |
+ |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ const url::SchemeHostPort session_origin("https", test_url_.host(), |
+ test_url_.EffectiveIntPort()); |
+ AlternativeServiceVector altsvc_vector = |
+ spdy_session_pool_->http_server_properties()->GetAlternativeServices( |
+ session_origin); |
+ ASSERT_TRUE(altsvc_vector.empty()); |
+} |
+ |
+TEST_P(AltSvcFrameTest, ProcessAltSvcFrameOnActiveStream) { |
+ SpdyAltSvcIR altsvc_ir(1); |
+ altsvc_ir.add_altsvc(alternative_service_); |
+ |
+ SpdySerializedFrame altsvc_frame(spdy_util_.SerializeFrame(altsvc_ir)); |
+ std::unique_ptr<SpdySerializedFrame> rst( |
+ spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_REFUSED_STREAM)); |
+ MockRead reads[] = { |
+ CreateMockRead(altsvc_frame, 1), CreateMockRead(*rst, 2), |
+ MockRead(ASYNC, 0, 3) // EOF |
+ }; |
+ |
+ const char request_origin[] = "https://mail.example.org"; |
+ std::unique_ptr<SpdySerializedFrame> req( |
+ spdy_util_.ConstructSpdyGet(request_origin, 1, MEDIUM)); |
+ MockWrite writes[] = { |
+ CreateMockWrite(*req, 0), |
+ }; |
+ SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
+ session_deps_.socket_factory->AddSocketDataProvider(&data); |
+ |
+ AddSSLSocketData(); |
+ |
+ CreateNetworkSession(); |
+ CreateSecureSpdySession(); |
+ |
+ base::WeakPtr<SpdyStream> spdy_stream1 = |
+ CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, session_, |
+ GURL(request_origin), MEDIUM, BoundNetLog()); |
+ test::StreamDelegateDoNothing delegate1(spdy_stream1); |
+ spdy_stream1->SetDelegate(&delegate1); |
+ |
+ std::unique_ptr<SpdyHeaderBlock> headers( |
+ spdy_util_.ConstructGetHeaderBlock(request_origin)); |
+ |
+ spdy_stream1->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND); |
+ EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); |
+ |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ const url::SchemeHostPort session_origin("https", test_url_.host(), |
+ test_url_.EffectiveIntPort()); |
+ AlternativeServiceVector altsvc_vector = |
+ spdy_session_pool_->http_server_properties()->GetAlternativeServices( |
+ session_origin); |
+ ASSERT_TRUE(altsvc_vector.empty()); |
+ |
+ altsvc_vector = |
+ spdy_session_pool_->http_server_properties()->GetAlternativeServices( |
+ url::SchemeHostPort(GURL(request_origin))); |
+ ASSERT_EQ(1u, altsvc_vector.size()); |
+ EXPECT_EQ(QUIC, altsvc_vector[0].protocol); |
+ EXPECT_EQ("alternative.example.org", altsvc_vector[0].host); |
+ EXPECT_EQ(443u, altsvc_vector[0].port); |
+} |
+ |
+TEST_P(AltSvcFrameTest, DoNotProcessAltSvcFrameOnStreamWithInsecureOrigin) { |
+ SpdyAltSvcIR altsvc_ir(1); |
+ altsvc_ir.add_altsvc(alternative_service_); |
+ |
+ SpdySerializedFrame altsvc_frame(spdy_util_.SerializeFrame(altsvc_ir)); |
+ std::unique_ptr<SpdySerializedFrame> rst( |
+ spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_REFUSED_STREAM)); |
+ MockRead reads[] = { |
+ CreateMockRead(altsvc_frame, 1), CreateMockRead(*rst, 2), |
+ MockRead(ASYNC, 0, 3) // EOF |
+ }; |
+ |
+ const char request_origin[] = "http://mail.example.org"; |
+ std::unique_ptr<SpdySerializedFrame> req( |
+ spdy_util_.ConstructSpdyGet(request_origin, 1, MEDIUM)); |
+ MockWrite writes[] = { |
+ CreateMockWrite(*req, 0), |
+ }; |
+ SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
+ session_deps_.socket_factory->AddSocketDataProvider(&data); |
+ |
+ AddSSLSocketData(); |
+ |
+ CreateNetworkSession(); |
+ CreateSecureSpdySession(); |
+ |
+ base::WeakPtr<SpdyStream> spdy_stream1 = |
+ CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, session_, |
+ GURL(request_origin), MEDIUM, BoundNetLog()); |
+ test::StreamDelegateDoNothing delegate1(spdy_stream1); |
+ spdy_stream1->SetDelegate(&delegate1); |
+ |
+ std::unique_ptr<SpdyHeaderBlock> headers( |
+ spdy_util_.ConstructGetHeaderBlock(request_origin)); |
+ |
+ spdy_stream1->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND); |
+ EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); |
+ |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ const url::SchemeHostPort session_origin("https", test_url_.host(), |
+ test_url_.EffectiveIntPort()); |
+ AlternativeServiceVector altsvc_vector = |
+ spdy_session_pool_->http_server_properties()->GetAlternativeServices( |
+ session_origin); |
+ ASSERT_TRUE(altsvc_vector.empty()); |
+ |
+ altsvc_vector = |
+ spdy_session_pool_->http_server_properties()->GetAlternativeServices( |
+ url::SchemeHostPort(GURL(request_origin))); |
+ ASSERT_TRUE(altsvc_vector.empty()); |
+} |
+ |
+TEST_P(AltSvcFrameTest, DoNotProcessAltSvcFrameOnNonExistentStream) { |
+ SpdyAltSvcIR altsvc_ir(1); |
+ altsvc_ir.add_altsvc(alternative_service_); |
+ AddSocketData(altsvc_ir); |
+ AddSSLSocketData(); |
+ |
+ CreateNetworkSession(); |
+ CreateSecureSpdySession(); |
+ |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ const url::SchemeHostPort session_origin("https", test_url_.host(), |
+ test_url_.EffectiveIntPort()); |
+ AlternativeServiceVector altsvc_vector = |
+ spdy_session_pool_->http_server_properties()->GetAlternativeServices( |
+ session_origin); |
+ ASSERT_TRUE(altsvc_vector.empty()); |
+} |
+ |
TEST(MapFramerErrorToProtocolError, MapsValues) { |
CHECK_EQ( |
SPDY_ERROR_INVALID_CONTROL_FRAME, |
@@ -5376,7 +5652,7 @@ TEST(CanPoolTest, CanPool) { |
// Load a cert that is valid for: |
// www.example.org |
// mail.example.org |
- // www.example.com |
+ // mail.example.com |
TransportSecurityState tss; |
SSLInfo ssl_info; |
@@ -5397,7 +5673,7 @@ TEST(CanPoolTest, CanNotPoolWithCertErrors) { |
// Load a cert that is valid for: |
// www.example.org |
// mail.example.org |
- // www.example.com |
+ // mail.example.com |
TransportSecurityState tss; |
SSLInfo ssl_info; |
@@ -5413,7 +5689,7 @@ TEST(CanPoolTest, CanNotPoolWithClientCerts) { |
// Load a cert that is valid for: |
// www.example.org |
// mail.example.org |
- // www.example.com |
+ // mail.example.com |
TransportSecurityState tss; |
SSLInfo ssl_info; |
@@ -5429,7 +5705,7 @@ TEST(CanPoolTest, CanNotPoolAcrossETLDsWithChannelID) { |
// Load a cert that is valid for: |
// www.example.org |
// mail.example.org |
- // www.example.com |
+ // mail.example.com |
TransportSecurityState tss; |
SSLInfo ssl_info; |