quic_network_transaction_unittest.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
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); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpStreamFactory::SetNextProtos(std::vector<std::string>()); 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) 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicFramer framer(kQuicVersion1, 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( 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) framer.ConstructFrameDataPacket(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) { 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicFramer framer(kQuicVersion1, QuicTime::Zero(), false); 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicFrames frames; 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frames.push_back(frame); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<QuicPacket> packet( 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) framer.ConstructFrameDataPacket(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(); 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params_.http_server_properties = &http_server_properties; 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); 42390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, 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