| 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 15a070223d314f19061280f6389f7c604928a859..b5a8d6d16a3e10182619ddc09ba06b534b9faa09 100644
|
| --- a/net/quic/quic_network_transaction_unittest.cc
|
| +++ b/net/quic/quic_network_transaction_unittest.cc
|
| @@ -61,10 +61,14 @@
|
|
|
| static const char kQuicAlternateProtocolHeader[] =
|
| "Alternate-Protocol: 443:quic\r\n\r\n";
|
| +static const char kQuicAlternateProtocol50pctHeader[] =
|
| + "Alternate-Protocol: 443:quic,p=.5\r\n\r\n";
|
| static const char kQuicAlternateProtocolDifferentPortHeader[] =
|
| "Alternate-Protocol: 137:quic\r\n\r\n";
|
| static const char kQuicAlternativeServiceHeader[] =
|
| "Alt-Svc: quic=\":443\"\r\n\r\n";
|
| +static const char kQuicAlternativeService50pctHeader[] =
|
| + "Alt-Svc: quic=\":443\";p=\".5\"\r\n\r\n";
|
| static const char kQuicAlternativeServiceDifferentPortHeader[] =
|
| "Alt-Svc: quic=\":137\"\r\n\r\n";
|
|
|
| @@ -513,7 +517,7 @@
|
| AlternativeService alternative_service(QUIC, host_port_pair.host(), 443);
|
| base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
|
| http_server_properties_.SetAlternativeService(
|
| - host_port_pair, alternative_service, expiration);
|
| + host_port_pair, alternative_service, 1.0, expiration);
|
| }
|
|
|
| void AddQuicRemoteAlternativeServiceMapping(
|
| @@ -525,7 +529,7 @@
|
| alternative.port());
|
| base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
|
| http_server_properties_.SetAlternativeService(
|
| - host_port_pair, alternative_service, expiration);
|
| + host_port_pair, alternative_service, 1.0, expiration);
|
| }
|
|
|
| void ExpectBrokenAlternateProtocolMapping() {
|
| @@ -1348,42 +1352,10 @@
|
| alternative_service));
|
| }
|
|
|
| -TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) {
|
| - MockRead http_reads[] = {
|
| - MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
|
| - MockRead("hello world"),
|
| - MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
|
| - MockRead(ASYNC, OK)};
|
| -
|
| - StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
|
| - 0);
|
| - socket_factory_.AddSocketDataProvider(&http_data);
|
| - socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
|
| -
|
| - 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(SYNCHRONOUS, 0); // EOF
|
| -
|
| - mock_quic_data.AddSocketDataToFactory(&socket_factory_);
|
| -
|
| - AddHangingNonAlternateProtocolSocketData();
|
| - CreateSession();
|
| -
|
| - // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
|
| - SendRequestAndExpectHttpResponse("hello world");
|
| -}
|
| -
|
| -TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
|
| - MockRead http_reads[] = {
|
| - MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
|
| - MockRead("hello world"),
|
| +TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceProbabilityForQuic) {
|
| + MockRead http_reads[] = {
|
| + MockRead("HTTP/1.1 200 OK\r\n"),
|
| + MockRead(kQuicAlternativeService50pctHeader), MockRead("hello world"),
|
| MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
|
| MockRead(ASYNC, OK)};
|
|
|
| @@ -1406,22 +1378,93 @@
|
|
|
| mock_quic_data.AddSocketDataToFactory(&socket_factory_);
|
|
|
| - // The non-alternate protocol job needs to hang in order to guarantee that
|
| - // the alternate-protocol job will "win".
|
| - AddHangingNonAlternateProtocolSocketData();
|
| -
|
| - params_.parse_alternative_services = false;
|
| - params_.parse_alternative_services = false;
|
| + AddHangingNonAlternateProtocolSocketData();
|
| + params_.alternative_service_probability_threshold = 0.25;
|
| CreateSession();
|
|
|
| SendRequestAndExpectHttpResponse("hello world");
|
| SendRequestAndExpectQuicResponse("hello!");
|
| }
|
|
|
| -TEST_P(QuicNetworkTransactionTest, AlternateProtocolDifferentPort) {
|
| +TEST_P(QuicNetworkTransactionTest,
|
| + DontUseAlternativeServiceProbabilityForQuic) {
|
| MockRead http_reads[] = {
|
| MockRead("HTTP/1.1 200 OK\r\n"),
|
| - MockRead(kQuicAlternateProtocolDifferentPortHeader),
|
| + MockRead(kQuicAlternativeService50pctHeader), MockRead("hello world"),
|
| + MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
|
| + MockRead(ASYNC, OK)};
|
| +
|
| + StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
|
| + 0);
|
| + socket_factory_.AddSocketDataProvider(&http_data);
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
|
| + socket_factory_.AddSocketDataProvider(&http_data);
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
|
| +
|
| + params_.alternative_service_probability_threshold = 0.75;
|
| + CreateSession();
|
| +
|
| + SendRequestAndExpectHttpResponse("hello world");
|
| + SendRequestAndExpectHttpResponse("hello world");
|
| +}
|
| +
|
| +TEST_P(QuicNetworkTransactionTest,
|
| + DontUseAlternativeServiceWithBadProbabilityForQuic) {
|
| + MockRead http_reads[] = {
|
| + MockRead("HTTP/1.1 200 OK\r\n"),
|
| + MockRead("Alt-Svc: quic=\":443\";p=2\r\n\r\n"), MockRead("hello world"),
|
| + MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
|
| + MockRead(ASYNC, OK)};
|
| +
|
| + StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
|
| + 0);
|
| + socket_factory_.AddSocketDataProvider(&http_data);
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
|
| + socket_factory_.AddSocketDataProvider(&http_data);
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
|
| +
|
| + params_.alternative_service_probability_threshold = 0.75;
|
| + CreateSession();
|
| +
|
| + SendRequestAndExpectHttpResponse("hello world");
|
| + SendRequestAndExpectHttpResponse("hello world");
|
| +}
|
| +
|
| +TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) {
|
| + MockRead http_reads[] = {
|
| + MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
|
| + MockRead("hello world"),
|
| + MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
|
| + MockRead(ASYNC, OK)};
|
| +
|
| + StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
|
| + 0);
|
| + socket_factory_.AddSocketDataProvider(&http_data);
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
|
| +
|
| + 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(SYNCHRONOUS, 0); // EOF
|
| +
|
| + mock_quic_data.AddSocketDataToFactory(&socket_factory_);
|
| +
|
| + AddHangingNonAlternateProtocolSocketData();
|
| + CreateSession();
|
| +
|
| + // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
|
| + SendRequestAndExpectHttpResponse("hello world");
|
| +}
|
| +
|
| +TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
|
| + MockRead http_reads[] = {
|
| + MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
|
| MockRead("hello world"),
|
| MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
|
| MockRead(ASYNC, OK)};
|
| @@ -1450,15 +1493,17 @@
|
| AddHangingNonAlternateProtocolSocketData();
|
|
|
| params_.parse_alternative_services = false;
|
| - CreateSession();
|
| -
|
| - SendRequestAndExpectHttpResponse("hello world");
|
| - SendRequestAndExpectQuicResponseOnPort("hello!", 137);
|
| -}
|
| -
|
| -TEST_P(QuicNetworkTransactionTest, ConfirmAlternateProtocol) {
|
| - MockRead http_reads[] = {
|
| - MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
|
| + params_.parse_alternative_services = false;
|
| + CreateSession();
|
| +
|
| + SendRequestAndExpectHttpResponse("hello world");
|
| + SendRequestAndExpectQuicResponse("hello!");
|
| +}
|
| +
|
| +TEST_P(QuicNetworkTransactionTest, AlternateProtocolDifferentPort) {
|
| + MockRead http_reads[] = {
|
| + MockRead("HTTP/1.1 200 OK\r\n"),
|
| + MockRead(kQuicAlternateProtocolDifferentPortHeader),
|
| MockRead("hello world"),
|
| MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
|
| MockRead(ASYNC, OK)};
|
| @@ -1489,6 +1534,43 @@
|
| params_.parse_alternative_services = false;
|
| CreateSession();
|
|
|
| + SendRequestAndExpectHttpResponse("hello world");
|
| + SendRequestAndExpectQuicResponseOnPort("hello!", 137);
|
| +}
|
| +
|
| +TEST_P(QuicNetworkTransactionTest, ConfirmAlternateProtocol) {
|
| + MockRead http_reads[] = {
|
| + MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
|
| + MockRead("hello world"),
|
| + MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
|
| + MockRead(ASYNC, OK)};
|
| +
|
| + StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
|
| + 0);
|
| + socket_factory_.AddSocketDataProvider(&http_data);
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
|
| +
|
| + 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); // EOF
|
| +
|
| + mock_quic_data.AddSocketDataToFactory(&socket_factory_);
|
| +
|
| + // The non-alternate protocol job needs to hang in order to guarantee that
|
| + // the alternate-protocol job will "win".
|
| + AddHangingNonAlternateProtocolSocketData();
|
| +
|
| + params_.parse_alternative_services = false;
|
| + CreateSession();
|
| +
|
| AlternativeService alternative_service(QUIC,
|
| HostPortPair::FromURL(request_.url));
|
| http_server_properties_.MarkAlternativeServiceRecentlyBroken(
|
| @@ -1503,6 +1585,90 @@
|
|
|
| EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
|
| alternative_service));
|
| +}
|
| +
|
| +TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolProbabilityForQuic) {
|
| + params_.parse_alternative_services = false;
|
| + MockRead http_reads[] = {
|
| + MockRead("HTTP/1.1 200 OK\r\n"),
|
| + MockRead(kQuicAlternateProtocol50pctHeader), MockRead("hello world"),
|
| + MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
|
| + MockRead(ASYNC, OK)};
|
| +
|
| + StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
|
| + 0);
|
| + socket_factory_.AddSocketDataProvider(&http_data);
|
| +
|
| + 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); // EOF
|
| +
|
| + mock_quic_data.AddSocketDataToFactory(&socket_factory_);
|
| +
|
| + // The non-alternate protocol job needs to hang in order to guarantee that
|
| + // the alternate-protocol job will "win".
|
| + AddHangingNonAlternateProtocolSocketData();
|
| +
|
| + params_.alternative_service_probability_threshold = .25;
|
| + params_.parse_alternative_services = false;
|
| + CreateSession();
|
| +
|
| + SendRequestAndExpectHttpResponse("hello world");
|
| + SendRequestAndExpectQuicResponse("hello!");
|
| +}
|
| +
|
| +TEST_P(QuicNetworkTransactionTest, DontUseAlternateProtocolProbabilityForQuic) {
|
| + params_.parse_alternative_services = false;
|
| + MockRead http_reads[] = {
|
| + MockRead("HTTP/1.1 200 OK\r\n"),
|
| + MockRead(kQuicAlternateProtocol50pctHeader), MockRead("hello world"),
|
| + MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
|
| + MockRead(ASYNC, OK)};
|
| +
|
| + StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
|
| + 0);
|
| + socket_factory_.AddSocketDataProvider(&http_data);
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
|
| + socket_factory_.AddSocketDataProvider(&http_data);
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
|
| +
|
| + params_.alternative_service_probability_threshold = .75;
|
| + CreateSession();
|
| +
|
| + SendRequestAndExpectHttpResponse("hello world");
|
| + SendRequestAndExpectHttpResponse("hello world");
|
| +}
|
| +
|
| +TEST_P(QuicNetworkTransactionTest,
|
| + DontUseAlternateProtocolWithBadProbabilityForQuic) {
|
| + params_.parse_alternative_services = false;
|
| + MockRead http_reads[] = {
|
| + MockRead("HTTP/1.1 200 OK\r\n"),
|
| + MockRead("Alternate-Protocol: 443:quic,p=2\r\n\r\n"),
|
| + MockRead("hello world"),
|
| + MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
|
| + MockRead(ASYNC, OK)};
|
| +
|
| + StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
|
| + 0);
|
| + socket_factory_.AddSocketDataProvider(&http_data);
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
|
| + socket_factory_.AddSocketDataProvider(&http_data);
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
|
| +
|
| + params_.alternative_service_probability_threshold = .75;
|
| + CreateSession();
|
| +
|
| + SendRequestAndExpectHttpResponse("hello world");
|
| + SendRequestAndExpectHttpResponse("hello world");
|
| }
|
|
|
| TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) {
|
| @@ -1591,7 +1757,7 @@
|
| AlternativeService alternative_service(QUIC, alternative);
|
| base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
|
| session_->http_server_properties()->SetAlternativeService(
|
| - origin, alternative_service, expiration);
|
| + origin, alternative_service, 1.0, expiration);
|
| scoped_ptr<HttpNetworkTransaction> trans(
|
| new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
|
| TestCompletionCallback callback;
|
|
|