blob: 0a5ab02d4d141b75efb0b7cc6b0a8f44ced537bb [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";
rchf47265dc2016-03-21 21:33:1264static const char kQuicAlternateProtocolWithProbabilityHeader[] =
65 "Alternate-Protocol: 443:quic,p=.5\r\n\r\n";
rchf114d982015-10-21 01:34:5666static const char kQuicAlternateProtocolDifferentPortHeader[] =
67 "Alternate-Protocol: 137:quic\r\n\r\n";
68static const char kQuicAlternativeServiceHeader[] =
bncc958faa2015-07-31 18:14:5269 "Alt-Svc: quic=\":443\"\r\n\r\n";
rchf47265dc2016-03-21 21:33:1270static const char kQuicAlternativeServiceWithProbabilityHeader[] =
71 "Alt-Svc: quic=\":443\";p=\".5\"\r\n\r\n";
rchf114d982015-10-21 01:34:5672static const char kQuicAlternativeServiceDifferentPortHeader[] =
73 "Alt-Svc: quic=\":137\"\r\n\r\n";
[email protected]1e960032013-12-20 19:00:2074
rch9ae5b3b2016-02-11 00:36:2975const char kDefaultServerHostName[] = "mail.example.org";
bncb07c05532015-05-14 19:07:2076
[email protected]61a527782013-02-21 03:58:0077} // namespace
78
[email protected]1e960032013-12-20 19:00:2079// Helper class to encapsulate MockReads and MockWrites for QUIC.
80// Simplify ownership issues and the interaction with the MockSocketFactory.
81class MockQuicData {
82 public:
rtennetia004d332015-08-28 06:44:5783 MockQuicData() : packet_number_(0) {}
rcha5399e02015-04-21 19:32:0484
rjshaded5ced072015-12-18 19:26:0285 ~MockQuicData() { STLDeleteElements(&packets_); }
[email protected]1e960032013-12-20 19:00:2086
rcha5399e02015-04-21 19:32:0487 void AddSynchronousRead(scoped_ptr<QuicEncryptedPacket> packet) {
[email protected]1e960032013-12-20 19:00:2088 reads_.push_back(MockRead(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:5789 packet_number_++));
[email protected]1e960032013-12-20 19:00:2090 packets_.push_back(packet.release());
91 }
92
rcha5399e02015-04-21 19:32:0493 void AddRead(scoped_ptr<QuicEncryptedPacket> packet) {
94 reads_.push_back(
rtennetia004d332015-08-28 06:44:5795 MockRead(ASYNC, packet->data(), packet->length(), packet_number_++));
rcha5399e02015-04-21 19:32:0496 packets_.push_back(packet.release());
97 }
98
[email protected]1e960032013-12-20 19:00:2099 void AddRead(IoMode mode, int rv) {
rtennetia004d332015-08-28 06:44:57100 reads_.push_back(MockRead(mode, rv, packet_number_++));
[email protected]1e960032013-12-20 19:00:20101 }
102
103 void AddWrite(scoped_ptr<QuicEncryptedPacket> packet) {
104 writes_.push_back(MockWrite(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:57105 packet_number_++));
[email protected]1e960032013-12-20 19:00:20106 packets_.push_back(packet.release());
107 }
108
rcha5399e02015-04-21 19:32:04109 void AddSocketDataToFactory(MockClientSocketFactory* factory) {
rjshaded5ced072015-12-18 19:26:02110 MockRead* reads = reads_.empty() ? nullptr : &reads_[0];
111 MockWrite* writes = writes_.empty() ? nullptr : &writes_[0];
rcha5399e02015-04-21 19:32:04112 socket_data_.reset(
113 new SequencedSocketData(reads, reads_.size(), writes, writes_.size()));
[email protected]1e960032013-12-20 19:00:20114 factory->AddSocketDataProvider(socket_data_.get());
115 }
116
mmenkee24011922015-12-17 22:12:59117 void Resume() { socket_data_->Resume(); }
rchb27683c2015-07-29 23:53:50118
[email protected]1e960032013-12-20 19:00:20119 private:
120 std::vector<QuicEncryptedPacket*> packets_;
121 std::vector<MockWrite> writes_;
122 std::vector<MockRead> reads_;
rtennetia004d332015-08-28 06:44:57123 size_t packet_number_;
rchb27683c2015-07-29 23:53:50124 scoped_ptr<SequencedSocketData> socket_data_;
[email protected]1e960032013-12-20 19:00:20125};
126
tbansal7cec3812015-02-05 21:25:12127class ProxyHeadersHandler {
128 public:
129 ProxyHeadersHandler() : was_called_(false) {}
130
131 bool was_called() { return was_called_; }
132
133 void OnBeforeProxyHeadersSent(const ProxyInfo& proxy_info,
134 HttpRequestHeaders* request_headers) {
135 was_called_ = true;
136 }
137
138 private:
139 bool was_called_;
140};
141
tbansalfdf5665b2015-09-21 22:46:40142class TestNetworkQualityEstimator : public NetworkQualityEstimator {
143 public:
144 TestNetworkQualityEstimator()
145 : NetworkQualityEstimator(scoped_ptr<net::ExternalEstimateProvider>(),
tbansalc8a94ea2015-11-02 23:58:51146 std::map<std::string, std::string>()),
147 watcher_count_(0) {}
tbansalfdf5665b2015-09-21 22:46:40148
149 ~TestNetworkQualityEstimator() override {}
150
tbansalc8a94ea2015-11-02 23:58:51151 scoped_ptr<SocketPerformanceWatcher> CreateSocketPerformanceWatcher(
152 const Protocol protocol) override {
153 if (protocol != PROTOCOL_QUIC) {
154 NOTIMPLEMENTED();
155 }
156 ++watcher_count_;
157 return NetworkQualityEstimator::CreateSocketPerformanceWatcher(protocol);
tbansalfdf5665b2015-09-21 22:46:40158 }
159
tbansalc8a94ea2015-11-02 23:58:51160 size_t watcher_count() const { return watcher_count_; }
tbansalfdf5665b2015-09-21 22:46:40161
162 private:
tbansalc8a94ea2015-11-02 23:58:51163 size_t watcher_count_;
tbansalfdf5665b2015-09-21 22:46:40164 DISALLOW_COPY_AND_ASSIGN(TestNetworkQualityEstimator);
165};
166
tbansalc8a94ea2015-11-02 23:58:51167class TestRTTObserver : public NetworkQualityEstimator::RTTObserver {
168 public:
169 TestRTTObserver() : rtt_notification_received_(false) {}
170
171 bool rtt_notification_received() const { return rtt_notification_received_; }
172
173 // NetworkQualityEstimator::RttObserver implementation:
174 void OnRTTObservation(
175 int32_t rtt_ms,
176 const base::TimeTicks& timestamp,
177 net::NetworkQualityEstimator::ObservationSource source) override {
178 rtt_notification_received_ = true;
179 }
180
181 private:
182 bool rtt_notification_received_;
183};
184
[email protected]1e960032013-12-20 19:00:20185class QuicNetworkTransactionTest
186 : public PlatformTest,
[email protected]5d03bbd2014-03-07 16:19:16187 public ::testing::WithParamInterface<QuicVersion> {
[email protected]61a527782013-02-21 03:58:00188 protected:
[email protected]1c04f9522013-02-21 20:32:43189 QuicNetworkTransactionTest()
rtenneti4b06ae72014-08-26 03:43:43190 : clock_(new MockClock),
bncb07c05532015-05-14 19:07:20191 maker_(GetParam(), 0, clock_, kDefaultServerHostName),
rtenneti052774e2015-11-24 21:00:12192 cert_transparency_verifier_(new MultiLogCTVerifier()),
tbansalfdf5665b2015-09-21 22:46:40193 test_network_quality_estimator_(new TestNetworkQualityEstimator()),
[email protected]1c04f9522013-02-21 20:32:43194 ssl_config_service_(new SSLConfigServiceDefaults),
195 proxy_service_(ProxyService::CreateDirect()),
196 auth_handler_factory_(
[email protected]dda75ab2013-06-22 22:43:30197 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
[email protected]457d6952013-12-13 09:24:58198 random_generator_(0),
rchf114d982015-10-21 01:34:56199 ssl_data_(ASYNC, OK) {
[email protected]aa9b14d2013-05-10 23:45:19200 request_.method = "GET";
rchf114d982015-10-21 01:34:56201 std::string url("https://");
bncb07c05532015-05-14 19:07:20202 url.append(kDefaultServerHostName);
203 request_.url = GURL(url);
[email protected]aa9b14d2013-05-10 23:45:19204 request_.load_flags = 0;
[email protected]98a9d1252014-04-04 00:43:59205 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
rchf114d982015-10-21 01:34:56206
rch3f4b8452016-02-23 16:59:32207 params_.parse_alternative_services = true;
208 params_.enable_alternative_service_with_different_host = true;
209
rchf114d982015-10-21 01:34:56210 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29211 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
rchf114d982015-10-21 01:34:56212 verify_details_.cert_verify_result.verified_cert = cert;
213 verify_details_.cert_verify_result.is_issued_by_known_root = true;
214 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
[email protected]1c04f9522013-02-21 20:32:43215 }
[email protected]61a527782013-02-21 03:58:00216
dcheng67be2b1f2014-10-27 21:47:29217 void SetUp() override {
[email protected]61a527782013-02-21 03:58:00218 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34219 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00220 }
221
dcheng67be2b1f2014-10-27 21:47:29222 void TearDown() override {
[email protected]61a527782013-02-21 03:58:00223 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
224 // Empty the current queue.
[email protected]2da659e2013-05-23 20:51:34225 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00226 PlatformTest::TearDown();
227 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34228 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00229 }
230
[email protected]3316d422013-05-03 21:45:30231 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
rtennetia004d332015-08-28 06:44:57232 QuicPacketNumber num) {
[email protected]1e960032013-12-20 19:00:20233 return maker_.MakeConnectionClosePacket(num);
[email protected]3316d422013-05-03 21:45:30234 }
235
zhongyi6b5a3892016-03-12 04:46:20236 scoped_ptr<QuicEncryptedPacket> ConstructGoAwayPacket(
237 QuicPacketNumber num,
238 QuicErrorCode error_code,
239 std::string reason_phrase) {
240 return maker_.MakeGoAwayPacket(num, error_code, reason_phrase);
241 }
242
[email protected]61a527782013-02-21 03:58:00243 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket(
rtennetia004d332015-08-28 06:44:57244 QuicPacketNumber largest_received,
245 QuicPacketNumber least_unacked) {
zhongyi32569c62016-01-08 02:54:30246 return maker_.MakeAckPacket(2, largest_received, least_unacked,
247 least_unacked, true);
248 }
249
zhongyi6b5a3892016-03-12 04:46:20250 scoped_ptr<QuicEncryptedPacket> ConstructAckAndRstPacket(
251 QuicPacketNumber num,
252 QuicStreamId stream_id,
253 QuicRstStreamErrorCode error_code,
254 QuicPacketNumber largest_received,
255 QuicPacketNumber ack_least_unacked,
256 QuicPacketNumber stop_least_unacked) {
257 return maker_.MakeAckAndRstPacket(num, false, stream_id, error_code,
258 largest_received, ack_least_unacked,
259 stop_least_unacked, true);
260 }
261
zhongyi32569c62016-01-08 02:54:30262 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket(
263 QuicPacketNumber largest_received,
264 QuicPacketNumber least_unacked,
265 QuicTestPacketMaker* maker) {
266 return maker->MakeAckPacket(2, largest_received, least_unacked,
267 least_unacked, true);
268 }
269
270 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket(
271 QuicPacketNumber packet_number,
272 QuicPacketNumber largest_received,
273 QuicPacketNumber ack_least_unacked,
274 QuicPacketNumber stop_least_unacked) {
275 return maker_.MakeAckPacket(packet_number, largest_received,
276 ack_least_unacked, stop_least_unacked, true);
[email protected]1e960032013-12-20 19:00:20277 }
[email protected]61a527782013-02-21 03:58:00278
zhongyica364fbb2015-12-12 03:39:12279 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket(
280 QuicPacketNumber num,
281 QuicTime::Delta delta_time_largest_observed,
282 QuicPacketNumber largest_received,
283 QuicPacketNumber least_unacked,
284 QuicErrorCode quic_error,
285 std::string& quic_error_details) {
286 return maker_.MakeAckAndConnectionClosePacket(
287 num, false, delta_time_largest_observed, largest_received,
288 least_unacked, quic_error, quic_error_details);
289 }
290
291 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket(
292 QuicPacketNumber num,
293 bool include_version,
294 QuicStreamId stream_id,
295 QuicRstStreamErrorCode error_code) {
296 return maker_.MakeRstPacket(num, include_version, stream_id, error_code);
297 }
298
zhongyi32569c62016-01-08 02:54:30299 // Uses default QuicTestPacketMaker.
[email protected]1e960032013-12-20 19:00:20300 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
301 const std::string& scheme,
302 const std::string& path) {
zhongyi32569c62016-01-08 02:54:30303 return GetRequestHeaders(method, scheme, path, maker_);
304 }
305
306 // Uses customized QuicTestPacketMaker.
307 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
308 const std::string& scheme,
309 const std::string& path,
310 QuicTestPacketMaker& maker) {
311 return maker.GetRequestHeaders(method, scheme, path);
[email protected]61a527782013-02-21 03:58:00312 }
313
[email protected]1e960032013-12-20 19:00:20314 SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
315 return maker_.GetResponseHeaders(status);
[email protected]61a527782013-02-21 03:58:00316 }
317
zhongyi32569c62016-01-08 02:54:30318 // Appends alt_svc headers in the response headers.
319 SpdyHeaderBlock GetResponseHeaders(const std::string& status,
320 const std::string& alt_svc) {
321 return maker_.GetResponseHeaders(status, alt_svc);
322 }
323
[email protected]1e960032013-12-20 19:00:20324 scoped_ptr<QuicEncryptedPacket> ConstructDataPacket(
rtennetia004d332015-08-28 06:44:57325 QuicPacketNumber packet_number,
[email protected]98b20ce2013-05-10 05:55:26326 QuicStreamId stream_id,
[email protected]e8ff26842013-03-22 21:02:05327 bool should_include_version,
[email protected]61a527782013-02-21 03:58:00328 bool fin,
329 QuicStreamOffset offset,
330 base::StringPiece data) {
rtennetia004d332015-08-28 06:44:57331 return maker_.MakeDataPacket(packet_number, stream_id,
332 should_include_version, fin, offset, data);
[email protected]61a527782013-02-21 03:58:00333 }
334
[email protected]1e960032013-12-20 19:00:20335 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
rtennetia004d332015-08-28 06:44:57336 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20337 QuicStreamId stream_id,
338 bool should_include_version,
339 bool fin,
zhongyi32569c62016-01-08 02:54:30340 const SpdyHeaderBlock& headers,
341 QuicStreamOffset* offset) {
ianswett0888cff2015-11-24 17:42:16342 SpdyPriority priority =
rtennetif4bdb542015-01-21 14:33:05343 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
zhongyi32569c62016-01-08 02:54:30344 return maker_.MakeRequestHeadersPacketWithOffsetTracking(
345 packet_number, stream_id, should_include_version, fin, priority,
346 headers, offset);
347 }
348
349 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
350 QuicPacketNumber packet_number,
351 QuicStreamId stream_id,
352 bool should_include_version,
353 bool fin,
354 const SpdyHeaderBlock& headers,
355 QuicStreamOffset* offset,
356 QuicTestPacketMaker* maker) {
357 SpdyPriority priority =
358 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
359 return maker->MakeRequestHeadersPacketWithOffsetTracking(
360 packet_number, stream_id, should_include_version, fin, priority,
361 headers, offset);
362 }
363
364 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
365 QuicPacketNumber packet_number,
366 QuicStreamId stream_id,
367 bool should_include_version,
368 bool fin,
369 const SpdyHeaderBlock& headers) {
370 return ConstructRequestHeadersPacket(packet_number, stream_id,
371 should_include_version, fin, headers,
372 nullptr, &maker_);
373 }
374 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
375 QuicPacketNumber packet_number,
376 QuicStreamId stream_id,
377 bool should_include_version,
378 bool fin,
379 const SpdyHeaderBlock& headers,
380 QuicTestPacketMaker* maker) {
381 return ConstructRequestHeadersPacket(packet_number, stream_id,
382 should_include_version, fin, headers,
383 nullptr, maker);
[email protected]61a527782013-02-21 03:58:00384 }
385
[email protected]1e960032013-12-20 19:00:20386 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
rtennetia004d332015-08-28 06:44:57387 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20388 QuicStreamId stream_id,
389 bool should_include_version,
390 bool fin,
391 const SpdyHeaderBlock& headers) {
zhongyi32569c62016-01-08 02:54:30392 return ConstructResponseHeadersPacket(packet_number, stream_id,
393 should_include_version, fin, headers,
394 nullptr, &maker_);
395 }
396
397 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
398 QuicPacketNumber packet_number,
399 QuicStreamId stream_id,
400 bool should_include_version,
401 bool fin,
402 const SpdyHeaderBlock& headers,
403 QuicTestPacketMaker* maker) {
404 return ConstructResponseHeadersPacket(packet_number, stream_id,
405 should_include_version, fin, headers,
406 nullptr, maker);
407 }
408
409 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
410 QuicPacketNumber packet_number,
411 QuicStreamId stream_id,
412 bool should_include_version,
413 bool fin,
414 const SpdyHeaderBlock& headers,
415 QuicStreamOffset* offset) {
416 return maker_.MakeResponseHeadersPacketWithOffsetTracking(
417 packet_number, stream_id, should_include_version, fin, headers, offset);
418 }
419
420 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
421 QuicPacketNumber packet_number,
422 QuicStreamId stream_id,
423 bool should_include_version,
424 bool fin,
425 const SpdyHeaderBlock& headers,
426 QuicStreamOffset* offset,
427 QuicTestPacketMaker* maker) {
428 return maker->MakeResponseHeadersPacketWithOffsetTracking(
429 packet_number, stream_id, should_include_version, fin, headers, offset);
[email protected]61a527782013-02-21 03:58:00430 }
431
rch3f4b8452016-02-23 16:59:32432 void CreateSession() { CreateSessionWithFactory(&socket_factory_); }
[email protected]dda75ab2013-06-22 22:43:30433
rch3f4b8452016-02-23 16:59:32434 void CreateSessionWithFactory(ClientSocketFactory* socket_factory) {
[email protected]4dca587c2013-03-07 16:54:47435 params_.enable_quic = true;
436 params_.quic_clock = clock_;
437 params_.quic_random = &random_generator_;
[email protected]dda75ab2013-06-22 22:43:30438 params_.client_socket_factory = socket_factory;
[email protected]e8ff26842013-03-22 21:02:05439 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43440 params_.host_resolver = &host_resolver_;
441 params_.cert_verifier = &cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11442 params_.transport_security_state = &transport_security_state_;
rtenneti052774e2015-11-24 21:00:12443 params_.cert_transparency_verifier = cert_transparency_verifier_.get();
tbansalfdf5665b2015-09-21 22:46:40444 params_.socket_performance_watcher_factory =
445 test_network_quality_estimator_.get();
[email protected]1c04f9522013-02-21 20:32:43446 params_.proxy_service = proxy_service_.get();
447 params_.ssl_config_service = ssl_config_service_.get();
448 params_.http_auth_handler_factory = auth_handler_factory_.get();
bnc6be245c12015-05-15 11:24:07449 params_.http_server_properties = http_server_properties_.GetWeakPtr();
[email protected]1e960032013-12-20 19:00:20450 params_.quic_supported_versions = SupportedVersions(GetParam());
rch74da0e1a2016-01-14 02:49:32451 for (const char* host :
rch9ae5b3b2016-02-11 00:36:29452 {kDefaultServerHostName, "www.example.org", "news.example.org",
453 "bar.example.org", "foo.example.org", "invalid.example.org",
454 "mail.example.com"}) {
rch74da0e1a2016-01-14 02:49:32455 params_.quic_host_whitelist.insert(host);
456 }
[email protected]61a527782013-02-21 03:58:00457
tbansalc8a94ea2015-11-02 23:58:51458 test_network_quality_estimator_->AddRTTObserver(&rtt_observer_);
459
mmenkee65e7af2015-10-13 17:16:42460 session_.reset(new HttpNetworkSession(params_));
[email protected]11c05872013-08-20 02:04:12461 session_->quic_stream_factory()->set_require_confirmation(false);
rch185ebee2015-07-14 23:56:22462 ASSERT_EQ(params_.quic_socket_receive_buffer_size,
463 session_->quic_stream_factory()->socket_receive_buffer_size());
[email protected]61a527782013-02-21 03:58:00464 }
465
[email protected]aa9b14d2013-05-10 23:45:19466 void CheckWasQuicResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
467 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42468 ASSERT_TRUE(response != nullptr);
469 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19470 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
471 EXPECT_TRUE(response->was_fetched_via_spdy);
472 EXPECT_TRUE(response->was_npn_negotiated);
473 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
474 response->connection_info);
475 }
476
bnc62a44f022015-04-02 15:59:41477 void CheckResponsePort(const scoped_ptr<HttpNetworkTransaction>& trans,
Avi Drissman13fc8932015-12-20 04:40:46478 uint16_t port) {
bnc62a44f022015-04-02 15:59:41479 const HttpResponseInfo* response = trans->GetResponseInfo();
480 ASSERT_TRUE(response != nullptr);
481 EXPECT_EQ(port, response->socket_address.port());
482 }
483
[email protected]aa9b14d2013-05-10 23:45:19484 void CheckWasHttpResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
485 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42486 ASSERT_TRUE(response != nullptr);
487 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19488 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
489 EXPECT_FALSE(response->was_fetched_via_spdy);
490 EXPECT_FALSE(response->was_npn_negotiated);
491 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1,
492 response->connection_info);
493 }
494
bncffc2fdf2015-05-14 18:29:49495 void CheckResponseData(const scoped_ptr<HttpNetworkTransaction>& trans,
[email protected]aa9b14d2013-05-10 23:45:19496 const std::string& expected) {
497 std::string response_data;
bncffc2fdf2015-05-14 18:29:49498 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
[email protected]aa9b14d2013-05-10 23:45:19499 EXPECT_EQ(expected, response_data);
500 }
501
bncffc2fdf2015-05-14 18:29:49502 void RunTransaction(const scoped_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19503 TestCompletionCallback callback;
504 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
505 EXPECT_EQ(ERR_IO_PENDING, rv);
506 EXPECT_EQ(OK, callback.WaitForResult());
507 }
508
509 void SendRequestAndExpectHttpResponse(const std::string& expected) {
510 scoped_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50511 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
bncffc2fdf2015-05-14 18:29:49512 RunTransaction(trans);
[email protected]aa9b14d2013-05-10 23:45:19513 CheckWasHttpResponse(trans);
bncffc2fdf2015-05-14 18:29:49514 CheckResponseData(trans, expected);
[email protected]aa9b14d2013-05-10 23:45:19515 }
516
517 void SendRequestAndExpectQuicResponse(const std::string& expected) {
rchf114d982015-10-21 01:34:56518 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, 443);
tbansal7cec3812015-02-05 21:25:12519 }
520
bnc62a44f022015-04-02 15:59:41521 void SendRequestAndExpectQuicResponseOnPort(const std::string& expected,
Avi Drissman13fc8932015-12-20 04:40:46522 uint16_t port) {
bnc62a44f022015-04-02 15:59:41523 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, port);
524 }
525
526 void SendRequestAndExpectQuicResponseFromProxyOnPort(
527 const std::string& expected,
Avi Drissman13fc8932015-12-20 04:40:46528 uint16_t port) {
bnc62a44f022015-04-02 15:59:41529 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port);
[email protected]aa9b14d2013-05-10 23:45:19530 }
531
532 void AddQuicAlternateProtocolMapping(
533 MockCryptoClientStream::HandshakeMode handshake_mode) {
534 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
bnccacc0992015-03-20 20:22:22535 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url);
rchf114d982015-10-21 01:34:56536 AlternativeService alternative_service(QUIC, host_port_pair.host(), 443);
bnc7dc7e1b42015-07-28 14:43:12537 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
538 http_server_properties_.SetAlternativeService(
rchdc7b9052016-03-17 20:51:50539 host_port_pair, alternative_service, expiration);
[email protected]aa9b14d2013-05-10 23:45:19540 }
541
rchbe69cb902016-02-11 01:10:48542 void AddQuicRemoteAlternativeServiceMapping(
543 MockCryptoClientStream::HandshakeMode handshake_mode,
544 const HostPortPair& alternative) {
545 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
546 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url);
547 AlternativeService alternative_service(QUIC, alternative.host(),
548 alternative.port());
549 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
550 http_server_properties_.SetAlternativeService(
rchdc7b9052016-03-17 20:51:50551 host_port_pair, alternative_service, expiration);
rchbe69cb902016-02-11 01:10:48552 }
553
[email protected]aa9b14d2013-05-10 23:45:19554 void ExpectBrokenAlternateProtocolMapping() {
bnc8445b3002015-03-13 01:57:09555 const HostPortPair origin = HostPortPair::FromURL(request_.url);
bncd9b132e2015-07-08 05:16:10556 const AlternativeServiceVector alternative_service_vector =
557 http_server_properties_.GetAlternativeServices(origin);
558 EXPECT_EQ(1u, alternative_service_vector.size());
bnc6be245c12015-05-15 11:24:07559 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken(
bncd9b132e2015-07-08 05:16:10560 alternative_service_vector[0]));
[email protected]aa9b14d2013-05-10 23:45:19561 }
562
[email protected]4d590c9c2014-05-02 05:14:33563 void ExpectQuicAlternateProtocolMapping() {
bncd9b132e2015-07-08 05:16:10564 const HostPortPair origin = HostPortPair::FromURL(request_.url);
565 const AlternativeServiceVector alternative_service_vector =
566 http_server_properties_.GetAlternativeServices(origin);
567 EXPECT_EQ(1u, alternative_service_vector.size());
568 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
[email protected]4d590c9c2014-05-02 05:14:33569 }
570
[email protected]aa9b14d2013-05-10 23:45:19571 void AddHangingNonAlternateProtocolSocketData() {
zhongyi32569c62016-01-08 02:54:30572 scoped_ptr<StaticSocketDataProvider> hanging_data;
573 hanging_data.reset(new StaticSocketDataProvider());
[email protected]dda75ab2013-06-22 22:43:30574 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
zhongyi32569c62016-01-08 02:54:30575 hanging_data->set_connect_data(hanging_connect);
576 hanging_data_.push_back(std::move(hanging_data));
577 socket_factory_.AddSocketDataProvider(hanging_data_.back().get());
rchf114d982015-10-21 01:34:56578 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]aa9b14d2013-05-10 23:45:19579 }
580
rtenneti4b06ae72014-08-26 03:43:43581 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
[email protected]1e960032013-12-20 19:00:20582 QuicTestPacketMaker maker_;
mmenkee65e7af2015-10-13 17:16:42583 scoped_ptr<HttpNetworkSession> session_;
[email protected]61a527782013-02-21 03:58:00584 MockClientSocketFactory socket_factory_;
rchf114d982015-10-21 01:34:56585 ProofVerifyDetailsChromium verify_details_;
[email protected]e8ff26842013-03-22 21:02:05586 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43587 MockHostResolver host_resolver_;
588 MockCertVerifier cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11589 TransportSecurityState transport_security_state_;
rtenneti052774e2015-11-24 21:00:12590 scoped_ptr<CTVerifier> cert_transparency_verifier_;
tbansalfdf5665b2015-09-21 22:46:40591 scoped_ptr<TestNetworkQualityEstimator> test_network_quality_estimator_;
tbansalc8a94ea2015-11-02 23:58:51592 TestRTTObserver rtt_observer_;
[email protected]1c04f9522013-02-21 20:32:43593 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
594 scoped_ptr<ProxyService> proxy_service_;
595 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
[email protected]61a527782013-02-21 03:58:00596 MockRandom random_generator_;
bnc6be245c12015-05-15 11:24:07597 HttpServerPropertiesImpl http_server_properties_;
[email protected]61a527782013-02-21 03:58:00598 HttpNetworkSession::Params params_;
[email protected]aa9b14d2013-05-10 23:45:19599 HttpRequestInfo request_;
vishal.b62985ca92015-04-17 08:45:51600 BoundTestNetLog net_log_;
zhongyi32569c62016-01-08 02:54:30601 std::vector<scoped_ptr<StaticSocketDataProvider>> hanging_data_;
rchf114d982015-10-21 01:34:56602 SSLSocketDataProvider ssl_data_;
tbansal7cec3812015-02-05 21:25:12603
604 private:
605 void SendRequestAndExpectQuicResponseMaybeFromProxy(
606 const std::string& expected,
bnc62a44f022015-04-02 15:59:41607 bool used_proxy,
Avi Drissman13fc8932015-12-20 04:40:46608 uint16_t port) {
tbansal7cec3812015-02-05 21:25:12609 scoped_ptr<HttpNetworkTransaction> trans(
610 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
611 ProxyHeadersHandler proxy_headers_handler;
612 trans->SetBeforeProxyHeadersSentCallback(
613 base::Bind(&ProxyHeadersHandler::OnBeforeProxyHeadersSent,
614 base::Unretained(&proxy_headers_handler)));
bncffc2fdf2015-05-14 18:29:49615 RunTransaction(trans);
tbansal7cec3812015-02-05 21:25:12616 CheckWasQuicResponse(trans);
bnc62a44f022015-04-02 15:59:41617 CheckResponsePort(trans, port);
bncffc2fdf2015-05-14 18:29:49618 CheckResponseData(trans, expected);
tbansal7cec3812015-02-05 21:25:12619 EXPECT_EQ(used_proxy, proxy_headers_handler.was_called());
620 }
[email protected]61a527782013-02-21 03:58:00621};
622
rjshaded5ced072015-12-18 19:26:02623INSTANTIATE_TEST_CASE_P(Version,
624 QuicNetworkTransactionTest,
[email protected]1e960032013-12-20 19:00:20625 ::testing::ValuesIn(QuicSupportedVersions()));
626
627TEST_P(QuicNetworkTransactionTest, ForceQuic) {
rtenneti8a2f4632016-03-21 20:26:57628 params_.origins_to_force_quic_on.insert(
629 HostPortPair::FromString("mail.example.org:443"));
[email protected]4dca587c2013-03-07 16:54:47630
[email protected]1e960032013-12-20 19:00:20631 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03632 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05633 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56634 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:02635 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
636 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:03637 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05638 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03639 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:59640 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
[email protected]4dca587c2013-03-07 16:54:47641
rcha5399e02015-04-21 19:32:04642 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4dca587c2013-03-07 16:54:47643
[email protected]aa9b14d2013-05-10 23:45:19644 // The non-alternate protocol job needs to hang in order to guarantee that
645 // the alternate-protocol job will "win".
646 AddHangingNonAlternateProtocolSocketData();
[email protected]4dca587c2013-03-07 16:54:47647
rch3f4b8452016-02-23 16:59:32648 params_.parse_alternative_services = false;
649 params_.enable_alternative_service_with_different_host = false;
[email protected]4dca587c2013-03-07 16:54:47650 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47651
tbansalc8a94ea2015-11-02 23:58:51652 EXPECT_FALSE(rtt_observer_.rtt_notification_received());
[email protected]aa9b14d2013-05-10 23:45:19653 SendRequestAndExpectQuicResponse("hello!");
tbansalc8a94ea2015-11-02 23:58:51654 EXPECT_TRUE(rtt_observer_.rtt_notification_received());
[email protected]4dca587c2013-03-07 16:54:47655
[email protected]98b20ce2013-05-10 05:55:26656 // Check that the NetLog was filled reasonably.
mmenke43758e62015-05-04 21:09:46657 TestNetLogEntry::List entries;
[email protected]aa9b14d2013-05-10 23:45:19658 net_log_.GetEntries(&entries);
[email protected]98b20ce2013-05-10 05:55:26659 EXPECT_LT(0u, entries.size());
660
661 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29662 int pos = ExpectLogContainsSomewhere(
663 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
664 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26665 EXPECT_LT(0, pos);
666
rchfd527212015-08-25 00:41:26667 // ... and also a TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29668 pos = ExpectLogContainsSomewhere(
rchfd527212015-08-25 00:41:26669 entries, 0,
670 NetLog::TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED,
ttuttle859dc7a2015-04-23 19:42:29671 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26672 EXPECT_LT(0, pos);
673
rtennetia004d332015-08-28 06:44:57674 std::string packet_number;
675 ASSERT_TRUE(entries[pos].GetStringValue("packet_number", &packet_number));
676 EXPECT_EQ("1", packet_number);
[email protected]98b20ce2013-05-10 05:55:26677
rchfd527212015-08-25 00:41:26678 // ... and also a TYPE_QUIC_SESSION_PACKET_AUTHENTICATED.
679 pos = ExpectLogContainsSomewhere(
680 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_AUTHENTICATED,
681 NetLog::PHASE_NONE);
682 EXPECT_LT(0, pos);
683
[email protected]98b20ce2013-05-10 05:55:26684 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29685 pos = ExpectLogContainsSomewhere(
686 entries, 0, NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
687 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26688 EXPECT_LT(0, pos);
689
690 int log_stream_id;
691 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
[email protected]1e960032013-12-20 19:00:20692 EXPECT_EQ(3, log_stream_id);
[email protected]4dca587c2013-03-07 16:54:47693}
694
[email protected]cf3e3cd62014-02-05 16:16:16695TEST_P(QuicNetworkTransactionTest, QuicProxy) {
tbansaled0aecc2015-02-20 03:44:18696 params_.enable_quic_for_proxies = true;
rchf114d982015-10-21 01:34:56697 proxy_service_ =
rch9ae5b3b2016-02-11 00:36:29698 ProxyService::CreateFixedFromPacResult("QUIC mail.example.org:70");
[email protected]cf3e3cd62014-02-05 16:16:16699
[email protected]cf3e3cd62014-02-05 16:16:16700 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03701 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05702 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03703 GetRequestHeaders("GET", "http", "/")));
rjshaded5ced072015-12-18 19:26:02704 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
705 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:03706 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05707 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03708 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50709 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59710 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]cf3e3cd62014-02-05 16:16:16711
rcha5399e02015-04-21 19:32:04712 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cf3e3cd62014-02-05 16:16:16713
tbansalc8a94ea2015-11-02 23:58:51714 EXPECT_FALSE(rtt_observer_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16715 // There is no need to set up an alternate protocol job, because
716 // no attempt will be made to speak to the proxy over TCP.
717
rch9ae5b3b2016-02-11 00:36:29718 request_.url = GURL("http://mail.example.org/");
rch3f4b8452016-02-23 16:59:32719 params_.parse_alternative_services = false;
720 params_.enable_alternative_service_with_different_host = false;
[email protected]cf3e3cd62014-02-05 16:16:16721 CreateSession();
722
bnc62a44f022015-04-02 15:59:41723 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
tbansalc8a94ea2015-11-02 23:58:51724 EXPECT_TRUE(rtt_observer_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16725}
726
bnc313ba9c2015-06-11 15:42:31727// Regression test for https://crbug.com/492458. Test that for an HTTP
728// connection through a QUIC proxy, the certificate exhibited by the proxy is
729// checked against the proxy hostname, not the origin hostname.
730TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) {
rch9ae5b3b2016-02-11 00:36:29731 const std::string origin_host = "mail.example.com";
bnc313ba9c2015-06-11 15:42:31732 const std::string proxy_host = "www.example.org";
733
734 params_.enable_quic_for_proxies = true;
rdsmith82957ad2015-09-16 19:42:03735 proxy_service_ =
736 ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70");
bnc313ba9c2015-06-11 15:42:31737
738 maker_.set_hostname(origin_host);
739 MockQuicData mock_quic_data;
740 mock_quic_data.AddWrite(
741 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
742 GetRequestHeaders("GET", "http", "/")));
743 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
744 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
745 mock_quic_data.AddRead(
746 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
747 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50748 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59749 mock_quic_data.AddRead(ASYNC, 0);
bnc313ba9c2015-06-11 15:42:31750 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
751
752 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29753 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bnc313ba9c2015-06-11 15:42:31754 ASSERT_TRUE(cert.get());
755 // This certificate is valid for the proxy, but not for the origin.
756 bool common_name_fallback_used;
757 EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used));
758 EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used));
759 ProofVerifyDetailsChromium verify_details;
760 verify_details.cert_verify_result.verified_cert = cert;
761 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rchf114d982015-10-21 01:34:56762 ProofVerifyDetailsChromium verify_details2;
763 verify_details2.cert_verify_result.verified_cert = cert;
764 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
bnc313ba9c2015-06-11 15:42:31765
766 request_.url = GURL("http://" + origin_host);
767 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32768 CreateSession();
bnc313ba9c2015-06-11 15:42:31769 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
770 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
771}
772
rchbe69cb902016-02-11 01:10:48773TEST_P(QuicNetworkTransactionTest, AlternativeServicesDifferentHost) {
774 params_.enable_alternative_service_with_different_host = true;
775 HostPortPair origin("www.example.org", 443);
776 HostPortPair alternative("mail.example.org", 443);
777
778 base::FilePath certs_dir = GetTestCertsDirectory();
779 scoped_refptr<X509Certificate> cert(
780 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
781 ASSERT_TRUE(cert.get());
782 // TODO(rch): the connection should be "to" the origin, so if the cert is
783 // valid for the origin but not the alternative, that should work too.
784 bool common_name_fallback_used;
785 EXPECT_TRUE(cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
786 EXPECT_TRUE(
787 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
788 ProofVerifyDetailsChromium verify_details;
789 verify_details.cert_verify_result.verified_cert = cert;
790 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
791
792 maker_.set_hostname(origin.host());
793 MockQuicData mock_quic_data;
794 mock_quic_data.AddWrite(
795 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
796 GetRequestHeaders("GET", "https", "/")));
797 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
798 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
799 mock_quic_data.AddRead(
800 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
801 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
802 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
803 mock_quic_data.AddRead(ASYNC, 0);
804 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
805
806 request_.url = GURL("https://" + origin.host());
807 AddQuicRemoteAlternativeServiceMapping(
808 MockCryptoClientStream::CONFIRM_HANDSHAKE, alternative);
809 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32810 CreateSession();
rchbe69cb902016-02-11 01:10:48811
812 SendRequestAndExpectQuicResponse("hello!");
813}
814
[email protected]1e960032013-12-20 19:00:20815TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
rtenneti8a2f4632016-03-21 20:26:57816 params_.origins_to_force_quic_on.insert(
817 HostPortPair::FromString("mail.example.org:443"));
[email protected]cebe3282013-05-22 23:49:30818
tbansalfdf5665b2015-09-21 22:46:40819 MockQuicData mock_quic_data1;
820 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
[email protected]1e960032013-12-20 19:00:20821
tbansalfdf5665b2015-09-21 22:46:40822 MockQuicData mock_quic_data2;
zhongyi32569c62016-01-08 02:54:30823 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40824 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
rch6faa4d42016-01-05 20:48:43825 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40826
827 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
828 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
[email protected]cebe3282013-05-22 23:49:30829
rch3f4b8452016-02-23 16:59:32830 params_.parse_alternative_services = false;
831 params_.enable_alternative_service_with_different_host = false;
[email protected]cebe3282013-05-22 23:49:30832 CreateSession();
833
tbansalc8a94ea2015-11-02 23:58:51834 EXPECT_EQ(0U, test_network_quality_estimator_->watcher_count());
tbansalfdf5665b2015-09-21 22:46:40835 for (size_t i = 0; i < 2; ++i) {
836 scoped_ptr<HttpNetworkTransaction> trans(
837 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
838 TestCompletionCallback callback;
839 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
840 EXPECT_EQ(ERR_IO_PENDING, rv);
841 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
tbansalc8a94ea2015-11-02 23:58:51842 EXPECT_EQ(1 + i, test_network_quality_estimator_->watcher_count());
tbansalfdf5665b2015-09-21 22:46:40843 }
[email protected]cebe3282013-05-22 23:49:30844}
845
tbansalc8a94ea2015-11-02 23:58:51846TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
847 // Attempt to "force" quic on 443, which will not be honored.
rtenneti8a2f4632016-03-21 20:26:57848 params_.origins_to_force_quic_on.insert(
849 HostPortPair::FromString("www.google.com:443"));
tbansalc8a94ea2015-11-02 23:58:51850
851 MockRead http_reads[] = {
852 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
853 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
854 MockRead(ASYNC, OK)};
855
856 StaticSocketDataProvider data(http_reads, arraysize(http_reads), nullptr, 0);
857 socket_factory_.AddSocketDataProvider(&data);
858 SSLSocketDataProvider ssl(ASYNC, OK);
859 socket_factory_.AddSSLSocketDataProvider(&ssl);
860
rch3f4b8452016-02-23 16:59:32861 params_.parse_alternative_services = false;
862 params_.enable_alternative_service_with_different_host = false;
tbansalc8a94ea2015-11-02 23:58:51863 CreateSession();
864
865 SendRequestAndExpectHttpResponse("hello world");
866 EXPECT_EQ(0U, test_network_quality_estimator_->watcher_count());
867}
868
bncc958faa2015-07-31 18:14:52869TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52870 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56871 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
872 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52873 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
874 MockRead(ASYNC, OK)};
875
876 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
877 0);
878 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56879 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52880
881 MockQuicData mock_quic_data;
882 mock_quic_data.AddWrite(
883 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56884 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52885 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
886 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
887 mock_quic_data.AddRead(
888 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
889 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
890 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59891 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52892
893 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
894
895 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32896 CreateSession();
bncc958faa2015-07-31 18:14:52897
898 SendRequestAndExpectHttpResponse("hello world");
899 SendRequestAndExpectQuicResponse("hello!");
900}
901
rchf47265dc2016-03-21 21:33:12902TEST_P(QuicNetworkTransactionTest,
903 UseAlternativeServiceWithProbabilityForQuic) {
904 MockRead http_reads[] = {
905 MockRead("HTTP/1.1 200 OK\r\n"),
906 MockRead(kQuicAlternativeServiceWithProbabilityHeader),
907 MockRead("hello world"),
908 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
909 MockRead(ASYNC, OK)};
910
911 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
912 0);
913 socket_factory_.AddSocketDataProvider(&http_data);
914 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
915
916 MockQuicData mock_quic_data;
917 mock_quic_data.AddWrite(
918 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
919 GetRequestHeaders("GET", "https", "/")));
920 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
921 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
922 mock_quic_data.AddRead(
923 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
924 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
925 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
926 mock_quic_data.AddRead(ASYNC, 0); // EOF
927
928 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
929
930 AddHangingNonAlternateProtocolSocketData();
931 CreateSession();
932
933 SendRequestAndExpectHttpResponse("hello world");
934 SendRequestAndExpectQuicResponse("hello!");
935}
936
bnc8be55ebb2015-10-30 14:12:07937TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) {
938 std::string altsvc_header = base::StringPrintf(
939 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam());
940 MockRead http_reads[] = {
941 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
942 MockRead("hello world"),
943 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
944 MockRead(ASYNC, OK)};
945
946 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
947 0);
948 socket_factory_.AddSocketDataProvider(&http_data);
949 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
950
951 MockQuicData mock_quic_data;
952 mock_quic_data.AddWrite(
953 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
954 GetRequestHeaders("GET", "https", "/")));
955 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
956 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
957 mock_quic_data.AddRead(
958 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
959 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
960 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59961 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc8be55ebb2015-10-30 14:12:07962
963 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
964
965 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32966 CreateSession();
bnc8be55ebb2015-10-30 14:12:07967
968 SendRequestAndExpectHttpResponse("hello world");
969 SendRequestAndExpectQuicResponse("hello!");
970}
971
zhongyi6b5a3892016-03-12 04:46:20972TEST_P(QuicNetworkTransactionTest, GoAwayWithConnectionMigrationOnPortsOnly) {
973 MockQuicData mock_quic_data;
974 mock_quic_data.AddWrite(
975 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
976 GetRequestHeaders("GET", "https", "/")));
977 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
978 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
979 // Read a GoAway packet with
980 // QuicErrorCode: QUIC_ERROR_MIGRATING_PORT from the peer.
981 mock_quic_data.AddRead(
982 ConstructGoAwayPacket(2, QUIC_ERROR_MIGRATING_PORT,
983 "connection migration with port change only"));
984 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
985 mock_quic_data.AddRead(
986 ConstructDataPacket(3, kClientDataStreamId1, false, true, 0, "hello!"));
987 mock_quic_data.AddWrite(ConstructAckAndRstPacket(
988 3, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 3, 3, 1));
989 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
990 mock_quic_data.AddRead(ASYNC, 0); // EOF
991
992 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
993
994 // The non-alternate protocol job needs to hang in order to guarantee that
995 // the alternate-protocol job will "win".
996 AddHangingNonAlternateProtocolSocketData();
997
998 // In order for a new QUIC session to be established via alternate-protocol
999 // without racing an HTTP connection, we need the host resolution to happen
1000 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1001 // connection to the the server, in this test we require confirmation
1002 // before encrypting so the HTTP job will still start.
1003 host_resolver_.set_synchronous_mode(true);
1004 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1005 "");
1006 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1007 AddressList address;
1008 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1009 nullptr, net_log_.bound());
1010
1011 CreateSession();
1012 session_->quic_stream_factory()->set_require_confirmation(true);
1013 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1014
1015 scoped_ptr<HttpNetworkTransaction> trans(
1016 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1017 TestCompletionCallback callback;
1018 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1019 EXPECT_EQ(ERR_IO_PENDING, rv);
1020
1021 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1022 QuicSession::HANDSHAKE_CONFIRMED);
1023 EXPECT_EQ(OK, callback.WaitForResult());
1024
1025 // Check whether this transaction is correctly marked as received a go-away
1026 // because of migrating port.
1027 NetErrorDetails details;
1028 EXPECT_FALSE(details.quic_port_migration_detected);
1029 trans->PopulateNetErrorDetails(&details);
1030 EXPECT_TRUE(details.quic_port_migration_detected);
1031}
1032
bnc8be55ebb2015-10-30 14:12:071033TEST_P(QuicNetworkTransactionTest,
1034 DoNotUseAlternativeServiceQuicUnsupportedVersion) {
1035 std::string altsvc_header = base::StringPrintf(
1036 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam() - 1);
1037 MockRead http_reads[] = {
1038 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1039 MockRead("hello world"),
1040 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1041 MockRead(ASYNC, OK)};
1042
1043 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1044 0);
1045 socket_factory_.AddSocketDataProvider(&http_data);
1046 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1047 socket_factory_.AddSocketDataProvider(&http_data);
1048 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1049
rch3f4b8452016-02-23 16:59:321050 CreateSession();
bnc8be55ebb2015-10-30 14:12:071051
1052 SendRequestAndExpectHttpResponse("hello world");
1053 SendRequestAndExpectHttpResponse("hello world");
1054}
1055
bncc958faa2015-07-31 18:14:521056// When multiple alternative services are advertised,
zhongyi32569c62016-01-08 02:54:301057// HttpStreamFactoryImpl::RequestStreamInternal() should select the alternative
1058// service which uses existing QUIC session if available. If no existing QUIC
1059// session can be used, use the first alternative service from the list.
1060TEST_P(QuicNetworkTransactionTest, UseExistingAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:521061 MockRead http_reads[] = {
1062 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291063 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
bncc958faa2015-07-31 18:14:521064 MockRead("hello world"),
1065 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1066 MockRead(ASYNC, OK)};
1067
1068 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1069 0);
1070 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561071 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521072
zhongyi32569c62016-01-08 02:54:301073 QuicStreamOffset request_header_offset = 0;
1074 QuicStreamOffset response_header_offset = 0;
1075 // First QUIC request data.
rch9ae5b3b2016-02-11 00:36:291076 // Open a session to foo.example.org:443 using the first entry of the
zhongyi32569c62016-01-08 02:54:301077 // alternative service list.
bncc958faa2015-07-31 18:14:521078 MockQuicData mock_quic_data;
zhongyi32569c62016-01-08 02:54:301079 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1080 1, kClientDataStreamId1, true, true,
1081 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1082
1083 std::string alt_svc_list =
rch9ae5b3b2016-02-11 00:36:291084 "quic=\"mail.example.org:444\", quic=\"foo.example.org:443\", "
1085 "quic=\"bar.example.org:445\"";
bncc958faa2015-07-31 18:14:521086 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301087 1, kClientDataStreamId1, false, false,
1088 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
bncc958faa2015-07-31 18:14:521089 mock_quic_data.AddRead(
1090 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1091 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301092
1093 // Second QUIC request data.
1094 // Connection pooling, using existing session, no need to include version
1095 // as version negotiation has been completed.
1096 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1097 3, kClientDataStreamId2, false, true,
1098 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1099 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1100 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1101 &response_header_offset));
1102 mock_quic_data.AddRead(
1103 ConstructDataPacket(4, kClientDataStreamId2, false, true, 0, "hello!"));
1104 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
bncc958faa2015-07-31 18:14:521105 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591106 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521107
1108 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1109
1110 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321111 CreateSession();
bncc958faa2015-07-31 18:14:521112
1113 SendRequestAndExpectHttpResponse("hello world");
zhongyi32569c62016-01-08 02:54:301114
bncc958faa2015-07-31 18:14:521115 SendRequestAndExpectQuicResponseOnPort("hello!", 443);
zhongyi32569c62016-01-08 02:54:301116 SendRequestAndExpectQuicResponseOnPort("hello!", 443);
1117}
1118
1119// When multiple alternative services that has existing QUIC session.
1120// HttpStreamFactoryImpl::RequestStreamInternal() should select the first
1121// alternative service which uses existing QUIC session.
1122TEST_P(QuicNetworkTransactionTest, UseFirstExistingAlternativeServiceForQuic) {
1123 MockRead http_reads[] = {
1124 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291125 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":446\"\r\n\r\n"),
zhongyi32569c62016-01-08 02:54:301126 MockRead("hello world"),
1127 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1128 MockRead(ASYNC, OK)};
1129
1130 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1131 0);
1132 socket_factory_.AddSocketDataProvider(&http_data);
1133 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1134
1135 QuicStreamOffset request_header_offset = 0;
1136 QuicStreamOffset response_header_offset = 0;
1137
1138 QuicTestPacketMaker maker(GetParam(), 0, clock_, kDefaultServerHostName);
1139
1140 MockQuicData mock_quic_data;
1141 MockQuicData mock_quic_data2;
1142 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
1143 // First QUIC request data.
rch9ae5b3b2016-02-11 00:36:291144 // Open a QUIC session to foo.example.org:443.
zhongyi32569c62016-01-08 02:54:301145 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1146 1, kClientDataStreamId1, true, true,
1147 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1148
1149 std::string alt_svc_list =
rch9ae5b3b2016-02-11 00:36:291150 "quic=\"bar.example.org:444\", quic=\"frog.example.org:445\", "
1151 "quic=\"mail.example.org:446\"";
zhongyi32569c62016-01-08 02:54:301152 // Response header from the server resets the alt_svc list for the origin.
1153 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1154 1, kClientDataStreamId1, false, false,
1155 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
1156 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1157 true, 0, "hello from foo!"));
1158 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1159
1160 // Second QUIC request data.
rch9ae5b3b2016-02-11 00:36:291161 // Existing QUIC session to foo.example.org is not viable from the updated
zhongyi32569c62016-01-08 02:54:301162 // alt_svc. Unable to pool the existing QUIC session.
rch9ae5b3b2016-02-11 00:36:291163 // Open a new QUIC session to bar.example.org:443.
zhongyi32569c62016-01-08 02:54:301164 mock_quic_data2.AddWrite(ConstructRequestHeadersPacket(
1165 1, kClientDataStreamId1, true, true,
1166 GetRequestHeaders("GET", "https", "/"), &maker));
1167 alt_svc_list =
rch9ae5b3b2016-02-11 00:36:291168 "quic=\"foo.example.org:443\", quic=\"mail.example.org:446\", "
1169 "quic=\"bar.example.org:444\"";
zhongyi32569c62016-01-08 02:54:301170 // Response header from the server resets the alt_svc list for the origin.
1171 mock_quic_data2.AddRead(ConstructResponseHeadersPacket(
1172 1, kClientDataStreamId1, false, false,
1173 GetResponseHeaders("200 OK", alt_svc_list), &maker));
1174 mock_quic_data2.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1175 true, 0, "hello from bar!"));
1176 mock_quic_data2.AddWrite(ConstructAckPacket(2, 1, &maker));
1177 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1178 mock_quic_data2.AddRead(ASYNC, 0); // EOF
1179
1180 // Third QUIC request data.
rch9ae5b3b2016-02-11 00:36:291181 // Connection pooling, using the first existing session to foo.example.org
zhongyi32569c62016-01-08 02:54:301182 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1183 3, kClientDataStreamId2, false, true,
1184 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1185 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1186 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1187 &response_header_offset));
1188 mock_quic_data.AddRead(ConstructDataPacket(4, kClientDataStreamId2, false,
1189 true, 0, "hello from foo!"));
1190 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
1191 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1192 mock_quic_data.AddRead(ASYNC, 0); // EOF
1193
1194 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1195 AddHangingNonAlternateProtocolSocketData();
1196
1197 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
1198
1199 AddHangingNonAlternateProtocolSocketData();
1200
rch3f4b8452016-02-23 16:59:321201 CreateSession();
zhongyi32569c62016-01-08 02:54:301202
1203 SendRequestAndExpectHttpResponse("hello world");
1204 SendRequestAndExpectQuicResponseOnPort("hello from foo!", 443);
1205 SendRequestAndExpectQuicResponseOnPort("hello from bar!", 444);
1206 SendRequestAndExpectQuicResponseOnPort("hello from foo!", 443);
1207}
1208
1209// Multiple origins have listed the same alternative services. When there's a
1210// existing QUIC session opened by a request to other origin,
1211// if the cert is valid, should select this QUIC session to make the request
1212// if this is also the first existing QUIC session.
1213TEST_P(QuicNetworkTransactionTest,
1214 UseSharedExistingAlternativeServiceForQuicWithValidCert) {
rch9ae5b3b2016-02-11 00:36:291215 // Default cert is valid for *.example.org
zhongyi32569c62016-01-08 02:54:301216
rch9ae5b3b2016-02-11 00:36:291217 // HTTP data for request to www.example.org.
zhongyi32569c62016-01-08 02:54:301218 MockRead http_reads[] = {
1219 MockRead("HTTP/1.1 200 OK\r\n"),
1220 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
rch9ae5b3b2016-02-11 00:36:291221 MockRead("hello world from www.example.org"),
zhongyi32569c62016-01-08 02:54:301222 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1223 MockRead(ASYNC, OK)};
1224
1225 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1226 0);
1227 socket_factory_.AddSocketDataProvider(&http_data);
1228 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1229
1230 // HTTP data for request to mail.example.org.
1231 MockRead http_reads2[] = {
1232 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291233 MockRead("Alt-Svc: quic=\":444\", quic=\"www.example.org:443\"\r\n\r\n"),
zhongyi32569c62016-01-08 02:54:301234 MockRead("hello world from mail.example.org"),
1235 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1236 MockRead(ASYNC, OK)};
1237
1238 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1239 nullptr, 0);
1240 socket_factory_.AddSocketDataProvider(&http_data2);
1241 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1242
1243 QuicStreamOffset request_header_offset = 0;
1244 QuicStreamOffset response_header_offset = 0;
1245
rch9ae5b3b2016-02-11 00:36:291246 QuicTestPacketMaker maker(GetParam(), 0, clock_, "mail.example.org");
1247 maker_.set_hostname("www.example.org");
zhongyi32569c62016-01-08 02:54:301248 MockQuicData mock_quic_data;
1249
1250 // First QUIC request data.
1251 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1252 1, kClientDataStreamId1, true, true,
1253 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1254
1255 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1256 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1257 &response_header_offset));
1258 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1259 true, 0, "hello from mail QUIC!"));
1260 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301261 // Second QUIC request data.
1262 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1263 3, kClientDataStreamId2, false, true,
1264 GetRequestHeaders("GET", "https", "/", maker), &request_header_offset,
1265 &maker));
1266 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1267 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1268 &response_header_offset));
1269 mock_quic_data.AddRead(ConstructDataPacket(4, kClientDataStreamId2, false,
1270 true, 0, "hello from mail QUIC!"));
1271 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
1272 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1273 mock_quic_data.AddRead(ASYNC, 0); // EOF
1274
1275 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1276 AddHangingNonAlternateProtocolSocketData();
1277
rch3f4b8452016-02-23 16:59:321278 CreateSession();
zhongyi32569c62016-01-08 02:54:301279
1280 // Send two HTTP requests, responses set up alt-svc lists for the origins.
rch9ae5b3b2016-02-11 00:36:291281 request_.url = GURL("https://www.example.org/");
1282 SendRequestAndExpectHttpResponse("hello world from www.example.org");
zhongyi32569c62016-01-08 02:54:301283 request_.url = GURL("https://mail.example.org/");
1284 SendRequestAndExpectHttpResponse("hello world from mail.example.org");
1285
rch9ae5b3b2016-02-11 00:36:291286 // Open a QUIC session to mail.example.org:443 when making request
1287 // to mail.example.org.
1288 request_.url = GURL("https://www.example.org/");
zhongyi32569c62016-01-08 02:54:301289 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443);
1290
rch9ae5b3b2016-02-11 00:36:291291 // Uses the existing QUIC session when making request to www.example.org.
zhongyi32569c62016-01-08 02:54:301292 request_.url = GURL("https://mail.example.org/");
1293 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443);
1294}
1295
1296// Multiple origins have listed the same alternative services. When there's a
1297// existing QUIC session opened by a request to other origin,
1298// if the cert is NOT valid, should ignore this QUIC session.
1299TEST_P(QuicNetworkTransactionTest,
1300 DoNotUseSharedExistingAlternativeServiceForQuicWithInvalidCert) {
rch9ae5b3b2016-02-11 00:36:291301 // Default cert is valid *.example.org
1302 // NOT valid for mail.example.com.
zhongyi32569c62016-01-08 02:54:301303
rch9ae5b3b2016-02-11 00:36:291304 // HTTP data for request to mail.example.org.
zhongyi32569c62016-01-08 02:54:301305 MockRead http_reads[] = {
1306 MockRead("HTTP/1.1 200 OK\r\n"),
1307 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
rch9ae5b3b2016-02-11 00:36:291308 MockRead("hello world from mail.example.org"),
zhongyi32569c62016-01-08 02:54:301309 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1310 MockRead(ASYNC, OK)};
1311
1312 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1313 0);
1314 socket_factory_.AddSocketDataProvider(&http_data);
1315 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1316
rch9ae5b3b2016-02-11 00:36:291317 // HTTP data for request to mail.example.com.
zhongyi32569c62016-01-08 02:54:301318 MockRead http_reads2[] = {
1319 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291320 MockRead("Alt-Svc: quic=\":444\", quic=\"mail.example.org:443\"\r\n\r\n"),
1321 MockRead("hello world from mail.example.com"),
zhongyi32569c62016-01-08 02:54:301322 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1323 MockRead(ASYNC, OK)};
1324
1325 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1326 nullptr, 0);
1327 socket_factory_.AddSocketDataProvider(&http_data2);
1328 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1329
rch9ae5b3b2016-02-11 00:36:291330 QuicTestPacketMaker maker(GetParam(), 0, clock_, "mail.example.org");
1331 maker.set_hostname("mail.example.com");
zhongyi32569c62016-01-08 02:54:301332 MockQuicData mock_quic_data;
1333 MockQuicData mock_quic_data2;
1334
1335 // Adding a valid cert for *.example.org but not mail.example.com.
1336 ProofVerifyDetailsChromium verify_details;
1337 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:291338 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
zhongyi32569c62016-01-08 02:54:301339 verify_details.cert_verify_result.verified_cert = cert;
1340 verify_details.cert_verify_result.is_issued_by_known_root = true;
1341 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1342
1343 // First QUIC request data.
1344 mock_quic_data.AddWrite(
1345 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1346 GetRequestHeaders("GET", "https", "/")));
1347 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1348 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1349 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1350 true, 0, "hello from mail QUIC!"));
1351 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1352 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1353 mock_quic_data.AddRead(ASYNC, 0); // EOF
1354
1355 // First QUIC request data.
1356 mock_quic_data2.AddWrite(ConstructRequestHeadersPacket(
1357 1, kClientDataStreamId1, true, true,
1358 GetRequestHeaders("GET", "https", "/", maker), &maker));
1359 mock_quic_data2.AddRead(
1360 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
1361 GetResponseHeaders("200 OK"), &maker));
1362 mock_quic_data2.AddRead(ConstructDataPacket(
1363 2, kClientDataStreamId1, false, true, 0, "hello from docs QUIC!"));
1364 mock_quic_data2.AddWrite(ConstructAckPacket(2, 1, &maker));
1365 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1366 mock_quic_data2.AddRead(ASYNC, 0); // EOF
1367
1368 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1369 AddHangingNonAlternateProtocolSocketData();
1370
1371 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
1372 AddHangingNonAlternateProtocolSocketData();
1373
rch3f4b8452016-02-23 16:59:321374 CreateSession();
zhongyi32569c62016-01-08 02:54:301375
1376 // Send HTTP requests, responses set up the alt-svc lists for the origins.
rch9ae5b3b2016-02-11 00:36:291377 SendRequestAndExpectHttpResponse("hello world from mail.example.org");
zhongyi32569c62016-01-08 02:54:301378 request_.url = GURL("https://mail.example.com/");
rch9ae5b3b2016-02-11 00:36:291379 SendRequestAndExpectHttpResponse("hello world from mail.example.com");
1380
1381 // Open a QUIC session to mail.example.org:443 when making request
1382 // to mail.example.org.
1383 request_.url = GURL("https://mail.example.org/");
zhongyi32569c62016-01-08 02:54:301384 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443);
1385
rch9ae5b3b2016-02-11 00:36:291386 // Open another new QUIC session to mail.example.com:444.
1387 request_.url = GURL("https://mail.example.com/");
zhongyi32569c62016-01-08 02:54:301388 SendRequestAndExpectQuicResponseOnPort("hello from docs QUIC!", 444);
bncc958faa2015-07-31 18:14:521389}
1390
1391TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) {
bncc958faa2015-07-31 18:14:521392 MockRead http_reads[] = {
1393 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561394 MockRead(kQuicAlternativeServiceDifferentPortHeader),
bncc958faa2015-07-31 18:14:521395 MockRead("hello world"),
1396 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1397 MockRead(ASYNC, OK)};
1398
1399 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1400 0);
1401 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561402 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521403
1404 MockQuicData mock_quic_data;
1405 mock_quic_data.AddWrite(
1406 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561407 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521408 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1409 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1410 mock_quic_data.AddRead(
1411 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1412 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1413 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591414 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521415
1416 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1417
1418 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321419 CreateSession();
bncc958faa2015-07-31 18:14:521420
1421 SendRequestAndExpectHttpResponse("hello world");
1422 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
1423}
1424
1425TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) {
bncc958faa2015-07-31 18:14:521426 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561427 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1428 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521429 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1430 MockRead(ASYNC, OK)};
1431
1432 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1433 0);
1434 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561435 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521436
1437 MockQuicData mock_quic_data;
1438 mock_quic_data.AddWrite(
1439 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561440 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521441 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1442 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1443 mock_quic_data.AddRead(
1444 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1445 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1446 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1447 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521448
1449 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1450
1451 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321452 CreateSession();
bncc958faa2015-07-31 18:14:521453
1454 AlternativeService alternative_service(QUIC,
1455 HostPortPair::FromURL(request_.url));
1456 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
1457 alternative_service);
1458 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1459 alternative_service));
1460
1461 SendRequestAndExpectHttpResponse("hello world");
1462 SendRequestAndExpectQuicResponse("hello!");
1463
mmenkee24011922015-12-17 22:12:591464 mock_quic_data.Resume();
bncc958faa2015-07-31 18:14:521465
1466 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1467 alternative_service));
1468}
1469
bncc958faa2015-07-31 18:14:521470TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) {
bncc958faa2015-07-31 18:14:521471 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561472 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1473 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521474 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1475 MockRead(ASYNC, OK)};
1476
1477 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1478 0);
1479 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561480 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521481
1482 MockQuicData mock_quic_data;
1483 mock_quic_data.AddWrite(
1484 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561485 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521486 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1487 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1488 mock_quic_data.AddRead(
1489 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1490 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1491 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
1492
1493 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1494
1495 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321496 CreateSession();
bncc958faa2015-07-31 18:14:521497
1498 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1499 SendRequestAndExpectHttpResponse("hello world");
1500}
1501
[email protected]1e960032013-12-20 19:00:201502TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
[email protected]aa9b14d2013-05-10 23:45:191503 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561504 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1505 MockRead("hello world"),
1506 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1507 MockRead(ASYNC, OK)};
[email protected]61a527782013-02-21 03:58:001508
rjshaded5ced072015-12-18 19:26:021509 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1510 0);
[email protected]aa9b14d2013-05-10 23:45:191511 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561512 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]61a527782013-02-21 03:58:001513
[email protected]1e960032013-12-20 19:00:201514 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031515 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051516 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561517 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021518 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1519 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031520 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051521 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031522 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
[email protected]61a527782013-02-21 03:58:001525
rcha5399e02015-04-21 19:32:041526 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]61a527782013-02-21 03:58:001527
[email protected]aa9b14d2013-05-10 23:45:191528 // The non-alternate protocol job needs to hang in order to guarantee that
1529 // the alternate-protocol job will "win".
1530 AddHangingNonAlternateProtocolSocketData();
[email protected]61a527782013-02-21 03:58:001531
rch3f4b8452016-02-23 16:59:321532 params_.parse_alternative_services = false;
1533 params_.parse_alternative_services = false;
1534 CreateSession();
[email protected]61a527782013-02-21 03:58:001535
[email protected]aa9b14d2013-05-10 23:45:191536 SendRequestAndExpectHttpResponse("hello world");
1537 SendRequestAndExpectQuicResponse("hello!");
[email protected]61a527782013-02-21 03:58:001538}
1539
rchf47265dc2016-03-21 21:33:121540TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolWithProbabilityForQuic) {
1541 MockRead http_reads[] = {
1542 MockRead("HTTP/1.1 200 OK\r\n"),
1543 MockRead(kQuicAlternateProtocolWithProbabilityHeader),
1544 MockRead("hello world"),
1545 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1546 MockRead(ASYNC, OK)};
1547
1548 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1549 0);
1550 socket_factory_.AddSocketDataProvider(&http_data);
1551 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1552
1553 MockQuicData mock_quic_data;
1554 mock_quic_data.AddWrite(
1555 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1556 GetRequestHeaders("GET", "https", "/")));
1557 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1558 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1559 mock_quic_data.AddRead(
1560 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1561 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1562 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1563 mock_quic_data.AddRead(ASYNC, 0); // EOF
1564
1565 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1566
1567 // The non-alternate protocol job needs to hang in order to guarantee that
1568 // the alternate-protocol job will "win".
1569 AddHangingNonAlternateProtocolSocketData();
1570
1571 params_.parse_alternative_services = false;
1572 params_.parse_alternative_services = false;
1573 CreateSession();
1574
1575 SendRequestAndExpectHttpResponse("hello world");
1576 SendRequestAndExpectQuicResponse("hello!");
1577}
1578
bnc62a44f022015-04-02 15:59:411579TEST_P(QuicNetworkTransactionTest, AlternateProtocolDifferentPort) {
1580 MockRead http_reads[] = {
1581 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561582 MockRead(kQuicAlternateProtocolDifferentPortHeader),
bnc62a44f022015-04-02 15:59:411583 MockRead("hello world"),
1584 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1585 MockRead(ASYNC, OK)};
1586
1587 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1588 0);
1589 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561590 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bnc62a44f022015-04-02 15:59:411591
1592 MockQuicData mock_quic_data;
1593 mock_quic_data.AddWrite(
1594 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561595 GetRequestHeaders("GET", "https", "/")));
bnc62a44f022015-04-02 15:59:411596 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1597 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1598 mock_quic_data.AddRead(
1599 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1600 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501601 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591602 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc62a44f022015-04-02 15:59:411603
rcha5399e02015-04-21 19:32:041604 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bnc62a44f022015-04-02 15:59:411605
1606 // The non-alternate protocol job needs to hang in order to guarantee that
1607 // the alternate-protocol job will "win".
1608 AddHangingNonAlternateProtocolSocketData();
1609
rch3f4b8452016-02-23 16:59:321610 params_.parse_alternative_services = false;
1611 CreateSession();
bnc62a44f022015-04-02 15:59:411612
1613 SendRequestAndExpectHttpResponse("hello world");
1614 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
1615}
1616
bncc958faa2015-07-31 18:14:521617TEST_P(QuicNetworkTransactionTest, ConfirmAlternateProtocol) {
bncae8db8402015-03-26 20:13:501618 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561619 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
bncae8db8402015-03-26 20:13:501620 MockRead("hello world"),
1621 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1622 MockRead(ASYNC, OK)};
1623
1624 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1625 0);
1626 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561627 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncae8db8402015-03-26 20:13:501628
1629 MockQuicData mock_quic_data;
1630 mock_quic_data.AddWrite(
1631 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561632 GetRequestHeaders("GET", "https", "/")));
bncae8db8402015-03-26 20:13:501633 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1634 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1635 mock_quic_data.AddRead(
1636 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1637 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501638 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1639 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncae8db8402015-03-26 20:13:501640
rcha5399e02015-04-21 19:32:041641 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bncae8db8402015-03-26 20:13:501642
1643 // The non-alternate protocol job needs to hang in order to guarantee that
1644 // the alternate-protocol job will "win".
1645 AddHangingNonAlternateProtocolSocketData();
1646
rch3f4b8452016-02-23 16:59:321647 params_.parse_alternative_services = false;
1648 CreateSession();
bncae8db8402015-03-26 20:13:501649
1650 AlternativeService alternative_service(QUIC,
1651 HostPortPair::FromURL(request_.url));
bnc6be245c12015-05-15 11:24:071652 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
bncae8db8402015-03-26 20:13:501653 alternative_service);
bnc6be245c12015-05-15 11:24:071654 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1655 alternative_service));
bncae8db8402015-03-26 20:13:501656
1657 SendRequestAndExpectHttpResponse("hello world");
1658 SendRequestAndExpectQuicResponse("hello!");
1659
mmenkee24011922015-12-17 22:12:591660 mock_quic_data.Resume();
rchb27683c2015-07-29 23:53:501661
bnc6be245c12015-05-15 11:24:071662 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1663 alternative_service));
bncae8db8402015-03-26 20:13:501664}
1665
[email protected]1e960032013-12-20 19:00:201666TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) {
rch3f4b8452016-02-23 16:59:321667 params_.parse_alternative_services = false;
[email protected]6d1b4ed2013-07-10 03:57:541668 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561669 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1670 MockRead("hello world"),
1671 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1672 MockRead(ASYNC, OK)};
[email protected]6d1b4ed2013-07-10 03:57:541673
rjshaded5ced072015-12-18 19:26:021674 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1675 0);
[email protected]6d1b4ed2013-07-10 03:57:541676 socket_factory_.AddSocketDataProvider(&http_data);
1677
[email protected]1e960032013-12-20 19:00:201678 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031679 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051680 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561681 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021682 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1683 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031684 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051685 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031686 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501687 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591688 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]6d1b4ed2013-07-10 03:57:541689
rcha5399e02015-04-21 19:32:041690 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]6d1b4ed2013-07-10 03:57:541691
1692 // The non-alternate protocol job needs to hang in order to guarantee that
1693 // the alternate-protocol job will "win".
1694 AddHangingNonAlternateProtocolSocketData();
1695
rch3f4b8452016-02-23 16:59:321696 CreateSession();
[email protected]6d1b4ed2013-07-10 03:57:541697
1698 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1699 SendRequestAndExpectHttpResponse("hello world");
1700}
1701
bnccb7ff3c2015-05-21 20:51:551702class QuicAltSvcCertificateVerificationTest
1703 : public QuicNetworkTransactionTest {
1704 public:
1705 void Run(bool valid) {
rch9ae5b3b2016-02-11 00:36:291706 HostPortPair origin(valid ? "mail.example.org" : "mail.example.com", 443);
bnccb7ff3c2015-05-21 20:51:551707 HostPortPair alternative("www.example.org", 443);
1708 std::string url("https://");
1709 url.append(origin.host());
1710 url.append(":443");
1711 request_.url = GURL(url);
1712
1713 maker_.set_hostname(origin.host());
1714 MockQuicData mock_quic_data;
1715 mock_quic_data.AddWrite(
1716 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1717 GetRequestHeaders("GET", "https", "/")));
1718 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1719 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1720 mock_quic_data.AddRead(
1721 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1722 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591723 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
bnccb7ff3c2015-05-21 20:51:551724 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1725
1726 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:291727 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bnccb7ff3c2015-05-21 20:51:551728 ASSERT_TRUE(cert.get());
1729 bool common_name_fallback_used;
1730 EXPECT_EQ(valid,
1731 cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
1732 EXPECT_TRUE(
1733 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
1734 ProofVerifyDetailsChromium verify_details;
1735 verify_details.cert_verify_result.verified_cert = cert;
1736 verify_details.cert_verify_result.is_issued_by_known_root = true;
1737 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1738 crypto_client_stream_factory_.set_handshake_mode(
1739 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1740
1741 // Connection to |origin| fails, so that success of |request| depends on
1742 // connection to |alternate| only.
1743 MockConnect refused_connect(ASYNC, ERR_CONNECTION_REFUSED);
1744 StaticSocketDataProvider refused_data;
1745 refused_data.set_connect_data(refused_connect);
1746 socket_factory_.AddSocketDataProvider(&refused_data);
1747
rch3f4b8452016-02-23 16:59:321748 CreateSession();
bnccb7ff3c2015-05-21 20:51:551749 AlternativeService alternative_service(QUIC, alternative);
bnc7dc7e1b42015-07-28 14:43:121750 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
bnccb7ff3c2015-05-21 20:51:551751 session_->http_server_properties()->SetAlternativeService(
rchdc7b9052016-03-17 20:51:501752 origin, alternative_service, expiration);
bnccb7ff3c2015-05-21 20:51:551753 scoped_ptr<HttpNetworkTransaction> trans(
1754 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1755 TestCompletionCallback callback;
1756 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1757 EXPECT_EQ(ERR_IO_PENDING, rv);
1758 rv = callback.WaitForResult();
1759 if (valid) {
1760 EXPECT_EQ(OK, rv);
1761 CheckWasQuicResponse(trans);
1762 CheckResponsePort(trans, 443);
1763 CheckResponseData(trans, "hello!");
1764 } else {
1765 EXPECT_EQ(ERR_CONNECTION_REFUSED, rv);
1766 }
1767 }
1768};
1769
1770INSTANTIATE_TEST_CASE_P(Version,
1771 QuicAltSvcCertificateVerificationTest,
1772 ::testing::ValuesIn(QuicSupportedVersions()));
1773
1774TEST_P(QuicAltSvcCertificateVerificationTest,
1775 RequestSucceedsWithValidCertificate) {
1776 Run(true);
1777}
1778
1779TEST_P(QuicAltSvcCertificateVerificationTest,
1780 RequestFailsWithInvalidCertificate) {
1781 Run(false);
1782}
1783
[email protected]1e960032013-12-20 19:00:201784TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) {
rch3f4b8452016-02-23 16:59:321785 params_.parse_alternative_services = false;
[email protected]dda75ab2013-06-22 22:43:301786 crypto_client_stream_factory_.set_handshake_mode(
1787 MockCryptoClientStream::COLD_START);
1788
1789 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561790 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
rch9ae5b3b2016-02-11 00:36:291791 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561792 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")};
[email protected]dda75ab2013-06-22 22:43:301793
1794 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561795 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1796 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1797 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]dda75ab2013-06-22 22:43:301798
mmenke651bae7f2015-12-18 21:26:451799 MockClientSocketFactory socket_factory;
[email protected]dda75ab2013-06-22 22:43:301800
mmenke651bae7f2015-12-18 21:26:451801 SequencedSocketData http_data(http_reads, arraysize(http_reads), http_writes,
1802 arraysize(http_writes));
[email protected]dda75ab2013-06-22 22:43:301803 socket_factory.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561804 socket_factory.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301805
1806 // The QUIC transaction will not be allowed to complete.
mmenke651bae7f2015-12-18 21:26:451807 MockWrite quic_writes[] = {MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 1)};
[email protected]dda75ab2013-06-22 22:43:301808 MockRead quic_reads[] = {
mmenke651bae7f2015-12-18 21:26:451809 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0),
[email protected]dda75ab2013-06-22 22:43:301810 };
mmenke651bae7f2015-12-18 21:26:451811 SequencedSocketData quic_data(quic_reads, arraysize(quic_reads), quic_writes,
1812 arraysize(quic_writes));
[email protected]dda75ab2013-06-22 22:43:301813 socket_factory.AddSocketDataProvider(&quic_data);
1814
1815 // The HTTP transaction will complete.
mmenke651bae7f2015-12-18 21:26:451816 SequencedSocketData http_data2(http_reads, arraysize(http_reads), http_writes,
1817 arraysize(http_writes));
[email protected]dda75ab2013-06-22 22:43:301818 socket_factory.AddSocketDataProvider(&http_data2);
rchf114d982015-10-21 01:34:561819 socket_factory.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301820
rch3f4b8452016-02-23 16:59:321821 CreateSessionWithFactory(&socket_factory);
[email protected]dda75ab2013-06-22 22:43:301822
1823 // Run the first request.
[email protected]dda75ab2013-06-22 22:43:301824 SendRequestAndExpectHttpResponse("hello world");
rch37de576c2015-05-17 20:28:171825 ASSERT_TRUE(http_data.AllReadDataConsumed());
1826 ASSERT_TRUE(http_data.AllWriteDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301827
1828 // Now run the second request in which the QUIC socket hangs,
1829 // and verify the the transaction continues over HTTP.
[email protected]dda75ab2013-06-22 22:43:301830 SendRequestAndExpectHttpResponse("hello world");
mmenke651bae7f2015-12-18 21:26:451831 base::RunLoop().RunUntilIdle();
[email protected]dda75ab2013-06-22 22:43:301832
rch37de576c2015-05-17 20:28:171833 ASSERT_TRUE(http_data2.AllReadDataConsumed());
1834 ASSERT_TRUE(http_data2.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:451835 ASSERT_TRUE(quic_data.AllReadDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301836}
1837
[email protected]1e960032013-12-20 19:00:201838TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
[email protected]1e960032013-12-20 19:00:201839 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031840 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051841 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561842 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021843 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1844 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031845 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051846 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031847 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501848 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591849 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]8ba81212013-05-03 13:11:481850
rcha5399e02015-04-21 19:32:041851 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]8ba81212013-05-03 13:11:481852
[email protected]3a120a6b2013-06-25 01:08:271853 // The non-alternate protocol job needs to hang in order to guarantee that
1854 // the alternate-protocol job will "win".
[email protected]dda75ab2013-06-22 22:43:301855 AddHangingNonAlternateProtocolSocketData();
1856
rch3f4b8452016-02-23 16:59:321857 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:191858 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1859 SendRequestAndExpectQuicResponse("hello!");
[email protected]8ba81212013-05-03 13:11:481860}
1861
[email protected]1e960032013-12-20 19:00:201862TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
[email protected]1e960032013-12-20 19:00:201863 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031864 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051865 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561866 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021867 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1868 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031869 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051870 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031871 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501872 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591873 mock_quic_data.AddRead(ASYNC, 0); // EOF
rcha5399e02015-04-21 19:32:041874 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]3a120a6b2013-06-25 01:08:271875
1876 // In order for a new QUIC session to be established via alternate-protocol
1877 // without racing an HTTP connection, we need the host resolution to happen
1878 // synchronously.
1879 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291880 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561881 "");
rch9ae5b3b2016-02-11 00:36:291882 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]3a120a6b2013-06-25 01:08:271883 AddressList address;
rjshaded5ced072015-12-18 19:26:021884 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1885 nullptr, net_log_.bound());
[email protected]3a120a6b2013-06-25 01:08:271886
rch3f4b8452016-02-23 16:59:321887 CreateSession();
[email protected]3a120a6b2013-06-25 01:08:271888 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1889 SendRequestAndExpectQuicResponse("hello!");
1890}
1891
[email protected]0fc924b2014-03-31 04:34:151892TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) {
rdsmith82957ad2015-09-16 19:42:031893 proxy_service_ = ProxyService::CreateFixedFromPacResult("PROXY myproxy:70");
[email protected]0fc924b2014-03-31 04:34:151894
1895 // Since we are using a proxy, the QUIC job will not succeed.
1896 MockWrite http_writes[] = {
rch9ae5b3b2016-02-11 00:36:291897 MockWrite(SYNCHRONOUS, 0, "GET http://mail.example.org/ HTTP/1.1\r\n"),
1898 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561899 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")};
[email protected]0fc924b2014-03-31 04:34:151900
1901 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561902 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1903 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1904 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]0fc924b2014-03-31 04:34:151905
1906 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
1907 http_writes, arraysize(http_writes));
1908 socket_factory_.AddSocketDataProvider(&http_data);
1909
1910 // In order for a new QUIC session to be established via alternate-protocol
1911 // without racing an HTTP connection, we need the host resolution to happen
1912 // synchronously.
1913 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291914 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561915 "");
rch9ae5b3b2016-02-11 00:36:291916 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]0fc924b2014-03-31 04:34:151917 AddressList address;
rjshaded5ced072015-12-18 19:26:021918 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1919 nullptr, net_log_.bound());
[email protected]0fc924b2014-03-31 04:34:151920
rch9ae5b3b2016-02-11 00:36:291921 request_.url = GURL("http://mail.example.org/");
rch3f4b8452016-02-23 16:59:321922 CreateSession();
[email protected]0fc924b2014-03-31 04:34:151923 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1924 SendRequestAndExpectHttpResponse("hello world");
1925}
1926
[email protected]1e960032013-12-20 19:00:201927TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
[email protected]1e960032013-12-20 19:00:201928 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031929 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051930 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561931 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021932 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1933 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031934 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051935 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031936 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591937 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
rcha5399e02015-04-21 19:32:041938 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]11c05872013-08-20 02:04:121939
1940 // The non-alternate protocol job needs to hang in order to guarantee that
1941 // the alternate-protocol job will "win".
1942 AddHangingNonAlternateProtocolSocketData();
1943
1944 // In order for a new QUIC session to be established via alternate-protocol
1945 // without racing an HTTP connection, we need the host resolution to happen
1946 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1947 // connection to the the server, in this test we require confirmation
1948 // before encrypting so the HTTP job will still start.
1949 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291950 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561951 "");
rch9ae5b3b2016-02-11 00:36:291952 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]11c05872013-08-20 02:04:121953 AddressList address;
rjshaded5ced072015-12-18 19:26:021954 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1955 nullptr, net_log_.bound());
[email protected]11c05872013-08-20 02:04:121956
rch3f4b8452016-02-23 16:59:321957 CreateSession();
[email protected]11c05872013-08-20 02:04:121958 session_->quic_stream_factory()->set_require_confirmation(true);
1959 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1960
1961 scoped_ptr<HttpNetworkTransaction> trans(
1962 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1963 TestCompletionCallback callback;
1964 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1965 EXPECT_EQ(ERR_IO_PENDING, rv);
1966
1967 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1968 QuicSession::HANDSHAKE_CONFIRMED);
1969 EXPECT_EQ(OK, callback.WaitForResult());
rchb27683c2015-07-29 23:53:501970
1971 CheckWasQuicResponse(trans);
1972 CheckResponseData(trans, "hello!");
[email protected]11c05872013-08-20 02:04:121973}
1974
zhongyica364fbb2015-12-12 03:39:121975TEST_P(QuicNetworkTransactionTest,
1976 LogGranularQuicErrorCodeOnQuicProtocolErrorLocal) {
1977 MockQuicData mock_quic_data;
1978 mock_quic_data.AddWrite(
1979 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1980 GetRequestHeaders("GET", "https", "/")));
1981 // Read a close connection packet with
1982 // QuicErrorCode: QUIC_CRYPTO_VERSION_NOT_SUPPORTED from the peer.
1983 mock_quic_data.AddRead(ConstructConnectionClosePacket(1));
1984 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1985
1986 // The non-alternate protocol job needs to hang in order to guarantee that
1987 // the alternate-protocol job will "win".
1988 AddHangingNonAlternateProtocolSocketData();
1989
1990 // In order for a new QUIC session to be established via alternate-protocol
1991 // without racing an HTTP connection, we need the host resolution to happen
1992 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1993 // connection to the the server, in this test we require confirmation
1994 // before encrypting so the HTTP job will still start.
1995 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291996 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:121997 "");
rch9ae5b3b2016-02-11 00:36:291998 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:121999 AddressList address;
2000 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2001 nullptr, net_log_.bound());
2002
rch3f4b8452016-02-23 16:59:322003 CreateSession();
zhongyica364fbb2015-12-12 03:39:122004 session_->quic_stream_factory()->set_require_confirmation(true);
2005 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2006
2007 scoped_ptr<HttpNetworkTransaction> trans(
2008 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2009 TestCompletionCallback callback;
2010 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2011 EXPECT_EQ(ERR_IO_PENDING, rv);
2012
2013 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
2014 QuicSession::HANDSHAKE_CONFIRMED);
2015 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
2016
2017 NetErrorDetails details;
2018 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
2019
2020 trans->PopulateNetErrorDetails(&details);
2021 // Verify the error code logged is what sent by the peer.
2022 EXPECT_EQ(QUIC_CRYPTO_VERSION_NOT_SUPPORTED, details.quic_connection_error);
2023}
2024
2025TEST_P(QuicNetworkTransactionTest,
2026 LogGranularQuicErrorCodeOnQuicProtocolErrorRemote) {
2027 MockQuicData mock_quic_data;
2028 mock_quic_data.AddWrite(
2029 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
2030 GetRequestHeaders("GET", "https", "/")));
2031 // Peer sending an invalid stream frame with a invalid stream error causes
2032 // this end to raise error and close connection.
2033 mock_quic_data.AddRead(ConstructRstPacket(1, false, kClientDataStreamId1,
2034 QUIC_STREAM_LAST_ERROR));
2035 std::string quic_error_details = "Invalid rst stream error code.";
2036 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(
2037 2, QuicTime::Delta::Infinite(), 0, 1, QUIC_INVALID_RST_STREAM_DATA,
2038 quic_error_details));
2039 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2040
2041 // The non-alternate protocol job needs to hang in order to guarantee that
2042 // the alternate-protocol job will "win".
2043 AddHangingNonAlternateProtocolSocketData();
2044
2045 // In order for a new QUIC session to be established via alternate-protocol
2046 // without racing an HTTP connection, we need the host resolution to happen
2047 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
2048 // connection to the the server, in this test we require confirmation
2049 // before encrypting so the HTTP job will still start.
2050 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:292051 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:122052 "");
rch9ae5b3b2016-02-11 00:36:292053 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:122054 AddressList address;
2055 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2056 nullptr, net_log_.bound());
2057
rch3f4b8452016-02-23 16:59:322058 CreateSession();
zhongyica364fbb2015-12-12 03:39:122059 session_->quic_stream_factory()->set_require_confirmation(true);
2060 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2061
2062 scoped_ptr<HttpNetworkTransaction> trans(
2063 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2064 TestCompletionCallback callback;
2065 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2066 EXPECT_EQ(ERR_IO_PENDING, rv);
2067
2068 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
2069 QuicSession::HANDSHAKE_CONFIRMED);
2070 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
2071 NetErrorDetails details;
2072 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
2073
2074 trans->PopulateNetErrorDetails(&details);
2075 EXPECT_EQ(QUIC_INVALID_RST_STREAM_DATA, details.quic_connection_error);
2076}
2077
[email protected]1e960032013-12-20 19:00:202078TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
[email protected]3316d422013-05-03 21:45:302079 // Alternate-protocol job
2080 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1));
2081 MockRead quic_reads[] = {
rchb27683c2015-07-29 23:53:502082 MockRead(ASYNC, close->data(), close->length()),
2083 MockRead(ASYNC, ERR_IO_PENDING), // No more data to read
2084 MockRead(ASYNC, OK), // EOF
[email protected]3316d422013-05-03 21:45:302085 };
rjshaded5ced072015-12-18 19:26:022086 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2087 0);
[email protected]3316d422013-05-03 21:45:302088 socket_factory_.AddSocketDataProvider(&quic_data);
2089
2090 // Main job which will succeed even though the alternate job fails.
2091 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022092 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2093 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2094 MockRead(ASYNC, OK)};
[email protected]3316d422013-05-03 21:45:302095
rjshaded5ced072015-12-18 19:26:022096 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2097 0);
[email protected]3316d422013-05-03 21:45:302098 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562099 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]3316d422013-05-03 21:45:302100
rch3f4b8452016-02-23 16:59:322101 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:192102 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2103 SendRequestAndExpectHttpResponse("hello from http");
2104 ExpectBrokenAlternateProtocolMapping();
[email protected]3316d422013-05-03 21:45:302105}
2106
[email protected]1e960032013-12-20 19:00:202107TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
[email protected]d03a66d2013-05-06 12:55:592108 // Alternate-protocol job
2109 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022110 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]d03a66d2013-05-06 12:55:592111 };
rjshaded5ced072015-12-18 19:26:022112 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2113 0);
[email protected]d03a66d2013-05-06 12:55:592114 socket_factory_.AddSocketDataProvider(&quic_data);
2115
2116 // Main job which will succeed even though the alternate job fails.
2117 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022118 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2119 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2120 MockRead(ASYNC, OK)};
[email protected]d03a66d2013-05-06 12:55:592121
rjshaded5ced072015-12-18 19:26:022122 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2123 0);
[email protected]d03a66d2013-05-06 12:55:592124 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562125 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]d03a66d2013-05-06 12:55:592126
rch3f4b8452016-02-23 16:59:322127 CreateSession();
[email protected]d03a66d2013-05-06 12:55:592128
[email protected]aa9b14d2013-05-10 23:45:192129 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2130 SendRequestAndExpectHttpResponse("hello from http");
2131 ExpectBrokenAlternateProtocolMapping();
[email protected]d03a66d2013-05-06 12:55:592132}
2133
[email protected]00c159f2014-05-21 22:38:162134TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) {
[email protected]eb71ab62014-05-23 07:57:532135 // Alternate-protocol job will fail when the session attempts to read.
[email protected]00c159f2014-05-21 22:38:162136 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022137 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162138 };
rjshaded5ced072015-12-18 19:26:022139 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2140 0);
[email protected]00c159f2014-05-21 22:38:162141 socket_factory_.AddSocketDataProvider(&quic_data);
2142
[email protected]eb71ab62014-05-23 07:57:532143 // Main job will also fail.
[email protected]00c159f2014-05-21 22:38:162144 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022145 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162146 };
2147
rjshaded5ced072015-12-18 19:26:022148 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2149 0);
[email protected]00c159f2014-05-21 22:38:162150 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED));
2151 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562152 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]00c159f2014-05-21 22:38:162153
rch3f4b8452016-02-23 16:59:322154 CreateSession();
[email protected]00c159f2014-05-21 22:38:162155
2156 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2157 scoped_ptr<HttpNetworkTransaction> trans(
2158 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2159 TestCompletionCallback callback;
2160 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2161 EXPECT_EQ(ERR_IO_PENDING, rv);
2162 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult());
2163 ExpectQuicAlternateProtocolMapping();
2164}
2165
[email protected]1e960032013-12-20 19:00:202166TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
[email protected]77c6c162013-08-17 02:57:452167 // Alternate-protocol job
2168 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022169 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]77c6c162013-08-17 02:57:452170 };
rjshaded5ced072015-12-18 19:26:022171 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2172 0);
[email protected]77c6c162013-08-17 02:57:452173 socket_factory_.AddSocketDataProvider(&quic_data);
2174
2175 AddHangingNonAlternateProtocolSocketData();
2176
[email protected]c92c1b52014-05-31 04:16:062177 // Second Alternate-protocol job which will race with the TCP job.
2178 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:422179 nullptr, 0);
[email protected]c92c1b52014-05-31 04:16:062180 socket_factory_.AddSocketDataProvider(&quic_data2);
2181
[email protected]4d283b32013-10-17 12:57:272182 // Final job that will proceed when the QUIC job fails.
2183 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022184 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2185 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2186 MockRead(ASYNC, OK)};
[email protected]4d283b32013-10-17 12:57:272187
rjshaded5ced072015-12-18 19:26:022188 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2189 0);
[email protected]4d283b32013-10-17 12:57:272190 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562191 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d283b32013-10-17 12:57:272192
rch3f4b8452016-02-23 16:59:322193 CreateSession();
[email protected]77c6c162013-08-17 02:57:452194
2195 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2196
[email protected]4d283b32013-10-17 12:57:272197 SendRequestAndExpectHttpResponse("hello from http");
[email protected]77c6c162013-08-17 02:57:452198
2199 ExpectBrokenAlternateProtocolMapping();
[email protected]4d283b32013-10-17 12:57:272200
rch37de576c2015-05-17 20:28:172201 EXPECT_TRUE(quic_data.AllReadDataConsumed());
2202 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
[email protected]77c6c162013-08-17 02:57:452203}
2204
[email protected]93b31772014-06-19 08:03:352205TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) {
[email protected]65768442014-06-06 23:37:032206 // Alternate-protocol job
2207 MockRead quic_reads[] = {
mmenkee24011922015-12-17 22:12:592208 MockRead(SYNCHRONOUS, ERR_IO_PENDING),
[email protected]65768442014-06-06 23:37:032209 };
rjshaded5ced072015-12-18 19:26:022210 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2211 0);
[email protected]65768442014-06-06 23:37:032212 socket_factory_.AddSocketDataProvider(&quic_data);
2213
2214 // Main job that will proceed when the QUIC job fails.
2215 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022216 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2217 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2218 MockRead(ASYNC, OK)};
[email protected]65768442014-06-06 23:37:032219
rjshaded5ced072015-12-18 19:26:022220 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2221 0);
[email protected]65768442014-06-06 23:37:032222 socket_factory_.AddSocketDataProvider(&http_data);
2223
rch3f4b8452016-02-23 16:59:322224 CreateSession();
[email protected]65768442014-06-06 23:37:032225
2226 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2227
2228 SendRequestAndExpectHttpResponse("hello from http");
2229}
2230
[email protected]eb71ab62014-05-23 07:57:532231TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
[email protected]4d590c9c2014-05-02 05:14:332232 // Alternate-protocol job will fail before creating a QUIC session.
rtennetibe635732014-10-02 22:51:422233 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0);
rjshaded5ced072015-12-18 19:26:022234 quic_data.set_connect_data(
2235 MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED));
[email protected]4d590c9c2014-05-02 05:14:332236 socket_factory_.AddSocketDataProvider(&quic_data);
2237
2238 // Main job which will succeed even though the alternate job fails.
2239 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022240 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2241 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2242 MockRead(ASYNC, OK)};
[email protected]4d590c9c2014-05-02 05:14:332243
rjshaded5ced072015-12-18 19:26:022244 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2245 0);
[email protected]4d590c9c2014-05-02 05:14:332246 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562247 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d590c9c2014-05-02 05:14:332248
rch3f4b8452016-02-23 16:59:322249 CreateSession();
[email protected]4d590c9c2014-05-02 05:14:332250 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2251 SendRequestAndExpectHttpResponse("hello from http");
[email protected]eb71ab62014-05-23 07:57:532252
2253 ExpectBrokenAlternateProtocolMapping();
[email protected]4d590c9c2014-05-02 05:14:332254}
2255
[email protected]4fee9672014-01-08 14:47:152256TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
[email protected]4fee9672014-01-08 14:47:152257 MockQuicData mock_quic_data;
rcha5399e02015-04-21 19:32:042258 mock_quic_data.AddSynchronousRead(ConstructConnectionClosePacket(1));
[email protected]92bf17c2014-03-03 21:14:032259 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:052260 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:562261 GetRequestHeaders("GET", "https", "/")));
[email protected]92bf17c2014-03-03 21:14:032262 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rcha5399e02015-04-21 19:32:042263 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4fee9672014-01-08 14:47:152264
2265 // When the QUIC connection fails, we will try the request again over HTTP.
2266 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:562267 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
2268 MockRead("hello world"),
2269 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2270 MockRead(ASYNC, OK)};
[email protected]4fee9672014-01-08 14:47:152271
rjshaded5ced072015-12-18 19:26:022272 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2273 0);
[email protected]4fee9672014-01-08 14:47:152274 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562275 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4fee9672014-01-08 14:47:152276
2277 // In order for a new QUIC session to be established via alternate-protocol
2278 // without racing an HTTP connection, we need the host resolution to happen
2279 // synchronously.
2280 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:292281 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:562282 "");
rch9ae5b3b2016-02-11 00:36:292283 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]4fee9672014-01-08 14:47:152284 AddressList address;
rjshaded5ced072015-12-18 19:26:022285 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2286 nullptr, net_log_.bound());
[email protected]4fee9672014-01-08 14:47:152287
rch3f4b8452016-02-23 16:59:322288 CreateSession();
[email protected]4fee9672014-01-08 14:47:152289 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2290 SendRequestAndExpectHttpResponse("hello world");
2291}
2292
bnc508835902015-05-12 20:10:292293TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) {
bncb07c05532015-05-14 19:07:202294 maker_.set_hostname("www.example.org");
tbansalc8a94ea2015-11-02 23:58:512295 EXPECT_FALSE(rtt_observer_.rtt_notification_received());
bnc508835902015-05-12 20:10:292296 MockQuicData mock_quic_data;
2297 mock_quic_data.AddWrite(
2298 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
2299 GetRequestHeaders("GET", "https", "/")));
2300 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
2301 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
2302 mock_quic_data.AddRead(
2303 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
2304 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:502305 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
bnc508835902015-05-12 20:10:292306 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2307
bncb07c05532015-05-14 19:07:202308 request_.url = GURL("https://www.example.org:443");
bnc508835902015-05-12 20:10:292309 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322310 CreateSession();
bnc508835902015-05-12 20:10:292311 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
2312 SendRequestAndExpectQuicResponse("hello!");
tbansalc8a94ea2015-11-02 23:58:512313 EXPECT_TRUE(rtt_observer_.rtt_notification_received());
bnc508835902015-05-12 20:10:292314}
2315
rtenneti56977812016-01-15 19:26:562316TEST_P(QuicNetworkTransactionTest, QuicUpload) {
rtenneti8a2f4632016-03-21 20:26:572317 params_.origins_to_force_quic_on.insert(
2318 HostPortPair::FromString("mail.example.org:443"));
rtenneti56977812016-01-15 19:26:562319
2320 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2321 MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_FAILED, 1)};
2322 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2323 arraysize(writes));
2324 socket_factory_.AddSocketDataProvider(&socket_data);
2325
2326 // The non-alternate protocol job needs to hang in order to guarantee that
2327 // the alternate-protocol job will "win".
2328 AddHangingNonAlternateProtocolSocketData();
2329
rch3f4b8452016-02-23 16:59:322330 params_.parse_alternative_services = false;
2331 params_.enable_alternative_service_with_different_host = false;
rtenneti56977812016-01-15 19:26:562332 CreateSession();
2333 request_.method = "POST";
2334 ChunkedUploadDataStream upload_data(0);
2335 upload_data.AppendData("1", 1, true);
2336
2337 request_.upload_data_stream = &upload_data;
2338
2339 scoped_ptr<HttpNetworkTransaction> trans(
2340 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2341 TestCompletionCallback callback;
2342 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2343 EXPECT_EQ(ERR_IO_PENDING, rv);
2344 EXPECT_NE(OK, callback.WaitForResult());
2345}
2346
[email protected]61a527782013-02-21 03:58:002347} // namespace test
2348} // namespace net