blob: 75de4aad0428e2b01f307237b50ecb768a8732c9 [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
danakjad1777e2016-04-16 00:56:425#include <memory>
bnc912a04b2016-04-20 14:19:506#include <string>
7#include <utility>
[email protected]1e960032013-12-20 19:00:208#include <vector>
9
[email protected]61a527782013-02-21 03:58:0010#include "base/compiler_specific.h"
Avi Drissman13fc8932015-12-20 04:40:4611#include "base/macros.h"
mmenke651bae7f2015-12-18 21:26:4512#include "base/run_loop.h"
[email protected]98b20ce2013-05-10 05:55:2613#include "base/stl_util.h"
bnc8be55ebb2015-10-30 14:12:0714#include "base/strings/stringprintf.h"
rtenneti56977812016-01-15 19:26:5615#include "net/base/chunked_upload_data_stream.h"
tbansalfdf5665b2015-09-21 22:46:4016#include "net/base/socket_performance_watcher.h"
tbansal0f56a39a2016-04-07 22:03:3817#include "net/base/socket_performance_watcher_factory.h"
[email protected]61a527782013-02-21 03:58:0018#include "net/base/test_completion_callback.h"
bnc508835902015-05-12 20:10:2919#include "net/base/test_data_directory.h"
[email protected]6e7845ae2013-03-29 21:48:1120#include "net/cert/mock_cert_verifier.h"
rtenneti052774e2015-11-24 21:00:1221#include "net/cert/multi_log_ct_verifier.h"
[email protected]f2cb3cf2013-03-21 01:40:5322#include "net/dns/mock_host_resolver.h"
[email protected]61a527782013-02-21 03:58:0023#include "net/http/http_auth_handler_factory.h"
24#include "net/http/http_network_session.h"
25#include "net/http/http_network_transaction.h"
26#include "net/http/http_server_properties_impl.h"
27#include "net/http/http_stream.h"
28#include "net/http/http_stream_factory.h"
[email protected]c41737d2014-05-14 07:47:1929#include "net/http/http_transaction_test_util.h"
[email protected]b1c988b2013-06-13 06:48:1130#include "net/http/transport_security_state.h"
vishal.b62985ca92015-04-17 08:45:5131#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4632#include "net/log/test_net_log_entry.h"
33#include "net/log/test_net_log_util.h"
[email protected]61a527782013-02-21 03:58:0034#include "net/proxy/proxy_config_service_fixed.h"
35#include "net/proxy/proxy_resolver.h"
36#include "net/proxy/proxy_service.h"
bnc508835902015-05-12 20:10:2937#include "net/quic/crypto/proof_verifier_chromium.h"
[email protected]61a527782013-02-21 03:58:0038#include "net/quic/crypto/quic_decrypter.h"
39#include "net/quic/crypto/quic_encrypter.h"
40#include "net/quic/quic_framer.h"
[email protected]24e5bc52013-09-18 15:36:5841#include "net/quic/quic_http_utils.h"
[email protected]ed3fc15d2013-03-08 18:37:4442#include "net/quic/test_tools/crypto_test_utils.h"
[email protected]61a527782013-02-21 03:58:0043#include "net/quic/test_tools/mock_clock.h"
[email protected]e8ff26842013-03-22 21:02:0544#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
[email protected]61a527782013-02-21 03:58:0045#include "net/quic/test_tools/mock_random.h"
[email protected]1e960032013-12-20 19:00:2046#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]61a527782013-02-21 03:58:0047#include "net/quic/test_tools/quic_test_utils.h"
48#include "net/socket/client_socket_factory.h"
49#include "net/socket/mock_client_socket_pool_manager.h"
50#include "net/socket/socket_test_util.h"
51#include "net/socket/ssl_client_socket.h"
52#include "net/spdy/spdy_frame_builder.h"
53#include "net/spdy/spdy_framer.h"
[email protected]536fd0b2013-03-14 17:41:5754#include "net/ssl/ssl_config_service_defaults.h"
bnc508835902015-05-12 20:10:2955#include "net/test/cert_test_util.h"
[email protected]61a527782013-02-21 03:58:0056#include "testing/gtest/include/gtest/gtest.h"
57#include "testing/platform_test.h"
zhongyi3d4a55e72016-04-22 20:36:4658#include "url/gurl.h"
[email protected]61a527782013-02-21 03:58:0059
bnc508835902015-05-12 20:10:2960namespace net {
61namespace test {
[email protected]61a527782013-02-21 03:58:0062
63namespace {
64
rchf114d982015-10-21 01:34:5665static const char kQuicAlternateProtocolHeader[] =
[email protected]6d1b4ed2013-07-10 03:57:5466 "Alternate-Protocol: 443:quic\r\n\r\n";
rchf47265dc2016-03-21 21:33:1267static const char kQuicAlternateProtocolWithProbabilityHeader[] =
68 "Alternate-Protocol: 443:quic,p=.5\r\n\r\n";
rchf114d982015-10-21 01:34:5669static const char kQuicAlternateProtocolDifferentPortHeader[] =
70 "Alternate-Protocol: 137:quic\r\n\r\n";
71static const char kQuicAlternativeServiceHeader[] =
bncc958faa2015-07-31 18:14:5272 "Alt-Svc: quic=\":443\"\r\n\r\n";
rchf47265dc2016-03-21 21:33:1273static const char kQuicAlternativeServiceWithProbabilityHeader[] =
74 "Alt-Svc: quic=\":443\";p=\".5\"\r\n\r\n";
rchf114d982015-10-21 01:34:5675static const char kQuicAlternativeServiceDifferentPortHeader[] =
76 "Alt-Svc: quic=\":137\"\r\n\r\n";
[email protected]1e960032013-12-20 19:00:2077
rch9ae5b3b2016-02-11 00:36:2978const char kDefaultServerHostName[] = "mail.example.org";
bncb07c05532015-05-14 19:07:2079
[email protected]61a527782013-02-21 03:58:0080} // namespace
81
[email protected]1e960032013-12-20 19:00:2082// Helper class to encapsulate MockReads and MockWrites for QUIC.
83// Simplify ownership issues and the interaction with the MockSocketFactory.
84class MockQuicData {
85 public:
rtennetia004d332015-08-28 06:44:5786 MockQuicData() : packet_number_(0) {}
rcha5399e02015-04-21 19:32:0487
rjshaded5ced072015-12-18 19:26:0288 ~MockQuicData() { STLDeleteElements(&packets_); }
[email protected]1e960032013-12-20 19:00:2089
danakjad1777e2016-04-16 00:56:4290 void AddSynchronousRead(std::unique_ptr<QuicEncryptedPacket> packet) {
[email protected]1e960032013-12-20 19:00:2091 reads_.push_back(MockRead(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:5792 packet_number_++));
[email protected]1e960032013-12-20 19:00:2093 packets_.push_back(packet.release());
94 }
95
danakjad1777e2016-04-16 00:56:4296 void AddRead(std::unique_ptr<QuicEncryptedPacket> packet) {
rcha5399e02015-04-21 19:32:0497 reads_.push_back(
rtennetia004d332015-08-28 06:44:5798 MockRead(ASYNC, packet->data(), packet->length(), packet_number_++));
rcha5399e02015-04-21 19:32:0499 packets_.push_back(packet.release());
100 }
101
[email protected]1e960032013-12-20 19:00:20102 void AddRead(IoMode mode, int rv) {
rtennetia004d332015-08-28 06:44:57103 reads_.push_back(MockRead(mode, rv, packet_number_++));
[email protected]1e960032013-12-20 19:00:20104 }
105
danakjad1777e2016-04-16 00:56:42106 void AddWrite(std::unique_ptr<QuicEncryptedPacket> packet) {
[email protected]1e960032013-12-20 19:00:20107 writes_.push_back(MockWrite(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:57108 packet_number_++));
[email protected]1e960032013-12-20 19:00:20109 packets_.push_back(packet.release());
110 }
111
rcha5399e02015-04-21 19:32:04112 void AddSocketDataToFactory(MockClientSocketFactory* factory) {
rjshaded5ced072015-12-18 19:26:02113 MockRead* reads = reads_.empty() ? nullptr : &reads_[0];
114 MockWrite* writes = writes_.empty() ? nullptr : &writes_[0];
rcha5399e02015-04-21 19:32:04115 socket_data_.reset(
116 new SequencedSocketData(reads, reads_.size(), writes, writes_.size()));
[email protected]1e960032013-12-20 19:00:20117 factory->AddSocketDataProvider(socket_data_.get());
118 }
119
mmenkee24011922015-12-17 22:12:59120 void Resume() { socket_data_->Resume(); }
rchb27683c2015-07-29 23:53:50121
[email protected]1e960032013-12-20 19:00:20122 private:
123 std::vector<QuicEncryptedPacket*> packets_;
124 std::vector<MockWrite> writes_;
125 std::vector<MockRead> reads_;
rtennetia004d332015-08-28 06:44:57126 size_t packet_number_;
danakjad1777e2016-04-16 00:56:42127 std::unique_ptr<SequencedSocketData> socket_data_;
[email protected]1e960032013-12-20 19:00:20128};
129
tbansal7cec3812015-02-05 21:25:12130class ProxyHeadersHandler {
131 public:
132 ProxyHeadersHandler() : was_called_(false) {}
133
134 bool was_called() { return was_called_; }
135
136 void OnBeforeProxyHeadersSent(const ProxyInfo& proxy_info,
137 HttpRequestHeaders* request_headers) {
138 was_called_ = true;
139 }
140
141 private:
142 bool was_called_;
143};
144
tbansal0f56a39a2016-04-07 22:03:38145class TestSocketPerformanceWatcher : public SocketPerformanceWatcher {
tbansalfdf5665b2015-09-21 22:46:40146 public:
tbansal0f56a39a2016-04-07 22:03:38147 explicit TestSocketPerformanceWatcher(bool* rtt_notification_received)
148 : rtt_notification_received_(rtt_notification_received) {}
149 ~TestSocketPerformanceWatcher() override {}
tbansalfdf5665b2015-09-21 22:46:40150
tbansal0f56a39a2016-04-07 22:03:38151 bool ShouldNotifyUpdatedRTT() const override { return true; }
tbansalfdf5665b2015-09-21 22:46:40152
tbansal0f56a39a2016-04-07 22:03:38153 void OnUpdatedRTTAvailable(const base::TimeDelta& rtt) override {
154 *rtt_notification_received_ = true;
155 }
156
157 void OnConnectionChanged() override {}
158
159 private:
160 bool* rtt_notification_received_;
161
162 DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcher);
163};
164
165class TestSocketPerformanceWatcherFactory
166 : public SocketPerformanceWatcherFactory {
167 public:
168 TestSocketPerformanceWatcherFactory()
169 : watcher_count_(0u), rtt_notification_received_(false) {}
170 ~TestSocketPerformanceWatcherFactory() override {}
171
172 // SocketPerformanceWatcherFactory implementation:
danakjad1777e2016-04-16 00:56:42173 std::unique_ptr<SocketPerformanceWatcher> CreateSocketPerformanceWatcher(
tbansalc8a94ea2015-11-02 23:58:51174 const Protocol protocol) override {
175 if (protocol != PROTOCOL_QUIC) {
tbansal0f56a39a2016-04-07 22:03:38176 return nullptr;
tbansalc8a94ea2015-11-02 23:58:51177 }
178 ++watcher_count_;
danakjad1777e2016-04-16 00:56:42179 return std::unique_ptr<SocketPerformanceWatcher>(
tbansal0f56a39a2016-04-07 22:03:38180 new TestSocketPerformanceWatcher(&rtt_notification_received_));
tbansalfdf5665b2015-09-21 22:46:40181 }
182
tbansalc8a94ea2015-11-02 23:58:51183 size_t watcher_count() const { return watcher_count_; }
tbansalfdf5665b2015-09-21 22:46:40184
tbansalc8a94ea2015-11-02 23:58:51185 bool rtt_notification_received() const { return rtt_notification_received_; }
186
tbansalc8a94ea2015-11-02 23:58:51187 private:
tbansal0f56a39a2016-04-07 22:03:38188 size_t watcher_count_;
tbansalc8a94ea2015-11-02 23:58:51189 bool rtt_notification_received_;
tbansal0f56a39a2016-04-07 22:03:38190
191 DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcherFactory);
tbansalc8a94ea2015-11-02 23:58:51192};
193
[email protected]1e960032013-12-20 19:00:20194class QuicNetworkTransactionTest
195 : public PlatformTest,
[email protected]5d03bbd2014-03-07 16:19:16196 public ::testing::WithParamInterface<QuicVersion> {
[email protected]61a527782013-02-21 03:58:00197 protected:
[email protected]1c04f9522013-02-21 20:32:43198 QuicNetworkTransactionTest()
rtenneti4b06ae72014-08-26 03:43:43199 : clock_(new MockClock),
bncb07c05532015-05-14 19:07:20200 maker_(GetParam(), 0, clock_, kDefaultServerHostName),
rtenneti052774e2015-11-24 21:00:12201 cert_transparency_verifier_(new MultiLogCTVerifier()),
[email protected]1c04f9522013-02-21 20:32:43202 ssl_config_service_(new SSLConfigServiceDefaults),
203 proxy_service_(ProxyService::CreateDirect()),
204 auth_handler_factory_(
[email protected]dda75ab2013-06-22 22:43:30205 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
[email protected]457d6952013-12-13 09:24:58206 random_generator_(0),
rchf114d982015-10-21 01:34:56207 ssl_data_(ASYNC, OK) {
[email protected]aa9b14d2013-05-10 23:45:19208 request_.method = "GET";
rchf114d982015-10-21 01:34:56209 std::string url("https://");
bncb07c05532015-05-14 19:07:20210 url.append(kDefaultServerHostName);
211 request_.url = GURL(url);
[email protected]aa9b14d2013-05-10 23:45:19212 request_.load_flags = 0;
[email protected]98a9d1252014-04-04 00:43:59213 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
rchf114d982015-10-21 01:34:56214
rch3f4b8452016-02-23 16:59:32215 params_.parse_alternative_services = true;
216 params_.enable_alternative_service_with_different_host = true;
217
rchf114d982015-10-21 01:34:56218 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29219 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
rchf114d982015-10-21 01:34:56220 verify_details_.cert_verify_result.verified_cert = cert;
221 verify_details_.cert_verify_result.is_issued_by_known_root = true;
222 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
[email protected]1c04f9522013-02-21 20:32:43223 }
[email protected]61a527782013-02-21 03:58:00224
dcheng67be2b1f2014-10-27 21:47:29225 void SetUp() override {
[email protected]61a527782013-02-21 03:58:00226 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34227 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00228 }
229
dcheng67be2b1f2014-10-27 21:47:29230 void TearDown() override {
[email protected]61a527782013-02-21 03:58:00231 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
232 // Empty the current queue.
[email protected]2da659e2013-05-23 20:51:34233 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00234 PlatformTest::TearDown();
235 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34236 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00237 }
238
danakjad1777e2016-04-16 00:56:42239 std::unique_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
rtennetia004d332015-08-28 06:44:57240 QuicPacketNumber num) {
[email protected]1e960032013-12-20 19:00:20241 return maker_.MakeConnectionClosePacket(num);
[email protected]3316d422013-05-03 21:45:30242 }
243
danakjad1777e2016-04-16 00:56:42244 std::unique_ptr<QuicEncryptedPacket> ConstructGoAwayPacket(
zhongyi6b5a3892016-03-12 04:46:20245 QuicPacketNumber num,
246 QuicErrorCode error_code,
247 std::string reason_phrase) {
248 return maker_.MakeGoAwayPacket(num, error_code, reason_phrase);
249 }
250
danakjad1777e2016-04-16 00:56:42251 std::unique_ptr<QuicEncryptedPacket> ConstructAckPacket(
rtennetia004d332015-08-28 06:44:57252 QuicPacketNumber largest_received,
253 QuicPacketNumber least_unacked) {
zhongyi32569c62016-01-08 02:54:30254 return maker_.MakeAckPacket(2, largest_received, least_unacked,
255 least_unacked, true);
256 }
257
danakjad1777e2016-04-16 00:56:42258 std::unique_ptr<QuicEncryptedPacket> ConstructAckAndRstPacket(
zhongyi6b5a3892016-03-12 04:46:20259 QuicPacketNumber num,
260 QuicStreamId stream_id,
261 QuicRstStreamErrorCode error_code,
262 QuicPacketNumber largest_received,
263 QuicPacketNumber ack_least_unacked,
264 QuicPacketNumber stop_least_unacked) {
265 return maker_.MakeAckAndRstPacket(num, false, stream_id, error_code,
266 largest_received, ack_least_unacked,
267 stop_least_unacked, true);
268 }
269
danakjad1777e2016-04-16 00:56:42270 std::unique_ptr<QuicEncryptedPacket> ConstructAckPacket(
zhongyi32569c62016-01-08 02:54:30271 QuicPacketNumber largest_received,
272 QuicPacketNumber least_unacked,
273 QuicTestPacketMaker* maker) {
274 return maker->MakeAckPacket(2, largest_received, least_unacked,
275 least_unacked, true);
276 }
277
danakjad1777e2016-04-16 00:56:42278 std::unique_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket(
zhongyi32569c62016-01-08 02:54:30279 QuicPacketNumber packet_number,
280 QuicPacketNumber largest_received,
281 QuicPacketNumber ack_least_unacked,
282 QuicPacketNumber stop_least_unacked) {
283 return maker_.MakeAckPacket(packet_number, largest_received,
284 ack_least_unacked, stop_least_unacked, true);
[email protected]1e960032013-12-20 19:00:20285 }
[email protected]61a527782013-02-21 03:58:00286
danakjad1777e2016-04-16 00:56:42287 std::unique_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket(
zhongyica364fbb2015-12-12 03:39:12288 QuicPacketNumber num,
289 QuicTime::Delta delta_time_largest_observed,
290 QuicPacketNumber largest_received,
291 QuicPacketNumber least_unacked,
292 QuicErrorCode quic_error,
bnc912a04b2016-04-20 14:19:50293 const std::string& quic_error_details) {
zhongyica364fbb2015-12-12 03:39:12294 return maker_.MakeAckAndConnectionClosePacket(
295 num, false, delta_time_largest_observed, largest_received,
296 least_unacked, quic_error, quic_error_details);
297 }
298
danakjad1777e2016-04-16 00:56:42299 std::unique_ptr<QuicEncryptedPacket> ConstructRstPacket(
zhongyica364fbb2015-12-12 03:39:12300 QuicPacketNumber num,
301 bool include_version,
302 QuicStreamId stream_id,
303 QuicRstStreamErrorCode error_code) {
304 return maker_.MakeRstPacket(num, include_version, stream_id, error_code);
305 }
306
zhongyi32569c62016-01-08 02:54:30307 // Uses default QuicTestPacketMaker.
[email protected]1e960032013-12-20 19:00:20308 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
309 const std::string& scheme,
310 const std::string& path) {
bnc912a04b2016-04-20 14:19:50311 return GetRequestHeaders(method, scheme, path, &maker_);
zhongyi32569c62016-01-08 02:54:30312 }
313
314 // Uses customized QuicTestPacketMaker.
315 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
316 const std::string& scheme,
317 const std::string& path,
bnc912a04b2016-04-20 14:19:50318 QuicTestPacketMaker* maker) {
319 return maker->GetRequestHeaders(method, scheme, path);
[email protected]61a527782013-02-21 03:58:00320 }
321
[email protected]1e960032013-12-20 19:00:20322 SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
323 return maker_.GetResponseHeaders(status);
[email protected]61a527782013-02-21 03:58:00324 }
325
zhongyi32569c62016-01-08 02:54:30326 // Appends alt_svc headers in the response headers.
327 SpdyHeaderBlock GetResponseHeaders(const std::string& status,
328 const std::string& alt_svc) {
329 return maker_.GetResponseHeaders(status, alt_svc);
330 }
331
danakjad1777e2016-04-16 00:56:42332 std::unique_ptr<QuicEncryptedPacket> ConstructDataPacket(
rtennetia004d332015-08-28 06:44:57333 QuicPacketNumber packet_number,
[email protected]98b20ce2013-05-10 05:55:26334 QuicStreamId stream_id,
[email protected]e8ff26842013-03-22 21:02:05335 bool should_include_version,
[email protected]61a527782013-02-21 03:58:00336 bool fin,
337 QuicStreamOffset offset,
338 base::StringPiece data) {
rtennetia004d332015-08-28 06:44:57339 return maker_.MakeDataPacket(packet_number, stream_id,
340 should_include_version, fin, offset, data);
[email protected]61a527782013-02-21 03:58:00341 }
342
danakjad1777e2016-04-16 00:56:42343 std::unique_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
rtennetia004d332015-08-28 06:44:57344 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20345 QuicStreamId stream_id,
346 bool should_include_version,
347 bool fin,
zhongyi32569c62016-01-08 02:54:30348 const SpdyHeaderBlock& headers,
349 QuicStreamOffset* offset) {
ianswett0888cff2015-11-24 17:42:16350 SpdyPriority priority =
rtennetif4bdb542015-01-21 14:33:05351 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
zhongyi32569c62016-01-08 02:54:30352 return maker_.MakeRequestHeadersPacketWithOffsetTracking(
353 packet_number, stream_id, should_include_version, fin, priority,
354 headers, offset);
355 }
356
danakjad1777e2016-04-16 00:56:42357 std::unique_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30358 QuicPacketNumber packet_number,
359 QuicStreamId stream_id,
360 bool should_include_version,
361 bool fin,
362 const SpdyHeaderBlock& headers,
363 QuicStreamOffset* offset,
364 QuicTestPacketMaker* maker) {
365 SpdyPriority priority =
366 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
367 return maker->MakeRequestHeadersPacketWithOffsetTracking(
368 packet_number, stream_id, should_include_version, fin, priority,
369 headers, offset);
370 }
371
danakjad1777e2016-04-16 00:56:42372 std::unique_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30373 QuicPacketNumber packet_number,
374 QuicStreamId stream_id,
375 bool should_include_version,
376 bool fin,
377 const SpdyHeaderBlock& headers) {
378 return ConstructRequestHeadersPacket(packet_number, stream_id,
379 should_include_version, fin, headers,
380 nullptr, &maker_);
381 }
danakjad1777e2016-04-16 00:56:42382 std::unique_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30383 QuicPacketNumber packet_number,
384 QuicStreamId stream_id,
385 bool should_include_version,
386 bool fin,
387 const SpdyHeaderBlock& headers,
388 QuicTestPacketMaker* maker) {
389 return ConstructRequestHeadersPacket(packet_number, stream_id,
390 should_include_version, fin, headers,
391 nullptr, maker);
[email protected]61a527782013-02-21 03:58:00392 }
393
danakjad1777e2016-04-16 00:56:42394 std::unique_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
rtennetia004d332015-08-28 06:44:57395 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20396 QuicStreamId stream_id,
397 bool should_include_version,
398 bool fin,
399 const SpdyHeaderBlock& headers) {
zhongyi32569c62016-01-08 02:54:30400 return ConstructResponseHeadersPacket(packet_number, stream_id,
401 should_include_version, fin, headers,
402 nullptr, &maker_);
403 }
404
danakjad1777e2016-04-16 00:56:42405 std::unique_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30406 QuicPacketNumber packet_number,
407 QuicStreamId stream_id,
408 bool should_include_version,
409 bool fin,
410 const SpdyHeaderBlock& headers,
411 QuicTestPacketMaker* maker) {
412 return ConstructResponseHeadersPacket(packet_number, stream_id,
413 should_include_version, fin, headers,
414 nullptr, maker);
415 }
416
danakjad1777e2016-04-16 00:56:42417 std::unique_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30418 QuicPacketNumber packet_number,
419 QuicStreamId stream_id,
420 bool should_include_version,
421 bool fin,
422 const SpdyHeaderBlock& headers,
423 QuicStreamOffset* offset) {
424 return maker_.MakeResponseHeadersPacketWithOffsetTracking(
425 packet_number, stream_id, should_include_version, fin, headers, offset);
426 }
427
danakjad1777e2016-04-16 00:56:42428 std::unique_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30429 QuicPacketNumber packet_number,
430 QuicStreamId stream_id,
431 bool should_include_version,
432 bool fin,
433 const SpdyHeaderBlock& headers,
434 QuicStreamOffset* offset,
435 QuicTestPacketMaker* maker) {
436 return maker->MakeResponseHeadersPacketWithOffsetTracking(
437 packet_number, stream_id, should_include_version, fin, headers, offset);
[email protected]61a527782013-02-21 03:58:00438 }
439
bnc912a04b2016-04-20 14:19:50440 void CreateSession() {
[email protected]4dca587c2013-03-07 16:54:47441 params_.enable_quic = true;
442 params_.quic_clock = clock_;
443 params_.quic_random = &random_generator_;
bnc912a04b2016-04-20 14:19:50444 params_.client_socket_factory = &socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05445 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43446 params_.host_resolver = &host_resolver_;
447 params_.cert_verifier = &cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11448 params_.transport_security_state = &transport_security_state_;
rtenneti052774e2015-11-24 21:00:12449 params_.cert_transparency_verifier = cert_transparency_verifier_.get();
tbansalfdf5665b2015-09-21 22:46:40450 params_.socket_performance_watcher_factory =
tbansal0f56a39a2016-04-07 22:03:38451 &test_socket_performance_watcher_factory_;
[email protected]1c04f9522013-02-21 20:32:43452 params_.proxy_service = proxy_service_.get();
453 params_.ssl_config_service = ssl_config_service_.get();
454 params_.http_auth_handler_factory = auth_handler_factory_.get();
bnc6be245c12015-05-15 11:24:07455 params_.http_server_properties = http_server_properties_.GetWeakPtr();
[email protected]1e960032013-12-20 19:00:20456 params_.quic_supported_versions = SupportedVersions(GetParam());
rch74da0e1a2016-01-14 02:49:32457 for (const char* host :
rch9ae5b3b2016-02-11 00:36:29458 {kDefaultServerHostName, "www.example.org", "news.example.org",
459 "bar.example.org", "foo.example.org", "invalid.example.org",
460 "mail.example.com"}) {
rch74da0e1a2016-01-14 02:49:32461 params_.quic_host_whitelist.insert(host);
462 }
[email protected]61a527782013-02-21 03:58:00463
mmenkee65e7af2015-10-13 17:16:42464 session_.reset(new HttpNetworkSession(params_));
[email protected]11c05872013-08-20 02:04:12465 session_->quic_stream_factory()->set_require_confirmation(false);
rch185ebee2015-07-14 23:56:22466 ASSERT_EQ(params_.quic_socket_receive_buffer_size,
467 session_->quic_stream_factory()->socket_receive_buffer_size());
[email protected]61a527782013-02-21 03:58:00468 }
469
danakjad1777e2016-04-16 00:56:42470 void CheckWasQuicResponse(
471 const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19472 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42473 ASSERT_TRUE(response != nullptr);
474 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19475 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
476 EXPECT_TRUE(response->was_fetched_via_spdy);
477 EXPECT_TRUE(response->was_npn_negotiated);
478 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
479 response->connection_info);
480 }
481
danakjad1777e2016-04-16 00:56:42482 void CheckResponsePort(const std::unique_ptr<HttpNetworkTransaction>& trans,
Avi Drissman13fc8932015-12-20 04:40:46483 uint16_t port) {
bnc62a44f022015-04-02 15:59:41484 const HttpResponseInfo* response = trans->GetResponseInfo();
485 ASSERT_TRUE(response != nullptr);
486 EXPECT_EQ(port, response->socket_address.port());
487 }
488
danakjad1777e2016-04-16 00:56:42489 void CheckWasHttpResponse(
490 const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19491 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42492 ASSERT_TRUE(response != nullptr);
493 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19494 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
495 EXPECT_FALSE(response->was_fetched_via_spdy);
496 EXPECT_FALSE(response->was_npn_negotiated);
497 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1,
498 response->connection_info);
499 }
500
danakjad1777e2016-04-16 00:56:42501 void CheckResponseData(const std::unique_ptr<HttpNetworkTransaction>& trans,
[email protected]aa9b14d2013-05-10 23:45:19502 const std::string& expected) {
503 std::string response_data;
bncffc2fdf2015-05-14 18:29:49504 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
[email protected]aa9b14d2013-05-10 23:45:19505 EXPECT_EQ(expected, response_data);
506 }
507
danakjad1777e2016-04-16 00:56:42508 void RunTransaction(const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19509 TestCompletionCallback callback;
510 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
511 EXPECT_EQ(ERR_IO_PENDING, rv);
512 EXPECT_EQ(OK, callback.WaitForResult());
513 }
514
515 void SendRequestAndExpectHttpResponse(const std::string& expected) {
danakjad1777e2016-04-16 00:56:42516 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50517 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
bncffc2fdf2015-05-14 18:29:49518 RunTransaction(trans);
[email protected]aa9b14d2013-05-10 23:45:19519 CheckWasHttpResponse(trans);
bncffc2fdf2015-05-14 18:29:49520 CheckResponseData(trans, expected);
[email protected]aa9b14d2013-05-10 23:45:19521 }
522
523 void SendRequestAndExpectQuicResponse(const std::string& expected) {
rchf114d982015-10-21 01:34:56524 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, 443);
tbansal7cec3812015-02-05 21:25:12525 }
526
bnc62a44f022015-04-02 15:59:41527 void SendRequestAndExpectQuicResponseOnPort(const std::string& expected,
Avi Drissman13fc8932015-12-20 04:40:46528 uint16_t port) {
bnc62a44f022015-04-02 15:59:41529 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, port);
530 }
531
532 void SendRequestAndExpectQuicResponseFromProxyOnPort(
533 const std::string& expected,
Avi Drissman13fc8932015-12-20 04:40:46534 uint16_t port) {
bnc62a44f022015-04-02 15:59:41535 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port);
[email protected]aa9b14d2013-05-10 23:45:19536 }
537
538 void AddQuicAlternateProtocolMapping(
539 MockCryptoClientStream::HandshakeMode handshake_mode) {
540 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
zhongyi3d4a55e72016-04-22 20:36:46541 url::SchemeHostPort server(request_.url);
542 AlternativeService alternative_service(QUIC, server.host(), 443);
bnc7dc7e1b42015-07-28 14:43:12543 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
zhongyi3d4a55e72016-04-22 20:36:46544 http_server_properties_.SetAlternativeService(server, alternative_service,
545 expiration);
[email protected]aa9b14d2013-05-10 23:45:19546 }
547
rchbe69cb902016-02-11 01:10:48548 void AddQuicRemoteAlternativeServiceMapping(
549 MockCryptoClientStream::HandshakeMode handshake_mode,
550 const HostPortPair& alternative) {
551 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
zhongyi3d4a55e72016-04-22 20:36:46552 url::SchemeHostPort server(request_.url);
rchbe69cb902016-02-11 01:10:48553 AlternativeService alternative_service(QUIC, alternative.host(),
554 alternative.port());
555 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
zhongyi3d4a55e72016-04-22 20:36:46556 http_server_properties_.SetAlternativeService(server, alternative_service,
557 expiration);
rchbe69cb902016-02-11 01:10:48558 }
559
[email protected]aa9b14d2013-05-10 23:45:19560 void ExpectBrokenAlternateProtocolMapping() {
zhongyi3d4a55e72016-04-22 20:36:46561 const url::SchemeHostPort server(request_.url);
bncd9b132e2015-07-08 05:16:10562 const AlternativeServiceVector alternative_service_vector =
zhongyi3d4a55e72016-04-22 20:36:46563 http_server_properties_.GetAlternativeServices(server);
bncd9b132e2015-07-08 05:16:10564 EXPECT_EQ(1u, alternative_service_vector.size());
bnc6be245c12015-05-15 11:24:07565 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken(
bncd9b132e2015-07-08 05:16:10566 alternative_service_vector[0]));
[email protected]aa9b14d2013-05-10 23:45:19567 }
568
[email protected]4d590c9c2014-05-02 05:14:33569 void ExpectQuicAlternateProtocolMapping() {
zhongyi3d4a55e72016-04-22 20:36:46570 const url::SchemeHostPort server(request_.url);
bncd9b132e2015-07-08 05:16:10571 const AlternativeServiceVector alternative_service_vector =
zhongyi3d4a55e72016-04-22 20:36:46572 http_server_properties_.GetAlternativeServices(server);
bncd9b132e2015-07-08 05:16:10573 EXPECT_EQ(1u, alternative_service_vector.size());
574 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
[email protected]4d590c9c2014-05-02 05:14:33575 }
576
[email protected]aa9b14d2013-05-10 23:45:19577 void AddHangingNonAlternateProtocolSocketData() {
danakjad1777e2016-04-16 00:56:42578 std::unique_ptr<StaticSocketDataProvider> hanging_data;
zhongyi32569c62016-01-08 02:54:30579 hanging_data.reset(new StaticSocketDataProvider());
[email protected]dda75ab2013-06-22 22:43:30580 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
zhongyi32569c62016-01-08 02:54:30581 hanging_data->set_connect_data(hanging_connect);
582 hanging_data_.push_back(std::move(hanging_data));
583 socket_factory_.AddSocketDataProvider(hanging_data_.back().get());
rchf114d982015-10-21 01:34:56584 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]aa9b14d2013-05-10 23:45:19585 }
586
rtenneti4b06ae72014-08-26 03:43:43587 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
[email protected]1e960032013-12-20 19:00:20588 QuicTestPacketMaker maker_;
danakjad1777e2016-04-16 00:56:42589 std::unique_ptr<HttpNetworkSession> session_;
[email protected]61a527782013-02-21 03:58:00590 MockClientSocketFactory socket_factory_;
rchf114d982015-10-21 01:34:56591 ProofVerifyDetailsChromium verify_details_;
[email protected]e8ff26842013-03-22 21:02:05592 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43593 MockHostResolver host_resolver_;
594 MockCertVerifier cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11595 TransportSecurityState transport_security_state_;
danakjad1777e2016-04-16 00:56:42596 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
tbansal0f56a39a2016-04-07 22:03:38597 TestSocketPerformanceWatcherFactory test_socket_performance_watcher_factory_;
[email protected]1c04f9522013-02-21 20:32:43598 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
danakjad1777e2016-04-16 00:56:42599 std::unique_ptr<ProxyService> proxy_service_;
600 std::unique_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
[email protected]61a527782013-02-21 03:58:00601 MockRandom random_generator_;
bnc6be245c12015-05-15 11:24:07602 HttpServerPropertiesImpl http_server_properties_;
[email protected]61a527782013-02-21 03:58:00603 HttpNetworkSession::Params params_;
[email protected]aa9b14d2013-05-10 23:45:19604 HttpRequestInfo request_;
vishal.b62985ca92015-04-17 08:45:51605 BoundTestNetLog net_log_;
danakjad1777e2016-04-16 00:56:42606 std::vector<std::unique_ptr<StaticSocketDataProvider>> hanging_data_;
rchf114d982015-10-21 01:34:56607 SSLSocketDataProvider ssl_data_;
tbansal7cec3812015-02-05 21:25:12608
609 private:
610 void SendRequestAndExpectQuicResponseMaybeFromProxy(
611 const std::string& expected,
bnc62a44f022015-04-02 15:59:41612 bool used_proxy,
Avi Drissman13fc8932015-12-20 04:40:46613 uint16_t port) {
danakjad1777e2016-04-16 00:56:42614 std::unique_ptr<HttpNetworkTransaction> trans(
tbansal7cec3812015-02-05 21:25:12615 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
616 ProxyHeadersHandler proxy_headers_handler;
617 trans->SetBeforeProxyHeadersSentCallback(
618 base::Bind(&ProxyHeadersHandler::OnBeforeProxyHeadersSent,
619 base::Unretained(&proxy_headers_handler)));
bncffc2fdf2015-05-14 18:29:49620 RunTransaction(trans);
tbansal7cec3812015-02-05 21:25:12621 CheckWasQuicResponse(trans);
bnc62a44f022015-04-02 15:59:41622 CheckResponsePort(trans, port);
bncffc2fdf2015-05-14 18:29:49623 CheckResponseData(trans, expected);
tbansal7cec3812015-02-05 21:25:12624 EXPECT_EQ(used_proxy, proxy_headers_handler.was_called());
625 }
[email protected]61a527782013-02-21 03:58:00626};
627
rjshaded5ced072015-12-18 19:26:02628INSTANTIATE_TEST_CASE_P(Version,
629 QuicNetworkTransactionTest,
[email protected]1e960032013-12-20 19:00:20630 ::testing::ValuesIn(QuicSupportedVersions()));
631
632TEST_P(QuicNetworkTransactionTest, ForceQuic) {
rtenneti8a2f4632016-03-21 20:26:57633 params_.origins_to_force_quic_on.insert(
634 HostPortPair::FromString("mail.example.org:443"));
[email protected]4dca587c2013-03-07 16:54:47635
[email protected]1e960032013-12-20 19:00:20636 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03637 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05638 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56639 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:02640 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
641 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:03642 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05643 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03644 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:59645 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
[email protected]4dca587c2013-03-07 16:54:47646
rcha5399e02015-04-21 19:32:04647 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4dca587c2013-03-07 16:54:47648
[email protected]aa9b14d2013-05-10 23:45:19649 // The non-alternate protocol job needs to hang in order to guarantee that
650 // the alternate-protocol job will "win".
651 AddHangingNonAlternateProtocolSocketData();
[email protected]4dca587c2013-03-07 16:54:47652
rch3f4b8452016-02-23 16:59:32653 params_.parse_alternative_services = false;
654 params_.enable_alternative_service_with_different_host = false;
[email protected]4dca587c2013-03-07 16:54:47655 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47656
tbansal0f56a39a2016-04-07 22:03:38657 EXPECT_FALSE(
658 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]aa9b14d2013-05-10 23:45:19659 SendRequestAndExpectQuicResponse("hello!");
tbansal0f56a39a2016-04-07 22:03:38660 EXPECT_TRUE(
661 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]4dca587c2013-03-07 16:54:47662
[email protected]98b20ce2013-05-10 05:55:26663 // Check that the NetLog was filled reasonably.
mmenke43758e62015-05-04 21:09:46664 TestNetLogEntry::List entries;
[email protected]aa9b14d2013-05-10 23:45:19665 net_log_.GetEntries(&entries);
[email protected]98b20ce2013-05-10 05:55:26666 EXPECT_LT(0u, entries.size());
667
668 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29669 int pos = ExpectLogContainsSomewhere(
670 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
671 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26672 EXPECT_LT(0, pos);
673
rchfd527212015-08-25 00:41:26674 // ... and also a TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29675 pos = ExpectLogContainsSomewhere(
rchfd527212015-08-25 00:41:26676 entries, 0,
677 NetLog::TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED,
ttuttle859dc7a2015-04-23 19:42:29678 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26679 EXPECT_LT(0, pos);
680
rtennetia004d332015-08-28 06:44:57681 std::string packet_number;
682 ASSERT_TRUE(entries[pos].GetStringValue("packet_number", &packet_number));
683 EXPECT_EQ("1", packet_number);
[email protected]98b20ce2013-05-10 05:55:26684
rchfd527212015-08-25 00:41:26685 // ... and also a TYPE_QUIC_SESSION_PACKET_AUTHENTICATED.
686 pos = ExpectLogContainsSomewhere(
687 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_AUTHENTICATED,
688 NetLog::PHASE_NONE);
689 EXPECT_LT(0, pos);
690
[email protected]98b20ce2013-05-10 05:55:26691 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29692 pos = ExpectLogContainsSomewhere(
693 entries, 0, NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
694 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26695 EXPECT_LT(0, pos);
696
697 int log_stream_id;
698 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
[email protected]1e960032013-12-20 19:00:20699 EXPECT_EQ(3, log_stream_id);
[email protected]4dca587c2013-03-07 16:54:47700}
701
[email protected]cf3e3cd62014-02-05 16:16:16702TEST_P(QuicNetworkTransactionTest, QuicProxy) {
tbansaled0aecc2015-02-20 03:44:18703 params_.enable_quic_for_proxies = true;
rchf114d982015-10-21 01:34:56704 proxy_service_ =
rch9ae5b3b2016-02-11 00:36:29705 ProxyService::CreateFixedFromPacResult("QUIC mail.example.org:70");
[email protected]cf3e3cd62014-02-05 16:16:16706
[email protected]cf3e3cd62014-02-05 16:16:16707 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03708 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05709 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03710 GetRequestHeaders("GET", "http", "/")));
rjshaded5ced072015-12-18 19:26:02711 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
712 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:03713 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05714 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03715 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50716 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59717 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]cf3e3cd62014-02-05 16:16:16718
rcha5399e02015-04-21 19:32:04719 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cf3e3cd62014-02-05 16:16:16720
tbansal0f56a39a2016-04-07 22:03:38721 EXPECT_FALSE(
722 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16723 // There is no need to set up an alternate protocol job, because
724 // no attempt will be made to speak to the proxy over TCP.
725
rch9ae5b3b2016-02-11 00:36:29726 request_.url = GURL("http://mail.example.org/");
rch3f4b8452016-02-23 16:59:32727 params_.parse_alternative_services = false;
728 params_.enable_alternative_service_with_different_host = false;
[email protected]cf3e3cd62014-02-05 16:16:16729 CreateSession();
730
bnc62a44f022015-04-02 15:59:41731 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
tbansal0f56a39a2016-04-07 22:03:38732 EXPECT_TRUE(
733 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16734}
735
bnc313ba9c2015-06-11 15:42:31736// Regression test for https://crbug.com/492458. Test that for an HTTP
737// connection through a QUIC proxy, the certificate exhibited by the proxy is
738// checked against the proxy hostname, not the origin hostname.
739TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) {
rch9ae5b3b2016-02-11 00:36:29740 const std::string origin_host = "mail.example.com";
bnc313ba9c2015-06-11 15:42:31741 const std::string proxy_host = "www.example.org";
742
743 params_.enable_quic_for_proxies = true;
rdsmith82957ad2015-09-16 19:42:03744 proxy_service_ =
745 ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70");
bnc313ba9c2015-06-11 15:42:31746
747 maker_.set_hostname(origin_host);
748 MockQuicData mock_quic_data;
749 mock_quic_data.AddWrite(
750 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
751 GetRequestHeaders("GET", "http", "/")));
752 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
753 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
754 mock_quic_data.AddRead(
755 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
756 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50757 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59758 mock_quic_data.AddRead(ASYNC, 0);
bnc313ba9c2015-06-11 15:42:31759 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
760
761 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29762 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bnc313ba9c2015-06-11 15:42:31763 ASSERT_TRUE(cert.get());
764 // This certificate is valid for the proxy, but not for the origin.
765 bool common_name_fallback_used;
766 EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used));
767 EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used));
768 ProofVerifyDetailsChromium verify_details;
769 verify_details.cert_verify_result.verified_cert = cert;
770 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rchf114d982015-10-21 01:34:56771 ProofVerifyDetailsChromium verify_details2;
772 verify_details2.cert_verify_result.verified_cert = cert;
773 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
bnc313ba9c2015-06-11 15:42:31774
775 request_.url = GURL("http://" + origin_host);
776 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32777 CreateSession();
bnc313ba9c2015-06-11 15:42:31778 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
779 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
780}
781
rchbe69cb902016-02-11 01:10:48782TEST_P(QuicNetworkTransactionTest, AlternativeServicesDifferentHost) {
783 params_.enable_alternative_service_with_different_host = true;
784 HostPortPair origin("www.example.org", 443);
785 HostPortPair alternative("mail.example.org", 443);
786
787 base::FilePath certs_dir = GetTestCertsDirectory();
788 scoped_refptr<X509Certificate> cert(
789 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
790 ASSERT_TRUE(cert.get());
791 // TODO(rch): the connection should be "to" the origin, so if the cert is
792 // valid for the origin but not the alternative, that should work too.
793 bool common_name_fallback_used;
794 EXPECT_TRUE(cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
795 EXPECT_TRUE(
796 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
797 ProofVerifyDetailsChromium verify_details;
798 verify_details.cert_verify_result.verified_cert = cert;
799 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
800
801 maker_.set_hostname(origin.host());
802 MockQuicData mock_quic_data;
803 mock_quic_data.AddWrite(
804 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
805 GetRequestHeaders("GET", "https", "/")));
806 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
807 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
808 mock_quic_data.AddRead(
809 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
810 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
811 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
812 mock_quic_data.AddRead(ASYNC, 0);
813 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
814
815 request_.url = GURL("https://" + origin.host());
816 AddQuicRemoteAlternativeServiceMapping(
817 MockCryptoClientStream::CONFIRM_HANDSHAKE, alternative);
818 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32819 CreateSession();
rchbe69cb902016-02-11 01:10:48820
821 SendRequestAndExpectQuicResponse("hello!");
822}
823
[email protected]1e960032013-12-20 19:00:20824TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
rtenneti8a2f4632016-03-21 20:26:57825 params_.origins_to_force_quic_on.insert(
826 HostPortPair::FromString("mail.example.org:443"));
[email protected]cebe3282013-05-22 23:49:30827
tbansalfdf5665b2015-09-21 22:46:40828 MockQuicData mock_quic_data1;
829 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
[email protected]1e960032013-12-20 19:00:20830
tbansalfdf5665b2015-09-21 22:46:40831 MockQuicData mock_quic_data2;
zhongyi32569c62016-01-08 02:54:30832 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40833 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
rch6faa4d42016-01-05 20:48:43834 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40835
836 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
837 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
[email protected]cebe3282013-05-22 23:49:30838
rch3f4b8452016-02-23 16:59:32839 params_.parse_alternative_services = false;
840 params_.enable_alternative_service_with_different_host = false;
[email protected]cebe3282013-05-22 23:49:30841 CreateSession();
842
tbansal0f56a39a2016-04-07 22:03:38843 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40844 for (size_t i = 0; i < 2; ++i) {
danakjad1777e2016-04-16 00:56:42845 std::unique_ptr<HttpNetworkTransaction> trans(
tbansalfdf5665b2015-09-21 22:46:40846 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
847 TestCompletionCallback callback;
848 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
849 EXPECT_EQ(ERR_IO_PENDING, rv);
850 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
tbansal0f56a39a2016-04-07 22:03:38851 EXPECT_EQ(1 + i, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40852 }
[email protected]cebe3282013-05-22 23:49:30853}
854
tbansalc8a94ea2015-11-02 23:58:51855TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
856 // Attempt to "force" quic on 443, which will not be honored.
rtenneti8a2f4632016-03-21 20:26:57857 params_.origins_to_force_quic_on.insert(
858 HostPortPair::FromString("www.google.com:443"));
tbansalc8a94ea2015-11-02 23:58:51859
860 MockRead http_reads[] = {
861 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
862 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
863 MockRead(ASYNC, OK)};
864
865 StaticSocketDataProvider data(http_reads, arraysize(http_reads), nullptr, 0);
866 socket_factory_.AddSocketDataProvider(&data);
867 SSLSocketDataProvider ssl(ASYNC, OK);
868 socket_factory_.AddSSLSocketDataProvider(&ssl);
869
rch3f4b8452016-02-23 16:59:32870 params_.parse_alternative_services = false;
871 params_.enable_alternative_service_with_different_host = false;
tbansalc8a94ea2015-11-02 23:58:51872 CreateSession();
873
874 SendRequestAndExpectHttpResponse("hello world");
tbansal0f56a39a2016-04-07 22:03:38875 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalc8a94ea2015-11-02 23:58:51876}
877
bncc958faa2015-07-31 18:14:52878TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52879 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56880 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
881 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52882 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
883 MockRead(ASYNC, OK)};
884
885 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
886 0);
887 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56888 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52889
890 MockQuicData mock_quic_data;
891 mock_quic_data.AddWrite(
892 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56893 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52894 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
895 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
896 mock_quic_data.AddRead(
897 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
898 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
899 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59900 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52901
902 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
903
904 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32905 CreateSession();
bncc958faa2015-07-31 18:14:52906
907 SendRequestAndExpectHttpResponse("hello world");
908 SendRequestAndExpectQuicResponse("hello!");
909}
910
rchf47265dc2016-03-21 21:33:12911TEST_P(QuicNetworkTransactionTest,
912 UseAlternativeServiceWithProbabilityForQuic) {
913 MockRead http_reads[] = {
914 MockRead("HTTP/1.1 200 OK\r\n"),
915 MockRead(kQuicAlternativeServiceWithProbabilityHeader),
916 MockRead("hello world"),
917 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
918 MockRead(ASYNC, OK)};
919
920 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
921 0);
922 socket_factory_.AddSocketDataProvider(&http_data);
923 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
924
925 MockQuicData mock_quic_data;
926 mock_quic_data.AddWrite(
927 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
928 GetRequestHeaders("GET", "https", "/")));
929 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
930 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
931 mock_quic_data.AddRead(
932 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
933 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
934 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
935 mock_quic_data.AddRead(ASYNC, 0); // EOF
936
937 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
938
939 AddHangingNonAlternateProtocolSocketData();
940 CreateSession();
941
942 SendRequestAndExpectHttpResponse("hello world");
943 SendRequestAndExpectQuicResponse("hello!");
944}
945
zhongyi3d4a55e72016-04-22 20:36:46946TEST_P(QuicNetworkTransactionTest, SetAlternativeServiceWithScheme) {
947 MockRead http_reads[] = {
948 MockRead("HTTP/1.1 200 OK\r\n"),
949 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
950 MockRead("hello world"),
951 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
952 MockRead(ASYNC, OK)};
953
954 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
955 0);
956
957 socket_factory_.AddSocketDataProvider(&http_data);
958 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
959
960 CreateSession();
961 // Send http request, ignore alternative service advertising if response
962 // header advertises alternative service for mail.example.org.
963 request_.url = GURL("http://mail.example.org:443");
964 SendRequestAndExpectHttpResponse("hello world");
965 base::WeakPtr<HttpServerProperties> http_server_properties =
966 session_->http_server_properties();
967 url::SchemeHostPort http_server("http", "mail.example.org", 443);
968 url::SchemeHostPort https_server("https", "mail.example.org", 443);
969 // Check alternative service is set for the correct origin.
970 EXPECT_EQ(2u,
971 http_server_properties->GetAlternativeServices(http_server).size());
972 EXPECT_EQ(
973 0u, http_server_properties->GetAlternativeServices(https_server).size());
974}
975
976TEST_P(QuicNetworkTransactionTest, DoNotGetAltSvcForDifferentOrigin) {
977 MockRead http_reads[] = {
978 MockRead("HTTP/1.1 200 OK\r\n"),
979 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
980 MockRead("hello world"),
981 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
982 MockRead(ASYNC, OK)};
983
984 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
985 0);
986
987 socket_factory_.AddSocketDataProvider(&http_data);
988 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
989 socket_factory_.AddSocketDataProvider(&http_data);
990 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
991
992 CreateSession();
993
994 // Send https request and set alternative services if response header
995 // advertises alternative service for mail.example.org.
996 SendRequestAndExpectHttpResponse("hello world");
997 base::WeakPtr<HttpServerProperties> http_server_properties =
998 session_->http_server_properties();
999
1000 const url::SchemeHostPort https_server(request_.url);
1001 // Check alternative service is set.
1002 AlternativeServiceVector alternative_service_vector =
1003 http_server_properties->GetAlternativeServices(https_server);
1004 EXPECT_EQ(2u, alternative_service_vector.size());
1005
1006 // Send http request to the same origin but with diffrent scheme, should not
1007 // use QUIC.
1008 request_.url = GURL("http://mail.example.org:443");
1009 SendRequestAndExpectHttpResponse("hello world");
1010}
1011
bnc8be55ebb2015-10-30 14:12:071012TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) {
1013 std::string altsvc_header = base::StringPrintf(
1014 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam());
1015 MockRead http_reads[] = {
1016 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1017 MockRead("hello world"),
1018 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1019 MockRead(ASYNC, OK)};
1020
1021 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1022 0);
1023 socket_factory_.AddSocketDataProvider(&http_data);
1024 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1025
1026 MockQuicData mock_quic_data;
1027 mock_quic_data.AddWrite(
1028 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1029 GetRequestHeaders("GET", "https", "/")));
1030 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1031 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1032 mock_quic_data.AddRead(
1033 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1034 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1035 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591036 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc8be55ebb2015-10-30 14:12:071037
1038 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1039
1040 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321041 CreateSession();
bnc8be55ebb2015-10-30 14:12:071042
1043 SendRequestAndExpectHttpResponse("hello world");
1044 SendRequestAndExpectQuicResponse("hello!");
1045}
1046
zhongyi6b5a3892016-03-12 04:46:201047TEST_P(QuicNetworkTransactionTest, GoAwayWithConnectionMigrationOnPortsOnly) {
1048 MockQuicData mock_quic_data;
1049 mock_quic_data.AddWrite(
1050 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1051 GetRequestHeaders("GET", "https", "/")));
1052 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1053 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1054 // Read a GoAway packet with
1055 // QuicErrorCode: QUIC_ERROR_MIGRATING_PORT from the peer.
1056 mock_quic_data.AddRead(
1057 ConstructGoAwayPacket(2, QUIC_ERROR_MIGRATING_PORT,
1058 "connection migration with port change only"));
1059 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1060 mock_quic_data.AddRead(
1061 ConstructDataPacket(3, kClientDataStreamId1, false, true, 0, "hello!"));
1062 mock_quic_data.AddWrite(ConstructAckAndRstPacket(
1063 3, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 3, 3, 1));
1064 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1065 mock_quic_data.AddRead(ASYNC, 0); // EOF
1066
1067 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1068
1069 // The non-alternate protocol job needs to hang in order to guarantee that
1070 // the alternate-protocol job will "win".
1071 AddHangingNonAlternateProtocolSocketData();
1072
1073 // In order for a new QUIC session to be established via alternate-protocol
1074 // without racing an HTTP connection, we need the host resolution to happen
1075 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1076 // connection to the the server, in this test we require confirmation
1077 // before encrypting so the HTTP job will still start.
1078 host_resolver_.set_synchronous_mode(true);
1079 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1080 "");
1081 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1082 AddressList address;
1083 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1084 nullptr, net_log_.bound());
1085
1086 CreateSession();
1087 session_->quic_stream_factory()->set_require_confirmation(true);
1088 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1089
danakjad1777e2016-04-16 00:56:421090 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyi6b5a3892016-03-12 04:46:201091 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1092 TestCompletionCallback callback;
1093 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1094 EXPECT_EQ(ERR_IO_PENDING, rv);
1095
1096 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1097 QuicSession::HANDSHAKE_CONFIRMED);
1098 EXPECT_EQ(OK, callback.WaitForResult());
1099
1100 // Check whether this transaction is correctly marked as received a go-away
1101 // because of migrating port.
1102 NetErrorDetails details;
1103 EXPECT_FALSE(details.quic_port_migration_detected);
1104 trans->PopulateNetErrorDetails(&details);
1105 EXPECT_TRUE(details.quic_port_migration_detected);
1106}
1107
bnc8be55ebb2015-10-30 14:12:071108TEST_P(QuicNetworkTransactionTest,
1109 DoNotUseAlternativeServiceQuicUnsupportedVersion) {
1110 std::string altsvc_header = base::StringPrintf(
1111 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam() - 1);
1112 MockRead http_reads[] = {
1113 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1114 MockRead("hello world"),
1115 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1116 MockRead(ASYNC, OK)};
1117
1118 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1119 0);
1120 socket_factory_.AddSocketDataProvider(&http_data);
1121 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1122 socket_factory_.AddSocketDataProvider(&http_data);
1123 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1124
rch3f4b8452016-02-23 16:59:321125 CreateSession();
bnc8be55ebb2015-10-30 14:12:071126
1127 SendRequestAndExpectHttpResponse("hello world");
1128 SendRequestAndExpectHttpResponse("hello world");
1129}
1130
bncc958faa2015-07-31 18:14:521131// When multiple alternative services are advertised,
zhongyi32569c62016-01-08 02:54:301132// HttpStreamFactoryImpl::RequestStreamInternal() should select the alternative
1133// service which uses existing QUIC session if available. If no existing QUIC
1134// session can be used, use the first alternative service from the list.
1135TEST_P(QuicNetworkTransactionTest, UseExistingAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:521136 MockRead http_reads[] = {
1137 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291138 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
bncc958faa2015-07-31 18:14:521139 MockRead("hello world"),
1140 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1141 MockRead(ASYNC, OK)};
1142
1143 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1144 0);
1145 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561146 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521147
zhongyi32569c62016-01-08 02:54:301148 QuicStreamOffset request_header_offset = 0;
1149 QuicStreamOffset response_header_offset = 0;
1150 // First QUIC request data.
rch9ae5b3b2016-02-11 00:36:291151 // Open a session to foo.example.org:443 using the first entry of the
zhongyi32569c62016-01-08 02:54:301152 // alternative service list.
bncc958faa2015-07-31 18:14:521153 MockQuicData mock_quic_data;
zhongyi32569c62016-01-08 02:54:301154 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1155 1, kClientDataStreamId1, true, true,
1156 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1157
1158 std::string alt_svc_list =
rch9ae5b3b2016-02-11 00:36:291159 "quic=\"mail.example.org:444\", quic=\"foo.example.org:443\", "
1160 "quic=\"bar.example.org:445\"";
bncc958faa2015-07-31 18:14:521161 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301162 1, kClientDataStreamId1, false, false,
1163 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
bncc958faa2015-07-31 18:14:521164 mock_quic_data.AddRead(
1165 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1166 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301167
1168 // Second QUIC request data.
1169 // Connection pooling, using existing session, no need to include version
1170 // as version negotiation has been completed.
1171 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1172 3, kClientDataStreamId2, false, true,
1173 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1174 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1175 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1176 &response_header_offset));
1177 mock_quic_data.AddRead(
1178 ConstructDataPacket(4, kClientDataStreamId2, false, true, 0, "hello!"));
1179 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
bncc958faa2015-07-31 18:14:521180 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591181 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521182
1183 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1184
1185 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321186 CreateSession();
bncc958faa2015-07-31 18:14:521187
1188 SendRequestAndExpectHttpResponse("hello world");
zhongyi32569c62016-01-08 02:54:301189
bncc958faa2015-07-31 18:14:521190 SendRequestAndExpectQuicResponseOnPort("hello!", 443);
zhongyi32569c62016-01-08 02:54:301191 SendRequestAndExpectQuicResponseOnPort("hello!", 443);
1192}
1193
1194// When multiple alternative services that has existing QUIC session.
1195// HttpStreamFactoryImpl::RequestStreamInternal() should select the first
1196// alternative service which uses existing QUIC session.
1197TEST_P(QuicNetworkTransactionTest, UseFirstExistingAlternativeServiceForQuic) {
1198 MockRead http_reads[] = {
1199 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291200 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":446\"\r\n\r\n"),
zhongyi32569c62016-01-08 02:54:301201 MockRead("hello world"),
1202 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1203 MockRead(ASYNC, OK)};
1204
1205 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1206 0);
1207 socket_factory_.AddSocketDataProvider(&http_data);
1208 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1209
1210 QuicStreamOffset request_header_offset = 0;
1211 QuicStreamOffset response_header_offset = 0;
1212
1213 QuicTestPacketMaker maker(GetParam(), 0, clock_, kDefaultServerHostName);
1214
1215 MockQuicData mock_quic_data;
1216 MockQuicData mock_quic_data2;
1217 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
1218 // First QUIC request data.
rch9ae5b3b2016-02-11 00:36:291219 // Open a QUIC session to foo.example.org:443.
zhongyi32569c62016-01-08 02:54:301220 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1221 1, kClientDataStreamId1, true, true,
1222 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1223
1224 std::string alt_svc_list =
rch9ae5b3b2016-02-11 00:36:291225 "quic=\"bar.example.org:444\", quic=\"frog.example.org:445\", "
1226 "quic=\"mail.example.org:446\"";
zhongyi32569c62016-01-08 02:54:301227 // Response header from the server resets the alt_svc list for the origin.
1228 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1229 1, kClientDataStreamId1, false, false,
1230 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
1231 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1232 true, 0, "hello from foo!"));
1233 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1234
1235 // Second QUIC request data.
rch9ae5b3b2016-02-11 00:36:291236 // Existing QUIC session to foo.example.org is not viable from the updated
zhongyi32569c62016-01-08 02:54:301237 // alt_svc. Unable to pool the existing QUIC session.
rch9ae5b3b2016-02-11 00:36:291238 // Open a new QUIC session to bar.example.org:443.
zhongyi32569c62016-01-08 02:54:301239 mock_quic_data2.AddWrite(ConstructRequestHeadersPacket(
1240 1, kClientDataStreamId1, true, true,
1241 GetRequestHeaders("GET", "https", "/"), &maker));
1242 alt_svc_list =
rch9ae5b3b2016-02-11 00:36:291243 "quic=\"foo.example.org:443\", quic=\"mail.example.org:446\", "
1244 "quic=\"bar.example.org:444\"";
zhongyi32569c62016-01-08 02:54:301245 // Response header from the server resets the alt_svc list for the origin.
1246 mock_quic_data2.AddRead(ConstructResponseHeadersPacket(
1247 1, kClientDataStreamId1, false, false,
1248 GetResponseHeaders("200 OK", alt_svc_list), &maker));
1249 mock_quic_data2.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1250 true, 0, "hello from bar!"));
1251 mock_quic_data2.AddWrite(ConstructAckPacket(2, 1, &maker));
1252 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1253 mock_quic_data2.AddRead(ASYNC, 0); // EOF
1254
1255 // Third QUIC request data.
rch9ae5b3b2016-02-11 00:36:291256 // Connection pooling, using the first existing session to foo.example.org
zhongyi32569c62016-01-08 02:54:301257 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1258 3, kClientDataStreamId2, false, true,
1259 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1260 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1261 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1262 &response_header_offset));
1263 mock_quic_data.AddRead(ConstructDataPacket(4, kClientDataStreamId2, false,
1264 true, 0, "hello from foo!"));
1265 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
1266 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1267 mock_quic_data.AddRead(ASYNC, 0); // EOF
1268
1269 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1270 AddHangingNonAlternateProtocolSocketData();
1271
1272 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
1273
1274 AddHangingNonAlternateProtocolSocketData();
1275
rch3f4b8452016-02-23 16:59:321276 CreateSession();
zhongyi32569c62016-01-08 02:54:301277
1278 SendRequestAndExpectHttpResponse("hello world");
1279 SendRequestAndExpectQuicResponseOnPort("hello from foo!", 443);
1280 SendRequestAndExpectQuicResponseOnPort("hello from bar!", 444);
1281 SendRequestAndExpectQuicResponseOnPort("hello from foo!", 443);
1282}
1283
1284// Multiple origins have listed the same alternative services. When there's a
1285// existing QUIC session opened by a request to other origin,
1286// if the cert is valid, should select this QUIC session to make the request
1287// if this is also the first existing QUIC session.
1288TEST_P(QuicNetworkTransactionTest,
1289 UseSharedExistingAlternativeServiceForQuicWithValidCert) {
rch9ae5b3b2016-02-11 00:36:291290 // Default cert is valid for *.example.org
zhongyi32569c62016-01-08 02:54:301291
rch9ae5b3b2016-02-11 00:36:291292 // HTTP data for request to www.example.org.
zhongyi32569c62016-01-08 02:54:301293 MockRead http_reads[] = {
1294 MockRead("HTTP/1.1 200 OK\r\n"),
1295 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
rch9ae5b3b2016-02-11 00:36:291296 MockRead("hello world from www.example.org"),
zhongyi32569c62016-01-08 02:54:301297 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1298 MockRead(ASYNC, OK)};
1299
1300 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1301 0);
1302 socket_factory_.AddSocketDataProvider(&http_data);
1303 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1304
1305 // HTTP data for request to mail.example.org.
1306 MockRead http_reads2[] = {
1307 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291308 MockRead("Alt-Svc: quic=\":444\", quic=\"www.example.org:443\"\r\n\r\n"),
zhongyi32569c62016-01-08 02:54:301309 MockRead("hello world from mail.example.org"),
1310 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1311 MockRead(ASYNC, OK)};
1312
1313 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1314 nullptr, 0);
1315 socket_factory_.AddSocketDataProvider(&http_data2);
1316 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1317
1318 QuicStreamOffset request_header_offset = 0;
1319 QuicStreamOffset response_header_offset = 0;
1320
rch9ae5b3b2016-02-11 00:36:291321 QuicTestPacketMaker maker(GetParam(), 0, clock_, "mail.example.org");
1322 maker_.set_hostname("www.example.org");
zhongyi32569c62016-01-08 02:54:301323 MockQuicData mock_quic_data;
1324
1325 // First QUIC request data.
1326 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1327 1, kClientDataStreamId1, true, true,
1328 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1329
1330 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1331 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1332 &response_header_offset));
1333 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1334 true, 0, "hello from mail QUIC!"));
1335 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301336 // Second QUIC request data.
1337 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1338 3, kClientDataStreamId2, false, true,
bnc912a04b2016-04-20 14:19:501339 GetRequestHeaders("GET", "https", "/", &maker), &request_header_offset,
zhongyi32569c62016-01-08 02:54:301340 &maker));
1341 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1342 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1343 &response_header_offset));
1344 mock_quic_data.AddRead(ConstructDataPacket(4, kClientDataStreamId2, false,
1345 true, 0, "hello from mail QUIC!"));
1346 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
1347 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1348 mock_quic_data.AddRead(ASYNC, 0); // EOF
1349
1350 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1351 AddHangingNonAlternateProtocolSocketData();
1352
rch3f4b8452016-02-23 16:59:321353 CreateSession();
zhongyi32569c62016-01-08 02:54:301354
1355 // Send two HTTP requests, responses set up alt-svc lists for the origins.
rch9ae5b3b2016-02-11 00:36:291356 request_.url = GURL("https://www.example.org/");
1357 SendRequestAndExpectHttpResponse("hello world from www.example.org");
zhongyi32569c62016-01-08 02:54:301358 request_.url = GURL("https://mail.example.org/");
1359 SendRequestAndExpectHttpResponse("hello world from mail.example.org");
1360
rch9ae5b3b2016-02-11 00:36:291361 // Open a QUIC session to mail.example.org:443 when making request
1362 // to mail.example.org.
1363 request_.url = GURL("https://www.example.org/");
zhongyi32569c62016-01-08 02:54:301364 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443);
1365
rch9ae5b3b2016-02-11 00:36:291366 // Uses the existing QUIC session when making request to www.example.org.
zhongyi32569c62016-01-08 02:54:301367 request_.url = GURL("https://mail.example.org/");
1368 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443);
1369}
1370
1371// Multiple origins have listed the same alternative services. When there's a
1372// existing QUIC session opened by a request to other origin,
1373// if the cert is NOT valid, should ignore this QUIC session.
1374TEST_P(QuicNetworkTransactionTest,
1375 DoNotUseSharedExistingAlternativeServiceForQuicWithInvalidCert) {
rch9ae5b3b2016-02-11 00:36:291376 // Default cert is valid *.example.org
1377 // NOT valid for mail.example.com.
zhongyi32569c62016-01-08 02:54:301378
rch9ae5b3b2016-02-11 00:36:291379 // HTTP data for request to mail.example.org.
zhongyi32569c62016-01-08 02:54:301380 MockRead http_reads[] = {
1381 MockRead("HTTP/1.1 200 OK\r\n"),
1382 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
rch9ae5b3b2016-02-11 00:36:291383 MockRead("hello world from mail.example.org"),
zhongyi32569c62016-01-08 02:54:301384 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);
1390 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1391
rch9ae5b3b2016-02-11 00:36:291392 // HTTP data for request to mail.example.com.
zhongyi32569c62016-01-08 02:54:301393 MockRead http_reads2[] = {
1394 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291395 MockRead("Alt-Svc: quic=\":444\", quic=\"mail.example.org:443\"\r\n\r\n"),
1396 MockRead("hello world from mail.example.com"),
zhongyi32569c62016-01-08 02:54:301397 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1398 MockRead(ASYNC, OK)};
1399
1400 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1401 nullptr, 0);
1402 socket_factory_.AddSocketDataProvider(&http_data2);
1403 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1404
rch9ae5b3b2016-02-11 00:36:291405 QuicTestPacketMaker maker(GetParam(), 0, clock_, "mail.example.org");
1406 maker.set_hostname("mail.example.com");
zhongyi32569c62016-01-08 02:54:301407 MockQuicData mock_quic_data;
1408 MockQuicData mock_quic_data2;
1409
1410 // Adding a valid cert for *.example.org but not mail.example.com.
1411 ProofVerifyDetailsChromium verify_details;
1412 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:291413 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
zhongyi32569c62016-01-08 02:54:301414 verify_details.cert_verify_result.verified_cert = cert;
1415 verify_details.cert_verify_result.is_issued_by_known_root = true;
1416 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1417
1418 // First QUIC request data.
1419 mock_quic_data.AddWrite(
1420 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1421 GetRequestHeaders("GET", "https", "/")));
1422 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1423 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1424 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1425 true, 0, "hello from mail QUIC!"));
1426 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1427 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1428 mock_quic_data.AddRead(ASYNC, 0); // EOF
1429
1430 // First QUIC request data.
1431 mock_quic_data2.AddWrite(ConstructRequestHeadersPacket(
1432 1, kClientDataStreamId1, true, true,
bnc912a04b2016-04-20 14:19:501433 GetRequestHeaders("GET", "https", "/", &maker), &maker));
zhongyi32569c62016-01-08 02:54:301434 mock_quic_data2.AddRead(
1435 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
1436 GetResponseHeaders("200 OK"), &maker));
1437 mock_quic_data2.AddRead(ConstructDataPacket(
1438 2, kClientDataStreamId1, false, true, 0, "hello from docs QUIC!"));
1439 mock_quic_data2.AddWrite(ConstructAckPacket(2, 1, &maker));
1440 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1441 mock_quic_data2.AddRead(ASYNC, 0); // EOF
1442
1443 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1444 AddHangingNonAlternateProtocolSocketData();
1445
1446 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
1447 AddHangingNonAlternateProtocolSocketData();
1448
rch3f4b8452016-02-23 16:59:321449 CreateSession();
zhongyi32569c62016-01-08 02:54:301450
1451 // Send HTTP requests, responses set up the alt-svc lists for the origins.
rch9ae5b3b2016-02-11 00:36:291452 SendRequestAndExpectHttpResponse("hello world from mail.example.org");
zhongyi32569c62016-01-08 02:54:301453 request_.url = GURL("https://mail.example.com/");
rch9ae5b3b2016-02-11 00:36:291454 SendRequestAndExpectHttpResponse("hello world from mail.example.com");
1455
1456 // Open a QUIC session to mail.example.org:443 when making request
1457 // to mail.example.org.
1458 request_.url = GURL("https://mail.example.org/");
zhongyi32569c62016-01-08 02:54:301459 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443);
1460
rch9ae5b3b2016-02-11 00:36:291461 // Open another new QUIC session to mail.example.com:444.
1462 request_.url = GURL("https://mail.example.com/");
zhongyi32569c62016-01-08 02:54:301463 SendRequestAndExpectQuicResponseOnPort("hello from docs QUIC!", 444);
bncc958faa2015-07-31 18:14:521464}
1465
1466TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) {
bncc958faa2015-07-31 18:14:521467 MockRead http_reads[] = {
1468 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561469 MockRead(kQuicAlternativeServiceDifferentPortHeader),
bncc958faa2015-07-31 18:14:521470 MockRead("hello world"),
1471 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1472 MockRead(ASYNC, OK)};
1473
1474 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1475 0);
1476 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561477 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521478
1479 MockQuicData mock_quic_data;
1480 mock_quic_data.AddWrite(
1481 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561482 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521483 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1484 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1485 mock_quic_data.AddRead(
1486 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1487 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1488 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591489 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521490
1491 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1492
1493 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321494 CreateSession();
bncc958faa2015-07-31 18:14:521495
1496 SendRequestAndExpectHttpResponse("hello world");
1497 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
1498}
1499
1500TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) {
bncc958faa2015-07-31 18:14:521501 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561502 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1503 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521504 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1505 MockRead(ASYNC, OK)};
1506
1507 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1508 0);
1509 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561510 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521511
1512 MockQuicData mock_quic_data;
1513 mock_quic_data.AddWrite(
1514 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561515 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521516 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1517 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1518 mock_quic_data.AddRead(
1519 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1520 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1521 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1522 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521523
1524 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1525
1526 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321527 CreateSession();
bncc958faa2015-07-31 18:14:521528
1529 AlternativeService alternative_service(QUIC,
1530 HostPortPair::FromURL(request_.url));
1531 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
1532 alternative_service);
1533 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1534 alternative_service));
1535
1536 SendRequestAndExpectHttpResponse("hello world");
1537 SendRequestAndExpectQuicResponse("hello!");
1538
mmenkee24011922015-12-17 22:12:591539 mock_quic_data.Resume();
bncc958faa2015-07-31 18:14:521540
1541 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1542 alternative_service));
1543}
1544
bncc958faa2015-07-31 18:14:521545TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) {
bncc958faa2015-07-31 18:14:521546 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561547 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1548 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521549 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1550 MockRead(ASYNC, OK)};
1551
1552 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1553 0);
1554 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561555 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521556
1557 MockQuicData mock_quic_data;
1558 mock_quic_data.AddWrite(
1559 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561560 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521561 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1562 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1563 mock_quic_data.AddRead(
1564 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1565 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1566 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
1567
1568 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1569
1570 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321571 CreateSession();
bncc958faa2015-07-31 18:14:521572
1573 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1574 SendRequestAndExpectHttpResponse("hello world");
1575}
1576
[email protected]1e960032013-12-20 19:00:201577TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
[email protected]aa9b14d2013-05-10 23:45:191578 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561579 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1580 MockRead("hello world"),
1581 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1582 MockRead(ASYNC, OK)};
[email protected]61a527782013-02-21 03:58:001583
rjshaded5ced072015-12-18 19:26:021584 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1585 0);
[email protected]aa9b14d2013-05-10 23:45:191586 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561587 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]61a527782013-02-21 03:58:001588
[email protected]1e960032013-12-20 19:00:201589 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031590 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051591 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561592 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021593 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1594 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031595 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051596 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031597 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501598 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591599 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]61a527782013-02-21 03:58:001600
rcha5399e02015-04-21 19:32:041601 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]61a527782013-02-21 03:58:001602
[email protected]aa9b14d2013-05-10 23:45:191603 // The non-alternate protocol job needs to hang in order to guarantee that
1604 // the alternate-protocol job will "win".
1605 AddHangingNonAlternateProtocolSocketData();
[email protected]61a527782013-02-21 03:58:001606
rch3f4b8452016-02-23 16:59:321607 params_.parse_alternative_services = false;
1608 params_.parse_alternative_services = false;
1609 CreateSession();
[email protected]61a527782013-02-21 03:58:001610
[email protected]aa9b14d2013-05-10 23:45:191611 SendRequestAndExpectHttpResponse("hello world");
1612 SendRequestAndExpectQuicResponse("hello!");
[email protected]61a527782013-02-21 03:58:001613}
1614
rchf47265dc2016-03-21 21:33:121615TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolWithProbabilityForQuic) {
1616 MockRead http_reads[] = {
1617 MockRead("HTTP/1.1 200 OK\r\n"),
1618 MockRead(kQuicAlternateProtocolWithProbabilityHeader),
1619 MockRead("hello world"),
1620 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1621 MockRead(ASYNC, OK)};
1622
1623 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1624 0);
1625 socket_factory_.AddSocketDataProvider(&http_data);
1626 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1627
1628 MockQuicData mock_quic_data;
1629 mock_quic_data.AddWrite(
1630 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1631 GetRequestHeaders("GET", "https", "/")));
1632 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1633 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1634 mock_quic_data.AddRead(
1635 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1636 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1637 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1638 mock_quic_data.AddRead(ASYNC, 0); // EOF
1639
1640 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1641
1642 // The non-alternate protocol job needs to hang in order to guarantee that
1643 // the alternate-protocol job will "win".
1644 AddHangingNonAlternateProtocolSocketData();
1645
1646 params_.parse_alternative_services = false;
1647 params_.parse_alternative_services = false;
1648 CreateSession();
1649
1650 SendRequestAndExpectHttpResponse("hello world");
1651 SendRequestAndExpectQuicResponse("hello!");
1652}
1653
bnc62a44f022015-04-02 15:59:411654TEST_P(QuicNetworkTransactionTest, AlternateProtocolDifferentPort) {
1655 MockRead http_reads[] = {
1656 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561657 MockRead(kQuicAlternateProtocolDifferentPortHeader),
bnc62a44f022015-04-02 15:59:411658 MockRead("hello world"),
1659 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1660 MockRead(ASYNC, OK)};
1661
1662 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1663 0);
1664 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561665 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bnc62a44f022015-04-02 15:59:411666
1667 MockQuicData mock_quic_data;
1668 mock_quic_data.AddWrite(
1669 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561670 GetRequestHeaders("GET", "https", "/")));
bnc62a44f022015-04-02 15:59:411671 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1672 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1673 mock_quic_data.AddRead(
1674 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1675 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501676 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591677 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc62a44f022015-04-02 15:59:411678
rcha5399e02015-04-21 19:32:041679 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bnc62a44f022015-04-02 15:59:411680
1681 // The non-alternate protocol job needs to hang in order to guarantee that
1682 // the alternate-protocol job will "win".
1683 AddHangingNonAlternateProtocolSocketData();
1684
rch3f4b8452016-02-23 16:59:321685 params_.parse_alternative_services = false;
1686 CreateSession();
bnc62a44f022015-04-02 15:59:411687
1688 SendRequestAndExpectHttpResponse("hello world");
1689 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
1690}
1691
bncc958faa2015-07-31 18:14:521692TEST_P(QuicNetworkTransactionTest, ConfirmAlternateProtocol) {
bncae8db8402015-03-26 20:13:501693 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561694 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
bncae8db8402015-03-26 20:13:501695 MockRead("hello world"),
1696 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1697 MockRead(ASYNC, OK)};
1698
1699 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1700 0);
1701 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561702 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncae8db8402015-03-26 20:13:501703
1704 MockQuicData mock_quic_data;
1705 mock_quic_data.AddWrite(
1706 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561707 GetRequestHeaders("GET", "https", "/")));
bncae8db8402015-03-26 20:13:501708 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1709 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1710 mock_quic_data.AddRead(
1711 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1712 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501713 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1714 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncae8db8402015-03-26 20:13:501715
rcha5399e02015-04-21 19:32:041716 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bncae8db8402015-03-26 20:13:501717
1718 // The non-alternate protocol job needs to hang in order to guarantee that
1719 // the alternate-protocol job will "win".
1720 AddHangingNonAlternateProtocolSocketData();
1721
rch3f4b8452016-02-23 16:59:321722 params_.parse_alternative_services = false;
1723 CreateSession();
bncae8db8402015-03-26 20:13:501724
1725 AlternativeService alternative_service(QUIC,
1726 HostPortPair::FromURL(request_.url));
bnc6be245c12015-05-15 11:24:071727 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
bncae8db8402015-03-26 20:13:501728 alternative_service);
bnc6be245c12015-05-15 11:24:071729 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1730 alternative_service));
bncae8db8402015-03-26 20:13:501731
1732 SendRequestAndExpectHttpResponse("hello world");
1733 SendRequestAndExpectQuicResponse("hello!");
1734
mmenkee24011922015-12-17 22:12:591735 mock_quic_data.Resume();
rchb27683c2015-07-29 23:53:501736
bnc6be245c12015-05-15 11:24:071737 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1738 alternative_service));
bncae8db8402015-03-26 20:13:501739}
1740
[email protected]1e960032013-12-20 19:00:201741TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) {
rch3f4b8452016-02-23 16:59:321742 params_.parse_alternative_services = false;
[email protected]6d1b4ed2013-07-10 03:57:541743 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561744 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1745 MockRead("hello world"),
1746 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1747 MockRead(ASYNC, OK)};
[email protected]6d1b4ed2013-07-10 03:57:541748
rjshaded5ced072015-12-18 19:26:021749 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1750 0);
[email protected]6d1b4ed2013-07-10 03:57:541751 socket_factory_.AddSocketDataProvider(&http_data);
1752
[email protected]1e960032013-12-20 19:00:201753 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031754 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051755 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561756 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021757 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1758 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031759 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051760 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031761 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501762 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591763 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]6d1b4ed2013-07-10 03:57:541764
rcha5399e02015-04-21 19:32:041765 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]6d1b4ed2013-07-10 03:57:541766
1767 // The non-alternate protocol job needs to hang in order to guarantee that
1768 // the alternate-protocol job will "win".
1769 AddHangingNonAlternateProtocolSocketData();
1770
rch3f4b8452016-02-23 16:59:321771 CreateSession();
[email protected]6d1b4ed2013-07-10 03:57:541772
1773 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1774 SendRequestAndExpectHttpResponse("hello world");
1775}
1776
bnccb7ff3c2015-05-21 20:51:551777class QuicAltSvcCertificateVerificationTest
1778 : public QuicNetworkTransactionTest {
1779 public:
1780 void Run(bool valid) {
zhongyi3d4a55e72016-04-22 20:36:461781 url::SchemeHostPort server(GURL(valid ? "https://mail.example.org:443"
1782 : "https://mail.example.com:443"));
bnccb7ff3c2015-05-21 20:51:551783 HostPortPair alternative("www.example.org", 443);
1784 std::string url("https://");
zhongyi3d4a55e72016-04-22 20:36:461785 url.append(server.host());
bnccb7ff3c2015-05-21 20:51:551786 url.append(":443");
1787 request_.url = GURL(url);
1788
zhongyi3d4a55e72016-04-22 20:36:461789 maker_.set_hostname(server.host());
bnccb7ff3c2015-05-21 20:51:551790 MockQuicData mock_quic_data;
1791 mock_quic_data.AddWrite(
1792 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1793 GetRequestHeaders("GET", "https", "/")));
1794 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1795 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1796 mock_quic_data.AddRead(
1797 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1798 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591799 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
bnccb7ff3c2015-05-21 20:51:551800 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1801
1802 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:291803 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bnccb7ff3c2015-05-21 20:51:551804 ASSERT_TRUE(cert.get());
1805 bool common_name_fallback_used;
1806 EXPECT_EQ(valid,
zhongyi3d4a55e72016-04-22 20:36:461807 cert->VerifyNameMatch(server.host(), &common_name_fallback_used));
bnccb7ff3c2015-05-21 20:51:551808 EXPECT_TRUE(
1809 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
1810 ProofVerifyDetailsChromium verify_details;
1811 verify_details.cert_verify_result.verified_cert = cert;
1812 verify_details.cert_verify_result.is_issued_by_known_root = true;
1813 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1814 crypto_client_stream_factory_.set_handshake_mode(
1815 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1816
zhongyi3d4a55e72016-04-22 20:36:461817 // Connection to |server| fails, so that success of |request| depends on
bnccb7ff3c2015-05-21 20:51:551818 // connection to |alternate| only.
1819 MockConnect refused_connect(ASYNC, ERR_CONNECTION_REFUSED);
1820 StaticSocketDataProvider refused_data;
1821 refused_data.set_connect_data(refused_connect);
1822 socket_factory_.AddSocketDataProvider(&refused_data);
1823
rch3f4b8452016-02-23 16:59:321824 CreateSession();
bnccb7ff3c2015-05-21 20:51:551825 AlternativeService alternative_service(QUIC, alternative);
bnc7dc7e1b42015-07-28 14:43:121826 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
bnccb7ff3c2015-05-21 20:51:551827 session_->http_server_properties()->SetAlternativeService(
zhongyi3d4a55e72016-04-22 20:36:461828 server, alternative_service, expiration);
danakjad1777e2016-04-16 00:56:421829 std::unique_ptr<HttpNetworkTransaction> trans(
bnccb7ff3c2015-05-21 20:51:551830 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1831 TestCompletionCallback callback;
1832 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1833 EXPECT_EQ(ERR_IO_PENDING, rv);
1834 rv = callback.WaitForResult();
1835 if (valid) {
1836 EXPECT_EQ(OK, rv);
1837 CheckWasQuicResponse(trans);
1838 CheckResponsePort(trans, 443);
1839 CheckResponseData(trans, "hello!");
1840 } else {
1841 EXPECT_EQ(ERR_CONNECTION_REFUSED, rv);
1842 }
1843 }
1844};
1845
1846INSTANTIATE_TEST_CASE_P(Version,
1847 QuicAltSvcCertificateVerificationTest,
1848 ::testing::ValuesIn(QuicSupportedVersions()));
1849
1850TEST_P(QuicAltSvcCertificateVerificationTest,
1851 RequestSucceedsWithValidCertificate) {
1852 Run(true);
1853}
1854
1855TEST_P(QuicAltSvcCertificateVerificationTest,
1856 RequestFailsWithInvalidCertificate) {
1857 Run(false);
1858}
1859
[email protected]1e960032013-12-20 19:00:201860TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) {
rch3f4b8452016-02-23 16:59:321861 params_.parse_alternative_services = false;
[email protected]dda75ab2013-06-22 22:43:301862 crypto_client_stream_factory_.set_handshake_mode(
1863 MockCryptoClientStream::COLD_START);
1864
1865 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561866 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
rch9ae5b3b2016-02-11 00:36:291867 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561868 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")};
[email protected]dda75ab2013-06-22 22:43:301869
1870 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561871 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1872 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1873 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]dda75ab2013-06-22 22:43:301874
mmenke651bae7f2015-12-18 21:26:451875 SequencedSocketData http_data(http_reads, arraysize(http_reads), http_writes,
1876 arraysize(http_writes));
bnc912a04b2016-04-20 14:19:501877 socket_factory_.AddSocketDataProvider(&http_data);
1878 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301879
1880 // The QUIC transaction will not be allowed to complete.
mmenke651bae7f2015-12-18 21:26:451881 MockWrite quic_writes[] = {MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 1)};
[email protected]dda75ab2013-06-22 22:43:301882 MockRead quic_reads[] = {
mmenke651bae7f2015-12-18 21:26:451883 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0),
[email protected]dda75ab2013-06-22 22:43:301884 };
mmenke651bae7f2015-12-18 21:26:451885 SequencedSocketData quic_data(quic_reads, arraysize(quic_reads), quic_writes,
1886 arraysize(quic_writes));
bnc912a04b2016-04-20 14:19:501887 socket_factory_.AddSocketDataProvider(&quic_data);
[email protected]dda75ab2013-06-22 22:43:301888
1889 // The HTTP transaction will complete.
mmenke651bae7f2015-12-18 21:26:451890 SequencedSocketData http_data2(http_reads, arraysize(http_reads), http_writes,
1891 arraysize(http_writes));
bnc912a04b2016-04-20 14:19:501892 socket_factory_.AddSocketDataProvider(&http_data2);
1893 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301894
bnc912a04b2016-04-20 14:19:501895 CreateSession();
[email protected]dda75ab2013-06-22 22:43:301896
1897 // Run the first request.
[email protected]dda75ab2013-06-22 22:43:301898 SendRequestAndExpectHttpResponse("hello world");
rch37de576c2015-05-17 20:28:171899 ASSERT_TRUE(http_data.AllReadDataConsumed());
1900 ASSERT_TRUE(http_data.AllWriteDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301901
1902 // Now run the second request in which the QUIC socket hangs,
1903 // and verify the the transaction continues over HTTP.
[email protected]dda75ab2013-06-22 22:43:301904 SendRequestAndExpectHttpResponse("hello world");
mmenke651bae7f2015-12-18 21:26:451905 base::RunLoop().RunUntilIdle();
[email protected]dda75ab2013-06-22 22:43:301906
rch37de576c2015-05-17 20:28:171907 ASSERT_TRUE(http_data2.AllReadDataConsumed());
1908 ASSERT_TRUE(http_data2.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:451909 ASSERT_TRUE(quic_data.AllReadDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301910}
1911
[email protected]1e960032013-12-20 19:00:201912TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
[email protected]1e960032013-12-20 19:00:201913 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031914 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051915 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561916 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021917 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1918 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031919 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051920 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031921 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501922 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591923 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]8ba81212013-05-03 13:11:481924
rcha5399e02015-04-21 19:32:041925 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]8ba81212013-05-03 13:11:481926
[email protected]3a120a6b2013-06-25 01:08:271927 // The non-alternate protocol job needs to hang in order to guarantee that
1928 // the alternate-protocol job will "win".
[email protected]dda75ab2013-06-22 22:43:301929 AddHangingNonAlternateProtocolSocketData();
1930
rch3f4b8452016-02-23 16:59:321931 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:191932 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1933 SendRequestAndExpectQuicResponse("hello!");
[email protected]8ba81212013-05-03 13:11:481934}
1935
[email protected]1e960032013-12-20 19:00:201936TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
[email protected]1e960032013-12-20 19:00:201937 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031938 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051939 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561940 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021941 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1942 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031943 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051944 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031945 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501946 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591947 mock_quic_data.AddRead(ASYNC, 0); // EOF
rcha5399e02015-04-21 19:32:041948 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]3a120a6b2013-06-25 01:08:271949
1950 // In order for a new QUIC session to be established via alternate-protocol
1951 // without racing an HTTP connection, we need the host resolution to happen
1952 // synchronously.
1953 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291954 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561955 "");
rch9ae5b3b2016-02-11 00:36:291956 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]3a120a6b2013-06-25 01:08:271957 AddressList address;
rjshaded5ced072015-12-18 19:26:021958 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1959 nullptr, net_log_.bound());
[email protected]3a120a6b2013-06-25 01:08:271960
rch3f4b8452016-02-23 16:59:321961 CreateSession();
[email protected]3a120a6b2013-06-25 01:08:271962 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1963 SendRequestAndExpectQuicResponse("hello!");
1964}
1965
[email protected]0fc924b2014-03-31 04:34:151966TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) {
rdsmith82957ad2015-09-16 19:42:031967 proxy_service_ = ProxyService::CreateFixedFromPacResult("PROXY myproxy:70");
[email protected]0fc924b2014-03-31 04:34:151968
1969 // Since we are using a proxy, the QUIC job will not succeed.
1970 MockWrite http_writes[] = {
rch9ae5b3b2016-02-11 00:36:291971 MockWrite(SYNCHRONOUS, 0, "GET http://mail.example.org/ HTTP/1.1\r\n"),
1972 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561973 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")};
[email protected]0fc924b2014-03-31 04:34:151974
1975 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561976 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1977 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1978 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]0fc924b2014-03-31 04:34:151979
1980 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
1981 http_writes, arraysize(http_writes));
1982 socket_factory_.AddSocketDataProvider(&http_data);
1983
1984 // In order for a new QUIC session to be established via alternate-protocol
1985 // without racing an HTTP connection, we need the host resolution to happen
1986 // synchronously.
1987 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291988 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561989 "");
rch9ae5b3b2016-02-11 00:36:291990 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]0fc924b2014-03-31 04:34:151991 AddressList address;
rjshaded5ced072015-12-18 19:26:021992 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1993 nullptr, net_log_.bound());
[email protected]0fc924b2014-03-31 04:34:151994
rch9ae5b3b2016-02-11 00:36:291995 request_.url = GURL("http://mail.example.org/");
rch3f4b8452016-02-23 16:59:321996 CreateSession();
[email protected]0fc924b2014-03-31 04:34:151997 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1998 SendRequestAndExpectHttpResponse("hello world");
1999}
2000
[email protected]1e960032013-12-20 19:00:202001TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
[email protected]1e960032013-12-20 19:00:202002 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:032003 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:052004 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:562005 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:022006 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
2007 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:032008 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:052009 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:032010 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:592011 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
rcha5399e02015-04-21 19:32:042012 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]11c05872013-08-20 02:04:122013
2014 // The non-alternate protocol job needs to hang in order to guarantee that
2015 // the alternate-protocol job will "win".
2016 AddHangingNonAlternateProtocolSocketData();
2017
2018 // In order for a new QUIC session to be established via alternate-protocol
2019 // without racing an HTTP connection, we need the host resolution to happen
2020 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
2021 // connection to the the server, in this test we require confirmation
2022 // before encrypting so the HTTP job will still start.
2023 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:292024 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:562025 "");
rch9ae5b3b2016-02-11 00:36:292026 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]11c05872013-08-20 02:04:122027 AddressList address;
rjshaded5ced072015-12-18 19:26:022028 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2029 nullptr, net_log_.bound());
[email protected]11c05872013-08-20 02:04:122030
rch3f4b8452016-02-23 16:59:322031 CreateSession();
[email protected]11c05872013-08-20 02:04:122032 session_->quic_stream_factory()->set_require_confirmation(true);
2033 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2034
danakjad1777e2016-04-16 00:56:422035 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]11c05872013-08-20 02:04:122036 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2037 TestCompletionCallback callback;
2038 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2039 EXPECT_EQ(ERR_IO_PENDING, rv);
2040
2041 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
2042 QuicSession::HANDSHAKE_CONFIRMED);
2043 EXPECT_EQ(OK, callback.WaitForResult());
rchb27683c2015-07-29 23:53:502044
2045 CheckWasQuicResponse(trans);
2046 CheckResponseData(trans, "hello!");
[email protected]11c05872013-08-20 02:04:122047}
2048
zhongyica364fbb2015-12-12 03:39:122049TEST_P(QuicNetworkTransactionTest,
2050 LogGranularQuicErrorCodeOnQuicProtocolErrorLocal) {
2051 MockQuicData mock_quic_data;
2052 mock_quic_data.AddWrite(
2053 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
2054 GetRequestHeaders("GET", "https", "/")));
2055 // Read a close connection packet with
2056 // QuicErrorCode: QUIC_CRYPTO_VERSION_NOT_SUPPORTED from the peer.
2057 mock_quic_data.AddRead(ConstructConnectionClosePacket(1));
2058 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2059
2060 // The non-alternate protocol job needs to hang in order to guarantee that
2061 // the alternate-protocol job will "win".
2062 AddHangingNonAlternateProtocolSocketData();
2063
2064 // In order for a new QUIC session to be established via alternate-protocol
2065 // without racing an HTTP connection, we need the host resolution to happen
2066 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
2067 // connection to the the server, in this test we require confirmation
2068 // before encrypting so the HTTP job will still start.
2069 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:292070 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:122071 "");
rch9ae5b3b2016-02-11 00:36:292072 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:122073 AddressList address;
2074 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2075 nullptr, net_log_.bound());
2076
rch3f4b8452016-02-23 16:59:322077 CreateSession();
zhongyica364fbb2015-12-12 03:39:122078 session_->quic_stream_factory()->set_require_confirmation(true);
2079 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2080
danakjad1777e2016-04-16 00:56:422081 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyica364fbb2015-12-12 03:39:122082 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2083 TestCompletionCallback callback;
2084 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2085 EXPECT_EQ(ERR_IO_PENDING, rv);
2086
2087 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
2088 QuicSession::HANDSHAKE_CONFIRMED);
2089 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
2090
2091 NetErrorDetails details;
2092 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
2093
2094 trans->PopulateNetErrorDetails(&details);
2095 // Verify the error code logged is what sent by the peer.
2096 EXPECT_EQ(QUIC_CRYPTO_VERSION_NOT_SUPPORTED, details.quic_connection_error);
2097}
2098
2099TEST_P(QuicNetworkTransactionTest,
2100 LogGranularQuicErrorCodeOnQuicProtocolErrorRemote) {
rch16c74d1d2016-04-22 06:14:072101 ValueRestore<bool> old_flag(&FLAGS_quic_ignore_invalid_error_code, false);
zhongyica364fbb2015-12-12 03:39:122102 MockQuicData mock_quic_data;
2103 mock_quic_data.AddWrite(
2104 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
2105 GetRequestHeaders("GET", "https", "/")));
2106 // Peer sending an invalid stream frame with a invalid stream error causes
2107 // this end to raise error and close connection.
2108 mock_quic_data.AddRead(ConstructRstPacket(1, false, kClientDataStreamId1,
2109 QUIC_STREAM_LAST_ERROR));
2110 std::string quic_error_details = "Invalid rst stream error code.";
2111 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(
2112 2, QuicTime::Delta::Infinite(), 0, 1, QUIC_INVALID_RST_STREAM_DATA,
2113 quic_error_details));
2114 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2115
2116 // The non-alternate protocol job needs to hang in order to guarantee that
2117 // the alternate-protocol job will "win".
2118 AddHangingNonAlternateProtocolSocketData();
2119
2120 // In order for a new QUIC session to be established via alternate-protocol
2121 // without racing an HTTP connection, we need the host resolution to happen
2122 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
2123 // connection to the the server, in this test we require confirmation
2124 // before encrypting so the HTTP job will still start.
2125 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:292126 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:122127 "");
rch9ae5b3b2016-02-11 00:36:292128 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:122129 AddressList address;
2130 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2131 nullptr, net_log_.bound());
2132
rch3f4b8452016-02-23 16:59:322133 CreateSession();
zhongyica364fbb2015-12-12 03:39:122134 session_->quic_stream_factory()->set_require_confirmation(true);
2135 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2136
danakjad1777e2016-04-16 00:56:422137 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyica364fbb2015-12-12 03:39:122138 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2139 TestCompletionCallback callback;
2140 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2141 EXPECT_EQ(ERR_IO_PENDING, rv);
2142
2143 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
2144 QuicSession::HANDSHAKE_CONFIRMED);
2145 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
2146 NetErrorDetails details;
2147 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
2148
2149 trans->PopulateNetErrorDetails(&details);
2150 EXPECT_EQ(QUIC_INVALID_RST_STREAM_DATA, details.quic_connection_error);
2151}
2152
[email protected]1e960032013-12-20 19:00:202153TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
[email protected]3316d422013-05-03 21:45:302154 // Alternate-protocol job
danakjad1777e2016-04-16 00:56:422155 std::unique_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1));
[email protected]3316d422013-05-03 21:45:302156 MockRead quic_reads[] = {
rchb27683c2015-07-29 23:53:502157 MockRead(ASYNC, close->data(), close->length()),
2158 MockRead(ASYNC, ERR_IO_PENDING), // No more data to read
2159 MockRead(ASYNC, OK), // EOF
[email protected]3316d422013-05-03 21:45:302160 };
rjshaded5ced072015-12-18 19:26:022161 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2162 0);
[email protected]3316d422013-05-03 21:45:302163 socket_factory_.AddSocketDataProvider(&quic_data);
2164
2165 // Main job which will succeed even though the alternate job fails.
2166 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022167 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2168 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2169 MockRead(ASYNC, OK)};
[email protected]3316d422013-05-03 21:45:302170
rjshaded5ced072015-12-18 19:26:022171 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2172 0);
[email protected]3316d422013-05-03 21:45:302173 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562174 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]3316d422013-05-03 21:45:302175
rch3f4b8452016-02-23 16:59:322176 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:192177 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2178 SendRequestAndExpectHttpResponse("hello from http");
2179 ExpectBrokenAlternateProtocolMapping();
[email protected]3316d422013-05-03 21:45:302180}
2181
[email protected]1e960032013-12-20 19:00:202182TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
[email protected]d03a66d2013-05-06 12:55:592183 // Alternate-protocol job
2184 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022185 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]d03a66d2013-05-06 12:55:592186 };
rjshaded5ced072015-12-18 19:26:022187 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2188 0);
[email protected]d03a66d2013-05-06 12:55:592189 socket_factory_.AddSocketDataProvider(&quic_data);
2190
2191 // Main job which will succeed even though the alternate job fails.
2192 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022193 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2194 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2195 MockRead(ASYNC, OK)};
[email protected]d03a66d2013-05-06 12:55:592196
rjshaded5ced072015-12-18 19:26:022197 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2198 0);
[email protected]d03a66d2013-05-06 12:55:592199 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562200 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]d03a66d2013-05-06 12:55:592201
rch3f4b8452016-02-23 16:59:322202 CreateSession();
[email protected]d03a66d2013-05-06 12:55:592203
[email protected]aa9b14d2013-05-10 23:45:192204 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2205 SendRequestAndExpectHttpResponse("hello from http");
2206 ExpectBrokenAlternateProtocolMapping();
[email protected]d03a66d2013-05-06 12:55:592207}
2208
[email protected]00c159f2014-05-21 22:38:162209TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) {
[email protected]eb71ab62014-05-23 07:57:532210 // Alternate-protocol job will fail when the session attempts to read.
[email protected]00c159f2014-05-21 22:38:162211 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022212 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162213 };
rjshaded5ced072015-12-18 19:26:022214 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2215 0);
[email protected]00c159f2014-05-21 22:38:162216 socket_factory_.AddSocketDataProvider(&quic_data);
2217
[email protected]eb71ab62014-05-23 07:57:532218 // Main job will also fail.
[email protected]00c159f2014-05-21 22:38:162219 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022220 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162221 };
2222
rjshaded5ced072015-12-18 19:26:022223 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2224 0);
[email protected]00c159f2014-05-21 22:38:162225 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED));
2226 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562227 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]00c159f2014-05-21 22:38:162228
rch3f4b8452016-02-23 16:59:322229 CreateSession();
[email protected]00c159f2014-05-21 22:38:162230
2231 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
danakjad1777e2016-04-16 00:56:422232 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]00c159f2014-05-21 22:38:162233 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2234 TestCompletionCallback callback;
2235 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2236 EXPECT_EQ(ERR_IO_PENDING, rv);
2237 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult());
2238 ExpectQuicAlternateProtocolMapping();
2239}
2240
[email protected]1e960032013-12-20 19:00:202241TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
[email protected]77c6c162013-08-17 02:57:452242 // Alternate-protocol job
2243 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022244 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]77c6c162013-08-17 02:57:452245 };
rjshaded5ced072015-12-18 19:26:022246 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2247 0);
[email protected]77c6c162013-08-17 02:57:452248 socket_factory_.AddSocketDataProvider(&quic_data);
2249
2250 AddHangingNonAlternateProtocolSocketData();
2251
[email protected]c92c1b52014-05-31 04:16:062252 // Second Alternate-protocol job which will race with the TCP job.
2253 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:422254 nullptr, 0);
[email protected]c92c1b52014-05-31 04:16:062255 socket_factory_.AddSocketDataProvider(&quic_data2);
2256
[email protected]4d283b32013-10-17 12:57:272257 // Final job that will proceed when the QUIC job fails.
2258 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022259 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2260 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2261 MockRead(ASYNC, OK)};
[email protected]4d283b32013-10-17 12:57:272262
rjshaded5ced072015-12-18 19:26:022263 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2264 0);
[email protected]4d283b32013-10-17 12:57:272265 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562266 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d283b32013-10-17 12:57:272267
rch3f4b8452016-02-23 16:59:322268 CreateSession();
[email protected]77c6c162013-08-17 02:57:452269
2270 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2271
[email protected]4d283b32013-10-17 12:57:272272 SendRequestAndExpectHttpResponse("hello from http");
[email protected]77c6c162013-08-17 02:57:452273
2274 ExpectBrokenAlternateProtocolMapping();
[email protected]4d283b32013-10-17 12:57:272275
rch37de576c2015-05-17 20:28:172276 EXPECT_TRUE(quic_data.AllReadDataConsumed());
2277 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
[email protected]77c6c162013-08-17 02:57:452278}
2279
[email protected]93b31772014-06-19 08:03:352280TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) {
[email protected]65768442014-06-06 23:37:032281 // Alternate-protocol job
2282 MockRead quic_reads[] = {
mmenkee24011922015-12-17 22:12:592283 MockRead(SYNCHRONOUS, ERR_IO_PENDING),
[email protected]65768442014-06-06 23:37:032284 };
rjshaded5ced072015-12-18 19:26:022285 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2286 0);
[email protected]65768442014-06-06 23:37:032287 socket_factory_.AddSocketDataProvider(&quic_data);
2288
2289 // Main job that will proceed when the QUIC job fails.
2290 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022291 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2292 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2293 MockRead(ASYNC, OK)};
[email protected]65768442014-06-06 23:37:032294
rjshaded5ced072015-12-18 19:26:022295 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2296 0);
[email protected]65768442014-06-06 23:37:032297 socket_factory_.AddSocketDataProvider(&http_data);
2298
rch3f4b8452016-02-23 16:59:322299 CreateSession();
[email protected]65768442014-06-06 23:37:032300
2301 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2302
2303 SendRequestAndExpectHttpResponse("hello from http");
2304}
2305
[email protected]eb71ab62014-05-23 07:57:532306TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
[email protected]4d590c9c2014-05-02 05:14:332307 // Alternate-protocol job will fail before creating a QUIC session.
rtennetibe635732014-10-02 22:51:422308 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0);
rjshaded5ced072015-12-18 19:26:022309 quic_data.set_connect_data(
2310 MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED));
[email protected]4d590c9c2014-05-02 05:14:332311 socket_factory_.AddSocketDataProvider(&quic_data);
2312
2313 // Main job which will succeed even though the alternate job fails.
2314 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022315 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2316 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2317 MockRead(ASYNC, OK)};
[email protected]4d590c9c2014-05-02 05:14:332318
rjshaded5ced072015-12-18 19:26:022319 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2320 0);
[email protected]4d590c9c2014-05-02 05:14:332321 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562322 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d590c9c2014-05-02 05:14:332323
rch3f4b8452016-02-23 16:59:322324 CreateSession();
[email protected]4d590c9c2014-05-02 05:14:332325 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2326 SendRequestAndExpectHttpResponse("hello from http");
[email protected]eb71ab62014-05-23 07:57:532327
2328 ExpectBrokenAlternateProtocolMapping();
[email protected]4d590c9c2014-05-02 05:14:332329}
2330
[email protected]4fee9672014-01-08 14:47:152331TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
[email protected]4fee9672014-01-08 14:47:152332 MockQuicData mock_quic_data;
rcha5399e02015-04-21 19:32:042333 mock_quic_data.AddSynchronousRead(ConstructConnectionClosePacket(1));
[email protected]92bf17c2014-03-03 21:14:032334 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:052335 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:562336 GetRequestHeaders("GET", "https", "/")));
[email protected]92bf17c2014-03-03 21:14:032337 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rcha5399e02015-04-21 19:32:042338 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4fee9672014-01-08 14:47:152339
2340 // When the QUIC connection fails, we will try the request again over HTTP.
2341 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:562342 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
2343 MockRead("hello world"),
2344 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2345 MockRead(ASYNC, OK)};
[email protected]4fee9672014-01-08 14:47:152346
rjshaded5ced072015-12-18 19:26:022347 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2348 0);
[email protected]4fee9672014-01-08 14:47:152349 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562350 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4fee9672014-01-08 14:47:152351
2352 // In order for a new QUIC session to be established via alternate-protocol
2353 // without racing an HTTP connection, we need the host resolution to happen
2354 // synchronously.
2355 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:292356 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:562357 "");
rch9ae5b3b2016-02-11 00:36:292358 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]4fee9672014-01-08 14:47:152359 AddressList address;
rjshaded5ced072015-12-18 19:26:022360 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2361 nullptr, net_log_.bound());
[email protected]4fee9672014-01-08 14:47:152362
rch3f4b8452016-02-23 16:59:322363 CreateSession();
[email protected]4fee9672014-01-08 14:47:152364 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2365 SendRequestAndExpectHttpResponse("hello world");
2366}
2367
bnc508835902015-05-12 20:10:292368TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) {
bncb07c05532015-05-14 19:07:202369 maker_.set_hostname("www.example.org");
tbansal0f56a39a2016-04-07 22:03:382370 EXPECT_FALSE(
2371 test_socket_performance_watcher_factory_.rtt_notification_received());
bnc508835902015-05-12 20:10:292372 MockQuicData mock_quic_data;
2373 mock_quic_data.AddWrite(
2374 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
2375 GetRequestHeaders("GET", "https", "/")));
2376 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
2377 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
2378 mock_quic_data.AddRead(
2379 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
2380 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:502381 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
bnc508835902015-05-12 20:10:292382 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2383
bncb07c05532015-05-14 19:07:202384 request_.url = GURL("https://www.example.org:443");
bnc508835902015-05-12 20:10:292385 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322386 CreateSession();
bnc508835902015-05-12 20:10:292387 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
2388 SendRequestAndExpectQuicResponse("hello!");
tbansal0f56a39a2016-04-07 22:03:382389 EXPECT_TRUE(
2390 test_socket_performance_watcher_factory_.rtt_notification_received());
bnc508835902015-05-12 20:10:292391}
2392
rtenneti56977812016-01-15 19:26:562393TEST_P(QuicNetworkTransactionTest, QuicUpload) {
rtenneti8a2f4632016-03-21 20:26:572394 params_.origins_to_force_quic_on.insert(
2395 HostPortPair::FromString("mail.example.org:443"));
rtenneti56977812016-01-15 19:26:562396
2397 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2398 MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_FAILED, 1)};
2399 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2400 arraysize(writes));
2401 socket_factory_.AddSocketDataProvider(&socket_data);
2402
2403 // The non-alternate protocol job needs to hang in order to guarantee that
2404 // the alternate-protocol job will "win".
2405 AddHangingNonAlternateProtocolSocketData();
2406
rch3f4b8452016-02-23 16:59:322407 params_.parse_alternative_services = false;
2408 params_.enable_alternative_service_with_different_host = false;
rtenneti56977812016-01-15 19:26:562409 CreateSession();
2410 request_.method = "POST";
2411 ChunkedUploadDataStream upload_data(0);
2412 upload_data.AppendData("1", 1, true);
2413
2414 request_.upload_data_stream = &upload_data;
2415
danakjad1777e2016-04-16 00:56:422416 std::unique_ptr<HttpNetworkTransaction> trans(
rtenneti56977812016-01-15 19:26:562417 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2418 TestCompletionCallback callback;
2419 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2420 EXPECT_EQ(ERR_IO_PENDING, rv);
2421 EXPECT_NE(OK, callback.WaitForResult());
2422}
2423
[email protected]61a527782013-02-21 03:58:002424} // namespace test
2425} // namespace net