blob: 3a3b6a1015c95e1fcf62b74728fb5734934330c5 [file] [log] [blame]
[email protected]61a527782013-02-21 03:58:001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]1e960032013-12-20 19:00:205#include <vector>
6
[email protected]61a527782013-02-21 03:58:007#include "base/compiler_specific.h"
Avi Drissman13fc8932015-12-20 04:40:468#include "base/macros.h"
[email protected]61a527782013-02-21 03:58:009#include "base/memory/scoped_ptr.h"
mmenke651bae7f2015-12-18 21:26:4510#include "base/run_loop.h"
[email protected]98b20ce2013-05-10 05:55:2611#include "base/stl_util.h"
bnc8be55ebb2015-10-30 14:12:0712#include "base/strings/stringprintf.h"
rtenneti56977812016-01-15 19:26:5613#include "net/base/chunked_upload_data_stream.h"
tbansalfdf5665b2015-09-21 22:46:4014#include "net/base/network_quality_estimator.h"
15#include "net/base/socket_performance_watcher.h"
[email protected]61a527782013-02-21 03:58:0016#include "net/base/test_completion_callback.h"
bnc508835902015-05-12 20:10:2917#include "net/base/test_data_directory.h"
[email protected]6e7845ae2013-03-29 21:48:1118#include "net/cert/mock_cert_verifier.h"
rtenneti052774e2015-11-24 21:00:1219#include "net/cert/multi_log_ct_verifier.h"
[email protected]f2cb3cf2013-03-21 01:40:5320#include "net/dns/mock_host_resolver.h"
[email protected]61a527782013-02-21 03:58:0021#include "net/http/http_auth_handler_factory.h"
22#include "net/http/http_network_session.h"
23#include "net/http/http_network_transaction.h"
24#include "net/http/http_server_properties_impl.h"
25#include "net/http/http_stream.h"
26#include "net/http/http_stream_factory.h"
[email protected]c41737d2014-05-14 07:47:1927#include "net/http/http_transaction_test_util.h"
[email protected]b1c988b2013-06-13 06:48:1128#include "net/http/transport_security_state.h"
vishal.b62985ca92015-04-17 08:45:5129#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4630#include "net/log/test_net_log_entry.h"
31#include "net/log/test_net_log_util.h"
[email protected]61a527782013-02-21 03:58:0032#include "net/proxy/proxy_config_service_fixed.h"
33#include "net/proxy/proxy_resolver.h"
34#include "net/proxy/proxy_service.h"
bnc508835902015-05-12 20:10:2935#include "net/quic/crypto/proof_verifier_chromium.h"
[email protected]61a527782013-02-21 03:58:0036#include "net/quic/crypto/quic_decrypter.h"
37#include "net/quic/crypto/quic_encrypter.h"
38#include "net/quic/quic_framer.h"
[email protected]24e5bc52013-09-18 15:36:5839#include "net/quic/quic_http_utils.h"
[email protected]ed3fc15d2013-03-08 18:37:4440#include "net/quic/test_tools/crypto_test_utils.h"
[email protected]61a527782013-02-21 03:58:0041#include "net/quic/test_tools/mock_clock.h"
[email protected]e8ff26842013-03-22 21:02:0542#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
[email protected]61a527782013-02-21 03:58:0043#include "net/quic/test_tools/mock_random.h"
[email protected]1e960032013-12-20 19:00:2044#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]61a527782013-02-21 03:58:0045#include "net/quic/test_tools/quic_test_utils.h"
46#include "net/socket/client_socket_factory.h"
47#include "net/socket/mock_client_socket_pool_manager.h"
48#include "net/socket/socket_test_util.h"
49#include "net/socket/ssl_client_socket.h"
50#include "net/spdy/spdy_frame_builder.h"
51#include "net/spdy/spdy_framer.h"
[email protected]536fd0b2013-03-14 17:41:5752#include "net/ssl/ssl_config_service_defaults.h"
bnc508835902015-05-12 20:10:2953#include "net/test/cert_test_util.h"
[email protected]61a527782013-02-21 03:58:0054#include "testing/gtest/include/gtest/gtest.h"
55#include "testing/platform_test.h"
56
bnc508835902015-05-12 20:10:2957namespace net {
58namespace test {
[email protected]61a527782013-02-21 03:58:0059
60namespace {
61
rchf114d982015-10-21 01:34:5662static const char kQuicAlternateProtocolHeader[] =
[email protected]6d1b4ed2013-07-10 03:57:5463 "Alternate-Protocol: 443:quic\r\n\r\n";
rchf114d982015-10-21 01:34:5664static const char kQuicAlternateProtocol50pctHeader[] =
65 "Alternate-Protocol: 443:quic,p=.5\r\n\r\n";
66static 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";
rchf114d982015-10-21 01:34:5670static const char kQuicAlternativeService50pctHeader[] =
71 "Alt-Svc: quic=\":443\";p=\".5\"\r\n\r\n";
72static 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
207 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29208 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
rchf114d982015-10-21 01:34:56209 verify_details_.cert_verify_result.verified_cert = cert;
210 verify_details_.cert_verify_result.is_issued_by_known_root = true;
211 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
[email protected]1c04f9522013-02-21 20:32:43212 }
[email protected]61a527782013-02-21 03:58:00213
dcheng67be2b1f2014-10-27 21:47:29214 void SetUp() override {
[email protected]61a527782013-02-21 03:58:00215 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34216 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00217 }
218
dcheng67be2b1f2014-10-27 21:47:29219 void TearDown() override {
[email protected]61a527782013-02-21 03:58:00220 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
221 // Empty the current queue.
[email protected]2da659e2013-05-23 20:51:34222 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00223 PlatformTest::TearDown();
224 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34225 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00226 }
227
[email protected]3316d422013-05-03 21:45:30228 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
rtennetia004d332015-08-28 06:44:57229 QuicPacketNumber num) {
[email protected]1e960032013-12-20 19:00:20230 return maker_.MakeConnectionClosePacket(num);
[email protected]3316d422013-05-03 21:45:30231 }
232
[email protected]61a527782013-02-21 03:58:00233 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket(
rtennetia004d332015-08-28 06:44:57234 QuicPacketNumber largest_received,
235 QuicPacketNumber least_unacked) {
zhongyi32569c62016-01-08 02:54:30236 return maker_.MakeAckPacket(2, largest_received, least_unacked,
237 least_unacked, true);
238 }
239
240 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket(
241 QuicPacketNumber largest_received,
242 QuicPacketNumber least_unacked,
243 QuicTestPacketMaker* maker) {
244 return maker->MakeAckPacket(2, largest_received, least_unacked,
245 least_unacked, true);
246 }
247
248 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket(
249 QuicPacketNumber packet_number,
250 QuicPacketNumber largest_received,
251 QuicPacketNumber ack_least_unacked,
252 QuicPacketNumber stop_least_unacked) {
253 return maker_.MakeAckPacket(packet_number, largest_received,
254 ack_least_unacked, stop_least_unacked, true);
[email protected]1e960032013-12-20 19:00:20255 }
[email protected]61a527782013-02-21 03:58:00256
zhongyica364fbb2015-12-12 03:39:12257 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket(
258 QuicPacketNumber num,
259 QuicTime::Delta delta_time_largest_observed,
260 QuicPacketNumber largest_received,
261 QuicPacketNumber least_unacked,
262 QuicErrorCode quic_error,
263 std::string& quic_error_details) {
264 return maker_.MakeAckAndConnectionClosePacket(
265 num, false, delta_time_largest_observed, largest_received,
266 least_unacked, quic_error, quic_error_details);
267 }
268
269 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket(
270 QuicPacketNumber num,
271 bool include_version,
272 QuicStreamId stream_id,
273 QuicRstStreamErrorCode error_code) {
274 return maker_.MakeRstPacket(num, include_version, stream_id, error_code);
275 }
276
zhongyi32569c62016-01-08 02:54:30277 // Uses default QuicTestPacketMaker.
[email protected]1e960032013-12-20 19:00:20278 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
279 const std::string& scheme,
280 const std::string& path) {
zhongyi32569c62016-01-08 02:54:30281 return GetRequestHeaders(method, scheme, path, maker_);
282 }
283
284 // Uses customized QuicTestPacketMaker.
285 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
286 const std::string& scheme,
287 const std::string& path,
288 QuicTestPacketMaker& maker) {
289 return maker.GetRequestHeaders(method, scheme, path);
[email protected]61a527782013-02-21 03:58:00290 }
291
[email protected]1e960032013-12-20 19:00:20292 SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
293 return maker_.GetResponseHeaders(status);
[email protected]61a527782013-02-21 03:58:00294 }
295
zhongyi32569c62016-01-08 02:54:30296 // Appends alt_svc headers in the response headers.
297 SpdyHeaderBlock GetResponseHeaders(const std::string& status,
298 const std::string& alt_svc) {
299 return maker_.GetResponseHeaders(status, alt_svc);
300 }
301
[email protected]1e960032013-12-20 19:00:20302 scoped_ptr<QuicEncryptedPacket> ConstructDataPacket(
rtennetia004d332015-08-28 06:44:57303 QuicPacketNumber packet_number,
[email protected]98b20ce2013-05-10 05:55:26304 QuicStreamId stream_id,
[email protected]e8ff26842013-03-22 21:02:05305 bool should_include_version,
[email protected]61a527782013-02-21 03:58:00306 bool fin,
307 QuicStreamOffset offset,
308 base::StringPiece data) {
rtennetia004d332015-08-28 06:44:57309 return maker_.MakeDataPacket(packet_number, stream_id,
310 should_include_version, fin, offset, data);
[email protected]61a527782013-02-21 03:58:00311 }
312
[email protected]1e960032013-12-20 19:00:20313 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
rtennetia004d332015-08-28 06:44:57314 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20315 QuicStreamId stream_id,
316 bool should_include_version,
317 bool fin,
zhongyi32569c62016-01-08 02:54:30318 const SpdyHeaderBlock& headers,
319 QuicStreamOffset* offset) {
ianswett0888cff2015-11-24 17:42:16320 SpdyPriority priority =
rtennetif4bdb542015-01-21 14:33:05321 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
zhongyi32569c62016-01-08 02:54:30322 return maker_.MakeRequestHeadersPacketWithOffsetTracking(
323 packet_number, stream_id, should_include_version, fin, priority,
324 headers, offset);
325 }
326
327 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
328 QuicPacketNumber packet_number,
329 QuicStreamId stream_id,
330 bool should_include_version,
331 bool fin,
332 const SpdyHeaderBlock& headers,
333 QuicStreamOffset* offset,
334 QuicTestPacketMaker* maker) {
335 SpdyPriority priority =
336 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
337 return maker->MakeRequestHeadersPacketWithOffsetTracking(
338 packet_number, stream_id, should_include_version, fin, priority,
339 headers, offset);
340 }
341
342 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
343 QuicPacketNumber packet_number,
344 QuicStreamId stream_id,
345 bool should_include_version,
346 bool fin,
347 const SpdyHeaderBlock& headers) {
348 return ConstructRequestHeadersPacket(packet_number, stream_id,
349 should_include_version, fin, headers,
350 nullptr, &maker_);
351 }
352 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
353 QuicPacketNumber packet_number,
354 QuicStreamId stream_id,
355 bool should_include_version,
356 bool fin,
357 const SpdyHeaderBlock& headers,
358 QuicTestPacketMaker* maker) {
359 return ConstructRequestHeadersPacket(packet_number, stream_id,
360 should_include_version, fin, headers,
361 nullptr, maker);
[email protected]61a527782013-02-21 03:58:00362 }
363
[email protected]1e960032013-12-20 19:00:20364 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
rtennetia004d332015-08-28 06:44:57365 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20366 QuicStreamId stream_id,
367 bool should_include_version,
368 bool fin,
369 const SpdyHeaderBlock& headers) {
zhongyi32569c62016-01-08 02:54:30370 return ConstructResponseHeadersPacket(packet_number, stream_id,
371 should_include_version, fin, headers,
372 nullptr, &maker_);
373 }
374
375 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
376 QuicPacketNumber packet_number,
377 QuicStreamId stream_id,
378 bool should_include_version,
379 bool fin,
380 const SpdyHeaderBlock& headers,
381 QuicTestPacketMaker* maker) {
382 return ConstructResponseHeadersPacket(packet_number, stream_id,
383 should_include_version, fin, headers,
384 nullptr, maker);
385 }
386
387 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
388 QuicPacketNumber packet_number,
389 QuicStreamId stream_id,
390 bool should_include_version,
391 bool fin,
392 const SpdyHeaderBlock& headers,
393 QuicStreamOffset* offset) {
394 return maker_.MakeResponseHeadersPacketWithOffsetTracking(
395 packet_number, stream_id, should_include_version, fin, headers, offset);
396 }
397
398 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
399 QuicPacketNumber packet_number,
400 QuicStreamId stream_id,
401 bool should_include_version,
402 bool fin,
403 const SpdyHeaderBlock& headers,
404 QuicStreamOffset* offset,
405 QuicTestPacketMaker* maker) {
406 return maker->MakeResponseHeadersPacketWithOffsetTracking(
407 packet_number, stream_id, should_include_version, fin, headers, offset);
[email protected]61a527782013-02-21 03:58:00408 }
409
rjshaded5ced072015-12-18 19:26:02410 void CreateSession() { CreateSessionWithFactory(&socket_factory_, false); }
[email protected]dda75ab2013-06-22 22:43:30411
[email protected]d7599122014-05-24 03:37:23412 void CreateSessionWithNextProtos() {
413 CreateSessionWithFactory(&socket_factory_, true);
414 }
415
416 // If |use_next_protos| is true, enables SPDY and QUIC.
417 void CreateSessionWithFactory(ClientSocketFactory* socket_factory,
418 bool use_next_protos) {
[email protected]4dca587c2013-03-07 16:54:47419 params_.enable_quic = true;
420 params_.quic_clock = clock_;
421 params_.quic_random = &random_generator_;
[email protected]dda75ab2013-06-22 22:43:30422 params_.client_socket_factory = socket_factory;
[email protected]e8ff26842013-03-22 21:02:05423 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43424 params_.host_resolver = &host_resolver_;
425 params_.cert_verifier = &cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11426 params_.transport_security_state = &transport_security_state_;
rtenneti052774e2015-11-24 21:00:12427 params_.cert_transparency_verifier = cert_transparency_verifier_.get();
tbansalfdf5665b2015-09-21 22:46:40428 params_.socket_performance_watcher_factory =
429 test_network_quality_estimator_.get();
[email protected]1c04f9522013-02-21 20:32:43430 params_.proxy_service = proxy_service_.get();
431 params_.ssl_config_service = ssl_config_service_.get();
432 params_.http_auth_handler_factory = auth_handler_factory_.get();
bnc6be245c12015-05-15 11:24:07433 params_.http_server_properties = http_server_properties_.GetWeakPtr();
[email protected]1e960032013-12-20 19:00:20434 params_.quic_supported_versions = SupportedVersions(GetParam());
rch74da0e1a2016-01-14 02:49:32435 for (const char* host :
rch9ae5b3b2016-02-11 00:36:29436 {kDefaultServerHostName, "www.example.org", "news.example.org",
437 "bar.example.org", "foo.example.org", "invalid.example.org",
438 "mail.example.com"}) {
rch74da0e1a2016-01-14 02:49:32439 params_.quic_host_whitelist.insert(host);
440 }
[email protected]61a527782013-02-21 03:58:00441
tbansalc8a94ea2015-11-02 23:58:51442 test_network_quality_estimator_->AddRTTObserver(&rtt_observer_);
443
[email protected]d7599122014-05-24 03:37:23444 if (use_next_protos) {
bncf33fb31b2016-01-29 15:22:26445 params_.parse_alternative_services = true;
446 params_.enable_alternative_service_with_different_host = true;
[email protected]d7599122014-05-24 03:37:23447 }
448
mmenkee65e7af2015-10-13 17:16:42449 session_.reset(new HttpNetworkSession(params_));
[email protected]11c05872013-08-20 02:04:12450 session_->quic_stream_factory()->set_require_confirmation(false);
rch185ebee2015-07-14 23:56:22451 ASSERT_EQ(params_.quic_socket_receive_buffer_size,
452 session_->quic_stream_factory()->socket_receive_buffer_size());
[email protected]61a527782013-02-21 03:58:00453 }
454
[email protected]aa9b14d2013-05-10 23:45:19455 void CheckWasQuicResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
456 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42457 ASSERT_TRUE(response != nullptr);
458 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19459 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
460 EXPECT_TRUE(response->was_fetched_via_spdy);
461 EXPECT_TRUE(response->was_npn_negotiated);
462 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
463 response->connection_info);
464 }
465
bnc62a44f022015-04-02 15:59:41466 void CheckResponsePort(const scoped_ptr<HttpNetworkTransaction>& trans,
Avi Drissman13fc8932015-12-20 04:40:46467 uint16_t port) {
bnc62a44f022015-04-02 15:59:41468 const HttpResponseInfo* response = trans->GetResponseInfo();
469 ASSERT_TRUE(response != nullptr);
470 EXPECT_EQ(port, response->socket_address.port());
471 }
472
[email protected]aa9b14d2013-05-10 23:45:19473 void CheckWasHttpResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
474 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42475 ASSERT_TRUE(response != nullptr);
476 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19477 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
478 EXPECT_FALSE(response->was_fetched_via_spdy);
479 EXPECT_FALSE(response->was_npn_negotiated);
480 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1,
481 response->connection_info);
482 }
483
bncffc2fdf2015-05-14 18:29:49484 void CheckResponseData(const scoped_ptr<HttpNetworkTransaction>& trans,
[email protected]aa9b14d2013-05-10 23:45:19485 const std::string& expected) {
486 std::string response_data;
bncffc2fdf2015-05-14 18:29:49487 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
[email protected]aa9b14d2013-05-10 23:45:19488 EXPECT_EQ(expected, response_data);
489 }
490
bncffc2fdf2015-05-14 18:29:49491 void RunTransaction(const scoped_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19492 TestCompletionCallback callback;
493 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
494 EXPECT_EQ(ERR_IO_PENDING, rv);
495 EXPECT_EQ(OK, callback.WaitForResult());
496 }
497
498 void SendRequestAndExpectHttpResponse(const std::string& expected) {
499 scoped_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50500 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
bncffc2fdf2015-05-14 18:29:49501 RunTransaction(trans);
[email protected]aa9b14d2013-05-10 23:45:19502 CheckWasHttpResponse(trans);
bncffc2fdf2015-05-14 18:29:49503 CheckResponseData(trans, expected);
[email protected]aa9b14d2013-05-10 23:45:19504 }
505
506 void SendRequestAndExpectQuicResponse(const std::string& expected) {
rchf114d982015-10-21 01:34:56507 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, 443);
tbansal7cec3812015-02-05 21:25:12508 }
509
bnc62a44f022015-04-02 15:59:41510 void SendRequestAndExpectQuicResponseOnPort(const std::string& expected,
Avi Drissman13fc8932015-12-20 04:40:46511 uint16_t port) {
bnc62a44f022015-04-02 15:59:41512 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, port);
513 }
514
515 void SendRequestAndExpectQuicResponseFromProxyOnPort(
516 const std::string& expected,
Avi Drissman13fc8932015-12-20 04:40:46517 uint16_t port) {
bnc62a44f022015-04-02 15:59:41518 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port);
[email protected]aa9b14d2013-05-10 23:45:19519 }
520
521 void AddQuicAlternateProtocolMapping(
522 MockCryptoClientStream::HandshakeMode handshake_mode) {
523 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
bnccacc0992015-03-20 20:22:22524 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url);
rchf114d982015-10-21 01:34:56525 AlternativeService alternative_service(QUIC, host_port_pair.host(), 443);
bnc7dc7e1b42015-07-28 14:43:12526 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
527 http_server_properties_.SetAlternativeService(
528 host_port_pair, alternative_service, 1.0, expiration);
[email protected]aa9b14d2013-05-10 23:45:19529 }
530
531 void ExpectBrokenAlternateProtocolMapping() {
bnc8445b3002015-03-13 01:57:09532 const HostPortPair origin = HostPortPair::FromURL(request_.url);
bncd9b132e2015-07-08 05:16:10533 const AlternativeServiceVector alternative_service_vector =
534 http_server_properties_.GetAlternativeServices(origin);
535 EXPECT_EQ(1u, alternative_service_vector.size());
bnc6be245c12015-05-15 11:24:07536 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken(
bncd9b132e2015-07-08 05:16:10537 alternative_service_vector[0]));
[email protected]aa9b14d2013-05-10 23:45:19538 }
539
[email protected]4d590c9c2014-05-02 05:14:33540 void ExpectQuicAlternateProtocolMapping() {
bncd9b132e2015-07-08 05:16:10541 const HostPortPair origin = HostPortPair::FromURL(request_.url);
542 const AlternativeServiceVector alternative_service_vector =
543 http_server_properties_.GetAlternativeServices(origin);
544 EXPECT_EQ(1u, alternative_service_vector.size());
545 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
[email protected]4d590c9c2014-05-02 05:14:33546 }
547
[email protected]aa9b14d2013-05-10 23:45:19548 void AddHangingNonAlternateProtocolSocketData() {
zhongyi32569c62016-01-08 02:54:30549 scoped_ptr<StaticSocketDataProvider> hanging_data;
550 hanging_data.reset(new StaticSocketDataProvider());
[email protected]dda75ab2013-06-22 22:43:30551 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
zhongyi32569c62016-01-08 02:54:30552 hanging_data->set_connect_data(hanging_connect);
553 hanging_data_.push_back(std::move(hanging_data));
554 socket_factory_.AddSocketDataProvider(hanging_data_.back().get());
rchf114d982015-10-21 01:34:56555 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]aa9b14d2013-05-10 23:45:19556 }
557
rtenneti4b06ae72014-08-26 03:43:43558 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
[email protected]1e960032013-12-20 19:00:20559 QuicTestPacketMaker maker_;
mmenkee65e7af2015-10-13 17:16:42560 scoped_ptr<HttpNetworkSession> session_;
[email protected]61a527782013-02-21 03:58:00561 MockClientSocketFactory socket_factory_;
rchf114d982015-10-21 01:34:56562 ProofVerifyDetailsChromium verify_details_;
[email protected]e8ff26842013-03-22 21:02:05563 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43564 MockHostResolver host_resolver_;
565 MockCertVerifier cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11566 TransportSecurityState transport_security_state_;
rtenneti052774e2015-11-24 21:00:12567 scoped_ptr<CTVerifier> cert_transparency_verifier_;
tbansalfdf5665b2015-09-21 22:46:40568 scoped_ptr<TestNetworkQualityEstimator> test_network_quality_estimator_;
tbansalc8a94ea2015-11-02 23:58:51569 TestRTTObserver rtt_observer_;
[email protected]1c04f9522013-02-21 20:32:43570 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
571 scoped_ptr<ProxyService> proxy_service_;
572 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
[email protected]61a527782013-02-21 03:58:00573 MockRandom random_generator_;
bnc6be245c12015-05-15 11:24:07574 HttpServerPropertiesImpl http_server_properties_;
[email protected]61a527782013-02-21 03:58:00575 HttpNetworkSession::Params params_;
[email protected]aa9b14d2013-05-10 23:45:19576 HttpRequestInfo request_;
vishal.b62985ca92015-04-17 08:45:51577 BoundTestNetLog net_log_;
zhongyi32569c62016-01-08 02:54:30578 std::vector<scoped_ptr<StaticSocketDataProvider>> hanging_data_;
rchf114d982015-10-21 01:34:56579 SSLSocketDataProvider ssl_data_;
tbansal7cec3812015-02-05 21:25:12580
581 private:
582 void SendRequestAndExpectQuicResponseMaybeFromProxy(
583 const std::string& expected,
bnc62a44f022015-04-02 15:59:41584 bool used_proxy,
Avi Drissman13fc8932015-12-20 04:40:46585 uint16_t port) {
tbansal7cec3812015-02-05 21:25:12586 scoped_ptr<HttpNetworkTransaction> trans(
587 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
588 ProxyHeadersHandler proxy_headers_handler;
589 trans->SetBeforeProxyHeadersSentCallback(
590 base::Bind(&ProxyHeadersHandler::OnBeforeProxyHeadersSent,
591 base::Unretained(&proxy_headers_handler)));
bncffc2fdf2015-05-14 18:29:49592 RunTransaction(trans);
tbansal7cec3812015-02-05 21:25:12593 CheckWasQuicResponse(trans);
bnc62a44f022015-04-02 15:59:41594 CheckResponsePort(trans, port);
bncffc2fdf2015-05-14 18:29:49595 CheckResponseData(trans, expected);
tbansal7cec3812015-02-05 21:25:12596 EXPECT_EQ(used_proxy, proxy_headers_handler.was_called());
597 }
[email protected]61a527782013-02-21 03:58:00598};
599
rjshaded5ced072015-12-18 19:26:02600INSTANTIATE_TEST_CASE_P(Version,
601 QuicNetworkTransactionTest,
[email protected]1e960032013-12-20 19:00:20602 ::testing::ValuesIn(QuicSupportedVersions()));
603
604TEST_P(QuicNetworkTransactionTest, ForceQuic) {
[email protected]49e85332013-06-04 04:18:03605 params_.origin_to_force_quic_on =
rch9ae5b3b2016-02-11 00:36:29606 HostPortPair::FromString("mail.example.org:443");
[email protected]4dca587c2013-03-07 16:54:47607
[email protected]1e960032013-12-20 19:00:20608 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03609 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05610 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56611 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:02612 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
613 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:03614 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05615 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03616 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:59617 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
[email protected]4dca587c2013-03-07 16:54:47618
rcha5399e02015-04-21 19:32:04619 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4dca587c2013-03-07 16:54:47620
[email protected]aa9b14d2013-05-10 23:45:19621 // The non-alternate protocol job needs to hang in order to guarantee that
622 // the alternate-protocol job will "win".
623 AddHangingNonAlternateProtocolSocketData();
[email protected]4dca587c2013-03-07 16:54:47624
625 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47626
tbansalc8a94ea2015-11-02 23:58:51627 EXPECT_FALSE(rtt_observer_.rtt_notification_received());
[email protected]aa9b14d2013-05-10 23:45:19628 SendRequestAndExpectQuicResponse("hello!");
tbansalc8a94ea2015-11-02 23:58:51629 EXPECT_TRUE(rtt_observer_.rtt_notification_received());
[email protected]4dca587c2013-03-07 16:54:47630
[email protected]98b20ce2013-05-10 05:55:26631 // Check that the NetLog was filled reasonably.
mmenke43758e62015-05-04 21:09:46632 TestNetLogEntry::List entries;
[email protected]aa9b14d2013-05-10 23:45:19633 net_log_.GetEntries(&entries);
[email protected]98b20ce2013-05-10 05:55:26634 EXPECT_LT(0u, entries.size());
635
636 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29637 int pos = ExpectLogContainsSomewhere(
638 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
639 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26640 EXPECT_LT(0, pos);
641
rchfd527212015-08-25 00:41:26642 // ... and also a TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29643 pos = ExpectLogContainsSomewhere(
rchfd527212015-08-25 00:41:26644 entries, 0,
645 NetLog::TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED,
ttuttle859dc7a2015-04-23 19:42:29646 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26647 EXPECT_LT(0, pos);
648
rtennetia004d332015-08-28 06:44:57649 std::string packet_number;
650 ASSERT_TRUE(entries[pos].GetStringValue("packet_number", &packet_number));
651 EXPECT_EQ("1", packet_number);
[email protected]98b20ce2013-05-10 05:55:26652
rchfd527212015-08-25 00:41:26653 // ... and also a TYPE_QUIC_SESSION_PACKET_AUTHENTICATED.
654 pos = ExpectLogContainsSomewhere(
655 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_AUTHENTICATED,
656 NetLog::PHASE_NONE);
657 EXPECT_LT(0, pos);
658
[email protected]98b20ce2013-05-10 05:55:26659 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29660 pos = ExpectLogContainsSomewhere(
661 entries, 0, NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
662 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26663 EXPECT_LT(0, pos);
664
665 int log_stream_id;
666 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
[email protected]1e960032013-12-20 19:00:20667 EXPECT_EQ(3, log_stream_id);
[email protected]4dca587c2013-03-07 16:54:47668}
669
[email protected]cf3e3cd62014-02-05 16:16:16670TEST_P(QuicNetworkTransactionTest, QuicProxy) {
tbansaled0aecc2015-02-20 03:44:18671 params_.enable_quic_for_proxies = true;
rchf114d982015-10-21 01:34:56672 proxy_service_ =
rch9ae5b3b2016-02-11 00:36:29673 ProxyService::CreateFixedFromPacResult("QUIC mail.example.org:70");
[email protected]cf3e3cd62014-02-05 16:16:16674
[email protected]cf3e3cd62014-02-05 16:16:16675 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03676 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05677 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03678 GetRequestHeaders("GET", "http", "/")));
rjshaded5ced072015-12-18 19:26:02679 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
680 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:03681 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05682 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03683 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50684 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59685 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]cf3e3cd62014-02-05 16:16:16686
rcha5399e02015-04-21 19:32:04687 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cf3e3cd62014-02-05 16:16:16688
tbansalc8a94ea2015-11-02 23:58:51689 EXPECT_FALSE(rtt_observer_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16690 // There is no need to set up an alternate protocol job, because
691 // no attempt will be made to speak to the proxy over TCP.
692
rch9ae5b3b2016-02-11 00:36:29693 request_.url = GURL("http://mail.example.org/");
[email protected]cf3e3cd62014-02-05 16:16:16694 CreateSession();
695
bnc62a44f022015-04-02 15:59:41696 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
tbansalc8a94ea2015-11-02 23:58:51697 EXPECT_TRUE(rtt_observer_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16698}
699
bnc313ba9c2015-06-11 15:42:31700// Regression test for https://crbug.com/492458. Test that for an HTTP
701// connection through a QUIC proxy, the certificate exhibited by the proxy is
702// checked against the proxy hostname, not the origin hostname.
703TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) {
rch9ae5b3b2016-02-11 00:36:29704 const std::string origin_host = "mail.example.com";
bnc313ba9c2015-06-11 15:42:31705 const std::string proxy_host = "www.example.org";
706
707 params_.enable_quic_for_proxies = true;
rdsmith82957ad2015-09-16 19:42:03708 proxy_service_ =
709 ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70");
bnc313ba9c2015-06-11 15:42:31710
711 maker_.set_hostname(origin_host);
712 MockQuicData mock_quic_data;
713 mock_quic_data.AddWrite(
714 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
715 GetRequestHeaders("GET", "http", "/")));
716 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
717 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
718 mock_quic_data.AddRead(
719 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
720 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50721 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59722 mock_quic_data.AddRead(ASYNC, 0);
bnc313ba9c2015-06-11 15:42:31723 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
724
725 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29726 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bnc313ba9c2015-06-11 15:42:31727 ASSERT_TRUE(cert.get());
728 // This certificate is valid for the proxy, but not for the origin.
729 bool common_name_fallback_used;
730 EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used));
731 EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used));
732 ProofVerifyDetailsChromium verify_details;
733 verify_details.cert_verify_result.verified_cert = cert;
734 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rchf114d982015-10-21 01:34:56735 ProofVerifyDetailsChromium verify_details2;
736 verify_details2.cert_verify_result.verified_cert = cert;
737 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
bnc313ba9c2015-06-11 15:42:31738
739 request_.url = GURL("http://" + origin_host);
740 AddHangingNonAlternateProtocolSocketData();
741 CreateSessionWithNextProtos();
742 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
743 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
744}
745
[email protected]1e960032013-12-20 19:00:20746TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
[email protected]49e85332013-06-04 04:18:03747 params_.origin_to_force_quic_on =
rch9ae5b3b2016-02-11 00:36:29748 HostPortPair::FromString("mail.example.org:443");
[email protected]cebe3282013-05-22 23:49:30749
tbansalfdf5665b2015-09-21 22:46:40750 MockQuicData mock_quic_data1;
751 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
[email protected]1e960032013-12-20 19:00:20752
tbansalfdf5665b2015-09-21 22:46:40753 MockQuicData mock_quic_data2;
zhongyi32569c62016-01-08 02:54:30754 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40755 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
rch6faa4d42016-01-05 20:48:43756 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40757
758 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
759 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
[email protected]cebe3282013-05-22 23:49:30760
761 CreateSession();
762
tbansalc8a94ea2015-11-02 23:58:51763 EXPECT_EQ(0U, test_network_quality_estimator_->watcher_count());
tbansalfdf5665b2015-09-21 22:46:40764 for (size_t i = 0; i < 2; ++i) {
765 scoped_ptr<HttpNetworkTransaction> trans(
766 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
767 TestCompletionCallback callback;
768 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
769 EXPECT_EQ(ERR_IO_PENDING, rv);
770 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
tbansalc8a94ea2015-11-02 23:58:51771 EXPECT_EQ(1 + i, test_network_quality_estimator_->watcher_count());
tbansalfdf5665b2015-09-21 22:46:40772 }
[email protected]cebe3282013-05-22 23:49:30773}
774
tbansalc8a94ea2015-11-02 23:58:51775TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
776 // Attempt to "force" quic on 443, which will not be honored.
777 params_.origin_to_force_quic_on =
778 HostPortPair::FromString("www.google.com:443");
779
780 MockRead http_reads[] = {
781 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
782 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
783 MockRead(ASYNC, OK)};
784
785 StaticSocketDataProvider data(http_reads, arraysize(http_reads), nullptr, 0);
786 socket_factory_.AddSocketDataProvider(&data);
787 SSLSocketDataProvider ssl(ASYNC, OK);
788 socket_factory_.AddSSLSocketDataProvider(&ssl);
789
790 CreateSession();
791
792 SendRequestAndExpectHttpResponse("hello world");
793 EXPECT_EQ(0U, test_network_quality_estimator_->watcher_count());
794}
795
bncc958faa2015-07-31 18:14:52796TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52797 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56798 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
799 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52800 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
801 MockRead(ASYNC, OK)};
802
803 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
804 0);
805 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56806 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52807
808 MockQuicData mock_quic_data;
809 mock_quic_data.AddWrite(
810 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56811 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52812 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
813 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
814 mock_quic_data.AddRead(
815 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
816 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
817 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59818 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52819
820 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
821
822 AddHangingNonAlternateProtocolSocketData();
823 CreateSessionWithNextProtos();
824
825 SendRequestAndExpectHttpResponse("hello world");
826 SendRequestAndExpectQuicResponse("hello!");
827}
828
bnc8be55ebb2015-10-30 14:12:07829TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) {
830 std::string altsvc_header = base::StringPrintf(
831 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam());
832 MockRead http_reads[] = {
833 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
834 MockRead("hello world"),
835 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
836 MockRead(ASYNC, OK)};
837
838 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
839 0);
840 socket_factory_.AddSocketDataProvider(&http_data);
841 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
842
843 MockQuicData mock_quic_data;
844 mock_quic_data.AddWrite(
845 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
846 GetRequestHeaders("GET", "https", "/")));
847 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
848 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
849 mock_quic_data.AddRead(
850 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
851 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
852 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59853 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc8be55ebb2015-10-30 14:12:07854
855 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
856
857 AddHangingNonAlternateProtocolSocketData();
858 CreateSessionWithNextProtos();
859
860 SendRequestAndExpectHttpResponse("hello world");
861 SendRequestAndExpectQuicResponse("hello!");
862}
863
864TEST_P(QuicNetworkTransactionTest,
865 DoNotUseAlternativeServiceQuicUnsupportedVersion) {
866 std::string altsvc_header = base::StringPrintf(
867 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam() - 1);
868 MockRead http_reads[] = {
869 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
870 MockRead("hello world"),
871 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
872 MockRead(ASYNC, OK)};
873
874 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
875 0);
876 socket_factory_.AddSocketDataProvider(&http_data);
877 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
878 socket_factory_.AddSocketDataProvider(&http_data);
879 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
880
881 CreateSessionWithNextProtos();
882
883 SendRequestAndExpectHttpResponse("hello world");
884 SendRequestAndExpectHttpResponse("hello world");
885}
886
bncc958faa2015-07-31 18:14:52887// When multiple alternative services are advertised,
zhongyi32569c62016-01-08 02:54:30888// HttpStreamFactoryImpl::RequestStreamInternal() should select the alternative
889// service which uses existing QUIC session if available. If no existing QUIC
890// session can be used, use the first alternative service from the list.
891TEST_P(QuicNetworkTransactionTest, UseExistingAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52892 MockRead http_reads[] = {
893 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:29894 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
bncc958faa2015-07-31 18:14:52895 MockRead("hello world"),
896 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
897 MockRead(ASYNC, OK)};
898
899 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
900 0);
901 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56902 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52903
zhongyi32569c62016-01-08 02:54:30904 QuicStreamOffset request_header_offset = 0;
905 QuicStreamOffset response_header_offset = 0;
906 // First QUIC request data.
rch9ae5b3b2016-02-11 00:36:29907 // Open a session to foo.example.org:443 using the first entry of the
zhongyi32569c62016-01-08 02:54:30908 // alternative service list.
bncc958faa2015-07-31 18:14:52909 MockQuicData mock_quic_data;
zhongyi32569c62016-01-08 02:54:30910 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
911 1, kClientDataStreamId1, true, true,
912 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
913
914 std::string alt_svc_list =
rch9ae5b3b2016-02-11 00:36:29915 "quic=\"mail.example.org:444\", quic=\"foo.example.org:443\", "
916 "quic=\"bar.example.org:445\"";
bncc958faa2015-07-31 18:14:52917 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30918 1, kClientDataStreamId1, false, false,
919 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
bncc958faa2015-07-31 18:14:52920 mock_quic_data.AddRead(
921 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
922 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:30923
924 // Second QUIC request data.
925 // Connection pooling, using existing session, no need to include version
926 // as version negotiation has been completed.
927 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
928 3, kClientDataStreamId2, false, true,
929 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
930 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
931 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
932 &response_header_offset));
933 mock_quic_data.AddRead(
934 ConstructDataPacket(4, kClientDataStreamId2, false, true, 0, "hello!"));
935 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
bncc958faa2015-07-31 18:14:52936 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59937 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52938
939 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
940
941 AddHangingNonAlternateProtocolSocketData();
942 CreateSessionWithNextProtos();
943
944 SendRequestAndExpectHttpResponse("hello world");
zhongyi32569c62016-01-08 02:54:30945
bncc958faa2015-07-31 18:14:52946 SendRequestAndExpectQuicResponseOnPort("hello!", 443);
zhongyi32569c62016-01-08 02:54:30947 SendRequestAndExpectQuicResponseOnPort("hello!", 443);
948}
949
950// When multiple alternative services that has existing QUIC session.
951// HttpStreamFactoryImpl::RequestStreamInternal() should select the first
952// alternative service which uses existing QUIC session.
953TEST_P(QuicNetworkTransactionTest, UseFirstExistingAlternativeServiceForQuic) {
954 MockRead http_reads[] = {
955 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:29956 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":446\"\r\n\r\n"),
zhongyi32569c62016-01-08 02:54:30957 MockRead("hello world"),
958 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
959 MockRead(ASYNC, OK)};
960
961 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
962 0);
963 socket_factory_.AddSocketDataProvider(&http_data);
964 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
965
966 QuicStreamOffset request_header_offset = 0;
967 QuicStreamOffset response_header_offset = 0;
968
969 QuicTestPacketMaker maker(GetParam(), 0, clock_, kDefaultServerHostName);
970
971 MockQuicData mock_quic_data;
972 MockQuicData mock_quic_data2;
973 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
974 // First QUIC request data.
rch9ae5b3b2016-02-11 00:36:29975 // Open a QUIC session to foo.example.org:443.
zhongyi32569c62016-01-08 02:54:30976 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
977 1, kClientDataStreamId1, true, true,
978 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
979
980 std::string alt_svc_list =
rch9ae5b3b2016-02-11 00:36:29981 "quic=\"bar.example.org:444\", quic=\"frog.example.org:445\", "
982 "quic=\"mail.example.org:446\"";
zhongyi32569c62016-01-08 02:54:30983 // Response header from the server resets the alt_svc list for the origin.
984 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
985 1, kClientDataStreamId1, false, false,
986 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
987 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
988 true, 0, "hello from foo!"));
989 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
990
991 // Second QUIC request data.
rch9ae5b3b2016-02-11 00:36:29992 // Existing QUIC session to foo.example.org is not viable from the updated
zhongyi32569c62016-01-08 02:54:30993 // alt_svc. Unable to pool the existing QUIC session.
rch9ae5b3b2016-02-11 00:36:29994 // Open a new QUIC session to bar.example.org:443.
zhongyi32569c62016-01-08 02:54:30995 mock_quic_data2.AddWrite(ConstructRequestHeadersPacket(
996 1, kClientDataStreamId1, true, true,
997 GetRequestHeaders("GET", "https", "/"), &maker));
998 alt_svc_list =
rch9ae5b3b2016-02-11 00:36:29999 "quic=\"foo.example.org:443\", quic=\"mail.example.org:446\", "
1000 "quic=\"bar.example.org:444\"";
zhongyi32569c62016-01-08 02:54:301001 // Response header from the server resets the alt_svc list for the origin.
1002 mock_quic_data2.AddRead(ConstructResponseHeadersPacket(
1003 1, kClientDataStreamId1, false, false,
1004 GetResponseHeaders("200 OK", alt_svc_list), &maker));
1005 mock_quic_data2.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1006 true, 0, "hello from bar!"));
1007 mock_quic_data2.AddWrite(ConstructAckPacket(2, 1, &maker));
1008 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1009 mock_quic_data2.AddRead(ASYNC, 0); // EOF
1010
1011 // Third QUIC request data.
rch9ae5b3b2016-02-11 00:36:291012 // Connection pooling, using the first existing session to foo.example.org
zhongyi32569c62016-01-08 02:54:301013 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1014 3, kClientDataStreamId2, false, true,
1015 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1016 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1017 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1018 &response_header_offset));
1019 mock_quic_data.AddRead(ConstructDataPacket(4, kClientDataStreamId2, false,
1020 true, 0, "hello from foo!"));
1021 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
1022 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1023 mock_quic_data.AddRead(ASYNC, 0); // EOF
1024
1025 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1026 AddHangingNonAlternateProtocolSocketData();
1027
1028 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
1029
1030 AddHangingNonAlternateProtocolSocketData();
1031
1032 CreateSessionWithNextProtos();
1033
1034 SendRequestAndExpectHttpResponse("hello world");
1035 SendRequestAndExpectQuicResponseOnPort("hello from foo!", 443);
1036 SendRequestAndExpectQuicResponseOnPort("hello from bar!", 444);
1037 SendRequestAndExpectQuicResponseOnPort("hello from foo!", 443);
1038}
1039
1040// Multiple origins have listed the same alternative services. When there's a
1041// existing QUIC session opened by a request to other origin,
1042// if the cert is valid, should select this QUIC session to make the request
1043// if this is also the first existing QUIC session.
1044TEST_P(QuicNetworkTransactionTest,
1045 UseSharedExistingAlternativeServiceForQuicWithValidCert) {
rch9ae5b3b2016-02-11 00:36:291046 // Default cert is valid for *.example.org
zhongyi32569c62016-01-08 02:54:301047
rch9ae5b3b2016-02-11 00:36:291048 // HTTP data for request to www.example.org.
zhongyi32569c62016-01-08 02:54:301049 MockRead http_reads[] = {
1050 MockRead("HTTP/1.1 200 OK\r\n"),
1051 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
rch9ae5b3b2016-02-11 00:36:291052 MockRead("hello world from www.example.org"),
zhongyi32569c62016-01-08 02:54:301053 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1054 MockRead(ASYNC, OK)};
1055
1056 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1057 0);
1058 socket_factory_.AddSocketDataProvider(&http_data);
1059 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1060
1061 // HTTP data for request to mail.example.org.
1062 MockRead http_reads2[] = {
1063 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291064 MockRead("Alt-Svc: quic=\":444\", quic=\"www.example.org:443\"\r\n\r\n"),
zhongyi32569c62016-01-08 02:54:301065 MockRead("hello world from mail.example.org"),
1066 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1067 MockRead(ASYNC, OK)};
1068
1069 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1070 nullptr, 0);
1071 socket_factory_.AddSocketDataProvider(&http_data2);
1072 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1073
1074 QuicStreamOffset request_header_offset = 0;
1075 QuicStreamOffset response_header_offset = 0;
1076
rch9ae5b3b2016-02-11 00:36:291077 QuicTestPacketMaker maker(GetParam(), 0, clock_, "mail.example.org");
1078 maker_.set_hostname("www.example.org");
zhongyi32569c62016-01-08 02:54:301079 MockQuicData mock_quic_data;
1080
1081 // First QUIC request data.
1082 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1083 1, kClientDataStreamId1, true, true,
1084 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1085
1086 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1087 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1088 &response_header_offset));
1089 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1090 true, 0, "hello from mail QUIC!"));
1091 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301092 // Second QUIC request data.
1093 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1094 3, kClientDataStreamId2, false, true,
1095 GetRequestHeaders("GET", "https", "/", maker), &request_header_offset,
1096 &maker));
1097 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1098 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1099 &response_header_offset));
1100 mock_quic_data.AddRead(ConstructDataPacket(4, kClientDataStreamId2, false,
1101 true, 0, "hello from mail QUIC!"));
1102 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
1103 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1104 mock_quic_data.AddRead(ASYNC, 0); // EOF
1105
1106 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1107 AddHangingNonAlternateProtocolSocketData();
1108
1109 CreateSessionWithNextProtos();
1110
1111 // Send two HTTP requests, responses set up alt-svc lists for the origins.
rch9ae5b3b2016-02-11 00:36:291112 request_.url = GURL("https://www.example.org/");
1113 SendRequestAndExpectHttpResponse("hello world from www.example.org");
zhongyi32569c62016-01-08 02:54:301114 request_.url = GURL("https://mail.example.org/");
1115 SendRequestAndExpectHttpResponse("hello world from mail.example.org");
1116
rch9ae5b3b2016-02-11 00:36:291117 // Open a QUIC session to mail.example.org:443 when making request
1118 // to mail.example.org.
1119 request_.url = GURL("https://www.example.org/");
zhongyi32569c62016-01-08 02:54:301120 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443);
1121
rch9ae5b3b2016-02-11 00:36:291122 // Uses the existing QUIC session when making request to www.example.org.
zhongyi32569c62016-01-08 02:54:301123 request_.url = GURL("https://mail.example.org/");
1124 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443);
1125}
1126
1127// Multiple origins have listed the same alternative services. When there's a
1128// existing QUIC session opened by a request to other origin,
1129// if the cert is NOT valid, should ignore this QUIC session.
1130TEST_P(QuicNetworkTransactionTest,
1131 DoNotUseSharedExistingAlternativeServiceForQuicWithInvalidCert) {
rch9ae5b3b2016-02-11 00:36:291132 // Default cert is valid *.example.org
1133 // NOT valid for mail.example.com.
zhongyi32569c62016-01-08 02:54:301134
rch9ae5b3b2016-02-11 00:36:291135 // HTTP data for request to mail.example.org.
zhongyi32569c62016-01-08 02:54:301136 MockRead http_reads[] = {
1137 MockRead("HTTP/1.1 200 OK\r\n"),
1138 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
rch9ae5b3b2016-02-11 00:36:291139 MockRead("hello world from mail.example.org"),
zhongyi32569c62016-01-08 02:54:301140 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1141 MockRead(ASYNC, OK)};
1142
1143 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1144 0);
1145 socket_factory_.AddSocketDataProvider(&http_data);
1146 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1147
rch9ae5b3b2016-02-11 00:36:291148 // HTTP data for request to mail.example.com.
zhongyi32569c62016-01-08 02:54:301149 MockRead http_reads2[] = {
1150 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291151 MockRead("Alt-Svc: quic=\":444\", quic=\"mail.example.org:443\"\r\n\r\n"),
1152 MockRead("hello world from mail.example.com"),
zhongyi32569c62016-01-08 02:54:301153 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1154 MockRead(ASYNC, OK)};
1155
1156 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1157 nullptr, 0);
1158 socket_factory_.AddSocketDataProvider(&http_data2);
1159 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1160
rch9ae5b3b2016-02-11 00:36:291161 QuicTestPacketMaker maker(GetParam(), 0, clock_, "mail.example.org");
1162 maker.set_hostname("mail.example.com");
zhongyi32569c62016-01-08 02:54:301163 MockQuicData mock_quic_data;
1164 MockQuicData mock_quic_data2;
1165
1166 // Adding a valid cert for *.example.org but not mail.example.com.
1167 ProofVerifyDetailsChromium verify_details;
1168 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:291169 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
zhongyi32569c62016-01-08 02:54:301170 verify_details.cert_verify_result.verified_cert = cert;
1171 verify_details.cert_verify_result.is_issued_by_known_root = true;
1172 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1173
1174 // First QUIC request data.
1175 mock_quic_data.AddWrite(
1176 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1177 GetRequestHeaders("GET", "https", "/")));
1178 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1179 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1180 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1181 true, 0, "hello from mail QUIC!"));
1182 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1183 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1184 mock_quic_data.AddRead(ASYNC, 0); // EOF
1185
1186 // First QUIC request data.
1187 mock_quic_data2.AddWrite(ConstructRequestHeadersPacket(
1188 1, kClientDataStreamId1, true, true,
1189 GetRequestHeaders("GET", "https", "/", maker), &maker));
1190 mock_quic_data2.AddRead(
1191 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
1192 GetResponseHeaders("200 OK"), &maker));
1193 mock_quic_data2.AddRead(ConstructDataPacket(
1194 2, kClientDataStreamId1, false, true, 0, "hello from docs QUIC!"));
1195 mock_quic_data2.AddWrite(ConstructAckPacket(2, 1, &maker));
1196 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1197 mock_quic_data2.AddRead(ASYNC, 0); // EOF
1198
1199 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1200 AddHangingNonAlternateProtocolSocketData();
1201
1202 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
1203 AddHangingNonAlternateProtocolSocketData();
1204
1205 CreateSessionWithNextProtos();
1206
1207 // Send HTTP requests, responses set up the alt-svc lists for the origins.
rch9ae5b3b2016-02-11 00:36:291208 SendRequestAndExpectHttpResponse("hello world from mail.example.org");
zhongyi32569c62016-01-08 02:54:301209 request_.url = GURL("https://mail.example.com/");
rch9ae5b3b2016-02-11 00:36:291210 SendRequestAndExpectHttpResponse("hello world from mail.example.com");
1211
1212 // Open a QUIC session to mail.example.org:443 when making request
1213 // to mail.example.org.
1214 request_.url = GURL("https://mail.example.org/");
zhongyi32569c62016-01-08 02:54:301215 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443);
1216
rch9ae5b3b2016-02-11 00:36:291217 // Open another new QUIC session to mail.example.com:444.
1218 request_.url = GURL("https://mail.example.com/");
zhongyi32569c62016-01-08 02:54:301219 SendRequestAndExpectQuicResponseOnPort("hello from docs QUIC!", 444);
bncc958faa2015-07-31 18:14:521220}
1221
1222TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) {
bncc958faa2015-07-31 18:14:521223 MockRead http_reads[] = {
1224 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561225 MockRead(kQuicAlternativeServiceDifferentPortHeader),
bncc958faa2015-07-31 18:14:521226 MockRead("hello world"),
1227 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1228 MockRead(ASYNC, OK)};
1229
1230 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1231 0);
1232 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561233 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521234
1235 MockQuicData mock_quic_data;
1236 mock_quic_data.AddWrite(
1237 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561238 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521239 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1240 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1241 mock_quic_data.AddRead(
1242 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1243 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1244 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591245 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521246
1247 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1248
1249 AddHangingNonAlternateProtocolSocketData();
1250 CreateSessionWithNextProtos();
1251
1252 SendRequestAndExpectHttpResponse("hello world");
1253 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
1254}
1255
1256TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) {
bncc958faa2015-07-31 18:14:521257 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561258 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1259 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521260 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1261 MockRead(ASYNC, OK)};
1262
1263 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1264 0);
1265 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561266 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521267
1268 MockQuicData mock_quic_data;
1269 mock_quic_data.AddWrite(
1270 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561271 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521272 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1273 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1274 mock_quic_data.AddRead(
1275 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1276 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1277 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1278 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521279
1280 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1281
1282 AddHangingNonAlternateProtocolSocketData();
1283 CreateSessionWithNextProtos();
1284
1285 AlternativeService alternative_service(QUIC,
1286 HostPortPair::FromURL(request_.url));
1287 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
1288 alternative_service);
1289 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1290 alternative_service));
1291
1292 SendRequestAndExpectHttpResponse("hello world");
1293 SendRequestAndExpectQuicResponse("hello!");
1294
mmenkee24011922015-12-17 22:12:591295 mock_quic_data.Resume();
bncc958faa2015-07-31 18:14:521296
1297 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1298 alternative_service));
1299}
1300
1301TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceProbabilityForQuic) {
bncc958faa2015-07-31 18:14:521302 MockRead http_reads[] = {
1303 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561304 MockRead(kQuicAlternativeService50pctHeader), MockRead("hello world"),
bncc958faa2015-07-31 18:14:521305 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1306 MockRead(ASYNC, OK)};
1307
1308 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1309 0);
1310 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561311 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521312
1313 MockQuicData mock_quic_data;
1314 mock_quic_data.AddWrite(
1315 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561316 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521317 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1318 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1319 mock_quic_data.AddRead(
1320 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1321 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1322 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591323 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521324
1325 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1326
1327 AddHangingNonAlternateProtocolSocketData();
1328 params_.alternative_service_probability_threshold = 0.25;
1329 CreateSessionWithNextProtos();
1330
1331 SendRequestAndExpectHttpResponse("hello world");
1332 SendRequestAndExpectQuicResponse("hello!");
1333}
1334
1335TEST_P(QuicNetworkTransactionTest,
1336 DontUseAlternativeServiceProbabilityForQuic) {
bncc958faa2015-07-31 18:14:521337 MockRead http_reads[] = {
1338 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561339 MockRead(kQuicAlternativeService50pctHeader), MockRead("hello world"),
bncc958faa2015-07-31 18:14:521340 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1341 MockRead(ASYNC, OK)};
1342
1343 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1344 0);
1345 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561346 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521347 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561348 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521349
1350 params_.alternative_service_probability_threshold = 0.75;
1351 CreateSessionWithNextProtos();
1352
1353 SendRequestAndExpectHttpResponse("hello world");
1354 SendRequestAndExpectHttpResponse("hello world");
1355}
1356
bncc958faa2015-07-31 18:14:521357TEST_P(QuicNetworkTransactionTest,
1358 DontUseAlternativeServiceWithBadProbabilityForQuic) {
bncc958faa2015-07-31 18:14:521359 MockRead http_reads[] = {
1360 MockRead("HTTP/1.1 200 OK\r\n"),
1361 MockRead("Alt-Svc: quic=\":443\";p=2\r\n\r\n"), MockRead("hello world"),
1362 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1363 MockRead(ASYNC, OK)};
1364
1365 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1366 0);
1367 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561368 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521369 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561370 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521371
1372 params_.alternative_service_probability_threshold = 0.75;
1373 CreateSessionWithNextProtos();
1374
1375 SendRequestAndExpectHttpResponse("hello world");
1376 SendRequestAndExpectHttpResponse("hello world");
1377}
1378
1379TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) {
bncc958faa2015-07-31 18:14:521380 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561381 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1382 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521383 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1384 MockRead(ASYNC, OK)};
1385
1386 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1387 0);
1388 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561389 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521390
1391 MockQuicData mock_quic_data;
1392 mock_quic_data.AddWrite(
1393 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561394 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521395 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1396 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1397 mock_quic_data.AddRead(
1398 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1399 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1400 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
1401
1402 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1403
1404 AddHangingNonAlternateProtocolSocketData();
1405 CreateSessionWithNextProtos();
1406
1407 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1408 SendRequestAndExpectHttpResponse("hello world");
1409}
1410
[email protected]1e960032013-12-20 19:00:201411TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
[email protected]aa9b14d2013-05-10 23:45:191412 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561413 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1414 MockRead("hello world"),
1415 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1416 MockRead(ASYNC, OK)};
[email protected]61a527782013-02-21 03:58:001417
rjshaded5ced072015-12-18 19:26:021418 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1419 0);
[email protected]aa9b14d2013-05-10 23:45:191420 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561421 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]61a527782013-02-21 03:58:001422
[email protected]1e960032013-12-20 19:00:201423 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031424 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051425 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561426 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021427 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1428 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031429 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051430 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031431 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501432 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591433 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]61a527782013-02-21 03:58:001434
rcha5399e02015-04-21 19:32:041435 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]61a527782013-02-21 03:58:001436
[email protected]aa9b14d2013-05-10 23:45:191437 // The non-alternate protocol job needs to hang in order to guarantee that
1438 // the alternate-protocol job will "win".
1439 AddHangingNonAlternateProtocolSocketData();
[email protected]61a527782013-02-21 03:58:001440
[email protected]d7599122014-05-24 03:37:231441 CreateSessionWithNextProtos();
[email protected]61a527782013-02-21 03:58:001442
[email protected]aa9b14d2013-05-10 23:45:191443 SendRequestAndExpectHttpResponse("hello world");
1444 SendRequestAndExpectQuicResponse("hello!");
[email protected]61a527782013-02-21 03:58:001445}
1446
bnc62a44f022015-04-02 15:59:411447TEST_P(QuicNetworkTransactionTest, AlternateProtocolDifferentPort) {
1448 MockRead http_reads[] = {
1449 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561450 MockRead(kQuicAlternateProtocolDifferentPortHeader),
bnc62a44f022015-04-02 15:59:411451 MockRead("hello world"),
1452 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1453 MockRead(ASYNC, OK)};
1454
1455 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1456 0);
1457 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561458 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bnc62a44f022015-04-02 15:59:411459
1460 MockQuicData mock_quic_data;
1461 mock_quic_data.AddWrite(
1462 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561463 GetRequestHeaders("GET", "https", "/")));
bnc62a44f022015-04-02 15:59:411464 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1465 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1466 mock_quic_data.AddRead(
1467 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1468 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501469 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591470 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc62a44f022015-04-02 15:59:411471
rcha5399e02015-04-21 19:32:041472 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bnc62a44f022015-04-02 15:59:411473
1474 // The non-alternate protocol job needs to hang in order to guarantee that
1475 // the alternate-protocol job will "win".
1476 AddHangingNonAlternateProtocolSocketData();
1477
1478 CreateSessionWithNextProtos();
1479
1480 SendRequestAndExpectHttpResponse("hello world");
1481 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
1482}
1483
bncc958faa2015-07-31 18:14:521484TEST_P(QuicNetworkTransactionTest, ConfirmAlternateProtocol) {
bncae8db8402015-03-26 20:13:501485 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561486 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
bncae8db8402015-03-26 20:13:501487 MockRead("hello world"),
1488 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1489 MockRead(ASYNC, OK)};
1490
1491 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1492 0);
1493 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561494 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncae8db8402015-03-26 20:13:501495
1496 MockQuicData mock_quic_data;
1497 mock_quic_data.AddWrite(
1498 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561499 GetRequestHeaders("GET", "https", "/")));
bncae8db8402015-03-26 20:13:501500 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1501 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1502 mock_quic_data.AddRead(
1503 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1504 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501505 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1506 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncae8db8402015-03-26 20:13:501507
rcha5399e02015-04-21 19:32:041508 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bncae8db8402015-03-26 20:13:501509
1510 // The non-alternate protocol job needs to hang in order to guarantee that
1511 // the alternate-protocol job will "win".
1512 AddHangingNonAlternateProtocolSocketData();
1513
1514 CreateSessionWithNextProtos();
1515
1516 AlternativeService alternative_service(QUIC,
1517 HostPortPair::FromURL(request_.url));
bnc6be245c12015-05-15 11:24:071518 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
bncae8db8402015-03-26 20:13:501519 alternative_service);
bnc6be245c12015-05-15 11:24:071520 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1521 alternative_service));
bncae8db8402015-03-26 20:13:501522
1523 SendRequestAndExpectHttpResponse("hello world");
1524 SendRequestAndExpectQuicResponse("hello!");
1525
mmenkee24011922015-12-17 22:12:591526 mock_quic_data.Resume();
rchb27683c2015-07-29 23:53:501527
bnc6be245c12015-05-15 11:24:071528 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1529 alternative_service));
bncae8db8402015-03-26 20:13:501530}
1531
[email protected]287d9412014-07-08 23:01:001532TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolProbabilityForQuic) {
1533 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561534 MockRead("HTTP/1.1 200 OK\r\n"),
1535 MockRead(kQuicAlternateProtocol50pctHeader), MockRead("hello world"),
1536 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1537 MockRead(ASYNC, OK)};
[email protected]287d9412014-07-08 23:01:001538
rjshaded5ced072015-12-18 19:26:021539 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1540 0);
[email protected]287d9412014-07-08 23:01:001541 socket_factory_.AddSocketDataProvider(&http_data);
1542
1543 MockQuicData mock_quic_data;
1544 mock_quic_data.AddWrite(
1545 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561546 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021547 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1548 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]287d9412014-07-08 23:01:001549 mock_quic_data.AddRead(
1550 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1551 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501552 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591553 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]287d9412014-07-08 23:01:001554
rcha5399e02015-04-21 19:32:041555 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]287d9412014-07-08 23:01:001556
1557 // The non-alternate protocol job needs to hang in order to guarantee that
1558 // the alternate-protocol job will "win".
1559 AddHangingNonAlternateProtocolSocketData();
1560
bnc62891a52015-04-27 14:14:121561 params_.alternative_service_probability_threshold = .25;
[email protected]287d9412014-07-08 23:01:001562 CreateSessionWithNextProtos();
1563
1564 SendRequestAndExpectHttpResponse("hello world");
1565 SendRequestAndExpectQuicResponse("hello!");
1566}
1567
1568TEST_P(QuicNetworkTransactionTest, DontUseAlternateProtocolProbabilityForQuic) {
1569 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561570 MockRead("HTTP/1.1 200 OK\r\n"),
1571 MockRead(kQuicAlternateProtocol50pctHeader), MockRead("hello world"),
1572 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1573 MockRead(ASYNC, OK)};
[email protected]287d9412014-07-08 23:01:001574
rjshaded5ced072015-12-18 19:26:021575 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1576 0);
[email protected]287d9412014-07-08 23:01:001577 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561578 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001579 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561580 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001581
bnc62891a52015-04-27 14:14:121582 params_.alternative_service_probability_threshold = .75;
[email protected]287d9412014-07-08 23:01:001583 CreateSessionWithNextProtos();
1584
1585 SendRequestAndExpectHttpResponse("hello world");
1586 SendRequestAndExpectHttpResponse("hello world");
1587}
1588
1589TEST_P(QuicNetworkTransactionTest,
1590 DontUseAlternateProtocolWithBadProbabilityForQuic) {
1591 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021592 MockRead("HTTP/1.1 200 OK\r\n"),
1593 MockRead("Alternate-Protocol: 443:quic,p=2\r\n\r\n"),
1594 MockRead("hello world"),
1595 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1596 MockRead(ASYNC, OK)};
[email protected]287d9412014-07-08 23:01:001597
rjshaded5ced072015-12-18 19:26:021598 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1599 0);
[email protected]287d9412014-07-08 23:01:001600 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561601 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001602 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561603 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001604
bnc62891a52015-04-27 14:14:121605 params_.alternative_service_probability_threshold = .75;
[email protected]287d9412014-07-08 23:01:001606 CreateSessionWithNextProtos();
1607
1608 SendRequestAndExpectHttpResponse("hello world");
1609 SendRequestAndExpectHttpResponse("hello world");
1610}
1611
[email protected]1e960032013-12-20 19:00:201612TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) {
[email protected]6d1b4ed2013-07-10 03:57:541613 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561614 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1615 MockRead("hello world"),
1616 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1617 MockRead(ASYNC, OK)};
[email protected]6d1b4ed2013-07-10 03:57:541618
rjshaded5ced072015-12-18 19:26:021619 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1620 0);
[email protected]6d1b4ed2013-07-10 03:57:541621 socket_factory_.AddSocketDataProvider(&http_data);
1622
[email protected]1e960032013-12-20 19:00:201623 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031624 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051625 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561626 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021627 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1628 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031629 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051630 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031631 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501632 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591633 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]6d1b4ed2013-07-10 03:57:541634
rcha5399e02015-04-21 19:32:041635 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]6d1b4ed2013-07-10 03:57:541636
1637 // The non-alternate protocol job needs to hang in order to guarantee that
1638 // the alternate-protocol job will "win".
1639 AddHangingNonAlternateProtocolSocketData();
1640
[email protected]d7599122014-05-24 03:37:231641 CreateSessionWithNextProtos();
[email protected]6d1b4ed2013-07-10 03:57:541642
1643 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1644 SendRequestAndExpectHttpResponse("hello world");
1645}
1646
bnccb7ff3c2015-05-21 20:51:551647class QuicAltSvcCertificateVerificationTest
1648 : public QuicNetworkTransactionTest {
1649 public:
1650 void Run(bool valid) {
rch9ae5b3b2016-02-11 00:36:291651 HostPortPair origin(valid ? "mail.example.org" : "mail.example.com", 443);
bnccb7ff3c2015-05-21 20:51:551652 HostPortPair alternative("www.example.org", 443);
1653 std::string url("https://");
1654 url.append(origin.host());
1655 url.append(":443");
1656 request_.url = GURL(url);
1657
1658 maker_.set_hostname(origin.host());
1659 MockQuicData mock_quic_data;
1660 mock_quic_data.AddWrite(
1661 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1662 GetRequestHeaders("GET", "https", "/")));
1663 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1664 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1665 mock_quic_data.AddRead(
1666 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1667 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591668 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
bnccb7ff3c2015-05-21 20:51:551669 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1670
1671 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:291672 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bnccb7ff3c2015-05-21 20:51:551673 ASSERT_TRUE(cert.get());
1674 bool common_name_fallback_used;
1675 EXPECT_EQ(valid,
1676 cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
1677 EXPECT_TRUE(
1678 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
1679 ProofVerifyDetailsChromium verify_details;
1680 verify_details.cert_verify_result.verified_cert = cert;
1681 verify_details.cert_verify_result.is_issued_by_known_root = true;
1682 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1683 crypto_client_stream_factory_.set_handshake_mode(
1684 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1685
1686 // Connection to |origin| fails, so that success of |request| depends on
1687 // connection to |alternate| only.
1688 MockConnect refused_connect(ASYNC, ERR_CONNECTION_REFUSED);
1689 StaticSocketDataProvider refused_data;
1690 refused_data.set_connect_data(refused_connect);
1691 socket_factory_.AddSocketDataProvider(&refused_data);
1692
1693 CreateSessionWithNextProtos();
1694 AlternativeService alternative_service(QUIC, alternative);
bnc7dc7e1b42015-07-28 14:43:121695 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
bnccb7ff3c2015-05-21 20:51:551696 session_->http_server_properties()->SetAlternativeService(
bnc7dc7e1b42015-07-28 14:43:121697 origin, alternative_service, 1.0, expiration);
bnccb7ff3c2015-05-21 20:51:551698 scoped_ptr<HttpNetworkTransaction> trans(
1699 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1700 TestCompletionCallback callback;
1701 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1702 EXPECT_EQ(ERR_IO_PENDING, rv);
1703 rv = callback.WaitForResult();
1704 if (valid) {
1705 EXPECT_EQ(OK, rv);
1706 CheckWasQuicResponse(trans);
1707 CheckResponsePort(trans, 443);
1708 CheckResponseData(trans, "hello!");
1709 } else {
1710 EXPECT_EQ(ERR_CONNECTION_REFUSED, rv);
1711 }
1712 }
1713};
1714
1715INSTANTIATE_TEST_CASE_P(Version,
1716 QuicAltSvcCertificateVerificationTest,
1717 ::testing::ValuesIn(QuicSupportedVersions()));
1718
1719TEST_P(QuicAltSvcCertificateVerificationTest,
1720 RequestSucceedsWithValidCertificate) {
1721 Run(true);
1722}
1723
1724TEST_P(QuicAltSvcCertificateVerificationTest,
1725 RequestFailsWithInvalidCertificate) {
1726 Run(false);
1727}
1728
[email protected]1e960032013-12-20 19:00:201729TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) {
[email protected]dda75ab2013-06-22 22:43:301730 crypto_client_stream_factory_.set_handshake_mode(
1731 MockCryptoClientStream::COLD_START);
1732
1733 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561734 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
rch9ae5b3b2016-02-11 00:36:291735 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561736 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")};
[email protected]dda75ab2013-06-22 22:43:301737
1738 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561739 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1740 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1741 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]dda75ab2013-06-22 22:43:301742
mmenke651bae7f2015-12-18 21:26:451743 MockClientSocketFactory socket_factory;
[email protected]dda75ab2013-06-22 22:43:301744
mmenke651bae7f2015-12-18 21:26:451745 SequencedSocketData http_data(http_reads, arraysize(http_reads), http_writes,
1746 arraysize(http_writes));
[email protected]dda75ab2013-06-22 22:43:301747 socket_factory.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561748 socket_factory.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301749
1750 // The QUIC transaction will not be allowed to complete.
mmenke651bae7f2015-12-18 21:26:451751 MockWrite quic_writes[] = {MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 1)};
[email protected]dda75ab2013-06-22 22:43:301752 MockRead quic_reads[] = {
mmenke651bae7f2015-12-18 21:26:451753 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0),
[email protected]dda75ab2013-06-22 22:43:301754 };
mmenke651bae7f2015-12-18 21:26:451755 SequencedSocketData quic_data(quic_reads, arraysize(quic_reads), quic_writes,
1756 arraysize(quic_writes));
[email protected]dda75ab2013-06-22 22:43:301757 socket_factory.AddSocketDataProvider(&quic_data);
1758
1759 // The HTTP transaction will complete.
mmenke651bae7f2015-12-18 21:26:451760 SequencedSocketData http_data2(http_reads, arraysize(http_reads), http_writes,
1761 arraysize(http_writes));
[email protected]dda75ab2013-06-22 22:43:301762 socket_factory.AddSocketDataProvider(&http_data2);
rchf114d982015-10-21 01:34:561763 socket_factory.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301764
[email protected]d7599122014-05-24 03:37:231765 CreateSessionWithFactory(&socket_factory, true);
[email protected]dda75ab2013-06-22 22:43:301766
1767 // Run the first request.
[email protected]dda75ab2013-06-22 22:43:301768 SendRequestAndExpectHttpResponse("hello world");
rch37de576c2015-05-17 20:28:171769 ASSERT_TRUE(http_data.AllReadDataConsumed());
1770 ASSERT_TRUE(http_data.AllWriteDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301771
1772 // Now run the second request in which the QUIC socket hangs,
1773 // and verify the the transaction continues over HTTP.
[email protected]dda75ab2013-06-22 22:43:301774 SendRequestAndExpectHttpResponse("hello world");
mmenke651bae7f2015-12-18 21:26:451775 base::RunLoop().RunUntilIdle();
[email protected]dda75ab2013-06-22 22:43:301776
rch37de576c2015-05-17 20:28:171777 ASSERT_TRUE(http_data2.AllReadDataConsumed());
1778 ASSERT_TRUE(http_data2.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:451779 ASSERT_TRUE(quic_data.AllReadDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301780}
1781
[email protected]1e960032013-12-20 19:00:201782TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
[email protected]1e960032013-12-20 19:00:201783 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031784 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051785 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561786 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021787 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1788 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031789 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051790 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031791 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501792 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591793 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]8ba81212013-05-03 13:11:481794
rcha5399e02015-04-21 19:32:041795 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]8ba81212013-05-03 13:11:481796
[email protected]3a120a6b2013-06-25 01:08:271797 // The non-alternate protocol job needs to hang in order to guarantee that
1798 // the alternate-protocol job will "win".
[email protected]dda75ab2013-06-22 22:43:301799 AddHangingNonAlternateProtocolSocketData();
1800
[email protected]d7599122014-05-24 03:37:231801 CreateSessionWithNextProtos();
[email protected]aa9b14d2013-05-10 23:45:191802 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1803 SendRequestAndExpectQuicResponse("hello!");
[email protected]8ba81212013-05-03 13:11:481804}
1805
[email protected]1e960032013-12-20 19:00:201806TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
[email protected]1e960032013-12-20 19:00:201807 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031808 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051809 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561810 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021811 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1812 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031813 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051814 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031815 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501816 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591817 mock_quic_data.AddRead(ASYNC, 0); // EOF
rcha5399e02015-04-21 19:32:041818 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]3a120a6b2013-06-25 01:08:271819
1820 // In order for a new QUIC session to be established via alternate-protocol
1821 // without racing an HTTP connection, we need the host resolution to happen
1822 // synchronously.
1823 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291824 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561825 "");
rch9ae5b3b2016-02-11 00:36:291826 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]3a120a6b2013-06-25 01:08:271827 AddressList address;
rjshaded5ced072015-12-18 19:26:021828 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1829 nullptr, net_log_.bound());
[email protected]3a120a6b2013-06-25 01:08:271830
[email protected]d7599122014-05-24 03:37:231831 CreateSessionWithNextProtos();
[email protected]3a120a6b2013-06-25 01:08:271832 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1833 SendRequestAndExpectQuicResponse("hello!");
1834}
1835
[email protected]0fc924b2014-03-31 04:34:151836TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) {
rdsmith82957ad2015-09-16 19:42:031837 proxy_service_ = ProxyService::CreateFixedFromPacResult("PROXY myproxy:70");
[email protected]0fc924b2014-03-31 04:34:151838
1839 // Since we are using a proxy, the QUIC job will not succeed.
1840 MockWrite http_writes[] = {
rch9ae5b3b2016-02-11 00:36:291841 MockWrite(SYNCHRONOUS, 0, "GET http://mail.example.org/ HTTP/1.1\r\n"),
1842 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561843 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")};
[email protected]0fc924b2014-03-31 04:34:151844
1845 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561846 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1847 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1848 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]0fc924b2014-03-31 04:34:151849
1850 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
1851 http_writes, arraysize(http_writes));
1852 socket_factory_.AddSocketDataProvider(&http_data);
1853
1854 // In order for a new QUIC session to be established via alternate-protocol
1855 // without racing an HTTP connection, we need the host resolution to happen
1856 // synchronously.
1857 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291858 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561859 "");
rch9ae5b3b2016-02-11 00:36:291860 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]0fc924b2014-03-31 04:34:151861 AddressList address;
rjshaded5ced072015-12-18 19:26:021862 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1863 nullptr, net_log_.bound());
[email protected]0fc924b2014-03-31 04:34:151864
rch9ae5b3b2016-02-11 00:36:291865 request_.url = GURL("http://mail.example.org/");
[email protected]d7599122014-05-24 03:37:231866 CreateSessionWithNextProtos();
[email protected]0fc924b2014-03-31 04:34:151867 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1868 SendRequestAndExpectHttpResponse("hello world");
1869}
1870
[email protected]1e960032013-12-20 19:00:201871TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
[email protected]1e960032013-12-20 19:00:201872 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031873 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051874 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561875 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021876 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1877 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031878 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051879 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031880 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591881 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
rcha5399e02015-04-21 19:32:041882 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]11c05872013-08-20 02:04:121883
1884 // The non-alternate protocol job needs to hang in order to guarantee that
1885 // the alternate-protocol job will "win".
1886 AddHangingNonAlternateProtocolSocketData();
1887
1888 // In order for a new QUIC session to be established via alternate-protocol
1889 // without racing an HTTP connection, we need the host resolution to happen
1890 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1891 // connection to the the server, in this test we require confirmation
1892 // before encrypting so the HTTP job will still start.
1893 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291894 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561895 "");
rch9ae5b3b2016-02-11 00:36:291896 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]11c05872013-08-20 02:04:121897 AddressList address;
rjshaded5ced072015-12-18 19:26:021898 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1899 nullptr, net_log_.bound());
[email protected]11c05872013-08-20 02:04:121900
[email protected]d7599122014-05-24 03:37:231901 CreateSessionWithNextProtos();
[email protected]11c05872013-08-20 02:04:121902 session_->quic_stream_factory()->set_require_confirmation(true);
1903 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1904
1905 scoped_ptr<HttpNetworkTransaction> trans(
1906 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1907 TestCompletionCallback callback;
1908 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1909 EXPECT_EQ(ERR_IO_PENDING, rv);
1910
1911 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1912 QuicSession::HANDSHAKE_CONFIRMED);
1913 EXPECT_EQ(OK, callback.WaitForResult());
rchb27683c2015-07-29 23:53:501914
1915 CheckWasQuicResponse(trans);
1916 CheckResponseData(trans, "hello!");
[email protected]11c05872013-08-20 02:04:121917}
1918
zhongyica364fbb2015-12-12 03:39:121919TEST_P(QuicNetworkTransactionTest,
1920 LogGranularQuicErrorCodeOnQuicProtocolErrorLocal) {
1921 MockQuicData mock_quic_data;
1922 mock_quic_data.AddWrite(
1923 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1924 GetRequestHeaders("GET", "https", "/")));
1925 // Read a close connection packet with
1926 // QuicErrorCode: QUIC_CRYPTO_VERSION_NOT_SUPPORTED from the peer.
1927 mock_quic_data.AddRead(ConstructConnectionClosePacket(1));
1928 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1929
1930 // The non-alternate protocol job needs to hang in order to guarantee that
1931 // the alternate-protocol job will "win".
1932 AddHangingNonAlternateProtocolSocketData();
1933
1934 // In order for a new QUIC session to be established via alternate-protocol
1935 // without racing an HTTP connection, we need the host resolution to happen
1936 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1937 // connection to the the server, in this test we require confirmation
1938 // before encrypting so the HTTP job will still start.
1939 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291940 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:121941 "");
rch9ae5b3b2016-02-11 00:36:291942 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:121943 AddressList address;
1944 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1945 nullptr, net_log_.bound());
1946
1947 CreateSessionWithNextProtos();
1948 session_->quic_stream_factory()->set_require_confirmation(true);
1949 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1950
1951 scoped_ptr<HttpNetworkTransaction> trans(
1952 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1953 TestCompletionCallback callback;
1954 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1955 EXPECT_EQ(ERR_IO_PENDING, rv);
1956
1957 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1958 QuicSession::HANDSHAKE_CONFIRMED);
1959 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
1960
1961 NetErrorDetails details;
1962 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1963
1964 trans->PopulateNetErrorDetails(&details);
1965 // Verify the error code logged is what sent by the peer.
1966 EXPECT_EQ(QUIC_CRYPTO_VERSION_NOT_SUPPORTED, details.quic_connection_error);
1967}
1968
1969TEST_P(QuicNetworkTransactionTest,
1970 LogGranularQuicErrorCodeOnQuicProtocolErrorRemote) {
1971 MockQuicData mock_quic_data;
1972 mock_quic_data.AddWrite(
1973 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1974 GetRequestHeaders("GET", "https", "/")));
1975 // Peer sending an invalid stream frame with a invalid stream error causes
1976 // this end to raise error and close connection.
1977 mock_quic_data.AddRead(ConstructRstPacket(1, false, kClientDataStreamId1,
1978 QUIC_STREAM_LAST_ERROR));
1979 std::string quic_error_details = "Invalid rst stream error code.";
1980 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(
1981 2, QuicTime::Delta::Infinite(), 0, 1, QUIC_INVALID_RST_STREAM_DATA,
1982 quic_error_details));
1983 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1984
1985 // The non-alternate protocol job needs to hang in order to guarantee that
1986 // the alternate-protocol job will "win".
1987 AddHangingNonAlternateProtocolSocketData();
1988
1989 // In order for a new QUIC session to be established via alternate-protocol
1990 // without racing an HTTP connection, we need the host resolution to happen
1991 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1992 // connection to the the server, in this test we require confirmation
1993 // before encrypting so the HTTP job will still start.
1994 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291995 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:121996 "");
rch9ae5b3b2016-02-11 00:36:291997 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:121998 AddressList address;
1999 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2000 nullptr, net_log_.bound());
2001
2002 CreateSessionWithNextProtos();
2003 session_->quic_stream_factory()->set_require_confirmation(true);
2004 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2005
2006 scoped_ptr<HttpNetworkTransaction> trans(
2007 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2008 TestCompletionCallback callback;
2009 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2010 EXPECT_EQ(ERR_IO_PENDING, rv);
2011
2012 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
2013 QuicSession::HANDSHAKE_CONFIRMED);
2014 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
2015 NetErrorDetails details;
2016 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
2017
2018 trans->PopulateNetErrorDetails(&details);
2019 EXPECT_EQ(QUIC_INVALID_RST_STREAM_DATA, details.quic_connection_error);
2020}
2021
[email protected]1e960032013-12-20 19:00:202022TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
[email protected]3316d422013-05-03 21:45:302023 // Alternate-protocol job
2024 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1));
2025 MockRead quic_reads[] = {
rchb27683c2015-07-29 23:53:502026 MockRead(ASYNC, close->data(), close->length()),
2027 MockRead(ASYNC, ERR_IO_PENDING), // No more data to read
2028 MockRead(ASYNC, OK), // EOF
[email protected]3316d422013-05-03 21:45:302029 };
rjshaded5ced072015-12-18 19:26:022030 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2031 0);
[email protected]3316d422013-05-03 21:45:302032 socket_factory_.AddSocketDataProvider(&quic_data);
2033
2034 // Main job which will succeed even though the alternate job fails.
2035 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022036 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2037 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2038 MockRead(ASYNC, OK)};
[email protected]3316d422013-05-03 21:45:302039
rjshaded5ced072015-12-18 19:26:022040 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2041 0);
[email protected]3316d422013-05-03 21:45:302042 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562043 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]3316d422013-05-03 21:45:302044
[email protected]d7599122014-05-24 03:37:232045 CreateSessionWithNextProtos();
[email protected]aa9b14d2013-05-10 23:45:192046 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2047 SendRequestAndExpectHttpResponse("hello from http");
2048 ExpectBrokenAlternateProtocolMapping();
[email protected]3316d422013-05-03 21:45:302049}
2050
[email protected]1e960032013-12-20 19:00:202051TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
[email protected]d03a66d2013-05-06 12:55:592052 // Alternate-protocol job
2053 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022054 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]d03a66d2013-05-06 12:55:592055 };
rjshaded5ced072015-12-18 19:26:022056 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2057 0);
[email protected]d03a66d2013-05-06 12:55:592058 socket_factory_.AddSocketDataProvider(&quic_data);
2059
2060 // Main job which will succeed even though the alternate job fails.
2061 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022062 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2063 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2064 MockRead(ASYNC, OK)};
[email protected]d03a66d2013-05-06 12:55:592065
rjshaded5ced072015-12-18 19:26:022066 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2067 0);
[email protected]d03a66d2013-05-06 12:55:592068 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562069 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]d03a66d2013-05-06 12:55:592070
[email protected]d7599122014-05-24 03:37:232071 CreateSessionWithNextProtos();
[email protected]d03a66d2013-05-06 12:55:592072
[email protected]aa9b14d2013-05-10 23:45:192073 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2074 SendRequestAndExpectHttpResponse("hello from http");
2075 ExpectBrokenAlternateProtocolMapping();
[email protected]d03a66d2013-05-06 12:55:592076}
2077
[email protected]00c159f2014-05-21 22:38:162078TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) {
[email protected]eb71ab62014-05-23 07:57:532079 // Alternate-protocol job will fail when the session attempts to read.
[email protected]00c159f2014-05-21 22:38:162080 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022081 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162082 };
rjshaded5ced072015-12-18 19:26:022083 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2084 0);
[email protected]00c159f2014-05-21 22:38:162085 socket_factory_.AddSocketDataProvider(&quic_data);
2086
[email protected]eb71ab62014-05-23 07:57:532087 // Main job will also fail.
[email protected]00c159f2014-05-21 22:38:162088 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022089 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162090 };
2091
rjshaded5ced072015-12-18 19:26:022092 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2093 0);
[email protected]00c159f2014-05-21 22:38:162094 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED));
2095 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562096 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]00c159f2014-05-21 22:38:162097
[email protected]d7599122014-05-24 03:37:232098 CreateSessionWithNextProtos();
[email protected]00c159f2014-05-21 22:38:162099
2100 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2101 scoped_ptr<HttpNetworkTransaction> trans(
2102 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2103 TestCompletionCallback callback;
2104 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2105 EXPECT_EQ(ERR_IO_PENDING, rv);
2106 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult());
2107 ExpectQuicAlternateProtocolMapping();
2108}
2109
[email protected]1e960032013-12-20 19:00:202110TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
[email protected]77c6c162013-08-17 02:57:452111 // Alternate-protocol job
2112 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022113 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]77c6c162013-08-17 02:57:452114 };
rjshaded5ced072015-12-18 19:26:022115 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2116 0);
[email protected]77c6c162013-08-17 02:57:452117 socket_factory_.AddSocketDataProvider(&quic_data);
2118
2119 AddHangingNonAlternateProtocolSocketData();
2120
[email protected]c92c1b52014-05-31 04:16:062121 // Second Alternate-protocol job which will race with the TCP job.
2122 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:422123 nullptr, 0);
[email protected]c92c1b52014-05-31 04:16:062124 socket_factory_.AddSocketDataProvider(&quic_data2);
2125
[email protected]4d283b32013-10-17 12:57:272126 // Final job that will proceed when the QUIC job fails.
2127 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022128 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2129 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2130 MockRead(ASYNC, OK)};
[email protected]4d283b32013-10-17 12:57:272131
rjshaded5ced072015-12-18 19:26:022132 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2133 0);
[email protected]4d283b32013-10-17 12:57:272134 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562135 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d283b32013-10-17 12:57:272136
[email protected]d7599122014-05-24 03:37:232137 CreateSessionWithNextProtos();
[email protected]77c6c162013-08-17 02:57:452138
2139 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2140
[email protected]4d283b32013-10-17 12:57:272141 SendRequestAndExpectHttpResponse("hello from http");
[email protected]77c6c162013-08-17 02:57:452142
2143 ExpectBrokenAlternateProtocolMapping();
[email protected]4d283b32013-10-17 12:57:272144
rch37de576c2015-05-17 20:28:172145 EXPECT_TRUE(quic_data.AllReadDataConsumed());
2146 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
[email protected]77c6c162013-08-17 02:57:452147}
2148
[email protected]93b31772014-06-19 08:03:352149TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) {
[email protected]65768442014-06-06 23:37:032150 // Alternate-protocol job
2151 MockRead quic_reads[] = {
mmenkee24011922015-12-17 22:12:592152 MockRead(SYNCHRONOUS, ERR_IO_PENDING),
[email protected]65768442014-06-06 23:37:032153 };
rjshaded5ced072015-12-18 19:26:022154 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2155 0);
[email protected]65768442014-06-06 23:37:032156 socket_factory_.AddSocketDataProvider(&quic_data);
2157
2158 // Main job that will proceed when the QUIC job fails.
2159 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022160 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2161 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2162 MockRead(ASYNC, OK)};
[email protected]65768442014-06-06 23:37:032163
rjshaded5ced072015-12-18 19:26:022164 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2165 0);
[email protected]65768442014-06-06 23:37:032166 socket_factory_.AddSocketDataProvider(&http_data);
2167
2168 CreateSessionWithNextProtos();
2169
2170 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2171
2172 SendRequestAndExpectHttpResponse("hello from http");
2173}
2174
[email protected]eb71ab62014-05-23 07:57:532175TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
[email protected]4d590c9c2014-05-02 05:14:332176 // Alternate-protocol job will fail before creating a QUIC session.
rtennetibe635732014-10-02 22:51:422177 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0);
rjshaded5ced072015-12-18 19:26:022178 quic_data.set_connect_data(
2179 MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED));
[email protected]4d590c9c2014-05-02 05:14:332180 socket_factory_.AddSocketDataProvider(&quic_data);
2181
2182 // Main job which will succeed even though the alternate 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]4d590c9c2014-05-02 05:14:332187
rjshaded5ced072015-12-18 19:26:022188 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2189 0);
[email protected]4d590c9c2014-05-02 05:14:332190 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562191 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d590c9c2014-05-02 05:14:332192
[email protected]d7599122014-05-24 03:37:232193 CreateSessionWithNextProtos();
[email protected]4d590c9c2014-05-02 05:14:332194 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2195 SendRequestAndExpectHttpResponse("hello from http");
[email protected]eb71ab62014-05-23 07:57:532196
2197 ExpectBrokenAlternateProtocolMapping();
[email protected]4d590c9c2014-05-02 05:14:332198}
2199
[email protected]4fee9672014-01-08 14:47:152200TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
[email protected]4fee9672014-01-08 14:47:152201 MockQuicData mock_quic_data;
rcha5399e02015-04-21 19:32:042202 mock_quic_data.AddSynchronousRead(ConstructConnectionClosePacket(1));
[email protected]92bf17c2014-03-03 21:14:032203 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:052204 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:562205 GetRequestHeaders("GET", "https", "/")));
[email protected]92bf17c2014-03-03 21:14:032206 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rcha5399e02015-04-21 19:32:042207 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4fee9672014-01-08 14:47:152208
2209 // When the QUIC connection fails, we will try the request again over HTTP.
2210 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:562211 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
2212 MockRead("hello world"),
2213 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2214 MockRead(ASYNC, OK)};
[email protected]4fee9672014-01-08 14:47:152215
rjshaded5ced072015-12-18 19:26:022216 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2217 0);
[email protected]4fee9672014-01-08 14:47:152218 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562219 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4fee9672014-01-08 14:47:152220
2221 // In order for a new QUIC session to be established via alternate-protocol
2222 // without racing an HTTP connection, we need the host resolution to happen
2223 // synchronously.
2224 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:292225 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:562226 "");
rch9ae5b3b2016-02-11 00:36:292227 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]4fee9672014-01-08 14:47:152228 AddressList address;
rjshaded5ced072015-12-18 19:26:022229 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2230 nullptr, net_log_.bound());
[email protected]4fee9672014-01-08 14:47:152231
[email protected]d7599122014-05-24 03:37:232232 CreateSessionWithNextProtos();
[email protected]4fee9672014-01-08 14:47:152233 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2234 SendRequestAndExpectHttpResponse("hello world");
2235}
2236
bnc508835902015-05-12 20:10:292237TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) {
bncb07c05532015-05-14 19:07:202238 maker_.set_hostname("www.example.org");
tbansalc8a94ea2015-11-02 23:58:512239 EXPECT_FALSE(rtt_observer_.rtt_notification_received());
bnc508835902015-05-12 20:10:292240 MockQuicData mock_quic_data;
2241 mock_quic_data.AddWrite(
2242 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
2243 GetRequestHeaders("GET", "https", "/")));
2244 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
2245 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
2246 mock_quic_data.AddRead(
2247 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
2248 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:502249 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
bnc508835902015-05-12 20:10:292250 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2251
bncb07c05532015-05-14 19:07:202252 request_.url = GURL("https://www.example.org:443");
bnc508835902015-05-12 20:10:292253 AddHangingNonAlternateProtocolSocketData();
2254 CreateSessionWithNextProtos();
2255 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
2256 SendRequestAndExpectQuicResponse("hello!");
tbansalc8a94ea2015-11-02 23:58:512257 EXPECT_TRUE(rtt_observer_.rtt_notification_received());
bnc508835902015-05-12 20:10:292258}
2259
rtenneti56977812016-01-15 19:26:562260TEST_P(QuicNetworkTransactionTest, QuicUpload) {
2261 params_.origin_to_force_quic_on =
rch9ae5b3b2016-02-11 00:36:292262 HostPortPair::FromString("mail.example.org:443");
rtenneti56977812016-01-15 19:26:562263
2264 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2265 MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_FAILED, 1)};
2266 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2267 arraysize(writes));
2268 socket_factory_.AddSocketDataProvider(&socket_data);
2269
2270 // The non-alternate protocol job needs to hang in order to guarantee that
2271 // the alternate-protocol job will "win".
2272 AddHangingNonAlternateProtocolSocketData();
2273
2274 CreateSession();
2275 request_.method = "POST";
2276 ChunkedUploadDataStream upload_data(0);
2277 upload_data.AppendData("1", 1, true);
2278
2279 request_.upload_data_stream = &upload_data;
2280
2281 scoped_ptr<HttpNetworkTransaction> trans(
2282 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2283 TestCompletionCallback callback;
2284 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2285 EXPECT_EQ(ERR_IO_PENDING, rv);
2286 EXPECT_NE(OK, callback.WaitForResult());
2287}
2288
[email protected]61a527782013-02-21 03:58:002289} // namespace test
2290} // namespace net