| 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 2e4610ce5e74aee63ac94ba5b4a5b29bb8e2c6c7..5830e564627513ed958e70d40d4b54e0addaeb65 100644
|
| --- a/net/quic/quic_network_transaction_unittest.cc
|
| +++ b/net/quic/quic_network_transaction_unittest.cc
|
| @@ -2,6 +2,8 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| +#include <vector>
|
| +
|
| #include "base/basictypes.h"
|
| #include "base/compiler_specific.h"
|
| #include "base/memory/scoped_ptr.h"
|
| @@ -30,6 +32,7 @@
|
| #include "net/quic/test_tools/mock_clock.h"
|
| #include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
|
| #include "net/quic/test_tools/mock_random.h"
|
| +#include "net/quic/test_tools/quic_test_packet_maker.h"
|
| #include "net/quic/test_tools/quic_test_utils.h"
|
| #include "net/socket/client_socket_factory.h"
|
| #include "net/socket/mock_client_socket_pool_manager.h"
|
| @@ -50,18 +53,62 @@ static const char kQuicAlternateProtocolHttpHeader[] =
|
| "Alternate-Protocol: 80:quic\r\n\r\n";
|
| static const char kQuicAlternateProtocolHttpsHeader[] =
|
| "Alternate-Protocol: 443:quic\r\n\r\n";
|
| +
|
| } // namespace
|
|
|
| namespace net {
|
| namespace test {
|
|
|
| -class QuicNetworkTransactionTest : public PlatformTest {
|
| +// Helper class to encapsulate MockReads and MockWrites for QUIC.
|
| +// Simplify ownership issues and the interaction with the MockSocketFactory.
|
| +class MockQuicData {
|
| + public:
|
| + ~MockQuicData() {
|
| + STLDeleteElements(&packets_);
|
| + }
|
| +
|
| + void AddRead(scoped_ptr<QuicEncryptedPacket> packet) {
|
| + reads_.push_back(MockRead(SYNCHRONOUS, packet->data(), packet->length(),
|
| + sequence_number_++));
|
| + packets_.push_back(packet.release());
|
| + }
|
| +
|
| + void AddRead(IoMode mode, int rv) {
|
| + reads_.push_back(MockRead(mode, rv));
|
| + }
|
| +
|
| + void AddWrite(scoped_ptr<QuicEncryptedPacket> packet) {
|
| + writes_.push_back(MockWrite(SYNCHRONOUS, packet->data(), packet->length(),
|
| + sequence_number_++));
|
| + packets_.push_back(packet.release());
|
| + }
|
| +
|
| + void AddDelayedSocketDataToFactory(MockClientSocketFactory* factory,
|
| + size_t delay) {
|
| + MockRead* reads = reads_.empty() ? NULL : &reads_[0];
|
| + MockWrite* writes = writes_.empty() ? NULL : &writes_[0];
|
| + socket_data_.reset(new DelayedSocketData(
|
| + delay, reads, reads_.size(), writes, writes_.size()));
|
| + factory->AddSocketDataProvider(socket_data_.get());
|
| + }
|
| +
|
| + private:
|
| + std::vector<QuicEncryptedPacket*> packets_;
|
| + std::vector<MockWrite> writes_;
|
| + std::vector<MockRead> reads_;
|
| + size_t sequence_number_;
|
| + scoped_ptr<SocketDataProvider> socket_data_;
|
| +};
|
| +
|
| +class QuicNetworkTransactionTest
|
| + : public PlatformTest,
|
| + public testing::WithParamInterface<QuicVersion> {
|
| protected:
|
| QuicNetworkTransactionTest()
|
| - : clock_(new MockClock),
|
| + : maker_(GetParam(), 0),
|
| + clock_(new MockClock),
|
| ssl_config_service_(new SSLConfigServiceDefaults),
|
| proxy_service_(ProxyService::CreateDirect()),
|
| - compressor_(new QuicSpdyCompressor()),
|
| auth_handler_factory_(
|
| HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
|
| random_generator_(0),
|
| @@ -90,132 +137,71 @@ class QuicNetworkTransactionTest : public PlatformTest {
|
| scoped_ptr<QuicEncryptedPacket> ConstructRstPacket(
|
| QuicPacketSequenceNumber num,
|
| QuicStreamId stream_id) {
|
| - QuicPacketHeader header;
|
| - header.public_header.guid = random_generator_.RandUint64();
|
| - header.public_header.reset_flag = false;
|
| - header.public_header.version_flag = false;
|
| - header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
|
| - header.packet_sequence_number = num;
|
| - header.entropy_flag = false;
|
| - header.fec_flag = false;
|
| - header.fec_group = 0;
|
| -
|
| - QuicRstStreamFrame rst(stream_id, QUIC_STREAM_NO_ERROR);
|
| - return scoped_ptr<QuicEncryptedPacket>(
|
| - ConstructPacket(header, QuicFrame(&rst)));
|
| + return maker_.MakeRstPacket(
|
| + num, false, stream_id, QUIC_STREAM_NO_ERROR);
|
| }
|
|
|
| scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
|
| QuicPacketSequenceNumber num) {
|
| - QuicPacketHeader header;
|
| - header.public_header.guid = random_generator_.RandUint64();
|
| - header.public_header.reset_flag = false;
|
| - header.public_header.version_flag = false;
|
| - header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
|
| - header.packet_sequence_number = num;
|
| - header.entropy_flag = false;
|
| - header.fec_flag = false;
|
| - header.fec_group = 0;
|
| -
|
| - QuicConnectionCloseFrame close;
|
| - close.error_code = QUIC_CRYPTO_VERSION_NOT_SUPPORTED;
|
| - close.error_details = "Time to panic!";
|
| - return scoped_ptr<QuicEncryptedPacket>(
|
| - ConstructPacket(header, QuicFrame(&close)));
|
| + return maker_.MakeConnectionClosePacket(num);
|
| }
|
|
|
| scoped_ptr<QuicEncryptedPacket> ConstructAckPacket(
|
| QuicPacketSequenceNumber largest_received,
|
| QuicPacketSequenceNumber least_unacked) {
|
| - QuicPacketHeader header;
|
| - header.public_header.guid = random_generator_.RandUint64();
|
| - header.public_header.reset_flag = false;
|
| - header.public_header.version_flag = false;
|
| - header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
|
| - header.packet_sequence_number = 2;
|
| - header.entropy_flag = false;
|
| - header.fec_flag = false;
|
| - header.fec_group = 0;
|
| -
|
| - QuicAckFrame ack(largest_received, QuicTime::Zero(), least_unacked);
|
| -
|
| - QuicCongestionFeedbackFrame feedback;
|
| - feedback.type = kTCP;
|
| - feedback.tcp.accumulated_number_of_lost_packets = 0;
|
| - feedback.tcp.receive_window = 256000;
|
| -
|
| - QuicFramer framer(QuicSupportedVersions(), QuicTime::Zero(), false);
|
| - QuicFrames frames;
|
| - frames.push_back(QuicFrame(&ack));
|
| - frames.push_back(QuicFrame(&feedback));
|
| - scoped_ptr<QuicPacket> packet(
|
| - framer.BuildUnsizedDataPacket(header, frames).packet);
|
| - return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket(
|
| - ENCRYPTION_NONE, header.packet_sequence_number, *packet));
|
| + return maker_.MakeAckPacket(2, largest_received, least_unacked, true);
|
| + }
|
| +
|
| + SpdyHeaderBlock GetRequestHeaders(const std::string& method,
|
| + const std::string& scheme,
|
| + const std::string& path) {
|
| + return maker_.GetRequestHeaders(method, scheme, path);
|
| }
|
|
|
| std::string GetRequestString(const std::string& method,
|
| const std::string& scheme,
|
| const std::string& path) {
|
| - SpdyHeaderBlock headers;
|
| - headers[":method"] = method;
|
| - headers[":host"] = "www.google.com";
|
| - headers[":path"] = path;
|
| - headers[":scheme"] = scheme;
|
| - headers[":version"] = "HTTP/1.1";
|
| - return SerializeHeaderBlock(headers);
|
| + return maker_.GetRequestString(method, scheme, path);
|
| }
|
|
|
| - std::string GetResponseString(const std::string& status,
|
| - const std::string& body) {
|
| - SpdyHeaderBlock headers;
|
| - headers[":status"] = status;
|
| - headers[":version"] = "HTTP/1.1";
|
| - headers["content-type"] = "text/plain";
|
| - return compressor_->CompressHeaders(headers) + body;
|
| + SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
|
| + return maker_.GetResponseHeaders(status);
|
| }
|
|
|
| - std::string SerializeHeaderBlock(const SpdyHeaderBlock& headers) {
|
| - QuicSpdyCompressor compressor;
|
| - return compressor.CompressHeadersWithPriority(
|
| - ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY), headers);
|
| + std::string GetResponseString(const std::string& status,
|
| + const std::string& body) {
|
| + return maker_.GetResponseString(status, body);
|
| }
|
|
|
| - // Returns a newly created packet to send kData on stream 1.
|
| - QuicEncryptedPacket* ConstructDataPacket(
|
| + scoped_ptr<QuicEncryptedPacket> ConstructDataPacket(
|
| QuicPacketSequenceNumber sequence_number,
|
| QuicStreamId stream_id,
|
| bool should_include_version,
|
| bool fin,
|
| QuicStreamOffset offset,
|
| base::StringPiece data) {
|
| - InitializeHeader(sequence_number, should_include_version);
|
| - QuicStreamFrame frame(stream_id, fin, offset, MakeIOVector(data));
|
| - return ConstructPacket(header_, QuicFrame(&frame)).release();
|
| - }
|
| -
|
| - scoped_ptr<QuicEncryptedPacket> ConstructPacket(
|
| - const QuicPacketHeader& header,
|
| - const QuicFrame& frame) {
|
| - QuicFramer framer(QuicSupportedVersions(), QuicTime::Zero(), false);
|
| - QuicFrames frames;
|
| - frames.push_back(frame);
|
| - scoped_ptr<QuicPacket> packet(
|
| - framer.BuildUnsizedDataPacket(header, frames).packet);
|
| - return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket(
|
| - ENCRYPTION_NONE, header.packet_sequence_number, *packet));
|
| - }
|
| -
|
| - void InitializeHeader(QuicPacketSequenceNumber sequence_number,
|
| - bool should_include_version) {
|
| - header_.public_header.guid = random_generator_.RandUint64();
|
| - header_.public_header.reset_flag = false;
|
| - header_.public_header.version_flag = should_include_version;
|
| - header_.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
|
| - header_.packet_sequence_number = sequence_number;
|
| - header_.fec_group = 0;
|
| - header_.entropy_flag = false;
|
| - header_.fec_flag = false;
|
| + return maker_.MakeDataPacket(
|
| + sequence_number, stream_id, should_include_version, fin, offset, data);
|
| + }
|
| +
|
| + scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
|
| + QuicPacketSequenceNumber sequence_number,
|
| + QuicStreamId stream_id,
|
| + bool should_include_version,
|
| + bool fin,
|
| + const SpdyHeaderBlock& headers) {
|
| + return maker_.MakeRequestHeadersPacket(
|
| + sequence_number, stream_id, should_include_version, fin, headers);
|
| + }
|
| +
|
| + scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
|
| + QuicPacketSequenceNumber sequence_number,
|
| + QuicStreamId stream_id,
|
| + bool should_include_version,
|
| + bool fin,
|
| + const SpdyHeaderBlock& headers) {
|
| + return maker_.MakeResponseHeadersPacket(
|
| + sequence_number, stream_id, should_include_version, fin, headers);
|
| }
|
|
|
| void CreateSession() {
|
| @@ -235,6 +221,7 @@ class QuicNetworkTransactionTest : public PlatformTest {
|
| params_.ssl_config_service = ssl_config_service_.get();
|
| params_.http_auth_handler_factory = auth_handler_factory_.get();
|
| params_.http_server_properties = http_server_properties.GetWeakPtr();
|
| + params_.quic_supported_versions = SupportedVersions(GetParam());
|
|
|
| session_ = new HttpNetworkSession(params_);
|
| session_->quic_stream_factory()->set_require_confirmation(false);
|
| @@ -314,7 +301,7 @@ class QuicNetworkTransactionTest : public PlatformTest {
|
| socket_factory_.AddSocketDataProvider(&hanging_data_);
|
| }
|
|
|
| - QuicPacketHeader header_;
|
| + QuicTestPacketMaker maker_;
|
| scoped_refptr<HttpNetworkSession> session_;
|
| MockClientSocketFactory socket_factory_;
|
| MockCryptoClientStreamFactory crypto_client_stream_factory_;
|
| @@ -324,7 +311,6 @@ class QuicNetworkTransactionTest : public PlatformTest {
|
| TransportSecurityState transport_security_state_;
|
| scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
|
| scoped_ptr<ProxyService> proxy_service_;
|
| - scoped_ptr<QuicSpdyCompressor> compressor_;
|
| scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
|
| MockRandom random_generator_;
|
| HttpServerPropertiesImpl http_server_properties;
|
| @@ -334,35 +320,37 @@ class QuicNetworkTransactionTest : public PlatformTest {
|
| StaticSocketDataProvider hanging_data_;
|
| };
|
|
|
| -TEST_F(QuicNetworkTransactionTest, ForceQuic) {
|
| +INSTANTIATE_TEST_CASE_P(Version, QuicNetworkTransactionTest,
|
| + ::testing::ValuesIn(QuicSupportedVersions()));
|
| +
|
| +TEST_P(QuicNetworkTransactionTest, ForceQuic) {
|
| params_.origin_to_force_quic_on =
|
| HostPortPair::FromString("www.google.com:80");
|
|
|
| - QuicStreamId stream_id = 3;
|
| - scoped_ptr<QuicEncryptedPacket> req(
|
| - ConstructDataPacket(1, stream_id, true, true, 0,
|
| - GetRequestString("GET", "http", "/")));
|
| - scoped_ptr<QuicEncryptedPacket> ack(ConstructAckPacket(1, 0));
|
| -
|
| - MockWrite quic_writes[] = {
|
| - MockWrite(SYNCHRONOUS, req->data(), req->length()),
|
| - MockWrite(SYNCHRONOUS, ack->data(), ack->length()),
|
| - };
|
| -
|
| - scoped_ptr<QuicEncryptedPacket> resp(
|
| - ConstructDataPacket(
|
| - 1, stream_id, false, true, 0, GetResponseString("200 OK", "hello!")));
|
| - MockRead quic_reads[] = {
|
| - MockRead(SYNCHRONOUS, resp->data(), resp->length()),
|
| - MockRead(ASYNC, OK), // EOF
|
| - };
|
| -
|
| - DelayedSocketData quic_data(
|
| - 1, // wait for one write to finish before reading.
|
| - quic_reads, arraysize(quic_reads),
|
| - quic_writes, arraysize(quic_writes));
|
| + QuicStreamId stream_id = GetParam() > QUIC_VERSION_12 ? 5 : 3;
|
| + MockQuicData mock_quic_data;
|
| + if (GetParam() > QUIC_VERSION_12) {
|
| + mock_quic_data.AddWrite(
|
| + ConstructRequestHeadersPacket(1, stream_id, true, true,
|
| + GetRequestHeaders("GET", "http", "/")));
|
| + mock_quic_data.AddRead(
|
| + ConstructResponseHeadersPacket(1, stream_id, false, false,
|
| + GetResponseHeaders("200 OK")));
|
| + mock_quic_data.AddRead(
|
| + ConstructDataPacket(2, stream_id, false, true, 0, "hello!"));
|
| + mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
|
| + } else {
|
| + mock_quic_data.AddWrite(
|
| + ConstructDataPacket(1, stream_id, true, true, 0,
|
| + GetRequestString("GET", "http", "/")));
|
| + mock_quic_data.AddRead(
|
| + ConstructDataPacket(1, stream_id, false, true, 0,
|
| + GetResponseString("200 OK", "hello!")));
|
| + mock_quic_data.AddWrite(ConstructAckPacket(1, 0));
|
| + }
|
| + mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
|
|
|
| - socket_factory_.AddSocketDataProvider(&quic_data);
|
| + 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".
|
| @@ -405,19 +393,17 @@ TEST_F(QuicNetworkTransactionTest, ForceQuic) {
|
|
|
| int log_stream_id;
|
| ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
|
| - EXPECT_EQ(stream_id, static_cast<QuicStreamId>(log_stream_id));
|
| + EXPECT_EQ(3, log_stream_id);
|
| }
|
|
|
| -TEST_F(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
|
| +TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
|
| params_.origin_to_force_quic_on =
|
| HostPortPair::FromString("www.google.com:80");
|
|
|
| - MockRead quic_reads[] = {
|
| - MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
|
| - };
|
| - StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
|
| - NULL, 0);
|
| - socket_factory_.AddSocketDataProvider(&quic_data);
|
| + MockQuicData mock_quic_data;
|
| + mock_quic_data.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
|
| +
|
| + mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 0);
|
|
|
| CreateSession();
|
|
|
| @@ -429,7 +415,7 @@ TEST_F(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
|
| EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
|
| }
|
|
|
| -TEST_F(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
|
| +TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
|
| // Attempt to "force" quic on 443, which will not be honored.
|
| params_.origin_to_force_quic_on =
|
| HostPortPair::FromString("www.google.com:443");
|
| @@ -451,7 +437,7 @@ TEST_F(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
|
| SendRequestAndExpectHttpResponse("hello world");
|
| }
|
|
|
| -TEST_F(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
|
| +TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
|
| HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too.
|
|
|
| MockRead http_reads[] = {
|
| @@ -466,30 +452,30 @@ TEST_F(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
|
| NULL, 0);
|
| socket_factory_.AddSocketDataProvider(&http_data);
|
|
|
| - scoped_ptr<QuicEncryptedPacket> req(
|
| - ConstructDataPacket(1, 3, true, true, 0,
|
| - GetRequestString("GET", "http", "/")));
|
| - scoped_ptr<QuicEncryptedPacket> ack(ConstructAckPacket(1, 0));
|
| -
|
| - MockWrite quic_writes[] = {
|
| - MockWrite(SYNCHRONOUS, req->data(), req->length()),
|
| - MockWrite(SYNCHRONOUS, ack->data(), ack->length()),
|
| - };
|
| -
|
| - scoped_ptr<QuicEncryptedPacket> resp(
|
| - ConstructDataPacket(
|
| - 1, 3, false, true, 0, GetResponseString("200 OK", "hello!")));
|
| - MockRead quic_reads[] = {
|
| - MockRead(SYNCHRONOUS, resp->data(), resp->length()),
|
| - MockRead(ASYNC, OK), // EOF
|
| - };
|
| -
|
| - DelayedSocketData quic_data(
|
| - 1, // wait for one write to finish before reading.
|
| - quic_reads, arraysize(quic_reads),
|
| - quic_writes, arraysize(quic_writes));
|
| + QuicStreamId stream_id = GetParam() > QUIC_VERSION_12 ? 5 : 3;
|
| + MockQuicData mock_quic_data;
|
| + if (GetParam() > QUIC_VERSION_12) {
|
| + mock_quic_data.AddWrite(
|
| + ConstructRequestHeadersPacket(1, stream_id, true, true,
|
| + GetRequestHeaders("GET", "http", "/")));
|
| + mock_quic_data.AddRead(
|
| + ConstructResponseHeadersPacket(1, stream_id, false, false,
|
| + GetResponseHeaders("200 OK")));
|
| + mock_quic_data.AddRead(
|
| + ConstructDataPacket(2, stream_id, false, true, 0, "hello!"));
|
| + mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
|
| + } else {
|
| + mock_quic_data.AddWrite(
|
| + ConstructDataPacket(1, stream_id, true, true, 0,
|
| + GetRequestString("GET", "http", "/")));
|
| + mock_quic_data.AddRead(
|
| + ConstructDataPacket(1, stream_id, false, true, 0,
|
| + GetResponseString("200 OK", "hello!")));
|
| + mock_quic_data.AddWrite(ConstructAckPacket(1, 0));
|
| + }
|
| + mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
|
|
|
| - socket_factory_.AddSocketDataProvider(&quic_data);
|
| + 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".
|
| @@ -501,7 +487,7 @@ TEST_F(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
|
| SendRequestAndExpectQuicResponse("hello!");
|
| }
|
|
|
| -TEST_F(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) {
|
| +TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) {
|
| params_.origin_to_force_quic_on =
|
| HostPortPair::FromString("www.google.com:443");
|
| params_.enable_quic_https = true;
|
| @@ -519,30 +505,30 @@ TEST_F(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) {
|
| NULL, 0);
|
| socket_factory_.AddSocketDataProvider(&http_data);
|
|
|
| - scoped_ptr<QuicEncryptedPacket> req(
|
| - ConstructDataPacket(1, 3, true, true, 0,
|
| - GetRequestString("GET", "https", "/")));
|
| - scoped_ptr<QuicEncryptedPacket> ack(ConstructAckPacket(1, 0));
|
| -
|
| - MockWrite quic_writes[] = {
|
| - MockWrite(SYNCHRONOUS, req->data(), req->length()),
|
| - MockWrite(SYNCHRONOUS, ack->data(), ack->length()),
|
| - };
|
| -
|
| - scoped_ptr<QuicEncryptedPacket> resp(
|
| - ConstructDataPacket(
|
| - 1, 3, false, true, 0, GetResponseString("200 OK", "hello!")));
|
| - MockRead quic_reads[] = {
|
| - MockRead(SYNCHRONOUS, resp->data(), resp->length()),
|
| - MockRead(ASYNC, OK), // EOF
|
| - };
|
| -
|
| - DelayedSocketData quic_data(
|
| - 1, // wait for one write to finish before reading.
|
| - quic_reads, arraysize(quic_reads),
|
| - quic_writes, arraysize(quic_writes));
|
| + QuicStreamId stream_id = GetParam() > QUIC_VERSION_12 ? 5 : 3;
|
| + MockQuicData mock_quic_data;
|
| + if (GetParam() > QUIC_VERSION_12) {
|
| + mock_quic_data.AddWrite(
|
| + ConstructRequestHeadersPacket(1, stream_id, true, true,
|
| + GetRequestHeaders("GET", "http", "/")));
|
| + mock_quic_data.AddRead(
|
| + ConstructResponseHeadersPacket(1, stream_id, false, false,
|
| + GetResponseHeaders("200 OK")));
|
| + mock_quic_data.AddRead(
|
| + ConstructDataPacket(2, stream_id, false, true, 0, "hello!"));
|
| + mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
|
| + } else {
|
| + mock_quic_data.AddWrite(
|
| + ConstructDataPacket(1, stream_id, true, true, 0,
|
| + GetRequestString("GET", "http", "/")));
|
| + mock_quic_data.AddRead(
|
| + ConstructDataPacket(1, stream_id, false, true, 0,
|
| + GetResponseString("200 OK", "hello!")));
|
| + mock_quic_data.AddWrite(ConstructAckPacket(1, 0));
|
| + }
|
| + mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
|
|
|
| - socket_factory_.AddSocketDataProvider(&quic_data);
|
| + 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".
|
| @@ -554,7 +540,7 @@ TEST_F(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) {
|
| SendRequestAndExpectHttpResponse("hello world");
|
| }
|
|
|
| -TEST_F(QuicNetworkTransactionTest, HungAlternateProtocol) {
|
| +TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) {
|
| HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too.
|
| crypto_client_stream_factory_.set_handshake_mode(
|
| MockCryptoClientStream::COLD_START);
|
| @@ -613,33 +599,33 @@ TEST_F(QuicNetworkTransactionTest, HungAlternateProtocol) {
|
| ASSERT_TRUE(!quic_data.at_write_eof());
|
| }
|
|
|
| -TEST_F(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
|
| +TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
|
| HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too.
|
|
|
| - scoped_ptr<QuicEncryptedPacket> req(
|
| - ConstructDataPacket(1, 3, true, true, 0,
|
| - GetRequestString("GET", "http", "/")));
|
| - scoped_ptr<QuicEncryptedPacket> ack(ConstructAckPacket(1, 0));
|
| -
|
| - MockWrite quic_writes[] = {
|
| - MockWrite(SYNCHRONOUS, req->data(), req->length()),
|
| - MockWrite(SYNCHRONOUS, ack->data(), ack->length()),
|
| - };
|
| -
|
| - scoped_ptr<QuicEncryptedPacket> resp(
|
| - ConstructDataPacket(
|
| - 1, 3, false, true, 0, GetResponseString("200 OK", "hello!")));
|
| - MockRead quic_reads[] = {
|
| - MockRead(SYNCHRONOUS, resp->data(), resp->length()),
|
| - MockRead(ASYNC, OK), // EOF
|
| - };
|
| -
|
| - DelayedSocketData quic_data(
|
| - 1, // wait for one write to finish before reading.
|
| - quic_reads, arraysize(quic_reads),
|
| - quic_writes, arraysize(quic_writes));
|
| + QuicStreamId stream_id = GetParam() > QUIC_VERSION_12 ? 5 : 3;
|
| + MockQuicData mock_quic_data;
|
| + if (GetParam() > QUIC_VERSION_12) {
|
| + mock_quic_data.AddWrite(
|
| + ConstructRequestHeadersPacket(1, stream_id, true, true,
|
| + GetRequestHeaders("GET", "http", "/")));
|
| + mock_quic_data.AddRead(
|
| + ConstructResponseHeadersPacket(1, stream_id, false, false,
|
| + GetResponseHeaders("200 OK")));
|
| + mock_quic_data.AddRead(
|
| + ConstructDataPacket(2, stream_id, false, true, 0, "hello!"));
|
| + mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
|
| + } else {
|
| + mock_quic_data.AddWrite(
|
| + ConstructDataPacket(1, stream_id, true, true, 0,
|
| + GetRequestString("GET", "http", "/")));
|
| + mock_quic_data.AddRead(
|
| + ConstructDataPacket(1, stream_id, false, true, 0,
|
| + GetResponseString("200 OK", "hello!")));
|
| + mock_quic_data.AddWrite(ConstructAckPacket(1, 0));
|
| + }
|
| + mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
|
|
|
| - socket_factory_.AddSocketDataProvider(&quic_data);
|
| + 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".
|
| @@ -650,33 +636,32 @@ TEST_F(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
|
| SendRequestAndExpectQuicResponse("hello!");
|
| }
|
|
|
| -TEST_F(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
|
| +TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
|
| HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too.
|
|
|
| - scoped_ptr<QuicEncryptedPacket> req(
|
| - ConstructDataPacket(1, 3, true, true, 0,
|
| - GetRequestString("GET", "http", "/")));
|
| - scoped_ptr<QuicEncryptedPacket> ack(ConstructAckPacket(1, 0));
|
| -
|
| - MockWrite quic_writes[] = {
|
| - MockWrite(SYNCHRONOUS, req->data(), req->length()),
|
| - MockWrite(SYNCHRONOUS, ack->data(), ack->length()),
|
| - };
|
| -
|
| - scoped_ptr<QuicEncryptedPacket> resp(
|
| - ConstructDataPacket(
|
| - 1, 3, false, true, 0, GetResponseString("200 OK", "hello!")));
|
| - MockRead quic_reads[] = {
|
| - MockRead(SYNCHRONOUS, resp->data(), resp->length()),
|
| - MockRead(ASYNC, OK), // EOF
|
| - };
|
| -
|
| - DelayedSocketData quic_data(
|
| - 1, // wait for one write to finish before reading.
|
| - quic_reads, arraysize(quic_reads),
|
| - quic_writes, arraysize(quic_writes));
|
| -
|
| - socket_factory_.AddSocketDataProvider(&quic_data);
|
| + QuicStreamId stream_id = GetParam() > QUIC_VERSION_12 ? 5 : 3;
|
| + MockQuicData mock_quic_data;
|
| + if (GetParam() > QUIC_VERSION_12) {
|
| + mock_quic_data.AddWrite(
|
| + ConstructRequestHeadersPacket(1, stream_id, true, true,
|
| + GetRequestHeaders("GET", "http", "/")));
|
| + mock_quic_data.AddRead(
|
| + ConstructResponseHeadersPacket(1, stream_id, false, false,
|
| + GetResponseHeaders("200 OK")));
|
| + mock_quic_data.AddRead(
|
| + ConstructDataPacket(2, stream_id, false, true, 0, "hello!"));
|
| + mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
|
| + } else {
|
| + mock_quic_data.AddWrite(
|
| + ConstructDataPacket(1, stream_id, true, true, 0,
|
| + GetRequestString("GET", "http", "/")));
|
| + mock_quic_data.AddRead(
|
| + ConstructDataPacket(1, stream_id, false, true, 0,
|
| + GetResponseString("200 OK", "hello!")));
|
| + mock_quic_data.AddWrite(ConstructAckPacket(1, 0));
|
| + }
|
| + mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
|
| + mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1);
|
|
|
| // In order for a new QUIC session to be established via alternate-protocol
|
| // without racing an HTTP connection, we need the host resolution to happen
|
| @@ -697,33 +682,32 @@ TEST_F(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
|
| SendRequestAndExpectQuicResponse("hello!");
|
| }
|
|
|
| -TEST_F(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
|
| +TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
|
| HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too.
|
|
|
| - scoped_ptr<QuicEncryptedPacket> req(
|
| - ConstructDataPacket(1, 3, true, true, 0,
|
| - GetRequestString("GET", "http", "/")));
|
| - scoped_ptr<QuicEncryptedPacket> ack(ConstructAckPacket(1, 0));
|
| -
|
| - MockWrite quic_writes[] = {
|
| - MockWrite(SYNCHRONOUS, req->data(), req->length()),
|
| - MockWrite(SYNCHRONOUS, ack->data(), ack->length()),
|
| - };
|
| -
|
| - scoped_ptr<QuicEncryptedPacket> resp(
|
| - ConstructDataPacket(
|
| - 1, 3, false, true, 0, GetResponseString("200 OK", "hello!")));
|
| - MockRead quic_reads[] = {
|
| - MockRead(SYNCHRONOUS, resp->data(), resp->length()),
|
| - MockRead(ASYNC, OK), // EOF
|
| - };
|
| -
|
| - DelayedSocketData quic_data(
|
| - 1, // wait for one write to finish before reading.
|
| - quic_reads, arraysize(quic_reads),
|
| - quic_writes, arraysize(quic_writes));
|
| -
|
| - socket_factory_.AddSocketDataProvider(&quic_data);
|
| + QuicStreamId stream_id = GetParam() > QUIC_VERSION_12 ? 5 : 3;
|
| + MockQuicData mock_quic_data;
|
| + if (GetParam() > QUIC_VERSION_12) {
|
| + mock_quic_data.AddWrite(
|
| + ConstructRequestHeadersPacket(1, stream_id, true, true,
|
| + GetRequestHeaders("GET", "http", "/")));
|
| + mock_quic_data.AddRead(
|
| + ConstructResponseHeadersPacket(1, stream_id, false, false,
|
| + GetResponseHeaders("200 OK")));
|
| + mock_quic_data.AddRead(
|
| + ConstructDataPacket(2, stream_id, false, true, 0, "hello!"));
|
| + mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
|
| + } else {
|
| + mock_quic_data.AddWrite(
|
| + ConstructDataPacket(1, stream_id, true, true, 0,
|
| + GetRequestString("GET", "http", "/")));
|
| + mock_quic_data.AddRead(
|
| + ConstructDataPacket(1, stream_id, false, true, 0,
|
| + GetResponseString("200 OK", "hello!")));
|
| + mock_quic_data.AddWrite(ConstructAckPacket(1, 0));
|
| + }
|
| + 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".
|
| @@ -756,7 +740,7 @@ TEST_F(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
|
| EXPECT_EQ(OK, callback.WaitForResult());
|
| }
|
|
|
| -TEST_F(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
|
| +TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
|
| HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too.
|
|
|
| // Alternate-protocol job
|
| @@ -787,7 +771,7 @@ TEST_F(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
|
| ExpectBrokenAlternateProtocolMapping();
|
| }
|
|
|
| -TEST_F(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
|
| +TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
|
| HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too.
|
|
|
| // Alternate-protocol job
|
| @@ -817,7 +801,7 @@ TEST_F(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
|
| ExpectBrokenAlternateProtocolMapping();
|
| }
|
|
|
| -TEST_F(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
|
| +TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
|
| HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too.
|
|
|
| // Alternate-protocol job
|
|
|