| 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 3dfa0e3b592cabd3339afd25c4a808fc24f8cb05..3d119fbd86355f17be7e963254c8966834bf18dd 100644
|
| --- a/net/quic/quic_network_transaction_unittest.cc
|
| +++ b/net/quic/quic_network_transaction_unittest.cc
|
| @@ -51,6 +51,8 @@ namespace {
|
| // This is the expected return from a current server advertising QUIC.
|
| static const char kQuicAlternateProtocolHttpHeader[] =
|
| "Alternate-Protocol: 80:quic\r\n\r\n";
|
| +static const char kQuicAlternateProtocol50pctHttpHeader[] =
|
| + "Alternate-Protocol: 80:quic,p=.5\r\n\r\n";
|
| static const char kQuicAlternateProtocolHttpsHeader[] =
|
| "Alternate-Protocol: 443:quic\r\n\r\n";
|
|
|
| @@ -275,13 +277,13 @@ class QuicNetworkTransactionTest
|
| MockCryptoClientStream::HandshakeMode handshake_mode) {
|
| crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
|
| session_->http_server_properties()->SetAlternateProtocol(
|
| - HostPortPair::FromURL(request_.url), 80, QUIC);
|
| + HostPortPair::FromURL(request_.url), 80, QUIC, 1);
|
| }
|
|
|
| void ExpectBrokenAlternateProtocolMapping() {
|
| ASSERT_TRUE(session_->http_server_properties()->HasAlternateProtocol(
|
| HostPortPair::FromURL(request_.url)));
|
| - const PortAlternateProtocolPair alternate =
|
| + const AlternateProtocolInfo alternate =
|
| session_->http_server_properties()->GetAlternateProtocol(
|
| HostPortPair::FromURL(request_.url));
|
| EXPECT_EQ(ALTERNATE_PROTOCOL_BROKEN, alternate.protocol);
|
| @@ -290,7 +292,7 @@ class QuicNetworkTransactionTest
|
| void ExpectQuicAlternateProtocolMapping() {
|
| ASSERT_TRUE(session_->http_server_properties()->HasAlternateProtocol(
|
| HostPortPair::FromURL(request_.url)));
|
| - const PortAlternateProtocolPair alternate =
|
| + const AlternateProtocolInfo alternate =
|
| session_->http_server_properties()->GetAlternateProtocol(
|
| HostPortPair::FromURL(request_.url));
|
| EXPECT_EQ(QUIC, alternate.protocol);
|
| @@ -490,6 +492,87 @@ TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
|
| SendRequestAndExpectQuicResponse("hello!");
|
| }
|
|
|
| +TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolProbabilityForQuic) {
|
| + MockRead http_reads[] = {
|
| + MockRead("HTTP/1.1 200 OK\r\n"),
|
| + MockRead(kQuicAlternateProtocol50pctHttpHeader),
|
| + MockRead("hello world"),
|
| + MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
|
| + MockRead(ASYNC, OK)
|
| + };
|
| +
|
| + StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
|
| + NULL, 0);
|
| + socket_factory_.AddSocketDataProvider(&http_data);
|
| +
|
| + MockQuicData mock_quic_data;
|
| + mock_quic_data.AddWrite(
|
| + ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
|
| + GetRequestHeaders("GET", "http", "/")));
|
| + 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.AddDelayedSocketDataToFactory(&socket_factory_, 1);
|
| +
|
| + // The non-alternate protocol job needs to hang in order to guarantee that
|
| + // the alternate-protocol job will "win".
|
| + AddHangingNonAlternateProtocolSocketData();
|
| +
|
| + params_.alternate_protocol_probability_threshold = .25;
|
| + CreateSessionWithNextProtos();
|
| +
|
| + SendRequestAndExpectHttpResponse("hello world");
|
| + SendRequestAndExpectQuicResponse("hello!");
|
| +}
|
| +
|
| +TEST_P(QuicNetworkTransactionTest, DontUseAlternateProtocolProbabilityForQuic) {
|
| + MockRead http_reads[] = {
|
| + MockRead("HTTP/1.1 200 OK\r\n"),
|
| + MockRead(kQuicAlternateProtocol50pctHttpHeader),
|
| + MockRead("hello world"),
|
| + MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
|
| + MockRead(ASYNC, OK)
|
| + };
|
| +
|
| + StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
|
| + NULL, 0);
|
| + socket_factory_.AddSocketDataProvider(&http_data);
|
| + socket_factory_.AddSocketDataProvider(&http_data);
|
| +
|
| + params_.alternate_protocol_probability_threshold = .75;
|
| + CreateSessionWithNextProtos();
|
| +
|
| + SendRequestAndExpectHttpResponse("hello world");
|
| + SendRequestAndExpectHttpResponse("hello world");
|
| +}
|
| +
|
| +TEST_P(QuicNetworkTransactionTest,
|
| + DontUseAlternateProtocolWithBadProbabilityForQuic) {
|
| + 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),
|
| + NULL, 0);
|
| + socket_factory_.AddSocketDataProvider(&http_data);
|
| + socket_factory_.AddSocketDataProvider(&http_data);
|
| +
|
| + params_.alternate_protocol_probability_threshold = .75;
|
| + CreateSessionWithNextProtos();
|
| +
|
| + SendRequestAndExpectHttpResponse("hello world");
|
| + SendRequestAndExpectHttpResponse("hello world");
|
| +}
|
| +
|
| TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) {
|
| params_.origin_to_force_quic_on =
|
| HostPortPair::FromString("www.google.com:443");
|
|
|