blob: e4ccdc71331261647a033c3a506ac0a71dcfd38a [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"
tbansalfdf5665b2015-09-21 22:46:4013#include "net/base/network_quality_estimator.h"
14#include "net/base/socket_performance_watcher.h"
[email protected]61a527782013-02-21 03:58:0015#include "net/base/test_completion_callback.h"
bnc508835902015-05-12 20:10:2916#include "net/base/test_data_directory.h"
[email protected]6e7845ae2013-03-29 21:48:1117#include "net/cert/mock_cert_verifier.h"
rtenneti052774e2015-11-24 21:00:1218#include "net/cert/multi_log_ct_verifier.h"
[email protected]f2cb3cf2013-03-21 01:40:5319#include "net/dns/mock_host_resolver.h"
[email protected]61a527782013-02-21 03:58:0020#include "net/http/http_auth_handler_factory.h"
21#include "net/http/http_network_session.h"
22#include "net/http/http_network_transaction.h"
23#include "net/http/http_server_properties_impl.h"
24#include "net/http/http_stream.h"
25#include "net/http/http_stream_factory.h"
[email protected]c41737d2014-05-14 07:47:1926#include "net/http/http_transaction_test_util.h"
[email protected]b1c988b2013-06-13 06:48:1127#include "net/http/transport_security_state.h"
vishal.b62985ca92015-04-17 08:45:5128#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4629#include "net/log/test_net_log_entry.h"
30#include "net/log/test_net_log_util.h"
[email protected]61a527782013-02-21 03:58:0031#include "net/proxy/proxy_config_service_fixed.h"
32#include "net/proxy/proxy_resolver.h"
33#include "net/proxy/proxy_service.h"
bnc508835902015-05-12 20:10:2934#include "net/quic/crypto/proof_verifier_chromium.h"
[email protected]61a527782013-02-21 03:58:0035#include "net/quic/crypto/quic_decrypter.h"
36#include "net/quic/crypto/quic_encrypter.h"
37#include "net/quic/quic_framer.h"
[email protected]24e5bc52013-09-18 15:36:5838#include "net/quic/quic_http_utils.h"
[email protected]ed3fc15d2013-03-08 18:37:4439#include "net/quic/test_tools/crypto_test_utils.h"
[email protected]61a527782013-02-21 03:58:0040#include "net/quic/test_tools/mock_clock.h"
[email protected]e8ff26842013-03-22 21:02:0541#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
[email protected]61a527782013-02-21 03:58:0042#include "net/quic/test_tools/mock_random.h"
[email protected]1e960032013-12-20 19:00:2043#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]61a527782013-02-21 03:58:0044#include "net/quic/test_tools/quic_test_utils.h"
45#include "net/socket/client_socket_factory.h"
46#include "net/socket/mock_client_socket_pool_manager.h"
47#include "net/socket/socket_test_util.h"
48#include "net/socket/ssl_client_socket.h"
49#include "net/spdy/spdy_frame_builder.h"
50#include "net/spdy/spdy_framer.h"
[email protected]536fd0b2013-03-14 17:41:5751#include "net/ssl/ssl_config_service_defaults.h"
bnc508835902015-05-12 20:10:2952#include "net/test/cert_test_util.h"
[email protected]61a527782013-02-21 03:58:0053#include "testing/gtest/include/gtest/gtest.h"
54#include "testing/platform_test.h"
55
bnc508835902015-05-12 20:10:2956namespace net {
57namespace test {
[email protected]61a527782013-02-21 03:58:0058
59namespace {
60
rchf114d982015-10-21 01:34:5661static const char kQuicAlternateProtocolHeader[] =
[email protected]6d1b4ed2013-07-10 03:57:5462 "Alternate-Protocol: 443:quic\r\n\r\n";
rchf114d982015-10-21 01:34:5663static const char kQuicAlternateProtocol50pctHeader[] =
64 "Alternate-Protocol: 443:quic,p=.5\r\n\r\n";
65static const char kQuicAlternateProtocolDifferentPortHeader[] =
66 "Alternate-Protocol: 137:quic\r\n\r\n";
67static const char kQuicAlternativeServiceHeader[] =
bncc958faa2015-07-31 18:14:5268 "Alt-Svc: quic=\":443\"\r\n\r\n";
rchf114d982015-10-21 01:34:5669static const char kQuicAlternativeService50pctHeader[] =
70 "Alt-Svc: quic=\":443\";p=\".5\"\r\n\r\n";
71static const char kQuicAlternativeServiceDifferentPortHeader[] =
72 "Alt-Svc: quic=\":137\"\r\n\r\n";
[email protected]1e960032013-12-20 19:00:2073
rchf114d982015-10-21 01:34:5674const char kDefaultServerHostName[] = "mail.example.com";
bncb07c05532015-05-14 19:07:2075
[email protected]61a527782013-02-21 03:58:0076} // namespace
77
[email protected]1e960032013-12-20 19:00:2078// Helper class to encapsulate MockReads and MockWrites for QUIC.
79// Simplify ownership issues and the interaction with the MockSocketFactory.
80class MockQuicData {
81 public:
rtennetia004d332015-08-28 06:44:5782 MockQuicData() : packet_number_(0) {}
rcha5399e02015-04-21 19:32:0483
rjshaded5ced072015-12-18 19:26:0284 ~MockQuicData() { STLDeleteElements(&packets_); }
[email protected]1e960032013-12-20 19:00:2085
rcha5399e02015-04-21 19:32:0486 void AddSynchronousRead(scoped_ptr<QuicEncryptedPacket> packet) {
[email protected]1e960032013-12-20 19:00:2087 reads_.push_back(MockRead(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:5788 packet_number_++));
[email protected]1e960032013-12-20 19:00:2089 packets_.push_back(packet.release());
90 }
91
rcha5399e02015-04-21 19:32:0492 void AddRead(scoped_ptr<QuicEncryptedPacket> packet) {
93 reads_.push_back(
rtennetia004d332015-08-28 06:44:5794 MockRead(ASYNC, packet->data(), packet->length(), packet_number_++));
rcha5399e02015-04-21 19:32:0495 packets_.push_back(packet.release());
96 }
97
[email protected]1e960032013-12-20 19:00:2098 void AddRead(IoMode mode, int rv) {
rtennetia004d332015-08-28 06:44:5799 reads_.push_back(MockRead(mode, rv, packet_number_++));
[email protected]1e960032013-12-20 19:00:20100 }
101
102 void AddWrite(scoped_ptr<QuicEncryptedPacket> packet) {
103 writes_.push_back(MockWrite(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:57104 packet_number_++));
[email protected]1e960032013-12-20 19:00:20105 packets_.push_back(packet.release());
106 }
107
rcha5399e02015-04-21 19:32:04108 void AddSocketDataToFactory(MockClientSocketFactory* factory) {
rjshaded5ced072015-12-18 19:26:02109 MockRead* reads = reads_.empty() ? nullptr : &reads_[0];
110 MockWrite* writes = writes_.empty() ? nullptr : &writes_[0];
rcha5399e02015-04-21 19:32:04111 socket_data_.reset(
112 new SequencedSocketData(reads, reads_.size(), writes, writes_.size()));
[email protected]1e960032013-12-20 19:00:20113 factory->AddSocketDataProvider(socket_data_.get());
114 }
115
mmenkee24011922015-12-17 22:12:59116 void Resume() { socket_data_->Resume(); }
rchb27683c2015-07-29 23:53:50117
[email protected]1e960032013-12-20 19:00:20118 private:
119 std::vector<QuicEncryptedPacket*> packets_;
120 std::vector<MockWrite> writes_;
121 std::vector<MockRead> reads_;
rtennetia004d332015-08-28 06:44:57122 size_t packet_number_;
rchb27683c2015-07-29 23:53:50123 scoped_ptr<SequencedSocketData> socket_data_;
[email protected]1e960032013-12-20 19:00:20124};
125
tbansal7cec3812015-02-05 21:25:12126class ProxyHeadersHandler {
127 public:
128 ProxyHeadersHandler() : was_called_(false) {}
129
130 bool was_called() { return was_called_; }
131
132 void OnBeforeProxyHeadersSent(const ProxyInfo& proxy_info,
133 HttpRequestHeaders* request_headers) {
134 was_called_ = true;
135 }
136
137 private:
138 bool was_called_;
139};
140
tbansalfdf5665b2015-09-21 22:46:40141class TestNetworkQualityEstimator : public NetworkQualityEstimator {
142 public:
143 TestNetworkQualityEstimator()
144 : NetworkQualityEstimator(scoped_ptr<net::ExternalEstimateProvider>(),
tbansalc8a94ea2015-11-02 23:58:51145 std::map<std::string, std::string>()),
146 watcher_count_(0) {}
tbansalfdf5665b2015-09-21 22:46:40147
148 ~TestNetworkQualityEstimator() override {}
149
tbansalc8a94ea2015-11-02 23:58:51150 scoped_ptr<SocketPerformanceWatcher> CreateSocketPerformanceWatcher(
151 const Protocol protocol) override {
152 if (protocol != PROTOCOL_QUIC) {
153 NOTIMPLEMENTED();
154 }
155 ++watcher_count_;
156 return NetworkQualityEstimator::CreateSocketPerformanceWatcher(protocol);
tbansalfdf5665b2015-09-21 22:46:40157 }
158
tbansalc8a94ea2015-11-02 23:58:51159 size_t watcher_count() const { return watcher_count_; }
tbansalfdf5665b2015-09-21 22:46:40160
161 private:
tbansalc8a94ea2015-11-02 23:58:51162 size_t watcher_count_;
tbansalfdf5665b2015-09-21 22:46:40163 DISALLOW_COPY_AND_ASSIGN(TestNetworkQualityEstimator);
164};
165
tbansalc8a94ea2015-11-02 23:58:51166class TestRTTObserver : public NetworkQualityEstimator::RTTObserver {
167 public:
168 TestRTTObserver() : rtt_notification_received_(false) {}
169
170 bool rtt_notification_received() const { return rtt_notification_received_; }
171
172 // NetworkQualityEstimator::RttObserver implementation:
173 void OnRTTObservation(
174 int32_t rtt_ms,
175 const base::TimeTicks& timestamp,
176 net::NetworkQualityEstimator::ObservationSource source) override {
177 rtt_notification_received_ = true;
178 }
179
180 private:
181 bool rtt_notification_received_;
182};
183
[email protected]1e960032013-12-20 19:00:20184class QuicNetworkTransactionTest
185 : public PlatformTest,
[email protected]5d03bbd2014-03-07 16:19:16186 public ::testing::WithParamInterface<QuicVersion> {
[email protected]61a527782013-02-21 03:58:00187 protected:
[email protected]1c04f9522013-02-21 20:32:43188 QuicNetworkTransactionTest()
rtenneti4b06ae72014-08-26 03:43:43189 : clock_(new MockClock),
bncb07c05532015-05-14 19:07:20190 maker_(GetParam(), 0, clock_, kDefaultServerHostName),
rtenneti052774e2015-11-24 21:00:12191 cert_transparency_verifier_(new MultiLogCTVerifier()),
tbansalfdf5665b2015-09-21 22:46:40192 test_network_quality_estimator_(new TestNetworkQualityEstimator()),
[email protected]1c04f9522013-02-21 20:32:43193 ssl_config_service_(new SSLConfigServiceDefaults),
194 proxy_service_(ProxyService::CreateDirect()),
195 auth_handler_factory_(
[email protected]dda75ab2013-06-22 22:43:30196 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
[email protected]457d6952013-12-13 09:24:58197 random_generator_(0),
rchf114d982015-10-21 01:34:56198 ssl_data_(ASYNC, OK) {
[email protected]aa9b14d2013-05-10 23:45:19199 request_.method = "GET";
rchf114d982015-10-21 01:34:56200 std::string url("https://");
bncb07c05532015-05-14 19:07:20201 url.append(kDefaultServerHostName);
202 request_.url = GURL(url);
[email protected]aa9b14d2013-05-10 23:45:19203 request_.load_flags = 0;
[email protected]98a9d1252014-04-04 00:43:59204 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
rchf114d982015-10-21 01:34:56205
206 scoped_refptr<X509Certificate> cert(
207 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
208 verify_details_.cert_verify_result.verified_cert = cert;
209 verify_details_.cert_verify_result.is_issued_by_known_root = true;
210 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
[email protected]1c04f9522013-02-21 20:32:43211 }
[email protected]61a527782013-02-21 03:58:00212
dcheng67be2b1f2014-10-27 21:47:29213 void SetUp() override {
[email protected]61a527782013-02-21 03:58:00214 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34215 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00216 }
217
dcheng67be2b1f2014-10-27 21:47:29218 void TearDown() override {
[email protected]61a527782013-02-21 03:58:00219 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
220 // Empty the current queue.
[email protected]2da659e2013-05-23 20:51:34221 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00222 PlatformTest::TearDown();
223 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34224 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00225 }
226
[email protected]3316d422013-05-03 21:45:30227 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
rtennetia004d332015-08-28 06:44:57228 QuicPacketNumber num) {
[email protected]1e960032013-12-20 19:00:20229 return maker_.MakeConnectionClosePacket(num);
[email protected]3316d422013-05-03 21:45:30230 }
231
[email protected]61a527782013-02-21 03:58:00232 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket(
rtennetia004d332015-08-28 06:44:57233 QuicPacketNumber largest_received,
234 QuicPacketNumber least_unacked) {
zhongyi32569c62016-01-08 02:54:30235 return maker_.MakeAckPacket(2, largest_received, least_unacked,
236 least_unacked, true);
237 }
238
239 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket(
240 QuicPacketNumber largest_received,
241 QuicPacketNumber least_unacked,
242 QuicTestPacketMaker* maker) {
243 return maker->MakeAckPacket(2, largest_received, least_unacked,
244 least_unacked, true);
245 }
246
247 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket(
248 QuicPacketNumber packet_number,
249 QuicPacketNumber largest_received,
250 QuicPacketNumber ack_least_unacked,
251 QuicPacketNumber stop_least_unacked) {
252 return maker_.MakeAckPacket(packet_number, largest_received,
253 ack_least_unacked, stop_least_unacked, true);
[email protected]1e960032013-12-20 19:00:20254 }
[email protected]61a527782013-02-21 03:58:00255
zhongyica364fbb2015-12-12 03:39:12256 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket(
257 QuicPacketNumber num,
258 QuicTime::Delta delta_time_largest_observed,
259 QuicPacketNumber largest_received,
260 QuicPacketNumber least_unacked,
261 QuicErrorCode quic_error,
262 std::string& quic_error_details) {
263 return maker_.MakeAckAndConnectionClosePacket(
264 num, false, delta_time_largest_observed, largest_received,
265 least_unacked, quic_error, quic_error_details);
266 }
267
268 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket(
269 QuicPacketNumber num,
270 bool include_version,
271 QuicStreamId stream_id,
272 QuicRstStreamErrorCode error_code) {
273 return maker_.MakeRstPacket(num, include_version, stream_id, error_code);
274 }
275
zhongyi32569c62016-01-08 02:54:30276 // Uses default QuicTestPacketMaker.
[email protected]1e960032013-12-20 19:00:20277 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
278 const std::string& scheme,
279 const std::string& path) {
zhongyi32569c62016-01-08 02:54:30280 return GetRequestHeaders(method, scheme, path, maker_);
281 }
282
283 // Uses customized QuicTestPacketMaker.
284 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
285 const std::string& scheme,
286 const std::string& path,
287 QuicTestPacketMaker& maker) {
288 return maker.GetRequestHeaders(method, scheme, path);
[email protected]61a527782013-02-21 03:58:00289 }
290
[email protected]1e960032013-12-20 19:00:20291 SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
292 return maker_.GetResponseHeaders(status);
[email protected]61a527782013-02-21 03:58:00293 }
294
zhongyi32569c62016-01-08 02:54:30295 // Appends alt_svc headers in the response headers.
296 SpdyHeaderBlock GetResponseHeaders(const std::string& status,
297 const std::string& alt_svc) {
298 return maker_.GetResponseHeaders(status, alt_svc);
299 }
300
[email protected]1e960032013-12-20 19:00:20301 scoped_ptr<QuicEncryptedPacket> ConstructDataPacket(
rtennetia004d332015-08-28 06:44:57302 QuicPacketNumber packet_number,
[email protected]98b20ce2013-05-10 05:55:26303 QuicStreamId stream_id,
[email protected]e8ff26842013-03-22 21:02:05304 bool should_include_version,
[email protected]61a527782013-02-21 03:58:00305 bool fin,
306 QuicStreamOffset offset,
307 base::StringPiece data) {
rtennetia004d332015-08-28 06:44:57308 return maker_.MakeDataPacket(packet_number, stream_id,
309 should_include_version, fin, offset, data);
[email protected]61a527782013-02-21 03:58:00310 }
311
[email protected]1e960032013-12-20 19:00:20312 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
rtennetia004d332015-08-28 06:44:57313 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20314 QuicStreamId stream_id,
315 bool should_include_version,
316 bool fin,
zhongyi32569c62016-01-08 02:54:30317 const SpdyHeaderBlock& headers,
318 QuicStreamOffset* offset) {
ianswett0888cff2015-11-24 17:42:16319 SpdyPriority priority =
rtennetif4bdb542015-01-21 14:33:05320 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
zhongyi32569c62016-01-08 02:54:30321 return maker_.MakeRequestHeadersPacketWithOffsetTracking(
322 packet_number, stream_id, should_include_version, fin, priority,
323 headers, offset);
324 }
325
326 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
327 QuicPacketNumber packet_number,
328 QuicStreamId stream_id,
329 bool should_include_version,
330 bool fin,
331 const SpdyHeaderBlock& headers,
332 QuicStreamOffset* offset,
333 QuicTestPacketMaker* maker) {
334 SpdyPriority priority =
335 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
336 return maker->MakeRequestHeadersPacketWithOffsetTracking(
337 packet_number, stream_id, should_include_version, fin, priority,
338 headers, offset);
339 }
340
341 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
342 QuicPacketNumber packet_number,
343 QuicStreamId stream_id,
344 bool should_include_version,
345 bool fin,
346 const SpdyHeaderBlock& headers) {
347 return ConstructRequestHeadersPacket(packet_number, stream_id,
348 should_include_version, fin, headers,
349 nullptr, &maker_);
350 }
351 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
352 QuicPacketNumber packet_number,
353 QuicStreamId stream_id,
354 bool should_include_version,
355 bool fin,
356 const SpdyHeaderBlock& headers,
357 QuicTestPacketMaker* maker) {
358 return ConstructRequestHeadersPacket(packet_number, stream_id,
359 should_include_version, fin, headers,
360 nullptr, maker);
[email protected]61a527782013-02-21 03:58:00361 }
362
[email protected]1e960032013-12-20 19:00:20363 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
rtennetia004d332015-08-28 06:44:57364 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20365 QuicStreamId stream_id,
366 bool should_include_version,
367 bool fin,
368 const SpdyHeaderBlock& headers) {
zhongyi32569c62016-01-08 02:54:30369 return ConstructResponseHeadersPacket(packet_number, stream_id,
370 should_include_version, fin, headers,
371 nullptr, &maker_);
372 }
373
374 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
375 QuicPacketNumber packet_number,
376 QuicStreamId stream_id,
377 bool should_include_version,
378 bool fin,
379 const SpdyHeaderBlock& headers,
380 QuicTestPacketMaker* maker) {
381 return ConstructResponseHeadersPacket(packet_number, stream_id,
382 should_include_version, fin, headers,
383 nullptr, maker);
384 }
385
386 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
387 QuicPacketNumber packet_number,
388 QuicStreamId stream_id,
389 bool should_include_version,
390 bool fin,
391 const SpdyHeaderBlock& headers,
392 QuicStreamOffset* offset) {
393 return maker_.MakeResponseHeadersPacketWithOffsetTracking(
394 packet_number, stream_id, should_include_version, fin, headers, offset);
395 }
396
397 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
398 QuicPacketNumber packet_number,
399 QuicStreamId stream_id,
400 bool should_include_version,
401 bool fin,
402 const SpdyHeaderBlock& headers,
403 QuicStreamOffset* offset,
404 QuicTestPacketMaker* maker) {
405 return maker->MakeResponseHeadersPacketWithOffsetTracking(
406 packet_number, stream_id, should_include_version, fin, headers, offset);
[email protected]61a527782013-02-21 03:58:00407 }
408
rjshaded5ced072015-12-18 19:26:02409 void CreateSession() { CreateSessionWithFactory(&socket_factory_, false); }
[email protected]dda75ab2013-06-22 22:43:30410
[email protected]d7599122014-05-24 03:37:23411 void CreateSessionWithNextProtos() {
412 CreateSessionWithFactory(&socket_factory_, true);
413 }
414
415 // If |use_next_protos| is true, enables SPDY and QUIC.
416 void CreateSessionWithFactory(ClientSocketFactory* socket_factory,
417 bool use_next_protos) {
[email protected]4dca587c2013-03-07 16:54:47418 params_.enable_quic = true;
419 params_.quic_clock = clock_;
420 params_.quic_random = &random_generator_;
[email protected]dda75ab2013-06-22 22:43:30421 params_.client_socket_factory = socket_factory;
[email protected]e8ff26842013-03-22 21:02:05422 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43423 params_.host_resolver = &host_resolver_;
424 params_.cert_verifier = &cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11425 params_.transport_security_state = &transport_security_state_;
rtenneti052774e2015-11-24 21:00:12426 params_.cert_transparency_verifier = cert_transparency_verifier_.get();
tbansalfdf5665b2015-09-21 22:46:40427 params_.socket_performance_watcher_factory =
428 test_network_quality_estimator_.get();
[email protected]1c04f9522013-02-21 20:32:43429 params_.proxy_service = proxy_service_.get();
430 params_.ssl_config_service = ssl_config_service_.get();
431 params_.http_auth_handler_factory = auth_handler_factory_.get();
bnc6be245c12015-05-15 11:24:07432 params_.http_server_properties = http_server_properties_.GetWeakPtr();
[email protected]1e960032013-12-20 19:00:20433 params_.quic_supported_versions = SupportedVersions(GetParam());
rch74da0e1a2016-01-14 02:49:32434 for (const char* host :
435 {kDefaultServerHostName, "www.example.com", "news.example.com",
436 "bar.example.com", "foo.example.com", "www.example.org",
437 "invalid.example.org", "docs.example.org"}) {
438 params_.quic_host_whitelist.insert(host);
439 }
[email protected]61a527782013-02-21 03:58:00440
tbansalc8a94ea2015-11-02 23:58:51441 test_network_quality_estimator_->AddRTTObserver(&rtt_observer_);
442
[email protected]d7599122014-05-24 03:37:23443 if (use_next_protos) {
bnc55ff9da2015-08-19 18:42:35444 params_.use_alternative_services = true;
bnc3bb2c232014-11-07 20:26:39445 params_.next_protos = NextProtosWithSpdyAndQuic(true, true);
[email protected]d7599122014-05-24 03:37:23446 }
447
mmenkee65e7af2015-10-13 17:16:42448 session_.reset(new HttpNetworkSession(params_));
[email protected]11c05872013-08-20 02:04:12449 session_->quic_stream_factory()->set_require_confirmation(false);
rch185ebee2015-07-14 23:56:22450 ASSERT_EQ(params_.quic_socket_receive_buffer_size,
451 session_->quic_stream_factory()->socket_receive_buffer_size());
[email protected]61a527782013-02-21 03:58:00452 }
453
[email protected]aa9b14d2013-05-10 23:45:19454 void CheckWasQuicResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
455 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42456 ASSERT_TRUE(response != nullptr);
457 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19458 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
459 EXPECT_TRUE(response->was_fetched_via_spdy);
460 EXPECT_TRUE(response->was_npn_negotiated);
461 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
462 response->connection_info);
463 }
464
bnc62a44f022015-04-02 15:59:41465 void CheckResponsePort(const scoped_ptr<HttpNetworkTransaction>& trans,
Avi Drissman13fc8932015-12-20 04:40:46466 uint16_t port) {
bnc62a44f022015-04-02 15:59:41467 const HttpResponseInfo* response = trans->GetResponseInfo();
468 ASSERT_TRUE(response != nullptr);
469 EXPECT_EQ(port, response->socket_address.port());
470 }
471
[email protected]aa9b14d2013-05-10 23:45:19472 void CheckWasHttpResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
473 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42474 ASSERT_TRUE(response != nullptr);
475 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19476 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
477 EXPECT_FALSE(response->was_fetched_via_spdy);
478 EXPECT_FALSE(response->was_npn_negotiated);
479 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1,
480 response->connection_info);
481 }
482
bncffc2fdf2015-05-14 18:29:49483 void CheckResponseData(const scoped_ptr<HttpNetworkTransaction>& trans,
[email protected]aa9b14d2013-05-10 23:45:19484 const std::string& expected) {
485 std::string response_data;
bncffc2fdf2015-05-14 18:29:49486 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
[email protected]aa9b14d2013-05-10 23:45:19487 EXPECT_EQ(expected, response_data);
488 }
489
bncffc2fdf2015-05-14 18:29:49490 void RunTransaction(const scoped_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19491 TestCompletionCallback callback;
492 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
493 EXPECT_EQ(ERR_IO_PENDING, rv);
494 EXPECT_EQ(OK, callback.WaitForResult());
495 }
496
497 void SendRequestAndExpectHttpResponse(const std::string& expected) {
498 scoped_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50499 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
bncffc2fdf2015-05-14 18:29:49500 RunTransaction(trans);
[email protected]aa9b14d2013-05-10 23:45:19501 CheckWasHttpResponse(trans);
bncffc2fdf2015-05-14 18:29:49502 CheckResponseData(trans, expected);
[email protected]aa9b14d2013-05-10 23:45:19503 }
504
505 void SendRequestAndExpectQuicResponse(const std::string& expected) {
rchf114d982015-10-21 01:34:56506 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, 443);
tbansal7cec3812015-02-05 21:25:12507 }
508
bnc62a44f022015-04-02 15:59:41509 void SendRequestAndExpectQuicResponseOnPort(const std::string& expected,
Avi Drissman13fc8932015-12-20 04:40:46510 uint16_t port) {
bnc62a44f022015-04-02 15:59:41511 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, port);
512 }
513
514 void SendRequestAndExpectQuicResponseFromProxyOnPort(
515 const std::string& expected,
Avi Drissman13fc8932015-12-20 04:40:46516 uint16_t port) {
bnc62a44f022015-04-02 15:59:41517 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port);
[email protected]aa9b14d2013-05-10 23:45:19518 }
519
520 void AddQuicAlternateProtocolMapping(
521 MockCryptoClientStream::HandshakeMode handshake_mode) {
522 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
bnccacc0992015-03-20 20:22:22523 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url);
rchf114d982015-10-21 01:34:56524 AlternativeService alternative_service(QUIC, host_port_pair.host(), 443);
bnc7dc7e1b42015-07-28 14:43:12525 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
526 http_server_properties_.SetAlternativeService(
527 host_port_pair, alternative_service, 1.0, expiration);
[email protected]aa9b14d2013-05-10 23:45:19528 }
529
530 void ExpectBrokenAlternateProtocolMapping() {
bnc8445b3002015-03-13 01:57:09531 const HostPortPair origin = HostPortPair::FromURL(request_.url);
bncd9b132e2015-07-08 05:16:10532 const AlternativeServiceVector alternative_service_vector =
533 http_server_properties_.GetAlternativeServices(origin);
534 EXPECT_EQ(1u, alternative_service_vector.size());
bnc6be245c12015-05-15 11:24:07535 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken(
bncd9b132e2015-07-08 05:16:10536 alternative_service_vector[0]));
[email protected]aa9b14d2013-05-10 23:45:19537 }
538
[email protected]4d590c9c2014-05-02 05:14:33539 void ExpectQuicAlternateProtocolMapping() {
bncd9b132e2015-07-08 05:16:10540 const HostPortPair origin = HostPortPair::FromURL(request_.url);
541 const AlternativeServiceVector alternative_service_vector =
542 http_server_properties_.GetAlternativeServices(origin);
543 EXPECT_EQ(1u, alternative_service_vector.size());
544 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
[email protected]4d590c9c2014-05-02 05:14:33545 }
546
[email protected]aa9b14d2013-05-10 23:45:19547 void AddHangingNonAlternateProtocolSocketData() {
zhongyi32569c62016-01-08 02:54:30548 scoped_ptr<StaticSocketDataProvider> hanging_data;
549 hanging_data.reset(new StaticSocketDataProvider());
[email protected]dda75ab2013-06-22 22:43:30550 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
zhongyi32569c62016-01-08 02:54:30551 hanging_data->set_connect_data(hanging_connect);
552 hanging_data_.push_back(std::move(hanging_data));
553 socket_factory_.AddSocketDataProvider(hanging_data_.back().get());
rchf114d982015-10-21 01:34:56554 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]aa9b14d2013-05-10 23:45:19555 }
556
rtenneti4b06ae72014-08-26 03:43:43557 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
[email protected]1e960032013-12-20 19:00:20558 QuicTestPacketMaker maker_;
mmenkee65e7af2015-10-13 17:16:42559 scoped_ptr<HttpNetworkSession> session_;
[email protected]61a527782013-02-21 03:58:00560 MockClientSocketFactory socket_factory_;
rchf114d982015-10-21 01:34:56561 ProofVerifyDetailsChromium verify_details_;
[email protected]e8ff26842013-03-22 21:02:05562 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43563 MockHostResolver host_resolver_;
564 MockCertVerifier cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11565 TransportSecurityState transport_security_state_;
rtenneti052774e2015-11-24 21:00:12566 scoped_ptr<CTVerifier> cert_transparency_verifier_;
tbansalfdf5665b2015-09-21 22:46:40567 scoped_ptr<TestNetworkQualityEstimator> test_network_quality_estimator_;
tbansalc8a94ea2015-11-02 23:58:51568 TestRTTObserver rtt_observer_;
[email protected]1c04f9522013-02-21 20:32:43569 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
570 scoped_ptr<ProxyService> proxy_service_;
571 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
[email protected]61a527782013-02-21 03:58:00572 MockRandom random_generator_;
bnc6be245c12015-05-15 11:24:07573 HttpServerPropertiesImpl http_server_properties_;
[email protected]61a527782013-02-21 03:58:00574 HttpNetworkSession::Params params_;
[email protected]aa9b14d2013-05-10 23:45:19575 HttpRequestInfo request_;
vishal.b62985ca92015-04-17 08:45:51576 BoundTestNetLog net_log_;
zhongyi32569c62016-01-08 02:54:30577 std::vector<scoped_ptr<StaticSocketDataProvider>> hanging_data_;
rchf114d982015-10-21 01:34:56578 SSLSocketDataProvider ssl_data_;
tbansal7cec3812015-02-05 21:25:12579
580 private:
581 void SendRequestAndExpectQuicResponseMaybeFromProxy(
582 const std::string& expected,
bnc62a44f022015-04-02 15:59:41583 bool used_proxy,
Avi Drissman13fc8932015-12-20 04:40:46584 uint16_t port) {
tbansal7cec3812015-02-05 21:25:12585 scoped_ptr<HttpNetworkTransaction> trans(
586 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
587 ProxyHeadersHandler proxy_headers_handler;
588 trans->SetBeforeProxyHeadersSentCallback(
589 base::Bind(&ProxyHeadersHandler::OnBeforeProxyHeadersSent,
590 base::Unretained(&proxy_headers_handler)));
bncffc2fdf2015-05-14 18:29:49591 RunTransaction(trans);
tbansal7cec3812015-02-05 21:25:12592 CheckWasQuicResponse(trans);
bnc62a44f022015-04-02 15:59:41593 CheckResponsePort(trans, port);
bncffc2fdf2015-05-14 18:29:49594 CheckResponseData(trans, expected);
tbansal7cec3812015-02-05 21:25:12595 EXPECT_EQ(used_proxy, proxy_headers_handler.was_called());
596 }
[email protected]61a527782013-02-21 03:58:00597};
598
rjshaded5ced072015-12-18 19:26:02599INSTANTIATE_TEST_CASE_P(Version,
600 QuicNetworkTransactionTest,
[email protected]1e960032013-12-20 19:00:20601 ::testing::ValuesIn(QuicSupportedVersions()));
602
603TEST_P(QuicNetworkTransactionTest, ForceQuic) {
[email protected]49e85332013-06-04 04:18:03604 params_.origin_to_force_quic_on =
rchf114d982015-10-21 01:34:56605 HostPortPair::FromString("mail.example.com:443");
[email protected]4dca587c2013-03-07 16:54:47606
[email protected]1e960032013-12-20 19:00:20607 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03608 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05609 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56610 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:02611 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
612 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:03613 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05614 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03615 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:59616 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
[email protected]4dca587c2013-03-07 16:54:47617
rcha5399e02015-04-21 19:32:04618 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4dca587c2013-03-07 16:54:47619
[email protected]aa9b14d2013-05-10 23:45:19620 // The non-alternate protocol job needs to hang in order to guarantee that
621 // the alternate-protocol job will "win".
622 AddHangingNonAlternateProtocolSocketData();
[email protected]4dca587c2013-03-07 16:54:47623
624 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47625
tbansalc8a94ea2015-11-02 23:58:51626 EXPECT_FALSE(rtt_observer_.rtt_notification_received());
[email protected]aa9b14d2013-05-10 23:45:19627 SendRequestAndExpectQuicResponse("hello!");
tbansalc8a94ea2015-11-02 23:58:51628 EXPECT_TRUE(rtt_observer_.rtt_notification_received());
[email protected]4dca587c2013-03-07 16:54:47629
[email protected]98b20ce2013-05-10 05:55:26630 // Check that the NetLog was filled reasonably.
mmenke43758e62015-05-04 21:09:46631 TestNetLogEntry::List entries;
[email protected]aa9b14d2013-05-10 23:45:19632 net_log_.GetEntries(&entries);
[email protected]98b20ce2013-05-10 05:55:26633 EXPECT_LT(0u, entries.size());
634
635 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29636 int pos = ExpectLogContainsSomewhere(
637 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
638 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26639 EXPECT_LT(0, pos);
640
rchfd527212015-08-25 00:41:26641 // ... and also a TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29642 pos = ExpectLogContainsSomewhere(
rchfd527212015-08-25 00:41:26643 entries, 0,
644 NetLog::TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED,
ttuttle859dc7a2015-04-23 19:42:29645 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26646 EXPECT_LT(0, pos);
647
rtennetia004d332015-08-28 06:44:57648 std::string packet_number;
649 ASSERT_TRUE(entries[pos].GetStringValue("packet_number", &packet_number));
650 EXPECT_EQ("1", packet_number);
[email protected]98b20ce2013-05-10 05:55:26651
rchfd527212015-08-25 00:41:26652 // ... and also a TYPE_QUIC_SESSION_PACKET_AUTHENTICATED.
653 pos = ExpectLogContainsSomewhere(
654 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_AUTHENTICATED,
655 NetLog::PHASE_NONE);
656 EXPECT_LT(0, pos);
657
[email protected]98b20ce2013-05-10 05:55:26658 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29659 pos = ExpectLogContainsSomewhere(
660 entries, 0, NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
661 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26662 EXPECT_LT(0, pos);
663
664 int log_stream_id;
665 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
[email protected]1e960032013-12-20 19:00:20666 EXPECT_EQ(3, log_stream_id);
[email protected]4dca587c2013-03-07 16:54:47667}
668
[email protected]cf3e3cd62014-02-05 16:16:16669TEST_P(QuicNetworkTransactionTest, QuicProxy) {
tbansaled0aecc2015-02-20 03:44:18670 params_.enable_quic_for_proxies = true;
rchf114d982015-10-21 01:34:56671 proxy_service_ =
672 ProxyService::CreateFixedFromPacResult("QUIC mail.example.com:70");
[email protected]cf3e3cd62014-02-05 16:16:16673
[email protected]cf3e3cd62014-02-05 16:16:16674 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03675 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05676 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03677 GetRequestHeaders("GET", "http", "/")));
rjshaded5ced072015-12-18 19:26:02678 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
679 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:03680 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05681 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03682 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50683 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59684 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]cf3e3cd62014-02-05 16:16:16685
rcha5399e02015-04-21 19:32:04686 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cf3e3cd62014-02-05 16:16:16687
tbansalc8a94ea2015-11-02 23:58:51688 EXPECT_FALSE(rtt_observer_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16689 // There is no need to set up an alternate protocol job, because
690 // no attempt will be made to speak to the proxy over TCP.
691
rchf114d982015-10-21 01:34:56692 request_.url = GURL("http://mail.example.com/");
[email protected]cf3e3cd62014-02-05 16:16:16693 CreateSession();
694
bnc62a44f022015-04-02 15:59:41695 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
tbansalc8a94ea2015-11-02 23:58:51696 EXPECT_TRUE(rtt_observer_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16697}
698
bnc313ba9c2015-06-11 15:42:31699// Regression test for https://crbug.com/492458. Test that for an HTTP
700// connection through a QUIC proxy, the certificate exhibited by the proxy is
701// checked against the proxy hostname, not the origin hostname.
702TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) {
703 const std::string origin_host = "news.example.com";
704 const std::string proxy_host = "www.example.org";
705
706 params_.enable_quic_for_proxies = true;
rdsmith82957ad2015-09-16 19:42:03707 proxy_service_ =
708 ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70");
bnc313ba9c2015-06-11 15:42:31709
710 maker_.set_hostname(origin_host);
711 MockQuicData mock_quic_data;
712 mock_quic_data.AddWrite(
713 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
714 GetRequestHeaders("GET", "http", "/")));
715 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
716 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
717 mock_quic_data.AddRead(
718 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
719 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50720 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59721 mock_quic_data.AddRead(ASYNC, 0);
bnc313ba9c2015-06-11 15:42:31722 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
723
724 scoped_refptr<X509Certificate> cert(
725 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
726 ASSERT_TRUE(cert.get());
727 // This certificate is valid for the proxy, but not for the origin.
728 bool common_name_fallback_used;
729 EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used));
730 EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used));
731 ProofVerifyDetailsChromium verify_details;
732 verify_details.cert_verify_result.verified_cert = cert;
733 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rchf114d982015-10-21 01:34:56734 ProofVerifyDetailsChromium verify_details2;
735 verify_details2.cert_verify_result.verified_cert = cert;
736 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
bnc313ba9c2015-06-11 15:42:31737
738 request_.url = GURL("http://" + origin_host);
739 AddHangingNonAlternateProtocolSocketData();
740 CreateSessionWithNextProtos();
741 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
742 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
743}
744
[email protected]1e960032013-12-20 19:00:20745TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
[email protected]49e85332013-06-04 04:18:03746 params_.origin_to_force_quic_on =
rchf114d982015-10-21 01:34:56747 HostPortPair::FromString("mail.example.com:443");
[email protected]cebe3282013-05-22 23:49:30748
tbansalfdf5665b2015-09-21 22:46:40749 MockQuicData mock_quic_data1;
750 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
[email protected]1e960032013-12-20 19:00:20751
tbansalfdf5665b2015-09-21 22:46:40752 MockQuicData mock_quic_data2;
zhongyi32569c62016-01-08 02:54:30753 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40754 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
rch6faa4d42016-01-05 20:48:43755 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40756
757 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
758 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
[email protected]cebe3282013-05-22 23:49:30759
760 CreateSession();
761
tbansalc8a94ea2015-11-02 23:58:51762 EXPECT_EQ(0U, test_network_quality_estimator_->watcher_count());
tbansalfdf5665b2015-09-21 22:46:40763 for (size_t i = 0; i < 2; ++i) {
764 scoped_ptr<HttpNetworkTransaction> trans(
765 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
766 TestCompletionCallback callback;
767 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
768 EXPECT_EQ(ERR_IO_PENDING, rv);
769 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
tbansalc8a94ea2015-11-02 23:58:51770 EXPECT_EQ(1 + i, test_network_quality_estimator_->watcher_count());
tbansalfdf5665b2015-09-21 22:46:40771 }
[email protected]cebe3282013-05-22 23:49:30772}
773
tbansalc8a94ea2015-11-02 23:58:51774TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
775 // Attempt to "force" quic on 443, which will not be honored.
776 params_.origin_to_force_quic_on =
777 HostPortPair::FromString("www.google.com:443");
778
779 MockRead http_reads[] = {
780 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
781 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
782 MockRead(ASYNC, OK)};
783
784 StaticSocketDataProvider data(http_reads, arraysize(http_reads), nullptr, 0);
785 socket_factory_.AddSocketDataProvider(&data);
786 SSLSocketDataProvider ssl(ASYNC, OK);
787 socket_factory_.AddSSLSocketDataProvider(&ssl);
788
789 CreateSession();
790
791 SendRequestAndExpectHttpResponse("hello world");
792 EXPECT_EQ(0U, test_network_quality_estimator_->watcher_count());
793}
794
bncc958faa2015-07-31 18:14:52795TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52796 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56797 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
798 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52799 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
800 MockRead(ASYNC, OK)};
801
802 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
803 0);
804 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56805 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52806
807 MockQuicData mock_quic_data;
808 mock_quic_data.AddWrite(
809 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56810 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52811 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
812 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
813 mock_quic_data.AddRead(
814 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
815 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
816 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59817 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52818
819 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
820
821 AddHangingNonAlternateProtocolSocketData();
822 CreateSessionWithNextProtos();
823
824 SendRequestAndExpectHttpResponse("hello world");
825 SendRequestAndExpectQuicResponse("hello!");
826}
827
bnc8be55ebb2015-10-30 14:12:07828TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) {
829 std::string altsvc_header = base::StringPrintf(
830 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam());
831 MockRead http_reads[] = {
832 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
833 MockRead("hello world"),
834 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
835 MockRead(ASYNC, OK)};
836
837 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
838 0);
839 socket_factory_.AddSocketDataProvider(&http_data);
840 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
841
842 MockQuicData mock_quic_data;
843 mock_quic_data.AddWrite(
844 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
845 GetRequestHeaders("GET", "https", "/")));
846 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
847 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
848 mock_quic_data.AddRead(
849 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
850 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
851 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59852 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc8be55ebb2015-10-30 14:12:07853
854 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
855
856 AddHangingNonAlternateProtocolSocketData();
857 CreateSessionWithNextProtos();
858
859 SendRequestAndExpectHttpResponse("hello world");
860 SendRequestAndExpectQuicResponse("hello!");
861}
862
863TEST_P(QuicNetworkTransactionTest,
864 DoNotUseAlternativeServiceQuicUnsupportedVersion) {
865 std::string altsvc_header = base::StringPrintf(
866 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam() - 1);
867 MockRead http_reads[] = {
868 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
869 MockRead("hello world"),
870 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
871 MockRead(ASYNC, OK)};
872
873 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
874 0);
875 socket_factory_.AddSocketDataProvider(&http_data);
876 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
877 socket_factory_.AddSocketDataProvider(&http_data);
878 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
879
880 CreateSessionWithNextProtos();
881
882 SendRequestAndExpectHttpResponse("hello world");
883 SendRequestAndExpectHttpResponse("hello world");
884}
885
bncc958faa2015-07-31 18:14:52886// When multiple alternative services are advertised,
zhongyi32569c62016-01-08 02:54:30887// HttpStreamFactoryImpl::RequestStreamInternal() should select the alternative
888// service which uses existing QUIC session if available. If no existing QUIC
889// session can be used, use the first alternative service from the list.
890TEST_P(QuicNetworkTransactionTest, UseExistingAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52891 MockRead http_reads[] = {
892 MockRead("HTTP/1.1 200 OK\r\n"),
zhongyi32569c62016-01-08 02:54:30893 MockRead("Alt-Svc: quic=\"foo.example.com:443\", quic=\":444\"\r\n\r\n"),
bncc958faa2015-07-31 18:14:52894 MockRead("hello world"),
895 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
896 MockRead(ASYNC, OK)};
897
898 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
899 0);
900 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56901 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52902
zhongyi32569c62016-01-08 02:54:30903 QuicStreamOffset request_header_offset = 0;
904 QuicStreamOffset response_header_offset = 0;
905 // First QUIC request data.
906 // Open a session to foo.example.com:443 using the first entry of the
907 // alternative service list.
bncc958faa2015-07-31 18:14:52908 MockQuicData mock_quic_data;
zhongyi32569c62016-01-08 02:54:30909 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
910 1, kClientDataStreamId1, true, true,
911 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
912
913 std::string alt_svc_list =
914 "quic=\"mail.example.com:444\", quic=\"foo.example.com:443\", "
915 "quic=\"bar.example.com:445\"";
bncc958faa2015-07-31 18:14:52916 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30917 1, kClientDataStreamId1, false, false,
918 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
bncc958faa2015-07-31 18:14:52919 mock_quic_data.AddRead(
920 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
921 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:30922
923 // Second QUIC request data.
924 // Connection pooling, using existing session, no need to include version
925 // as version negotiation has been completed.
926 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
927 3, kClientDataStreamId2, false, true,
928 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
929 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
930 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
931 &response_header_offset));
932 mock_quic_data.AddRead(
933 ConstructDataPacket(4, kClientDataStreamId2, false, true, 0, "hello!"));
934 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
bncc958faa2015-07-31 18:14:52935 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59936 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52937
938 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
939
940 AddHangingNonAlternateProtocolSocketData();
941 CreateSessionWithNextProtos();
942
943 SendRequestAndExpectHttpResponse("hello world");
zhongyi32569c62016-01-08 02:54:30944
bncc958faa2015-07-31 18:14:52945 SendRequestAndExpectQuicResponseOnPort("hello!", 443);
zhongyi32569c62016-01-08 02:54:30946 SendRequestAndExpectQuicResponseOnPort("hello!", 443);
947}
948
949// When multiple alternative services that has existing QUIC session.
950// HttpStreamFactoryImpl::RequestStreamInternal() should select the first
951// alternative service which uses existing QUIC session.
952TEST_P(QuicNetworkTransactionTest, UseFirstExistingAlternativeServiceForQuic) {
953 MockRead http_reads[] = {
954 MockRead("HTTP/1.1 200 OK\r\n"),
955 MockRead("Alt-Svc: quic=\"foo.example.com:443\", quic=\":446\"\r\n\r\n"),
956 MockRead("hello world"),
957 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
958 MockRead(ASYNC, OK)};
959
960 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
961 0);
962 socket_factory_.AddSocketDataProvider(&http_data);
963 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
964
965 QuicStreamOffset request_header_offset = 0;
966 QuicStreamOffset response_header_offset = 0;
967
968 QuicTestPacketMaker maker(GetParam(), 0, clock_, kDefaultServerHostName);
969
970 MockQuicData mock_quic_data;
971 MockQuicData mock_quic_data2;
972 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
973 // First QUIC request data.
974 // Open a QUIC session to foo.example.com:443.
975 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
976 1, kClientDataStreamId1, true, true,
977 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
978
979 std::string alt_svc_list =
980 "quic=\"bar.example.com:444\", quic=\"frog.example.com:445\", "
981 "quic=\"mail.example.com:446\"";
982 // Response header from the server resets the alt_svc list for the origin.
983 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
984 1, kClientDataStreamId1, false, false,
985 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
986 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
987 true, 0, "hello from foo!"));
988 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
989
990 // Second QUIC request data.
991 // Existing QUIC session to foo.example.com is not viable from the updated
992 // alt_svc. Unable to pool the existing QUIC session.
993 // Open a new QUIC session to bar.example.com:443.
994 mock_quic_data2.AddWrite(ConstructRequestHeadersPacket(
995 1, kClientDataStreamId1, true, true,
996 GetRequestHeaders("GET", "https", "/"), &maker));
997 alt_svc_list =
998 "quic=\"foo.example.com:443\", quic=\"mail.example.com:446\", "
999 "quic=\"bar.example.com:444\"";
1000 // Response header from the server resets the alt_svc list for the origin.
1001 mock_quic_data2.AddRead(ConstructResponseHeadersPacket(
1002 1, kClientDataStreamId1, false, false,
1003 GetResponseHeaders("200 OK", alt_svc_list), &maker));
1004 mock_quic_data2.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1005 true, 0, "hello from bar!"));
1006 mock_quic_data2.AddWrite(ConstructAckPacket(2, 1, &maker));
1007 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1008 mock_quic_data2.AddRead(ASYNC, 0); // EOF
1009
1010 // Third QUIC request data.
1011 // Connection pooling, using the first existing session to foo.example.com
1012 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1013 3, kClientDataStreamId2, false, true,
1014 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1015 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1016 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1017 &response_header_offset));
1018 mock_quic_data.AddRead(ConstructDataPacket(4, kClientDataStreamId2, false,
1019 true, 0, "hello from foo!"));
1020 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
1021 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1022 mock_quic_data.AddRead(ASYNC, 0); // EOF
1023
1024 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1025 AddHangingNonAlternateProtocolSocketData();
1026
1027 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
1028
1029 AddHangingNonAlternateProtocolSocketData();
1030
1031 CreateSessionWithNextProtos();
1032
1033 SendRequestAndExpectHttpResponse("hello world");
1034 SendRequestAndExpectQuicResponseOnPort("hello from foo!", 443);
1035 SendRequestAndExpectQuicResponseOnPort("hello from bar!", 444);
1036 SendRequestAndExpectQuicResponseOnPort("hello from foo!", 443);
1037}
1038
1039// Multiple origins have listed the same alternative services. When there's a
1040// existing QUIC session opened by a request to other origin,
1041// if the cert is valid, should select this QUIC session to make the request
1042// if this is also the first existing QUIC session.
1043TEST_P(QuicNetworkTransactionTest,
1044 UseSharedExistingAlternativeServiceForQuicWithValidCert) {
1045 // Default cert is valid for the following origins:
1046 // mail.example.com, mail.example.org, and www.example.org.
1047
1048 // HTTP data for request to mail.example.com.
1049 MockRead http_reads[] = {
1050 MockRead("HTTP/1.1 200 OK\r\n"),
1051 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
1052 MockRead("hello world from mail.example.com"),
1053 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1054 MockRead(ASYNC, OK)};
1055
1056 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1057 0);
1058 socket_factory_.AddSocketDataProvider(&http_data);
1059 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1060
1061 // HTTP data for request to mail.example.org.
1062 MockRead http_reads2[] = {
1063 MockRead("HTTP/1.1 200 OK\r\n"),
1064 MockRead("Alt-Svc: quic=\":444\", quic=\"mail.example.com:443\"\r\n\r\n"),
1065 MockRead("hello world from mail.example.org"),
1066 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1067 MockRead(ASYNC, OK)};
1068
1069 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1070 nullptr, 0);
1071 socket_factory_.AddSocketDataProvider(&http_data2);
1072 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1073
1074 QuicStreamOffset request_header_offset = 0;
1075 QuicStreamOffset response_header_offset = 0;
1076
1077 QuicTestPacketMaker maker(GetParam(), 0, clock_, kDefaultServerHostName);
1078 maker.set_hostname("mail.example.org");
1079 MockQuicData mock_quic_data;
1080
1081 // First QUIC request data.
1082 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1083 1, kClientDataStreamId1, true, true,
1084 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1085
1086 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1087 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1088 &response_header_offset));
1089 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1090 true, 0, "hello from mail QUIC!"));
1091 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1092
1093 // Second QUIC request data.
1094 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1095 3, kClientDataStreamId2, false, true,
1096 GetRequestHeaders("GET", "https", "/", maker), &request_header_offset,
1097 &maker));
1098 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1099 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1100 &response_header_offset));
1101 mock_quic_data.AddRead(ConstructDataPacket(4, kClientDataStreamId2, false,
1102 true, 0, "hello from mail QUIC!"));
1103 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
1104 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1105 mock_quic_data.AddRead(ASYNC, 0); // EOF
1106
1107 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1108 AddHangingNonAlternateProtocolSocketData();
1109
1110 CreateSessionWithNextProtos();
1111
1112 // Send two HTTP requests, responses set up alt-svc lists for the origins.
1113 SendRequestAndExpectHttpResponse("hello world from mail.example.com");
1114 request_.url = GURL("https://mail.example.org/");
1115 SendRequestAndExpectHttpResponse("hello world from mail.example.org");
1116
1117 // Open a QUIC session to mail.example.com:443 when making request
1118 // to mail.example.com.
1119 request_.url = GURL("https://mail.example.com/");
1120 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443);
1121
1122 // Uses the existing QUIC session when making request to mail.example.org.
1123 request_.url = GURL("https://mail.example.org/");
1124 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443);
1125}
1126
1127// Multiple origins have listed the same alternative services. When there's a
1128// existing QUIC session opened by a request to other origin,
1129// if the cert is NOT valid, should ignore this QUIC session.
1130TEST_P(QuicNetworkTransactionTest,
1131 DoNotUseSharedExistingAlternativeServiceForQuicWithInvalidCert) {
1132 // Default cert is only valid for the following origins:
1133 // mail.example.com, mail.example.org, and www.example.org.
1134 // NOT valid for docs.example.org.
1135
1136 // HTTP data for request to mail.example.com.
1137 MockRead http_reads[] = {
1138 MockRead("HTTP/1.1 200 OK\r\n"),
1139 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
1140 MockRead("hello world from mail.example.com"),
1141 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1142 MockRead(ASYNC, OK)};
1143
1144 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1145 0);
1146 socket_factory_.AddSocketDataProvider(&http_data);
1147 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1148
1149 // HTTP data for request to docs.example.org.
1150 MockRead http_reads2[] = {
1151 MockRead("HTTP/1.1 200 OK\r\n"),
1152 MockRead("Alt-Svc: quic=\":444\", quic=\"mail.example.com:443\"\r\n\r\n"),
1153 MockRead("hello world from docs.example.org"),
1154 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1155 MockRead(ASYNC, OK)};
1156
1157 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1158 nullptr, 0);
1159 socket_factory_.AddSocketDataProvider(&http_data2);
1160 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1161
1162 QuicTestPacketMaker maker(GetParam(), 0, clock_, kDefaultServerHostName);
1163 maker.set_hostname("docs.example.org");
1164 MockQuicData mock_quic_data;
1165 MockQuicData mock_quic_data2;
1166
1167 // Adding a valid cert for *.example.org but not mail.example.com.
1168 ProofVerifyDetailsChromium verify_details;
1169 scoped_refptr<X509Certificate> cert(
1170 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
1171 verify_details.cert_verify_result.verified_cert = cert;
1172 verify_details.cert_verify_result.is_issued_by_known_root = true;
1173 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1174
1175 // First QUIC request data.
1176 mock_quic_data.AddWrite(
1177 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1178 GetRequestHeaders("GET", "https", "/")));
1179 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1180 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1181 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1182 true, 0, "hello from mail QUIC!"));
1183 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1184 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1185 mock_quic_data.AddRead(ASYNC, 0); // EOF
1186
1187 // First QUIC request data.
1188 mock_quic_data2.AddWrite(ConstructRequestHeadersPacket(
1189 1, kClientDataStreamId1, true, true,
1190 GetRequestHeaders("GET", "https", "/", maker), &maker));
1191 mock_quic_data2.AddRead(
1192 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
1193 GetResponseHeaders("200 OK"), &maker));
1194 mock_quic_data2.AddRead(ConstructDataPacket(
1195 2, kClientDataStreamId1, false, true, 0, "hello from docs QUIC!"));
1196 mock_quic_data2.AddWrite(ConstructAckPacket(2, 1, &maker));
1197 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1198 mock_quic_data2.AddRead(ASYNC, 0); // EOF
1199
1200 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1201 AddHangingNonAlternateProtocolSocketData();
1202
1203 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
1204 AddHangingNonAlternateProtocolSocketData();
1205
1206 CreateSessionWithNextProtos();
1207
1208 // Send HTTP requests, responses set up the alt-svc lists for the origins.
1209 SendRequestAndExpectHttpResponse("hello world from mail.example.com");
1210 request_.url = GURL("https://docs.example.org/");
1211 SendRequestAndExpectHttpResponse("hello world from docs.example.org");
1212
1213 // Open a QUIC session to mail.example.com:443 when making request
1214 // to mail.example.com.
1215 request_.url = GURL("https://mail.example.com/");
1216 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443);
1217
1218 // Open another new QUIC session to docs.example.org:444.
1219 request_.url = GURL("https://docs.example.org/");
1220 SendRequestAndExpectQuicResponseOnPort("hello from docs QUIC!", 444);
bncc958faa2015-07-31 18:14:521221}
1222
1223TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) {
bncc958faa2015-07-31 18:14:521224 MockRead http_reads[] = {
1225 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561226 MockRead(kQuicAlternativeServiceDifferentPortHeader),
bncc958faa2015-07-31 18:14:521227 MockRead("hello world"),
1228 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1229 MockRead(ASYNC, OK)};
1230
1231 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1232 0);
1233 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561234 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521235
1236 MockQuicData mock_quic_data;
1237 mock_quic_data.AddWrite(
1238 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561239 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521240 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1241 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1242 mock_quic_data.AddRead(
1243 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1244 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1245 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591246 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521247
1248 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1249
1250 AddHangingNonAlternateProtocolSocketData();
1251 CreateSessionWithNextProtos();
1252
1253 SendRequestAndExpectHttpResponse("hello world");
1254 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
1255}
1256
1257TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) {
bncc958faa2015-07-31 18:14:521258 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561259 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1260 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521261 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1262 MockRead(ASYNC, OK)};
1263
1264 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1265 0);
1266 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561267 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521268
1269 MockQuicData mock_quic_data;
1270 mock_quic_data.AddWrite(
1271 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561272 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521273 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1274 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1275 mock_quic_data.AddRead(
1276 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1277 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1278 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1279 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521280
1281 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1282
1283 AddHangingNonAlternateProtocolSocketData();
1284 CreateSessionWithNextProtos();
1285
1286 AlternativeService alternative_service(QUIC,
1287 HostPortPair::FromURL(request_.url));
1288 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
1289 alternative_service);
1290 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1291 alternative_service));
1292
1293 SendRequestAndExpectHttpResponse("hello world");
1294 SendRequestAndExpectQuicResponse("hello!");
1295
mmenkee24011922015-12-17 22:12:591296 mock_quic_data.Resume();
bncc958faa2015-07-31 18:14:521297
1298 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1299 alternative_service));
1300}
1301
1302TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceProbabilityForQuic) {
bncc958faa2015-07-31 18:14:521303 MockRead http_reads[] = {
1304 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561305 MockRead(kQuicAlternativeService50pctHeader), MockRead("hello world"),
bncc958faa2015-07-31 18:14:521306 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1307 MockRead(ASYNC, OK)};
1308
1309 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1310 0);
1311 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561312 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521313
1314 MockQuicData mock_quic_data;
1315 mock_quic_data.AddWrite(
1316 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561317 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521318 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1319 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1320 mock_quic_data.AddRead(
1321 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1322 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1323 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591324 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521325
1326 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1327
1328 AddHangingNonAlternateProtocolSocketData();
1329 params_.alternative_service_probability_threshold = 0.25;
1330 CreateSessionWithNextProtos();
1331
1332 SendRequestAndExpectHttpResponse("hello world");
1333 SendRequestAndExpectQuicResponse("hello!");
1334}
1335
1336TEST_P(QuicNetworkTransactionTest,
1337 DontUseAlternativeServiceProbabilityForQuic) {
bncc958faa2015-07-31 18:14:521338 MockRead http_reads[] = {
1339 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561340 MockRead(kQuicAlternativeService50pctHeader), MockRead("hello world"),
bncc958faa2015-07-31 18:14:521341 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1342 MockRead(ASYNC, OK)};
1343
1344 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1345 0);
1346 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561347 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521348 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561349 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521350
1351 params_.alternative_service_probability_threshold = 0.75;
1352 CreateSessionWithNextProtos();
1353
1354 SendRequestAndExpectHttpResponse("hello world");
1355 SendRequestAndExpectHttpResponse("hello world");
1356}
1357
bncc958faa2015-07-31 18:14:521358TEST_P(QuicNetworkTransactionTest,
1359 DontUseAlternativeServiceWithBadProbabilityForQuic) {
bncc958faa2015-07-31 18:14:521360 MockRead http_reads[] = {
1361 MockRead("HTTP/1.1 200 OK\r\n"),
1362 MockRead("Alt-Svc: quic=\":443\";p=2\r\n\r\n"), MockRead("hello world"),
1363 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1364 MockRead(ASYNC, OK)};
1365
1366 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1367 0);
1368 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561369 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521370 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561371 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521372
1373 params_.alternative_service_probability_threshold = 0.75;
1374 CreateSessionWithNextProtos();
1375
1376 SendRequestAndExpectHttpResponse("hello world");
1377 SendRequestAndExpectHttpResponse("hello world");
1378}
1379
1380TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) {
bncc958faa2015-07-31 18:14:521381 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561382 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1383 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521384 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1385 MockRead(ASYNC, OK)};
1386
1387 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1388 0);
1389 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561390 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521391
1392 MockQuicData mock_quic_data;
1393 mock_quic_data.AddWrite(
1394 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561395 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521396 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1397 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1398 mock_quic_data.AddRead(
1399 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1400 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1401 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
1402
1403 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1404
1405 AddHangingNonAlternateProtocolSocketData();
1406 CreateSessionWithNextProtos();
1407
1408 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1409 SendRequestAndExpectHttpResponse("hello world");
1410}
1411
[email protected]1e960032013-12-20 19:00:201412TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
[email protected]aa9b14d2013-05-10 23:45:191413 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561414 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1415 MockRead("hello world"),
1416 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1417 MockRead(ASYNC, OK)};
[email protected]61a527782013-02-21 03:58:001418
rjshaded5ced072015-12-18 19:26:021419 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1420 0);
[email protected]aa9b14d2013-05-10 23:45:191421 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561422 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]61a527782013-02-21 03:58:001423
[email protected]1e960032013-12-20 19:00:201424 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031425 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051426 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561427 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021428 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1429 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031430 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051431 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031432 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501433 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591434 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]61a527782013-02-21 03:58:001435
rcha5399e02015-04-21 19:32:041436 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]61a527782013-02-21 03:58:001437
[email protected]aa9b14d2013-05-10 23:45:191438 // The non-alternate protocol job needs to hang in order to guarantee that
1439 // the alternate-protocol job will "win".
1440 AddHangingNonAlternateProtocolSocketData();
[email protected]61a527782013-02-21 03:58:001441
[email protected]d7599122014-05-24 03:37:231442 CreateSessionWithNextProtos();
[email protected]61a527782013-02-21 03:58:001443
[email protected]aa9b14d2013-05-10 23:45:191444 SendRequestAndExpectHttpResponse("hello world");
1445 SendRequestAndExpectQuicResponse("hello!");
[email protected]61a527782013-02-21 03:58:001446}
1447
bnc62a44f022015-04-02 15:59:411448TEST_P(QuicNetworkTransactionTest, AlternateProtocolDifferentPort) {
1449 MockRead http_reads[] = {
1450 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561451 MockRead(kQuicAlternateProtocolDifferentPortHeader),
bnc62a44f022015-04-02 15:59:411452 MockRead("hello world"),
1453 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1454 MockRead(ASYNC, OK)};
1455
1456 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1457 0);
1458 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561459 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bnc62a44f022015-04-02 15:59:411460
1461 MockQuicData mock_quic_data;
1462 mock_quic_data.AddWrite(
1463 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561464 GetRequestHeaders("GET", "https", "/")));
bnc62a44f022015-04-02 15:59:411465 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1466 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1467 mock_quic_data.AddRead(
1468 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1469 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501470 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591471 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc62a44f022015-04-02 15:59:411472
rcha5399e02015-04-21 19:32:041473 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bnc62a44f022015-04-02 15:59:411474
1475 // The non-alternate protocol job needs to hang in order to guarantee that
1476 // the alternate-protocol job will "win".
1477 AddHangingNonAlternateProtocolSocketData();
1478
1479 CreateSessionWithNextProtos();
1480
1481 SendRequestAndExpectHttpResponse("hello world");
1482 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
1483}
1484
bncc958faa2015-07-31 18:14:521485TEST_P(QuicNetworkTransactionTest, ConfirmAlternateProtocol) {
bncae8db8402015-03-26 20:13:501486 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561487 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
bncae8db8402015-03-26 20:13:501488 MockRead("hello world"),
1489 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1490 MockRead(ASYNC, OK)};
1491
1492 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1493 0);
1494 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561495 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncae8db8402015-03-26 20:13:501496
1497 MockQuicData mock_quic_data;
1498 mock_quic_data.AddWrite(
1499 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561500 GetRequestHeaders("GET", "https", "/")));
bncae8db8402015-03-26 20:13:501501 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1502 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1503 mock_quic_data.AddRead(
1504 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1505 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501506 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1507 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncae8db8402015-03-26 20:13:501508
rcha5399e02015-04-21 19:32:041509 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bncae8db8402015-03-26 20:13:501510
1511 // The non-alternate protocol job needs to hang in order to guarantee that
1512 // the alternate-protocol job will "win".
1513 AddHangingNonAlternateProtocolSocketData();
1514
1515 CreateSessionWithNextProtos();
1516
1517 AlternativeService alternative_service(QUIC,
1518 HostPortPair::FromURL(request_.url));
bnc6be245c12015-05-15 11:24:071519 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
bncae8db8402015-03-26 20:13:501520 alternative_service);
bnc6be245c12015-05-15 11:24:071521 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1522 alternative_service));
bncae8db8402015-03-26 20:13:501523
1524 SendRequestAndExpectHttpResponse("hello world");
1525 SendRequestAndExpectQuicResponse("hello!");
1526
mmenkee24011922015-12-17 22:12:591527 mock_quic_data.Resume();
rchb27683c2015-07-29 23:53:501528
bnc6be245c12015-05-15 11:24:071529 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1530 alternative_service));
bncae8db8402015-03-26 20:13:501531}
1532
[email protected]287d9412014-07-08 23:01:001533TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolProbabilityForQuic) {
1534 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561535 MockRead("HTTP/1.1 200 OK\r\n"),
1536 MockRead(kQuicAlternateProtocol50pctHeader), MockRead("hello world"),
1537 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1538 MockRead(ASYNC, OK)};
[email protected]287d9412014-07-08 23:01:001539
rjshaded5ced072015-12-18 19:26:021540 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1541 0);
[email protected]287d9412014-07-08 23:01:001542 socket_factory_.AddSocketDataProvider(&http_data);
1543
1544 MockQuicData mock_quic_data;
1545 mock_quic_data.AddWrite(
1546 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561547 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021548 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1549 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]287d9412014-07-08 23:01:001550 mock_quic_data.AddRead(
1551 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1552 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501553 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591554 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]287d9412014-07-08 23:01:001555
rcha5399e02015-04-21 19:32:041556 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]287d9412014-07-08 23:01:001557
1558 // The non-alternate protocol job needs to hang in order to guarantee that
1559 // the alternate-protocol job will "win".
1560 AddHangingNonAlternateProtocolSocketData();
1561
bnc62891a52015-04-27 14:14:121562 params_.alternative_service_probability_threshold = .25;
[email protected]287d9412014-07-08 23:01:001563 CreateSessionWithNextProtos();
1564
1565 SendRequestAndExpectHttpResponse("hello world");
1566 SendRequestAndExpectQuicResponse("hello!");
1567}
1568
1569TEST_P(QuicNetworkTransactionTest, DontUseAlternateProtocolProbabilityForQuic) {
1570 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561571 MockRead("HTTP/1.1 200 OK\r\n"),
1572 MockRead(kQuicAlternateProtocol50pctHeader), MockRead("hello world"),
1573 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1574 MockRead(ASYNC, OK)};
[email protected]287d9412014-07-08 23:01:001575
rjshaded5ced072015-12-18 19:26:021576 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1577 0);
[email protected]287d9412014-07-08 23:01:001578 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561579 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001580 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561581 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001582
bnc62891a52015-04-27 14:14:121583 params_.alternative_service_probability_threshold = .75;
[email protected]287d9412014-07-08 23:01:001584 CreateSessionWithNextProtos();
1585
1586 SendRequestAndExpectHttpResponse("hello world");
1587 SendRequestAndExpectHttpResponse("hello world");
1588}
1589
1590TEST_P(QuicNetworkTransactionTest,
1591 DontUseAlternateProtocolWithBadProbabilityForQuic) {
1592 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021593 MockRead("HTTP/1.1 200 OK\r\n"),
1594 MockRead("Alternate-Protocol: 443:quic,p=2\r\n\r\n"),
1595 MockRead("hello world"),
1596 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1597 MockRead(ASYNC, OK)};
[email protected]287d9412014-07-08 23:01:001598
rjshaded5ced072015-12-18 19:26:021599 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1600 0);
[email protected]287d9412014-07-08 23:01:001601 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561602 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001603 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561604 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001605
bnc62891a52015-04-27 14:14:121606 params_.alternative_service_probability_threshold = .75;
[email protected]287d9412014-07-08 23:01:001607 CreateSessionWithNextProtos();
1608
1609 SendRequestAndExpectHttpResponse("hello world");
1610 SendRequestAndExpectHttpResponse("hello world");
1611}
1612
[email protected]1e960032013-12-20 19:00:201613TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) {
[email protected]6d1b4ed2013-07-10 03:57:541614 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561615 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1616 MockRead("hello world"),
1617 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1618 MockRead(ASYNC, OK)};
[email protected]6d1b4ed2013-07-10 03:57:541619
rjshaded5ced072015-12-18 19:26:021620 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1621 0);
[email protected]6d1b4ed2013-07-10 03:57:541622 socket_factory_.AddSocketDataProvider(&http_data);
1623
[email protected]1e960032013-12-20 19:00:201624 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031625 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051626 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561627 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021628 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1629 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031630 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051631 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031632 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501633 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591634 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]6d1b4ed2013-07-10 03:57:541635
rcha5399e02015-04-21 19:32:041636 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]6d1b4ed2013-07-10 03:57:541637
1638 // The non-alternate protocol job needs to hang in order to guarantee that
1639 // the alternate-protocol job will "win".
1640 AddHangingNonAlternateProtocolSocketData();
1641
[email protected]d7599122014-05-24 03:37:231642 CreateSessionWithNextProtos();
[email protected]6d1b4ed2013-07-10 03:57:541643
1644 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1645 SendRequestAndExpectHttpResponse("hello world");
1646}
1647
bnccb7ff3c2015-05-21 20:51:551648class QuicAltSvcCertificateVerificationTest
1649 : public QuicNetworkTransactionTest {
1650 public:
1651 void Run(bool valid) {
1652 HostPortPair origin(valid ? "mail.example.org" : "invalid.example.org",
1653 443);
1654 HostPortPair alternative("www.example.org", 443);
1655 std::string url("https://");
1656 url.append(origin.host());
1657 url.append(":443");
1658 request_.url = GURL(url);
1659
1660 maker_.set_hostname(origin.host());
1661 MockQuicData mock_quic_data;
1662 mock_quic_data.AddWrite(
1663 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1664 GetRequestHeaders("GET", "https", "/")));
1665 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1666 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1667 mock_quic_data.AddRead(
1668 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1669 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591670 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
bnccb7ff3c2015-05-21 20:51:551671 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1672
1673 scoped_refptr<X509Certificate> cert(
1674 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
1675 ASSERT_TRUE(cert.get());
1676 bool common_name_fallback_used;
1677 EXPECT_EQ(valid,
1678 cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
1679 EXPECT_TRUE(
1680 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
1681 ProofVerifyDetailsChromium verify_details;
1682 verify_details.cert_verify_result.verified_cert = cert;
1683 verify_details.cert_verify_result.is_issued_by_known_root = true;
1684 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1685 crypto_client_stream_factory_.set_handshake_mode(
1686 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1687
1688 // Connection to |origin| fails, so that success of |request| depends on
1689 // connection to |alternate| only.
1690 MockConnect refused_connect(ASYNC, ERR_CONNECTION_REFUSED);
1691 StaticSocketDataProvider refused_data;
1692 refused_data.set_connect_data(refused_connect);
1693 socket_factory_.AddSocketDataProvider(&refused_data);
1694
1695 CreateSessionWithNextProtos();
1696 AlternativeService alternative_service(QUIC, alternative);
bnc7dc7e1b42015-07-28 14:43:121697 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
bnccb7ff3c2015-05-21 20:51:551698 session_->http_server_properties()->SetAlternativeService(
bnc7dc7e1b42015-07-28 14:43:121699 origin, alternative_service, 1.0, expiration);
bnccb7ff3c2015-05-21 20:51:551700 scoped_ptr<HttpNetworkTransaction> trans(
1701 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1702 TestCompletionCallback callback;
1703 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1704 EXPECT_EQ(ERR_IO_PENDING, rv);
1705 rv = callback.WaitForResult();
1706 if (valid) {
1707 EXPECT_EQ(OK, rv);
1708 CheckWasQuicResponse(trans);
1709 CheckResponsePort(trans, 443);
1710 CheckResponseData(trans, "hello!");
1711 } else {
1712 EXPECT_EQ(ERR_CONNECTION_REFUSED, rv);
1713 }
1714 }
1715};
1716
1717INSTANTIATE_TEST_CASE_P(Version,
1718 QuicAltSvcCertificateVerificationTest,
1719 ::testing::ValuesIn(QuicSupportedVersions()));
1720
1721TEST_P(QuicAltSvcCertificateVerificationTest,
1722 RequestSucceedsWithValidCertificate) {
1723 Run(true);
1724}
1725
1726TEST_P(QuicAltSvcCertificateVerificationTest,
1727 RequestFailsWithInvalidCertificate) {
1728 Run(false);
1729}
1730
[email protected]1e960032013-12-20 19:00:201731TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) {
[email protected]dda75ab2013-06-22 22:43:301732 crypto_client_stream_factory_.set_handshake_mode(
1733 MockCryptoClientStream::COLD_START);
1734
1735 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561736 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
1737 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.com\r\n"),
1738 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")};
[email protected]dda75ab2013-06-22 22:43:301739
1740 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561741 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1742 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1743 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]dda75ab2013-06-22 22:43:301744
mmenke651bae7f2015-12-18 21:26:451745 MockClientSocketFactory socket_factory;
[email protected]dda75ab2013-06-22 22:43:301746
mmenke651bae7f2015-12-18 21:26:451747 SequencedSocketData http_data(http_reads, arraysize(http_reads), http_writes,
1748 arraysize(http_writes));
[email protected]dda75ab2013-06-22 22:43:301749 socket_factory.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561750 socket_factory.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301751
1752 // The QUIC transaction will not be allowed to complete.
mmenke651bae7f2015-12-18 21:26:451753 MockWrite quic_writes[] = {MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 1)};
[email protected]dda75ab2013-06-22 22:43:301754 MockRead quic_reads[] = {
mmenke651bae7f2015-12-18 21:26:451755 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0),
[email protected]dda75ab2013-06-22 22:43:301756 };
mmenke651bae7f2015-12-18 21:26:451757 SequencedSocketData quic_data(quic_reads, arraysize(quic_reads), quic_writes,
1758 arraysize(quic_writes));
[email protected]dda75ab2013-06-22 22:43:301759 socket_factory.AddSocketDataProvider(&quic_data);
1760
1761 // The HTTP transaction will complete.
mmenke651bae7f2015-12-18 21:26:451762 SequencedSocketData http_data2(http_reads, arraysize(http_reads), http_writes,
1763 arraysize(http_writes));
[email protected]dda75ab2013-06-22 22:43:301764 socket_factory.AddSocketDataProvider(&http_data2);
rchf114d982015-10-21 01:34:561765 socket_factory.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301766
[email protected]d7599122014-05-24 03:37:231767 CreateSessionWithFactory(&socket_factory, true);
[email protected]dda75ab2013-06-22 22:43:301768
1769 // Run the first request.
[email protected]dda75ab2013-06-22 22:43:301770 SendRequestAndExpectHttpResponse("hello world");
rch37de576c2015-05-17 20:28:171771 ASSERT_TRUE(http_data.AllReadDataConsumed());
1772 ASSERT_TRUE(http_data.AllWriteDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301773
1774 // Now run the second request in which the QUIC socket hangs,
1775 // and verify the the transaction continues over HTTP.
[email protected]dda75ab2013-06-22 22:43:301776 SendRequestAndExpectHttpResponse("hello world");
mmenke651bae7f2015-12-18 21:26:451777 base::RunLoop().RunUntilIdle();
[email protected]dda75ab2013-06-22 22:43:301778
rch37de576c2015-05-17 20:28:171779 ASSERT_TRUE(http_data2.AllReadDataConsumed());
1780 ASSERT_TRUE(http_data2.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:451781 ASSERT_TRUE(quic_data.AllReadDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301782}
1783
[email protected]1e960032013-12-20 19:00:201784TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
[email protected]1e960032013-12-20 19:00:201785 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031786 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051787 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561788 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021789 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1790 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031791 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051792 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031793 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501794 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591795 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]8ba81212013-05-03 13:11:481796
rcha5399e02015-04-21 19:32:041797 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]8ba81212013-05-03 13:11:481798
[email protected]3a120a6b2013-06-25 01:08:271799 // The non-alternate protocol job needs to hang in order to guarantee that
1800 // the alternate-protocol job will "win".
[email protected]dda75ab2013-06-22 22:43:301801 AddHangingNonAlternateProtocolSocketData();
1802
[email protected]d7599122014-05-24 03:37:231803 CreateSessionWithNextProtos();
[email protected]aa9b14d2013-05-10 23:45:191804 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1805 SendRequestAndExpectQuicResponse("hello!");
[email protected]8ba81212013-05-03 13:11:481806}
1807
[email protected]1e960032013-12-20 19:00:201808TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
[email protected]1e960032013-12-20 19:00:201809 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031810 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051811 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561812 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021813 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1814 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031815 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051816 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031817 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501818 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591819 mock_quic_data.AddRead(ASYNC, 0); // EOF
rcha5399e02015-04-21 19:32:041820 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]3a120a6b2013-06-25 01:08:271821
1822 // In order for a new QUIC session to be established via alternate-protocol
1823 // without racing an HTTP connection, we need the host resolution to happen
1824 // synchronously.
1825 host_resolver_.set_synchronous_mode(true);
rchf114d982015-10-21 01:34:561826 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1827 "");
1828 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
[email protected]3a120a6b2013-06-25 01:08:271829 AddressList address;
rjshaded5ced072015-12-18 19:26:021830 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1831 nullptr, net_log_.bound());
[email protected]3a120a6b2013-06-25 01:08:271832
[email protected]d7599122014-05-24 03:37:231833 CreateSessionWithNextProtos();
[email protected]3a120a6b2013-06-25 01:08:271834 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1835 SendRequestAndExpectQuicResponse("hello!");
1836}
1837
[email protected]0fc924b2014-03-31 04:34:151838TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) {
rdsmith82957ad2015-09-16 19:42:031839 proxy_service_ = ProxyService::CreateFixedFromPacResult("PROXY myproxy:70");
[email protected]0fc924b2014-03-31 04:34:151840
1841 // Since we are using a proxy, the QUIC job will not succeed.
1842 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561843 MockWrite(SYNCHRONOUS, 0, "GET http://mail.example.com/ HTTP/1.1\r\n"),
1844 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.com\r\n"),
1845 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")};
[email protected]0fc924b2014-03-31 04:34:151846
1847 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561848 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1849 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1850 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]0fc924b2014-03-31 04:34:151851
1852 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
1853 http_writes, arraysize(http_writes));
1854 socket_factory_.AddSocketDataProvider(&http_data);
1855
1856 // In order for a new QUIC session to be established via alternate-protocol
1857 // without racing an HTTP connection, we need the host resolution to happen
1858 // synchronously.
1859 host_resolver_.set_synchronous_mode(true);
rchf114d982015-10-21 01:34:561860 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1861 "");
1862 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
[email protected]0fc924b2014-03-31 04:34:151863 AddressList address;
rjshaded5ced072015-12-18 19:26:021864 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1865 nullptr, net_log_.bound());
[email protected]0fc924b2014-03-31 04:34:151866
rchf114d982015-10-21 01:34:561867 request_.url = GURL("http://mail.example.com/");
[email protected]d7599122014-05-24 03:37:231868 CreateSessionWithNextProtos();
[email protected]0fc924b2014-03-31 04:34:151869 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1870 SendRequestAndExpectHttpResponse("hello world");
1871}
1872
[email protected]1e960032013-12-20 19:00:201873TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
[email protected]1e960032013-12-20 19:00:201874 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031875 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051876 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561877 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021878 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1879 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031880 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051881 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031882 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591883 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
rcha5399e02015-04-21 19:32:041884 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]11c05872013-08-20 02:04:121885
1886 // The non-alternate protocol job needs to hang in order to guarantee that
1887 // the alternate-protocol job will "win".
1888 AddHangingNonAlternateProtocolSocketData();
1889
1890 // In order for a new QUIC session to be established via alternate-protocol
1891 // without racing an HTTP connection, we need the host resolution to happen
1892 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1893 // connection to the the server, in this test we require confirmation
1894 // before encrypting so the HTTP job will still start.
1895 host_resolver_.set_synchronous_mode(true);
rchf114d982015-10-21 01:34:561896 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1897 "");
1898 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
[email protected]11c05872013-08-20 02:04:121899 AddressList address;
rjshaded5ced072015-12-18 19:26:021900 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1901 nullptr, net_log_.bound());
[email protected]11c05872013-08-20 02:04:121902
[email protected]d7599122014-05-24 03:37:231903 CreateSessionWithNextProtos();
[email protected]11c05872013-08-20 02:04:121904 session_->quic_stream_factory()->set_require_confirmation(true);
1905 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1906
1907 scoped_ptr<HttpNetworkTransaction> trans(
1908 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1909 TestCompletionCallback callback;
1910 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1911 EXPECT_EQ(ERR_IO_PENDING, rv);
1912
1913 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1914 QuicSession::HANDSHAKE_CONFIRMED);
1915 EXPECT_EQ(OK, callback.WaitForResult());
rchb27683c2015-07-29 23:53:501916
1917 CheckWasQuicResponse(trans);
1918 CheckResponseData(trans, "hello!");
[email protected]11c05872013-08-20 02:04:121919}
1920
zhongyica364fbb2015-12-12 03:39:121921TEST_P(QuicNetworkTransactionTest,
1922 LogGranularQuicErrorCodeOnQuicProtocolErrorLocal) {
1923 MockQuicData mock_quic_data;
1924 mock_quic_data.AddWrite(
1925 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1926 GetRequestHeaders("GET", "https", "/")));
1927 // Read a close connection packet with
1928 // QuicErrorCode: QUIC_CRYPTO_VERSION_NOT_SUPPORTED from the peer.
1929 mock_quic_data.AddRead(ConstructConnectionClosePacket(1));
1930 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1931
1932 // The non-alternate protocol job needs to hang in order to guarantee that
1933 // the alternate-protocol job will "win".
1934 AddHangingNonAlternateProtocolSocketData();
1935
1936 // In order for a new QUIC session to be established via alternate-protocol
1937 // without racing an HTTP connection, we need the host resolution to happen
1938 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1939 // connection to the the server, in this test we require confirmation
1940 // before encrypting so the HTTP job will still start.
1941 host_resolver_.set_synchronous_mode(true);
1942 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1943 "");
1944 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
1945 AddressList address;
1946 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1947 nullptr, net_log_.bound());
1948
1949 CreateSessionWithNextProtos();
1950 session_->quic_stream_factory()->set_require_confirmation(true);
1951 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1952
1953 scoped_ptr<HttpNetworkTransaction> trans(
1954 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1955 TestCompletionCallback callback;
1956 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1957 EXPECT_EQ(ERR_IO_PENDING, rv);
1958
1959 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1960 QuicSession::HANDSHAKE_CONFIRMED);
1961 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
1962
1963 NetErrorDetails details;
1964 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1965
1966 trans->PopulateNetErrorDetails(&details);
1967 // Verify the error code logged is what sent by the peer.
1968 EXPECT_EQ(QUIC_CRYPTO_VERSION_NOT_SUPPORTED, details.quic_connection_error);
1969}
1970
1971TEST_P(QuicNetworkTransactionTest,
1972 LogGranularQuicErrorCodeOnQuicProtocolErrorRemote) {
1973 MockQuicData mock_quic_data;
1974 mock_quic_data.AddWrite(
1975 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1976 GetRequestHeaders("GET", "https", "/")));
1977 // Peer sending an invalid stream frame with a invalid stream error causes
1978 // this end to raise error and close connection.
1979 mock_quic_data.AddRead(ConstructRstPacket(1, false, kClientDataStreamId1,
1980 QUIC_STREAM_LAST_ERROR));
1981 std::string quic_error_details = "Invalid rst stream error code.";
1982 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(
1983 2, QuicTime::Delta::Infinite(), 0, 1, QUIC_INVALID_RST_STREAM_DATA,
1984 quic_error_details));
1985 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1986
1987 // The non-alternate protocol job needs to hang in order to guarantee that
1988 // the alternate-protocol job will "win".
1989 AddHangingNonAlternateProtocolSocketData();
1990
1991 // In order for a new QUIC session to be established via alternate-protocol
1992 // without racing an HTTP connection, we need the host resolution to happen
1993 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1994 // connection to the the server, in this test we require confirmation
1995 // before encrypting so the HTTP job will still start.
1996 host_resolver_.set_synchronous_mode(true);
1997 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1998 "");
1999 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
2000 AddressList address;
2001 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2002 nullptr, net_log_.bound());
2003
2004 CreateSessionWithNextProtos();
2005 session_->quic_stream_factory()->set_require_confirmation(true);
2006 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2007
2008 scoped_ptr<HttpNetworkTransaction> trans(
2009 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2010 TestCompletionCallback callback;
2011 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2012 EXPECT_EQ(ERR_IO_PENDING, rv);
2013
2014 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
2015 QuicSession::HANDSHAKE_CONFIRMED);
2016 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
2017 NetErrorDetails details;
2018 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
2019
2020 trans->PopulateNetErrorDetails(&details);
2021 EXPECT_EQ(QUIC_INVALID_RST_STREAM_DATA, details.quic_connection_error);
2022}
2023
[email protected]1e960032013-12-20 19:00:202024TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
[email protected]3316d422013-05-03 21:45:302025 // Alternate-protocol job
2026 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1));
2027 MockRead quic_reads[] = {
rchb27683c2015-07-29 23:53:502028 MockRead(ASYNC, close->data(), close->length()),
2029 MockRead(ASYNC, ERR_IO_PENDING), // No more data to read
2030 MockRead(ASYNC, OK), // EOF
[email protected]3316d422013-05-03 21:45:302031 };
rjshaded5ced072015-12-18 19:26:022032 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2033 0);
[email protected]3316d422013-05-03 21:45:302034 socket_factory_.AddSocketDataProvider(&quic_data);
2035
2036 // Main job which will succeed even though the alternate job fails.
2037 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022038 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2039 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2040 MockRead(ASYNC, OK)};
[email protected]3316d422013-05-03 21:45:302041
rjshaded5ced072015-12-18 19:26:022042 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2043 0);
[email protected]3316d422013-05-03 21:45:302044 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562045 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]3316d422013-05-03 21:45:302046
[email protected]d7599122014-05-24 03:37:232047 CreateSessionWithNextProtos();
[email protected]aa9b14d2013-05-10 23:45:192048 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2049 SendRequestAndExpectHttpResponse("hello from http");
2050 ExpectBrokenAlternateProtocolMapping();
[email protected]3316d422013-05-03 21:45:302051}
2052
[email protected]1e960032013-12-20 19:00:202053TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
[email protected]d03a66d2013-05-06 12:55:592054 // Alternate-protocol job
2055 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022056 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]d03a66d2013-05-06 12:55:592057 };
rjshaded5ced072015-12-18 19:26:022058 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2059 0);
[email protected]d03a66d2013-05-06 12:55:592060 socket_factory_.AddSocketDataProvider(&quic_data);
2061
2062 // Main job which will succeed even though the alternate job fails.
2063 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022064 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2065 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2066 MockRead(ASYNC, OK)};
[email protected]d03a66d2013-05-06 12:55:592067
rjshaded5ced072015-12-18 19:26:022068 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2069 0);
[email protected]d03a66d2013-05-06 12:55:592070 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562071 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]d03a66d2013-05-06 12:55:592072
[email protected]d7599122014-05-24 03:37:232073 CreateSessionWithNextProtos();
[email protected]d03a66d2013-05-06 12:55:592074
[email protected]aa9b14d2013-05-10 23:45:192075 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2076 SendRequestAndExpectHttpResponse("hello from http");
2077 ExpectBrokenAlternateProtocolMapping();
[email protected]d03a66d2013-05-06 12:55:592078}
2079
[email protected]00c159f2014-05-21 22:38:162080TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) {
[email protected]eb71ab62014-05-23 07:57:532081 // Alternate-protocol job will fail when the session attempts to read.
[email protected]00c159f2014-05-21 22:38:162082 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022083 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162084 };
rjshaded5ced072015-12-18 19:26:022085 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2086 0);
[email protected]00c159f2014-05-21 22:38:162087 socket_factory_.AddSocketDataProvider(&quic_data);
2088
[email protected]eb71ab62014-05-23 07:57:532089 // Main job will also fail.
[email protected]00c159f2014-05-21 22:38:162090 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022091 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162092 };
2093
rjshaded5ced072015-12-18 19:26:022094 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2095 0);
[email protected]00c159f2014-05-21 22:38:162096 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED));
2097 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562098 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]00c159f2014-05-21 22:38:162099
[email protected]d7599122014-05-24 03:37:232100 CreateSessionWithNextProtos();
[email protected]00c159f2014-05-21 22:38:162101
2102 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2103 scoped_ptr<HttpNetworkTransaction> trans(
2104 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2105 TestCompletionCallback callback;
2106 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2107 EXPECT_EQ(ERR_IO_PENDING, rv);
2108 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult());
2109 ExpectQuicAlternateProtocolMapping();
2110}
2111
[email protected]1e960032013-12-20 19:00:202112TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
[email protected]77c6c162013-08-17 02:57:452113 // Alternate-protocol job
2114 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022115 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]77c6c162013-08-17 02:57:452116 };
rjshaded5ced072015-12-18 19:26:022117 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2118 0);
[email protected]77c6c162013-08-17 02:57:452119 socket_factory_.AddSocketDataProvider(&quic_data);
2120
2121 AddHangingNonAlternateProtocolSocketData();
2122
[email protected]c92c1b52014-05-31 04:16:062123 // Second Alternate-protocol job which will race with the TCP job.
2124 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:422125 nullptr, 0);
[email protected]c92c1b52014-05-31 04:16:062126 socket_factory_.AddSocketDataProvider(&quic_data2);
2127
[email protected]4d283b32013-10-17 12:57:272128 // Final job that will proceed when the QUIC job fails.
2129 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022130 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2131 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2132 MockRead(ASYNC, OK)};
[email protected]4d283b32013-10-17 12:57:272133
rjshaded5ced072015-12-18 19:26:022134 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2135 0);
[email protected]4d283b32013-10-17 12:57:272136 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562137 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d283b32013-10-17 12:57:272138
[email protected]d7599122014-05-24 03:37:232139 CreateSessionWithNextProtos();
[email protected]77c6c162013-08-17 02:57:452140
2141 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2142
[email protected]4d283b32013-10-17 12:57:272143 SendRequestAndExpectHttpResponse("hello from http");
[email protected]77c6c162013-08-17 02:57:452144
2145 ExpectBrokenAlternateProtocolMapping();
[email protected]4d283b32013-10-17 12:57:272146
rch37de576c2015-05-17 20:28:172147 EXPECT_TRUE(quic_data.AllReadDataConsumed());
2148 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
[email protected]77c6c162013-08-17 02:57:452149}
2150
[email protected]93b31772014-06-19 08:03:352151TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) {
[email protected]65768442014-06-06 23:37:032152 // Alternate-protocol job
2153 MockRead quic_reads[] = {
mmenkee24011922015-12-17 22:12:592154 MockRead(SYNCHRONOUS, ERR_IO_PENDING),
[email protected]65768442014-06-06 23:37:032155 };
rjshaded5ced072015-12-18 19:26:022156 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2157 0);
[email protected]65768442014-06-06 23:37:032158 socket_factory_.AddSocketDataProvider(&quic_data);
2159
2160 // Main job that will proceed when the QUIC job fails.
2161 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022162 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2163 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2164 MockRead(ASYNC, OK)};
[email protected]65768442014-06-06 23:37:032165
rjshaded5ced072015-12-18 19:26:022166 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2167 0);
[email protected]65768442014-06-06 23:37:032168 socket_factory_.AddSocketDataProvider(&http_data);
2169
2170 CreateSessionWithNextProtos();
2171
2172 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2173
2174 SendRequestAndExpectHttpResponse("hello from http");
2175}
2176
[email protected]eb71ab62014-05-23 07:57:532177TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
[email protected]4d590c9c2014-05-02 05:14:332178 // Alternate-protocol job will fail before creating a QUIC session.
rtennetibe635732014-10-02 22:51:422179 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0);
rjshaded5ced072015-12-18 19:26:022180 quic_data.set_connect_data(
2181 MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED));
[email protected]4d590c9c2014-05-02 05:14:332182 socket_factory_.AddSocketDataProvider(&quic_data);
2183
2184 // Main job which will succeed even though the alternate job fails.
2185 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022186 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2187 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2188 MockRead(ASYNC, OK)};
[email protected]4d590c9c2014-05-02 05:14:332189
rjshaded5ced072015-12-18 19:26:022190 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2191 0);
[email protected]4d590c9c2014-05-02 05:14:332192 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562193 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d590c9c2014-05-02 05:14:332194
[email protected]d7599122014-05-24 03:37:232195 CreateSessionWithNextProtos();
[email protected]4d590c9c2014-05-02 05:14:332196 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2197 SendRequestAndExpectHttpResponse("hello from http");
[email protected]eb71ab62014-05-23 07:57:532198
2199 ExpectBrokenAlternateProtocolMapping();
[email protected]4d590c9c2014-05-02 05:14:332200}
2201
[email protected]4fee9672014-01-08 14:47:152202TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
[email protected]4fee9672014-01-08 14:47:152203 MockQuicData mock_quic_data;
rcha5399e02015-04-21 19:32:042204 mock_quic_data.AddSynchronousRead(ConstructConnectionClosePacket(1));
[email protected]92bf17c2014-03-03 21:14:032205 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:052206 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:562207 GetRequestHeaders("GET", "https", "/")));
[email protected]92bf17c2014-03-03 21:14:032208 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rcha5399e02015-04-21 19:32:042209 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4fee9672014-01-08 14:47:152210
2211 // When the QUIC connection fails, we will try the request again over HTTP.
2212 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:562213 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
2214 MockRead("hello world"),
2215 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2216 MockRead(ASYNC, OK)};
[email protected]4fee9672014-01-08 14:47:152217
rjshaded5ced072015-12-18 19:26:022218 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2219 0);
[email protected]4fee9672014-01-08 14:47:152220 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562221 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4fee9672014-01-08 14:47:152222
2223 // In order for a new QUIC session to be established via alternate-protocol
2224 // without racing an HTTP connection, we need the host resolution to happen
2225 // synchronously.
2226 host_resolver_.set_synchronous_mode(true);
rchf114d982015-10-21 01:34:562227 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
2228 "");
2229 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
[email protected]4fee9672014-01-08 14:47:152230 AddressList address;
rjshaded5ced072015-12-18 19:26:022231 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2232 nullptr, net_log_.bound());
[email protected]4fee9672014-01-08 14:47:152233
[email protected]d7599122014-05-24 03:37:232234 CreateSessionWithNextProtos();
[email protected]4fee9672014-01-08 14:47:152235 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2236 SendRequestAndExpectHttpResponse("hello world");
2237}
2238
bnc508835902015-05-12 20:10:292239TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) {
bncb07c05532015-05-14 19:07:202240 maker_.set_hostname("www.example.org");
tbansalc8a94ea2015-11-02 23:58:512241 EXPECT_FALSE(rtt_observer_.rtt_notification_received());
bnc508835902015-05-12 20:10:292242 MockQuicData mock_quic_data;
2243 mock_quic_data.AddWrite(
2244 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
2245 GetRequestHeaders("GET", "https", "/")));
2246 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
2247 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
2248 mock_quic_data.AddRead(
2249 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
2250 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:502251 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
bnc508835902015-05-12 20:10:292252 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2253
bncb07c05532015-05-14 19:07:202254 request_.url = GURL("https://www.example.org:443");
bnc508835902015-05-12 20:10:292255 AddHangingNonAlternateProtocolSocketData();
2256 CreateSessionWithNextProtos();
2257 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
2258 SendRequestAndExpectQuicResponse("hello!");
tbansalc8a94ea2015-11-02 23:58:512259 EXPECT_TRUE(rtt_observer_.rtt_notification_received());
bnc508835902015-05-12 20:10:292260}
2261
[email protected]61a527782013-02-21 03:58:002262} // namespace test
2263} // namespace net