blob: d6f5c3c2c462462ddd31826e7520579e2ef13b48 [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
rchf114d982015-10-21 01:34:5675const char kDefaultServerHostName[] = "mail.example.com";
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(
208 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
209 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 :
436 {kDefaultServerHostName, "www.example.com", "news.example.com",
437 "bar.example.com", "foo.example.com", "www.example.org",
438 "invalid.example.org", "docs.example.org"}) {
439 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) {
bnc55ff9da2015-08-19 18:42:35445 params_.use_alternative_services = true;
bnc3bb2c232014-11-07 20:26:39446 params_.next_protos = NextProtosWithSpdyAndQuic(true, 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 =
rchf114d982015-10-21 01:34:56606 HostPortPair::FromString("mail.example.com: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_ =
673 ProxyService::CreateFixedFromPacResult("QUIC mail.example.com: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
rchf114d982015-10-21 01:34:56693 request_.url = GURL("http://mail.example.com/");
[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) {
704 const std::string origin_host = "news.example.com";
705 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(
726 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
727 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 =
rchf114d982015-10-21 01:34:56748 HostPortPair::FromString("mail.example.com: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"),
zhongyi32569c62016-01-08 02:54:30894 MockRead("Alt-Svc: quic=\"foo.example.com: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.
907 // Open a session to foo.example.com:443 using the first entry of the
908 // 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 =
915 "quic=\"mail.example.com:444\", quic=\"foo.example.com:443\", "
916 "quic=\"bar.example.com: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"),
956 MockRead("Alt-Svc: quic=\"foo.example.com:443\", quic=\":446\"\r\n\r\n"),
957 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.
975 // Open a QUIC session to foo.example.com:443.
976 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
977 1, kClientDataStreamId1, true, true,
978 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
979
980 std::string alt_svc_list =
981 "quic=\"bar.example.com:444\", quic=\"frog.example.com:445\", "
982 "quic=\"mail.example.com:446\"";
983 // 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.
992 // Existing QUIC session to foo.example.com is not viable from the updated
993 // alt_svc. Unable to pool the existing QUIC session.
994 // Open a new QUIC session to bar.example.com:443.
995 mock_quic_data2.AddWrite(ConstructRequestHeadersPacket(
996 1, kClientDataStreamId1, true, true,
997 GetRequestHeaders("GET", "https", "/"), &maker));
998 alt_svc_list =
999 "quic=\"foo.example.com:443\", quic=\"mail.example.com:446\", "
1000 "quic=\"bar.example.com:444\"";
1001 // 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.
1012 // Connection pooling, using the first existing session to foo.example.com
1013 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) {
1046 // Default cert is valid for the following origins:
1047 // mail.example.com, mail.example.org, and www.example.org.
1048
1049 // HTTP data for request to mail.example.com.
1050 MockRead http_reads[] = {
1051 MockRead("HTTP/1.1 200 OK\r\n"),
1052 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
1053 MockRead("hello world from mail.example.com"),
1054 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1055 MockRead(ASYNC, OK)};
1056
1057 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1058 0);
1059 socket_factory_.AddSocketDataProvider(&http_data);
1060 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1061
1062 // HTTP data for request to mail.example.org.
1063 MockRead http_reads2[] = {
1064 MockRead("HTTP/1.1 200 OK\r\n"),
1065 MockRead("Alt-Svc: quic=\":444\", quic=\"mail.example.com:443\"\r\n\r\n"),
1066 MockRead("hello world from mail.example.org"),
1067 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1068 MockRead(ASYNC, OK)};
1069
1070 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1071 nullptr, 0);
1072 socket_factory_.AddSocketDataProvider(&http_data2);
1073 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1074
1075 QuicStreamOffset request_header_offset = 0;
1076 QuicStreamOffset response_header_offset = 0;
1077
1078 QuicTestPacketMaker maker(GetParam(), 0, clock_, kDefaultServerHostName);
1079 maker.set_hostname("mail.example.org");
1080 MockQuicData mock_quic_data;
1081
1082 // First QUIC request data.
1083 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1084 1, kClientDataStreamId1, true, true,
1085 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1086
1087 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1088 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1089 &response_header_offset));
1090 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1091 true, 0, "hello from mail QUIC!"));
1092 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1093
1094 // Second QUIC request data.
1095 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1096 3, kClientDataStreamId2, false, true,
1097 GetRequestHeaders("GET", "https", "/", maker), &request_header_offset,
1098 &maker));
1099 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1100 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1101 &response_header_offset));
1102 mock_quic_data.AddRead(ConstructDataPacket(4, kClientDataStreamId2, false,
1103 true, 0, "hello from mail QUIC!"));
1104 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
1105 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1106 mock_quic_data.AddRead(ASYNC, 0); // EOF
1107
1108 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1109 AddHangingNonAlternateProtocolSocketData();
1110
1111 CreateSessionWithNextProtos();
1112
1113 // Send two HTTP requests, responses set up alt-svc lists for the origins.
1114 SendRequestAndExpectHttpResponse("hello world from mail.example.com");
1115 request_.url = GURL("https://mail.example.org/");
1116 SendRequestAndExpectHttpResponse("hello world from mail.example.org");
1117
1118 // Open a QUIC session to mail.example.com:443 when making request
1119 // to mail.example.com.
1120 request_.url = GURL("https://mail.example.com/");
1121 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443);
1122
1123 // Uses the existing QUIC session when making request to mail.example.org.
1124 request_.url = GURL("https://mail.example.org/");
1125 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443);
1126}
1127
1128// Multiple origins have listed the same alternative services. When there's a
1129// existing QUIC session opened by a request to other origin,
1130// if the cert is NOT valid, should ignore this QUIC session.
1131TEST_P(QuicNetworkTransactionTest,
1132 DoNotUseSharedExistingAlternativeServiceForQuicWithInvalidCert) {
1133 // Default cert is only valid for the following origins:
1134 // mail.example.com, mail.example.org, and www.example.org.
1135 // NOT valid for docs.example.org.
1136
1137 // HTTP data for request to mail.example.com.
1138 MockRead http_reads[] = {
1139 MockRead("HTTP/1.1 200 OK\r\n"),
1140 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
1141 MockRead("hello world from mail.example.com"),
1142 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1143 MockRead(ASYNC, OK)};
1144
1145 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1146 0);
1147 socket_factory_.AddSocketDataProvider(&http_data);
1148 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1149
1150 // HTTP data for request to docs.example.org.
1151 MockRead http_reads2[] = {
1152 MockRead("HTTP/1.1 200 OK\r\n"),
1153 MockRead("Alt-Svc: quic=\":444\", quic=\"mail.example.com:443\"\r\n\r\n"),
1154 MockRead("hello world from docs.example.org"),
1155 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1156 MockRead(ASYNC, OK)};
1157
1158 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1159 nullptr, 0);
1160 socket_factory_.AddSocketDataProvider(&http_data2);
1161 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1162
1163 QuicTestPacketMaker maker(GetParam(), 0, clock_, kDefaultServerHostName);
1164 maker.set_hostname("docs.example.org");
1165 MockQuicData mock_quic_data;
1166 MockQuicData mock_quic_data2;
1167
1168 // Adding a valid cert for *.example.org but not mail.example.com.
1169 ProofVerifyDetailsChromium verify_details;
1170 scoped_refptr<X509Certificate> cert(
1171 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
1172 verify_details.cert_verify_result.verified_cert = cert;
1173 verify_details.cert_verify_result.is_issued_by_known_root = true;
1174 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1175
1176 // First QUIC request data.
1177 mock_quic_data.AddWrite(
1178 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1179 GetRequestHeaders("GET", "https", "/")));
1180 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1181 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1182 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1183 true, 0, "hello from mail QUIC!"));
1184 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1185 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1186 mock_quic_data.AddRead(ASYNC, 0); // EOF
1187
1188 // First QUIC request data.
1189 mock_quic_data2.AddWrite(ConstructRequestHeadersPacket(
1190 1, kClientDataStreamId1, true, true,
1191 GetRequestHeaders("GET", "https", "/", maker), &maker));
1192 mock_quic_data2.AddRead(
1193 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
1194 GetResponseHeaders("200 OK"), &maker));
1195 mock_quic_data2.AddRead(ConstructDataPacket(
1196 2, kClientDataStreamId1, false, true, 0, "hello from docs QUIC!"));
1197 mock_quic_data2.AddWrite(ConstructAckPacket(2, 1, &maker));
1198 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1199 mock_quic_data2.AddRead(ASYNC, 0); // EOF
1200
1201 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1202 AddHangingNonAlternateProtocolSocketData();
1203
1204 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
1205 AddHangingNonAlternateProtocolSocketData();
1206
1207 CreateSessionWithNextProtos();
1208
1209 // Send HTTP requests, responses set up the alt-svc lists for the origins.
1210 SendRequestAndExpectHttpResponse("hello world from mail.example.com");
1211 request_.url = GURL("https://docs.example.org/");
1212 SendRequestAndExpectHttpResponse("hello world from docs.example.org");
1213
1214 // Open a QUIC session to mail.example.com:443 when making request
1215 // to mail.example.com.
1216 request_.url = GURL("https://mail.example.com/");
1217 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443);
1218
1219 // Open another new QUIC session to docs.example.org:444.
1220 request_.url = GURL("https://docs.example.org/");
1221 SendRequestAndExpectQuicResponseOnPort("hello from docs QUIC!", 444);
bncc958faa2015-07-31 18:14:521222}
1223
1224TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) {
bncc958faa2015-07-31 18:14:521225 MockRead http_reads[] = {
1226 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561227 MockRead(kQuicAlternativeServiceDifferentPortHeader),
bncc958faa2015-07-31 18:14:521228 MockRead("hello world"),
1229 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1230 MockRead(ASYNC, OK)};
1231
1232 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1233 0);
1234 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561235 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521236
1237 MockQuicData mock_quic_data;
1238 mock_quic_data.AddWrite(
1239 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561240 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521241 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1242 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1243 mock_quic_data.AddRead(
1244 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1245 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1246 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591247 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521248
1249 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1250
1251 AddHangingNonAlternateProtocolSocketData();
1252 CreateSessionWithNextProtos();
1253
1254 SendRequestAndExpectHttpResponse("hello world");
1255 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
1256}
1257
1258TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) {
bncc958faa2015-07-31 18:14:521259 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561260 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1261 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521262 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1263 MockRead(ASYNC, OK)};
1264
1265 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1266 0);
1267 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561268 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521269
1270 MockQuicData mock_quic_data;
1271 mock_quic_data.AddWrite(
1272 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561273 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521274 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1275 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1276 mock_quic_data.AddRead(
1277 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1278 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1279 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1280 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521281
1282 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1283
1284 AddHangingNonAlternateProtocolSocketData();
1285 CreateSessionWithNextProtos();
1286
1287 AlternativeService alternative_service(QUIC,
1288 HostPortPair::FromURL(request_.url));
1289 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
1290 alternative_service);
1291 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1292 alternative_service));
1293
1294 SendRequestAndExpectHttpResponse("hello world");
1295 SendRequestAndExpectQuicResponse("hello!");
1296
mmenkee24011922015-12-17 22:12:591297 mock_quic_data.Resume();
bncc958faa2015-07-31 18:14:521298
1299 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1300 alternative_service));
1301}
1302
1303TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceProbabilityForQuic) {
bncc958faa2015-07-31 18:14:521304 MockRead http_reads[] = {
1305 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561306 MockRead(kQuicAlternativeService50pctHeader), MockRead("hello world"),
bncc958faa2015-07-31 18:14:521307 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1308 MockRead(ASYNC, OK)};
1309
1310 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1311 0);
1312 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561313 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521314
1315 MockQuicData mock_quic_data;
1316 mock_quic_data.AddWrite(
1317 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561318 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521319 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1320 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1321 mock_quic_data.AddRead(
1322 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1323 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1324 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591325 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521326
1327 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1328
1329 AddHangingNonAlternateProtocolSocketData();
1330 params_.alternative_service_probability_threshold = 0.25;
1331 CreateSessionWithNextProtos();
1332
1333 SendRequestAndExpectHttpResponse("hello world");
1334 SendRequestAndExpectQuicResponse("hello!");
1335}
1336
1337TEST_P(QuicNetworkTransactionTest,
1338 DontUseAlternativeServiceProbabilityForQuic) {
bncc958faa2015-07-31 18:14:521339 MockRead http_reads[] = {
1340 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561341 MockRead(kQuicAlternativeService50pctHeader), MockRead("hello world"),
bncc958faa2015-07-31 18:14:521342 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1343 MockRead(ASYNC, OK)};
1344
1345 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1346 0);
1347 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561348 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521349 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561350 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521351
1352 params_.alternative_service_probability_threshold = 0.75;
1353 CreateSessionWithNextProtos();
1354
1355 SendRequestAndExpectHttpResponse("hello world");
1356 SendRequestAndExpectHttpResponse("hello world");
1357}
1358
bncc958faa2015-07-31 18:14:521359TEST_P(QuicNetworkTransactionTest,
1360 DontUseAlternativeServiceWithBadProbabilityForQuic) {
bncc958faa2015-07-31 18:14:521361 MockRead http_reads[] = {
1362 MockRead("HTTP/1.1 200 OK\r\n"),
1363 MockRead("Alt-Svc: quic=\":443\";p=2\r\n\r\n"), MockRead("hello world"),
1364 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1365 MockRead(ASYNC, OK)};
1366
1367 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1368 0);
1369 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561370 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521371 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561372 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521373
1374 params_.alternative_service_probability_threshold = 0.75;
1375 CreateSessionWithNextProtos();
1376
1377 SendRequestAndExpectHttpResponse("hello world");
1378 SendRequestAndExpectHttpResponse("hello world");
1379}
1380
1381TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) {
bncc958faa2015-07-31 18:14:521382 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561383 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1384 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521385 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1386 MockRead(ASYNC, OK)};
1387
1388 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1389 0);
1390 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561391 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521392
1393 MockQuicData mock_quic_data;
1394 mock_quic_data.AddWrite(
1395 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561396 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521397 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1398 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1399 mock_quic_data.AddRead(
1400 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1401 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1402 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
1403
1404 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1405
1406 AddHangingNonAlternateProtocolSocketData();
1407 CreateSessionWithNextProtos();
1408
1409 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1410 SendRequestAndExpectHttpResponse("hello world");
1411}
1412
[email protected]1e960032013-12-20 19:00:201413TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
[email protected]aa9b14d2013-05-10 23:45:191414 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561415 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1416 MockRead("hello world"),
1417 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1418 MockRead(ASYNC, OK)};
[email protected]61a527782013-02-21 03:58:001419
rjshaded5ced072015-12-18 19:26:021420 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1421 0);
[email protected]aa9b14d2013-05-10 23:45:191422 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561423 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]61a527782013-02-21 03:58:001424
[email protected]1e960032013-12-20 19:00:201425 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031426 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051427 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561428 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021429 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1430 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031431 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051432 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031433 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501434 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591435 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]61a527782013-02-21 03:58:001436
rcha5399e02015-04-21 19:32:041437 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]61a527782013-02-21 03:58:001438
[email protected]aa9b14d2013-05-10 23:45:191439 // The non-alternate protocol job needs to hang in order to guarantee that
1440 // the alternate-protocol job will "win".
1441 AddHangingNonAlternateProtocolSocketData();
[email protected]61a527782013-02-21 03:58:001442
[email protected]d7599122014-05-24 03:37:231443 CreateSessionWithNextProtos();
[email protected]61a527782013-02-21 03:58:001444
[email protected]aa9b14d2013-05-10 23:45:191445 SendRequestAndExpectHttpResponse("hello world");
1446 SendRequestAndExpectQuicResponse("hello!");
[email protected]61a527782013-02-21 03:58:001447}
1448
bnc62a44f022015-04-02 15:59:411449TEST_P(QuicNetworkTransactionTest, AlternateProtocolDifferentPort) {
1450 MockRead http_reads[] = {
1451 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561452 MockRead(kQuicAlternateProtocolDifferentPortHeader),
bnc62a44f022015-04-02 15:59:411453 MockRead("hello world"),
1454 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1455 MockRead(ASYNC, OK)};
1456
1457 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1458 0);
1459 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561460 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bnc62a44f022015-04-02 15:59:411461
1462 MockQuicData mock_quic_data;
1463 mock_quic_data.AddWrite(
1464 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561465 GetRequestHeaders("GET", "https", "/")));
bnc62a44f022015-04-02 15:59:411466 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1467 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1468 mock_quic_data.AddRead(
1469 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1470 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501471 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591472 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc62a44f022015-04-02 15:59:411473
rcha5399e02015-04-21 19:32:041474 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bnc62a44f022015-04-02 15:59:411475
1476 // The non-alternate protocol job needs to hang in order to guarantee that
1477 // the alternate-protocol job will "win".
1478 AddHangingNonAlternateProtocolSocketData();
1479
1480 CreateSessionWithNextProtos();
1481
1482 SendRequestAndExpectHttpResponse("hello world");
1483 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
1484}
1485
bncc958faa2015-07-31 18:14:521486TEST_P(QuicNetworkTransactionTest, ConfirmAlternateProtocol) {
bncae8db8402015-03-26 20:13:501487 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561488 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
bncae8db8402015-03-26 20:13:501489 MockRead("hello world"),
1490 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1491 MockRead(ASYNC, OK)};
1492
1493 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1494 0);
1495 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561496 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncae8db8402015-03-26 20:13:501497
1498 MockQuicData mock_quic_data;
1499 mock_quic_data.AddWrite(
1500 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561501 GetRequestHeaders("GET", "https", "/")));
bncae8db8402015-03-26 20:13:501502 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1503 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1504 mock_quic_data.AddRead(
1505 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1506 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501507 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1508 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncae8db8402015-03-26 20:13:501509
rcha5399e02015-04-21 19:32:041510 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bncae8db8402015-03-26 20:13:501511
1512 // The non-alternate protocol job needs to hang in order to guarantee that
1513 // the alternate-protocol job will "win".
1514 AddHangingNonAlternateProtocolSocketData();
1515
1516 CreateSessionWithNextProtos();
1517
1518 AlternativeService alternative_service(QUIC,
1519 HostPortPair::FromURL(request_.url));
bnc6be245c12015-05-15 11:24:071520 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
bncae8db8402015-03-26 20:13:501521 alternative_service);
bnc6be245c12015-05-15 11:24:071522 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1523 alternative_service));
bncae8db8402015-03-26 20:13:501524
1525 SendRequestAndExpectHttpResponse("hello world");
1526 SendRequestAndExpectQuicResponse("hello!");
1527
mmenkee24011922015-12-17 22:12:591528 mock_quic_data.Resume();
rchb27683c2015-07-29 23:53:501529
bnc6be245c12015-05-15 11:24:071530 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1531 alternative_service));
bncae8db8402015-03-26 20:13:501532}
1533
[email protected]287d9412014-07-08 23:01:001534TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolProbabilityForQuic) {
1535 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561536 MockRead("HTTP/1.1 200 OK\r\n"),
1537 MockRead(kQuicAlternateProtocol50pctHeader), MockRead("hello world"),
1538 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1539 MockRead(ASYNC, OK)};
[email protected]287d9412014-07-08 23:01:001540
rjshaded5ced072015-12-18 19:26:021541 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1542 0);
[email protected]287d9412014-07-08 23:01:001543 socket_factory_.AddSocketDataProvider(&http_data);
1544
1545 MockQuicData mock_quic_data;
1546 mock_quic_data.AddWrite(
1547 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561548 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021549 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1550 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]287d9412014-07-08 23:01:001551 mock_quic_data.AddRead(
1552 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1553 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501554 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591555 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]287d9412014-07-08 23:01:001556
rcha5399e02015-04-21 19:32:041557 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]287d9412014-07-08 23:01:001558
1559 // The non-alternate protocol job needs to hang in order to guarantee that
1560 // the alternate-protocol job will "win".
1561 AddHangingNonAlternateProtocolSocketData();
1562
bnc62891a52015-04-27 14:14:121563 params_.alternative_service_probability_threshold = .25;
[email protected]287d9412014-07-08 23:01:001564 CreateSessionWithNextProtos();
1565
1566 SendRequestAndExpectHttpResponse("hello world");
1567 SendRequestAndExpectQuicResponse("hello!");
1568}
1569
1570TEST_P(QuicNetworkTransactionTest, DontUseAlternateProtocolProbabilityForQuic) {
1571 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561572 MockRead("HTTP/1.1 200 OK\r\n"),
1573 MockRead(kQuicAlternateProtocol50pctHeader), MockRead("hello world"),
1574 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1575 MockRead(ASYNC, OK)};
[email protected]287d9412014-07-08 23:01:001576
rjshaded5ced072015-12-18 19:26:021577 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1578 0);
[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 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561582 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001583
bnc62891a52015-04-27 14:14:121584 params_.alternative_service_probability_threshold = .75;
[email protected]287d9412014-07-08 23:01:001585 CreateSessionWithNextProtos();
1586
1587 SendRequestAndExpectHttpResponse("hello world");
1588 SendRequestAndExpectHttpResponse("hello world");
1589}
1590
1591TEST_P(QuicNetworkTransactionTest,
1592 DontUseAlternateProtocolWithBadProbabilityForQuic) {
1593 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021594 MockRead("HTTP/1.1 200 OK\r\n"),
1595 MockRead("Alternate-Protocol: 443:quic,p=2\r\n\r\n"),
1596 MockRead("hello world"),
1597 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1598 MockRead(ASYNC, OK)};
[email protected]287d9412014-07-08 23:01:001599
rjshaded5ced072015-12-18 19:26:021600 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1601 0);
[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 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561605 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001606
bnc62891a52015-04-27 14:14:121607 params_.alternative_service_probability_threshold = .75;
[email protected]287d9412014-07-08 23:01:001608 CreateSessionWithNextProtos();
1609
1610 SendRequestAndExpectHttpResponse("hello world");
1611 SendRequestAndExpectHttpResponse("hello world");
1612}
1613
[email protected]1e960032013-12-20 19:00:201614TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) {
[email protected]6d1b4ed2013-07-10 03:57:541615 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561616 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1617 MockRead("hello world"),
1618 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1619 MockRead(ASYNC, OK)};
[email protected]6d1b4ed2013-07-10 03:57:541620
rjshaded5ced072015-12-18 19:26:021621 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1622 0);
[email protected]6d1b4ed2013-07-10 03:57:541623 socket_factory_.AddSocketDataProvider(&http_data);
1624
[email protected]1e960032013-12-20 19:00:201625 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031626 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051627 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561628 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021629 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1630 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031631 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051632 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031633 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501634 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591635 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]6d1b4ed2013-07-10 03:57:541636
rcha5399e02015-04-21 19:32:041637 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]6d1b4ed2013-07-10 03:57:541638
1639 // The non-alternate protocol job needs to hang in order to guarantee that
1640 // the alternate-protocol job will "win".
1641 AddHangingNonAlternateProtocolSocketData();
1642
[email protected]d7599122014-05-24 03:37:231643 CreateSessionWithNextProtos();
[email protected]6d1b4ed2013-07-10 03:57:541644
1645 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1646 SendRequestAndExpectHttpResponse("hello world");
1647}
1648
bnccb7ff3c2015-05-21 20:51:551649class QuicAltSvcCertificateVerificationTest
1650 : public QuicNetworkTransactionTest {
1651 public:
1652 void Run(bool valid) {
1653 HostPortPair origin(valid ? "mail.example.org" : "invalid.example.org",
1654 443);
1655 HostPortPair alternative("www.example.org", 443);
1656 std::string url("https://");
1657 url.append(origin.host());
1658 url.append(":443");
1659 request_.url = GURL(url);
1660
1661 maker_.set_hostname(origin.host());
1662 MockQuicData mock_quic_data;
1663 mock_quic_data.AddWrite(
1664 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1665 GetRequestHeaders("GET", "https", "/")));
1666 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1667 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1668 mock_quic_data.AddRead(
1669 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1670 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591671 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
bnccb7ff3c2015-05-21 20:51:551672 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1673
1674 scoped_refptr<X509Certificate> cert(
1675 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
1676 ASSERT_TRUE(cert.get());
1677 bool common_name_fallback_used;
1678 EXPECT_EQ(valid,
1679 cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
1680 EXPECT_TRUE(
1681 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
1682 ProofVerifyDetailsChromium verify_details;
1683 verify_details.cert_verify_result.verified_cert = cert;
1684 verify_details.cert_verify_result.is_issued_by_known_root = true;
1685 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1686 crypto_client_stream_factory_.set_handshake_mode(
1687 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1688
1689 // Connection to |origin| fails, so that success of |request| depends on
1690 // connection to |alternate| only.
1691 MockConnect refused_connect(ASYNC, ERR_CONNECTION_REFUSED);
1692 StaticSocketDataProvider refused_data;
1693 refused_data.set_connect_data(refused_connect);
1694 socket_factory_.AddSocketDataProvider(&refused_data);
1695
1696 CreateSessionWithNextProtos();
1697 AlternativeService alternative_service(QUIC, alternative);
bnc7dc7e1b42015-07-28 14:43:121698 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
bnccb7ff3c2015-05-21 20:51:551699 session_->http_server_properties()->SetAlternativeService(
bnc7dc7e1b42015-07-28 14:43:121700 origin, alternative_service, 1.0, expiration);
bnccb7ff3c2015-05-21 20:51:551701 scoped_ptr<HttpNetworkTransaction> trans(
1702 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1703 TestCompletionCallback callback;
1704 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1705 EXPECT_EQ(ERR_IO_PENDING, rv);
1706 rv = callback.WaitForResult();
1707 if (valid) {
1708 EXPECT_EQ(OK, rv);
1709 CheckWasQuicResponse(trans);
1710 CheckResponsePort(trans, 443);
1711 CheckResponseData(trans, "hello!");
1712 } else {
1713 EXPECT_EQ(ERR_CONNECTION_REFUSED, rv);
1714 }
1715 }
1716};
1717
1718INSTANTIATE_TEST_CASE_P(Version,
1719 QuicAltSvcCertificateVerificationTest,
1720 ::testing::ValuesIn(QuicSupportedVersions()));
1721
1722TEST_P(QuicAltSvcCertificateVerificationTest,
1723 RequestSucceedsWithValidCertificate) {
1724 Run(true);
1725}
1726
1727TEST_P(QuicAltSvcCertificateVerificationTest,
1728 RequestFailsWithInvalidCertificate) {
1729 Run(false);
1730}
1731
[email protected]1e960032013-12-20 19:00:201732TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) {
[email protected]dda75ab2013-06-22 22:43:301733 crypto_client_stream_factory_.set_handshake_mode(
1734 MockCryptoClientStream::COLD_START);
1735
1736 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561737 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
1738 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.com\r\n"),
1739 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")};
[email protected]dda75ab2013-06-22 22:43:301740
1741 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561742 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1743 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1744 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]dda75ab2013-06-22 22:43:301745
mmenke651bae7f2015-12-18 21:26:451746 MockClientSocketFactory socket_factory;
[email protected]dda75ab2013-06-22 22:43:301747
mmenke651bae7f2015-12-18 21:26:451748 SequencedSocketData http_data(http_reads, arraysize(http_reads), http_writes,
1749 arraysize(http_writes));
[email protected]dda75ab2013-06-22 22:43:301750 socket_factory.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561751 socket_factory.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301752
1753 // The QUIC transaction will not be allowed to complete.
mmenke651bae7f2015-12-18 21:26:451754 MockWrite quic_writes[] = {MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 1)};
[email protected]dda75ab2013-06-22 22:43:301755 MockRead quic_reads[] = {
mmenke651bae7f2015-12-18 21:26:451756 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0),
[email protected]dda75ab2013-06-22 22:43:301757 };
mmenke651bae7f2015-12-18 21:26:451758 SequencedSocketData quic_data(quic_reads, arraysize(quic_reads), quic_writes,
1759 arraysize(quic_writes));
[email protected]dda75ab2013-06-22 22:43:301760 socket_factory.AddSocketDataProvider(&quic_data);
1761
1762 // The HTTP transaction will complete.
mmenke651bae7f2015-12-18 21:26:451763 SequencedSocketData http_data2(http_reads, arraysize(http_reads), http_writes,
1764 arraysize(http_writes));
[email protected]dda75ab2013-06-22 22:43:301765 socket_factory.AddSocketDataProvider(&http_data2);
rchf114d982015-10-21 01:34:561766 socket_factory.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301767
[email protected]d7599122014-05-24 03:37:231768 CreateSessionWithFactory(&socket_factory, true);
[email protected]dda75ab2013-06-22 22:43:301769
1770 // Run the first request.
[email protected]dda75ab2013-06-22 22:43:301771 SendRequestAndExpectHttpResponse("hello world");
rch37de576c2015-05-17 20:28:171772 ASSERT_TRUE(http_data.AllReadDataConsumed());
1773 ASSERT_TRUE(http_data.AllWriteDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301774
1775 // Now run the second request in which the QUIC socket hangs,
1776 // and verify the the transaction continues over HTTP.
[email protected]dda75ab2013-06-22 22:43:301777 SendRequestAndExpectHttpResponse("hello world");
mmenke651bae7f2015-12-18 21:26:451778 base::RunLoop().RunUntilIdle();
[email protected]dda75ab2013-06-22 22:43:301779
rch37de576c2015-05-17 20:28:171780 ASSERT_TRUE(http_data2.AllReadDataConsumed());
1781 ASSERT_TRUE(http_data2.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:451782 ASSERT_TRUE(quic_data.AllReadDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301783}
1784
[email protected]1e960032013-12-20 19:00:201785TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
[email protected]1e960032013-12-20 19:00:201786 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031787 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051788 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561789 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021790 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1791 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031792 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051793 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031794 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501795 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591796 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]8ba81212013-05-03 13:11:481797
rcha5399e02015-04-21 19:32:041798 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]8ba81212013-05-03 13:11:481799
[email protected]3a120a6b2013-06-25 01:08:271800 // The non-alternate protocol job needs to hang in order to guarantee that
1801 // the alternate-protocol job will "win".
[email protected]dda75ab2013-06-22 22:43:301802 AddHangingNonAlternateProtocolSocketData();
1803
[email protected]d7599122014-05-24 03:37:231804 CreateSessionWithNextProtos();
[email protected]aa9b14d2013-05-10 23:45:191805 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1806 SendRequestAndExpectQuicResponse("hello!");
[email protected]8ba81212013-05-03 13:11:481807}
1808
[email protected]1e960032013-12-20 19:00:201809TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
[email protected]1e960032013-12-20 19:00:201810 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031811 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051812 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561813 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021814 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1815 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031816 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051817 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031818 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501819 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591820 mock_quic_data.AddRead(ASYNC, 0); // EOF
rcha5399e02015-04-21 19:32:041821 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]3a120a6b2013-06-25 01:08:271822
1823 // In order for a new QUIC session to be established via alternate-protocol
1824 // without racing an HTTP connection, we need the host resolution to happen
1825 // synchronously.
1826 host_resolver_.set_synchronous_mode(true);
rchf114d982015-10-21 01:34:561827 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1828 "");
1829 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
[email protected]3a120a6b2013-06-25 01:08:271830 AddressList address;
rjshaded5ced072015-12-18 19:26:021831 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1832 nullptr, net_log_.bound());
[email protected]3a120a6b2013-06-25 01:08:271833
[email protected]d7599122014-05-24 03:37:231834 CreateSessionWithNextProtos();
[email protected]3a120a6b2013-06-25 01:08:271835 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1836 SendRequestAndExpectQuicResponse("hello!");
1837}
1838
[email protected]0fc924b2014-03-31 04:34:151839TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) {
rdsmith82957ad2015-09-16 19:42:031840 proxy_service_ = ProxyService::CreateFixedFromPacResult("PROXY myproxy:70");
[email protected]0fc924b2014-03-31 04:34:151841
1842 // Since we are using a proxy, the QUIC job will not succeed.
1843 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561844 MockWrite(SYNCHRONOUS, 0, "GET http://mail.example.com/ HTTP/1.1\r\n"),
1845 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.com\r\n"),
1846 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")};
[email protected]0fc924b2014-03-31 04:34:151847
1848 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561849 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1850 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1851 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]0fc924b2014-03-31 04:34:151852
1853 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
1854 http_writes, arraysize(http_writes));
1855 socket_factory_.AddSocketDataProvider(&http_data);
1856
1857 // In order for a new QUIC session to be established via alternate-protocol
1858 // without racing an HTTP connection, we need the host resolution to happen
1859 // synchronously.
1860 host_resolver_.set_synchronous_mode(true);
rchf114d982015-10-21 01:34:561861 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1862 "");
1863 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
[email protected]0fc924b2014-03-31 04:34:151864 AddressList address;
rjshaded5ced072015-12-18 19:26:021865 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1866 nullptr, net_log_.bound());
[email protected]0fc924b2014-03-31 04:34:151867
rchf114d982015-10-21 01:34:561868 request_.url = GURL("http://mail.example.com/");
[email protected]d7599122014-05-24 03:37:231869 CreateSessionWithNextProtos();
[email protected]0fc924b2014-03-31 04:34:151870 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1871 SendRequestAndExpectHttpResponse("hello world");
1872}
1873
[email protected]1e960032013-12-20 19:00:201874TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
[email protected]1e960032013-12-20 19:00:201875 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031876 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051877 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561878 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021879 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1880 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031881 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051882 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031883 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591884 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
rcha5399e02015-04-21 19:32:041885 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]11c05872013-08-20 02:04:121886
1887 // The non-alternate protocol job needs to hang in order to guarantee that
1888 // the alternate-protocol job will "win".
1889 AddHangingNonAlternateProtocolSocketData();
1890
1891 // In order for a new QUIC session to be established via alternate-protocol
1892 // without racing an HTTP connection, we need the host resolution to happen
1893 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1894 // connection to the the server, in this test we require confirmation
1895 // before encrypting so the HTTP job will still start.
1896 host_resolver_.set_synchronous_mode(true);
rchf114d982015-10-21 01:34:561897 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1898 "");
1899 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
[email protected]11c05872013-08-20 02:04:121900 AddressList address;
rjshaded5ced072015-12-18 19:26:021901 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1902 nullptr, net_log_.bound());
[email protected]11c05872013-08-20 02:04:121903
[email protected]d7599122014-05-24 03:37:231904 CreateSessionWithNextProtos();
[email protected]11c05872013-08-20 02:04:121905 session_->quic_stream_factory()->set_require_confirmation(true);
1906 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1907
1908 scoped_ptr<HttpNetworkTransaction> trans(
1909 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1910 TestCompletionCallback callback;
1911 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1912 EXPECT_EQ(ERR_IO_PENDING, rv);
1913
1914 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1915 QuicSession::HANDSHAKE_CONFIRMED);
1916 EXPECT_EQ(OK, callback.WaitForResult());
rchb27683c2015-07-29 23:53:501917
1918 CheckWasQuicResponse(trans);
1919 CheckResponseData(trans, "hello!");
[email protected]11c05872013-08-20 02:04:121920}
1921
zhongyica364fbb2015-12-12 03:39:121922TEST_P(QuicNetworkTransactionTest,
1923 LogGranularQuicErrorCodeOnQuicProtocolErrorLocal) {
1924 MockQuicData mock_quic_data;
1925 mock_quic_data.AddWrite(
1926 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1927 GetRequestHeaders("GET", "https", "/")));
1928 // Read a close connection packet with
1929 // QuicErrorCode: QUIC_CRYPTO_VERSION_NOT_SUPPORTED from the peer.
1930 mock_quic_data.AddRead(ConstructConnectionClosePacket(1));
1931 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1932
1933 // The non-alternate protocol job needs to hang in order to guarantee that
1934 // the alternate-protocol job will "win".
1935 AddHangingNonAlternateProtocolSocketData();
1936
1937 // In order for a new QUIC session to be established via alternate-protocol
1938 // without racing an HTTP connection, we need the host resolution to happen
1939 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1940 // connection to the the server, in this test we require confirmation
1941 // before encrypting so the HTTP job will still start.
1942 host_resolver_.set_synchronous_mode(true);
1943 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1944 "");
1945 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
1946 AddressList address;
1947 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1948 nullptr, net_log_.bound());
1949
1950 CreateSessionWithNextProtos();
1951 session_->quic_stream_factory()->set_require_confirmation(true);
1952 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1953
1954 scoped_ptr<HttpNetworkTransaction> trans(
1955 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1956 TestCompletionCallback callback;
1957 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1958 EXPECT_EQ(ERR_IO_PENDING, rv);
1959
1960 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1961 QuicSession::HANDSHAKE_CONFIRMED);
1962 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
1963
1964 NetErrorDetails details;
1965 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1966
1967 trans->PopulateNetErrorDetails(&details);
1968 // Verify the error code logged is what sent by the peer.
1969 EXPECT_EQ(QUIC_CRYPTO_VERSION_NOT_SUPPORTED, details.quic_connection_error);
1970}
1971
1972TEST_P(QuicNetworkTransactionTest,
1973 LogGranularQuicErrorCodeOnQuicProtocolErrorRemote) {
1974 MockQuicData mock_quic_data;
1975 mock_quic_data.AddWrite(
1976 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1977 GetRequestHeaders("GET", "https", "/")));
1978 // Peer sending an invalid stream frame with a invalid stream error causes
1979 // this end to raise error and close connection.
1980 mock_quic_data.AddRead(ConstructRstPacket(1, false, kClientDataStreamId1,
1981 QUIC_STREAM_LAST_ERROR));
1982 std::string quic_error_details = "Invalid rst stream error code.";
1983 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(
1984 2, QuicTime::Delta::Infinite(), 0, 1, QUIC_INVALID_RST_STREAM_DATA,
1985 quic_error_details));
1986 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1987
1988 // The non-alternate protocol job needs to hang in order to guarantee that
1989 // the alternate-protocol job will "win".
1990 AddHangingNonAlternateProtocolSocketData();
1991
1992 // In order for a new QUIC session to be established via alternate-protocol
1993 // without racing an HTTP connection, we need the host resolution to happen
1994 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1995 // connection to the the server, in this test we require confirmation
1996 // before encrypting so the HTTP job will still start.
1997 host_resolver_.set_synchronous_mode(true);
1998 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1999 "");
2000 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
2001 AddressList address;
2002 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2003 nullptr, net_log_.bound());
2004
2005 CreateSessionWithNextProtos();
2006 session_->quic_stream_factory()->set_require_confirmation(true);
2007 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2008
2009 scoped_ptr<HttpNetworkTransaction> trans(
2010 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2011 TestCompletionCallback callback;
2012 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2013 EXPECT_EQ(ERR_IO_PENDING, rv);
2014
2015 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
2016 QuicSession::HANDSHAKE_CONFIRMED);
2017 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
2018 NetErrorDetails details;
2019 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
2020
2021 trans->PopulateNetErrorDetails(&details);
2022 EXPECT_EQ(QUIC_INVALID_RST_STREAM_DATA, details.quic_connection_error);
2023}
2024
[email protected]1e960032013-12-20 19:00:202025TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
[email protected]3316d422013-05-03 21:45:302026 // Alternate-protocol job
2027 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1));
2028 MockRead quic_reads[] = {
rchb27683c2015-07-29 23:53:502029 MockRead(ASYNC, close->data(), close->length()),
2030 MockRead(ASYNC, ERR_IO_PENDING), // No more data to read
2031 MockRead(ASYNC, OK), // EOF
[email protected]3316d422013-05-03 21:45:302032 };
rjshaded5ced072015-12-18 19:26:022033 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2034 0);
[email protected]3316d422013-05-03 21:45:302035 socket_factory_.AddSocketDataProvider(&quic_data);
2036
2037 // Main job which will succeed even though the alternate job fails.
2038 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022039 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2040 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2041 MockRead(ASYNC, OK)};
[email protected]3316d422013-05-03 21:45:302042
rjshaded5ced072015-12-18 19:26:022043 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2044 0);
[email protected]3316d422013-05-03 21:45:302045 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562046 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]3316d422013-05-03 21:45:302047
[email protected]d7599122014-05-24 03:37:232048 CreateSessionWithNextProtos();
[email protected]aa9b14d2013-05-10 23:45:192049 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2050 SendRequestAndExpectHttpResponse("hello from http");
2051 ExpectBrokenAlternateProtocolMapping();
[email protected]3316d422013-05-03 21:45:302052}
2053
[email protected]1e960032013-12-20 19:00:202054TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
[email protected]d03a66d2013-05-06 12:55:592055 // Alternate-protocol job
2056 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022057 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]d03a66d2013-05-06 12:55:592058 };
rjshaded5ced072015-12-18 19:26:022059 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2060 0);
[email protected]d03a66d2013-05-06 12:55:592061 socket_factory_.AddSocketDataProvider(&quic_data);
2062
2063 // Main job which will succeed even though the alternate job fails.
2064 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022065 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2066 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2067 MockRead(ASYNC, OK)};
[email protected]d03a66d2013-05-06 12:55:592068
rjshaded5ced072015-12-18 19:26:022069 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2070 0);
[email protected]d03a66d2013-05-06 12:55:592071 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562072 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]d03a66d2013-05-06 12:55:592073
[email protected]d7599122014-05-24 03:37:232074 CreateSessionWithNextProtos();
[email protected]d03a66d2013-05-06 12:55:592075
[email protected]aa9b14d2013-05-10 23:45:192076 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2077 SendRequestAndExpectHttpResponse("hello from http");
2078 ExpectBrokenAlternateProtocolMapping();
[email protected]d03a66d2013-05-06 12:55:592079}
2080
[email protected]00c159f2014-05-21 22:38:162081TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) {
[email protected]eb71ab62014-05-23 07:57:532082 // Alternate-protocol job will fail when the session attempts to read.
[email protected]00c159f2014-05-21 22:38:162083 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022084 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162085 };
rjshaded5ced072015-12-18 19:26:022086 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2087 0);
[email protected]00c159f2014-05-21 22:38:162088 socket_factory_.AddSocketDataProvider(&quic_data);
2089
[email protected]eb71ab62014-05-23 07:57:532090 // Main job will also fail.
[email protected]00c159f2014-05-21 22:38:162091 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022092 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162093 };
2094
rjshaded5ced072015-12-18 19:26:022095 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2096 0);
[email protected]00c159f2014-05-21 22:38:162097 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED));
2098 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562099 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]00c159f2014-05-21 22:38:162100
[email protected]d7599122014-05-24 03:37:232101 CreateSessionWithNextProtos();
[email protected]00c159f2014-05-21 22:38:162102
2103 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2104 scoped_ptr<HttpNetworkTransaction> trans(
2105 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2106 TestCompletionCallback callback;
2107 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2108 EXPECT_EQ(ERR_IO_PENDING, rv);
2109 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult());
2110 ExpectQuicAlternateProtocolMapping();
2111}
2112
[email protected]1e960032013-12-20 19:00:202113TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
[email protected]77c6c162013-08-17 02:57:452114 // Alternate-protocol job
2115 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022116 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]77c6c162013-08-17 02:57:452117 };
rjshaded5ced072015-12-18 19:26:022118 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2119 0);
[email protected]77c6c162013-08-17 02:57:452120 socket_factory_.AddSocketDataProvider(&quic_data);
2121
2122 AddHangingNonAlternateProtocolSocketData();
2123
[email protected]c92c1b52014-05-31 04:16:062124 // Second Alternate-protocol job which will race with the TCP job.
2125 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:422126 nullptr, 0);
[email protected]c92c1b52014-05-31 04:16:062127 socket_factory_.AddSocketDataProvider(&quic_data2);
2128
[email protected]4d283b32013-10-17 12:57:272129 // Final job that will proceed when the QUIC job fails.
2130 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022131 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2132 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2133 MockRead(ASYNC, OK)};
[email protected]4d283b32013-10-17 12:57:272134
rjshaded5ced072015-12-18 19:26:022135 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2136 0);
[email protected]4d283b32013-10-17 12:57:272137 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562138 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d283b32013-10-17 12:57:272139
[email protected]d7599122014-05-24 03:37:232140 CreateSessionWithNextProtos();
[email protected]77c6c162013-08-17 02:57:452141
2142 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2143
[email protected]4d283b32013-10-17 12:57:272144 SendRequestAndExpectHttpResponse("hello from http");
[email protected]77c6c162013-08-17 02:57:452145
2146 ExpectBrokenAlternateProtocolMapping();
[email protected]4d283b32013-10-17 12:57:272147
rch37de576c2015-05-17 20:28:172148 EXPECT_TRUE(quic_data.AllReadDataConsumed());
2149 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
[email protected]77c6c162013-08-17 02:57:452150}
2151
[email protected]93b31772014-06-19 08:03:352152TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) {
[email protected]65768442014-06-06 23:37:032153 // Alternate-protocol job
2154 MockRead quic_reads[] = {
mmenkee24011922015-12-17 22:12:592155 MockRead(SYNCHRONOUS, ERR_IO_PENDING),
[email protected]65768442014-06-06 23:37:032156 };
rjshaded5ced072015-12-18 19:26:022157 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2158 0);
[email protected]65768442014-06-06 23:37:032159 socket_factory_.AddSocketDataProvider(&quic_data);
2160
2161 // Main job that will proceed when the QUIC job fails.
2162 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022163 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2164 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2165 MockRead(ASYNC, OK)};
[email protected]65768442014-06-06 23:37:032166
rjshaded5ced072015-12-18 19:26:022167 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2168 0);
[email protected]65768442014-06-06 23:37:032169 socket_factory_.AddSocketDataProvider(&http_data);
2170
2171 CreateSessionWithNextProtos();
2172
2173 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2174
2175 SendRequestAndExpectHttpResponse("hello from http");
2176}
2177
[email protected]eb71ab62014-05-23 07:57:532178TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
[email protected]4d590c9c2014-05-02 05:14:332179 // Alternate-protocol job will fail before creating a QUIC session.
rtennetibe635732014-10-02 22:51:422180 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0);
rjshaded5ced072015-12-18 19:26:022181 quic_data.set_connect_data(
2182 MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED));
[email protected]4d590c9c2014-05-02 05:14:332183 socket_factory_.AddSocketDataProvider(&quic_data);
2184
2185 // Main job which will succeed even though the alternate job fails.
2186 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022187 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2188 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2189 MockRead(ASYNC, OK)};
[email protected]4d590c9c2014-05-02 05:14:332190
rjshaded5ced072015-12-18 19:26:022191 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2192 0);
[email protected]4d590c9c2014-05-02 05:14:332193 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562194 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d590c9c2014-05-02 05:14:332195
[email protected]d7599122014-05-24 03:37:232196 CreateSessionWithNextProtos();
[email protected]4d590c9c2014-05-02 05:14:332197 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2198 SendRequestAndExpectHttpResponse("hello from http");
[email protected]eb71ab62014-05-23 07:57:532199
2200 ExpectBrokenAlternateProtocolMapping();
[email protected]4d590c9c2014-05-02 05:14:332201}
2202
[email protected]4fee9672014-01-08 14:47:152203TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
[email protected]4fee9672014-01-08 14:47:152204 MockQuicData mock_quic_data;
rcha5399e02015-04-21 19:32:042205 mock_quic_data.AddSynchronousRead(ConstructConnectionClosePacket(1));
[email protected]92bf17c2014-03-03 21:14:032206 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:052207 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:562208 GetRequestHeaders("GET", "https", "/")));
[email protected]92bf17c2014-03-03 21:14:032209 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rcha5399e02015-04-21 19:32:042210 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4fee9672014-01-08 14:47:152211
2212 // When the QUIC connection fails, we will try the request again over HTTP.
2213 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:562214 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
2215 MockRead("hello world"),
2216 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2217 MockRead(ASYNC, OK)};
[email protected]4fee9672014-01-08 14:47:152218
rjshaded5ced072015-12-18 19:26:022219 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2220 0);
[email protected]4fee9672014-01-08 14:47:152221 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562222 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4fee9672014-01-08 14:47:152223
2224 // In order for a new QUIC session to be established via alternate-protocol
2225 // without racing an HTTP connection, we need the host resolution to happen
2226 // synchronously.
2227 host_resolver_.set_synchronous_mode(true);
rchf114d982015-10-21 01:34:562228 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
2229 "");
2230 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
[email protected]4fee9672014-01-08 14:47:152231 AddressList address;
rjshaded5ced072015-12-18 19:26:022232 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2233 nullptr, net_log_.bound());
[email protected]4fee9672014-01-08 14:47:152234
[email protected]d7599122014-05-24 03:37:232235 CreateSessionWithNextProtos();
[email protected]4fee9672014-01-08 14:47:152236 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2237 SendRequestAndExpectHttpResponse("hello world");
2238}
2239
bnc508835902015-05-12 20:10:292240TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) {
bncb07c05532015-05-14 19:07:202241 maker_.set_hostname("www.example.org");
tbansalc8a94ea2015-11-02 23:58:512242 EXPECT_FALSE(rtt_observer_.rtt_notification_received());
bnc508835902015-05-12 20:10:292243 MockQuicData mock_quic_data;
2244 mock_quic_data.AddWrite(
2245 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
2246 GetRequestHeaders("GET", "https", "/")));
2247 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
2248 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
2249 mock_quic_data.AddRead(
2250 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
2251 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:502252 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
bnc508835902015-05-12 20:10:292253 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2254
bncb07c05532015-05-14 19:07:202255 request_.url = GURL("https://www.example.org:443");
bnc508835902015-05-12 20:10:292256 AddHangingNonAlternateProtocolSocketData();
2257 CreateSessionWithNextProtos();
2258 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
2259 SendRequestAndExpectQuicResponse("hello!");
tbansalc8a94ea2015-11-02 23:58:512260 EXPECT_TRUE(rtt_observer_.rtt_notification_received());
bnc508835902015-05-12 20:10:292261}
2262
rtenneti56977812016-01-15 19:26:562263TEST_P(QuicNetworkTransactionTest, QuicUpload) {
2264 params_.origin_to_force_quic_on =
2265 HostPortPair::FromString("mail.example.com:443");
2266
2267 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2268 MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_FAILED, 1)};
2269 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2270 arraysize(writes));
2271 socket_factory_.AddSocketDataProvider(&socket_data);
2272
2273 // The non-alternate protocol job needs to hang in order to guarantee that
2274 // the alternate-protocol job will "win".
2275 AddHangingNonAlternateProtocolSocketData();
2276
2277 CreateSession();
2278 request_.method = "POST";
2279 ChunkedUploadDataStream upload_data(0);
2280 upload_data.AppendData("1", 1, true);
2281
2282 request_.upload_data_stream = &upload_data;
2283
2284 scoped_ptr<HttpNetworkTransaction> trans(
2285 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2286 TestCompletionCallback callback;
2287 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2288 EXPECT_EQ(ERR_IO_PENDING, rv);
2289 EXPECT_NE(OK, callback.WaitForResult());
2290}
2291
[email protected]61a527782013-02-21 03:58:002292} // namespace test
2293} // namespace net