blob: f02d811895e31260584992e3bb3b00100010c541 [file] [log] [blame]
[email protected]61a527782013-02-21 03:58:001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]1e960032013-12-20 19:00:205#include <vector>
6
[email protected]61a527782013-02-21 03:58:007#include "base/basictypes.h"
8#include "base/compiler_specific.h"
9#include "base/memory/scoped_ptr.h"
[email protected]98b20ce2013-05-10 05:55:2610#include "base/stl_util.h"
[email protected]61a527782013-02-21 03:58:0011#include "net/base/test_completion_callback.h"
[email protected]6e7845ae2013-03-29 21:48:1112#include "net/cert/mock_cert_verifier.h"
[email protected]f2cb3cf2013-03-21 01:40:5313#include "net/dns/mock_host_resolver.h"
[email protected]61a527782013-02-21 03:58:0014#include "net/http/http_auth_handler_factory.h"
15#include "net/http/http_network_session.h"
16#include "net/http/http_network_transaction.h"
17#include "net/http/http_server_properties_impl.h"
18#include "net/http/http_stream.h"
19#include "net/http/http_stream_factory.h"
[email protected]c41737d2014-05-14 07:47:1920#include "net/http/http_transaction_test_util.h"
[email protected]b1c988b2013-06-13 06:48:1121#include "net/http/transport_security_state.h"
mmenke16a7cbdd2015-04-24 23:00:5622#include "net/log/captured_net_log_entry.h"
eroman87c53d62015-04-02 06:51:0723#include "net/log/net_log_unittest.h"
vishal.b62985ca92015-04-17 08:45:5124#include "net/log/test_net_log.h"
[email protected]61a527782013-02-21 03:58:0025#include "net/proxy/proxy_config_service_fixed.h"
26#include "net/proxy/proxy_resolver.h"
27#include "net/proxy/proxy_service.h"
28#include "net/quic/crypto/quic_decrypter.h"
29#include "net/quic/crypto/quic_encrypter.h"
30#include "net/quic/quic_framer.h"
[email protected]24e5bc52013-09-18 15:36:5831#include "net/quic/quic_http_utils.h"
[email protected]ed3fc15d2013-03-08 18:37:4432#include "net/quic/test_tools/crypto_test_utils.h"
[email protected]61a527782013-02-21 03:58:0033#include "net/quic/test_tools/mock_clock.h"
[email protected]e8ff26842013-03-22 21:02:0534#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
[email protected]61a527782013-02-21 03:58:0035#include "net/quic/test_tools/mock_random.h"
[email protected]1e960032013-12-20 19:00:2036#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]61a527782013-02-21 03:58:0037#include "net/quic/test_tools/quic_test_utils.h"
38#include "net/socket/client_socket_factory.h"
39#include "net/socket/mock_client_socket_pool_manager.h"
40#include "net/socket/socket_test_util.h"
41#include "net/socket/ssl_client_socket.h"
42#include "net/spdy/spdy_frame_builder.h"
43#include "net/spdy/spdy_framer.h"
[email protected]536fd0b2013-03-14 17:41:5744#include "net/ssl/ssl_config_service_defaults.h"
[email protected]61a527782013-02-21 03:58:0045#include "testing/gtest/include/gtest/gtest.h"
46#include "testing/platform_test.h"
47
48//-----------------------------------------------------------------------------
49
50namespace {
51
52// This is the expected return from a current server advertising QUIC.
53static const char kQuicAlternateProtocolHttpHeader[] =
[email protected]4ff65372013-06-21 05:45:4654 "Alternate-Protocol: 80:quic\r\n\r\n";
[email protected]287d9412014-07-08 23:01:0055static const char kQuicAlternateProtocol50pctHttpHeader[] =
56 "Alternate-Protocol: 80:quic,p=.5\r\n\r\n";
bnc62a44f022015-04-02 15:59:4157static const char kQuicAlternateProtocolDifferentPortHttpHeader[] =
58 "Alternate-Protocol: 137:quic\r\n\r\n";
[email protected]6d1b4ed2013-07-10 03:57:5459static const char kQuicAlternateProtocolHttpsHeader[] =
60 "Alternate-Protocol: 443:quic\r\n\r\n";
[email protected]1e960032013-12-20 19:00:2061
[email protected]61a527782013-02-21 03:58:0062} // namespace
63
64namespace net {
65namespace test {
66
[email protected]1e960032013-12-20 19:00:2067// Helper class to encapsulate MockReads and MockWrites for QUIC.
68// Simplify ownership issues and the interaction with the MockSocketFactory.
69class MockQuicData {
70 public:
rcha5399e02015-04-21 19:32:0471 MockQuicData() : sequence_number_(0) {}
72
[email protected]1e960032013-12-20 19:00:2073 ~MockQuicData() {
74 STLDeleteElements(&packets_);
75 }
76
rcha5399e02015-04-21 19:32:0477 void AddSynchronousRead(scoped_ptr<QuicEncryptedPacket> packet) {
[email protected]1e960032013-12-20 19:00:2078 reads_.push_back(MockRead(SYNCHRONOUS, packet->data(), packet->length(),
79 sequence_number_++));
80 packets_.push_back(packet.release());
81 }
82
rcha5399e02015-04-21 19:32:0483 void AddRead(scoped_ptr<QuicEncryptedPacket> packet) {
84 reads_.push_back(
85 MockRead(ASYNC, packet->data(), packet->length(), sequence_number_++));
86 packets_.push_back(packet.release());
87 }
88
[email protected]1e960032013-12-20 19:00:2089 void AddRead(IoMode mode, int rv) {
rcha5399e02015-04-21 19:32:0490 reads_.push_back(MockRead(mode, rv, sequence_number_++));
[email protected]1e960032013-12-20 19:00:2091 }
92
93 void AddWrite(scoped_ptr<QuicEncryptedPacket> packet) {
94 writes_.push_back(MockWrite(SYNCHRONOUS, packet->data(), packet->length(),
95 sequence_number_++));
96 packets_.push_back(packet.release());
97 }
98
rcha5399e02015-04-21 19:32:0499 void AddSocketDataToFactory(MockClientSocketFactory* factory) {
rtennetibe635732014-10-02 22:51:42100 MockRead* reads = reads_.empty() ? nullptr : &reads_[0];
101 MockWrite* writes = writes_.empty() ? nullptr : &writes_[0];
rcha5399e02015-04-21 19:32:04102 socket_data_.reset(
103 new SequencedSocketData(reads, reads_.size(), writes, writes_.size()));
[email protected]1e960032013-12-20 19:00:20104 factory->AddSocketDataProvider(socket_data_.get());
105 }
106
107 private:
108 std::vector<QuicEncryptedPacket*> packets_;
109 std::vector<MockWrite> writes_;
110 std::vector<MockRead> reads_;
111 size_t sequence_number_;
112 scoped_ptr<SocketDataProvider> socket_data_;
113};
114
tbansal7cec3812015-02-05 21:25:12115class ProxyHeadersHandler {
116 public:
117 ProxyHeadersHandler() : was_called_(false) {}
118
119 bool was_called() { return was_called_; }
120
121 void OnBeforeProxyHeadersSent(const ProxyInfo& proxy_info,
122 HttpRequestHeaders* request_headers) {
123 was_called_ = true;
124 }
125
126 private:
127 bool was_called_;
128};
129
[email protected]1e960032013-12-20 19:00:20130class QuicNetworkTransactionTest
131 : public PlatformTest,
[email protected]5d03bbd2014-03-07 16:19:16132 public ::testing::WithParamInterface<QuicVersion> {
[email protected]61a527782013-02-21 03:58:00133 protected:
[email protected]1c04f9522013-02-21 20:32:43134 QuicNetworkTransactionTest()
rtenneti4b06ae72014-08-26 03:43:43135 : clock_(new MockClock),
136 maker_(GetParam(), 0, clock_),
[email protected]1c04f9522013-02-21 20:32:43137 ssl_config_service_(new SSLConfigServiceDefaults),
138 proxy_service_(ProxyService::CreateDirect()),
139 auth_handler_factory_(
[email protected]dda75ab2013-06-22 22:43:30140 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
[email protected]457d6952013-12-13 09:24:58141 random_generator_(0),
rtennetibe635732014-10-02 22:51:42142 hanging_data_(nullptr, 0, nullptr, 0) {
[email protected]aa9b14d2013-05-10 23:45:19143 request_.method = "GET";
144 request_.url = GURL("http://www.google.com/");
145 request_.load_flags = 0;
[email protected]98a9d1252014-04-04 00:43:59146 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
[email protected]1c04f9522013-02-21 20:32:43147 }
[email protected]61a527782013-02-21 03:58:00148
dcheng67be2b1f2014-10-27 21:47:29149 void SetUp() override {
[email protected]61a527782013-02-21 03:58:00150 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34151 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00152 }
153
dcheng67be2b1f2014-10-27 21:47:29154 void TearDown() override {
[email protected]61a527782013-02-21 03:58:00155 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
156 // Empty the current queue.
[email protected]2da659e2013-05-23 20:51:34157 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00158 PlatformTest::TearDown();
159 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34160 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00161 }
162
[email protected]3316d422013-05-03 21:45:30163 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
164 QuicPacketSequenceNumber num) {
[email protected]1e960032013-12-20 19:00:20165 return maker_.MakeConnectionClosePacket(num);
[email protected]3316d422013-05-03 21:45:30166 }
167
[email protected]61a527782013-02-21 03:58:00168 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket(
169 QuicPacketSequenceNumber largest_received,
170 QuicPacketSequenceNumber least_unacked) {
[email protected]1e960032013-12-20 19:00:20171 return maker_.MakeAckPacket(2, largest_received, least_unacked, true);
172 }
[email protected]61a527782013-02-21 03:58:00173
[email protected]1e960032013-12-20 19:00:20174 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
175 const std::string& scheme,
176 const std::string& path) {
177 return maker_.GetRequestHeaders(method, scheme, path);
[email protected]61a527782013-02-21 03:58:00178 }
179
[email protected]1e960032013-12-20 19:00:20180 SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
181 return maker_.GetResponseHeaders(status);
[email protected]61a527782013-02-21 03:58:00182 }
183
[email protected]1e960032013-12-20 19:00:20184 scoped_ptr<QuicEncryptedPacket> ConstructDataPacket(
[email protected]61a527782013-02-21 03:58:00185 QuicPacketSequenceNumber sequence_number,
[email protected]98b20ce2013-05-10 05:55:26186 QuicStreamId stream_id,
[email protected]e8ff26842013-03-22 21:02:05187 bool should_include_version,
[email protected]61a527782013-02-21 03:58:00188 bool fin,
189 QuicStreamOffset offset,
190 base::StringPiece data) {
[email protected]1e960032013-12-20 19:00:20191 return maker_.MakeDataPacket(
192 sequence_number, stream_id, should_include_version, fin, offset, data);
[email protected]61a527782013-02-21 03:58:00193 }
194
[email protected]1e960032013-12-20 19:00:20195 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
196 QuicPacketSequenceNumber sequence_number,
197 QuicStreamId stream_id,
198 bool should_include_version,
199 bool fin,
200 const SpdyHeaderBlock& headers) {
rtennetif4bdb542015-01-21 14:33:05201 QuicPriority priority =
202 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
203 return maker_.MakeRequestHeadersPacket(sequence_number, stream_id,
204 should_include_version, fin,
205 priority, headers);
[email protected]61a527782013-02-21 03:58:00206 }
207
[email protected]1e960032013-12-20 19:00:20208 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
209 QuicPacketSequenceNumber sequence_number,
210 QuicStreamId stream_id,
211 bool should_include_version,
212 bool fin,
213 const SpdyHeaderBlock& headers) {
214 return maker_.MakeResponseHeadersPacket(
215 sequence_number, stream_id, should_include_version, fin, headers);
[email protected]61a527782013-02-21 03:58:00216 }
217
218 void CreateSession() {
[email protected]d7599122014-05-24 03:37:23219 CreateSessionWithFactory(&socket_factory_, false);
[email protected]dda75ab2013-06-22 22:43:30220 }
221
[email protected]d7599122014-05-24 03:37:23222 void CreateSessionWithNextProtos() {
223 CreateSessionWithFactory(&socket_factory_, true);
224 }
225
226 // If |use_next_protos| is true, enables SPDY and QUIC.
227 void CreateSessionWithFactory(ClientSocketFactory* socket_factory,
228 bool use_next_protos) {
[email protected]4dca587c2013-03-07 16:54:47229 params_.enable_quic = true;
230 params_.quic_clock = clock_;
231 params_.quic_random = &random_generator_;
[email protected]dda75ab2013-06-22 22:43:30232 params_.client_socket_factory = socket_factory;
[email protected]e8ff26842013-03-22 21:02:05233 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43234 params_.host_resolver = &host_resolver_;
235 params_.cert_verifier = &cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11236 params_.transport_security_state = &transport_security_state_;
[email protected]1c04f9522013-02-21 20:32:43237 params_.proxy_service = proxy_service_.get();
238 params_.ssl_config_service = ssl_config_service_.get();
239 params_.http_auth_handler_factory = auth_handler_factory_.get();
[email protected]30d4c022013-07-18 22:58:16240 params_.http_server_properties = http_server_properties.GetWeakPtr();
[email protected]1e960032013-12-20 19:00:20241 params_.quic_supported_versions = SupportedVersions(GetParam());
[email protected]61a527782013-02-21 03:58:00242
[email protected]d7599122014-05-24 03:37:23243 if (use_next_protos) {
244 params_.use_alternate_protocols = true;
bnc3bb2c232014-11-07 20:26:39245 params_.next_protos = NextProtosWithSpdyAndQuic(true, true);
[email protected]d7599122014-05-24 03:37:23246 }
247
[email protected]61a527782013-02-21 03:58:00248 session_ = new HttpNetworkSession(params_);
[email protected]11c05872013-08-20 02:04:12249 session_->quic_stream_factory()->set_require_confirmation(false);
[email protected]61a527782013-02-21 03:58:00250 }
251
[email protected]aa9b14d2013-05-10 23:45:19252 void CheckWasQuicResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
253 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42254 ASSERT_TRUE(response != nullptr);
255 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19256 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
257 EXPECT_TRUE(response->was_fetched_via_spdy);
258 EXPECT_TRUE(response->was_npn_negotiated);
259 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
260 response->connection_info);
261 }
262
bnc62a44f022015-04-02 15:59:41263 void CheckResponsePort(const scoped_ptr<HttpNetworkTransaction>& trans,
264 uint16 port) {
265 const HttpResponseInfo* response = trans->GetResponseInfo();
266 ASSERT_TRUE(response != nullptr);
267 EXPECT_EQ(port, response->socket_address.port());
268 }
269
[email protected]aa9b14d2013-05-10 23:45:19270 void CheckWasHttpResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
271 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42272 ASSERT_TRUE(response != nullptr);
273 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19274 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
275 EXPECT_FALSE(response->was_fetched_via_spdy);
276 EXPECT_FALSE(response->was_npn_negotiated);
277 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1,
278 response->connection_info);
279 }
280
281 void CheckResponseData(HttpNetworkTransaction* trans,
282 const std::string& expected) {
283 std::string response_data;
284 ASSERT_EQ(OK, ReadTransaction(trans, &response_data));
285 EXPECT_EQ(expected, response_data);
286 }
287
288 void RunTransaction(HttpNetworkTransaction* trans) {
289 TestCompletionCallback callback;
290 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
291 EXPECT_EQ(ERR_IO_PENDING, rv);
292 EXPECT_EQ(OK, callback.WaitForResult());
293 }
294
295 void SendRequestAndExpectHttpResponse(const std::string& expected) {
296 scoped_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50297 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
[email protected]aa9b14d2013-05-10 23:45:19298 RunTransaction(trans.get());
299 CheckWasHttpResponse(trans);
300 CheckResponseData(trans.get(), expected);
301 }
302
303 void SendRequestAndExpectQuicResponse(const std::string& expected) {
bnc62a44f022015-04-02 15:59:41304 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, 80);
tbansal7cec3812015-02-05 21:25:12305 }
306
bnc62a44f022015-04-02 15:59:41307 void SendRequestAndExpectQuicResponseOnPort(const std::string& expected,
308 uint16 port) {
309 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, port);
310 }
311
312 void SendRequestAndExpectQuicResponseFromProxyOnPort(
313 const std::string& expected,
314 uint16 port) {
315 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port);
[email protected]aa9b14d2013-05-10 23:45:19316 }
317
318 void AddQuicAlternateProtocolMapping(
319 MockCryptoClientStream::HandshakeMode handshake_mode) {
320 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
bnccacc0992015-03-20 20:22:22321 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url);
322 AlternativeService alternative_service(QUIC, host_port_pair.host(), 80);
323 session_->http_server_properties()->SetAlternativeService(
324 host_port_pair, alternative_service, 1.0);
[email protected]aa9b14d2013-05-10 23:45:19325 }
326
327 void ExpectBrokenAlternateProtocolMapping() {
bnc8445b3002015-03-13 01:57:09328 const HostPortPair origin = HostPortPair::FromURL(request_.url);
bnc181b39a2015-03-17 21:36:47329 const AlternativeService alternative_service =
330 session_->http_server_properties()->GetAlternativeService(origin);
331 EXPECT_NE(UNINITIALIZED_ALTERNATE_PROTOCOL, alternative_service.protocol);
bnc8445b3002015-03-13 01:57:09332 EXPECT_TRUE(session_->http_server_properties()->IsAlternativeServiceBroken(
333 alternative_service));
[email protected]aa9b14d2013-05-10 23:45:19334 }
335
[email protected]4d590c9c2014-05-02 05:14:33336 void ExpectQuicAlternateProtocolMapping() {
bnc181b39a2015-03-17 21:36:47337 const AlternativeService alternative_service =
338 session_->http_server_properties()->GetAlternativeService(
[email protected]4d590c9c2014-05-02 05:14:33339 HostPortPair::FromURL(request_.url));
bnc181b39a2015-03-17 21:36:47340 EXPECT_EQ(QUIC, alternative_service.protocol);
[email protected]4d590c9c2014-05-02 05:14:33341 }
342
[email protected]aa9b14d2013-05-10 23:45:19343 void AddHangingNonAlternateProtocolSocketData() {
[email protected]dda75ab2013-06-22 22:43:30344 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
345 hanging_data_.set_connect_data(hanging_connect);
346 socket_factory_.AddSocketDataProvider(&hanging_data_);
[email protected]aa9b14d2013-05-10 23:45:19347 }
348
rtenneti4b06ae72014-08-26 03:43:43349 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
[email protected]1e960032013-12-20 19:00:20350 QuicTestPacketMaker maker_;
[email protected]61a527782013-02-21 03:58:00351 scoped_refptr<HttpNetworkSession> session_;
352 MockClientSocketFactory socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05353 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43354 MockHostResolver host_resolver_;
355 MockCertVerifier cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11356 TransportSecurityState transport_security_state_;
[email protected]1c04f9522013-02-21 20:32:43357 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
358 scoped_ptr<ProxyService> proxy_service_;
359 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
[email protected]61a527782013-02-21 03:58:00360 MockRandom random_generator_;
361 HttpServerPropertiesImpl http_server_properties;
362 HttpNetworkSession::Params params_;
[email protected]aa9b14d2013-05-10 23:45:19363 HttpRequestInfo request_;
vishal.b62985ca92015-04-17 08:45:51364 BoundTestNetLog net_log_;
[email protected]dda75ab2013-06-22 22:43:30365 StaticSocketDataProvider hanging_data_;
tbansal7cec3812015-02-05 21:25:12366
367 private:
368 void SendRequestAndExpectQuicResponseMaybeFromProxy(
369 const std::string& expected,
bnc62a44f022015-04-02 15:59:41370 bool used_proxy,
371 uint16 port) {
tbansal7cec3812015-02-05 21:25:12372 scoped_ptr<HttpNetworkTransaction> trans(
373 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
374 ProxyHeadersHandler proxy_headers_handler;
375 trans->SetBeforeProxyHeadersSentCallback(
376 base::Bind(&ProxyHeadersHandler::OnBeforeProxyHeadersSent,
377 base::Unretained(&proxy_headers_handler)));
378 RunTransaction(trans.get());
379 CheckWasQuicResponse(trans);
bnc62a44f022015-04-02 15:59:41380 CheckResponsePort(trans, port);
tbansal7cec3812015-02-05 21:25:12381 CheckResponseData(trans.get(), expected);
382 EXPECT_EQ(used_proxy, proxy_headers_handler.was_called());
383 }
[email protected]61a527782013-02-21 03:58:00384};
385
[email protected]1e960032013-12-20 19:00:20386INSTANTIATE_TEST_CASE_P(Version, QuicNetworkTransactionTest,
387 ::testing::ValuesIn(QuicSupportedVersions()));
388
389TEST_P(QuicNetworkTransactionTest, ForceQuic) {
[email protected]49e85332013-06-04 04:18:03390 params_.origin_to_force_quic_on =
391 HostPortPair::FromString("www.google.com:80");
[email protected]4dca587c2013-03-07 16:54:47392
[email protected]1e960032013-12-20 19:00:20393 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03394 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05395 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03396 GetRequestHeaders("GET", "http", "/")));
397 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05398 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:03399 GetResponseHeaders("200 OK")));
400 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05401 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03402 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
[email protected]1e960032013-12-20 19:00:20403 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
[email protected]4dca587c2013-03-07 16:54:47404
rcha5399e02015-04-21 19:32:04405 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4dca587c2013-03-07 16:54:47406
[email protected]aa9b14d2013-05-10 23:45:19407 // The non-alternate protocol job needs to hang in order to guarantee that
408 // the alternate-protocol job will "win".
409 AddHangingNonAlternateProtocolSocketData();
[email protected]4dca587c2013-03-07 16:54:47410
411 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47412
[email protected]aa9b14d2013-05-10 23:45:19413 SendRequestAndExpectQuicResponse("hello!");
[email protected]4dca587c2013-03-07 16:54:47414
[email protected]98b20ce2013-05-10 05:55:26415 // Check that the NetLog was filled reasonably.
mmenke16a7cbdd2015-04-24 23:00:56416 CapturedNetLogEntry::List entries;
[email protected]aa9b14d2013-05-10 23:45:19417 net_log_.GetEntries(&entries);
[email protected]98b20ce2013-05-10 05:55:26418 EXPECT_LT(0u, entries.size());
419
420 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29421 int pos = ExpectLogContainsSomewhere(
422 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
423 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26424 EXPECT_LT(0, pos);
425
426 // ... and also a TYPE_QUIC_SESSION_PACKET_HEADER_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29427 pos = ExpectLogContainsSomewhere(
428 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_HEADER_RECEIVED,
429 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26430 EXPECT_LT(0, pos);
431
432 std::string packet_sequence_number;
433 ASSERT_TRUE(entries[pos].GetStringValue(
434 "packet_sequence_number", &packet_sequence_number));
435 EXPECT_EQ("1", packet_sequence_number);
436
437 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29438 pos = ExpectLogContainsSomewhere(
439 entries, 0, NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
440 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26441 EXPECT_LT(0, pos);
442
443 int log_stream_id;
444 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
[email protected]1e960032013-12-20 19:00:20445 EXPECT_EQ(3, log_stream_id);
[email protected]4dca587c2013-03-07 16:54:47446}
447
[email protected]cf3e3cd62014-02-05 16:16:16448TEST_P(QuicNetworkTransactionTest, QuicProxy) {
tbansaled0aecc2015-02-20 03:44:18449 params_.enable_quic_for_proxies = true;
[email protected]cf3e3cd62014-02-05 16:16:16450 proxy_service_.reset(
451 ProxyService::CreateFixedFromPacResult("QUIC myproxy:70"));
452
[email protected]cf3e3cd62014-02-05 16:16:16453 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03454 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05455 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03456 GetRequestHeaders("GET", "http", "/")));
457 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05458 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:03459 GetResponseHeaders("200 OK")));
460 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05461 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03462 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
[email protected]cf3e3cd62014-02-05 16:16:16463 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
464
rcha5399e02015-04-21 19:32:04465 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cf3e3cd62014-02-05 16:16:16466
467 // There is no need to set up an alternate protocol job, because
468 // no attempt will be made to speak to the proxy over TCP.
469
470 CreateSession();
471
bnc62a44f022015-04-02 15:59:41472 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
[email protected]cf3e3cd62014-02-05 16:16:16473}
474
[email protected]1e960032013-12-20 19:00:20475TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
[email protected]49e85332013-06-04 04:18:03476 params_.origin_to_force_quic_on =
477 HostPortPair::FromString("www.google.com:80");
[email protected]cebe3282013-05-22 23:49:30478
[email protected]1e960032013-12-20 19:00:20479 MockQuicData mock_quic_data;
480 mock_quic_data.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
481
rcha5399e02015-04-21 19:32:04482 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cebe3282013-05-22 23:49:30483
484 CreateSession();
485
486 scoped_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50487 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
[email protected]cebe3282013-05-22 23:49:30488 TestCompletionCallback callback;
489 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
490 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]0b2294d32013-08-02 00:46:36491 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
[email protected]cebe3282013-05-22 23:49:30492}
493
[email protected]1e960032013-12-20 19:00:20494TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
[email protected]4dca587c2013-03-07 16:54:47495 // Attempt to "force" quic on 443, which will not be honored.
[email protected]49e85332013-06-04 04:18:03496 params_.origin_to_force_quic_on =
497 HostPortPair::FromString("www.google.com:443");
[email protected]4dca587c2013-03-07 16:54:47498
[email protected]aa9b14d2013-05-10 23:45:19499 MockRead http_reads[] = {
[email protected]4dca587c2013-03-07 16:54:47500 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
501 MockRead("hello world"),
502 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
503 MockRead(ASYNC, OK)
504 };
505
rtennetibe635732014-10-02 22:51:42506 StaticSocketDataProvider data(http_reads, arraysize(http_reads), nullptr, 0);
[email protected]4dca587c2013-03-07 16:54:47507 socket_factory_.AddSocketDataProvider(&data);
508 SSLSocketDataProvider ssl(ASYNC, OK);
509 socket_factory_.AddSSLSocketDataProvider(&ssl);
510
[email protected]4dca587c2013-03-07 16:54:47511 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47512
[email protected]aa9b14d2013-05-10 23:45:19513 SendRequestAndExpectHttpResponse("hello world");
[email protected]4dca587c2013-03-07 16:54:47514}
515
[email protected]1e960032013-12-20 19:00:20516TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
[email protected]aa9b14d2013-05-10 23:45:19517 MockRead http_reads[] = {
[email protected]61a527782013-02-21 03:58:00518 MockRead("HTTP/1.1 200 OK\r\n"),
519 MockRead(kQuicAlternateProtocolHttpHeader),
520 MockRead("hello world"),
521 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
522 MockRead(ASYNC, OK)
523 };
524
[email protected]aa9b14d2013-05-10 23:45:19525 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:42526 nullptr, 0);
[email protected]aa9b14d2013-05-10 23:45:19527 socket_factory_.AddSocketDataProvider(&http_data);
[email protected]61a527782013-02-21 03:58:00528
[email protected]1e960032013-12-20 19:00:20529 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03530 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05531 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03532 GetRequestHeaders("GET", "http", "/")));
533 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05534 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:03535 GetResponseHeaders("200 OK")));
536 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05537 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03538 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
[email protected]1e960032013-12-20 19:00:20539 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
[email protected]61a527782013-02-21 03:58:00540
rcha5399e02015-04-21 19:32:04541 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]61a527782013-02-21 03:58:00542
[email protected]aa9b14d2013-05-10 23:45:19543 // The non-alternate protocol job needs to hang in order to guarantee that
544 // the alternate-protocol job will "win".
545 AddHangingNonAlternateProtocolSocketData();
[email protected]61a527782013-02-21 03:58:00546
[email protected]d7599122014-05-24 03:37:23547 CreateSessionWithNextProtos();
[email protected]61a527782013-02-21 03:58:00548
[email protected]aa9b14d2013-05-10 23:45:19549 SendRequestAndExpectHttpResponse("hello world");
550 SendRequestAndExpectQuicResponse("hello!");
[email protected]61a527782013-02-21 03:58:00551}
552
bnc62a44f022015-04-02 15:59:41553TEST_P(QuicNetworkTransactionTest, AlternateProtocolDifferentPort) {
554 MockRead http_reads[] = {
555 MockRead("HTTP/1.1 200 OK\r\n"),
556 MockRead(kQuicAlternateProtocolDifferentPortHttpHeader),
557 MockRead("hello world"),
558 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
559 MockRead(ASYNC, OK)};
560
561 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
562 0);
563 socket_factory_.AddSocketDataProvider(&http_data);
564
565 MockQuicData mock_quic_data;
566 mock_quic_data.AddWrite(
567 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
568 GetRequestHeaders("GET", "http", "/")));
569 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
570 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
571 mock_quic_data.AddRead(
572 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
573 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
574 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
575
rcha5399e02015-04-21 19:32:04576 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bnc62a44f022015-04-02 15:59:41577
578 // The non-alternate protocol job needs to hang in order to guarantee that
579 // the alternate-protocol job will "win".
580 AddHangingNonAlternateProtocolSocketData();
581
582 CreateSessionWithNextProtos();
583
584 SendRequestAndExpectHttpResponse("hello world");
585 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
586}
587
bncae8db8402015-03-26 20:13:50588TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) {
589 MockRead http_reads[] = {
590 MockRead("HTTP/1.1 200 OK\r\n"),
591 MockRead(kQuicAlternateProtocolHttpHeader),
592 MockRead("hello world"),
593 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
594 MockRead(ASYNC, OK)};
595
596 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
597 0);
598 socket_factory_.AddSocketDataProvider(&http_data);
599
600 MockQuicData mock_quic_data;
601 mock_quic_data.AddWrite(
602 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
603 GetRequestHeaders("GET", "http", "/")));
604 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
605 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
606 mock_quic_data.AddRead(
607 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
608 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
609 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
610
rcha5399e02015-04-21 19:32:04611 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bncae8db8402015-03-26 20:13:50612
613 // The non-alternate protocol job needs to hang in order to guarantee that
614 // the alternate-protocol job will "win".
615 AddHangingNonAlternateProtocolSocketData();
616
617 CreateSessionWithNextProtos();
618
619 AlternativeService alternative_service(QUIC,
620 HostPortPair::FromURL(request_.url));
621 session_->http_server_properties()->MarkAlternativeServiceRecentlyBroken(
622 alternative_service);
623 EXPECT_TRUE(
624 session_->http_server_properties()->WasAlternativeServiceRecentlyBroken(
625 alternative_service));
626
627 SendRequestAndExpectHttpResponse("hello world");
628 SendRequestAndExpectQuicResponse("hello!");
629
630 EXPECT_FALSE(
631 session_->http_server_properties()->WasAlternativeServiceRecentlyBroken(
632 alternative_service));
633}
634
[email protected]287d9412014-07-08 23:01:00635TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolProbabilityForQuic) {
636 MockRead http_reads[] = {
637 MockRead("HTTP/1.1 200 OK\r\n"),
638 MockRead(kQuicAlternateProtocol50pctHttpHeader),
639 MockRead("hello world"),
640 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
641 MockRead(ASYNC, OK)
642 };
643
644 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:42645 nullptr, 0);
[email protected]287d9412014-07-08 23:01:00646 socket_factory_.AddSocketDataProvider(&http_data);
647
648 MockQuicData mock_quic_data;
649 mock_quic_data.AddWrite(
650 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
651 GetRequestHeaders("GET", "http", "/")));
652 mock_quic_data.AddRead(
653 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
654 GetResponseHeaders("200 OK")));
655 mock_quic_data.AddRead(
656 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
657 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
658 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
659
rcha5399e02015-04-21 19:32:04660 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]287d9412014-07-08 23:01:00661
662 // The non-alternate protocol job needs to hang in order to guarantee that
663 // the alternate-protocol job will "win".
664 AddHangingNonAlternateProtocolSocketData();
665
bnc62891a52015-04-27 14:14:12666 params_.alternative_service_probability_threshold = .25;
[email protected]287d9412014-07-08 23:01:00667 CreateSessionWithNextProtos();
668
669 SendRequestAndExpectHttpResponse("hello world");
670 SendRequestAndExpectQuicResponse("hello!");
671}
672
673TEST_P(QuicNetworkTransactionTest, DontUseAlternateProtocolProbabilityForQuic) {
674 MockRead http_reads[] = {
675 MockRead("HTTP/1.1 200 OK\r\n"),
676 MockRead(kQuicAlternateProtocol50pctHttpHeader),
677 MockRead("hello world"),
678 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
679 MockRead(ASYNC, OK)
680 };
681
682 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:42683 nullptr, 0);
[email protected]287d9412014-07-08 23:01:00684 socket_factory_.AddSocketDataProvider(&http_data);
685 socket_factory_.AddSocketDataProvider(&http_data);
686
bnc62891a52015-04-27 14:14:12687 params_.alternative_service_probability_threshold = .75;
[email protected]287d9412014-07-08 23:01:00688 CreateSessionWithNextProtos();
689
690 SendRequestAndExpectHttpResponse("hello world");
691 SendRequestAndExpectHttpResponse("hello world");
692}
693
694TEST_P(QuicNetworkTransactionTest,
695 DontUseAlternateProtocolWithBadProbabilityForQuic) {
696 MockRead http_reads[] = {
697 MockRead("HTTP/1.1 200 OK\r\n"),
698 MockRead("Alternate-Protocol: 443:quic,p=2\r\n\r\n"),
699 MockRead("hello world"),
700 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
701 MockRead(ASYNC, OK)
702 };
703
704 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:42705 nullptr, 0);
[email protected]287d9412014-07-08 23:01:00706 socket_factory_.AddSocketDataProvider(&http_data);
707 socket_factory_.AddSocketDataProvider(&http_data);
708
bnc62891a52015-04-27 14:14:12709 params_.alternative_service_probability_threshold = .75;
[email protected]287d9412014-07-08 23:01:00710 CreateSessionWithNextProtos();
711
712 SendRequestAndExpectHttpResponse("hello world");
713 SendRequestAndExpectHttpResponse("hello world");
714}
715
[email protected]1e960032013-12-20 19:00:20716TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) {
[email protected]6d1b4ed2013-07-10 03:57:54717 params_.origin_to_force_quic_on =
718 HostPortPair::FromString("www.google.com:443");
[email protected]6d1b4ed2013-07-10 03:57:54719
720 MockRead http_reads[] = {
721 MockRead("HTTP/1.1 200 OK\r\n"),
722 MockRead(kQuicAlternateProtocolHttpsHeader),
723 MockRead("hello world"),
724 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
725 MockRead(ASYNC, OK)
726 };
727
728 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:42729 nullptr, 0);
[email protected]6d1b4ed2013-07-10 03:57:54730 socket_factory_.AddSocketDataProvider(&http_data);
731
[email protected]1e960032013-12-20 19:00:20732 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03733 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05734 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03735 GetRequestHeaders("GET", "http", "/")));
736 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05737 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:03738 GetResponseHeaders("200 OK")));
739 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05740 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03741 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
[email protected]1e960032013-12-20 19:00:20742 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
[email protected]6d1b4ed2013-07-10 03:57:54743
rcha5399e02015-04-21 19:32:04744 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]6d1b4ed2013-07-10 03:57:54745
746 // The non-alternate protocol job needs to hang in order to guarantee that
747 // the alternate-protocol job will "win".
748 AddHangingNonAlternateProtocolSocketData();
749
[email protected]d7599122014-05-24 03:37:23750 CreateSessionWithNextProtos();
[email protected]6d1b4ed2013-07-10 03:57:54751
752 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
753 SendRequestAndExpectHttpResponse("hello world");
754}
755
[email protected]1e960032013-12-20 19:00:20756TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) {
[email protected]dda75ab2013-06-22 22:43:30757 crypto_client_stream_factory_.set_handshake_mode(
758 MockCryptoClientStream::COLD_START);
759
760 MockWrite http_writes[] = {
761 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
762 MockWrite(SYNCHRONOUS, 1, "Host: www.google.com\r\n"),
763 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")
764 };
765
766 MockRead http_reads[] = {
767 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
768 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHttpHeader),
769 MockRead(SYNCHRONOUS, 5, "hello world"),
770 MockRead(SYNCHRONOUS, OK, 6)
771 };
772
773 DeterministicMockClientSocketFactory socket_factory;
774
775 DeterministicSocketData http_data(http_reads, arraysize(http_reads),
776 http_writes, arraysize(http_writes));
777 socket_factory.AddSocketDataProvider(&http_data);
778
779 // The QUIC transaction will not be allowed to complete.
780 MockWrite quic_writes[] = {
781 MockWrite(ASYNC, ERR_IO_PENDING, 0)
782 };
783 MockRead quic_reads[] = {
784 MockRead(ASYNC, ERR_IO_PENDING, 1),
785 };
786 DeterministicSocketData quic_data(quic_reads, arraysize(quic_reads),
787 quic_writes, arraysize(quic_writes));
788 socket_factory.AddSocketDataProvider(&quic_data);
789
790 // The HTTP transaction will complete.
791 DeterministicSocketData http_data2(http_reads, arraysize(http_reads),
792 http_writes, arraysize(http_writes));
793 socket_factory.AddSocketDataProvider(&http_data2);
794
[email protected]d7599122014-05-24 03:37:23795 CreateSessionWithFactory(&socket_factory, true);
[email protected]dda75ab2013-06-22 22:43:30796
797 // Run the first request.
798 http_data.StopAfter(arraysize(http_reads) + arraysize(http_writes));
799 SendRequestAndExpectHttpResponse("hello world");
800 ASSERT_TRUE(http_data.at_read_eof());
801 ASSERT_TRUE(http_data.at_write_eof());
802
803 // Now run the second request in which the QUIC socket hangs,
804 // and verify the the transaction continues over HTTP.
805 http_data2.StopAfter(arraysize(http_reads) + arraysize(http_writes));
806 SendRequestAndExpectHttpResponse("hello world");
807
808 ASSERT_TRUE(http_data2.at_read_eof());
809 ASSERT_TRUE(http_data2.at_write_eof());
810 ASSERT_TRUE(!quic_data.at_read_eof());
811 ASSERT_TRUE(!quic_data.at_write_eof());
812}
813
[email protected]1e960032013-12-20 19:00:20814TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
[email protected]1e960032013-12-20 19:00:20815 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03816 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05817 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03818 GetRequestHeaders("GET", "http", "/")));
819 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05820 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:03821 GetResponseHeaders("200 OK")));
822 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05823 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03824 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
[email protected]1e960032013-12-20 19:00:20825 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
[email protected]8ba81212013-05-03 13:11:48826
rcha5399e02015-04-21 19:32:04827 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]8ba81212013-05-03 13:11:48828
[email protected]3a120a6b2013-06-25 01:08:27829 // The non-alternate protocol job needs to hang in order to guarantee that
830 // the alternate-protocol job will "win".
[email protected]dda75ab2013-06-22 22:43:30831 AddHangingNonAlternateProtocolSocketData();
832
[email protected]d7599122014-05-24 03:37:23833 CreateSessionWithNextProtos();
[email protected]aa9b14d2013-05-10 23:45:19834 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
835 SendRequestAndExpectQuicResponse("hello!");
[email protected]8ba81212013-05-03 13:11:48836}
837
[email protected]1e960032013-12-20 19:00:20838TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
[email protected]1e960032013-12-20 19:00:20839 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03840 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05841 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03842 GetRequestHeaders("GET", "http", "/")));
843 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05844 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:03845 GetResponseHeaders("200 OK")));
846 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05847 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03848 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
[email protected]1e960032013-12-20 19:00:20849 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
rcha5399e02015-04-21 19:32:04850 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]3a120a6b2013-06-25 01:08:27851
852 // In order for a new QUIC session to be established via alternate-protocol
853 // without racing an HTTP connection, we need the host resolution to happen
854 // synchronously.
855 host_resolver_.set_synchronous_mode(true);
856 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", "");
[email protected]5109c1952013-08-20 18:44:10857 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80));
[email protected]3a120a6b2013-06-25 01:08:27858 AddressList address;
[email protected]5109c1952013-08-20 18:44:10859 host_resolver_.Resolve(info,
860 DEFAULT_PRIORITY,
861 &address,
862 CompletionCallback(),
rtennetibe635732014-10-02 22:51:42863 nullptr,
[email protected]3a120a6b2013-06-25 01:08:27864 net_log_.bound());
865
[email protected]d7599122014-05-24 03:37:23866 CreateSessionWithNextProtos();
[email protected]3a120a6b2013-06-25 01:08:27867 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
868 SendRequestAndExpectQuicResponse("hello!");
869}
870
[email protected]0fc924b2014-03-31 04:34:15871TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) {
872 proxy_service_.reset(
873 ProxyService::CreateFixedFromPacResult("PROXY myproxy:70"));
[email protected]0fc924b2014-03-31 04:34:15874
875 // Since we are using a proxy, the QUIC job will not succeed.
876 MockWrite http_writes[] = {
877 MockWrite(SYNCHRONOUS, 0, "GET http://www.google.com/ HTTP/1.1\r\n"),
878 MockWrite(SYNCHRONOUS, 1, "Host: www.google.com\r\n"),
879 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")
880 };
881
882 MockRead http_reads[] = {
883 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
884 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHttpHeader),
885 MockRead(SYNCHRONOUS, 5, "hello world"),
886 MockRead(SYNCHRONOUS, OK, 6)
887 };
888
889 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
890 http_writes, arraysize(http_writes));
891 socket_factory_.AddSocketDataProvider(&http_data);
892
893 // In order for a new QUIC session to be established via alternate-protocol
894 // without racing an HTTP connection, we need the host resolution to happen
895 // synchronously.
896 host_resolver_.set_synchronous_mode(true);
897 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", "");
898 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80));
899 AddressList address;
900 host_resolver_.Resolve(info,
901 DEFAULT_PRIORITY,
902 &address,
903 CompletionCallback(),
rtennetibe635732014-10-02 22:51:42904 nullptr,
[email protected]0fc924b2014-03-31 04:34:15905 net_log_.bound());
906
[email protected]d7599122014-05-24 03:37:23907 CreateSessionWithNextProtos();
[email protected]0fc924b2014-03-31 04:34:15908 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
909 SendRequestAndExpectHttpResponse("hello world");
910}
911
[email protected]1e960032013-12-20 19:00:20912TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
[email protected]1e960032013-12-20 19:00:20913 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03914 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05915 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03916 GetRequestHeaders("GET", "http", "/")));
917 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05918 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:03919 GetResponseHeaders("200 OK")));
920 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05921 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03922 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
[email protected]1e960032013-12-20 19:00:20923 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
rcha5399e02015-04-21 19:32:04924 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]11c05872013-08-20 02:04:12925
926 // The non-alternate protocol job needs to hang in order to guarantee that
927 // the alternate-protocol job will "win".
928 AddHangingNonAlternateProtocolSocketData();
929
930 // In order for a new QUIC session to be established via alternate-protocol
931 // without racing an HTTP connection, we need the host resolution to happen
932 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
933 // connection to the the server, in this test we require confirmation
934 // before encrypting so the HTTP job will still start.
935 host_resolver_.set_synchronous_mode(true);
936 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", "");
[email protected]5109c1952013-08-20 18:44:10937 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80));
[email protected]11c05872013-08-20 02:04:12938 AddressList address;
[email protected]5109c1952013-08-20 18:44:10939 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address,
rtennetibe635732014-10-02 22:51:42940 CompletionCallback(), nullptr, net_log_.bound());
[email protected]11c05872013-08-20 02:04:12941
[email protected]d7599122014-05-24 03:37:23942 CreateSessionWithNextProtos();
[email protected]11c05872013-08-20 02:04:12943 session_->quic_stream_factory()->set_require_confirmation(true);
944 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
945
946 scoped_ptr<HttpNetworkTransaction> trans(
947 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
948 TestCompletionCallback callback;
949 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
950 EXPECT_EQ(ERR_IO_PENDING, rv);
951
952 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
953 QuicSession::HANDSHAKE_CONFIRMED);
954 EXPECT_EQ(OK, callback.WaitForResult());
955}
956
[email protected]1e960032013-12-20 19:00:20957TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
[email protected]3316d422013-05-03 21:45:30958 // Alternate-protocol job
959 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1));
960 MockRead quic_reads[] = {
961 MockRead(ASYNC, close->data(), close->length()),
962 MockRead(ASYNC, OK), // EOF
963 };
964 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:42965 nullptr, 0);
[email protected]3316d422013-05-03 21:45:30966 socket_factory_.AddSocketDataProvider(&quic_data);
967
968 // Main job which will succeed even though the alternate job fails.
969 MockRead http_reads[] = {
970 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
971 MockRead("hello from http"),
972 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
973 MockRead(ASYNC, OK)
974 };
975
976 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:42977 nullptr, 0);
[email protected]3316d422013-05-03 21:45:30978 socket_factory_.AddSocketDataProvider(&http_data);
979
[email protected]d7599122014-05-24 03:37:23980 CreateSessionWithNextProtos();
[email protected]aa9b14d2013-05-10 23:45:19981 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
982 SendRequestAndExpectHttpResponse("hello from http");
983 ExpectBrokenAlternateProtocolMapping();
[email protected]3316d422013-05-03 21:45:30984}
985
[email protected]1e960032013-12-20 19:00:20986TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
[email protected]d03a66d2013-05-06 12:55:59987 // Alternate-protocol job
988 MockRead quic_reads[] = {
989 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
990 };
991 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:42992 nullptr, 0);
[email protected]d03a66d2013-05-06 12:55:59993 socket_factory_.AddSocketDataProvider(&quic_data);
994
995 // Main job which will succeed even though the alternate job fails.
996 MockRead http_reads[] = {
997 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
998 MockRead("hello from http"),
999 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1000 MockRead(ASYNC, OK)
1001 };
1002
1003 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421004 nullptr, 0);
[email protected]d03a66d2013-05-06 12:55:591005 socket_factory_.AddSocketDataProvider(&http_data);
1006
[email protected]d7599122014-05-24 03:37:231007 CreateSessionWithNextProtos();
[email protected]d03a66d2013-05-06 12:55:591008
[email protected]aa9b14d2013-05-10 23:45:191009 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1010 SendRequestAndExpectHttpResponse("hello from http");
1011 ExpectBrokenAlternateProtocolMapping();
[email protected]d03a66d2013-05-06 12:55:591012}
1013
[email protected]00c159f2014-05-21 22:38:161014TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) {
[email protected]eb71ab62014-05-23 07:57:531015 // Alternate-protocol job will fail when the session attempts to read.
[email protected]00c159f2014-05-21 22:38:161016 MockRead quic_reads[] = {
1017 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
1018 };
1019 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421020 nullptr, 0);
[email protected]00c159f2014-05-21 22:38:161021 socket_factory_.AddSocketDataProvider(&quic_data);
1022
[email protected]eb71ab62014-05-23 07:57:531023 // Main job will also fail.
[email protected]00c159f2014-05-21 22:38:161024 MockRead http_reads[] = {
1025 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
1026 };
1027
1028 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421029 nullptr, 0);
[email protected]00c159f2014-05-21 22:38:161030 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED));
1031 socket_factory_.AddSocketDataProvider(&http_data);
1032
[email protected]d7599122014-05-24 03:37:231033 CreateSessionWithNextProtos();
[email protected]00c159f2014-05-21 22:38:161034
1035 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1036 scoped_ptr<HttpNetworkTransaction> trans(
1037 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1038 TestCompletionCallback callback;
1039 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1040 EXPECT_EQ(ERR_IO_PENDING, rv);
1041 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult());
1042 ExpectQuicAlternateProtocolMapping();
1043}
1044
[email protected]1e960032013-12-20 19:00:201045TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
[email protected]77c6c162013-08-17 02:57:451046 // Alternate-protocol job
1047 MockRead quic_reads[] = {
1048 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
1049 };
1050 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421051 nullptr, 0);
[email protected]77c6c162013-08-17 02:57:451052 socket_factory_.AddSocketDataProvider(&quic_data);
1053
1054 AddHangingNonAlternateProtocolSocketData();
1055
[email protected]c92c1b52014-05-31 04:16:061056 // Second Alternate-protocol job which will race with the TCP job.
1057 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421058 nullptr, 0);
[email protected]c92c1b52014-05-31 04:16:061059 socket_factory_.AddSocketDataProvider(&quic_data2);
1060
[email protected]4d283b32013-10-17 12:57:271061 // Final job that will proceed when the QUIC job fails.
1062 MockRead http_reads[] = {
1063 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
1064 MockRead("hello from http"),
1065 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1066 MockRead(ASYNC, OK)
1067 };
1068
1069 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421070 nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271071 socket_factory_.AddSocketDataProvider(&http_data);
1072
[email protected]d7599122014-05-24 03:37:231073 CreateSessionWithNextProtos();
[email protected]77c6c162013-08-17 02:57:451074
1075 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1076
[email protected]4d283b32013-10-17 12:57:271077 SendRequestAndExpectHttpResponse("hello from http");
[email protected]77c6c162013-08-17 02:57:451078
1079 ExpectBrokenAlternateProtocolMapping();
[email protected]4d283b32013-10-17 12:57:271080
1081 EXPECT_TRUE(quic_data.at_read_eof());
1082 EXPECT_TRUE(quic_data.at_write_eof());
[email protected]77c6c162013-08-17 02:57:451083}
1084
[email protected]93b31772014-06-19 08:03:351085TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) {
[email protected]65768442014-06-06 23:37:031086 // Alternate-protocol job
1087 MockRead quic_reads[] = {
1088 MockRead(ASYNC, ERR_IO_PENDING),
1089 };
1090 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421091 nullptr, 0);
[email protected]65768442014-06-06 23:37:031092 socket_factory_.AddSocketDataProvider(&quic_data);
1093
1094 // Main job that will proceed when the QUIC job fails.
1095 MockRead http_reads[] = {
1096 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
1097 MockRead("hello from http"),
1098 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1099 MockRead(ASYNC, OK)
1100 };
1101
1102 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421103 nullptr, 0);
[email protected]65768442014-06-06 23:37:031104 socket_factory_.AddSocketDataProvider(&http_data);
1105
1106 CreateSessionWithNextProtos();
1107
1108 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1109
1110 SendRequestAndExpectHttpResponse("hello from http");
1111}
1112
[email protected]eb71ab62014-05-23 07:57:531113TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
[email protected]4d590c9c2014-05-02 05:14:331114 // Alternate-protocol job will fail before creating a QUIC session.
rtennetibe635732014-10-02 22:51:421115 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0);
[email protected]4d590c9c2014-05-02 05:14:331116 quic_data.set_connect_data(MockConnect(SYNCHRONOUS,
1117 ERR_INTERNET_DISCONNECTED));
1118 socket_factory_.AddSocketDataProvider(&quic_data);
1119
1120 // Main job which will succeed even though the alternate job fails.
1121 MockRead http_reads[] = {
1122 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
1123 MockRead("hello from http"),
1124 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1125 MockRead(ASYNC, OK)
1126 };
1127
1128 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421129 nullptr, 0);
[email protected]4d590c9c2014-05-02 05:14:331130 socket_factory_.AddSocketDataProvider(&http_data);
1131
[email protected]d7599122014-05-24 03:37:231132 CreateSessionWithNextProtos();
[email protected]4d590c9c2014-05-02 05:14:331133 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1134 SendRequestAndExpectHttpResponse("hello from http");
[email protected]eb71ab62014-05-23 07:57:531135
1136 ExpectBrokenAlternateProtocolMapping();
[email protected]4d590c9c2014-05-02 05:14:331137}
1138
[email protected]4fee9672014-01-08 14:47:151139TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
[email protected]4fee9672014-01-08 14:47:151140 MockQuicData mock_quic_data;
rcha5399e02015-04-21 19:32:041141 mock_quic_data.AddSynchronousRead(ConstructConnectionClosePacket(1));
[email protected]92bf17c2014-03-03 21:14:031142 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051143 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:031144 GetRequestHeaders("GET", "http", "/")));
1145 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rcha5399e02015-04-21 19:32:041146 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4fee9672014-01-08 14:47:151147
1148 // When the QUIC connection fails, we will try the request again over HTTP.
1149 MockRead http_reads[] = {
1150 MockRead("HTTP/1.1 200 OK\r\n"),
1151 MockRead(kQuicAlternateProtocolHttpHeader),
1152 MockRead("hello world"),
1153 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1154 MockRead(ASYNC, OK)
1155 };
1156
1157 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421158 nullptr, 0);
[email protected]4fee9672014-01-08 14:47:151159 socket_factory_.AddSocketDataProvider(&http_data);
1160
1161 // In order for a new QUIC session to be established via alternate-protocol
1162 // without racing an HTTP connection, we need the host resolution to happen
1163 // synchronously.
1164 host_resolver_.set_synchronous_mode(true);
1165 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", "");
1166 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80));
1167 AddressList address;
1168 host_resolver_.Resolve(info,
1169 DEFAULT_PRIORITY,
1170 &address,
1171 CompletionCallback(),
rtennetibe635732014-10-02 22:51:421172 nullptr,
[email protected]4fee9672014-01-08 14:47:151173 net_log_.bound());
1174
[email protected]d7599122014-05-24 03:37:231175 CreateSessionWithNextProtos();
[email protected]4fee9672014-01-08 14:47:151176 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1177 SendRequestAndExpectHttpResponse("hello world");
1178}
1179
[email protected]61a527782013-02-21 03:58:001180} // namespace test
1181} // namespace net