12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h"
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
8b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/stl_util.h"
9b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/base/capturing_net_log.h"
10b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/base/net_log_unittest.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/test_completion_callback.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/mock_cert_verifier.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/http_auth_handler_factory.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/http_network_session.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/http_network_transaction.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/http_server_properties_impl.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/http_stream.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/http_stream_factory.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/http_transaction_unittest.h"
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "net/http/transport_security_state.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/proxy/proxy_config_service_fixed.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/proxy/proxy_resolver.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/proxy/proxy_service.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/crypto/quic_decrypter.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/crypto/quic_encrypter.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/quic_framer.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/test_tools/crypto_test_utils.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/test_tools/mock_clock.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/test_tools/mock_random.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/test_tools/quic_test_utils.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/socket/client_socket_factory.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/socket/mock_client_socket_pool_manager.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/socket/socket_test_util.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/socket/ssl_client_socket.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/spdy/spdy_frame_builder.h"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/spdy/spdy_framer.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_config_service_defaults.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/platform_test.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//-----------------------------------------------------------------------------
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This is the expected return from a current server advertising QUIC.
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static const char kQuicAlternateProtocolHttpHeader[] =
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    "Alternate-Protocol: 80:quic\r\n\r\n";
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic const char kQuicAlternateProtocolHttpsHeader[] =
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    "Alternate-Protocol: 443:quic\r\n\r\n";
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace net {
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace test {
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class QuicNetworkTransactionTest : public PlatformTest {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicNetworkTransactionTest()
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : clock_(new MockClock),
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ssl_config_service_(new SSLConfigServiceDefaults),
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        proxy_service_(ProxyService::CreateDirect()),
63b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        compressor_(new QuicSpdyCompressor()),
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        auth_handler_factory_(
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        hanging_data_(NULL, 0, NULL, 0) {
67a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    request_.method = "GET";
68a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    request_.url = GURL("http://www.google.com/");
69a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    request_.load_flags = 0;
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() {
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() {
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Empty the current queue.
8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PlatformTest::TearDown();
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    HttpStreamFactory::set_use_alternate_protocols(false);
85ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    HttpStreamFactory::SetNextProtos(std::vector<NextProto>());
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> ConstructRstPacket(
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicPacketSequenceNumber num,
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicStreamId stream_id) {
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacketHeader header;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header.public_header.guid = 0xDEADBEEF;
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header.public_header.reset_flag = false;
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header.public_header.version_flag = false;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header.packet_sequence_number = num;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header.entropy_flag = false;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header.fec_flag = false;
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header.fec_group = 0;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    QuicRstStreamFrame rst(stream_id, QUIC_STREAM_NO_ERROR);
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return scoped_ptr<QuicEncryptedPacket>(
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ConstructPacket(header, QuicFrame(&rst)));
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      QuicPacketSequenceNumber num) {
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    QuicPacketHeader header;
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    header.public_header.guid = 0xDEADBEEF;
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    header.public_header.reset_flag = false;
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    header.public_header.version_flag = false;
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    header.packet_sequence_number = num;
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    header.entropy_flag = false;
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    header.fec_flag = false;
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    header.fec_group = 0;
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    QuicAckFrame ack_frame(0, QuicTime::Zero(), 0);
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    QuicConnectionCloseFrame close;
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    close.error_code = QUIC_CRYPTO_VERSION_NOT_SUPPORTED;
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    close.error_details = "Time to panic!";
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    close.ack_frame = ack_frame;
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return scoped_ptr<QuicEncryptedPacket>(
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ConstructPacket(header, QuicFrame(&close)));
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> ConstructAckPacket(
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicPacketSequenceNumber largest_received,
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicPacketSequenceNumber least_unacked) {
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacketHeader header;
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header.public_header.guid = 0xDEADBEEF;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header.public_header.reset_flag = false;
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header.public_header.version_flag = false;
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header.packet_sequence_number = 2;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header.entropy_flag = false;
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header.fec_flag = false;
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header.fec_group = 0;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicAckFrame ack(largest_received, QuicTime::Zero(), least_unacked);
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicCongestionFeedbackFrame feedback;
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    feedback.type = kTCP;
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    feedback.tcp.accumulated_number_of_lost_packets = 0;
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    feedback.tcp.receive_window = 256000;
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
144558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    QuicFramer framer(QuicVersionMax(), QuicTime::Zero(), false);
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicFrames frames;
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    frames.push_back(QuicFrame(&ack));
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    frames.push_back(QuicFrame(&feedback));
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<QuicPacket> packet(
1492385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        framer.BuildUnsizedDataPacket(header, frames).packet);
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket(
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ENCRYPTION_NONE, header.packet_sequence_number, *packet));
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string GetRequestString(const std::string& method,
1557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                               const std::string& scheme,
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const std::string& path) {
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SpdyHeaderBlock headers;
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    headers[":method"] = method;
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    headers[":host"] = "www.google.com";
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    headers[":path"] = path;
1617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    headers[":scheme"] = scheme;
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    headers[":version"] = "HTTP/1.1";
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return SerializeHeaderBlock(headers);
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string GetResponseString(const std::string& status,
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                const std::string& body) {
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SpdyHeaderBlock headers;
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    headers[":status"] = status;
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    headers[":version"] = "HTTP/1.1";
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    headers["content-type"] = "text/plain";
172b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return compressor_->CompressHeaders(headers) + body;
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string SerializeHeaderBlock(const SpdyHeaderBlock& headers) {
17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    QuicSpdyCompressor compressor;
17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return compressor.CompressHeaders(headers);
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns a newly created packet to send kData on stream 1.
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicEncryptedPacket* ConstructDataPacket(
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicPacketSequenceNumber sequence_number,
183b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      QuicStreamId stream_id,
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool should_include_version,
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool fin,
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicStreamOffset offset,
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::StringPiece data) {
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InitializeHeader(sequence_number, should_include_version);
189b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    QuicStreamFrame frame(stream_id, fin, offset, data);
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return ConstructPacket(header_, QuicFrame(&frame)).release();
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> ConstructPacket(
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const QuicPacketHeader& header,
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const QuicFrame& frame) {
196558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    QuicFramer framer(QuicVersionMax(), QuicTime::Zero(), false);
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicFrames frames;
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    frames.push_back(frame);
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<QuicPacket> packet(
2002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        framer.BuildUnsizedDataPacket(header, frames).packet);
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket(
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ENCRYPTION_NONE, header.packet_sequence_number, *packet));
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void InitializeHeader(QuicPacketSequenceNumber sequence_number,
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        bool should_include_version) {
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.public_header.guid = random_generator_.RandUint64();
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.public_header.reset_flag = false;
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.public_header.version_flag = should_include_version;
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.packet_sequence_number = sequence_number;
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.fec_group = 0;
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.entropy_flag = false;
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.fec_flag = false;
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CreateSession() {
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    CreateSessionWithFactory(&socket_factory_);
218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void CreateSessionWithFactory(ClientSocketFactory* socket_factory) {
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    params_.enable_quic = true;
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    params_.quic_clock = clock_;
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    params_.quic_random = &random_generator_;
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    params_.client_socket_factory = socket_factory;
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    params_.host_resolver = &host_resolver_;
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    params_.cert_verifier = &cert_verifier_;
2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    params_.transport_security_state = &transport_security_state_;
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    params_.proxy_service = proxy_service_.get();
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    params_.ssl_config_service = ssl_config_service_.get();
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    params_.http_auth_handler_factory = auth_handler_factory_.get();
232ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    params_.http_server_properties = http_server_properties.GetWeakPtr();
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    session_ = new HttpNetworkSession(params_);
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
237a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void CheckWasQuicResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
238a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const HttpResponseInfo* response = trans->GetResponseInfo();
239a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    ASSERT_TRUE(response != NULL);
240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ASSERT_TRUE(response->headers.get() != NULL);
241a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
242a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    EXPECT_TRUE(response->was_fetched_via_spdy);
243a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    EXPECT_TRUE(response->was_npn_negotiated);
244a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
245a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)              response->connection_info);
246a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
247a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
248a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void CheckWasHttpResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
249a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const HttpResponseInfo* response = trans->GetResponseInfo();
250a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    ASSERT_TRUE(response != NULL);
251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ASSERT_TRUE(response->headers.get() != NULL);
252a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
253a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    EXPECT_FALSE(response->was_fetched_via_spdy);
254a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    EXPECT_FALSE(response->was_npn_negotiated);
255a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1,
256a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)              response->connection_info);
257a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
258a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
259a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void CheckResponseData(HttpNetworkTransaction* trans,
260a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                         const std::string& expected) {
261a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    std::string response_data;
262a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    ASSERT_EQ(OK, ReadTransaction(trans, &response_data));
263a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    EXPECT_EQ(expected, response_data);
264a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
265a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
266a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void RunTransaction(HttpNetworkTransaction* trans) {
267a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    TestCompletionCallback callback;
268a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
269a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, rv);
270a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    EXPECT_EQ(OK, callback.WaitForResult());
271a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
272a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
273a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void SendRequestAndExpectHttpResponse(const std::string& expected) {
274a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    scoped_ptr<HttpNetworkTransaction> trans(
275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
276a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    RunTransaction(trans.get());
277a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    CheckWasHttpResponse(trans);
278a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    CheckResponseData(trans.get(), expected);
279a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
280a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
281a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void SendRequestAndExpectQuicResponse(const std::string& expected) {
282a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    scoped_ptr<HttpNetworkTransaction> trans(
283868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
284a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    RunTransaction(trans.get());
285a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    CheckWasQuicResponse(trans);
286a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    CheckResponseData(trans.get(), expected);
287a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
288a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
289a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void AddQuicAlternateProtocolMapping(
290a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      MockCryptoClientStream::HandshakeMode handshake_mode) {
291a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
292a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    session_->http_server_properties()->SetAlternateProtocol(
293a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        HostPortPair::FromURL(request_.url), 80, QUIC);
294a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
295a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
296a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void ExpectBrokenAlternateProtocolMapping() {
297a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    ASSERT_TRUE(session_->http_server_properties()->HasAlternateProtocol(
298a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        HostPortPair::FromURL(request_.url)));
299a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const PortAlternateProtocolPair alternate =
300a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        session_->http_server_properties()->GetAlternateProtocol(
301a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            HostPortPair::FromURL(request_.url));
302a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    EXPECT_EQ(ALTERNATE_PROTOCOL_BROKEN, alternate.protocol);
303a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
304a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
305a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void AddHangingNonAlternateProtocolSocketData() {
306eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
307eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    hanging_data_.set_connect_data(hanging_connect);
308eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    socket_factory_.AddSocketDataProvider(&hanging_data_);
309a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
310a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketHeader header_;
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<HttpNetworkSession> session_;
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockClientSocketFactory socket_factory_;
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockCryptoClientStreamFactory crypto_client_stream_factory_;
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockClock* clock_;  // Owned by QuicStreamFactory after CreateSession.
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockHostResolver host_resolver_;
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockCertVerifier cert_verifier_;
3187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TransportSecurityState transport_security_state_;
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ProxyService> proxy_service_;
321b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  scoped_ptr<QuicSpdyCompressor> compressor_;
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockRandom random_generator_;
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HttpServerPropertiesImpl http_server_properties;
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HttpNetworkSession::Params params_;
326a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  HttpRequestInfo request_;
327a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CapturingBoundNetLog net_log_;
328eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  StaticSocketDataProvider hanging_data_;
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicNetworkTransactionTest, ForceQuic) {
332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  params_.origin_to_force_quic_on =
333868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      HostPortPair::FromString("www.google.com:80");
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
335b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  QuicStreamId stream_id = 3;
336a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> req(
337b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ConstructDataPacket(1, stream_id, true, true, 0,
3387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                          GetRequestString("GET", "http", "/")));
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> ack(ConstructAckPacket(1, 0));
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockWrite quic_writes[] = {
342a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    MockWrite(SYNCHRONOUS, req->data(), req->length()),
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockWrite(SYNCHRONOUS, ack->data(), ack->length()),
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> resp(
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConstructDataPacket(
348b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          1, stream_id, false, true, 0, GetResponseString("200 OK", "hello!")));
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockRead quic_reads[] = {
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockRead(SYNCHRONOUS, resp->data(), resp->length()),
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockRead(ASYNC, OK),  // EOF
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DelayedSocketData quic_data(
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      1,  // wait for one write to finish before reading.
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      quic_reads, arraysize(quic_reads),
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      quic_writes, arraysize(quic_writes));
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  socket_factory_.AddSocketDataProvider(&quic_data);
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
361a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // The non-alternate protocol job needs to hang in order to guarantee that
362a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // the alternate-protocol job will "win".
363a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  AddHangingNonAlternateProtocolSocketData();
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSession();
366a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
367a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SendRequestAndExpectQuicResponse("hello!");
368a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
369b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Check that the NetLog was filled reasonably.
370b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  net::CapturingNetLog::CapturedEntryList entries;
371a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  net_log_.GetEntries(&entries);
372b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_LT(0u, entries.size());
373b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
374b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
375b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  int pos = net::ExpectLogContainsSomewhere(
376b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      entries, 0,
377b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      net::NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
378b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      net::NetLog::PHASE_NONE);
379b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_LT(0, pos);
380b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
381b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // ... and also a TYPE_QUIC_SESSION_PACKET_HEADER_RECEIVED.
382b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  pos = net::ExpectLogContainsSomewhere(
383b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      entries, 0,
384b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      net::NetLog::TYPE_QUIC_SESSION_PACKET_HEADER_RECEIVED,
385b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      net::NetLog::PHASE_NONE);
386b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_LT(0, pos);
387b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
388b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::string packet_sequence_number;
389b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ASSERT_TRUE(entries[pos].GetStringValue(
390b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      "packet_sequence_number", &packet_sequence_number));
391b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ("1", packet_sequence_number);
392b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
393b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED.
394b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  pos = net::ExpectLogContainsSomewhere(
395b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      entries, 0,
396b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      net::NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
397b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      net::NetLog::PHASE_NONE);
398b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_LT(0, pos);
399b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
400b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  int log_stream_id;
401b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
402b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(stream_id, static_cast<QuicStreamId>(log_stream_id));
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
40590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  params_.origin_to_force_quic_on =
407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      HostPortPair::FromString("www.google.com:80");
40890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
40990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MockRead quic_reads[] = {
41090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
41190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  };
41290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
41390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                     NULL, 0);
41490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  socket_factory_.AddSocketDataProvider(&quic_data);
41590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
41690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreateSession();
41790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
41890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<HttpNetworkTransaction> trans(
419868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
42090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TestCompletionCallback callback;
42190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
42290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, rv);
423a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
42490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
42590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Attempt to "force" quic on 443, which will not be honored.
428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  params_.origin_to_force_quic_on =
429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      HostPortPair::FromString("www.google.com:443");
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
431a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  MockRead http_reads[] = {
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockRead("HTTP/1.1 200 OK\r\n\r\n"),
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockRead("hello world"),
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockRead(ASYNC, OK)
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
438a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  StaticSocketDataProvider data(http_reads, arraysize(http_reads), NULL, 0);
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  socket_factory_.AddSocketDataProvider(&data);
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SSLSocketDataProvider ssl(ASYNC, OK);
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  socket_factory_.AddSSLSocketDataProvider(&ssl);
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSession();
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
445a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SendRequestAndExpectHttpResponse("hello world");
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
449eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  HttpStreamFactory::EnableNpnSpdy();  // Enables QUIC too.
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
451a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  MockRead http_reads[] = {
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockRead("HTTP/1.1 200 OK\r\n"),
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockRead(kQuicAlternateProtocolHttpHeader),
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockRead("hello world"),
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockRead(ASYNC, OK)
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
459a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
460a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                                     NULL, 0);
461a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  socket_factory_.AddSocketDataProvider(&http_data);
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
463a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> req(
4647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      ConstructDataPacket(1, 3, true, true, 0,
4657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                          GetRequestString("GET", "http", "/")));
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> ack(ConstructAckPacket(1, 0));
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockWrite quic_writes[] = {
469a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    MockWrite(SYNCHRONOUS, req->data(), req->length()),
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockWrite(SYNCHRONOUS, ack->data(), ack->length()),
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> resp(
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConstructDataPacket(
475b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          1, 3, false, true, 0, GetResponseString("200 OK", "hello!")));
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockRead quic_reads[] = {
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockRead(SYNCHRONOUS, resp->data(), resp->length()),
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockRead(ASYNC, OK),  // EOF
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DelayedSocketData quic_data(
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      1,  // wait for one write to finish before reading.
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      quic_reads, arraysize(quic_reads),
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      quic_writes, arraysize(quic_writes));
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  socket_factory_.AddSocketDataProvider(&quic_data);
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
488a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // The non-alternate protocol job needs to hang in order to guarantee that
489a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // the alternate-protocol job will "win".
490a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  AddHangingNonAlternateProtocolSocketData();
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSession();
493a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
494a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SendRequestAndExpectHttpResponse("hello world");
495a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SendRequestAndExpectQuicResponse("hello!");
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4987dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) {
4997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  params_.origin_to_force_quic_on =
5007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      HostPortPair::FromString("www.google.com:443");
5017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  params_.enable_quic_https = true;
5027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  HttpStreamFactory::EnableNpnSpdy();  // Enables QUIC too.
5037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  MockRead http_reads[] = {
5057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    MockRead("HTTP/1.1 200 OK\r\n"),
5067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    MockRead(kQuicAlternateProtocolHttpsHeader),
5077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    MockRead("hello world"),
5087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
5097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    MockRead(ASYNC, OK)
5107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  };
5117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
5137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                     NULL, 0);
5147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  socket_factory_.AddSocketDataProvider(&http_data);
5157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<QuicEncryptedPacket> req(
5177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      ConstructDataPacket(1, 3, true, true, 0,
5187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                          GetRequestString("GET", "https", "/")));
5197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<QuicEncryptedPacket> ack(ConstructAckPacket(1, 0));
5207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  MockWrite quic_writes[] = {
5227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    MockWrite(SYNCHRONOUS, req->data(), req->length()),
5237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    MockWrite(SYNCHRONOUS, ack->data(), ack->length()),
5247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  };
5257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<QuicEncryptedPacket> resp(
5277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      ConstructDataPacket(
5287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          1, 3, false, true, 0, GetResponseString("200 OK", "hello!")));
5297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  MockRead quic_reads[] = {
5307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    MockRead(SYNCHRONOUS, resp->data(), resp->length()),
5317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    MockRead(ASYNC, OK),  // EOF
5327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  };
5337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DelayedSocketData quic_data(
5357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      1,  // wait for one write to finish before reading.
5367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      quic_reads, arraysize(quic_reads),
5377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      quic_writes, arraysize(quic_writes));
5387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  socket_factory_.AddSocketDataProvider(&quic_data);
5407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // The non-alternate protocol job needs to hang in order to guarantee that
5427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // the alternate-protocol job will "win".
5437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  AddHangingNonAlternateProtocolSocketData();
5447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  CreateSession();
5467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
5487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SendRequestAndExpectHttpResponse("hello world");
5497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
5507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
551eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(QuicNetworkTransactionTest, HungAlternateProtocol) {
552eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  HttpStreamFactory::EnableNpnSpdy();  // Enables QUIC too.
553eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  crypto_client_stream_factory_.set_handshake_mode(
554eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      MockCryptoClientStream::COLD_START);
555eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
556eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  MockWrite http_writes[] = {
557eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
558eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    MockWrite(SYNCHRONOUS, 1, "Host: www.google.com\r\n"),
559eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")
560eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
561eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
562eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  MockRead http_reads[] = {
563eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
564eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHttpHeader),
565eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    MockRead(SYNCHRONOUS, 5, "hello world"),
566eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    MockRead(SYNCHRONOUS, OK, 6)
567eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
568eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
569eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DeterministicMockClientSocketFactory socket_factory;
570eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
571eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DeterministicSocketData http_data(http_reads, arraysize(http_reads),
572eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                    http_writes, arraysize(http_writes));
573eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  socket_factory.AddSocketDataProvider(&http_data);
574eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
575eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The QUIC transaction will not be allowed to complete.
576eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  MockWrite quic_writes[] = {
577eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    MockWrite(ASYNC, ERR_IO_PENDING, 0)
578eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
579eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  MockRead quic_reads[] = {
580eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    MockRead(ASYNC, ERR_IO_PENDING, 1),
581eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
582eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DeterministicSocketData quic_data(quic_reads, arraysize(quic_reads),
583eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                    quic_writes, arraysize(quic_writes));
584eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  socket_factory.AddSocketDataProvider(&quic_data);
585eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
586eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The HTTP transaction will complete.
587eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DeterministicSocketData http_data2(http_reads, arraysize(http_reads),
588eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                     http_writes, arraysize(http_writes));
589eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  socket_factory.AddSocketDataProvider(&http_data2);
590eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
591eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CreateSessionWithFactory(&socket_factory);
592eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
593eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Run the first request.
594eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  http_data.StopAfter(arraysize(http_reads) + arraysize(http_writes));
595eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SendRequestAndExpectHttpResponse("hello world");
596eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(http_data.at_read_eof());
597eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(http_data.at_write_eof());
598eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
599eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Now run the second request in which the QUIC socket hangs,
600eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // and verify the the transaction continues over HTTP.
601eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  http_data2.StopAfter(arraysize(http_reads) + arraysize(http_writes));
602eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SendRequestAndExpectHttpResponse("hello world");
603eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
604eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(http_data2.at_read_eof());
605eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(http_data2.at_write_eof());
606eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(!quic_data.at_read_eof());
607eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(!quic_data.at_write_eof());
608eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
609eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
610eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
611eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  HttpStreamFactory::EnableNpnSpdy();  // Enables QUIC too.
612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
613a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> req(
6147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      ConstructDataPacket(1, 3, true, true, 0,
6157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                          GetRequestString("GET", "http", "/")));
616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> ack(ConstructAckPacket(1, 0));
617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockWrite quic_writes[] = {
619a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    MockWrite(SYNCHRONOUS, req->data(), req->length()),
620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockWrite(SYNCHRONOUS, ack->data(), ack->length()),
621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> resp(
624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ConstructDataPacket(
625b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          1, 3, false, true, 0, GetResponseString("200 OK", "hello!")));
626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockRead quic_reads[] = {
627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockRead(SYNCHRONOUS, resp->data(), resp->length()),
628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockRead(ASYNC, OK),  // EOF
629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DelayedSocketData quic_data(
632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      1,  // wait for one write to finish before reading.
633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      quic_reads, arraysize(quic_reads),
634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      quic_writes, arraysize(quic_writes));
635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  socket_factory_.AddSocketDataProvider(&quic_data);
637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
638eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The non-alternate protocol job needs to hang in order to guarantee that
639eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // the alternate-protocol job will "win".
640eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AddHangingNonAlternateProtocolSocketData();
641eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
642eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CreateSession();
643eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
644eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SendRequestAndExpectQuicResponse("hello!");
645eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
646eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
647eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
648eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  HttpStreamFactory::EnableNpnSpdy();  // Enables QUIC too.
649eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
650eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<QuicEncryptedPacket> req(
6517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      ConstructDataPacket(1, 3, true, true, 0,
6527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                          GetRequestString("GET", "http", "/")));
653eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<QuicEncryptedPacket> ack(ConstructAckPacket(1, 0));
654eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
655eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  MockWrite quic_writes[] = {
656eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    MockWrite(SYNCHRONOUS, req->data(), req->length()),
657eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    MockWrite(SYNCHRONOUS, ack->data(), ack->length()),
658eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
659eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
660eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<QuicEncryptedPacket> resp(
661eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ConstructDataPacket(
662eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          1, 3, false, true, 0, GetResponseString("200 OK", "hello!")));
663eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  MockRead quic_reads[] = {
664eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    MockRead(SYNCHRONOUS, resp->data(), resp->length()),
665eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    MockRead(ASYNC, OK),  // EOF
666eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
667eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
668eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DelayedSocketData quic_data(
669eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      1,  // wait for one write to finish before reading.
670eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      quic_reads, arraysize(quic_reads),
671eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      quic_writes, arraysize(quic_writes));
672eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
673eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  socket_factory_.AddSocketDataProvider(&quic_data);
674eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
675eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // In order for a new QUIC session to be established via alternate-protocol
676eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // without racing an HTTP connection, we need the host resolution to happen
677eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // synchronously.
678eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  host_resolver_.set_synchronous_mode(true);
679eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", "");
680eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  HostResolver::RequestInfo info(HostPortPair("www.google.com", 80));
681eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AddressList address;
682eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  host_resolver_.Resolve(info, &address, CompletionCallback(), NULL,
683eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                         net_log_.bound());
684eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CreateSession();
686a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
687a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SendRequestAndExpectQuicResponse("hello!");
688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
691eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  HttpStreamFactory::EnableNpnSpdy();  // Enables QUIC too.
692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Alternate-protocol job
694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1));
695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockRead quic_reads[] = {
696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockRead(ASYNC, close->data(), close->length()),
697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockRead(ASYNC, OK),  // EOF
698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     NULL, 0);
701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  socket_factory_.AddSocketDataProvider(&quic_data);
702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Main job which will succeed even though the alternate job fails.
704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockRead http_reads[] = {
705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockRead("HTTP/1.1 200 OK\r\n\r\n"),
706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockRead("hello from http"),
707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockRead(ASYNC, OK)
709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     NULL, 0);
713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  socket_factory_.AddSocketDataProvider(&http_data);
714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CreateSession();
716a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
717a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SendRequestAndExpectHttpResponse("hello from http");
718a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ExpectBrokenAlternateProtocolMapping();
719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
722eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  HttpStreamFactory::EnableNpnSpdy();  // Enables QUIC too.
723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Alternate-protocol job
725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockRead quic_reads[] = {
726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     NULL, 0);
730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  socket_factory_.AddSocketDataProvider(&quic_data);
731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Main job which will succeed even though the alternate job fails.
733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockRead http_reads[] = {
734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockRead("HTTP/1.1 200 OK\r\n\r\n"),
735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockRead("hello from http"),
736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockRead(ASYNC, OK)
738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     NULL, 0);
742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  socket_factory_.AddSocketDataProvider(&http_data);
743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CreateSession();
745a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
746a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
747a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SendRequestAndExpectHttpResponse("hello from http");
748a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ExpectBrokenAlternateProtocolMapping();
749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace test
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace net
753