blob: d3ca186b54ffc8bc010bcbf5d45d1a1a941e8432 [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"
bnc508835902015-05-12 20:10:2912#include "net/base/test_data_directory.h"
[email protected]6e7845ae2013-03-29 21:48:1113#include "net/cert/mock_cert_verifier.h"
[email protected]f2cb3cf2013-03-21 01:40:5314#include "net/dns/mock_host_resolver.h"
[email protected]61a527782013-02-21 03:58:0015#include "net/http/http_auth_handler_factory.h"
16#include "net/http/http_network_session.h"
17#include "net/http/http_network_transaction.h"
18#include "net/http/http_server_properties_impl.h"
19#include "net/http/http_stream.h"
20#include "net/http/http_stream_factory.h"
[email protected]c41737d2014-05-14 07:47:1921#include "net/http/http_transaction_test_util.h"
[email protected]b1c988b2013-06-13 06:48:1122#include "net/http/transport_security_state.h"
vishal.b62985ca92015-04-17 08:45:5123#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4624#include "net/log/test_net_log_entry.h"
25#include "net/log/test_net_log_util.h"
[email protected]61a527782013-02-21 03:58:0026#include "net/proxy/proxy_config_service_fixed.h"
27#include "net/proxy/proxy_resolver.h"
28#include "net/proxy/proxy_service.h"
bnc508835902015-05-12 20:10:2929#include "net/quic/crypto/proof_verifier_chromium.h"
[email protected]61a527782013-02-21 03:58:0030#include "net/quic/crypto/quic_decrypter.h"
31#include "net/quic/crypto/quic_encrypter.h"
32#include "net/quic/quic_framer.h"
[email protected]24e5bc52013-09-18 15:36:5833#include "net/quic/quic_http_utils.h"
[email protected]ed3fc15d2013-03-08 18:37:4434#include "net/quic/test_tools/crypto_test_utils.h"
[email protected]61a527782013-02-21 03:58:0035#include "net/quic/test_tools/mock_clock.h"
[email protected]e8ff26842013-03-22 21:02:0536#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
[email protected]61a527782013-02-21 03:58:0037#include "net/quic/test_tools/mock_random.h"
[email protected]1e960032013-12-20 19:00:2038#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]61a527782013-02-21 03:58:0039#include "net/quic/test_tools/quic_test_utils.h"
40#include "net/socket/client_socket_factory.h"
41#include "net/socket/mock_client_socket_pool_manager.h"
42#include "net/socket/socket_test_util.h"
43#include "net/socket/ssl_client_socket.h"
44#include "net/spdy/spdy_frame_builder.h"
45#include "net/spdy/spdy_framer.h"
[email protected]536fd0b2013-03-14 17:41:5746#include "net/ssl/ssl_config_service_defaults.h"
bnc508835902015-05-12 20:10:2947#include "net/test/cert_test_util.h"
[email protected]61a527782013-02-21 03:58:0048#include "testing/gtest/include/gtest/gtest.h"
49#include "testing/platform_test.h"
50
bnc508835902015-05-12 20:10:2951namespace net {
52namespace test {
[email protected]61a527782013-02-21 03:58:0053
54namespace {
55
56// This is the expected return from a current server advertising QUIC.
57static const char kQuicAlternateProtocolHttpHeader[] =
[email protected]4ff65372013-06-21 05:45:4658 "Alternate-Protocol: 80:quic\r\n\r\n";
[email protected]287d9412014-07-08 23:01:0059static const char kQuicAlternateProtocol50pctHttpHeader[] =
60 "Alternate-Protocol: 80:quic,p=.5\r\n\r\n";
bnc62a44f022015-04-02 15:59:4161static const char kQuicAlternateProtocolDifferentPortHttpHeader[] =
62 "Alternate-Protocol: 137:quic\r\n\r\n";
[email protected]6d1b4ed2013-07-10 03:57:5463static const char kQuicAlternateProtocolHttpsHeader[] =
64 "Alternate-Protocol: 443:quic\r\n\r\n";
[email protected]1e960032013-12-20 19:00:2065
[email protected]61a527782013-02-21 03:58:0066} // namespace
67
[email protected]1e960032013-12-20 19:00:2068// Helper class to encapsulate MockReads and MockWrites for QUIC.
69// Simplify ownership issues and the interaction with the MockSocketFactory.
70class MockQuicData {
71 public:
rcha5399e02015-04-21 19:32:0472 MockQuicData() : sequence_number_(0) {}
73
[email protected]1e960032013-12-20 19:00:2074 ~MockQuicData() {
75 STLDeleteElements(&packets_);
76 }
77
rcha5399e02015-04-21 19:32:0478 void AddSynchronousRead(scoped_ptr<QuicEncryptedPacket> packet) {
[email protected]1e960032013-12-20 19:00:2079 reads_.push_back(MockRead(SYNCHRONOUS, packet->data(), packet->length(),
80 sequence_number_++));
81 packets_.push_back(packet.release());
82 }
83
rcha5399e02015-04-21 19:32:0484 void AddRead(scoped_ptr<QuicEncryptedPacket> packet) {
85 reads_.push_back(
86 MockRead(ASYNC, packet->data(), packet->length(), sequence_number_++));
87 packets_.push_back(packet.release());
88 }
89
[email protected]1e960032013-12-20 19:00:2090 void AddRead(IoMode mode, int rv) {
rcha5399e02015-04-21 19:32:0491 reads_.push_back(MockRead(mode, rv, sequence_number_++));
[email protected]1e960032013-12-20 19:00:2092 }
93
94 void AddWrite(scoped_ptr<QuicEncryptedPacket> packet) {
95 writes_.push_back(MockWrite(SYNCHRONOUS, packet->data(), packet->length(),
96 sequence_number_++));
97 packets_.push_back(packet.release());
98 }
99
rcha5399e02015-04-21 19:32:04100 void AddSocketDataToFactory(MockClientSocketFactory* factory) {
rtennetibe635732014-10-02 22:51:42101 MockRead* reads = reads_.empty() ? nullptr : &reads_[0];
102 MockWrite* writes = writes_.empty() ? nullptr : &writes_[0];
rcha5399e02015-04-21 19:32:04103 socket_data_.reset(
104 new SequencedSocketData(reads, reads_.size(), writes, writes_.size()));
[email protected]1e960032013-12-20 19:00:20105 factory->AddSocketDataProvider(socket_data_.get());
106 }
107
108 private:
109 std::vector<QuicEncryptedPacket*> packets_;
110 std::vector<MockWrite> writes_;
111 std::vector<MockRead> reads_;
112 size_t sequence_number_;
113 scoped_ptr<SocketDataProvider> socket_data_;
114};
115
tbansal7cec3812015-02-05 21:25:12116class ProxyHeadersHandler {
117 public:
118 ProxyHeadersHandler() : was_called_(false) {}
119
120 bool was_called() { return was_called_; }
121
122 void OnBeforeProxyHeadersSent(const ProxyInfo& proxy_info,
123 HttpRequestHeaders* request_headers) {
124 was_called_ = true;
125 }
126
127 private:
128 bool was_called_;
129};
130
[email protected]1e960032013-12-20 19:00:20131class QuicNetworkTransactionTest
132 : public PlatformTest,
[email protected]5d03bbd2014-03-07 16:19:16133 public ::testing::WithParamInterface<QuicVersion> {
[email protected]61a527782013-02-21 03:58:00134 protected:
[email protected]1c04f9522013-02-21 20:32:43135 QuicNetworkTransactionTest()
rtenneti4b06ae72014-08-26 03:43:43136 : clock_(new MockClock),
137 maker_(GetParam(), 0, clock_),
[email protected]1c04f9522013-02-21 20:32:43138 ssl_config_service_(new SSLConfigServiceDefaults),
139 proxy_service_(ProxyService::CreateDirect()),
140 auth_handler_factory_(
[email protected]dda75ab2013-06-22 22:43:30141 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
[email protected]457d6952013-12-13 09:24:58142 random_generator_(0),
rtennetibe635732014-10-02 22:51:42143 hanging_data_(nullptr, 0, nullptr, 0) {
[email protected]aa9b14d2013-05-10 23:45:19144 request_.method = "GET";
145 request_.url = GURL("http://www.google.com/");
146 request_.load_flags = 0;
[email protected]98a9d1252014-04-04 00:43:59147 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
[email protected]1c04f9522013-02-21 20:32:43148 }
[email protected]61a527782013-02-21 03:58:00149
dcheng67be2b1f2014-10-27 21:47:29150 void SetUp() override {
[email protected]61a527782013-02-21 03:58:00151 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34152 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00153 }
154
dcheng67be2b1f2014-10-27 21:47:29155 void TearDown() override {
[email protected]61a527782013-02-21 03:58:00156 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
157 // Empty the current queue.
[email protected]2da659e2013-05-23 20:51:34158 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00159 PlatformTest::TearDown();
160 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34161 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00162 }
163
[email protected]3316d422013-05-03 21:45:30164 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
165 QuicPacketSequenceNumber num) {
[email protected]1e960032013-12-20 19:00:20166 return maker_.MakeConnectionClosePacket(num);
[email protected]3316d422013-05-03 21:45:30167 }
168
[email protected]61a527782013-02-21 03:58:00169 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket(
170 QuicPacketSequenceNumber largest_received,
171 QuicPacketSequenceNumber least_unacked) {
[email protected]1e960032013-12-20 19:00:20172 return maker_.MakeAckPacket(2, largest_received, least_unacked, true);
173 }
[email protected]61a527782013-02-21 03:58:00174
[email protected]1e960032013-12-20 19:00:20175 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
176 const std::string& scheme,
177 const std::string& path) {
178 return maker_.GetRequestHeaders(method, scheme, path);
[email protected]61a527782013-02-21 03:58:00179 }
180
[email protected]1e960032013-12-20 19:00:20181 SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
182 return maker_.GetResponseHeaders(status);
[email protected]61a527782013-02-21 03:58:00183 }
184
[email protected]1e960032013-12-20 19:00:20185 scoped_ptr<QuicEncryptedPacket> ConstructDataPacket(
[email protected]61a527782013-02-21 03:58:00186 QuicPacketSequenceNumber sequence_number,
[email protected]98b20ce2013-05-10 05:55:26187 QuicStreamId stream_id,
[email protected]e8ff26842013-03-22 21:02:05188 bool should_include_version,
[email protected]61a527782013-02-21 03:58:00189 bool fin,
190 QuicStreamOffset offset,
191 base::StringPiece data) {
[email protected]1e960032013-12-20 19:00:20192 return maker_.MakeDataPacket(
193 sequence_number, stream_id, should_include_version, fin, offset, data);
[email protected]61a527782013-02-21 03:58:00194 }
195
[email protected]1e960032013-12-20 19:00:20196 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
197 QuicPacketSequenceNumber sequence_number,
198 QuicStreamId stream_id,
199 bool should_include_version,
200 bool fin,
201 const SpdyHeaderBlock& headers) {
rtennetif4bdb542015-01-21 14:33:05202 QuicPriority priority =
203 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
204 return maker_.MakeRequestHeadersPacket(sequence_number, stream_id,
205 should_include_version, fin,
206 priority, headers);
[email protected]61a527782013-02-21 03:58:00207 }
208
[email protected]1e960032013-12-20 19:00:20209 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
210 QuicPacketSequenceNumber sequence_number,
211 QuicStreamId stream_id,
212 bool should_include_version,
213 bool fin,
214 const SpdyHeaderBlock& headers) {
215 return maker_.MakeResponseHeadersPacket(
216 sequence_number, stream_id, should_include_version, fin, headers);
[email protected]61a527782013-02-21 03:58:00217 }
218
219 void CreateSession() {
[email protected]d7599122014-05-24 03:37:23220 CreateSessionWithFactory(&socket_factory_, false);
[email protected]dda75ab2013-06-22 22:43:30221 }
222
[email protected]d7599122014-05-24 03:37:23223 void CreateSessionWithNextProtos() {
224 CreateSessionWithFactory(&socket_factory_, true);
225 }
226
227 // If |use_next_protos| is true, enables SPDY and QUIC.
228 void CreateSessionWithFactory(ClientSocketFactory* socket_factory,
229 bool use_next_protos) {
[email protected]4dca587c2013-03-07 16:54:47230 params_.enable_quic = true;
231 params_.quic_clock = clock_;
232 params_.quic_random = &random_generator_;
[email protected]dda75ab2013-06-22 22:43:30233 params_.client_socket_factory = socket_factory;
[email protected]e8ff26842013-03-22 21:02:05234 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43235 params_.host_resolver = &host_resolver_;
236 params_.cert_verifier = &cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11237 params_.transport_security_state = &transport_security_state_;
[email protected]1c04f9522013-02-21 20:32:43238 params_.proxy_service = proxy_service_.get();
239 params_.ssl_config_service = ssl_config_service_.get();
240 params_.http_auth_handler_factory = auth_handler_factory_.get();
[email protected]30d4c022013-07-18 22:58:16241 params_.http_server_properties = http_server_properties.GetWeakPtr();
[email protected]1e960032013-12-20 19:00:20242 params_.quic_supported_versions = SupportedVersions(GetParam());
[email protected]61a527782013-02-21 03:58:00243
[email protected]d7599122014-05-24 03:37:23244 if (use_next_protos) {
245 params_.use_alternate_protocols = true;
bnc3bb2c232014-11-07 20:26:39246 params_.next_protos = NextProtosWithSpdyAndQuic(true, true);
[email protected]d7599122014-05-24 03:37:23247 }
248
[email protected]61a527782013-02-21 03:58:00249 session_ = new HttpNetworkSession(params_);
[email protected]11c05872013-08-20 02:04:12250 session_->quic_stream_factory()->set_require_confirmation(false);
[email protected]61a527782013-02-21 03:58:00251 }
252
[email protected]aa9b14d2013-05-10 23:45:19253 void CheckWasQuicResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
254 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42255 ASSERT_TRUE(response != nullptr);
256 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19257 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
258 EXPECT_TRUE(response->was_fetched_via_spdy);
259 EXPECT_TRUE(response->was_npn_negotiated);
260 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
261 response->connection_info);
262 }
263
bnc62a44f022015-04-02 15:59:41264 void CheckResponsePort(const scoped_ptr<HttpNetworkTransaction>& trans,
265 uint16 port) {
266 const HttpResponseInfo* response = trans->GetResponseInfo();
267 ASSERT_TRUE(response != nullptr);
268 EXPECT_EQ(port, response->socket_address.port());
269 }
270
[email protected]aa9b14d2013-05-10 23:45:19271 void CheckWasHttpResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
272 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42273 ASSERT_TRUE(response != nullptr);
274 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19275 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
276 EXPECT_FALSE(response->was_fetched_via_spdy);
277 EXPECT_FALSE(response->was_npn_negotiated);
278 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1,
279 response->connection_info);
280 }
281
bncffc2fdf2015-05-14 18:29:49282 void CheckResponseData(const scoped_ptr<HttpNetworkTransaction>& trans,
[email protected]aa9b14d2013-05-10 23:45:19283 const std::string& expected) {
284 std::string response_data;
bncffc2fdf2015-05-14 18:29:49285 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
[email protected]aa9b14d2013-05-10 23:45:19286 EXPECT_EQ(expected, response_data);
287 }
288
bncffc2fdf2015-05-14 18:29:49289 void RunTransaction(const scoped_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19290 TestCompletionCallback callback;
291 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
292 EXPECT_EQ(ERR_IO_PENDING, rv);
293 EXPECT_EQ(OK, callback.WaitForResult());
294 }
295
296 void SendRequestAndExpectHttpResponse(const std::string& expected) {
297 scoped_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50298 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
bncffc2fdf2015-05-14 18:29:49299 RunTransaction(trans);
[email protected]aa9b14d2013-05-10 23:45:19300 CheckWasHttpResponse(trans);
bncffc2fdf2015-05-14 18:29:49301 CheckResponseData(trans, expected);
[email protected]aa9b14d2013-05-10 23:45:19302 }
303
304 void SendRequestAndExpectQuicResponse(const std::string& expected) {
bnc62a44f022015-04-02 15:59:41305 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, 80);
tbansal7cec3812015-02-05 21:25:12306 }
307
bnc62a44f022015-04-02 15:59:41308 void SendRequestAndExpectQuicResponseOnPort(const std::string& expected,
309 uint16 port) {
310 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, port);
311 }
312
313 void SendRequestAndExpectQuicResponseFromProxyOnPort(
314 const std::string& expected,
315 uint16 port) {
316 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port);
[email protected]aa9b14d2013-05-10 23:45:19317 }
318
319 void AddQuicAlternateProtocolMapping(
320 MockCryptoClientStream::HandshakeMode handshake_mode) {
321 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
bnccacc0992015-03-20 20:22:22322 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url);
323 AlternativeService alternative_service(QUIC, host_port_pair.host(), 80);
324 session_->http_server_properties()->SetAlternativeService(
325 host_port_pair, alternative_service, 1.0);
[email protected]aa9b14d2013-05-10 23:45:19326 }
327
328 void ExpectBrokenAlternateProtocolMapping() {
bnc8445b3002015-03-13 01:57:09329 const HostPortPair origin = HostPortPair::FromURL(request_.url);
bnc181b39a2015-03-17 21:36:47330 const AlternativeService alternative_service =
331 session_->http_server_properties()->GetAlternativeService(origin);
332 EXPECT_NE(UNINITIALIZED_ALTERNATE_PROTOCOL, alternative_service.protocol);
bnc8445b3002015-03-13 01:57:09333 EXPECT_TRUE(session_->http_server_properties()->IsAlternativeServiceBroken(
334 alternative_service));
[email protected]aa9b14d2013-05-10 23:45:19335 }
336
[email protected]4d590c9c2014-05-02 05:14:33337 void ExpectQuicAlternateProtocolMapping() {
bnc181b39a2015-03-17 21:36:47338 const AlternativeService alternative_service =
339 session_->http_server_properties()->GetAlternativeService(
[email protected]4d590c9c2014-05-02 05:14:33340 HostPortPair::FromURL(request_.url));
bnc181b39a2015-03-17 21:36:47341 EXPECT_EQ(QUIC, alternative_service.protocol);
[email protected]4d590c9c2014-05-02 05:14:33342 }
343
[email protected]aa9b14d2013-05-10 23:45:19344 void AddHangingNonAlternateProtocolSocketData() {
[email protected]dda75ab2013-06-22 22:43:30345 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
346 hanging_data_.set_connect_data(hanging_connect);
347 socket_factory_.AddSocketDataProvider(&hanging_data_);
[email protected]aa9b14d2013-05-10 23:45:19348 }
349
rtenneti4b06ae72014-08-26 03:43:43350 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
[email protected]1e960032013-12-20 19:00:20351 QuicTestPacketMaker maker_;
[email protected]61a527782013-02-21 03:58:00352 scoped_refptr<HttpNetworkSession> session_;
353 MockClientSocketFactory socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05354 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43355 MockHostResolver host_resolver_;
356 MockCertVerifier cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11357 TransportSecurityState transport_security_state_;
[email protected]1c04f9522013-02-21 20:32:43358 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
359 scoped_ptr<ProxyService> proxy_service_;
360 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
[email protected]61a527782013-02-21 03:58:00361 MockRandom random_generator_;
362 HttpServerPropertiesImpl http_server_properties;
363 HttpNetworkSession::Params params_;
[email protected]aa9b14d2013-05-10 23:45:19364 HttpRequestInfo request_;
vishal.b62985ca92015-04-17 08:45:51365 BoundTestNetLog net_log_;
[email protected]dda75ab2013-06-22 22:43:30366 StaticSocketDataProvider hanging_data_;
tbansal7cec3812015-02-05 21:25:12367
368 private:
369 void SendRequestAndExpectQuicResponseMaybeFromProxy(
370 const std::string& expected,
bnc62a44f022015-04-02 15:59:41371 bool used_proxy,
372 uint16 port) {
tbansal7cec3812015-02-05 21:25:12373 scoped_ptr<HttpNetworkTransaction> trans(
374 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
375 ProxyHeadersHandler proxy_headers_handler;
376 trans->SetBeforeProxyHeadersSentCallback(
377 base::Bind(&ProxyHeadersHandler::OnBeforeProxyHeadersSent,
378 base::Unretained(&proxy_headers_handler)));
bncffc2fdf2015-05-14 18:29:49379 RunTransaction(trans);
tbansal7cec3812015-02-05 21:25:12380 CheckWasQuicResponse(trans);
bnc62a44f022015-04-02 15:59:41381 CheckResponsePort(trans, port);
bncffc2fdf2015-05-14 18:29:49382 CheckResponseData(trans, expected);
tbansal7cec3812015-02-05 21:25:12383 EXPECT_EQ(used_proxy, proxy_headers_handler.was_called());
384 }
[email protected]61a527782013-02-21 03:58:00385};
386
[email protected]1e960032013-12-20 19:00:20387INSTANTIATE_TEST_CASE_P(Version, QuicNetworkTransactionTest,
388 ::testing::ValuesIn(QuicSupportedVersions()));
389
390TEST_P(QuicNetworkTransactionTest, ForceQuic) {
[email protected]49e85332013-06-04 04:18:03391 params_.origin_to_force_quic_on =
392 HostPortPair::FromString("www.google.com:80");
[email protected]4dca587c2013-03-07 16:54:47393
[email protected]1e960032013-12-20 19:00:20394 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03395 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05396 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03397 GetRequestHeaders("GET", "http", "/")));
398 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05399 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:03400 GetResponseHeaders("200 OK")));
401 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05402 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03403 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
[email protected]1e960032013-12-20 19:00:20404 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
[email protected]4dca587c2013-03-07 16:54:47405
rcha5399e02015-04-21 19:32:04406 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4dca587c2013-03-07 16:54:47407
[email protected]aa9b14d2013-05-10 23:45:19408 // The non-alternate protocol job needs to hang in order to guarantee that
409 // the alternate-protocol job will "win".
410 AddHangingNonAlternateProtocolSocketData();
[email protected]4dca587c2013-03-07 16:54:47411
412 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47413
[email protected]aa9b14d2013-05-10 23:45:19414 SendRequestAndExpectQuicResponse("hello!");
[email protected]4dca587c2013-03-07 16:54:47415
[email protected]98b20ce2013-05-10 05:55:26416 // Check that the NetLog was filled reasonably.
mmenke43758e62015-05-04 21:09:46417 TestNetLogEntry::List entries;
[email protected]aa9b14d2013-05-10 23:45:19418 net_log_.GetEntries(&entries);
[email protected]98b20ce2013-05-10 05:55:26419 EXPECT_LT(0u, entries.size());
420
421 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29422 int pos = ExpectLogContainsSomewhere(
423 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
424 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26425 EXPECT_LT(0, pos);
426
427 // ... and also a TYPE_QUIC_SESSION_PACKET_HEADER_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29428 pos = ExpectLogContainsSomewhere(
429 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_HEADER_RECEIVED,
430 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26431 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.
ttuttle859dc7a2015-04-23 19:42:29439 pos = ExpectLogContainsSomewhere(
440 entries, 0, NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
441 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26442 EXPECT_LT(0, pos);
443
444 int log_stream_id;
445 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
[email protected]1e960032013-12-20 19:00:20446 EXPECT_EQ(3, log_stream_id);
[email protected]4dca587c2013-03-07 16:54:47447}
448
[email protected]cf3e3cd62014-02-05 16:16:16449TEST_P(QuicNetworkTransactionTest, QuicProxy) {
tbansaled0aecc2015-02-20 03:44:18450 params_.enable_quic_for_proxies = true;
[email protected]cf3e3cd62014-02-05 16:16:16451 proxy_service_.reset(
452 ProxyService::CreateFixedFromPacResult("QUIC myproxy:70"));
453
[email protected]cf3e3cd62014-02-05 16:16:16454 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03455 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05456 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03457 GetRequestHeaders("GET", "http", "/")));
458 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05459 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:03460 GetResponseHeaders("200 OK")));
461 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05462 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03463 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
[email protected]cf3e3cd62014-02-05 16:16:16464 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
465
rcha5399e02015-04-21 19:32:04466 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cf3e3cd62014-02-05 16:16:16467
468 // There is no need to set up an alternate protocol job, because
469 // no attempt will be made to speak to the proxy over TCP.
470
471 CreateSession();
472
bnc62a44f022015-04-02 15:59:41473 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
[email protected]cf3e3cd62014-02-05 16:16:16474}
475
[email protected]1e960032013-12-20 19:00:20476TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
[email protected]49e85332013-06-04 04:18:03477 params_.origin_to_force_quic_on =
478 HostPortPair::FromString("www.google.com:80");
[email protected]cebe3282013-05-22 23:49:30479
[email protected]1e960032013-12-20 19:00:20480 MockQuicData mock_quic_data;
481 mock_quic_data.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
482
rcha5399e02015-04-21 19:32:04483 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cebe3282013-05-22 23:49:30484
485 CreateSession();
486
487 scoped_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50488 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
[email protected]cebe3282013-05-22 23:49:30489 TestCompletionCallback callback;
490 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
491 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]0b2294d32013-08-02 00:46:36492 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
[email protected]cebe3282013-05-22 23:49:30493}
494
[email protected]1e960032013-12-20 19:00:20495TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
[email protected]4dca587c2013-03-07 16:54:47496 // Attempt to "force" quic on 443, which will not be honored.
[email protected]49e85332013-06-04 04:18:03497 params_.origin_to_force_quic_on =
498 HostPortPair::FromString("www.google.com:443");
[email protected]4dca587c2013-03-07 16:54:47499
[email protected]aa9b14d2013-05-10 23:45:19500 MockRead http_reads[] = {
[email protected]4dca587c2013-03-07 16:54:47501 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
502 MockRead("hello world"),
503 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
504 MockRead(ASYNC, OK)
505 };
506
rtennetibe635732014-10-02 22:51:42507 StaticSocketDataProvider data(http_reads, arraysize(http_reads), nullptr, 0);
[email protected]4dca587c2013-03-07 16:54:47508 socket_factory_.AddSocketDataProvider(&data);
509 SSLSocketDataProvider ssl(ASYNC, OK);
510 socket_factory_.AddSSLSocketDataProvider(&ssl);
511
[email protected]4dca587c2013-03-07 16:54:47512 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47513
[email protected]aa9b14d2013-05-10 23:45:19514 SendRequestAndExpectHttpResponse("hello world");
[email protected]4dca587c2013-03-07 16:54:47515}
516
[email protected]1e960032013-12-20 19:00:20517TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
[email protected]aa9b14d2013-05-10 23:45:19518 MockRead http_reads[] = {
[email protected]61a527782013-02-21 03:58:00519 MockRead("HTTP/1.1 200 OK\r\n"),
520 MockRead(kQuicAlternateProtocolHttpHeader),
521 MockRead("hello world"),
522 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
523 MockRead(ASYNC, OK)
524 };
525
[email protected]aa9b14d2013-05-10 23:45:19526 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:42527 nullptr, 0);
[email protected]aa9b14d2013-05-10 23:45:19528 socket_factory_.AddSocketDataProvider(&http_data);
[email protected]61a527782013-02-21 03:58:00529
[email protected]1e960032013-12-20 19:00:20530 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03531 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05532 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03533 GetRequestHeaders("GET", "http", "/")));
534 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05535 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:03536 GetResponseHeaders("200 OK")));
537 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05538 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03539 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
[email protected]1e960032013-12-20 19:00:20540 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
[email protected]61a527782013-02-21 03:58:00541
rcha5399e02015-04-21 19:32:04542 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]61a527782013-02-21 03:58:00543
[email protected]aa9b14d2013-05-10 23:45:19544 // The non-alternate protocol job needs to hang in order to guarantee that
545 // the alternate-protocol job will "win".
546 AddHangingNonAlternateProtocolSocketData();
[email protected]61a527782013-02-21 03:58:00547
[email protected]d7599122014-05-24 03:37:23548 CreateSessionWithNextProtos();
[email protected]61a527782013-02-21 03:58:00549
[email protected]aa9b14d2013-05-10 23:45:19550 SendRequestAndExpectHttpResponse("hello world");
551 SendRequestAndExpectQuicResponse("hello!");
[email protected]61a527782013-02-21 03:58:00552}
553
bnc62a44f022015-04-02 15:59:41554TEST_P(QuicNetworkTransactionTest, AlternateProtocolDifferentPort) {
555 MockRead http_reads[] = {
556 MockRead("HTTP/1.1 200 OK\r\n"),
557 MockRead(kQuicAlternateProtocolDifferentPortHttpHeader),
558 MockRead("hello world"),
559 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
560 MockRead(ASYNC, OK)};
561
562 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
563 0);
564 socket_factory_.AddSocketDataProvider(&http_data);
565
566 MockQuicData mock_quic_data;
567 mock_quic_data.AddWrite(
568 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
569 GetRequestHeaders("GET", "http", "/")));
570 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
571 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
572 mock_quic_data.AddRead(
573 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
574 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
575 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
576
rcha5399e02015-04-21 19:32:04577 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bnc62a44f022015-04-02 15:59:41578
579 // The non-alternate protocol job needs to hang in order to guarantee that
580 // the alternate-protocol job will "win".
581 AddHangingNonAlternateProtocolSocketData();
582
583 CreateSessionWithNextProtos();
584
585 SendRequestAndExpectHttpResponse("hello world");
586 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
587}
588
bncae8db8402015-03-26 20:13:50589TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) {
590 MockRead http_reads[] = {
591 MockRead("HTTP/1.1 200 OK\r\n"),
592 MockRead(kQuicAlternateProtocolHttpHeader),
593 MockRead("hello world"),
594 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
595 MockRead(ASYNC, OK)};
596
597 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
598 0);
599 socket_factory_.AddSocketDataProvider(&http_data);
600
601 MockQuicData mock_quic_data;
602 mock_quic_data.AddWrite(
603 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
604 GetRequestHeaders("GET", "http", "/")));
605 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
606 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
607 mock_quic_data.AddRead(
608 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
609 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
610 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
611
rcha5399e02015-04-21 19:32:04612 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bncae8db8402015-03-26 20:13:50613
614 // The non-alternate protocol job needs to hang in order to guarantee that
615 // the alternate-protocol job will "win".
616 AddHangingNonAlternateProtocolSocketData();
617
618 CreateSessionWithNextProtos();
619
620 AlternativeService alternative_service(QUIC,
621 HostPortPair::FromURL(request_.url));
622 session_->http_server_properties()->MarkAlternativeServiceRecentlyBroken(
623 alternative_service);
624 EXPECT_TRUE(
625 session_->http_server_properties()->WasAlternativeServiceRecentlyBroken(
626 alternative_service));
627
628 SendRequestAndExpectHttpResponse("hello world");
629 SendRequestAndExpectQuicResponse("hello!");
630
631 EXPECT_FALSE(
632 session_->http_server_properties()->WasAlternativeServiceRecentlyBroken(
633 alternative_service));
634}
635
[email protected]287d9412014-07-08 23:01:00636TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolProbabilityForQuic) {
637 MockRead http_reads[] = {
638 MockRead("HTTP/1.1 200 OK\r\n"),
639 MockRead(kQuicAlternateProtocol50pctHttpHeader),
640 MockRead("hello world"),
641 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
642 MockRead(ASYNC, OK)
643 };
644
645 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:42646 nullptr, 0);
[email protected]287d9412014-07-08 23:01:00647 socket_factory_.AddSocketDataProvider(&http_data);
648
649 MockQuicData mock_quic_data;
650 mock_quic_data.AddWrite(
651 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
652 GetRequestHeaders("GET", "http", "/")));
653 mock_quic_data.AddRead(
654 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
655 GetResponseHeaders("200 OK")));
656 mock_quic_data.AddRead(
657 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
658 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
659 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
660
rcha5399e02015-04-21 19:32:04661 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]287d9412014-07-08 23:01:00662
663 // The non-alternate protocol job needs to hang in order to guarantee that
664 // the alternate-protocol job will "win".
665 AddHangingNonAlternateProtocolSocketData();
666
bnc62891a52015-04-27 14:14:12667 params_.alternative_service_probability_threshold = .25;
[email protected]287d9412014-07-08 23:01:00668 CreateSessionWithNextProtos();
669
670 SendRequestAndExpectHttpResponse("hello world");
671 SendRequestAndExpectQuicResponse("hello!");
672}
673
674TEST_P(QuicNetworkTransactionTest, DontUseAlternateProtocolProbabilityForQuic) {
675 MockRead http_reads[] = {
676 MockRead("HTTP/1.1 200 OK\r\n"),
677 MockRead(kQuicAlternateProtocol50pctHttpHeader),
678 MockRead("hello world"),
679 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
680 MockRead(ASYNC, OK)
681 };
682
683 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:42684 nullptr, 0);
[email protected]287d9412014-07-08 23:01:00685 socket_factory_.AddSocketDataProvider(&http_data);
686 socket_factory_.AddSocketDataProvider(&http_data);
687
bnc62891a52015-04-27 14:14:12688 params_.alternative_service_probability_threshold = .75;
[email protected]287d9412014-07-08 23:01:00689 CreateSessionWithNextProtos();
690
691 SendRequestAndExpectHttpResponse("hello world");
692 SendRequestAndExpectHttpResponse("hello world");
693}
694
rch405ed7a2015-05-12 01:10:16695TEST_P(QuicNetworkTransactionTest, DontUseAlternateProtocolForInsecureQuic) {
696 MockRead http_reads[] = {MockRead("HTTP/1.1 200 OK\r\n"),
697 MockRead("Content-length: 11\r\n"),
698 MockRead("Alternate-Protocol: 443:quic\r\n\r\n"),
699 MockRead("hello world"),
700 MockRead("HTTP/1.1 200 OK\r\n"),
701 MockRead("Content-length: 11\r\n"),
702 MockRead("Alternate-Protocol: 443:quic\r\n\r\n"),
703 MockRead("hello world"),
704 MockRead(ASYNC, OK)};
705
706 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
707 0);
708 socket_factory_.AddSocketDataProvider(&http_data);
709 socket_factory_.AddSocketDataProvider(&http_data);
710
711 params_.disable_insecure_quic = true;
712 CreateSessionWithNextProtos();
713
714 SendRequestAndExpectHttpResponse("hello world");
715 SendRequestAndExpectHttpResponse("hello world");
716}
717
[email protected]287d9412014-07-08 23:01:00718TEST_P(QuicNetworkTransactionTest,
719 DontUseAlternateProtocolWithBadProbabilityForQuic) {
720 MockRead http_reads[] = {
721 MockRead("HTTP/1.1 200 OK\r\n"),
722 MockRead("Alternate-Protocol: 443:quic,p=2\r\n\r\n"),
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]287d9412014-07-08 23:01:00730 socket_factory_.AddSocketDataProvider(&http_data);
731 socket_factory_.AddSocketDataProvider(&http_data);
732
bnc62891a52015-04-27 14:14:12733 params_.alternative_service_probability_threshold = .75;
[email protected]287d9412014-07-08 23:01:00734 CreateSessionWithNextProtos();
735
736 SendRequestAndExpectHttpResponse("hello world");
737 SendRequestAndExpectHttpResponse("hello world");
738}
739
[email protected]1e960032013-12-20 19:00:20740TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) {
[email protected]6d1b4ed2013-07-10 03:57:54741 params_.origin_to_force_quic_on =
742 HostPortPair::FromString("www.google.com:443");
[email protected]6d1b4ed2013-07-10 03:57:54743
744 MockRead http_reads[] = {
745 MockRead("HTTP/1.1 200 OK\r\n"),
746 MockRead(kQuicAlternateProtocolHttpsHeader),
747 MockRead("hello world"),
748 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
749 MockRead(ASYNC, OK)
750 };
751
752 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:42753 nullptr, 0);
[email protected]6d1b4ed2013-07-10 03:57:54754 socket_factory_.AddSocketDataProvider(&http_data);
755
[email protected]1e960032013-12-20 19:00:20756 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03757 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05758 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03759 GetRequestHeaders("GET", "http", "/")));
760 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05761 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:03762 GetResponseHeaders("200 OK")));
763 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05764 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03765 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
[email protected]1e960032013-12-20 19:00:20766 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
[email protected]6d1b4ed2013-07-10 03:57:54767
rcha5399e02015-04-21 19:32:04768 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]6d1b4ed2013-07-10 03:57:54769
770 // The non-alternate protocol job needs to hang in order to guarantee that
771 // the alternate-protocol job will "win".
772 AddHangingNonAlternateProtocolSocketData();
773
[email protected]d7599122014-05-24 03:37:23774 CreateSessionWithNextProtos();
[email protected]6d1b4ed2013-07-10 03:57:54775
776 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
777 SendRequestAndExpectHttpResponse("hello world");
778}
779
[email protected]1e960032013-12-20 19:00:20780TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) {
[email protected]dda75ab2013-06-22 22:43:30781 crypto_client_stream_factory_.set_handshake_mode(
782 MockCryptoClientStream::COLD_START);
783
784 MockWrite http_writes[] = {
785 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
786 MockWrite(SYNCHRONOUS, 1, "Host: www.google.com\r\n"),
787 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")
788 };
789
790 MockRead http_reads[] = {
791 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
792 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHttpHeader),
793 MockRead(SYNCHRONOUS, 5, "hello world"),
794 MockRead(SYNCHRONOUS, OK, 6)
795 };
796
797 DeterministicMockClientSocketFactory socket_factory;
798
799 DeterministicSocketData http_data(http_reads, arraysize(http_reads),
800 http_writes, arraysize(http_writes));
801 socket_factory.AddSocketDataProvider(&http_data);
802
803 // The QUIC transaction will not be allowed to complete.
804 MockWrite quic_writes[] = {
805 MockWrite(ASYNC, ERR_IO_PENDING, 0)
806 };
807 MockRead quic_reads[] = {
808 MockRead(ASYNC, ERR_IO_PENDING, 1),
809 };
810 DeterministicSocketData quic_data(quic_reads, arraysize(quic_reads),
811 quic_writes, arraysize(quic_writes));
812 socket_factory.AddSocketDataProvider(&quic_data);
813
814 // The HTTP transaction will complete.
815 DeterministicSocketData http_data2(http_reads, arraysize(http_reads),
816 http_writes, arraysize(http_writes));
817 socket_factory.AddSocketDataProvider(&http_data2);
818
[email protected]d7599122014-05-24 03:37:23819 CreateSessionWithFactory(&socket_factory, true);
[email protected]dda75ab2013-06-22 22:43:30820
821 // Run the first request.
822 http_data.StopAfter(arraysize(http_reads) + arraysize(http_writes));
823 SendRequestAndExpectHttpResponse("hello world");
rchb6dc73572015-05-08 04:01:07824 ASSERT_TRUE(http_data.at_read_eof());
825 ASSERT_TRUE(http_data.at_write_eof());
[email protected]dda75ab2013-06-22 22:43:30826
827 // Now run the second request in which the QUIC socket hangs,
828 // and verify the the transaction continues over HTTP.
829 http_data2.StopAfter(arraysize(http_reads) + arraysize(http_writes));
830 SendRequestAndExpectHttpResponse("hello world");
831
rchb6dc73572015-05-08 04:01:07832 ASSERT_TRUE(http_data2.at_read_eof());
833 ASSERT_TRUE(http_data2.at_write_eof());
834 ASSERT_TRUE(!quic_data.at_read_eof());
835 ASSERT_TRUE(!quic_data.at_write_eof());
[email protected]dda75ab2013-06-22 22:43:30836}
837
[email protected]1e960032013-12-20 19:00:20838TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
[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
[email protected]8ba81212013-05-03 13:11:48850
rcha5399e02015-04-21 19:32:04851 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]8ba81212013-05-03 13:11:48852
[email protected]3a120a6b2013-06-25 01:08:27853 // The non-alternate protocol job needs to hang in order to guarantee that
854 // the alternate-protocol job will "win".
[email protected]dda75ab2013-06-22 22:43:30855 AddHangingNonAlternateProtocolSocketData();
856
[email protected]d7599122014-05-24 03:37:23857 CreateSessionWithNextProtos();
[email protected]aa9b14d2013-05-10 23:45:19858 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
859 SendRequestAndExpectQuicResponse("hello!");
[email protected]8ba81212013-05-03 13:11:48860}
861
[email protected]1e960032013-12-20 19:00:20862TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
[email protected]1e960032013-12-20 19:00:20863 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03864 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05865 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03866 GetRequestHeaders("GET", "http", "/")));
867 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05868 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:03869 GetResponseHeaders("200 OK")));
870 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05871 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03872 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
[email protected]1e960032013-12-20 19:00:20873 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
rcha5399e02015-04-21 19:32:04874 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]3a120a6b2013-06-25 01:08:27875
876 // In order for a new QUIC session to be established via alternate-protocol
877 // without racing an HTTP connection, we need the host resolution to happen
878 // synchronously.
879 host_resolver_.set_synchronous_mode(true);
880 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", "");
[email protected]5109c1952013-08-20 18:44:10881 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80));
[email protected]3a120a6b2013-06-25 01:08:27882 AddressList address;
[email protected]5109c1952013-08-20 18:44:10883 host_resolver_.Resolve(info,
884 DEFAULT_PRIORITY,
885 &address,
886 CompletionCallback(),
rtennetibe635732014-10-02 22:51:42887 nullptr,
[email protected]3a120a6b2013-06-25 01:08:27888 net_log_.bound());
889
[email protected]d7599122014-05-24 03:37:23890 CreateSessionWithNextProtos();
[email protected]3a120a6b2013-06-25 01:08:27891 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
892 SendRequestAndExpectQuicResponse("hello!");
893}
894
[email protected]0fc924b2014-03-31 04:34:15895TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) {
896 proxy_service_.reset(
897 ProxyService::CreateFixedFromPacResult("PROXY myproxy:70"));
[email protected]0fc924b2014-03-31 04:34:15898
899 // Since we are using a proxy, the QUIC job will not succeed.
900 MockWrite http_writes[] = {
901 MockWrite(SYNCHRONOUS, 0, "GET http://www.google.com/ HTTP/1.1\r\n"),
902 MockWrite(SYNCHRONOUS, 1, "Host: www.google.com\r\n"),
903 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")
904 };
905
906 MockRead http_reads[] = {
907 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
908 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHttpHeader),
909 MockRead(SYNCHRONOUS, 5, "hello world"),
910 MockRead(SYNCHRONOUS, OK, 6)
911 };
912
913 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
914 http_writes, arraysize(http_writes));
915 socket_factory_.AddSocketDataProvider(&http_data);
916
917 // In order for a new QUIC session to be established via alternate-protocol
918 // without racing an HTTP connection, we need the host resolution to happen
919 // synchronously.
920 host_resolver_.set_synchronous_mode(true);
921 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", "");
922 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80));
923 AddressList address;
924 host_resolver_.Resolve(info,
925 DEFAULT_PRIORITY,
926 &address,
927 CompletionCallback(),
rtennetibe635732014-10-02 22:51:42928 nullptr,
[email protected]0fc924b2014-03-31 04:34:15929 net_log_.bound());
930
[email protected]d7599122014-05-24 03:37:23931 CreateSessionWithNextProtos();
[email protected]0fc924b2014-03-31 04:34:15932 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
933 SendRequestAndExpectHttpResponse("hello world");
934}
935
[email protected]1e960032013-12-20 19:00:20936TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
[email protected]1e960032013-12-20 19:00:20937 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03938 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05939 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03940 GetRequestHeaders("GET", "http", "/")));
941 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05942 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:03943 GetResponseHeaders("200 OK")));
944 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05945 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03946 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
[email protected]1e960032013-12-20 19:00:20947 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
rcha5399e02015-04-21 19:32:04948 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]11c05872013-08-20 02:04:12949
950 // The non-alternate protocol job needs to hang in order to guarantee that
951 // the alternate-protocol job will "win".
952 AddHangingNonAlternateProtocolSocketData();
953
954 // In order for a new QUIC session to be established via alternate-protocol
955 // without racing an HTTP connection, we need the host resolution to happen
956 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
957 // connection to the the server, in this test we require confirmation
958 // before encrypting so the HTTP job will still start.
959 host_resolver_.set_synchronous_mode(true);
960 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", "");
[email protected]5109c1952013-08-20 18:44:10961 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80));
[email protected]11c05872013-08-20 02:04:12962 AddressList address;
[email protected]5109c1952013-08-20 18:44:10963 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address,
rtennetibe635732014-10-02 22:51:42964 CompletionCallback(), nullptr, net_log_.bound());
[email protected]11c05872013-08-20 02:04:12965
[email protected]d7599122014-05-24 03:37:23966 CreateSessionWithNextProtos();
[email protected]11c05872013-08-20 02:04:12967 session_->quic_stream_factory()->set_require_confirmation(true);
968 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
969
970 scoped_ptr<HttpNetworkTransaction> trans(
971 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
972 TestCompletionCallback callback;
973 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
974 EXPECT_EQ(ERR_IO_PENDING, rv);
975
976 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
977 QuicSession::HANDSHAKE_CONFIRMED);
978 EXPECT_EQ(OK, callback.WaitForResult());
979}
980
[email protected]1e960032013-12-20 19:00:20981TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
[email protected]3316d422013-05-03 21:45:30982 // Alternate-protocol job
983 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1));
984 MockRead quic_reads[] = {
985 MockRead(ASYNC, close->data(), close->length()),
986 MockRead(ASYNC, OK), // EOF
987 };
988 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:42989 nullptr, 0);
[email protected]3316d422013-05-03 21:45:30990 socket_factory_.AddSocketDataProvider(&quic_data);
991
992 // Main job which will succeed even though the alternate job fails.
993 MockRead http_reads[] = {
994 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
995 MockRead("hello from http"),
996 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
997 MockRead(ASYNC, OK)
998 };
999
1000 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421001 nullptr, 0);
[email protected]3316d422013-05-03 21:45:301002 socket_factory_.AddSocketDataProvider(&http_data);
1003
[email protected]d7599122014-05-24 03:37:231004 CreateSessionWithNextProtos();
[email protected]aa9b14d2013-05-10 23:45:191005 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1006 SendRequestAndExpectHttpResponse("hello from http");
1007 ExpectBrokenAlternateProtocolMapping();
[email protected]3316d422013-05-03 21:45:301008}
1009
[email protected]1e960032013-12-20 19:00:201010TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
[email protected]d03a66d2013-05-06 12:55:591011 // Alternate-protocol job
1012 MockRead quic_reads[] = {
1013 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
1014 };
1015 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421016 nullptr, 0);
[email protected]d03a66d2013-05-06 12:55:591017 socket_factory_.AddSocketDataProvider(&quic_data);
1018
1019 // Main job which will succeed even though the alternate job fails.
1020 MockRead http_reads[] = {
1021 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
1022 MockRead("hello from http"),
1023 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1024 MockRead(ASYNC, OK)
1025 };
1026
1027 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421028 nullptr, 0);
[email protected]d03a66d2013-05-06 12:55:591029 socket_factory_.AddSocketDataProvider(&http_data);
1030
[email protected]d7599122014-05-24 03:37:231031 CreateSessionWithNextProtos();
[email protected]d03a66d2013-05-06 12:55:591032
[email protected]aa9b14d2013-05-10 23:45:191033 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1034 SendRequestAndExpectHttpResponse("hello from http");
1035 ExpectBrokenAlternateProtocolMapping();
[email protected]d03a66d2013-05-06 12:55:591036}
1037
[email protected]00c159f2014-05-21 22:38:161038TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) {
[email protected]eb71ab62014-05-23 07:57:531039 // Alternate-protocol job will fail when the session attempts to read.
[email protected]00c159f2014-05-21 22:38:161040 MockRead quic_reads[] = {
1041 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
1042 };
1043 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421044 nullptr, 0);
[email protected]00c159f2014-05-21 22:38:161045 socket_factory_.AddSocketDataProvider(&quic_data);
1046
[email protected]eb71ab62014-05-23 07:57:531047 // Main job will also fail.
[email protected]00c159f2014-05-21 22:38:161048 MockRead http_reads[] = {
1049 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
1050 };
1051
1052 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421053 nullptr, 0);
[email protected]00c159f2014-05-21 22:38:161054 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED));
1055 socket_factory_.AddSocketDataProvider(&http_data);
1056
[email protected]d7599122014-05-24 03:37:231057 CreateSessionWithNextProtos();
[email protected]00c159f2014-05-21 22:38:161058
1059 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1060 scoped_ptr<HttpNetworkTransaction> trans(
1061 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1062 TestCompletionCallback callback;
1063 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1064 EXPECT_EQ(ERR_IO_PENDING, rv);
1065 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult());
1066 ExpectQuicAlternateProtocolMapping();
1067}
1068
[email protected]1e960032013-12-20 19:00:201069TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
[email protected]77c6c162013-08-17 02:57:451070 // Alternate-protocol job
1071 MockRead quic_reads[] = {
1072 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
1073 };
1074 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421075 nullptr, 0);
[email protected]77c6c162013-08-17 02:57:451076 socket_factory_.AddSocketDataProvider(&quic_data);
1077
1078 AddHangingNonAlternateProtocolSocketData();
1079
[email protected]c92c1b52014-05-31 04:16:061080 // Second Alternate-protocol job which will race with the TCP job.
1081 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421082 nullptr, 0);
[email protected]c92c1b52014-05-31 04:16:061083 socket_factory_.AddSocketDataProvider(&quic_data2);
1084
[email protected]4d283b32013-10-17 12:57:271085 // Final job that will proceed when the QUIC job fails.
1086 MockRead http_reads[] = {
1087 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
1088 MockRead("hello from http"),
1089 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1090 MockRead(ASYNC, OK)
1091 };
1092
1093 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421094 nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271095 socket_factory_.AddSocketDataProvider(&http_data);
1096
[email protected]d7599122014-05-24 03:37:231097 CreateSessionWithNextProtos();
[email protected]77c6c162013-08-17 02:57:451098
1099 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1100
[email protected]4d283b32013-10-17 12:57:271101 SendRequestAndExpectHttpResponse("hello from http");
[email protected]77c6c162013-08-17 02:57:451102
1103 ExpectBrokenAlternateProtocolMapping();
[email protected]4d283b32013-10-17 12:57:271104
rchb6dc73572015-05-08 04:01:071105 EXPECT_TRUE(quic_data.at_read_eof());
1106 EXPECT_TRUE(quic_data.at_write_eof());
[email protected]77c6c162013-08-17 02:57:451107}
1108
[email protected]93b31772014-06-19 08:03:351109TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) {
[email protected]65768442014-06-06 23:37:031110 // Alternate-protocol job
1111 MockRead quic_reads[] = {
1112 MockRead(ASYNC, ERR_IO_PENDING),
1113 };
1114 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421115 nullptr, 0);
[email protected]65768442014-06-06 23:37:031116 socket_factory_.AddSocketDataProvider(&quic_data);
1117
1118 // Main job that will proceed when the QUIC job fails.
1119 MockRead http_reads[] = {
1120 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
1121 MockRead("hello from http"),
1122 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1123 MockRead(ASYNC, OK)
1124 };
1125
1126 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421127 nullptr, 0);
[email protected]65768442014-06-06 23:37:031128 socket_factory_.AddSocketDataProvider(&http_data);
1129
1130 CreateSessionWithNextProtos();
1131
1132 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1133
1134 SendRequestAndExpectHttpResponse("hello from http");
1135}
1136
[email protected]eb71ab62014-05-23 07:57:531137TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
[email protected]4d590c9c2014-05-02 05:14:331138 // Alternate-protocol job will fail before creating a QUIC session.
rtennetibe635732014-10-02 22:51:421139 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0);
[email protected]4d590c9c2014-05-02 05:14:331140 quic_data.set_connect_data(MockConnect(SYNCHRONOUS,
1141 ERR_INTERNET_DISCONNECTED));
1142 socket_factory_.AddSocketDataProvider(&quic_data);
1143
1144 // Main job which will succeed even though the alternate job fails.
1145 MockRead http_reads[] = {
1146 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
1147 MockRead("hello from http"),
1148 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1149 MockRead(ASYNC, OK)
1150 };
1151
1152 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421153 nullptr, 0);
[email protected]4d590c9c2014-05-02 05:14:331154 socket_factory_.AddSocketDataProvider(&http_data);
1155
[email protected]d7599122014-05-24 03:37:231156 CreateSessionWithNextProtos();
[email protected]4d590c9c2014-05-02 05:14:331157 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1158 SendRequestAndExpectHttpResponse("hello from http");
[email protected]eb71ab62014-05-23 07:57:531159
1160 ExpectBrokenAlternateProtocolMapping();
[email protected]4d590c9c2014-05-02 05:14:331161}
1162
[email protected]4fee9672014-01-08 14:47:151163TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
[email protected]4fee9672014-01-08 14:47:151164 MockQuicData mock_quic_data;
rcha5399e02015-04-21 19:32:041165 mock_quic_data.AddSynchronousRead(ConstructConnectionClosePacket(1));
[email protected]92bf17c2014-03-03 21:14:031166 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051167 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:031168 GetRequestHeaders("GET", "http", "/")));
1169 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rcha5399e02015-04-21 19:32:041170 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4fee9672014-01-08 14:47:151171
1172 // When the QUIC connection fails, we will try the request again over HTTP.
1173 MockRead http_reads[] = {
1174 MockRead("HTTP/1.1 200 OK\r\n"),
1175 MockRead(kQuicAlternateProtocolHttpHeader),
1176 MockRead("hello world"),
1177 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1178 MockRead(ASYNC, OK)
1179 };
1180
1181 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421182 nullptr, 0);
[email protected]4fee9672014-01-08 14:47:151183 socket_factory_.AddSocketDataProvider(&http_data);
1184
1185 // In order for a new QUIC session to be established via alternate-protocol
1186 // without racing an HTTP connection, we need the host resolution to happen
1187 // synchronously.
1188 host_resolver_.set_synchronous_mode(true);
1189 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", "");
1190 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80));
1191 AddressList address;
1192 host_resolver_.Resolve(info,
1193 DEFAULT_PRIORITY,
1194 &address,
1195 CompletionCallback(),
rtennetibe635732014-10-02 22:51:421196 nullptr,
[email protected]4fee9672014-01-08 14:47:151197 net_log_.bound());
1198
[email protected]d7599122014-05-24 03:37:231199 CreateSessionWithNextProtos();
[email protected]4fee9672014-01-08 14:47:151200 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1201 SendRequestAndExpectHttpResponse("hello world");
1202}
1203
bnc508835902015-05-12 20:10:291204// Test that a secure request over an insecure QUIC connection fails with
1205// the appropriate error code. Note that this never happens in production,
1206// because the handshake (which this test mocks) would fail in this scenario.
1207TEST_P(QuicNetworkTransactionTest, SecureResourceOverInsecureQuic) {
1208 MockQuicData mock_quic_data;
1209 mock_quic_data.AddWrite(
1210 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1211 GetRequestHeaders("GET", "https", "/")));
1212 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1213 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1214 mock_quic_data.AddRead(
1215 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1216 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1217 mock_quic_data.AddRead(SYNCHRONOUS, 0);
1218 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1219
1220 request_.url = GURL("https://www.google.com:443");
1221 AddHangingNonAlternateProtocolSocketData();
1222 CreateSessionWithNextProtos();
1223 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
1224 scoped_ptr<HttpNetworkTransaction> trans(
1225 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1226 TestCompletionCallback callback;
1227 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1228 EXPECT_EQ(ERR_REQUEST_FOR_SECURE_RESOURCE_OVER_INSECURE_QUIC,
1229 callback.GetResult(rv));
1230}
1231
1232TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) {
1233 MockQuicData mock_quic_data;
1234 mock_quic_data.AddWrite(
1235 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1236 GetRequestHeaders("GET", "https", "/")));
1237 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1238 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1239 mock_quic_data.AddRead(
1240 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1241 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1242 mock_quic_data.AddRead(SYNCHRONOUS, 0);
1243 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1244
1245 scoped_refptr<X509Certificate> cert(
1246 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
1247 ASSERT_TRUE(cert.get());
1248 ProofVerifyDetailsChromium verify_details;
1249 verify_details.cert_verify_result.verified_cert = cert;
1250 crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
1251
1252 request_.url = GURL("https://www.google.com:443");
1253 AddHangingNonAlternateProtocolSocketData();
1254 CreateSessionWithNextProtos();
1255 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
1256 SendRequestAndExpectQuicResponse("hello!");
1257}
1258
[email protected]61a527782013-02-21 03:58:001259} // namespace test
1260} // namespace net