blob: 6b174ccbb7e09c20fc76c1a8f0fa071b9f1093ad [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/compiler_specific.h"
Avi Drissman13fc8932015-12-20 04:40:468#include "base/macros.h"
[email protected]61a527782013-02-21 03:58:009#include "base/memory/scoped_ptr.h"
mmenke651bae7f2015-12-18 21:26:4510#include "base/run_loop.h"
[email protected]98b20ce2013-05-10 05:55:2611#include "base/stl_util.h"
bnc8be55ebb2015-10-30 14:12:0712#include "base/strings/stringprintf.h"
rtenneti56977812016-01-15 19:26:5613#include "net/base/chunked_upload_data_stream.h"
tbansalfdf5665b2015-09-21 22:46:4014#include "net/base/network_quality_estimator.h"
15#include "net/base/socket_performance_watcher.h"
[email protected]61a527782013-02-21 03:58:0016#include "net/base/test_completion_callback.h"
bnc508835902015-05-12 20:10:2917#include "net/base/test_data_directory.h"
[email protected]6e7845ae2013-03-29 21:48:1118#include "net/cert/mock_cert_verifier.h"
rtenneti052774e2015-11-24 21:00:1219#include "net/cert/multi_log_ct_verifier.h"
[email protected]f2cb3cf2013-03-21 01:40:5320#include "net/dns/mock_host_resolver.h"
[email protected]61a527782013-02-21 03:58:0021#include "net/http/http_auth_handler_factory.h"
22#include "net/http/http_network_session.h"
23#include "net/http/http_network_transaction.h"
24#include "net/http/http_server_properties_impl.h"
25#include "net/http/http_stream.h"
26#include "net/http/http_stream_factory.h"
[email protected]c41737d2014-05-14 07:47:1927#include "net/http/http_transaction_test_util.h"
[email protected]b1c988b2013-06-13 06:48:1128#include "net/http/transport_security_state.h"
vishal.b62985ca92015-04-17 08:45:5129#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4630#include "net/log/test_net_log_entry.h"
31#include "net/log/test_net_log_util.h"
[email protected]61a527782013-02-21 03:58:0032#include "net/proxy/proxy_config_service_fixed.h"
33#include "net/proxy/proxy_resolver.h"
34#include "net/proxy/proxy_service.h"
bnc508835902015-05-12 20:10:2935#include "net/quic/crypto/proof_verifier_chromium.h"
[email protected]61a527782013-02-21 03:58:0036#include "net/quic/crypto/quic_decrypter.h"
37#include "net/quic/crypto/quic_encrypter.h"
38#include "net/quic/quic_framer.h"
[email protected]24e5bc52013-09-18 15:36:5839#include "net/quic/quic_http_utils.h"
[email protected]ed3fc15d2013-03-08 18:37:4440#include "net/quic/test_tools/crypto_test_utils.h"
[email protected]61a527782013-02-21 03:58:0041#include "net/quic/test_tools/mock_clock.h"
[email protected]e8ff26842013-03-22 21:02:0542#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
[email protected]61a527782013-02-21 03:58:0043#include "net/quic/test_tools/mock_random.h"
[email protected]1e960032013-12-20 19:00:2044#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]61a527782013-02-21 03:58:0045#include "net/quic/test_tools/quic_test_utils.h"
46#include "net/socket/client_socket_factory.h"
47#include "net/socket/mock_client_socket_pool_manager.h"
48#include "net/socket/socket_test_util.h"
49#include "net/socket/ssl_client_socket.h"
50#include "net/spdy/spdy_frame_builder.h"
51#include "net/spdy/spdy_framer.h"
[email protected]536fd0b2013-03-14 17:41:5752#include "net/ssl/ssl_config_service_defaults.h"
bnc508835902015-05-12 20:10:2953#include "net/test/cert_test_util.h"
[email protected]61a527782013-02-21 03:58:0054#include "testing/gtest/include/gtest/gtest.h"
55#include "testing/platform_test.h"
56
bnc508835902015-05-12 20:10:2957namespace net {
58namespace test {
[email protected]61a527782013-02-21 03:58:0059
60namespace {
61
rchf114d982015-10-21 01:34:5662static const char kQuicAlternateProtocolHeader[] =
[email protected]6d1b4ed2013-07-10 03:57:5463 "Alternate-Protocol: 443:quic\r\n\r\n";
rchf114d982015-10-21 01:34:5664static const char kQuicAlternateProtocolDifferentPortHeader[] =
65 "Alternate-Protocol: 137:quic\r\n\r\n";
66static const char kQuicAlternativeServiceHeader[] =
bncc958faa2015-07-31 18:14:5267 "Alt-Svc: quic=\":443\"\r\n\r\n";
rchf114d982015-10-21 01:34:5668static const char kQuicAlternativeServiceDifferentPortHeader[] =
69 "Alt-Svc: quic=\":137\"\r\n\r\n";
[email protected]1e960032013-12-20 19:00:2070
rch9ae5b3b2016-02-11 00:36:2971const char kDefaultServerHostName[] = "mail.example.org";
bncb07c05532015-05-14 19:07:2072
[email protected]61a527782013-02-21 03:58:0073} // namespace
74
[email protected]1e960032013-12-20 19:00:2075// Helper class to encapsulate MockReads and MockWrites for QUIC.
76// Simplify ownership issues and the interaction with the MockSocketFactory.
77class MockQuicData {
78 public:
rtennetia004d332015-08-28 06:44:5779 MockQuicData() : packet_number_(0) {}
rcha5399e02015-04-21 19:32:0480
rjshaded5ced072015-12-18 19:26:0281 ~MockQuicData() { STLDeleteElements(&packets_); }
[email protected]1e960032013-12-20 19:00:2082
rcha5399e02015-04-21 19:32:0483 void AddSynchronousRead(scoped_ptr<QuicEncryptedPacket> packet) {
[email protected]1e960032013-12-20 19:00:2084 reads_.push_back(MockRead(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:5785 packet_number_++));
[email protected]1e960032013-12-20 19:00:2086 packets_.push_back(packet.release());
87 }
88
rcha5399e02015-04-21 19:32:0489 void AddRead(scoped_ptr<QuicEncryptedPacket> packet) {
90 reads_.push_back(
rtennetia004d332015-08-28 06:44:5791 MockRead(ASYNC, packet->data(), packet->length(), packet_number_++));
rcha5399e02015-04-21 19:32:0492 packets_.push_back(packet.release());
93 }
94
[email protected]1e960032013-12-20 19:00:2095 void AddRead(IoMode mode, int rv) {
rtennetia004d332015-08-28 06:44:5796 reads_.push_back(MockRead(mode, rv, packet_number_++));
[email protected]1e960032013-12-20 19:00:2097 }
98
99 void AddWrite(scoped_ptr<QuicEncryptedPacket> packet) {
100 writes_.push_back(MockWrite(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:57101 packet_number_++));
[email protected]1e960032013-12-20 19:00:20102 packets_.push_back(packet.release());
103 }
104
rcha5399e02015-04-21 19:32:04105 void AddSocketDataToFactory(MockClientSocketFactory* factory) {
rjshaded5ced072015-12-18 19:26:02106 MockRead* reads = reads_.empty() ? nullptr : &reads_[0];
107 MockWrite* writes = writes_.empty() ? nullptr : &writes_[0];
rcha5399e02015-04-21 19:32:04108 socket_data_.reset(
109 new SequencedSocketData(reads, reads_.size(), writes, writes_.size()));
[email protected]1e960032013-12-20 19:00:20110 factory->AddSocketDataProvider(socket_data_.get());
111 }
112
mmenkee24011922015-12-17 22:12:59113 void Resume() { socket_data_->Resume(); }
rchb27683c2015-07-29 23:53:50114
[email protected]1e960032013-12-20 19:00:20115 private:
116 std::vector<QuicEncryptedPacket*> packets_;
117 std::vector<MockWrite> writes_;
118 std::vector<MockRead> reads_;
rtennetia004d332015-08-28 06:44:57119 size_t packet_number_;
rchb27683c2015-07-29 23:53:50120 scoped_ptr<SequencedSocketData> socket_data_;
[email protected]1e960032013-12-20 19:00:20121};
122
tbansal7cec3812015-02-05 21:25:12123class ProxyHeadersHandler {
124 public:
125 ProxyHeadersHandler() : was_called_(false) {}
126
127 bool was_called() { return was_called_; }
128
129 void OnBeforeProxyHeadersSent(const ProxyInfo& proxy_info,
130 HttpRequestHeaders* request_headers) {
131 was_called_ = true;
132 }
133
134 private:
135 bool was_called_;
136};
137
tbansalfdf5665b2015-09-21 22:46:40138class TestNetworkQualityEstimator : public NetworkQualityEstimator {
139 public:
140 TestNetworkQualityEstimator()
141 : NetworkQualityEstimator(scoped_ptr<net::ExternalEstimateProvider>(),
tbansalc8a94ea2015-11-02 23:58:51142 std::map<std::string, std::string>()),
143 watcher_count_(0) {}
tbansalfdf5665b2015-09-21 22:46:40144
145 ~TestNetworkQualityEstimator() override {}
146
tbansalc8a94ea2015-11-02 23:58:51147 scoped_ptr<SocketPerformanceWatcher> CreateSocketPerformanceWatcher(
148 const Protocol protocol) override {
149 if (protocol != PROTOCOL_QUIC) {
150 NOTIMPLEMENTED();
151 }
152 ++watcher_count_;
153 return NetworkQualityEstimator::CreateSocketPerformanceWatcher(protocol);
tbansalfdf5665b2015-09-21 22:46:40154 }
155
tbansalc8a94ea2015-11-02 23:58:51156 size_t watcher_count() const { return watcher_count_; }
tbansalfdf5665b2015-09-21 22:46:40157
158 private:
tbansalc8a94ea2015-11-02 23:58:51159 size_t watcher_count_;
tbansalfdf5665b2015-09-21 22:46:40160 DISALLOW_COPY_AND_ASSIGN(TestNetworkQualityEstimator);
161};
162
tbansalc8a94ea2015-11-02 23:58:51163class TestRTTObserver : public NetworkQualityEstimator::RTTObserver {
164 public:
165 TestRTTObserver() : rtt_notification_received_(false) {}
166
167 bool rtt_notification_received() const { return rtt_notification_received_; }
168
169 // NetworkQualityEstimator::RttObserver implementation:
170 void OnRTTObservation(
171 int32_t rtt_ms,
172 const base::TimeTicks& timestamp,
173 net::NetworkQualityEstimator::ObservationSource source) override {
174 rtt_notification_received_ = true;
175 }
176
177 private:
178 bool rtt_notification_received_;
179};
180
[email protected]1e960032013-12-20 19:00:20181class QuicNetworkTransactionTest
182 : public PlatformTest,
[email protected]5d03bbd2014-03-07 16:19:16183 public ::testing::WithParamInterface<QuicVersion> {
[email protected]61a527782013-02-21 03:58:00184 protected:
[email protected]1c04f9522013-02-21 20:32:43185 QuicNetworkTransactionTest()
rtenneti4b06ae72014-08-26 03:43:43186 : clock_(new MockClock),
bncb07c05532015-05-14 19:07:20187 maker_(GetParam(), 0, clock_, kDefaultServerHostName),
rtenneti052774e2015-11-24 21:00:12188 cert_transparency_verifier_(new MultiLogCTVerifier()),
tbansalfdf5665b2015-09-21 22:46:40189 test_network_quality_estimator_(new TestNetworkQualityEstimator()),
[email protected]1c04f9522013-02-21 20:32:43190 ssl_config_service_(new SSLConfigServiceDefaults),
191 proxy_service_(ProxyService::CreateDirect()),
192 auth_handler_factory_(
[email protected]dda75ab2013-06-22 22:43:30193 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
[email protected]457d6952013-12-13 09:24:58194 random_generator_(0),
rchf114d982015-10-21 01:34:56195 ssl_data_(ASYNC, OK) {
[email protected]aa9b14d2013-05-10 23:45:19196 request_.method = "GET";
rchf114d982015-10-21 01:34:56197 std::string url("https://");
bncb07c05532015-05-14 19:07:20198 url.append(kDefaultServerHostName);
199 request_.url = GURL(url);
[email protected]aa9b14d2013-05-10 23:45:19200 request_.load_flags = 0;
[email protected]98a9d1252014-04-04 00:43:59201 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
rchf114d982015-10-21 01:34:56202
rch3f4b8452016-02-23 16:59:32203 params_.parse_alternative_services = true;
204 params_.enable_alternative_service_with_different_host = true;
205
rchf114d982015-10-21 01:34:56206 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29207 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
rchf114d982015-10-21 01:34:56208 verify_details_.cert_verify_result.verified_cert = cert;
209 verify_details_.cert_verify_result.is_issued_by_known_root = true;
210 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
[email protected]1c04f9522013-02-21 20:32:43211 }
[email protected]61a527782013-02-21 03:58:00212
dcheng67be2b1f2014-10-27 21:47:29213 void SetUp() override {
[email protected]61a527782013-02-21 03:58:00214 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34215 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00216 }
217
dcheng67be2b1f2014-10-27 21:47:29218 void TearDown() override {
[email protected]61a527782013-02-21 03:58:00219 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
220 // Empty the current queue.
[email protected]2da659e2013-05-23 20:51:34221 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00222 PlatformTest::TearDown();
223 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34224 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00225 }
226
[email protected]3316d422013-05-03 21:45:30227 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
rtennetia004d332015-08-28 06:44:57228 QuicPacketNumber num) {
[email protected]1e960032013-12-20 19:00:20229 return maker_.MakeConnectionClosePacket(num);
[email protected]3316d422013-05-03 21:45:30230 }
231
zhongyi6b5a3892016-03-12 04:46:20232 scoped_ptr<QuicEncryptedPacket> ConstructGoAwayPacket(
233 QuicPacketNumber num,
234 QuicErrorCode error_code,
235 std::string reason_phrase) {
236 return maker_.MakeGoAwayPacket(num, error_code, reason_phrase);
237 }
238
[email protected]61a527782013-02-21 03:58:00239 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket(
rtennetia004d332015-08-28 06:44:57240 QuicPacketNumber largest_received,
241 QuicPacketNumber least_unacked) {
zhongyi32569c62016-01-08 02:54:30242 return maker_.MakeAckPacket(2, largest_received, least_unacked,
243 least_unacked, true);
244 }
245
zhongyi6b5a3892016-03-12 04:46:20246 scoped_ptr<QuicEncryptedPacket> ConstructAckAndRstPacket(
247 QuicPacketNumber num,
248 QuicStreamId stream_id,
249 QuicRstStreamErrorCode error_code,
250 QuicPacketNumber largest_received,
251 QuicPacketNumber ack_least_unacked,
252 QuicPacketNumber stop_least_unacked) {
253 return maker_.MakeAckAndRstPacket(num, false, stream_id, error_code,
254 largest_received, ack_least_unacked,
255 stop_least_unacked, true);
256 }
257
zhongyi32569c62016-01-08 02:54:30258 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket(
259 QuicPacketNumber largest_received,
260 QuicPacketNumber least_unacked,
261 QuicTestPacketMaker* maker) {
262 return maker->MakeAckPacket(2, largest_received, least_unacked,
263 least_unacked, true);
264 }
265
266 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket(
267 QuicPacketNumber packet_number,
268 QuicPacketNumber largest_received,
269 QuicPacketNumber ack_least_unacked,
270 QuicPacketNumber stop_least_unacked) {
271 return maker_.MakeAckPacket(packet_number, largest_received,
272 ack_least_unacked, stop_least_unacked, true);
[email protected]1e960032013-12-20 19:00:20273 }
[email protected]61a527782013-02-21 03:58:00274
zhongyica364fbb2015-12-12 03:39:12275 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket(
276 QuicPacketNumber num,
277 QuicTime::Delta delta_time_largest_observed,
278 QuicPacketNumber largest_received,
279 QuicPacketNumber least_unacked,
280 QuicErrorCode quic_error,
281 std::string& quic_error_details) {
282 return maker_.MakeAckAndConnectionClosePacket(
283 num, false, delta_time_largest_observed, largest_received,
284 least_unacked, quic_error, quic_error_details);
285 }
286
287 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket(
288 QuicPacketNumber num,
289 bool include_version,
290 QuicStreamId stream_id,
291 QuicRstStreamErrorCode error_code) {
292 return maker_.MakeRstPacket(num, include_version, stream_id, error_code);
293 }
294
zhongyi32569c62016-01-08 02:54:30295 // Uses default QuicTestPacketMaker.
[email protected]1e960032013-12-20 19:00:20296 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
297 const std::string& scheme,
298 const std::string& path) {
zhongyi32569c62016-01-08 02:54:30299 return GetRequestHeaders(method, scheme, path, maker_);
300 }
301
302 // Uses customized QuicTestPacketMaker.
303 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
304 const std::string& scheme,
305 const std::string& path,
306 QuicTestPacketMaker& maker) {
307 return maker.GetRequestHeaders(method, scheme, path);
[email protected]61a527782013-02-21 03:58:00308 }
309
[email protected]1e960032013-12-20 19:00:20310 SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
311 return maker_.GetResponseHeaders(status);
[email protected]61a527782013-02-21 03:58:00312 }
313
zhongyi32569c62016-01-08 02:54:30314 // Appends alt_svc headers in the response headers.
315 SpdyHeaderBlock GetResponseHeaders(const std::string& status,
316 const std::string& alt_svc) {
317 return maker_.GetResponseHeaders(status, alt_svc);
318 }
319
[email protected]1e960032013-12-20 19:00:20320 scoped_ptr<QuicEncryptedPacket> ConstructDataPacket(
rtennetia004d332015-08-28 06:44:57321 QuicPacketNumber packet_number,
[email protected]98b20ce2013-05-10 05:55:26322 QuicStreamId stream_id,
[email protected]e8ff26842013-03-22 21:02:05323 bool should_include_version,
[email protected]61a527782013-02-21 03:58:00324 bool fin,
325 QuicStreamOffset offset,
326 base::StringPiece data) {
rtennetia004d332015-08-28 06:44:57327 return maker_.MakeDataPacket(packet_number, stream_id,
328 should_include_version, fin, offset, data);
[email protected]61a527782013-02-21 03:58:00329 }
330
[email protected]1e960032013-12-20 19:00:20331 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
rtennetia004d332015-08-28 06:44:57332 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20333 QuicStreamId stream_id,
334 bool should_include_version,
335 bool fin,
zhongyi32569c62016-01-08 02:54:30336 const SpdyHeaderBlock& headers,
337 QuicStreamOffset* offset) {
ianswett0888cff2015-11-24 17:42:16338 SpdyPriority priority =
rtennetif4bdb542015-01-21 14:33:05339 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
zhongyi32569c62016-01-08 02:54:30340 return maker_.MakeRequestHeadersPacketWithOffsetTracking(
341 packet_number, stream_id, should_include_version, fin, priority,
342 headers, offset);
343 }
344
345 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
346 QuicPacketNumber packet_number,
347 QuicStreamId stream_id,
348 bool should_include_version,
349 bool fin,
350 const SpdyHeaderBlock& headers,
351 QuicStreamOffset* offset,
352 QuicTestPacketMaker* maker) {
353 SpdyPriority priority =
354 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
355 return maker->MakeRequestHeadersPacketWithOffsetTracking(
356 packet_number, stream_id, should_include_version, fin, priority,
357 headers, offset);
358 }
359
360 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
361 QuicPacketNumber packet_number,
362 QuicStreamId stream_id,
363 bool should_include_version,
364 bool fin,
365 const SpdyHeaderBlock& headers) {
366 return ConstructRequestHeadersPacket(packet_number, stream_id,
367 should_include_version, fin, headers,
368 nullptr, &maker_);
369 }
370 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
371 QuicPacketNumber packet_number,
372 QuicStreamId stream_id,
373 bool should_include_version,
374 bool fin,
375 const SpdyHeaderBlock& headers,
376 QuicTestPacketMaker* maker) {
377 return ConstructRequestHeadersPacket(packet_number, stream_id,
378 should_include_version, fin, headers,
379 nullptr, maker);
[email protected]61a527782013-02-21 03:58:00380 }
381
[email protected]1e960032013-12-20 19:00:20382 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
rtennetia004d332015-08-28 06:44:57383 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20384 QuicStreamId stream_id,
385 bool should_include_version,
386 bool fin,
387 const SpdyHeaderBlock& headers) {
zhongyi32569c62016-01-08 02:54:30388 return ConstructResponseHeadersPacket(packet_number, stream_id,
389 should_include_version, fin, headers,
390 nullptr, &maker_);
391 }
392
393 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
394 QuicPacketNumber packet_number,
395 QuicStreamId stream_id,
396 bool should_include_version,
397 bool fin,
398 const SpdyHeaderBlock& headers,
399 QuicTestPacketMaker* maker) {
400 return ConstructResponseHeadersPacket(packet_number, stream_id,
401 should_include_version, fin, headers,
402 nullptr, maker);
403 }
404
405 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
406 QuicPacketNumber packet_number,
407 QuicStreamId stream_id,
408 bool should_include_version,
409 bool fin,
410 const SpdyHeaderBlock& headers,
411 QuicStreamOffset* offset) {
412 return maker_.MakeResponseHeadersPacketWithOffsetTracking(
413 packet_number, stream_id, should_include_version, fin, headers, offset);
414 }
415
416 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
417 QuicPacketNumber packet_number,
418 QuicStreamId stream_id,
419 bool should_include_version,
420 bool fin,
421 const SpdyHeaderBlock& headers,
422 QuicStreamOffset* offset,
423 QuicTestPacketMaker* maker) {
424 return maker->MakeResponseHeadersPacketWithOffsetTracking(
425 packet_number, stream_id, should_include_version, fin, headers, offset);
[email protected]61a527782013-02-21 03:58:00426 }
427
rch3f4b8452016-02-23 16:59:32428 void CreateSession() { CreateSessionWithFactory(&socket_factory_); }
[email protected]dda75ab2013-06-22 22:43:30429
rch3f4b8452016-02-23 16:59:32430 void CreateSessionWithFactory(ClientSocketFactory* socket_factory) {
[email protected]4dca587c2013-03-07 16:54:47431 params_.enable_quic = true;
432 params_.quic_clock = clock_;
433 params_.quic_random = &random_generator_;
[email protected]dda75ab2013-06-22 22:43:30434 params_.client_socket_factory = socket_factory;
[email protected]e8ff26842013-03-22 21:02:05435 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43436 params_.host_resolver = &host_resolver_;
437 params_.cert_verifier = &cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11438 params_.transport_security_state = &transport_security_state_;
rtenneti052774e2015-11-24 21:00:12439 params_.cert_transparency_verifier = cert_transparency_verifier_.get();
tbansalfdf5665b2015-09-21 22:46:40440 params_.socket_performance_watcher_factory =
441 test_network_quality_estimator_.get();
[email protected]1c04f9522013-02-21 20:32:43442 params_.proxy_service = proxy_service_.get();
443 params_.ssl_config_service = ssl_config_service_.get();
444 params_.http_auth_handler_factory = auth_handler_factory_.get();
bnc6be245c12015-05-15 11:24:07445 params_.http_server_properties = http_server_properties_.GetWeakPtr();
[email protected]1e960032013-12-20 19:00:20446 params_.quic_supported_versions = SupportedVersions(GetParam());
rch74da0e1a2016-01-14 02:49:32447 for (const char* host :
rch9ae5b3b2016-02-11 00:36:29448 {kDefaultServerHostName, "www.example.org", "news.example.org",
449 "bar.example.org", "foo.example.org", "invalid.example.org",
450 "mail.example.com"}) {
rch74da0e1a2016-01-14 02:49:32451 params_.quic_host_whitelist.insert(host);
452 }
[email protected]61a527782013-02-21 03:58:00453
tbansalc8a94ea2015-11-02 23:58:51454 test_network_quality_estimator_->AddRTTObserver(&rtt_observer_);
455
mmenkee65e7af2015-10-13 17:16:42456 session_.reset(new HttpNetworkSession(params_));
[email protected]11c05872013-08-20 02:04:12457 session_->quic_stream_factory()->set_require_confirmation(false);
rch185ebee2015-07-14 23:56:22458 ASSERT_EQ(params_.quic_socket_receive_buffer_size,
459 session_->quic_stream_factory()->socket_receive_buffer_size());
[email protected]61a527782013-02-21 03:58:00460 }
461
[email protected]aa9b14d2013-05-10 23:45:19462 void CheckWasQuicResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
463 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42464 ASSERT_TRUE(response != nullptr);
465 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19466 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
467 EXPECT_TRUE(response->was_fetched_via_spdy);
468 EXPECT_TRUE(response->was_npn_negotiated);
469 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
470 response->connection_info);
471 }
472
bnc62a44f022015-04-02 15:59:41473 void CheckResponsePort(const scoped_ptr<HttpNetworkTransaction>& trans,
Avi Drissman13fc8932015-12-20 04:40:46474 uint16_t port) {
bnc62a44f022015-04-02 15:59:41475 const HttpResponseInfo* response = trans->GetResponseInfo();
476 ASSERT_TRUE(response != nullptr);
477 EXPECT_EQ(port, response->socket_address.port());
478 }
479
[email protected]aa9b14d2013-05-10 23:45:19480 void CheckWasHttpResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
481 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42482 ASSERT_TRUE(response != nullptr);
483 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19484 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
485 EXPECT_FALSE(response->was_fetched_via_spdy);
486 EXPECT_FALSE(response->was_npn_negotiated);
487 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1,
488 response->connection_info);
489 }
490
bncffc2fdf2015-05-14 18:29:49491 void CheckResponseData(const scoped_ptr<HttpNetworkTransaction>& trans,
[email protected]aa9b14d2013-05-10 23:45:19492 const std::string& expected) {
493 std::string response_data;
bncffc2fdf2015-05-14 18:29:49494 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
[email protected]aa9b14d2013-05-10 23:45:19495 EXPECT_EQ(expected, response_data);
496 }
497
bncffc2fdf2015-05-14 18:29:49498 void RunTransaction(const scoped_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19499 TestCompletionCallback callback;
500 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
501 EXPECT_EQ(ERR_IO_PENDING, rv);
502 EXPECT_EQ(OK, callback.WaitForResult());
503 }
504
505 void SendRequestAndExpectHttpResponse(const std::string& expected) {
506 scoped_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50507 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
bncffc2fdf2015-05-14 18:29:49508 RunTransaction(trans);
[email protected]aa9b14d2013-05-10 23:45:19509 CheckWasHttpResponse(trans);
bncffc2fdf2015-05-14 18:29:49510 CheckResponseData(trans, expected);
[email protected]aa9b14d2013-05-10 23:45:19511 }
512
513 void SendRequestAndExpectQuicResponse(const std::string& expected) {
rchf114d982015-10-21 01:34:56514 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, 443);
tbansal7cec3812015-02-05 21:25:12515 }
516
bnc62a44f022015-04-02 15:59:41517 void SendRequestAndExpectQuicResponseOnPort(const std::string& expected,
Avi Drissman13fc8932015-12-20 04:40:46518 uint16_t port) {
bnc62a44f022015-04-02 15:59:41519 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, port);
520 }
521
522 void SendRequestAndExpectQuicResponseFromProxyOnPort(
523 const std::string& expected,
Avi Drissman13fc8932015-12-20 04:40:46524 uint16_t port) {
bnc62a44f022015-04-02 15:59:41525 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port);
[email protected]aa9b14d2013-05-10 23:45:19526 }
527
528 void AddQuicAlternateProtocolMapping(
529 MockCryptoClientStream::HandshakeMode handshake_mode) {
530 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
bnccacc0992015-03-20 20:22:22531 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url);
rchf114d982015-10-21 01:34:56532 AlternativeService alternative_service(QUIC, host_port_pair.host(), 443);
bnc7dc7e1b42015-07-28 14:43:12533 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
534 http_server_properties_.SetAlternativeService(
rchdc7b9052016-03-17 20:51:50535 host_port_pair, alternative_service, expiration);
[email protected]aa9b14d2013-05-10 23:45:19536 }
537
rchbe69cb902016-02-11 01:10:48538 void AddQuicRemoteAlternativeServiceMapping(
539 MockCryptoClientStream::HandshakeMode handshake_mode,
540 const HostPortPair& alternative) {
541 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
542 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url);
543 AlternativeService alternative_service(QUIC, alternative.host(),
544 alternative.port());
545 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
546 http_server_properties_.SetAlternativeService(
rchdc7b9052016-03-17 20:51:50547 host_port_pair, alternative_service, expiration);
rchbe69cb902016-02-11 01:10:48548 }
549
[email protected]aa9b14d2013-05-10 23:45:19550 void ExpectBrokenAlternateProtocolMapping() {
bnc8445b3002015-03-13 01:57:09551 const HostPortPair origin = HostPortPair::FromURL(request_.url);
bncd9b132e2015-07-08 05:16:10552 const AlternativeServiceVector alternative_service_vector =
553 http_server_properties_.GetAlternativeServices(origin);
554 EXPECT_EQ(1u, alternative_service_vector.size());
bnc6be245c12015-05-15 11:24:07555 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken(
bncd9b132e2015-07-08 05:16:10556 alternative_service_vector[0]));
[email protected]aa9b14d2013-05-10 23:45:19557 }
558
[email protected]4d590c9c2014-05-02 05:14:33559 void ExpectQuicAlternateProtocolMapping() {
bncd9b132e2015-07-08 05:16:10560 const HostPortPair origin = HostPortPair::FromURL(request_.url);
561 const AlternativeServiceVector alternative_service_vector =
562 http_server_properties_.GetAlternativeServices(origin);
563 EXPECT_EQ(1u, alternative_service_vector.size());
564 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
[email protected]4d590c9c2014-05-02 05:14:33565 }
566
[email protected]aa9b14d2013-05-10 23:45:19567 void AddHangingNonAlternateProtocolSocketData() {
zhongyi32569c62016-01-08 02:54:30568 scoped_ptr<StaticSocketDataProvider> hanging_data;
569 hanging_data.reset(new StaticSocketDataProvider());
[email protected]dda75ab2013-06-22 22:43:30570 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
zhongyi32569c62016-01-08 02:54:30571 hanging_data->set_connect_data(hanging_connect);
572 hanging_data_.push_back(std::move(hanging_data));
573 socket_factory_.AddSocketDataProvider(hanging_data_.back().get());
rchf114d982015-10-21 01:34:56574 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]aa9b14d2013-05-10 23:45:19575 }
576
rtenneti4b06ae72014-08-26 03:43:43577 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
[email protected]1e960032013-12-20 19:00:20578 QuicTestPacketMaker maker_;
mmenkee65e7af2015-10-13 17:16:42579 scoped_ptr<HttpNetworkSession> session_;
[email protected]61a527782013-02-21 03:58:00580 MockClientSocketFactory socket_factory_;
rchf114d982015-10-21 01:34:56581 ProofVerifyDetailsChromium verify_details_;
[email protected]e8ff26842013-03-22 21:02:05582 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43583 MockHostResolver host_resolver_;
584 MockCertVerifier cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11585 TransportSecurityState transport_security_state_;
rtenneti052774e2015-11-24 21:00:12586 scoped_ptr<CTVerifier> cert_transparency_verifier_;
tbansalfdf5665b2015-09-21 22:46:40587 scoped_ptr<TestNetworkQualityEstimator> test_network_quality_estimator_;
tbansalc8a94ea2015-11-02 23:58:51588 TestRTTObserver rtt_observer_;
[email protected]1c04f9522013-02-21 20:32:43589 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
590 scoped_ptr<ProxyService> proxy_service_;
591 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
[email protected]61a527782013-02-21 03:58:00592 MockRandom random_generator_;
bnc6be245c12015-05-15 11:24:07593 HttpServerPropertiesImpl http_server_properties_;
[email protected]61a527782013-02-21 03:58:00594 HttpNetworkSession::Params params_;
[email protected]aa9b14d2013-05-10 23:45:19595 HttpRequestInfo request_;
vishal.b62985ca92015-04-17 08:45:51596 BoundTestNetLog net_log_;
zhongyi32569c62016-01-08 02:54:30597 std::vector<scoped_ptr<StaticSocketDataProvider>> hanging_data_;
rchf114d982015-10-21 01:34:56598 SSLSocketDataProvider ssl_data_;
tbansal7cec3812015-02-05 21:25:12599
600 private:
601 void SendRequestAndExpectQuicResponseMaybeFromProxy(
602 const std::string& expected,
bnc62a44f022015-04-02 15:59:41603 bool used_proxy,
Avi Drissman13fc8932015-12-20 04:40:46604 uint16_t port) {
tbansal7cec3812015-02-05 21:25:12605 scoped_ptr<HttpNetworkTransaction> trans(
606 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
607 ProxyHeadersHandler proxy_headers_handler;
608 trans->SetBeforeProxyHeadersSentCallback(
609 base::Bind(&ProxyHeadersHandler::OnBeforeProxyHeadersSent,
610 base::Unretained(&proxy_headers_handler)));
bncffc2fdf2015-05-14 18:29:49611 RunTransaction(trans);
tbansal7cec3812015-02-05 21:25:12612 CheckWasQuicResponse(trans);
bnc62a44f022015-04-02 15:59:41613 CheckResponsePort(trans, port);
bncffc2fdf2015-05-14 18:29:49614 CheckResponseData(trans, expected);
tbansal7cec3812015-02-05 21:25:12615 EXPECT_EQ(used_proxy, proxy_headers_handler.was_called());
616 }
[email protected]61a527782013-02-21 03:58:00617};
618
rjshaded5ced072015-12-18 19:26:02619INSTANTIATE_TEST_CASE_P(Version,
620 QuicNetworkTransactionTest,
[email protected]1e960032013-12-20 19:00:20621 ::testing::ValuesIn(QuicSupportedVersions()));
622
623TEST_P(QuicNetworkTransactionTest, ForceQuic) {
rtenneti8a2f4632016-03-21 20:26:57624 params_.origins_to_force_quic_on.insert(
625 HostPortPair::FromString("mail.example.org:443"));
[email protected]4dca587c2013-03-07 16:54:47626
[email protected]1e960032013-12-20 19:00:20627 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03628 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05629 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56630 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:02631 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
632 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:03633 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05634 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03635 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:59636 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
[email protected]4dca587c2013-03-07 16:54:47637
rcha5399e02015-04-21 19:32:04638 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4dca587c2013-03-07 16:54:47639
[email protected]aa9b14d2013-05-10 23:45:19640 // The non-alternate protocol job needs to hang in order to guarantee that
641 // the alternate-protocol job will "win".
642 AddHangingNonAlternateProtocolSocketData();
[email protected]4dca587c2013-03-07 16:54:47643
rch3f4b8452016-02-23 16:59:32644 params_.parse_alternative_services = false;
645 params_.enable_alternative_service_with_different_host = false;
[email protected]4dca587c2013-03-07 16:54:47646 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47647
tbansalc8a94ea2015-11-02 23:58:51648 EXPECT_FALSE(rtt_observer_.rtt_notification_received());
[email protected]aa9b14d2013-05-10 23:45:19649 SendRequestAndExpectQuicResponse("hello!");
tbansalc8a94ea2015-11-02 23:58:51650 EXPECT_TRUE(rtt_observer_.rtt_notification_received());
[email protected]4dca587c2013-03-07 16:54:47651
[email protected]98b20ce2013-05-10 05:55:26652 // Check that the NetLog was filled reasonably.
mmenke43758e62015-05-04 21:09:46653 TestNetLogEntry::List entries;
[email protected]aa9b14d2013-05-10 23:45:19654 net_log_.GetEntries(&entries);
[email protected]98b20ce2013-05-10 05:55:26655 EXPECT_LT(0u, entries.size());
656
657 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29658 int pos = ExpectLogContainsSomewhere(
659 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
660 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26661 EXPECT_LT(0, pos);
662
rchfd527212015-08-25 00:41:26663 // ... and also a TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29664 pos = ExpectLogContainsSomewhere(
rchfd527212015-08-25 00:41:26665 entries, 0,
666 NetLog::TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED,
ttuttle859dc7a2015-04-23 19:42:29667 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26668 EXPECT_LT(0, pos);
669
rtennetia004d332015-08-28 06:44:57670 std::string packet_number;
671 ASSERT_TRUE(entries[pos].GetStringValue("packet_number", &packet_number));
672 EXPECT_EQ("1", packet_number);
[email protected]98b20ce2013-05-10 05:55:26673
rchfd527212015-08-25 00:41:26674 // ... and also a TYPE_QUIC_SESSION_PACKET_AUTHENTICATED.
675 pos = ExpectLogContainsSomewhere(
676 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_AUTHENTICATED,
677 NetLog::PHASE_NONE);
678 EXPECT_LT(0, pos);
679
[email protected]98b20ce2013-05-10 05:55:26680 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29681 pos = ExpectLogContainsSomewhere(
682 entries, 0, NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
683 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26684 EXPECT_LT(0, pos);
685
686 int log_stream_id;
687 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
[email protected]1e960032013-12-20 19:00:20688 EXPECT_EQ(3, log_stream_id);
[email protected]4dca587c2013-03-07 16:54:47689}
690
[email protected]cf3e3cd62014-02-05 16:16:16691TEST_P(QuicNetworkTransactionTest, QuicProxy) {
tbansaled0aecc2015-02-20 03:44:18692 params_.enable_quic_for_proxies = true;
rchf114d982015-10-21 01:34:56693 proxy_service_ =
rch9ae5b3b2016-02-11 00:36:29694 ProxyService::CreateFixedFromPacResult("QUIC mail.example.org:70");
[email protected]cf3e3cd62014-02-05 16:16:16695
[email protected]cf3e3cd62014-02-05 16:16:16696 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03697 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05698 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03699 GetRequestHeaders("GET", "http", "/")));
rjshaded5ced072015-12-18 19:26:02700 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
701 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:03702 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05703 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03704 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50705 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59706 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]cf3e3cd62014-02-05 16:16:16707
rcha5399e02015-04-21 19:32:04708 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cf3e3cd62014-02-05 16:16:16709
tbansalc8a94ea2015-11-02 23:58:51710 EXPECT_FALSE(rtt_observer_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16711 // There is no need to set up an alternate protocol job, because
712 // no attempt will be made to speak to the proxy over TCP.
713
rch9ae5b3b2016-02-11 00:36:29714 request_.url = GURL("http://mail.example.org/");
rch3f4b8452016-02-23 16:59:32715 params_.parse_alternative_services = false;
716 params_.enable_alternative_service_with_different_host = false;
[email protected]cf3e3cd62014-02-05 16:16:16717 CreateSession();
718
bnc62a44f022015-04-02 15:59:41719 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
tbansalc8a94ea2015-11-02 23:58:51720 EXPECT_TRUE(rtt_observer_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16721}
722
bnc313ba9c2015-06-11 15:42:31723// Regression test for https://crbug.com/492458. Test that for an HTTP
724// connection through a QUIC proxy, the certificate exhibited by the proxy is
725// checked against the proxy hostname, not the origin hostname.
726TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) {
rch9ae5b3b2016-02-11 00:36:29727 const std::string origin_host = "mail.example.com";
bnc313ba9c2015-06-11 15:42:31728 const std::string proxy_host = "www.example.org";
729
730 params_.enable_quic_for_proxies = true;
rdsmith82957ad2015-09-16 19:42:03731 proxy_service_ =
732 ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70");
bnc313ba9c2015-06-11 15:42:31733
734 maker_.set_hostname(origin_host);
735 MockQuicData mock_quic_data;
736 mock_quic_data.AddWrite(
737 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
738 GetRequestHeaders("GET", "http", "/")));
739 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
740 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
741 mock_quic_data.AddRead(
742 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
743 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50744 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59745 mock_quic_data.AddRead(ASYNC, 0);
bnc313ba9c2015-06-11 15:42:31746 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
747
748 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29749 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bnc313ba9c2015-06-11 15:42:31750 ASSERT_TRUE(cert.get());
751 // This certificate is valid for the proxy, but not for the origin.
752 bool common_name_fallback_used;
753 EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used));
754 EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used));
755 ProofVerifyDetailsChromium verify_details;
756 verify_details.cert_verify_result.verified_cert = cert;
757 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rchf114d982015-10-21 01:34:56758 ProofVerifyDetailsChromium verify_details2;
759 verify_details2.cert_verify_result.verified_cert = cert;
760 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
bnc313ba9c2015-06-11 15:42:31761
762 request_.url = GURL("http://" + origin_host);
763 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32764 CreateSession();
bnc313ba9c2015-06-11 15:42:31765 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
766 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
767}
768
rchbe69cb902016-02-11 01:10:48769TEST_P(QuicNetworkTransactionTest, AlternativeServicesDifferentHost) {
770 params_.enable_alternative_service_with_different_host = true;
771 HostPortPair origin("www.example.org", 443);
772 HostPortPair alternative("mail.example.org", 443);
773
774 base::FilePath certs_dir = GetTestCertsDirectory();
775 scoped_refptr<X509Certificate> cert(
776 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
777 ASSERT_TRUE(cert.get());
778 // TODO(rch): the connection should be "to" the origin, so if the cert is
779 // valid for the origin but not the alternative, that should work too.
780 bool common_name_fallback_used;
781 EXPECT_TRUE(cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
782 EXPECT_TRUE(
783 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
784 ProofVerifyDetailsChromium verify_details;
785 verify_details.cert_verify_result.verified_cert = cert;
786 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
787
788 maker_.set_hostname(origin.host());
789 MockQuicData mock_quic_data;
790 mock_quic_data.AddWrite(
791 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
792 GetRequestHeaders("GET", "https", "/")));
793 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
794 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
795 mock_quic_data.AddRead(
796 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
797 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
798 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
799 mock_quic_data.AddRead(ASYNC, 0);
800 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
801
802 request_.url = GURL("https://" + origin.host());
803 AddQuicRemoteAlternativeServiceMapping(
804 MockCryptoClientStream::CONFIRM_HANDSHAKE, alternative);
805 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32806 CreateSession();
rchbe69cb902016-02-11 01:10:48807
808 SendRequestAndExpectQuicResponse("hello!");
809}
810
[email protected]1e960032013-12-20 19:00:20811TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
rtenneti8a2f4632016-03-21 20:26:57812 params_.origins_to_force_quic_on.insert(
813 HostPortPair::FromString("mail.example.org:443"));
[email protected]cebe3282013-05-22 23:49:30814
tbansalfdf5665b2015-09-21 22:46:40815 MockQuicData mock_quic_data1;
816 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
[email protected]1e960032013-12-20 19:00:20817
tbansalfdf5665b2015-09-21 22:46:40818 MockQuicData mock_quic_data2;
zhongyi32569c62016-01-08 02:54:30819 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40820 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
rch6faa4d42016-01-05 20:48:43821 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40822
823 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
824 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
[email protected]cebe3282013-05-22 23:49:30825
rch3f4b8452016-02-23 16:59:32826 params_.parse_alternative_services = false;
827 params_.enable_alternative_service_with_different_host = false;
[email protected]cebe3282013-05-22 23:49:30828 CreateSession();
829
tbansalc8a94ea2015-11-02 23:58:51830 EXPECT_EQ(0U, test_network_quality_estimator_->watcher_count());
tbansalfdf5665b2015-09-21 22:46:40831 for (size_t i = 0; i < 2; ++i) {
832 scoped_ptr<HttpNetworkTransaction> trans(
833 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
834 TestCompletionCallback callback;
835 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
836 EXPECT_EQ(ERR_IO_PENDING, rv);
837 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
tbansalc8a94ea2015-11-02 23:58:51838 EXPECT_EQ(1 + i, test_network_quality_estimator_->watcher_count());
tbansalfdf5665b2015-09-21 22:46:40839 }
[email protected]cebe3282013-05-22 23:49:30840}
841
tbansalc8a94ea2015-11-02 23:58:51842TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
843 // Attempt to "force" quic on 443, which will not be honored.
rtenneti8a2f4632016-03-21 20:26:57844 params_.origins_to_force_quic_on.insert(
845 HostPortPair::FromString("www.google.com:443"));
tbansalc8a94ea2015-11-02 23:58:51846
847 MockRead http_reads[] = {
848 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
849 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
850 MockRead(ASYNC, OK)};
851
852 StaticSocketDataProvider data(http_reads, arraysize(http_reads), nullptr, 0);
853 socket_factory_.AddSocketDataProvider(&data);
854 SSLSocketDataProvider ssl(ASYNC, OK);
855 socket_factory_.AddSSLSocketDataProvider(&ssl);
856
rch3f4b8452016-02-23 16:59:32857 params_.parse_alternative_services = false;
858 params_.enable_alternative_service_with_different_host = false;
tbansalc8a94ea2015-11-02 23:58:51859 CreateSession();
860
861 SendRequestAndExpectHttpResponse("hello world");
862 EXPECT_EQ(0U, test_network_quality_estimator_->watcher_count());
863}
864
bncc958faa2015-07-31 18:14:52865TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52866 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56867 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
868 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52869 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
870 MockRead(ASYNC, OK)};
871
872 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
873 0);
874 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56875 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52876
877 MockQuicData mock_quic_data;
878 mock_quic_data.AddWrite(
879 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56880 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52881 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
882 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
883 mock_quic_data.AddRead(
884 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
885 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
886 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59887 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52888
889 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
890
891 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32892 CreateSession();
bncc958faa2015-07-31 18:14:52893
894 SendRequestAndExpectHttpResponse("hello world");
895 SendRequestAndExpectQuicResponse("hello!");
896}
897
bnc8be55ebb2015-10-30 14:12:07898TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) {
899 std::string altsvc_header = base::StringPrintf(
900 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam());
901 MockRead http_reads[] = {
902 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
903 MockRead("hello world"),
904 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
905 MockRead(ASYNC, OK)};
906
907 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
908 0);
909 socket_factory_.AddSocketDataProvider(&http_data);
910 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
911
912 MockQuicData mock_quic_data;
913 mock_quic_data.AddWrite(
914 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
915 GetRequestHeaders("GET", "https", "/")));
916 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
917 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
918 mock_quic_data.AddRead(
919 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
920 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
921 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59922 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc8be55ebb2015-10-30 14:12:07923
924 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
925
926 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32927 CreateSession();
bnc8be55ebb2015-10-30 14:12:07928
929 SendRequestAndExpectHttpResponse("hello world");
930 SendRequestAndExpectQuicResponse("hello!");
931}
932
zhongyi6b5a3892016-03-12 04:46:20933TEST_P(QuicNetworkTransactionTest, GoAwayWithConnectionMigrationOnPortsOnly) {
934 MockQuicData mock_quic_data;
935 mock_quic_data.AddWrite(
936 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
937 GetRequestHeaders("GET", "https", "/")));
938 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
939 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
940 // Read a GoAway packet with
941 // QuicErrorCode: QUIC_ERROR_MIGRATING_PORT from the peer.
942 mock_quic_data.AddRead(
943 ConstructGoAwayPacket(2, QUIC_ERROR_MIGRATING_PORT,
944 "connection migration with port change only"));
945 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
946 mock_quic_data.AddRead(
947 ConstructDataPacket(3, kClientDataStreamId1, false, true, 0, "hello!"));
948 mock_quic_data.AddWrite(ConstructAckAndRstPacket(
949 3, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 3, 3, 1));
950 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
951 mock_quic_data.AddRead(ASYNC, 0); // EOF
952
953 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
954
955 // The non-alternate protocol job needs to hang in order to guarantee that
956 // the alternate-protocol job will "win".
957 AddHangingNonAlternateProtocolSocketData();
958
959 // In order for a new QUIC session to be established via alternate-protocol
960 // without racing an HTTP connection, we need the host resolution to happen
961 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
962 // connection to the the server, in this test we require confirmation
963 // before encrypting so the HTTP job will still start.
964 host_resolver_.set_synchronous_mode(true);
965 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
966 "");
967 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
968 AddressList address;
969 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
970 nullptr, net_log_.bound());
971
972 CreateSession();
973 session_->quic_stream_factory()->set_require_confirmation(true);
974 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
975
976 scoped_ptr<HttpNetworkTransaction> trans(
977 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
978 TestCompletionCallback callback;
979 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
980 EXPECT_EQ(ERR_IO_PENDING, rv);
981
982 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
983 QuicSession::HANDSHAKE_CONFIRMED);
984 EXPECT_EQ(OK, callback.WaitForResult());
985
986 // Check whether this transaction is correctly marked as received a go-away
987 // because of migrating port.
988 NetErrorDetails details;
989 EXPECT_FALSE(details.quic_port_migration_detected);
990 trans->PopulateNetErrorDetails(&details);
991 EXPECT_TRUE(details.quic_port_migration_detected);
992}
993
bnc8be55ebb2015-10-30 14:12:07994TEST_P(QuicNetworkTransactionTest,
995 DoNotUseAlternativeServiceQuicUnsupportedVersion) {
996 std::string altsvc_header = base::StringPrintf(
997 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam() - 1);
998 MockRead http_reads[] = {
999 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1000 MockRead("hello world"),
1001 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1002 MockRead(ASYNC, OK)};
1003
1004 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1005 0);
1006 socket_factory_.AddSocketDataProvider(&http_data);
1007 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1008 socket_factory_.AddSocketDataProvider(&http_data);
1009 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1010
rch3f4b8452016-02-23 16:59:321011 CreateSession();
bnc8be55ebb2015-10-30 14:12:071012
1013 SendRequestAndExpectHttpResponse("hello world");
1014 SendRequestAndExpectHttpResponse("hello world");
1015}
1016
bncc958faa2015-07-31 18:14:521017// When multiple alternative services are advertised,
zhongyi32569c62016-01-08 02:54:301018// HttpStreamFactoryImpl::RequestStreamInternal() should select the alternative
1019// service which uses existing QUIC session if available. If no existing QUIC
1020// session can be used, use the first alternative service from the list.
1021TEST_P(QuicNetworkTransactionTest, UseExistingAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:521022 MockRead http_reads[] = {
1023 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291024 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
bncc958faa2015-07-31 18:14:521025 MockRead("hello world"),
1026 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1027 MockRead(ASYNC, OK)};
1028
1029 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1030 0);
1031 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561032 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521033
zhongyi32569c62016-01-08 02:54:301034 QuicStreamOffset request_header_offset = 0;
1035 QuicStreamOffset response_header_offset = 0;
1036 // First QUIC request data.
rch9ae5b3b2016-02-11 00:36:291037 // Open a session to foo.example.org:443 using the first entry of the
zhongyi32569c62016-01-08 02:54:301038 // alternative service list.
bncc958faa2015-07-31 18:14:521039 MockQuicData mock_quic_data;
zhongyi32569c62016-01-08 02:54:301040 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1041 1, kClientDataStreamId1, true, true,
1042 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1043
1044 std::string alt_svc_list =
rch9ae5b3b2016-02-11 00:36:291045 "quic=\"mail.example.org:444\", quic=\"foo.example.org:443\", "
1046 "quic=\"bar.example.org:445\"";
bncc958faa2015-07-31 18:14:521047 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301048 1, kClientDataStreamId1, false, false,
1049 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
bncc958faa2015-07-31 18:14:521050 mock_quic_data.AddRead(
1051 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1052 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301053
1054 // Second QUIC request data.
1055 // Connection pooling, using existing session, no need to include version
1056 // as version negotiation has been completed.
1057 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1058 3, kClientDataStreamId2, false, true,
1059 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1060 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1061 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1062 &response_header_offset));
1063 mock_quic_data.AddRead(
1064 ConstructDataPacket(4, kClientDataStreamId2, false, true, 0, "hello!"));
1065 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
bncc958faa2015-07-31 18:14:521066 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591067 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521068
1069 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1070
1071 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321072 CreateSession();
bncc958faa2015-07-31 18:14:521073
1074 SendRequestAndExpectHttpResponse("hello world");
zhongyi32569c62016-01-08 02:54:301075
bncc958faa2015-07-31 18:14:521076 SendRequestAndExpectQuicResponseOnPort("hello!", 443);
zhongyi32569c62016-01-08 02:54:301077 SendRequestAndExpectQuicResponseOnPort("hello!", 443);
1078}
1079
1080// When multiple alternative services that has existing QUIC session.
1081// HttpStreamFactoryImpl::RequestStreamInternal() should select the first
1082// alternative service which uses existing QUIC session.
1083TEST_P(QuicNetworkTransactionTest, UseFirstExistingAlternativeServiceForQuic) {
1084 MockRead http_reads[] = {
1085 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291086 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":446\"\r\n\r\n"),
zhongyi32569c62016-01-08 02:54:301087 MockRead("hello world"),
1088 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1089 MockRead(ASYNC, OK)};
1090
1091 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1092 0);
1093 socket_factory_.AddSocketDataProvider(&http_data);
1094 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1095
1096 QuicStreamOffset request_header_offset = 0;
1097 QuicStreamOffset response_header_offset = 0;
1098
1099 QuicTestPacketMaker maker(GetParam(), 0, clock_, kDefaultServerHostName);
1100
1101 MockQuicData mock_quic_data;
1102 MockQuicData mock_quic_data2;
1103 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
1104 // First QUIC request data.
rch9ae5b3b2016-02-11 00:36:291105 // Open a QUIC session to foo.example.org:443.
zhongyi32569c62016-01-08 02:54:301106 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1107 1, kClientDataStreamId1, true, true,
1108 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1109
1110 std::string alt_svc_list =
rch9ae5b3b2016-02-11 00:36:291111 "quic=\"bar.example.org:444\", quic=\"frog.example.org:445\", "
1112 "quic=\"mail.example.org:446\"";
zhongyi32569c62016-01-08 02:54:301113 // Response header from the server resets the alt_svc list for the origin.
1114 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1115 1, kClientDataStreamId1, false, false,
1116 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
1117 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1118 true, 0, "hello from foo!"));
1119 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1120
1121 // Second QUIC request data.
rch9ae5b3b2016-02-11 00:36:291122 // Existing QUIC session to foo.example.org is not viable from the updated
zhongyi32569c62016-01-08 02:54:301123 // alt_svc. Unable to pool the existing QUIC session.
rch9ae5b3b2016-02-11 00:36:291124 // Open a new QUIC session to bar.example.org:443.
zhongyi32569c62016-01-08 02:54:301125 mock_quic_data2.AddWrite(ConstructRequestHeadersPacket(
1126 1, kClientDataStreamId1, true, true,
1127 GetRequestHeaders("GET", "https", "/"), &maker));
1128 alt_svc_list =
rch9ae5b3b2016-02-11 00:36:291129 "quic=\"foo.example.org:443\", quic=\"mail.example.org:446\", "
1130 "quic=\"bar.example.org:444\"";
zhongyi32569c62016-01-08 02:54:301131 // Response header from the server resets the alt_svc list for the origin.
1132 mock_quic_data2.AddRead(ConstructResponseHeadersPacket(
1133 1, kClientDataStreamId1, false, false,
1134 GetResponseHeaders("200 OK", alt_svc_list), &maker));
1135 mock_quic_data2.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1136 true, 0, "hello from bar!"));
1137 mock_quic_data2.AddWrite(ConstructAckPacket(2, 1, &maker));
1138 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1139 mock_quic_data2.AddRead(ASYNC, 0); // EOF
1140
1141 // Third QUIC request data.
rch9ae5b3b2016-02-11 00:36:291142 // Connection pooling, using the first existing session to foo.example.org
zhongyi32569c62016-01-08 02:54:301143 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1144 3, kClientDataStreamId2, false, true,
1145 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1146 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1147 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1148 &response_header_offset));
1149 mock_quic_data.AddRead(ConstructDataPacket(4, kClientDataStreamId2, false,
1150 true, 0, "hello from foo!"));
1151 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
1152 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1153 mock_quic_data.AddRead(ASYNC, 0); // EOF
1154
1155 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1156 AddHangingNonAlternateProtocolSocketData();
1157
1158 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
1159
1160 AddHangingNonAlternateProtocolSocketData();
1161
rch3f4b8452016-02-23 16:59:321162 CreateSession();
zhongyi32569c62016-01-08 02:54:301163
1164 SendRequestAndExpectHttpResponse("hello world");
1165 SendRequestAndExpectQuicResponseOnPort("hello from foo!", 443);
1166 SendRequestAndExpectQuicResponseOnPort("hello from bar!", 444);
1167 SendRequestAndExpectQuicResponseOnPort("hello from foo!", 443);
1168}
1169
1170// Multiple origins have listed the same alternative services. When there's a
1171// existing QUIC session opened by a request to other origin,
1172// if the cert is valid, should select this QUIC session to make the request
1173// if this is also the first existing QUIC session.
1174TEST_P(QuicNetworkTransactionTest,
1175 UseSharedExistingAlternativeServiceForQuicWithValidCert) {
rch9ae5b3b2016-02-11 00:36:291176 // Default cert is valid for *.example.org
zhongyi32569c62016-01-08 02:54:301177
rch9ae5b3b2016-02-11 00:36:291178 // HTTP data for request to www.example.org.
zhongyi32569c62016-01-08 02:54:301179 MockRead http_reads[] = {
1180 MockRead("HTTP/1.1 200 OK\r\n"),
1181 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
rch9ae5b3b2016-02-11 00:36:291182 MockRead("hello world from www.example.org"),
zhongyi32569c62016-01-08 02:54:301183 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1184 MockRead(ASYNC, OK)};
1185
1186 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1187 0);
1188 socket_factory_.AddSocketDataProvider(&http_data);
1189 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1190
1191 // HTTP data for request to mail.example.org.
1192 MockRead http_reads2[] = {
1193 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291194 MockRead("Alt-Svc: quic=\":444\", quic=\"www.example.org:443\"\r\n\r\n"),
zhongyi32569c62016-01-08 02:54:301195 MockRead("hello world from mail.example.org"),
1196 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1197 MockRead(ASYNC, OK)};
1198
1199 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1200 nullptr, 0);
1201 socket_factory_.AddSocketDataProvider(&http_data2);
1202 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1203
1204 QuicStreamOffset request_header_offset = 0;
1205 QuicStreamOffset response_header_offset = 0;
1206
rch9ae5b3b2016-02-11 00:36:291207 QuicTestPacketMaker maker(GetParam(), 0, clock_, "mail.example.org");
1208 maker_.set_hostname("www.example.org");
zhongyi32569c62016-01-08 02:54:301209 MockQuicData mock_quic_data;
1210
1211 // First QUIC request data.
1212 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1213 1, kClientDataStreamId1, true, true,
1214 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1215
1216 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1217 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1218 &response_header_offset));
1219 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1220 true, 0, "hello from mail QUIC!"));
1221 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301222 // Second QUIC request data.
1223 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1224 3, kClientDataStreamId2, false, true,
1225 GetRequestHeaders("GET", "https", "/", maker), &request_header_offset,
1226 &maker));
1227 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1228 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1229 &response_header_offset));
1230 mock_quic_data.AddRead(ConstructDataPacket(4, kClientDataStreamId2, false,
1231 true, 0, "hello from mail QUIC!"));
1232 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
1233 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1234 mock_quic_data.AddRead(ASYNC, 0); // EOF
1235
1236 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1237 AddHangingNonAlternateProtocolSocketData();
1238
rch3f4b8452016-02-23 16:59:321239 CreateSession();
zhongyi32569c62016-01-08 02:54:301240
1241 // Send two HTTP requests, responses set up alt-svc lists for the origins.
rch9ae5b3b2016-02-11 00:36:291242 request_.url = GURL("https://www.example.org/");
1243 SendRequestAndExpectHttpResponse("hello world from www.example.org");
zhongyi32569c62016-01-08 02:54:301244 request_.url = GURL("https://mail.example.org/");
1245 SendRequestAndExpectHttpResponse("hello world from mail.example.org");
1246
rch9ae5b3b2016-02-11 00:36:291247 // Open a QUIC session to mail.example.org:443 when making request
1248 // to mail.example.org.
1249 request_.url = GURL("https://www.example.org/");
zhongyi32569c62016-01-08 02:54:301250 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443);
1251
rch9ae5b3b2016-02-11 00:36:291252 // Uses the existing QUIC session when making request to www.example.org.
zhongyi32569c62016-01-08 02:54:301253 request_.url = GURL("https://mail.example.org/");
1254 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443);
1255}
1256
1257// Multiple origins have listed the same alternative services. When there's a
1258// existing QUIC session opened by a request to other origin,
1259// if the cert is NOT valid, should ignore this QUIC session.
1260TEST_P(QuicNetworkTransactionTest,
1261 DoNotUseSharedExistingAlternativeServiceForQuicWithInvalidCert) {
rch9ae5b3b2016-02-11 00:36:291262 // Default cert is valid *.example.org
1263 // NOT valid for mail.example.com.
zhongyi32569c62016-01-08 02:54:301264
rch9ae5b3b2016-02-11 00:36:291265 // HTTP data for request to mail.example.org.
zhongyi32569c62016-01-08 02:54:301266 MockRead http_reads[] = {
1267 MockRead("HTTP/1.1 200 OK\r\n"),
1268 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
rch9ae5b3b2016-02-11 00:36:291269 MockRead("hello world from mail.example.org"),
zhongyi32569c62016-01-08 02:54:301270 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1271 MockRead(ASYNC, OK)};
1272
1273 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1274 0);
1275 socket_factory_.AddSocketDataProvider(&http_data);
1276 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1277
rch9ae5b3b2016-02-11 00:36:291278 // HTTP data for request to mail.example.com.
zhongyi32569c62016-01-08 02:54:301279 MockRead http_reads2[] = {
1280 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291281 MockRead("Alt-Svc: quic=\":444\", quic=\"mail.example.org:443\"\r\n\r\n"),
1282 MockRead("hello world from mail.example.com"),
zhongyi32569c62016-01-08 02:54:301283 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1284 MockRead(ASYNC, OK)};
1285
1286 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1287 nullptr, 0);
1288 socket_factory_.AddSocketDataProvider(&http_data2);
1289 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1290
rch9ae5b3b2016-02-11 00:36:291291 QuicTestPacketMaker maker(GetParam(), 0, clock_, "mail.example.org");
1292 maker.set_hostname("mail.example.com");
zhongyi32569c62016-01-08 02:54:301293 MockQuicData mock_quic_data;
1294 MockQuicData mock_quic_data2;
1295
1296 // Adding a valid cert for *.example.org but not mail.example.com.
1297 ProofVerifyDetailsChromium verify_details;
1298 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:291299 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
zhongyi32569c62016-01-08 02:54:301300 verify_details.cert_verify_result.verified_cert = cert;
1301 verify_details.cert_verify_result.is_issued_by_known_root = true;
1302 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1303
1304 // First QUIC request data.
1305 mock_quic_data.AddWrite(
1306 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1307 GetRequestHeaders("GET", "https", "/")));
1308 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1309 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1310 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1311 true, 0, "hello from mail QUIC!"));
1312 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1313 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1314 mock_quic_data.AddRead(ASYNC, 0); // EOF
1315
1316 // First QUIC request data.
1317 mock_quic_data2.AddWrite(ConstructRequestHeadersPacket(
1318 1, kClientDataStreamId1, true, true,
1319 GetRequestHeaders("GET", "https", "/", maker), &maker));
1320 mock_quic_data2.AddRead(
1321 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
1322 GetResponseHeaders("200 OK"), &maker));
1323 mock_quic_data2.AddRead(ConstructDataPacket(
1324 2, kClientDataStreamId1, false, true, 0, "hello from docs QUIC!"));
1325 mock_quic_data2.AddWrite(ConstructAckPacket(2, 1, &maker));
1326 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1327 mock_quic_data2.AddRead(ASYNC, 0); // EOF
1328
1329 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1330 AddHangingNonAlternateProtocolSocketData();
1331
1332 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
1333 AddHangingNonAlternateProtocolSocketData();
1334
rch3f4b8452016-02-23 16:59:321335 CreateSession();
zhongyi32569c62016-01-08 02:54:301336
1337 // Send HTTP requests, responses set up the alt-svc lists for the origins.
rch9ae5b3b2016-02-11 00:36:291338 SendRequestAndExpectHttpResponse("hello world from mail.example.org");
zhongyi32569c62016-01-08 02:54:301339 request_.url = GURL("https://mail.example.com/");
rch9ae5b3b2016-02-11 00:36:291340 SendRequestAndExpectHttpResponse("hello world from mail.example.com");
1341
1342 // Open a QUIC session to mail.example.org:443 when making request
1343 // to mail.example.org.
1344 request_.url = GURL("https://mail.example.org/");
zhongyi32569c62016-01-08 02:54:301345 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443);
1346
rch9ae5b3b2016-02-11 00:36:291347 // Open another new QUIC session to mail.example.com:444.
1348 request_.url = GURL("https://mail.example.com/");
zhongyi32569c62016-01-08 02:54:301349 SendRequestAndExpectQuicResponseOnPort("hello from docs QUIC!", 444);
bncc958faa2015-07-31 18:14:521350}
1351
1352TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) {
bncc958faa2015-07-31 18:14:521353 MockRead http_reads[] = {
1354 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561355 MockRead(kQuicAlternativeServiceDifferentPortHeader),
bncc958faa2015-07-31 18:14:521356 MockRead("hello world"),
1357 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1358 MockRead(ASYNC, OK)};
1359
1360 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1361 0);
1362 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561363 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521364
1365 MockQuicData mock_quic_data;
1366 mock_quic_data.AddWrite(
1367 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561368 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521369 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1370 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1371 mock_quic_data.AddRead(
1372 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1373 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1374 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591375 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521376
1377 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1378
1379 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321380 CreateSession();
bncc958faa2015-07-31 18:14:521381
1382 SendRequestAndExpectHttpResponse("hello world");
1383 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
1384}
1385
1386TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) {
bncc958faa2015-07-31 18:14:521387 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561388 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1389 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521390 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1391 MockRead(ASYNC, OK)};
1392
1393 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1394 0);
1395 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561396 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521397
1398 MockQuicData mock_quic_data;
1399 mock_quic_data.AddWrite(
1400 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561401 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521402 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1403 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1404 mock_quic_data.AddRead(
1405 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1406 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1407 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1408 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521409
1410 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1411
1412 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321413 CreateSession();
bncc958faa2015-07-31 18:14:521414
1415 AlternativeService alternative_service(QUIC,
1416 HostPortPair::FromURL(request_.url));
1417 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
1418 alternative_service);
1419 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1420 alternative_service));
1421
1422 SendRequestAndExpectHttpResponse("hello world");
1423 SendRequestAndExpectQuicResponse("hello!");
1424
mmenkee24011922015-12-17 22:12:591425 mock_quic_data.Resume();
bncc958faa2015-07-31 18:14:521426
1427 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1428 alternative_service));
1429}
1430
bncc958faa2015-07-31 18:14:521431TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) {
bncc958faa2015-07-31 18:14:521432 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561433 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1434 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521435 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1436 MockRead(ASYNC, OK)};
1437
1438 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1439 0);
1440 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561441 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521442
1443 MockQuicData mock_quic_data;
1444 mock_quic_data.AddWrite(
1445 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561446 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521447 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1448 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1449 mock_quic_data.AddRead(
1450 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1451 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1452 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
1453
1454 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1455
1456 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321457 CreateSession();
bncc958faa2015-07-31 18:14:521458
1459 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1460 SendRequestAndExpectHttpResponse("hello world");
1461}
1462
[email protected]1e960032013-12-20 19:00:201463TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
[email protected]aa9b14d2013-05-10 23:45:191464 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561465 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1466 MockRead("hello world"),
1467 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1468 MockRead(ASYNC, OK)};
[email protected]61a527782013-02-21 03:58:001469
rjshaded5ced072015-12-18 19:26:021470 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1471 0);
[email protected]aa9b14d2013-05-10 23:45:191472 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561473 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]61a527782013-02-21 03:58:001474
[email protected]1e960032013-12-20 19:00:201475 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031476 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051477 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561478 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021479 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1480 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031481 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051482 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031483 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501484 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591485 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]61a527782013-02-21 03:58:001486
rcha5399e02015-04-21 19:32:041487 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]61a527782013-02-21 03:58:001488
[email protected]aa9b14d2013-05-10 23:45:191489 // The non-alternate protocol job needs to hang in order to guarantee that
1490 // the alternate-protocol job will "win".
1491 AddHangingNonAlternateProtocolSocketData();
[email protected]61a527782013-02-21 03:58:001492
rch3f4b8452016-02-23 16:59:321493 params_.parse_alternative_services = false;
1494 params_.parse_alternative_services = false;
1495 CreateSession();
[email protected]61a527782013-02-21 03:58:001496
[email protected]aa9b14d2013-05-10 23:45:191497 SendRequestAndExpectHttpResponse("hello world");
1498 SendRequestAndExpectQuicResponse("hello!");
[email protected]61a527782013-02-21 03:58:001499}
1500
bnc62a44f022015-04-02 15:59:411501TEST_P(QuicNetworkTransactionTest, AlternateProtocolDifferentPort) {
1502 MockRead http_reads[] = {
1503 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561504 MockRead(kQuicAlternateProtocolDifferentPortHeader),
bnc62a44f022015-04-02 15:59:411505 MockRead("hello world"),
1506 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1507 MockRead(ASYNC, OK)};
1508
1509 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1510 0);
1511 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561512 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bnc62a44f022015-04-02 15:59:411513
1514 MockQuicData mock_quic_data;
1515 mock_quic_data.AddWrite(
1516 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561517 GetRequestHeaders("GET", "https", "/")));
bnc62a44f022015-04-02 15:59:411518 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1519 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1520 mock_quic_data.AddRead(
1521 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1522 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501523 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591524 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc62a44f022015-04-02 15:59:411525
rcha5399e02015-04-21 19:32:041526 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bnc62a44f022015-04-02 15:59:411527
1528 // The non-alternate protocol job needs to hang in order to guarantee that
1529 // the alternate-protocol job will "win".
1530 AddHangingNonAlternateProtocolSocketData();
1531
rch3f4b8452016-02-23 16:59:321532 params_.parse_alternative_services = false;
1533 CreateSession();
bnc62a44f022015-04-02 15:59:411534
1535 SendRequestAndExpectHttpResponse("hello world");
1536 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
1537}
1538
bncc958faa2015-07-31 18:14:521539TEST_P(QuicNetworkTransactionTest, ConfirmAlternateProtocol) {
bncae8db8402015-03-26 20:13:501540 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561541 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
bncae8db8402015-03-26 20:13:501542 MockRead("hello world"),
1543 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1544 MockRead(ASYNC, OK)};
1545
1546 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1547 0);
1548 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561549 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncae8db8402015-03-26 20:13:501550
1551 MockQuicData mock_quic_data;
1552 mock_quic_data.AddWrite(
1553 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561554 GetRequestHeaders("GET", "https", "/")));
bncae8db8402015-03-26 20:13:501555 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1556 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1557 mock_quic_data.AddRead(
1558 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1559 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501560 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1561 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncae8db8402015-03-26 20:13:501562
rcha5399e02015-04-21 19:32:041563 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bncae8db8402015-03-26 20:13:501564
1565 // The non-alternate protocol job needs to hang in order to guarantee that
1566 // the alternate-protocol job will "win".
1567 AddHangingNonAlternateProtocolSocketData();
1568
rch3f4b8452016-02-23 16:59:321569 params_.parse_alternative_services = false;
1570 CreateSession();
bncae8db8402015-03-26 20:13:501571
1572 AlternativeService alternative_service(QUIC,
1573 HostPortPair::FromURL(request_.url));
bnc6be245c12015-05-15 11:24:071574 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
bncae8db8402015-03-26 20:13:501575 alternative_service);
bnc6be245c12015-05-15 11:24:071576 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1577 alternative_service));
bncae8db8402015-03-26 20:13:501578
1579 SendRequestAndExpectHttpResponse("hello world");
1580 SendRequestAndExpectQuicResponse("hello!");
1581
mmenkee24011922015-12-17 22:12:591582 mock_quic_data.Resume();
rchb27683c2015-07-29 23:53:501583
bnc6be245c12015-05-15 11:24:071584 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1585 alternative_service));
bncae8db8402015-03-26 20:13:501586}
1587
[email protected]1e960032013-12-20 19:00:201588TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) {
rch3f4b8452016-02-23 16:59:321589 params_.parse_alternative_services = false;
[email protected]6d1b4ed2013-07-10 03:57:541590 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561591 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1592 MockRead("hello world"),
1593 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1594 MockRead(ASYNC, OK)};
[email protected]6d1b4ed2013-07-10 03:57:541595
rjshaded5ced072015-12-18 19:26:021596 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1597 0);
[email protected]6d1b4ed2013-07-10 03:57:541598 socket_factory_.AddSocketDataProvider(&http_data);
1599
[email protected]1e960032013-12-20 19:00:201600 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031601 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051602 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561603 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021604 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1605 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031606 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051607 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031608 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501609 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591610 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]6d1b4ed2013-07-10 03:57:541611
rcha5399e02015-04-21 19:32:041612 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]6d1b4ed2013-07-10 03:57:541613
1614 // The non-alternate protocol job needs to hang in order to guarantee that
1615 // the alternate-protocol job will "win".
1616 AddHangingNonAlternateProtocolSocketData();
1617
rch3f4b8452016-02-23 16:59:321618 CreateSession();
[email protected]6d1b4ed2013-07-10 03:57:541619
1620 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1621 SendRequestAndExpectHttpResponse("hello world");
1622}
1623
bnccb7ff3c2015-05-21 20:51:551624class QuicAltSvcCertificateVerificationTest
1625 : public QuicNetworkTransactionTest {
1626 public:
1627 void Run(bool valid) {
rch9ae5b3b2016-02-11 00:36:291628 HostPortPair origin(valid ? "mail.example.org" : "mail.example.com", 443);
bnccb7ff3c2015-05-21 20:51:551629 HostPortPair alternative("www.example.org", 443);
1630 std::string url("https://");
1631 url.append(origin.host());
1632 url.append(":443");
1633 request_.url = GURL(url);
1634
1635 maker_.set_hostname(origin.host());
1636 MockQuicData mock_quic_data;
1637 mock_quic_data.AddWrite(
1638 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1639 GetRequestHeaders("GET", "https", "/")));
1640 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1641 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1642 mock_quic_data.AddRead(
1643 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1644 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591645 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
bnccb7ff3c2015-05-21 20:51:551646 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1647
1648 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:291649 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bnccb7ff3c2015-05-21 20:51:551650 ASSERT_TRUE(cert.get());
1651 bool common_name_fallback_used;
1652 EXPECT_EQ(valid,
1653 cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
1654 EXPECT_TRUE(
1655 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
1656 ProofVerifyDetailsChromium verify_details;
1657 verify_details.cert_verify_result.verified_cert = cert;
1658 verify_details.cert_verify_result.is_issued_by_known_root = true;
1659 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1660 crypto_client_stream_factory_.set_handshake_mode(
1661 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1662
1663 // Connection to |origin| fails, so that success of |request| depends on
1664 // connection to |alternate| only.
1665 MockConnect refused_connect(ASYNC, ERR_CONNECTION_REFUSED);
1666 StaticSocketDataProvider refused_data;
1667 refused_data.set_connect_data(refused_connect);
1668 socket_factory_.AddSocketDataProvider(&refused_data);
1669
rch3f4b8452016-02-23 16:59:321670 CreateSession();
bnccb7ff3c2015-05-21 20:51:551671 AlternativeService alternative_service(QUIC, alternative);
bnc7dc7e1b42015-07-28 14:43:121672 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
bnccb7ff3c2015-05-21 20:51:551673 session_->http_server_properties()->SetAlternativeService(
rchdc7b9052016-03-17 20:51:501674 origin, alternative_service, expiration);
bnccb7ff3c2015-05-21 20:51:551675 scoped_ptr<HttpNetworkTransaction> trans(
1676 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1677 TestCompletionCallback callback;
1678 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1679 EXPECT_EQ(ERR_IO_PENDING, rv);
1680 rv = callback.WaitForResult();
1681 if (valid) {
1682 EXPECT_EQ(OK, rv);
1683 CheckWasQuicResponse(trans);
1684 CheckResponsePort(trans, 443);
1685 CheckResponseData(trans, "hello!");
1686 } else {
1687 EXPECT_EQ(ERR_CONNECTION_REFUSED, rv);
1688 }
1689 }
1690};
1691
1692INSTANTIATE_TEST_CASE_P(Version,
1693 QuicAltSvcCertificateVerificationTest,
1694 ::testing::ValuesIn(QuicSupportedVersions()));
1695
1696TEST_P(QuicAltSvcCertificateVerificationTest,
1697 RequestSucceedsWithValidCertificate) {
1698 Run(true);
1699}
1700
1701TEST_P(QuicAltSvcCertificateVerificationTest,
1702 RequestFailsWithInvalidCertificate) {
1703 Run(false);
1704}
1705
[email protected]1e960032013-12-20 19:00:201706TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) {
rch3f4b8452016-02-23 16:59:321707 params_.parse_alternative_services = false;
[email protected]dda75ab2013-06-22 22:43:301708 crypto_client_stream_factory_.set_handshake_mode(
1709 MockCryptoClientStream::COLD_START);
1710
1711 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561712 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
rch9ae5b3b2016-02-11 00:36:291713 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561714 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")};
[email protected]dda75ab2013-06-22 22:43:301715
1716 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561717 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1718 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1719 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]dda75ab2013-06-22 22:43:301720
mmenke651bae7f2015-12-18 21:26:451721 MockClientSocketFactory socket_factory;
[email protected]dda75ab2013-06-22 22:43:301722
mmenke651bae7f2015-12-18 21:26:451723 SequencedSocketData http_data(http_reads, arraysize(http_reads), http_writes,
1724 arraysize(http_writes));
[email protected]dda75ab2013-06-22 22:43:301725 socket_factory.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561726 socket_factory.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301727
1728 // The QUIC transaction will not be allowed to complete.
mmenke651bae7f2015-12-18 21:26:451729 MockWrite quic_writes[] = {MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 1)};
[email protected]dda75ab2013-06-22 22:43:301730 MockRead quic_reads[] = {
mmenke651bae7f2015-12-18 21:26:451731 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0),
[email protected]dda75ab2013-06-22 22:43:301732 };
mmenke651bae7f2015-12-18 21:26:451733 SequencedSocketData quic_data(quic_reads, arraysize(quic_reads), quic_writes,
1734 arraysize(quic_writes));
[email protected]dda75ab2013-06-22 22:43:301735 socket_factory.AddSocketDataProvider(&quic_data);
1736
1737 // The HTTP transaction will complete.
mmenke651bae7f2015-12-18 21:26:451738 SequencedSocketData http_data2(http_reads, arraysize(http_reads), http_writes,
1739 arraysize(http_writes));
[email protected]dda75ab2013-06-22 22:43:301740 socket_factory.AddSocketDataProvider(&http_data2);
rchf114d982015-10-21 01:34:561741 socket_factory.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301742
rch3f4b8452016-02-23 16:59:321743 CreateSessionWithFactory(&socket_factory);
[email protected]dda75ab2013-06-22 22:43:301744
1745 // Run the first request.
[email protected]dda75ab2013-06-22 22:43:301746 SendRequestAndExpectHttpResponse("hello world");
rch37de576c2015-05-17 20:28:171747 ASSERT_TRUE(http_data.AllReadDataConsumed());
1748 ASSERT_TRUE(http_data.AllWriteDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301749
1750 // Now run the second request in which the QUIC socket hangs,
1751 // and verify the the transaction continues over HTTP.
[email protected]dda75ab2013-06-22 22:43:301752 SendRequestAndExpectHttpResponse("hello world");
mmenke651bae7f2015-12-18 21:26:451753 base::RunLoop().RunUntilIdle();
[email protected]dda75ab2013-06-22 22:43:301754
rch37de576c2015-05-17 20:28:171755 ASSERT_TRUE(http_data2.AllReadDataConsumed());
1756 ASSERT_TRUE(http_data2.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:451757 ASSERT_TRUE(quic_data.AllReadDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301758}
1759
[email protected]1e960032013-12-20 19:00:201760TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
[email protected]1e960032013-12-20 19:00:201761 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031762 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051763 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561764 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021765 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1766 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031767 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051768 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031769 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501770 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591771 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]8ba81212013-05-03 13:11:481772
rcha5399e02015-04-21 19:32:041773 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]8ba81212013-05-03 13:11:481774
[email protected]3a120a6b2013-06-25 01:08:271775 // The non-alternate protocol job needs to hang in order to guarantee that
1776 // the alternate-protocol job will "win".
[email protected]dda75ab2013-06-22 22:43:301777 AddHangingNonAlternateProtocolSocketData();
1778
rch3f4b8452016-02-23 16:59:321779 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:191780 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1781 SendRequestAndExpectQuicResponse("hello!");
[email protected]8ba81212013-05-03 13:11:481782}
1783
[email protected]1e960032013-12-20 19:00:201784TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
[email protected]1e960032013-12-20 19:00:201785 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031786 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051787 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561788 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021789 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1790 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031791 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051792 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031793 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501794 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591795 mock_quic_data.AddRead(ASYNC, 0); // EOF
rcha5399e02015-04-21 19:32:041796 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]3a120a6b2013-06-25 01:08:271797
1798 // In order for a new QUIC session to be established via alternate-protocol
1799 // without racing an HTTP connection, we need the host resolution to happen
1800 // synchronously.
1801 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291802 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561803 "");
rch9ae5b3b2016-02-11 00:36:291804 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]3a120a6b2013-06-25 01:08:271805 AddressList address;
rjshaded5ced072015-12-18 19:26:021806 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1807 nullptr, net_log_.bound());
[email protected]3a120a6b2013-06-25 01:08:271808
rch3f4b8452016-02-23 16:59:321809 CreateSession();
[email protected]3a120a6b2013-06-25 01:08:271810 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1811 SendRequestAndExpectQuicResponse("hello!");
1812}
1813
[email protected]0fc924b2014-03-31 04:34:151814TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) {
rdsmith82957ad2015-09-16 19:42:031815 proxy_service_ = ProxyService::CreateFixedFromPacResult("PROXY myproxy:70");
[email protected]0fc924b2014-03-31 04:34:151816
1817 // Since we are using a proxy, the QUIC job will not succeed.
1818 MockWrite http_writes[] = {
rch9ae5b3b2016-02-11 00:36:291819 MockWrite(SYNCHRONOUS, 0, "GET http://mail.example.org/ HTTP/1.1\r\n"),
1820 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561821 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")};
[email protected]0fc924b2014-03-31 04:34:151822
1823 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561824 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1825 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1826 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]0fc924b2014-03-31 04:34:151827
1828 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
1829 http_writes, arraysize(http_writes));
1830 socket_factory_.AddSocketDataProvider(&http_data);
1831
1832 // In order for a new QUIC session to be established via alternate-protocol
1833 // without racing an HTTP connection, we need the host resolution to happen
1834 // synchronously.
1835 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291836 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561837 "");
rch9ae5b3b2016-02-11 00:36:291838 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]0fc924b2014-03-31 04:34:151839 AddressList address;
rjshaded5ced072015-12-18 19:26:021840 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1841 nullptr, net_log_.bound());
[email protected]0fc924b2014-03-31 04:34:151842
rch9ae5b3b2016-02-11 00:36:291843 request_.url = GURL("http://mail.example.org/");
rch3f4b8452016-02-23 16:59:321844 CreateSession();
[email protected]0fc924b2014-03-31 04:34:151845 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1846 SendRequestAndExpectHttpResponse("hello world");
1847}
1848
[email protected]1e960032013-12-20 19:00:201849TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
[email protected]1e960032013-12-20 19:00:201850 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031851 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051852 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561853 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021854 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1855 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031856 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051857 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031858 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591859 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
rcha5399e02015-04-21 19:32:041860 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]11c05872013-08-20 02:04:121861
1862 // The non-alternate protocol job needs to hang in order to guarantee that
1863 // the alternate-protocol job will "win".
1864 AddHangingNonAlternateProtocolSocketData();
1865
1866 // In order for a new QUIC session to be established via alternate-protocol
1867 // without racing an HTTP connection, we need the host resolution to happen
1868 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1869 // connection to the the server, in this test we require confirmation
1870 // before encrypting so the HTTP job will still start.
1871 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291872 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561873 "");
rch9ae5b3b2016-02-11 00:36:291874 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]11c05872013-08-20 02:04:121875 AddressList address;
rjshaded5ced072015-12-18 19:26:021876 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1877 nullptr, net_log_.bound());
[email protected]11c05872013-08-20 02:04:121878
rch3f4b8452016-02-23 16:59:321879 CreateSession();
[email protected]11c05872013-08-20 02:04:121880 session_->quic_stream_factory()->set_require_confirmation(true);
1881 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1882
1883 scoped_ptr<HttpNetworkTransaction> trans(
1884 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1885 TestCompletionCallback callback;
1886 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1887 EXPECT_EQ(ERR_IO_PENDING, rv);
1888
1889 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1890 QuicSession::HANDSHAKE_CONFIRMED);
1891 EXPECT_EQ(OK, callback.WaitForResult());
rchb27683c2015-07-29 23:53:501892
1893 CheckWasQuicResponse(trans);
1894 CheckResponseData(trans, "hello!");
[email protected]11c05872013-08-20 02:04:121895}
1896
zhongyica364fbb2015-12-12 03:39:121897TEST_P(QuicNetworkTransactionTest,
1898 LogGranularQuicErrorCodeOnQuicProtocolErrorLocal) {
1899 MockQuicData mock_quic_data;
1900 mock_quic_data.AddWrite(
1901 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1902 GetRequestHeaders("GET", "https", "/")));
1903 // Read a close connection packet with
1904 // QuicErrorCode: QUIC_CRYPTO_VERSION_NOT_SUPPORTED from the peer.
1905 mock_quic_data.AddRead(ConstructConnectionClosePacket(1));
1906 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1907
1908 // The non-alternate protocol job needs to hang in order to guarantee that
1909 // the alternate-protocol job will "win".
1910 AddHangingNonAlternateProtocolSocketData();
1911
1912 // In order for a new QUIC session to be established via alternate-protocol
1913 // without racing an HTTP connection, we need the host resolution to happen
1914 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1915 // connection to the the server, in this test we require confirmation
1916 // before encrypting so the HTTP job will still start.
1917 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291918 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:121919 "");
rch9ae5b3b2016-02-11 00:36:291920 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:121921 AddressList address;
1922 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1923 nullptr, net_log_.bound());
1924
rch3f4b8452016-02-23 16:59:321925 CreateSession();
zhongyica364fbb2015-12-12 03:39:121926 session_->quic_stream_factory()->set_require_confirmation(true);
1927 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1928
1929 scoped_ptr<HttpNetworkTransaction> trans(
1930 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1931 TestCompletionCallback callback;
1932 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1933 EXPECT_EQ(ERR_IO_PENDING, rv);
1934
1935 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1936 QuicSession::HANDSHAKE_CONFIRMED);
1937 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
1938
1939 NetErrorDetails details;
1940 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1941
1942 trans->PopulateNetErrorDetails(&details);
1943 // Verify the error code logged is what sent by the peer.
1944 EXPECT_EQ(QUIC_CRYPTO_VERSION_NOT_SUPPORTED, details.quic_connection_error);
1945}
1946
1947TEST_P(QuicNetworkTransactionTest,
1948 LogGranularQuicErrorCodeOnQuicProtocolErrorRemote) {
1949 MockQuicData mock_quic_data;
1950 mock_quic_data.AddWrite(
1951 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1952 GetRequestHeaders("GET", "https", "/")));
1953 // Peer sending an invalid stream frame with a invalid stream error causes
1954 // this end to raise error and close connection.
1955 mock_quic_data.AddRead(ConstructRstPacket(1, false, kClientDataStreamId1,
1956 QUIC_STREAM_LAST_ERROR));
1957 std::string quic_error_details = "Invalid rst stream error code.";
1958 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(
1959 2, QuicTime::Delta::Infinite(), 0, 1, QUIC_INVALID_RST_STREAM_DATA,
1960 quic_error_details));
1961 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1962
1963 // The non-alternate protocol job needs to hang in order to guarantee that
1964 // the alternate-protocol job will "win".
1965 AddHangingNonAlternateProtocolSocketData();
1966
1967 // In order for a new QUIC session to be established via alternate-protocol
1968 // without racing an HTTP connection, we need the host resolution to happen
1969 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1970 // connection to the the server, in this test we require confirmation
1971 // before encrypting so the HTTP job will still start.
1972 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291973 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:121974 "");
rch9ae5b3b2016-02-11 00:36:291975 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:121976 AddressList address;
1977 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1978 nullptr, net_log_.bound());
1979
rch3f4b8452016-02-23 16:59:321980 CreateSession();
zhongyica364fbb2015-12-12 03:39:121981 session_->quic_stream_factory()->set_require_confirmation(true);
1982 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1983
1984 scoped_ptr<HttpNetworkTransaction> trans(
1985 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1986 TestCompletionCallback callback;
1987 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1988 EXPECT_EQ(ERR_IO_PENDING, rv);
1989
1990 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1991 QuicSession::HANDSHAKE_CONFIRMED);
1992 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
1993 NetErrorDetails details;
1994 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1995
1996 trans->PopulateNetErrorDetails(&details);
1997 EXPECT_EQ(QUIC_INVALID_RST_STREAM_DATA, details.quic_connection_error);
1998}
1999
[email protected]1e960032013-12-20 19:00:202000TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
[email protected]3316d422013-05-03 21:45:302001 // Alternate-protocol job
2002 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1));
2003 MockRead quic_reads[] = {
rchb27683c2015-07-29 23:53:502004 MockRead(ASYNC, close->data(), close->length()),
2005 MockRead(ASYNC, ERR_IO_PENDING), // No more data to read
2006 MockRead(ASYNC, OK), // EOF
[email protected]3316d422013-05-03 21:45:302007 };
rjshaded5ced072015-12-18 19:26:022008 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2009 0);
[email protected]3316d422013-05-03 21:45:302010 socket_factory_.AddSocketDataProvider(&quic_data);
2011
2012 // Main job which will succeed even though the alternate job fails.
2013 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022014 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2015 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2016 MockRead(ASYNC, OK)};
[email protected]3316d422013-05-03 21:45:302017
rjshaded5ced072015-12-18 19:26:022018 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2019 0);
[email protected]3316d422013-05-03 21:45:302020 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562021 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]3316d422013-05-03 21:45:302022
rch3f4b8452016-02-23 16:59:322023 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:192024 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2025 SendRequestAndExpectHttpResponse("hello from http");
2026 ExpectBrokenAlternateProtocolMapping();
[email protected]3316d422013-05-03 21:45:302027}
2028
[email protected]1e960032013-12-20 19:00:202029TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
[email protected]d03a66d2013-05-06 12:55:592030 // Alternate-protocol job
2031 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022032 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]d03a66d2013-05-06 12:55:592033 };
rjshaded5ced072015-12-18 19:26:022034 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2035 0);
[email protected]d03a66d2013-05-06 12:55:592036 socket_factory_.AddSocketDataProvider(&quic_data);
2037
2038 // Main job which will succeed even though the alternate job fails.
2039 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022040 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2041 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2042 MockRead(ASYNC, OK)};
[email protected]d03a66d2013-05-06 12:55:592043
rjshaded5ced072015-12-18 19:26:022044 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2045 0);
[email protected]d03a66d2013-05-06 12:55:592046 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562047 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]d03a66d2013-05-06 12:55:592048
rch3f4b8452016-02-23 16:59:322049 CreateSession();
[email protected]d03a66d2013-05-06 12:55:592050
[email protected]aa9b14d2013-05-10 23:45:192051 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2052 SendRequestAndExpectHttpResponse("hello from http");
2053 ExpectBrokenAlternateProtocolMapping();
[email protected]d03a66d2013-05-06 12:55:592054}
2055
[email protected]00c159f2014-05-21 22:38:162056TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) {
[email protected]eb71ab62014-05-23 07:57:532057 // Alternate-protocol job will fail when the session attempts to read.
[email protected]00c159f2014-05-21 22:38:162058 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022059 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162060 };
rjshaded5ced072015-12-18 19:26:022061 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2062 0);
[email protected]00c159f2014-05-21 22:38:162063 socket_factory_.AddSocketDataProvider(&quic_data);
2064
[email protected]eb71ab62014-05-23 07:57:532065 // Main job will also fail.
[email protected]00c159f2014-05-21 22:38:162066 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022067 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162068 };
2069
rjshaded5ced072015-12-18 19:26:022070 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2071 0);
[email protected]00c159f2014-05-21 22:38:162072 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED));
2073 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562074 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]00c159f2014-05-21 22:38:162075
rch3f4b8452016-02-23 16:59:322076 CreateSession();
[email protected]00c159f2014-05-21 22:38:162077
2078 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2079 scoped_ptr<HttpNetworkTransaction> trans(
2080 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2081 TestCompletionCallback callback;
2082 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2083 EXPECT_EQ(ERR_IO_PENDING, rv);
2084 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult());
2085 ExpectQuicAlternateProtocolMapping();
2086}
2087
[email protected]1e960032013-12-20 19:00:202088TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
[email protected]77c6c162013-08-17 02:57:452089 // Alternate-protocol job
2090 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022091 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]77c6c162013-08-17 02:57:452092 };
rjshaded5ced072015-12-18 19:26:022093 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2094 0);
[email protected]77c6c162013-08-17 02:57:452095 socket_factory_.AddSocketDataProvider(&quic_data);
2096
2097 AddHangingNonAlternateProtocolSocketData();
2098
[email protected]c92c1b52014-05-31 04:16:062099 // Second Alternate-protocol job which will race with the TCP job.
2100 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:422101 nullptr, 0);
[email protected]c92c1b52014-05-31 04:16:062102 socket_factory_.AddSocketDataProvider(&quic_data2);
2103
[email protected]4d283b32013-10-17 12:57:272104 // Final job that will proceed when the QUIC job fails.
2105 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022106 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2107 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2108 MockRead(ASYNC, OK)};
[email protected]4d283b32013-10-17 12:57:272109
rjshaded5ced072015-12-18 19:26:022110 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2111 0);
[email protected]4d283b32013-10-17 12:57:272112 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562113 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d283b32013-10-17 12:57:272114
rch3f4b8452016-02-23 16:59:322115 CreateSession();
[email protected]77c6c162013-08-17 02:57:452116
2117 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2118
[email protected]4d283b32013-10-17 12:57:272119 SendRequestAndExpectHttpResponse("hello from http");
[email protected]77c6c162013-08-17 02:57:452120
2121 ExpectBrokenAlternateProtocolMapping();
[email protected]4d283b32013-10-17 12:57:272122
rch37de576c2015-05-17 20:28:172123 EXPECT_TRUE(quic_data.AllReadDataConsumed());
2124 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
[email protected]77c6c162013-08-17 02:57:452125}
2126
[email protected]93b31772014-06-19 08:03:352127TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) {
[email protected]65768442014-06-06 23:37:032128 // Alternate-protocol job
2129 MockRead quic_reads[] = {
mmenkee24011922015-12-17 22:12:592130 MockRead(SYNCHRONOUS, ERR_IO_PENDING),
[email protected]65768442014-06-06 23:37:032131 };
rjshaded5ced072015-12-18 19:26:022132 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2133 0);
[email protected]65768442014-06-06 23:37:032134 socket_factory_.AddSocketDataProvider(&quic_data);
2135
2136 // Main job that will proceed when the QUIC job fails.
2137 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022138 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2139 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2140 MockRead(ASYNC, OK)};
[email protected]65768442014-06-06 23:37:032141
rjshaded5ced072015-12-18 19:26:022142 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2143 0);
[email protected]65768442014-06-06 23:37:032144 socket_factory_.AddSocketDataProvider(&http_data);
2145
rch3f4b8452016-02-23 16:59:322146 CreateSession();
[email protected]65768442014-06-06 23:37:032147
2148 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2149
2150 SendRequestAndExpectHttpResponse("hello from http");
2151}
2152
[email protected]eb71ab62014-05-23 07:57:532153TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
[email protected]4d590c9c2014-05-02 05:14:332154 // Alternate-protocol job will fail before creating a QUIC session.
rtennetibe635732014-10-02 22:51:422155 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0);
rjshaded5ced072015-12-18 19:26:022156 quic_data.set_connect_data(
2157 MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED));
[email protected]4d590c9c2014-05-02 05:14:332158 socket_factory_.AddSocketDataProvider(&quic_data);
2159
2160 // Main job which will succeed even though the alternate job fails.
2161 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022162 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2163 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2164 MockRead(ASYNC, OK)};
[email protected]4d590c9c2014-05-02 05:14:332165
rjshaded5ced072015-12-18 19:26:022166 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2167 0);
[email protected]4d590c9c2014-05-02 05:14:332168 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562169 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d590c9c2014-05-02 05:14:332170
rch3f4b8452016-02-23 16:59:322171 CreateSession();
[email protected]4d590c9c2014-05-02 05:14:332172 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2173 SendRequestAndExpectHttpResponse("hello from http");
[email protected]eb71ab62014-05-23 07:57:532174
2175 ExpectBrokenAlternateProtocolMapping();
[email protected]4d590c9c2014-05-02 05:14:332176}
2177
[email protected]4fee9672014-01-08 14:47:152178TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
[email protected]4fee9672014-01-08 14:47:152179 MockQuicData mock_quic_data;
rcha5399e02015-04-21 19:32:042180 mock_quic_data.AddSynchronousRead(ConstructConnectionClosePacket(1));
[email protected]92bf17c2014-03-03 21:14:032181 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:052182 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:562183 GetRequestHeaders("GET", "https", "/")));
[email protected]92bf17c2014-03-03 21:14:032184 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rcha5399e02015-04-21 19:32:042185 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4fee9672014-01-08 14:47:152186
2187 // When the QUIC connection fails, we will try the request again over HTTP.
2188 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:562189 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
2190 MockRead("hello world"),
2191 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2192 MockRead(ASYNC, OK)};
[email protected]4fee9672014-01-08 14:47:152193
rjshaded5ced072015-12-18 19:26:022194 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2195 0);
[email protected]4fee9672014-01-08 14:47:152196 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562197 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4fee9672014-01-08 14:47:152198
2199 // In order for a new QUIC session to be established via alternate-protocol
2200 // without racing an HTTP connection, we need the host resolution to happen
2201 // synchronously.
2202 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:292203 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:562204 "");
rch9ae5b3b2016-02-11 00:36:292205 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]4fee9672014-01-08 14:47:152206 AddressList address;
rjshaded5ced072015-12-18 19:26:022207 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2208 nullptr, net_log_.bound());
[email protected]4fee9672014-01-08 14:47:152209
rch3f4b8452016-02-23 16:59:322210 CreateSession();
[email protected]4fee9672014-01-08 14:47:152211 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2212 SendRequestAndExpectHttpResponse("hello world");
2213}
2214
bnc508835902015-05-12 20:10:292215TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) {
bncb07c05532015-05-14 19:07:202216 maker_.set_hostname("www.example.org");
tbansalc8a94ea2015-11-02 23:58:512217 EXPECT_FALSE(rtt_observer_.rtt_notification_received());
bnc508835902015-05-12 20:10:292218 MockQuicData mock_quic_data;
2219 mock_quic_data.AddWrite(
2220 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
2221 GetRequestHeaders("GET", "https", "/")));
2222 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
2223 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
2224 mock_quic_data.AddRead(
2225 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
2226 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:502227 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
bnc508835902015-05-12 20:10:292228 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2229
bncb07c05532015-05-14 19:07:202230 request_.url = GURL("https://www.example.org:443");
bnc508835902015-05-12 20:10:292231 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322232 CreateSession();
bnc508835902015-05-12 20:10:292233 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
2234 SendRequestAndExpectQuicResponse("hello!");
tbansalc8a94ea2015-11-02 23:58:512235 EXPECT_TRUE(rtt_observer_.rtt_notification_received());
bnc508835902015-05-12 20:10:292236}
2237
rtenneti56977812016-01-15 19:26:562238TEST_P(QuicNetworkTransactionTest, QuicUpload) {
rtenneti8a2f4632016-03-21 20:26:572239 params_.origins_to_force_quic_on.insert(
2240 HostPortPair::FromString("mail.example.org:443"));
rtenneti56977812016-01-15 19:26:562241
2242 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2243 MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_FAILED, 1)};
2244 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2245 arraysize(writes));
2246 socket_factory_.AddSocketDataProvider(&socket_data);
2247
2248 // The non-alternate protocol job needs to hang in order to guarantee that
2249 // the alternate-protocol job will "win".
2250 AddHangingNonAlternateProtocolSocketData();
2251
rch3f4b8452016-02-23 16:59:322252 params_.parse_alternative_services = false;
2253 params_.enable_alternative_service_with_different_host = false;
rtenneti56977812016-01-15 19:26:562254 CreateSession();
2255 request_.method = "POST";
2256 ChunkedUploadDataStream upload_data(0);
2257 upload_data.AppendData("1", 1, true);
2258
2259 request_.upload_data_stream = &upload_data;
2260
2261 scoped_ptr<HttpNetworkTransaction> trans(
2262 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2263 TestCompletionCallback callback;
2264 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2265 EXPECT_EQ(ERR_IO_PENDING, rv);
2266 EXPECT_NE(OK, callback.WaitForResult());
2267}
2268
[email protected]61a527782013-02-21 03:58:002269} // namespace test
2270} // namespace net