Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1538)

Unified Diff: net/spdy/spdy_session_unittest.cc

Issue 2031373002: Process HTTP/2 ALTSVC frames. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Clear up my confusion with zero streams and empty origins. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;

Powered by Google App Engine
This is Rietveld 408576698