blob: 67428f72d72b07a8d75ffdaa13706a5ce0ef37b1 [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"
eroman87c53d62015-04-02 06:51:0722#include "net/log/net_log_unittest.h"
vishal.b62985ca92015-04-17 08:45:5123#include "net/log/test_net_log.h"
[email protected]61a527782013-02-21 03:58:0024#include "net/proxy/proxy_config_service_fixed.h"
25#include "net/proxy/proxy_resolver.h"
26#include "net/proxy/proxy_service.h"
27#include "net/quic/crypto/quic_decrypter.h"
28#include "net/quic/crypto/quic_encrypter.h"
29#include "net/quic/quic_framer.h"
[email protected]24e5bc52013-09-18 15:36:5830#include "net/quic/quic_http_utils.h"
[email protected]ed3fc15d2013-03-08 18:37:4431#include "net/quic/test_tools/crypto_test_utils.h"
[email protected]61a527782013-02-21 03:58:0032#include "net/quic/test_tools/mock_clock.h"
[email protected]e8ff26842013-03-22 21:02:0533#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
[email protected]61a527782013-02-21 03:58:0034#include "net/quic/test_tools/mock_random.h"
[email protected]1e960032013-12-20 19:00:2035#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]61a527782013-02-21 03:58:0036#include "net/quic/test_tools/quic_test_utils.h"
37#include "net/socket/client_socket_factory.h"
38#include "net/socket/mock_client_socket_pool_manager.h"
39#include "net/socket/socket_test_util.h"
40#include "net/socket/ssl_client_socket.h"
41#include "net/spdy/spdy_frame_builder.h"
42#include "net/spdy/spdy_framer.h"
[email protected]536fd0b2013-03-14 17:41:5743#include "net/ssl/ssl_config_service_defaults.h"
[email protected]61a527782013-02-21 03:58:0044#include "testing/gtest/include/gtest/gtest.h"
45#include "testing/platform_test.h"
46
47//-----------------------------------------------------------------------------
48
49namespace {
50
51// This is the expected return from a current server advertising QUIC.
52static const char kQuicAlternateProtocolHttpHeader[] =
[email protected]4ff65372013-06-21 05:45:4653 "Alternate-Protocol: 80:quic\r\n\r\n";
[email protected]287d9412014-07-08 23:01:0054static const char kQuicAlternateProtocol50pctHttpHeader[] =
55 "Alternate-Protocol: 80:quic,p=.5\r\n\r\n";
bnc62a44f022015-04-02 15:59:4156static const char kQuicAlternateProtocolDifferentPortHttpHeader[] =
57 "Alternate-Protocol: 137:quic\r\n\r\n";
[email protected]6d1b4ed2013-07-10 03:57:5458static const char kQuicAlternateProtocolHttpsHeader[] =
59 "Alternate-Protocol: 443:quic\r\n\r\n";
[email protected]1e960032013-12-20 19:00:2060
[email protected]61a527782013-02-21 03:58:0061} // namespace
62
63namespace net {
64namespace test {
65
[email protected]1e960032013-12-20 19:00:2066// Helper class to encapsulate MockReads and MockWrites for QUIC.
67// Simplify ownership issues and the interaction with the MockSocketFactory.
68class MockQuicData {
69 public:
rcha5399e02015-04-21 19:32:0470 MockQuicData() : sequence_number_(0) {}
71
[email protected]1e960032013-12-20 19:00:2072 ~MockQuicData() {
73 STLDeleteElements(&packets_);
74 }
75
rcha5399e02015-04-21 19:32:0476 void AddSynchronousRead(scoped_ptr<QuicEncryptedPacket> packet) {
[email protected]1e960032013-12-20 19:00:2077 reads_.push_back(MockRead(SYNCHRONOUS, packet->data(), packet->length(),
78 sequence_number_++));
79 packets_.push_back(packet.release());
80 }
81
rcha5399e02015-04-21 19:32:0482 void AddRead(scoped_ptr<QuicEncryptedPacket> packet) {
83 reads_.push_back(
84 MockRead(ASYNC, packet->data(), packet->length(), sequence_number_++));
85 packets_.push_back(packet.release());
86 }
87
[email protected]1e960032013-12-20 19:00:2088 void AddRead(IoMode mode, int rv) {
rcha5399e02015-04-21 19:32:0489 reads_.push_back(MockRead(mode, rv, sequence_number_++));
[email protected]1e960032013-12-20 19:00:2090 }
91
92 void AddWrite(scoped_ptr<QuicEncryptedPacket> packet) {
93 writes_.push_back(MockWrite(SYNCHRONOUS, packet->data(), packet->length(),
94 sequence_number_++));
95 packets_.push_back(packet.release());
96 }
97
rcha5399e02015-04-21 19:32:0498 void AddSocketDataToFactory(MockClientSocketFactory* factory) {
rtennetibe635732014-10-02 22:51:4299 MockRead* reads = reads_.empty() ? nullptr : &reads_[0];
100 MockWrite* writes = writes_.empty() ? nullptr : &writes_[0];
rcha5399e02015-04-21 19:32:04101 socket_data_.reset(
102 new SequencedSocketData(reads, reads_.size(), writes, writes_.size()));
[email protected]1e960032013-12-20 19:00:20103 factory->AddSocketDataProvider(socket_data_.get());
104 }
105
106 private:
107 std::vector<QuicEncryptedPacket*> packets_;
108 std::vector<MockWrite> writes_;
109 std::vector<MockRead> reads_;
110 size_t sequence_number_;
111 scoped_ptr<SocketDataProvider> socket_data_;
112};
113
tbansal7cec3812015-02-05 21:25:12114class ProxyHeadersHandler {
115 public:
116 ProxyHeadersHandler() : was_called_(false) {}
117
118 bool was_called() { return was_called_; }
119
120 void OnBeforeProxyHeadersSent(const ProxyInfo& proxy_info,
121 HttpRequestHeaders* request_headers) {
122 was_called_ = true;
123 }
124
125 private:
126 bool was_called_;
127};
128
[email protected]1e960032013-12-20 19:00:20129class QuicNetworkTransactionTest
130 : public PlatformTest,
[email protected]5d03bbd2014-03-07 16:19:16131 public ::testing::WithParamInterface<QuicVersion> {
[email protected]61a527782013-02-21 03:58:00132 protected:
[email protected]1c04f9522013-02-21 20:32:43133 QuicNetworkTransactionTest()
rtenneti4b06ae72014-08-26 03:43:43134 : clock_(new MockClock),
135 maker_(GetParam(), 0, clock_),
[email protected]1c04f9522013-02-21 20:32:43136 ssl_config_service_(new SSLConfigServiceDefaults),
137 proxy_service_(ProxyService::CreateDirect()),
138 auth_handler_factory_(
[email protected]dda75ab2013-06-22 22:43:30139 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
[email protected]457d6952013-12-13 09:24:58140 random_generator_(0),
rtennetibe635732014-10-02 22:51:42141 hanging_data_(nullptr, 0, nullptr, 0) {
[email protected]aa9b14d2013-05-10 23:45:19142 request_.method = "GET";
143 request_.url = GURL("http://www.google.com/");
144 request_.load_flags = 0;
[email protected]98a9d1252014-04-04 00:43:59145 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
[email protected]1c04f9522013-02-21 20:32:43146 }
[email protected]61a527782013-02-21 03:58:00147
dcheng67be2b1f2014-10-27 21:47:29148 void SetUp() override {
[email protected]61a527782013-02-21 03:58:00149 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34150 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00151 }
152
dcheng67be2b1f2014-10-27 21:47:29153 void TearDown() override {
[email protected]61a527782013-02-21 03:58:00154 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
155 // Empty the current queue.
[email protected]2da659e2013-05-23 20:51:34156 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00157 PlatformTest::TearDown();
158 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34159 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00160 }
161
[email protected]3316d422013-05-03 21:45:30162 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
163 QuicPacketSequenceNumber num) {
[email protected]1e960032013-12-20 19:00:20164 return maker_.MakeConnectionClosePacket(num);
[email protected]3316d422013-05-03 21:45:30165 }
166
[email protected]61a527782013-02-21 03:58:00167 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket(
168 QuicPacketSequenceNumber largest_received,
169 QuicPacketSequenceNumber least_unacked) {
[email protected]1e960032013-12-20 19:00:20170 return maker_.MakeAckPacket(2, largest_received, least_unacked, true);
171 }
[email protected]61a527782013-02-21 03:58:00172
[email protected]1e960032013-12-20 19:00:20173 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
174 const std::string& scheme,
175 const std::string& path) {
176 return maker_.GetRequestHeaders(method, scheme, path);
[email protected]61a527782013-02-21 03:58:00177 }
178
[email protected]1e960032013-12-20 19:00:20179 SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
180 return maker_.GetResponseHeaders(status);
[email protected]61a527782013-02-21 03:58:00181 }
182
[email protected]1e960032013-12-20 19:00:20183 scoped_ptr<QuicEncryptedPacket> ConstructDataPacket(
[email protected]61a527782013-02-21 03:58:00184 QuicPacketSequenceNumber sequence_number,
[email protected]98b20ce2013-05-10 05:55:26185 QuicStreamId stream_id,
[email protected]e8ff26842013-03-22 21:02:05186 bool should_include_version,
[email protected]61a527782013-02-21 03:58:00187 bool fin,
188 QuicStreamOffset offset,
189 base::StringPiece data) {
[email protected]1e960032013-12-20 19:00:20190 return maker_.MakeDataPacket(
191 sequence_number, stream_id, should_include_version, fin, offset, data);
[email protected]61a527782013-02-21 03:58:00192 }
193
[email protected]1e960032013-12-20 19:00:20194 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
195 QuicPacketSequenceNumber sequence_number,
196 QuicStreamId stream_id,
197 bool should_include_version,
198 bool fin,
199 const SpdyHeaderBlock& headers) {
rtennetif4bdb542015-01-21 14:33:05200 QuicPriority priority =
201 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
202 return maker_.MakeRequestHeadersPacket(sequence_number, stream_id,
203 should_include_version, fin,
204 priority, headers);
[email protected]61a527782013-02-21 03:58:00205 }
206
[email protected]1e960032013-12-20 19:00:20207 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
208 QuicPacketSequenceNumber sequence_number,
209 QuicStreamId stream_id,
210 bool should_include_version,
211 bool fin,
212 const SpdyHeaderBlock& headers) {
213 return maker_.MakeResponseHeadersPacket(
214 sequence_number, stream_id, should_include_version, fin, headers);
[email protected]61a527782013-02-21 03:58:00215 }
216
217 void CreateSession() {
[email protected]d7599122014-05-24 03:37:23218 CreateSessionWithFactory(&socket_factory_, false);
[email protected]dda75ab2013-06-22 22:43:30219 }
220
[email protected]d7599122014-05-24 03:37:23221 void CreateSessionWithNextProtos() {
222 CreateSessionWithFactory(&socket_factory_, true);
223 }
224
225 // If |use_next_protos| is true, enables SPDY and QUIC.
226 void CreateSessionWithFactory(ClientSocketFactory* socket_factory,
227 bool use_next_protos) {
[email protected]4dca587c2013-03-07 16:54:47228 params_.enable_quic = true;
229 params_.quic_clock = clock_;
230 params_.quic_random = &random_generator_;
[email protected]dda75ab2013-06-22 22:43:30231 params_.client_socket_factory = socket_factory;
[email protected]e8ff26842013-03-22 21:02:05232 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43233 params_.host_resolver = &host_resolver_;
234 params_.cert_verifier = &cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11235 params_.transport_security_state = &transport_security_state_;
[email protected]1c04f9522013-02-21 20:32:43236 params_.proxy_service = proxy_service_.get();
237 params_.ssl_config_service = ssl_config_service_.get();
238 params_.http_auth_handler_factory = auth_handler_factory_.get();
[email protected]30d4c022013-07-18 22:58:16239 params_.http_server_properties = http_server_properties.GetWeakPtr();
[email protected]1e960032013-12-20 19:00:20240 params_.quic_supported_versions = SupportedVersions(GetParam());
[email protected]61a527782013-02-21 03:58:00241
[email protected]d7599122014-05-24 03:37:23242 if (use_next_protos) {
243 params_.use_alternate_protocols = true;
bnc3bb2c232014-11-07 20:26:39244 params_.next_protos = NextProtosWithSpdyAndQuic(true, true);
[email protected]d7599122014-05-24 03:37:23245 }
246
[email protected]61a527782013-02-21 03:58:00247 session_ = new HttpNetworkSession(params_);
[email protected]11c05872013-08-20 02:04:12248 session_->quic_stream_factory()->set_require_confirmation(false);
[email protected]61a527782013-02-21 03:58:00249 }
250
[email protected]aa9b14d2013-05-10 23:45:19251 void CheckWasQuicResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
252 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42253 ASSERT_TRUE(response != nullptr);
254 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19255 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
256 EXPECT_TRUE(response->was_fetched_via_spdy);
257 EXPECT_TRUE(response->was_npn_negotiated);
258 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
259 response->connection_info);
260 }
261
bnc62a44f022015-04-02 15:59:41262 void CheckResponsePort(const scoped_ptr<HttpNetworkTransaction>& trans,
263 uint16 port) {
264 const HttpResponseInfo* response = trans->GetResponseInfo();
265 ASSERT_TRUE(response != nullptr);
266 EXPECT_EQ(port, response->socket_address.port());
267 }
268
[email protected]aa9b14d2013-05-10 23:45:19269 void CheckWasHttpResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
270 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42271 ASSERT_TRUE(response != nullptr);
272 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19273 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
274 EXPECT_FALSE(response->was_fetched_via_spdy);
275 EXPECT_FALSE(response->was_npn_negotiated);
276 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1,
277 response->connection_info);
278 }
279
280 void CheckResponseData(HttpNetworkTransaction* trans,
281 const std::string& expected) {
282 std::string response_data;
283 ASSERT_EQ(OK, ReadTransaction(trans, &response_data));
284 EXPECT_EQ(expected, response_data);
285 }
286
287 void RunTransaction(HttpNetworkTransaction* trans) {
288 TestCompletionCallback callback;
289 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
290 EXPECT_EQ(ERR_IO_PENDING, rv);
291 EXPECT_EQ(OK, callback.WaitForResult());
292 }
293
294 void SendRequestAndExpectHttpResponse(const std::string& expected) {
295 scoped_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50296 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
[email protected]aa9b14d2013-05-10 23:45:19297 RunTransaction(trans.get());
298 CheckWasHttpResponse(trans);
299 CheckResponseData(trans.get(), expected);
300 }
301
302 void SendRequestAndExpectQuicResponse(const std::string& expected) {
bnc62a44f022015-04-02 15:59:41303 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, 80);
tbansal7cec3812015-02-05 21:25:12304 }
305
bnc62a44f022015-04-02 15:59:41306 void SendRequestAndExpectQuicResponseOnPort(const std::string& expected,
307 uint16 port) {
308 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, port);
309 }
310
311 void SendRequestAndExpectQuicResponseFromProxyOnPort(
312 const std::string& expected,
313 uint16 port) {
314 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port);
[email protected]aa9b14d2013-05-10 23:45:19315 }
316
317 void AddQuicAlternateProtocolMapping(
318 MockCryptoClientStream::HandshakeMode handshake_mode) {
319 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
bnccacc0992015-03-20 20:22:22320 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url);
321 AlternativeService alternative_service(QUIC, host_port_pair.host(), 80);
322 session_->http_server_properties()->SetAlternativeService(
323 host_port_pair, alternative_service, 1.0);
[email protected]aa9b14d2013-05-10 23:45:19324 }
325
326 void ExpectBrokenAlternateProtocolMapping() {
bnc8445b3002015-03-13 01:57:09327 const HostPortPair origin = HostPortPair::FromURL(request_.url);
bnc181b39a2015-03-17 21:36:47328 const AlternativeService alternative_service =
329 session_->http_server_properties()->GetAlternativeService(origin);
330 EXPECT_NE(UNINITIALIZED_ALTERNATE_PROTOCOL, alternative_service.protocol);
bnc8445b3002015-03-13 01:57:09331 EXPECT_TRUE(session_->http_server_properties()->IsAlternativeServiceBroken(
332 alternative_service));
[email protected]aa9b14d2013-05-10 23:45:19333 }
334
[email protected]4d590c9c2014-05-02 05:14:33335 void ExpectQuicAlternateProtocolMapping() {
bnc181b39a2015-03-17 21:36:47336 const AlternativeService alternative_service =
337 session_->http_server_properties()->GetAlternativeService(
[email protected]4d590c9c2014-05-02 05:14:33338 HostPortPair::FromURL(request_.url));
bnc181b39a2015-03-17 21:36:47339 EXPECT_EQ(QUIC, alternative_service.protocol);
[email protected]4d590c9c2014-05-02 05:14:33340 }
341
[email protected]aa9b14d2013-05-10 23:45:19342 void AddHangingNonAlternateProtocolSocketData() {
[email protected]dda75ab2013-06-22 22:43:30343 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
344 hanging_data_.set_connect_data(hanging_connect);
345 socket_factory_.AddSocketDataProvider(&hanging_data_);
[email protected]aa9b14d2013-05-10 23:45:19346 }
347
rtenneti4b06ae72014-08-26 03:43:43348 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
[email protected]1e960032013-12-20 19:00:20349 QuicTestPacketMaker maker_;
[email protected]61a527782013-02-21 03:58:00350 scoped_refptr<HttpNetworkSession> session_;
351 MockClientSocketFactory socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05352 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43353 MockHostResolver host_resolver_;
354 MockCertVerifier cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11355 TransportSecurityState transport_security_state_;
[email protected]1c04f9522013-02-21 20:32:43356 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
357 scoped_ptr<ProxyService> proxy_service_;
358 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
[email protected]61a527782013-02-21 03:58:00359 MockRandom random_generator_;
360 HttpServerPropertiesImpl http_server_properties;
361 HttpNetworkSession::Params params_;
[email protected]aa9b14d2013-05-10 23:45:19362 HttpRequestInfo request_;
vishal.b62985ca92015-04-17 08:45:51363 BoundTestNetLog net_log_;
[email protected]dda75ab2013-06-22 22:43:30364 StaticSocketDataProvider hanging_data_;
tbansal7cec3812015-02-05 21:25:12365
366 private:
367 void SendRequestAndExpectQuicResponseMaybeFromProxy(
368 const std::string& expected,
bnc62a44f022015-04-02 15:59:41369 bool used_proxy,
370 uint16 port) {
tbansal7cec3812015-02-05 21:25:12371 scoped_ptr<HttpNetworkTransaction> trans(
372 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
373 ProxyHeadersHandler proxy_headers_handler;
374 trans->SetBeforeProxyHeadersSentCallback(
375 base::Bind(&ProxyHeadersHandler::OnBeforeProxyHeadersSent,
376 base::Unretained(&proxy_headers_handler)));
377 RunTransaction(trans.get());
378 CheckWasQuicResponse(trans);
bnc62a44f022015-04-02 15:59:41379 CheckResponsePort(trans, port);
tbansal7cec3812015-02-05 21:25:12380 CheckResponseData(trans.get(), expected);
381 EXPECT_EQ(used_proxy, proxy_headers_handler.was_called());
382 }
[email protected]61a527782013-02-21 03:58:00383};
384
[email protected]1e960032013-12-20 19:00:20385INSTANTIATE_TEST_CASE_P(Version, QuicNetworkTransactionTest,
386 ::testing::ValuesIn(QuicSupportedVersions()));
387
388TEST_P(QuicNetworkTransactionTest, ForceQuic) {
[email protected]49e85332013-06-04 04:18:03389 params_.origin_to_force_quic_on =
390 HostPortPair::FromString("www.google.com:80");
[email protected]4dca587c2013-03-07 16:54:47391
[email protected]1e960032013-12-20 19:00:20392 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03393 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05394 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03395 GetRequestHeaders("GET", "http", "/")));
396 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05397 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:03398 GetResponseHeaders("200 OK")));
399 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05400 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03401 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
[email protected]1e960032013-12-20 19:00:20402 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
[email protected]4dca587c2013-03-07 16:54:47403
rcha5399e02015-04-21 19:32:04404 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4dca587c2013-03-07 16:54:47405
[email protected]aa9b14d2013-05-10 23:45:19406 // The non-alternate protocol job needs to hang in order to guarantee that
407 // the alternate-protocol job will "win".
408 AddHangingNonAlternateProtocolSocketData();
[email protected]4dca587c2013-03-07 16:54:47409
410 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47411
[email protected]aa9b14d2013-05-10 23:45:19412 SendRequestAndExpectQuicResponse("hello!");
[email protected]4dca587c2013-03-07 16:54:47413
[email protected]98b20ce2013-05-10 05:55:26414 // Check that the NetLog was filled reasonably.
vishal.b62985ca92015-04-17 08:45:51415 net::TestNetLog::CapturedEntryList entries;
[email protected]aa9b14d2013-05-10 23:45:19416 net_log_.GetEntries(&entries);
[email protected]98b20ce2013-05-10 05:55:26417 EXPECT_LT(0u, entries.size());
418
419 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
420 int pos = net::ExpectLogContainsSomewhere(
421 entries, 0,
422 net::NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
423 net::NetLog::PHASE_NONE);
424 EXPECT_LT(0, pos);
425
426 // ... and also a TYPE_QUIC_SESSION_PACKET_HEADER_RECEIVED.
427 pos = net::ExpectLogContainsSomewhere(
428 entries, 0,
429 net::NetLog::TYPE_QUIC_SESSION_PACKET_HEADER_RECEIVED,
430 net::NetLog::PHASE_NONE);
431 EXPECT_LT(0, pos);
432
433 std::string packet_sequence_number;
434 ASSERT_TRUE(entries[pos].GetStringValue(
435 "packet_sequence_number", &packet_sequence_number));
436 EXPECT_EQ("1", packet_sequence_number);
437
438 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED.
439 pos = net::ExpectLogContainsSomewhere(
440 entries, 0,
441 net::NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
442 net::NetLog::PHASE_NONE);
443 EXPECT_LT(0, pos);
444
445 int log_stream_id;
446 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
[email protected]1e960032013-12-20 19:00:20447 EXPECT_EQ(3, log_stream_id);
[email protected]4dca587c2013-03-07 16:54:47448}
449
[email protected]cf3e3cd62014-02-05 16:16:16450TEST_P(QuicNetworkTransactionTest, QuicProxy) {
tbansaled0aecc2015-02-20 03:44:18451 params_.enable_quic_for_proxies = true;
[email protected]cf3e3cd62014-02-05 16:16:16452 proxy_service_.reset(
453 ProxyService::CreateFixedFromPacResult("QUIC myproxy:70"));
454
[email protected]cf3e3cd62014-02-05 16:16:16455 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03456 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05457 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03458 GetRequestHeaders("GET", "http", "/")));
459 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05460 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:03461 GetResponseHeaders("200 OK")));
462 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05463 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03464 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
[email protected]cf3e3cd62014-02-05 16:16:16465 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
466
rcha5399e02015-04-21 19:32:04467 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cf3e3cd62014-02-05 16:16:16468
469 // There is no need to set up an alternate protocol job, because
470 // no attempt will be made to speak to the proxy over TCP.
471
472 CreateSession();
473
bnc62a44f022015-04-02 15:59:41474 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
[email protected]cf3e3cd62014-02-05 16:16:16475}
476
[email protected]1e960032013-12-20 19:00:20477TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
[email protected]49e85332013-06-04 04:18:03478 params_.origin_to_force_quic_on =
479 HostPortPair::FromString("www.google.com:80");
[email protected]cebe3282013-05-22 23:49:30480
[email protected]1e960032013-12-20 19:00:20481 MockQuicData mock_quic_data;
482 mock_quic_data.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
483
rcha5399e02015-04-21 19:32:04484 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cebe3282013-05-22 23:49:30485
486 CreateSession();
487
488 scoped_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50489 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
[email protected]cebe3282013-05-22 23:49:30490 TestCompletionCallback callback;
491 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
492 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]0b2294d32013-08-02 00:46:36493 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
[email protected]cebe3282013-05-22 23:49:30494}
495
[email protected]1e960032013-12-20 19:00:20496TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
[email protected]4dca587c2013-03-07 16:54:47497 // Attempt to "force" quic on 443, which will not be honored.
[email protected]49e85332013-06-04 04:18:03498 params_.origin_to_force_quic_on =
499 HostPortPair::FromString("www.google.com:443");
[email protected]4dca587c2013-03-07 16:54:47500
[email protected]aa9b14d2013-05-10 23:45:19501 MockRead http_reads[] = {
[email protected]4dca587c2013-03-07 16:54:47502 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
503 MockRead("hello world"),
504 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
505 MockRead(ASYNC, OK)
506 };
507
rtennetibe635732014-10-02 22:51:42508 StaticSocketDataProvider data(http_reads, arraysize(http_reads), nullptr, 0);
[email protected]4dca587c2013-03-07 16:54:47509 socket_factory_.AddSocketDataProvider(&data);
510 SSLSocketDataProvider ssl(ASYNC, OK);
511 socket_factory_.AddSSLSocketDataProvider(&ssl);
512
[email protected]4dca587c2013-03-07 16:54:47513 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47514
[email protected]aa9b14d2013-05-10 23:45:19515 SendRequestAndExpectHttpResponse("hello world");
[email protected]4dca587c2013-03-07 16:54:47516}
517
[email protected]1e960032013-12-20 19:00:20518TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
[email protected]aa9b14d2013-05-10 23:45:19519 MockRead http_reads[] = {
[email protected]61a527782013-02-21 03:58:00520 MockRead("HTTP/1.1 200 OK\r\n"),
521 MockRead(kQuicAlternateProtocolHttpHeader),
522 MockRead("hello world"),
523 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
524 MockRead(ASYNC, OK)
525 };
526
[email protected]aa9b14d2013-05-10 23:45:19527 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:42528 nullptr, 0);
[email protected]aa9b14d2013-05-10 23:45:19529 socket_factory_.AddSocketDataProvider(&http_data);
[email protected]61a527782013-02-21 03:58:00530
[email protected]1e960032013-12-20 19:00:20531 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03532 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05533 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03534 GetRequestHeaders("GET", "http", "/")));
535 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05536 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:03537 GetResponseHeaders("200 OK")));
538 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05539 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03540 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
[email protected]1e960032013-12-20 19:00:20541 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
[email protected]61a527782013-02-21 03:58:00542
rcha5399e02015-04-21 19:32:04543 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]61a527782013-02-21 03:58:00544
[email protected]aa9b14d2013-05-10 23:45:19545 // The non-alternate protocol job needs to hang in order to guarantee that
546 // the alternate-protocol job will "win".
547 AddHangingNonAlternateProtocolSocketData();
[email protected]61a527782013-02-21 03:58:00548
[email protected]d7599122014-05-24 03:37:23549 CreateSessionWithNextProtos();
[email protected]61a527782013-02-21 03:58:00550
[email protected]aa9b14d2013-05-10 23:45:19551 SendRequestAndExpectHttpResponse("hello world");
552 SendRequestAndExpectQuicResponse("hello!");
[email protected]61a527782013-02-21 03:58:00553}
554
bnc62a44f022015-04-02 15:59:41555TEST_P(QuicNetworkTransactionTest, AlternateProtocolDifferentPort) {
556 MockRead http_reads[] = {
557 MockRead("HTTP/1.1 200 OK\r\n"),
558 MockRead(kQuicAlternateProtocolDifferentPortHttpHeader),
559 MockRead("hello world"),
560 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
561 MockRead(ASYNC, OK)};
562
563 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
564 0);
565 socket_factory_.AddSocketDataProvider(&http_data);
566
567 MockQuicData mock_quic_data;
568 mock_quic_data.AddWrite(
569 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
570 GetRequestHeaders("GET", "http", "/")));
571 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
572 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
573 mock_quic_data.AddRead(
574 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
575 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
576 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
577
rcha5399e02015-04-21 19:32:04578 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bnc62a44f022015-04-02 15:59:41579
580 // The non-alternate protocol job needs to hang in order to guarantee that
581 // the alternate-protocol job will "win".
582 AddHangingNonAlternateProtocolSocketData();
583
584 CreateSessionWithNextProtos();
585
586 SendRequestAndExpectHttpResponse("hello world");
587 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
588}
589
bncae8db8402015-03-26 20:13:50590TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) {
591 MockRead http_reads[] = {
592 MockRead("HTTP/1.1 200 OK\r\n"),
593 MockRead(kQuicAlternateProtocolHttpHeader),
594 MockRead("hello world"),
595 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
596 MockRead(ASYNC, OK)};
597
598 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
599 0);
600 socket_factory_.AddSocketDataProvider(&http_data);
601
602 MockQuicData mock_quic_data;
603 mock_quic_data.AddWrite(
604 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
605 GetRequestHeaders("GET", "http", "/")));
606 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
607 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
608 mock_quic_data.AddRead(
609 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
610 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
611 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
612
rcha5399e02015-04-21 19:32:04613 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bncae8db8402015-03-26 20:13:50614
615 // The non-alternate protocol job needs to hang in order to guarantee that
616 // the alternate-protocol job will "win".
617 AddHangingNonAlternateProtocolSocketData();
618
619 CreateSessionWithNextProtos();
620
621 AlternativeService alternative_service(QUIC,
622 HostPortPair::FromURL(request_.url));
623 session_->http_server_properties()->MarkAlternativeServiceRecentlyBroken(
624 alternative_service);
625 EXPECT_TRUE(
626 session_->http_server_properties()->WasAlternativeServiceRecentlyBroken(
627 alternative_service));
628
629 SendRequestAndExpectHttpResponse("hello world");
630 SendRequestAndExpectQuicResponse("hello!");
631
632 EXPECT_FALSE(
633 session_->http_server_properties()->WasAlternativeServiceRecentlyBroken(
634 alternative_service));
635}
636
[email protected]287d9412014-07-08 23:01:00637TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolProbabilityForQuic) {
638 MockRead http_reads[] = {
639 MockRead("HTTP/1.1 200 OK\r\n"),
640 MockRead(kQuicAlternateProtocol50pctHttpHeader),
641 MockRead("hello world"),
642 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
643 MockRead(ASYNC, OK)
644 };
645
646 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:42647 nullptr, 0);
[email protected]287d9412014-07-08 23:01:00648 socket_factory_.AddSocketDataProvider(&http_data);
649
650 MockQuicData mock_quic_data;
651 mock_quic_data.AddWrite(
652 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
653 GetRequestHeaders("GET", "http", "/")));
654 mock_quic_data.AddRead(
655 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
656 GetResponseHeaders("200 OK")));
657 mock_quic_data.AddRead(
658 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
659 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
660 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
661
rcha5399e02015-04-21 19:32:04662 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]287d9412014-07-08 23:01:00663
664 // The non-alternate protocol job needs to hang in order to guarantee that
665 // the alternate-protocol job will "win".
666 AddHangingNonAlternateProtocolSocketData();
667
668 params_.alternate_protocol_probability_threshold = .25;
669 CreateSessionWithNextProtos();
670
671 SendRequestAndExpectHttpResponse("hello world");
672 SendRequestAndExpectQuicResponse("hello!");
673}
674
675TEST_P(QuicNetworkTransactionTest, DontUseAlternateProtocolProbabilityForQuic) {
676 MockRead http_reads[] = {
677 MockRead("HTTP/1.1 200 OK\r\n"),
678 MockRead(kQuicAlternateProtocol50pctHttpHeader),
679 MockRead("hello world"),
680 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
681 MockRead(ASYNC, OK)
682 };
683
684 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:42685 nullptr, 0);
[email protected]287d9412014-07-08 23:01:00686 socket_factory_.AddSocketDataProvider(&http_data);
687 socket_factory_.AddSocketDataProvider(&http_data);
688
689 params_.alternate_protocol_probability_threshold = .75;
690 CreateSessionWithNextProtos();
691
692 SendRequestAndExpectHttpResponse("hello world");
693 SendRequestAndExpectHttpResponse("hello world");
694}
695
696TEST_P(QuicNetworkTransactionTest,
697 DontUseAlternateProtocolWithBadProbabilityForQuic) {
698 MockRead http_reads[] = {
699 MockRead("HTTP/1.1 200 OK\r\n"),
700 MockRead("Alternate-Protocol: 443:quic,p=2\r\n\r\n"),
701 MockRead("hello world"),
702 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
703 MockRead(ASYNC, OK)
704 };
705
706 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:42707 nullptr, 0);
[email protected]287d9412014-07-08 23:01:00708 socket_factory_.AddSocketDataProvider(&http_data);
709 socket_factory_.AddSocketDataProvider(&http_data);
710
711 params_.alternate_protocol_probability_threshold = .75;
712 CreateSessionWithNextProtos();
713
714 SendRequestAndExpectHttpResponse("hello world");
715 SendRequestAndExpectHttpResponse("hello world");
716}
717
[email protected]1e960032013-12-20 19:00:20718TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) {
[email protected]6d1b4ed2013-07-10 03:57:54719 params_.origin_to_force_quic_on =
720 HostPortPair::FromString("www.google.com:443");
[email protected]6d1b4ed2013-07-10 03:57:54721
722 MockRead http_reads[] = {
723 MockRead("HTTP/1.1 200 OK\r\n"),
724 MockRead(kQuicAlternateProtocolHttpsHeader),
725 MockRead("hello world"),
726 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
727 MockRead(ASYNC, OK)
728 };
729
730 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:42731 nullptr, 0);
[email protected]6d1b4ed2013-07-10 03:57:54732 socket_factory_.AddSocketDataProvider(&http_data);
733
[email protected]1e960032013-12-20 19:00:20734 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03735 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05736 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03737 GetRequestHeaders("GET", "http", "/")));
738 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05739 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:03740 GetResponseHeaders("200 OK")));
741 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05742 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03743 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
[email protected]1e960032013-12-20 19:00:20744 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
[email protected]6d1b4ed2013-07-10 03:57:54745
rcha5399e02015-04-21 19:32:04746 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]6d1b4ed2013-07-10 03:57:54747
748 // The non-alternate protocol job needs to hang in order to guarantee that
749 // the alternate-protocol job will "win".
750 AddHangingNonAlternateProtocolSocketData();
751
[email protected]d7599122014-05-24 03:37:23752 CreateSessionWithNextProtos();
[email protected]6d1b4ed2013-07-10 03:57:54753
754 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
755 SendRequestAndExpectHttpResponse("hello world");
756}
757
[email protected]1e960032013-12-20 19:00:20758TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) {
[email protected]dda75ab2013-06-22 22:43:30759 crypto_client_stream_factory_.set_handshake_mode(
760 MockCryptoClientStream::COLD_START);
761
762 MockWrite http_writes[] = {
763 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
764 MockWrite(SYNCHRONOUS, 1, "Host: www.google.com\r\n"),
765 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")
766 };
767
768 MockRead http_reads[] = {
769 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
770 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHttpHeader),
771 MockRead(SYNCHRONOUS, 5, "hello world"),
772 MockRead(SYNCHRONOUS, OK, 6)
773 };
774
775 DeterministicMockClientSocketFactory socket_factory;
776
777 DeterministicSocketData http_data(http_reads, arraysize(http_reads),
778 http_writes, arraysize(http_writes));
779 socket_factory.AddSocketDataProvider(&http_data);
780
781 // The QUIC transaction will not be allowed to complete.
782 MockWrite quic_writes[] = {
783 MockWrite(ASYNC, ERR_IO_PENDING, 0)
784 };
785 MockRead quic_reads[] = {
786 MockRead(ASYNC, ERR_IO_PENDING, 1),
787 };
788 DeterministicSocketData quic_data(quic_reads, arraysize(quic_reads),
789 quic_writes, arraysize(quic_writes));
790 socket_factory.AddSocketDataProvider(&quic_data);
791
792 // The HTTP transaction will complete.
793 DeterministicSocketData http_data2(http_reads, arraysize(http_reads),
794 http_writes, arraysize(http_writes));
795 socket_factory.AddSocketDataProvider(&http_data2);
796
[email protected]d7599122014-05-24 03:37:23797 CreateSessionWithFactory(&socket_factory, true);
[email protected]dda75ab2013-06-22 22:43:30798
799 // Run the first request.
800 http_data.StopAfter(arraysize(http_reads) + arraysize(http_writes));
801 SendRequestAndExpectHttpResponse("hello world");
802 ASSERT_TRUE(http_data.at_read_eof());
803 ASSERT_TRUE(http_data.at_write_eof());
804
805 // Now run the second request in which the QUIC socket hangs,
806 // and verify the the transaction continues over HTTP.
807 http_data2.StopAfter(arraysize(http_reads) + arraysize(http_writes));
808 SendRequestAndExpectHttpResponse("hello world");
809
810 ASSERT_TRUE(http_data2.at_read_eof());
811 ASSERT_TRUE(http_data2.at_write_eof());
812 ASSERT_TRUE(!quic_data.at_read_eof());
813 ASSERT_TRUE(!quic_data.at_write_eof());
814}
815
[email protected]1e960032013-12-20 19:00:20816TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
[email protected]1e960032013-12-20 19:00:20817 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03818 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05819 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03820 GetRequestHeaders("GET", "http", "/")));
821 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05822 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:03823 GetResponseHeaders("200 OK")));
824 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05825 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03826 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
[email protected]1e960032013-12-20 19:00:20827 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
[email protected]8ba81212013-05-03 13:11:48828
rcha5399e02015-04-21 19:32:04829 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]8ba81212013-05-03 13:11:48830
[email protected]3a120a6b2013-06-25 01:08:27831 // The non-alternate protocol job needs to hang in order to guarantee that
832 // the alternate-protocol job will "win".
[email protected]dda75ab2013-06-22 22:43:30833 AddHangingNonAlternateProtocolSocketData();
834
[email protected]d7599122014-05-24 03:37:23835 CreateSessionWithNextProtos();
[email protected]aa9b14d2013-05-10 23:45:19836 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
837 SendRequestAndExpectQuicResponse("hello!");
[email protected]8ba81212013-05-03 13:11:48838}
839
[email protected]1e960032013-12-20 19:00:20840TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
[email protected]1e960032013-12-20 19:00:20841 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03842 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05843 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03844 GetRequestHeaders("GET", "http", "/")));
845 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05846 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:03847 GetResponseHeaders("200 OK")));
848 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05849 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03850 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
[email protected]1e960032013-12-20 19:00:20851 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
rcha5399e02015-04-21 19:32:04852 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]3a120a6b2013-06-25 01:08:27853
854 // In order for a new QUIC session to be established via alternate-protocol
855 // without racing an HTTP connection, we need the host resolution to happen
856 // synchronously.
857 host_resolver_.set_synchronous_mode(true);
858 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", "");
[email protected]5109c1952013-08-20 18:44:10859 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80));
[email protected]3a120a6b2013-06-25 01:08:27860 AddressList address;
[email protected]5109c1952013-08-20 18:44:10861 host_resolver_.Resolve(info,
862 DEFAULT_PRIORITY,
863 &address,
864 CompletionCallback(),
rtennetibe635732014-10-02 22:51:42865 nullptr,
[email protected]3a120a6b2013-06-25 01:08:27866 net_log_.bound());
867
[email protected]d7599122014-05-24 03:37:23868 CreateSessionWithNextProtos();
[email protected]3a120a6b2013-06-25 01:08:27869 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
870 SendRequestAndExpectQuicResponse("hello!");
871}
872
[email protected]0fc924b2014-03-31 04:34:15873TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) {
874 proxy_service_.reset(
875 ProxyService::CreateFixedFromPacResult("PROXY myproxy:70"));
[email protected]0fc924b2014-03-31 04:34:15876
877 // Since we are using a proxy, the QUIC job will not succeed.
878 MockWrite http_writes[] = {
879 MockWrite(SYNCHRONOUS, 0, "GET http://www.google.com/ HTTP/1.1\r\n"),
880 MockWrite(SYNCHRONOUS, 1, "Host: www.google.com\r\n"),
881 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")
882 };
883
884 MockRead http_reads[] = {
885 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
886 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHttpHeader),
887 MockRead(SYNCHRONOUS, 5, "hello world"),
888 MockRead(SYNCHRONOUS, OK, 6)
889 };
890
891 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
892 http_writes, arraysize(http_writes));
893 socket_factory_.AddSocketDataProvider(&http_data);
894
895 // In order for a new QUIC session to be established via alternate-protocol
896 // without racing an HTTP connection, we need the host resolution to happen
897 // synchronously.
898 host_resolver_.set_synchronous_mode(true);
899 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", "");
900 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80));
901 AddressList address;
902 host_resolver_.Resolve(info,
903 DEFAULT_PRIORITY,
904 &address,
905 CompletionCallback(),
rtennetibe635732014-10-02 22:51:42906 nullptr,
[email protected]0fc924b2014-03-31 04:34:15907 net_log_.bound());
908
[email protected]d7599122014-05-24 03:37:23909 CreateSessionWithNextProtos();
[email protected]0fc924b2014-03-31 04:34:15910 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
911 SendRequestAndExpectHttpResponse("hello world");
912}
913
[email protected]1e960032013-12-20 19:00:20914TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
[email protected]1e960032013-12-20 19:00:20915 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03916 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05917 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03918 GetRequestHeaders("GET", "http", "/")));
919 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05920 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:03921 GetResponseHeaders("200 OK")));
922 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05923 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03924 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
[email protected]1e960032013-12-20 19:00:20925 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
rcha5399e02015-04-21 19:32:04926 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]11c05872013-08-20 02:04:12927
928 // The non-alternate protocol job needs to hang in order to guarantee that
929 // the alternate-protocol job will "win".
930 AddHangingNonAlternateProtocolSocketData();
931
932 // In order for a new QUIC session to be established via alternate-protocol
933 // without racing an HTTP connection, we need the host resolution to happen
934 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
935 // connection to the the server, in this test we require confirmation
936 // before encrypting so the HTTP job will still start.
937 host_resolver_.set_synchronous_mode(true);
938 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", "");
[email protected]5109c1952013-08-20 18:44:10939 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80));
[email protected]11c05872013-08-20 02:04:12940 AddressList address;
[email protected]5109c1952013-08-20 18:44:10941 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address,
rtennetibe635732014-10-02 22:51:42942 CompletionCallback(), nullptr, net_log_.bound());
[email protected]11c05872013-08-20 02:04:12943
[email protected]d7599122014-05-24 03:37:23944 CreateSessionWithNextProtos();
[email protected]11c05872013-08-20 02:04:12945 session_->quic_stream_factory()->set_require_confirmation(true);
946 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
947
948 scoped_ptr<HttpNetworkTransaction> trans(
949 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
950 TestCompletionCallback callback;
951 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
952 EXPECT_EQ(ERR_IO_PENDING, rv);
953
954 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
955 QuicSession::HANDSHAKE_CONFIRMED);
956 EXPECT_EQ(OK, callback.WaitForResult());
957}
958
[email protected]1e960032013-12-20 19:00:20959TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
[email protected]3316d422013-05-03 21:45:30960 // Alternate-protocol job
961 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1));
962 MockRead quic_reads[] = {
963 MockRead(ASYNC, close->data(), close->length()),
964 MockRead(ASYNC, OK), // EOF
965 };
966 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:42967 nullptr, 0);
[email protected]3316d422013-05-03 21:45:30968 socket_factory_.AddSocketDataProvider(&quic_data);
969
970 // Main job which will succeed even though the alternate job fails.
971 MockRead http_reads[] = {
972 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
973 MockRead("hello from http"),
974 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
975 MockRead(ASYNC, OK)
976 };
977
978 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:42979 nullptr, 0);
[email protected]3316d422013-05-03 21:45:30980 socket_factory_.AddSocketDataProvider(&http_data);
981
[email protected]d7599122014-05-24 03:37:23982 CreateSessionWithNextProtos();
[email protected]aa9b14d2013-05-10 23:45:19983 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
984 SendRequestAndExpectHttpResponse("hello from http");
985 ExpectBrokenAlternateProtocolMapping();
[email protected]3316d422013-05-03 21:45:30986}
987
[email protected]1e960032013-12-20 19:00:20988TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
[email protected]d03a66d2013-05-06 12:55:59989 // Alternate-protocol job
990 MockRead quic_reads[] = {
991 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
992 };
993 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:42994 nullptr, 0);
[email protected]d03a66d2013-05-06 12:55:59995 socket_factory_.AddSocketDataProvider(&quic_data);
996
997 // Main job which will succeed even though the alternate job fails.
998 MockRead http_reads[] = {
999 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
1000 MockRead("hello from http"),
1001 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1002 MockRead(ASYNC, OK)
1003 };
1004
1005 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421006 nullptr, 0);
[email protected]d03a66d2013-05-06 12:55:591007 socket_factory_.AddSocketDataProvider(&http_data);
1008
[email protected]d7599122014-05-24 03:37:231009 CreateSessionWithNextProtos();
[email protected]d03a66d2013-05-06 12:55:591010
[email protected]aa9b14d2013-05-10 23:45:191011 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1012 SendRequestAndExpectHttpResponse("hello from http");
1013 ExpectBrokenAlternateProtocolMapping();
[email protected]d03a66d2013-05-06 12:55:591014}
1015
[email protected]00c159f2014-05-21 22:38:161016TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) {
[email protected]eb71ab62014-05-23 07:57:531017 // Alternate-protocol job will fail when the session attempts to read.
[email protected]00c159f2014-05-21 22:38:161018 MockRead quic_reads[] = {
1019 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
1020 };
1021 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421022 nullptr, 0);
[email protected]00c159f2014-05-21 22:38:161023 socket_factory_.AddSocketDataProvider(&quic_data);
1024
[email protected]eb71ab62014-05-23 07:57:531025 // Main job will also fail.
[email protected]00c159f2014-05-21 22:38:161026 MockRead http_reads[] = {
1027 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
1028 };
1029
1030 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421031 nullptr, 0);
[email protected]00c159f2014-05-21 22:38:161032 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED));
1033 socket_factory_.AddSocketDataProvider(&http_data);
1034
[email protected]d7599122014-05-24 03:37:231035 CreateSessionWithNextProtos();
[email protected]00c159f2014-05-21 22:38:161036
1037 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1038 scoped_ptr<HttpNetworkTransaction> trans(
1039 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1040 TestCompletionCallback callback;
1041 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1042 EXPECT_EQ(ERR_IO_PENDING, rv);
1043 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult());
1044 ExpectQuicAlternateProtocolMapping();
1045}
1046
[email protected]1e960032013-12-20 19:00:201047TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
[email protected]77c6c162013-08-17 02:57:451048 // Alternate-protocol job
1049 MockRead quic_reads[] = {
1050 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
1051 };
1052 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421053 nullptr, 0);
[email protected]77c6c162013-08-17 02:57:451054 socket_factory_.AddSocketDataProvider(&quic_data);
1055
1056 AddHangingNonAlternateProtocolSocketData();
1057
[email protected]c92c1b52014-05-31 04:16:061058 // Second Alternate-protocol job which will race with the TCP job.
1059 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421060 nullptr, 0);
[email protected]c92c1b52014-05-31 04:16:061061 socket_factory_.AddSocketDataProvider(&quic_data2);
1062
[email protected]4d283b32013-10-17 12:57:271063 // Final job that will proceed when the QUIC job fails.
1064 MockRead http_reads[] = {
1065 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
1066 MockRead("hello from http"),
1067 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1068 MockRead(ASYNC, OK)
1069 };
1070
1071 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421072 nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271073 socket_factory_.AddSocketDataProvider(&http_data);
1074
[email protected]d7599122014-05-24 03:37:231075 CreateSessionWithNextProtos();
[email protected]77c6c162013-08-17 02:57:451076
1077 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1078
[email protected]4d283b32013-10-17 12:57:271079 SendRequestAndExpectHttpResponse("hello from http");
[email protected]77c6c162013-08-17 02:57:451080
1081 ExpectBrokenAlternateProtocolMapping();
[email protected]4d283b32013-10-17 12:57:271082
1083 EXPECT_TRUE(quic_data.at_read_eof());
1084 EXPECT_TRUE(quic_data.at_write_eof());
[email protected]77c6c162013-08-17 02:57:451085}
1086
[email protected]93b31772014-06-19 08:03:351087TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) {
[email protected]65768442014-06-06 23:37:031088 // Alternate-protocol job
1089 MockRead quic_reads[] = {
1090 MockRead(ASYNC, ERR_IO_PENDING),
1091 };
1092 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421093 nullptr, 0);
[email protected]65768442014-06-06 23:37:031094 socket_factory_.AddSocketDataProvider(&quic_data);
1095
1096 // Main job that will proceed when the QUIC job fails.
1097 MockRead http_reads[] = {
1098 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
1099 MockRead("hello from http"),
1100 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1101 MockRead(ASYNC, OK)
1102 };
1103
1104 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421105 nullptr, 0);
[email protected]65768442014-06-06 23:37:031106 socket_factory_.AddSocketDataProvider(&http_data);
1107
1108 CreateSessionWithNextProtos();
1109
1110 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1111
1112 SendRequestAndExpectHttpResponse("hello from http");
1113}
1114
[email protected]eb71ab62014-05-23 07:57:531115TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
[email protected]4d590c9c2014-05-02 05:14:331116 // Alternate-protocol job will fail before creating a QUIC session.
rtennetibe635732014-10-02 22:51:421117 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0);
[email protected]4d590c9c2014-05-02 05:14:331118 quic_data.set_connect_data(MockConnect(SYNCHRONOUS,
1119 ERR_INTERNET_DISCONNECTED));
1120 socket_factory_.AddSocketDataProvider(&quic_data);
1121
1122 // Main job which will succeed even though the alternate job fails.
1123 MockRead http_reads[] = {
1124 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
1125 MockRead("hello from http"),
1126 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1127 MockRead(ASYNC, OK)
1128 };
1129
1130 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421131 nullptr, 0);
[email protected]4d590c9c2014-05-02 05:14:331132 socket_factory_.AddSocketDataProvider(&http_data);
1133
[email protected]d7599122014-05-24 03:37:231134 CreateSessionWithNextProtos();
[email protected]4d590c9c2014-05-02 05:14:331135 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1136 SendRequestAndExpectHttpResponse("hello from http");
[email protected]eb71ab62014-05-23 07:57:531137
1138 ExpectBrokenAlternateProtocolMapping();
[email protected]4d590c9c2014-05-02 05:14:331139}
1140
[email protected]4fee9672014-01-08 14:47:151141TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
[email protected]4fee9672014-01-08 14:47:151142 MockQuicData mock_quic_data;
rcha5399e02015-04-21 19:32:041143 mock_quic_data.AddSynchronousRead(ConstructConnectionClosePacket(1));
[email protected]92bf17c2014-03-03 21:14:031144 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051145 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:031146 GetRequestHeaders("GET", "http", "/")));
1147 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rcha5399e02015-04-21 19:32:041148 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4fee9672014-01-08 14:47:151149
1150 // When the QUIC connection fails, we will try the request again over HTTP.
1151 MockRead http_reads[] = {
1152 MockRead("HTTP/1.1 200 OK\r\n"),
1153 MockRead(kQuicAlternateProtocolHttpHeader),
1154 MockRead("hello world"),
1155 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1156 MockRead(ASYNC, OK)
1157 };
1158
1159 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421160 nullptr, 0);
[email protected]4fee9672014-01-08 14:47:151161 socket_factory_.AddSocketDataProvider(&http_data);
1162
1163 // In order for a new QUIC session to be established via alternate-protocol
1164 // without racing an HTTP connection, we need the host resolution to happen
1165 // synchronously.
1166 host_resolver_.set_synchronous_mode(true);
1167 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", "");
1168 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80));
1169 AddressList address;
1170 host_resolver_.Resolve(info,
1171 DEFAULT_PRIORITY,
1172 &address,
1173 CompletionCallback(),
rtennetibe635732014-10-02 22:51:421174 nullptr,
[email protected]4fee9672014-01-08 14:47:151175 net_log_.bound());
1176
[email protected]d7599122014-05-24 03:37:231177 CreateSessionWithNextProtos();
[email protected]4fee9672014-01-08 14:47:151178 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1179 SendRequestAndExpectHttpResponse("hello world");
1180}
1181
[email protected]61a527782013-02-21 03:58:001182} // namespace test
1183} // namespace net