blob: 19bf8a7786bd1287a40032aa6fd1572e217b0de8 [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>
bnc359ed2a2016-04-29 20:43:456#include <ostream>
bnc912a04b2016-04-20 14:19:507#include <string>
8#include <utility>
[email protected]1e960032013-12-20 19:00:209#include <vector>
10
[email protected]61a527782013-02-21 03:58:0011#include "base/compiler_specific.h"
Avi Drissman13fc8932015-12-20 04:40:4612#include "base/macros.h"
mmenke651bae7f2015-12-18 21:26:4513#include "base/run_loop.h"
[email protected]98b20ce2013-05-10 05:55:2614#include "base/stl_util.h"
bnc8be55ebb2015-10-30 14:12:0715#include "base/strings/stringprintf.h"
rtenneti56977812016-01-15 19:26:5616#include "net/base/chunked_upload_data_stream.h"
[email protected]61a527782013-02-21 03:58:0017#include "net/base/test_completion_callback.h"
bnc508835902015-05-12 20:10:2918#include "net/base/test_data_directory.h"
[email protected]6e7845ae2013-03-29 21:48:1119#include "net/cert/mock_cert_verifier.h"
rtenneti052774e2015-11-24 21:00:1220#include "net/cert/multi_log_ct_verifier.h"
[email protected]f2cb3cf2013-03-21 01:40:5321#include "net/dns/mock_host_resolver.h"
[email protected]61a527782013-02-21 03:58:0022#include "net/http/http_auth_handler_factory.h"
23#include "net/http/http_network_session.h"
24#include "net/http/http_network_transaction.h"
25#include "net/http/http_server_properties_impl.h"
26#include "net/http/http_stream.h"
27#include "net/http/http_stream_factory.h"
[email protected]c41737d2014-05-14 07:47:1928#include "net/http/http_transaction_test_util.h"
[email protected]b1c988b2013-06-13 06:48:1129#include "net/http/transport_security_state.h"
vishal.b62985ca92015-04-17 08:45:5130#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4631#include "net/log/test_net_log_entry.h"
32#include "net/log/test_net_log_util.h"
[email protected]61a527782013-02-21 03:58:0033#include "net/proxy/proxy_config_service_fixed.h"
34#include "net/proxy/proxy_resolver.h"
35#include "net/proxy/proxy_service.h"
bnc508835902015-05-12 20:10:2936#include "net/quic/crypto/proof_verifier_chromium.h"
[email protected]61a527782013-02-21 03:58:0037#include "net/quic/crypto/quic_decrypter.h"
38#include "net/quic/crypto/quic_encrypter.h"
39#include "net/quic/quic_framer.h"
[email protected]24e5bc52013-09-18 15:36:5840#include "net/quic/quic_http_utils.h"
[email protected]ed3fc15d2013-03-08 18:37:4441#include "net/quic/test_tools/crypto_test_utils.h"
[email protected]61a527782013-02-21 03:58:0042#include "net/quic/test_tools/mock_clock.h"
[email protected]e8ff26842013-03-22 21:02:0543#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
[email protected]61a527782013-02-21 03:58:0044#include "net/quic/test_tools/mock_random.h"
[email protected]1e960032013-12-20 19:00:2045#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]61a527782013-02-21 03:58:0046#include "net/quic/test_tools/quic_test_utils.h"
47#include "net/socket/client_socket_factory.h"
48#include "net/socket/mock_client_socket_pool_manager.h"
tbansalca83c002016-04-28 20:56:2849#include "net/socket/socket_performance_watcher.h"
50#include "net/socket/socket_performance_watcher_factory.h"
[email protected]61a527782013-02-21 03:58:0051#include "net/socket/socket_test_util.h"
52#include "net/socket/ssl_client_socket.h"
53#include "net/spdy/spdy_frame_builder.h"
54#include "net/spdy/spdy_framer.h"
[email protected]536fd0b2013-03-14 17:41:5755#include "net/ssl/ssl_config_service_defaults.h"
bnc508835902015-05-12 20:10:2956#include "net/test/cert_test_util.h"
[email protected]61a527782013-02-21 03:58:0057#include "testing/gtest/include/gtest/gtest.h"
58#include "testing/platform_test.h"
zhongyi3d4a55e72016-04-22 20:36:4659#include "url/gurl.h"
[email protected]61a527782013-02-21 03:58:0060
bnc508835902015-05-12 20:10:2961namespace net {
62namespace test {
[email protected]61a527782013-02-21 03:58:0063
64namespace {
65
bnc359ed2a2016-04-29 20:43:4566enum DestinationType {
67 // In pooling tests with two requests for different origins to the same
68 // destination, the destination should be
69 SAME_AS_FIRST, // the same as the first origin,
70 SAME_AS_SECOND, // the same as the second origin, or
71 DIFFERENT, // different from both.
72};
73
rchf114d982015-10-21 01:34:5674static const char kQuicAlternateProtocolHeader[] =
[email protected]6d1b4ed2013-07-10 03:57:5475 "Alternate-Protocol: 443:quic\r\n\r\n";
rchf47265dc2016-03-21 21:33:1276static const char kQuicAlternateProtocolWithProbabilityHeader[] =
77 "Alternate-Protocol: 443:quic,p=.5\r\n\r\n";
rchf114d982015-10-21 01:34:5678static const char kQuicAlternateProtocolDifferentPortHeader[] =
79 "Alternate-Protocol: 137:quic\r\n\r\n";
80static const char kQuicAlternativeServiceHeader[] =
bncc958faa2015-07-31 18:14:5281 "Alt-Svc: quic=\":443\"\r\n\r\n";
rchf47265dc2016-03-21 21:33:1282static const char kQuicAlternativeServiceWithProbabilityHeader[] =
83 "Alt-Svc: quic=\":443\";p=\".5\"\r\n\r\n";
rchf114d982015-10-21 01:34:5684static const char kQuicAlternativeServiceDifferentPortHeader[] =
85 "Alt-Svc: quic=\":137\"\r\n\r\n";
[email protected]1e960032013-12-20 19:00:2086
rch9ae5b3b2016-02-11 00:36:2987const char kDefaultServerHostName[] = "mail.example.org";
bnc359ed2a2016-04-29 20:43:4588const char kDifferentHostname[] = "different.example.com";
89
90// Run QuicNetworkTransactionWithDestinationTest instances with all value
91// combinations of version and destination_type.
92struct PoolingTestParams {
93 friend std::ostream& operator<<(std::ostream& os,
94 const PoolingTestParams& p) {
95 os << "{ version: " << QuicVersionToString(p.version)
96 << ", destination_type: ";
97 switch (p.destination_type) {
98 case SAME_AS_FIRST:
99 os << "SAME_AS_FIRST";
100 break;
101 case SAME_AS_SECOND:
102 os << "SAME_AS_SECOND";
103 break;
104 case DIFFERENT:
105 os << "DIFFERENT";
106 break;
107 }
108 os << " }";
109 return os;
110 }
111
112 QuicVersion version;
113 DestinationType destination_type;
114};
115
116std::vector<PoolingTestParams> GetPoolingTestParams() {
117 std::vector<PoolingTestParams> params;
118 QuicVersionVector all_supported_versions = QuicSupportedVersions();
119 for (const QuicVersion version : all_supported_versions) {
120 params.push_back(PoolingTestParams{version, SAME_AS_FIRST});
121 params.push_back(PoolingTestParams{version, SAME_AS_SECOND});
122 params.push_back(PoolingTestParams{version, DIFFERENT});
123 }
124 return params;
125}
bncb07c05532015-05-14 19:07:20126
[email protected]61a527782013-02-21 03:58:00127} // namespace
128
[email protected]1e960032013-12-20 19:00:20129// Helper class to encapsulate MockReads and MockWrites for QUIC.
130// Simplify ownership issues and the interaction with the MockSocketFactory.
131class MockQuicData {
132 public:
rtennetia004d332015-08-28 06:44:57133 MockQuicData() : packet_number_(0) {}
rcha5399e02015-04-21 19:32:04134
rjshaded5ced072015-12-18 19:26:02135 ~MockQuicData() { STLDeleteElements(&packets_); }
[email protected]1e960032013-12-20 19:00:20136
danakjad1777e2016-04-16 00:56:42137 void AddSynchronousRead(std::unique_ptr<QuicEncryptedPacket> packet) {
[email protected]1e960032013-12-20 19:00:20138 reads_.push_back(MockRead(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:57139 packet_number_++));
[email protected]1e960032013-12-20 19:00:20140 packets_.push_back(packet.release());
141 }
142
danakjad1777e2016-04-16 00:56:42143 void AddRead(std::unique_ptr<QuicEncryptedPacket> packet) {
rcha5399e02015-04-21 19:32:04144 reads_.push_back(
rtennetia004d332015-08-28 06:44:57145 MockRead(ASYNC, packet->data(), packet->length(), packet_number_++));
rcha5399e02015-04-21 19:32:04146 packets_.push_back(packet.release());
147 }
148
[email protected]1e960032013-12-20 19:00:20149 void AddRead(IoMode mode, int rv) {
rtennetia004d332015-08-28 06:44:57150 reads_.push_back(MockRead(mode, rv, packet_number_++));
[email protected]1e960032013-12-20 19:00:20151 }
152
danakjad1777e2016-04-16 00:56:42153 void AddWrite(std::unique_ptr<QuicEncryptedPacket> packet) {
[email protected]1e960032013-12-20 19:00:20154 writes_.push_back(MockWrite(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:57155 packet_number_++));
[email protected]1e960032013-12-20 19:00:20156 packets_.push_back(packet.release());
157 }
158
rcha5399e02015-04-21 19:32:04159 void AddSocketDataToFactory(MockClientSocketFactory* factory) {
rjshaded5ced072015-12-18 19:26:02160 MockRead* reads = reads_.empty() ? nullptr : &reads_[0];
161 MockWrite* writes = writes_.empty() ? nullptr : &writes_[0];
rcha5399e02015-04-21 19:32:04162 socket_data_.reset(
163 new SequencedSocketData(reads, reads_.size(), writes, writes_.size()));
[email protected]1e960032013-12-20 19:00:20164 factory->AddSocketDataProvider(socket_data_.get());
165 }
166
mmenkee24011922015-12-17 22:12:59167 void Resume() { socket_data_->Resume(); }
rchb27683c2015-07-29 23:53:50168
[email protected]1e960032013-12-20 19:00:20169 private:
170 std::vector<QuicEncryptedPacket*> packets_;
171 std::vector<MockWrite> writes_;
172 std::vector<MockRead> reads_;
rtennetia004d332015-08-28 06:44:57173 size_t packet_number_;
danakjad1777e2016-04-16 00:56:42174 std::unique_ptr<SequencedSocketData> socket_data_;
[email protected]1e960032013-12-20 19:00:20175};
176
tbansal7cec3812015-02-05 21:25:12177class ProxyHeadersHandler {
178 public:
179 ProxyHeadersHandler() : was_called_(false) {}
180
181 bool was_called() { return was_called_; }
182
183 void OnBeforeProxyHeadersSent(const ProxyInfo& proxy_info,
184 HttpRequestHeaders* request_headers) {
185 was_called_ = true;
186 }
187
188 private:
189 bool was_called_;
190};
191
tbansal0f56a39a2016-04-07 22:03:38192class TestSocketPerformanceWatcher : public SocketPerformanceWatcher {
tbansalfdf5665b2015-09-21 22:46:40193 public:
tbansal0f56a39a2016-04-07 22:03:38194 explicit TestSocketPerformanceWatcher(bool* rtt_notification_received)
195 : rtt_notification_received_(rtt_notification_received) {}
196 ~TestSocketPerformanceWatcher() override {}
tbansalfdf5665b2015-09-21 22:46:40197
tbansal0f56a39a2016-04-07 22:03:38198 bool ShouldNotifyUpdatedRTT() const override { return true; }
tbansalfdf5665b2015-09-21 22:46:40199
tbansal0f56a39a2016-04-07 22:03:38200 void OnUpdatedRTTAvailable(const base::TimeDelta& rtt) override {
201 *rtt_notification_received_ = true;
202 }
203
204 void OnConnectionChanged() override {}
205
206 private:
207 bool* rtt_notification_received_;
208
209 DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcher);
210};
211
212class TestSocketPerformanceWatcherFactory
213 : public SocketPerformanceWatcherFactory {
214 public:
215 TestSocketPerformanceWatcherFactory()
216 : watcher_count_(0u), rtt_notification_received_(false) {}
217 ~TestSocketPerformanceWatcherFactory() override {}
218
219 // SocketPerformanceWatcherFactory implementation:
danakjad1777e2016-04-16 00:56:42220 std::unique_ptr<SocketPerformanceWatcher> CreateSocketPerformanceWatcher(
tbansalc8a94ea2015-11-02 23:58:51221 const Protocol protocol) override {
222 if (protocol != PROTOCOL_QUIC) {
tbansal0f56a39a2016-04-07 22:03:38223 return nullptr;
tbansalc8a94ea2015-11-02 23:58:51224 }
225 ++watcher_count_;
danakjad1777e2016-04-16 00:56:42226 return std::unique_ptr<SocketPerformanceWatcher>(
tbansal0f56a39a2016-04-07 22:03:38227 new TestSocketPerformanceWatcher(&rtt_notification_received_));
tbansalfdf5665b2015-09-21 22:46:40228 }
229
tbansalc8a94ea2015-11-02 23:58:51230 size_t watcher_count() const { return watcher_count_; }
tbansalfdf5665b2015-09-21 22:46:40231
tbansalc8a94ea2015-11-02 23:58:51232 bool rtt_notification_received() const { return rtt_notification_received_; }
233
tbansalc8a94ea2015-11-02 23:58:51234 private:
tbansal0f56a39a2016-04-07 22:03:38235 size_t watcher_count_;
tbansalc8a94ea2015-11-02 23:58:51236 bool rtt_notification_received_;
tbansal0f56a39a2016-04-07 22:03:38237
238 DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcherFactory);
tbansalc8a94ea2015-11-02 23:58:51239};
240
[email protected]1e960032013-12-20 19:00:20241class QuicNetworkTransactionTest
242 : public PlatformTest,
[email protected]5d03bbd2014-03-07 16:19:16243 public ::testing::WithParamInterface<QuicVersion> {
[email protected]61a527782013-02-21 03:58:00244 protected:
[email protected]1c04f9522013-02-21 20:32:43245 QuicNetworkTransactionTest()
rtenneti4b06ae72014-08-26 03:43:43246 : clock_(new MockClock),
alyssar2adf3ac2016-05-03 17:12:58247 client_maker_(GetParam(),
248 0,
249 clock_,
250 kDefaultServerHostName,
251 Perspective::IS_CLIENT),
252 server_maker_(GetParam(),
253 0,
254 clock_,
255 kDefaultServerHostName,
256 Perspective::IS_SERVER),
rtenneti052774e2015-11-24 21:00:12257 cert_transparency_verifier_(new MultiLogCTVerifier()),
[email protected]1c04f9522013-02-21 20:32:43258 ssl_config_service_(new SSLConfigServiceDefaults),
259 proxy_service_(ProxyService::CreateDirect()),
260 auth_handler_factory_(
[email protected]dda75ab2013-06-22 22:43:30261 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
[email protected]457d6952013-12-13 09:24:58262 random_generator_(0),
rchf114d982015-10-21 01:34:56263 ssl_data_(ASYNC, OK) {
[email protected]aa9b14d2013-05-10 23:45:19264 request_.method = "GET";
rchf114d982015-10-21 01:34:56265 std::string url("https://");
bncb07c05532015-05-14 19:07:20266 url.append(kDefaultServerHostName);
267 request_.url = GURL(url);
[email protected]aa9b14d2013-05-10 23:45:19268 request_.load_flags = 0;
[email protected]98a9d1252014-04-04 00:43:59269 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
rchf114d982015-10-21 01:34:56270
rch3f4b8452016-02-23 16:59:32271 params_.enable_alternative_service_with_different_host = true;
272
rchf114d982015-10-21 01:34:56273 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29274 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
rchf114d982015-10-21 01:34:56275 verify_details_.cert_verify_result.verified_cert = cert;
276 verify_details_.cert_verify_result.is_issued_by_known_root = true;
277 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
[email protected]1c04f9522013-02-21 20:32:43278 }
[email protected]61a527782013-02-21 03:58:00279
dcheng67be2b1f2014-10-27 21:47:29280 void SetUp() override {
[email protected]61a527782013-02-21 03:58:00281 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34282 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00283 }
284
dcheng67be2b1f2014-10-27 21:47:29285 void TearDown() override {
[email protected]61a527782013-02-21 03:58:00286 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
287 // Empty the current queue.
[email protected]2da659e2013-05-23 20:51:34288 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00289 PlatformTest::TearDown();
290 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34291 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00292 }
293
alyssar2adf3ac2016-05-03 17:12:58294 std::unique_ptr<QuicEncryptedPacket> ConstructClientConnectionClosePacket(
rtennetia004d332015-08-28 06:44:57295 QuicPacketNumber num) {
alyssar2adf3ac2016-05-03 17:12:58296 return client_maker_.MakeConnectionClosePacket(num);
[email protected]3316d422013-05-03 21:45:30297 }
298
alyssar2adf3ac2016-05-03 17:12:58299 std::unique_ptr<QuicEncryptedPacket> ConstructServerConnectionClosePacket(
300 QuicPacketNumber num) {
301 return server_maker_.MakeConnectionClosePacket(num);
302 }
303
304 std::unique_ptr<QuicEncryptedPacket> ConstructServerGoAwayPacket(
zhongyi6b5a3892016-03-12 04:46:20305 QuicPacketNumber num,
306 QuicErrorCode error_code,
307 std::string reason_phrase) {
alyssar2adf3ac2016-05-03 17:12:58308 return server_maker_.MakeGoAwayPacket(num, error_code, reason_phrase);
zhongyi6b5a3892016-03-12 04:46:20309 }
310
alyssar2adf3ac2016-05-03 17:12:58311 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
rtennetia004d332015-08-28 06:44:57312 QuicPacketNumber largest_received,
313 QuicPacketNumber least_unacked) {
alyssar2adf3ac2016-05-03 17:12:58314 return client_maker_.MakeAckPacket(2, largest_received, least_unacked,
315 least_unacked, true);
zhongyi32569c62016-01-08 02:54:30316 }
317
alyssar2adf3ac2016-05-03 17:12:58318 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckAndRstPacket(
zhongyi6b5a3892016-03-12 04:46:20319 QuicPacketNumber num,
320 QuicStreamId stream_id,
321 QuicRstStreamErrorCode error_code,
322 QuicPacketNumber largest_received,
323 QuicPacketNumber ack_least_unacked,
324 QuicPacketNumber stop_least_unacked) {
alyssar2adf3ac2016-05-03 17:12:58325 return client_maker_.MakeAckAndRstPacket(
326 num, false, stream_id, error_code, largest_received, ack_least_unacked,
327 stop_least_unacked, true);
zhongyi6b5a3892016-03-12 04:46:20328 }
329
alyssar2adf3ac2016-05-03 17:12:58330 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
zhongyi32569c62016-01-08 02:54:30331 QuicPacketNumber largest_received,
332 QuicPacketNumber least_unacked,
333 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:58334 return client_maker_.MakeAckPacket(2, largest_received, least_unacked,
335 least_unacked, true);
zhongyi32569c62016-01-08 02:54:30336 }
337
alyssar2adf3ac2016-05-03 17:12:58338 std::unique_ptr<QuicEncryptedPacket>
339 ConstructClientAckAndConnectionClosePacket(
zhongyi32569c62016-01-08 02:54:30340 QuicPacketNumber packet_number,
341 QuicPacketNumber largest_received,
342 QuicPacketNumber ack_least_unacked,
343 QuicPacketNumber stop_least_unacked) {
alyssar2adf3ac2016-05-03 17:12:58344 return client_maker_.MakeAckPacket(packet_number, largest_received,
345 ack_least_unacked, stop_least_unacked,
346 true);
[email protected]1e960032013-12-20 19:00:20347 }
[email protected]61a527782013-02-21 03:58:00348
alyssar2adf3ac2016-05-03 17:12:58349 std::unique_ptr<QuicEncryptedPacket>
350 ConstructClientAckAndConnectionClosePacket(
zhongyica364fbb2015-12-12 03:39:12351 QuicPacketNumber num,
352 QuicTime::Delta delta_time_largest_observed,
353 QuicPacketNumber largest_received,
354 QuicPacketNumber least_unacked,
355 QuicErrorCode quic_error,
bnc912a04b2016-04-20 14:19:50356 const std::string& quic_error_details) {
alyssar2adf3ac2016-05-03 17:12:58357 return client_maker_.MakeAckAndConnectionClosePacket(
zhongyica364fbb2015-12-12 03:39:12358 num, false, delta_time_largest_observed, largest_received,
359 least_unacked, quic_error, quic_error_details);
360 }
361
alyssar2adf3ac2016-05-03 17:12:58362 std::unique_ptr<QuicEncryptedPacket> ConstructServerRstPacket(
zhongyica364fbb2015-12-12 03:39:12363 QuicPacketNumber num,
364 bool include_version,
365 QuicStreamId stream_id,
366 QuicRstStreamErrorCode error_code) {
alyssar2adf3ac2016-05-03 17:12:58367 return server_maker_.MakeRstPacket(num, include_version, stream_id,
368 error_code);
zhongyica364fbb2015-12-12 03:39:12369 }
370
zhongyi32569c62016-01-08 02:54:30371 // Uses default QuicTestPacketMaker.
[email protected]1e960032013-12-20 19:00:20372 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
373 const std::string& scheme,
374 const std::string& path) {
alyssar2adf3ac2016-05-03 17:12:58375 return GetRequestHeaders(method, scheme, path, &client_maker_);
zhongyi32569c62016-01-08 02:54:30376 }
377
378 // Uses customized QuicTestPacketMaker.
379 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
380 const std::string& scheme,
381 const std::string& path,
bnc912a04b2016-04-20 14:19:50382 QuicTestPacketMaker* maker) {
383 return maker->GetRequestHeaders(method, scheme, path);
[email protected]61a527782013-02-21 03:58:00384 }
385
[email protected]1e960032013-12-20 19:00:20386 SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
alyssar2adf3ac2016-05-03 17:12:58387 return server_maker_.GetResponseHeaders(status);
[email protected]61a527782013-02-21 03:58:00388 }
389
zhongyi32569c62016-01-08 02:54:30390 // Appends alt_svc headers in the response headers.
391 SpdyHeaderBlock GetResponseHeaders(const std::string& status,
392 const std::string& alt_svc) {
alyssar2adf3ac2016-05-03 17:12:58393 return server_maker_.GetResponseHeaders(status, alt_svc);
zhongyi32569c62016-01-08 02:54:30394 }
395
alyssar2adf3ac2016-05-03 17:12:58396 std::unique_ptr<QuicEncryptedPacket> ConstructServerDataPacket(
rtennetia004d332015-08-28 06:44:57397 QuicPacketNumber packet_number,
[email protected]98b20ce2013-05-10 05:55:26398 QuicStreamId stream_id,
[email protected]e8ff26842013-03-22 21:02:05399 bool should_include_version,
[email protected]61a527782013-02-21 03:58:00400 bool fin,
401 QuicStreamOffset offset,
402 base::StringPiece data) {
alyssar2adf3ac2016-05-03 17:12:58403 return server_maker_.MakeDataPacket(
404 packet_number, stream_id, should_include_version, fin, offset, data);
[email protected]61a527782013-02-21 03:58:00405 }
406
alyssar2adf3ac2016-05-03 17:12:58407 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
rtennetia004d332015-08-28 06:44:57408 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20409 QuicStreamId stream_id,
410 bool should_include_version,
411 bool fin,
zhongyi32569c62016-01-08 02:54:30412 const SpdyHeaderBlock& headers,
413 QuicStreamOffset* offset) {
ianswett0888cff2015-11-24 17:42:16414 SpdyPriority priority =
rtennetif4bdb542015-01-21 14:33:05415 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
alyssar2adf3ac2016-05-03 17:12:58416 return client_maker_.MakeRequestHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30417 packet_number, stream_id, should_include_version, fin, priority,
418 headers, offset);
419 }
420
alyssar2adf3ac2016-05-03 17:12:58421 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30422 QuicPacketNumber packet_number,
423 QuicStreamId stream_id,
424 bool should_include_version,
425 bool fin,
426 const SpdyHeaderBlock& headers,
427 QuicStreamOffset* offset,
428 QuicTestPacketMaker* maker) {
429 SpdyPriority priority =
430 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
alyssar2adf3ac2016-05-03 17:12:58431 return client_maker_.MakeRequestHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30432 packet_number, stream_id, should_include_version, fin, priority,
433 headers, offset);
434 }
435
alyssar2adf3ac2016-05-03 17:12:58436 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30437 QuicPacketNumber packet_number,
438 QuicStreamId stream_id,
439 bool should_include_version,
440 bool fin,
441 const SpdyHeaderBlock& headers) {
alyssar2adf3ac2016-05-03 17:12:58442 return ConstructClientRequestHeadersPacket(
443 packet_number, stream_id, should_include_version, fin, headers, nullptr,
444 &client_maker_);
zhongyi32569c62016-01-08 02:54:30445 }
alyssar2adf3ac2016-05-03 17:12:58446 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30447 QuicPacketNumber packet_number,
448 QuicStreamId stream_id,
449 bool should_include_version,
450 bool fin,
451 const SpdyHeaderBlock& headers,
452 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:58453 return ConstructClientRequestHeadersPacket(packet_number, stream_id,
454 should_include_version, fin,
455 headers, nullptr, maker);
[email protected]61a527782013-02-21 03:58:00456 }
457
alyssar2adf3ac2016-05-03 17:12:58458 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
rtennetia004d332015-08-28 06:44:57459 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20460 QuicStreamId stream_id,
461 bool should_include_version,
462 bool fin,
463 const SpdyHeaderBlock& headers) {
alyssar2adf3ac2016-05-03 17:12:58464 return ConstructServerResponseHeadersPacket(
465 packet_number, stream_id, should_include_version, fin, headers, nullptr,
466 &server_maker_);
zhongyi32569c62016-01-08 02:54:30467 }
468
alyssar2adf3ac2016-05-03 17:12:58469 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30470 QuicPacketNumber packet_number,
471 QuicStreamId stream_id,
472 bool should_include_version,
473 bool fin,
474 const SpdyHeaderBlock& headers,
475 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:58476 return ConstructServerResponseHeadersPacket(packet_number, stream_id,
477 should_include_version, fin,
478 headers, nullptr, maker);
zhongyi32569c62016-01-08 02:54:30479 }
480
alyssar2adf3ac2016-05-03 17:12:58481 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30482 QuicPacketNumber packet_number,
483 QuicStreamId stream_id,
484 bool should_include_version,
485 bool fin,
486 const SpdyHeaderBlock& headers,
487 QuicStreamOffset* offset) {
alyssar2adf3ac2016-05-03 17:12:58488 return server_maker_.MakeResponseHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30489 packet_number, stream_id, should_include_version, fin, headers, offset);
490 }
491
alyssar2adf3ac2016-05-03 17:12:58492 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30493 QuicPacketNumber packet_number,
494 QuicStreamId stream_id,
495 bool should_include_version,
496 bool fin,
497 const SpdyHeaderBlock& headers,
498 QuicStreamOffset* offset,
499 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:58500 return server_maker_.MakeResponseHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30501 packet_number, stream_id, should_include_version, fin, headers, offset);
[email protected]61a527782013-02-21 03:58:00502 }
503
bnc912a04b2016-04-20 14:19:50504 void CreateSession() {
[email protected]4dca587c2013-03-07 16:54:47505 params_.enable_quic = true;
506 params_.quic_clock = clock_;
507 params_.quic_random = &random_generator_;
bnc912a04b2016-04-20 14:19:50508 params_.client_socket_factory = &socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05509 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43510 params_.host_resolver = &host_resolver_;
511 params_.cert_verifier = &cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11512 params_.transport_security_state = &transport_security_state_;
rtenneti052774e2015-11-24 21:00:12513 params_.cert_transparency_verifier = cert_transparency_verifier_.get();
tbansalfdf5665b2015-09-21 22:46:40514 params_.socket_performance_watcher_factory =
tbansal0f56a39a2016-04-07 22:03:38515 &test_socket_performance_watcher_factory_;
[email protected]1c04f9522013-02-21 20:32:43516 params_.proxy_service = proxy_service_.get();
517 params_.ssl_config_service = ssl_config_service_.get();
518 params_.http_auth_handler_factory = auth_handler_factory_.get();
bnc6be245c12015-05-15 11:24:07519 params_.http_server_properties = http_server_properties_.GetWeakPtr();
[email protected]1e960032013-12-20 19:00:20520 params_.quic_supported_versions = SupportedVersions(GetParam());
rch74da0e1a2016-01-14 02:49:32521 for (const char* host :
rch9ae5b3b2016-02-11 00:36:29522 {kDefaultServerHostName, "www.example.org", "news.example.org",
523 "bar.example.org", "foo.example.org", "invalid.example.org",
524 "mail.example.com"}) {
rch74da0e1a2016-01-14 02:49:32525 params_.quic_host_whitelist.insert(host);
526 }
[email protected]61a527782013-02-21 03:58:00527
mmenkee65e7af2015-10-13 17:16:42528 session_.reset(new HttpNetworkSession(params_));
[email protected]11c05872013-08-20 02:04:12529 session_->quic_stream_factory()->set_require_confirmation(false);
rch185ebee2015-07-14 23:56:22530 ASSERT_EQ(params_.quic_socket_receive_buffer_size,
531 session_->quic_stream_factory()->socket_receive_buffer_size());
[email protected]61a527782013-02-21 03:58:00532 }
533
danakjad1777e2016-04-16 00:56:42534 void CheckWasQuicResponse(
535 const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19536 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42537 ASSERT_TRUE(response != nullptr);
538 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19539 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
540 EXPECT_TRUE(response->was_fetched_via_spdy);
541 EXPECT_TRUE(response->was_npn_negotiated);
542 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
543 response->connection_info);
544 }
545
danakjad1777e2016-04-16 00:56:42546 void CheckResponsePort(const std::unique_ptr<HttpNetworkTransaction>& trans,
Avi Drissman13fc8932015-12-20 04:40:46547 uint16_t port) {
bnc62a44f022015-04-02 15:59:41548 const HttpResponseInfo* response = trans->GetResponseInfo();
549 ASSERT_TRUE(response != nullptr);
550 EXPECT_EQ(port, response->socket_address.port());
551 }
552
danakjad1777e2016-04-16 00:56:42553 void CheckWasHttpResponse(
554 const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19555 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42556 ASSERT_TRUE(response != nullptr);
557 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19558 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
559 EXPECT_FALSE(response->was_fetched_via_spdy);
560 EXPECT_FALSE(response->was_npn_negotiated);
561 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1,
562 response->connection_info);
563 }
564
danakjad1777e2016-04-16 00:56:42565 void CheckResponseData(const std::unique_ptr<HttpNetworkTransaction>& trans,
[email protected]aa9b14d2013-05-10 23:45:19566 const std::string& expected) {
567 std::string response_data;
bncffc2fdf2015-05-14 18:29:49568 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
[email protected]aa9b14d2013-05-10 23:45:19569 EXPECT_EQ(expected, response_data);
570 }
571
danakjad1777e2016-04-16 00:56:42572 void RunTransaction(const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19573 TestCompletionCallback callback;
574 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
575 EXPECT_EQ(ERR_IO_PENDING, rv);
576 EXPECT_EQ(OK, callback.WaitForResult());
577 }
578
579 void SendRequestAndExpectHttpResponse(const std::string& expected) {
danakjad1777e2016-04-16 00:56:42580 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50581 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
bncffc2fdf2015-05-14 18:29:49582 RunTransaction(trans);
[email protected]aa9b14d2013-05-10 23:45:19583 CheckWasHttpResponse(trans);
bncffc2fdf2015-05-14 18:29:49584 CheckResponseData(trans, expected);
[email protected]aa9b14d2013-05-10 23:45:19585 }
586
587 void SendRequestAndExpectQuicResponse(const std::string& expected) {
rchf114d982015-10-21 01:34:56588 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, 443);
tbansal7cec3812015-02-05 21:25:12589 }
590
bnc62a44f022015-04-02 15:59:41591 void SendRequestAndExpectQuicResponseFromProxyOnPort(
592 const std::string& expected,
Avi Drissman13fc8932015-12-20 04:40:46593 uint16_t port) {
bnc62a44f022015-04-02 15:59:41594 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port);
[email protected]aa9b14d2013-05-10 23:45:19595 }
596
597 void AddQuicAlternateProtocolMapping(
598 MockCryptoClientStream::HandshakeMode handshake_mode) {
599 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
zhongyi3d4a55e72016-04-22 20:36:46600 url::SchemeHostPort server(request_.url);
601 AlternativeService alternative_service(QUIC, server.host(), 443);
bnc7dc7e1b42015-07-28 14:43:12602 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
zhongyi3d4a55e72016-04-22 20:36:46603 http_server_properties_.SetAlternativeService(server, alternative_service,
604 expiration);
[email protected]aa9b14d2013-05-10 23:45:19605 }
606
rchbe69cb902016-02-11 01:10:48607 void AddQuicRemoteAlternativeServiceMapping(
608 MockCryptoClientStream::HandshakeMode handshake_mode,
609 const HostPortPair& alternative) {
610 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
zhongyi3d4a55e72016-04-22 20:36:46611 url::SchemeHostPort server(request_.url);
rchbe69cb902016-02-11 01:10:48612 AlternativeService alternative_service(QUIC, alternative.host(),
613 alternative.port());
614 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
zhongyi3d4a55e72016-04-22 20:36:46615 http_server_properties_.SetAlternativeService(server, alternative_service,
616 expiration);
rchbe69cb902016-02-11 01:10:48617 }
618
[email protected]aa9b14d2013-05-10 23:45:19619 void ExpectBrokenAlternateProtocolMapping() {
zhongyi3d4a55e72016-04-22 20:36:46620 const url::SchemeHostPort server(request_.url);
bncd9b132e2015-07-08 05:16:10621 const AlternativeServiceVector alternative_service_vector =
zhongyi3d4a55e72016-04-22 20:36:46622 http_server_properties_.GetAlternativeServices(server);
bncd9b132e2015-07-08 05:16:10623 EXPECT_EQ(1u, alternative_service_vector.size());
bnc6be245c12015-05-15 11:24:07624 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken(
bncd9b132e2015-07-08 05:16:10625 alternative_service_vector[0]));
[email protected]aa9b14d2013-05-10 23:45:19626 }
627
[email protected]4d590c9c2014-05-02 05:14:33628 void ExpectQuicAlternateProtocolMapping() {
zhongyi3d4a55e72016-04-22 20:36:46629 const url::SchemeHostPort server(request_.url);
bncd9b132e2015-07-08 05:16:10630 const AlternativeServiceVector alternative_service_vector =
zhongyi3d4a55e72016-04-22 20:36:46631 http_server_properties_.GetAlternativeServices(server);
bncd9b132e2015-07-08 05:16:10632 EXPECT_EQ(1u, alternative_service_vector.size());
633 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
[email protected]4d590c9c2014-05-02 05:14:33634 }
635
[email protected]aa9b14d2013-05-10 23:45:19636 void AddHangingNonAlternateProtocolSocketData() {
danakjad1777e2016-04-16 00:56:42637 std::unique_ptr<StaticSocketDataProvider> hanging_data;
zhongyi32569c62016-01-08 02:54:30638 hanging_data.reset(new StaticSocketDataProvider());
[email protected]dda75ab2013-06-22 22:43:30639 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
zhongyi32569c62016-01-08 02:54:30640 hanging_data->set_connect_data(hanging_connect);
641 hanging_data_.push_back(std::move(hanging_data));
642 socket_factory_.AddSocketDataProvider(hanging_data_.back().get());
rchf114d982015-10-21 01:34:56643 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]aa9b14d2013-05-10 23:45:19644 }
645
rtenneti4b06ae72014-08-26 03:43:43646 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
alyssar2adf3ac2016-05-03 17:12:58647 QuicTestPacketMaker client_maker_;
648 QuicTestPacketMaker server_maker_;
danakjad1777e2016-04-16 00:56:42649 std::unique_ptr<HttpNetworkSession> session_;
[email protected]61a527782013-02-21 03:58:00650 MockClientSocketFactory socket_factory_;
rchf114d982015-10-21 01:34:56651 ProofVerifyDetailsChromium verify_details_;
[email protected]e8ff26842013-03-22 21:02:05652 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43653 MockHostResolver host_resolver_;
654 MockCertVerifier cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11655 TransportSecurityState transport_security_state_;
danakjad1777e2016-04-16 00:56:42656 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
tbansal0f56a39a2016-04-07 22:03:38657 TestSocketPerformanceWatcherFactory test_socket_performance_watcher_factory_;
[email protected]1c04f9522013-02-21 20:32:43658 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
danakjad1777e2016-04-16 00:56:42659 std::unique_ptr<ProxyService> proxy_service_;
660 std::unique_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
[email protected]61a527782013-02-21 03:58:00661 MockRandom random_generator_;
bnc6be245c12015-05-15 11:24:07662 HttpServerPropertiesImpl http_server_properties_;
[email protected]61a527782013-02-21 03:58:00663 HttpNetworkSession::Params params_;
[email protected]aa9b14d2013-05-10 23:45:19664 HttpRequestInfo request_;
vishal.b62985ca92015-04-17 08:45:51665 BoundTestNetLog net_log_;
danakjad1777e2016-04-16 00:56:42666 std::vector<std::unique_ptr<StaticSocketDataProvider>> hanging_data_;
rchf114d982015-10-21 01:34:56667 SSLSocketDataProvider ssl_data_;
tbansal7cec3812015-02-05 21:25:12668
669 private:
670 void SendRequestAndExpectQuicResponseMaybeFromProxy(
671 const std::string& expected,
bnc62a44f022015-04-02 15:59:41672 bool used_proxy,
Avi Drissman13fc8932015-12-20 04:40:46673 uint16_t port) {
danakjad1777e2016-04-16 00:56:42674 std::unique_ptr<HttpNetworkTransaction> trans(
tbansal7cec3812015-02-05 21:25:12675 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
676 ProxyHeadersHandler proxy_headers_handler;
677 trans->SetBeforeProxyHeadersSentCallback(
678 base::Bind(&ProxyHeadersHandler::OnBeforeProxyHeadersSent,
679 base::Unretained(&proxy_headers_handler)));
bncffc2fdf2015-05-14 18:29:49680 RunTransaction(trans);
tbansal7cec3812015-02-05 21:25:12681 CheckWasQuicResponse(trans);
bnc62a44f022015-04-02 15:59:41682 CheckResponsePort(trans, port);
bncffc2fdf2015-05-14 18:29:49683 CheckResponseData(trans, expected);
tbansal7cec3812015-02-05 21:25:12684 EXPECT_EQ(used_proxy, proxy_headers_handler.was_called());
685 }
[email protected]61a527782013-02-21 03:58:00686};
687
rjshaded5ced072015-12-18 19:26:02688INSTANTIATE_TEST_CASE_P(Version,
689 QuicNetworkTransactionTest,
[email protected]1e960032013-12-20 19:00:20690 ::testing::ValuesIn(QuicSupportedVersions()));
691
692TEST_P(QuicNetworkTransactionTest, ForceQuic) {
rtenneti8a2f4632016-03-21 20:26:57693 params_.origins_to_force_quic_on.insert(
694 HostPortPair::FromString("mail.example.org:443"));
[email protected]4dca587c2013-03-07 16:54:47695
[email protected]1e960032013-12-20 19:00:20696 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58697 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
698 1, kClientDataStreamId1, true, true,
699 GetRequestHeaders("GET", "https", "/")));
700 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:02701 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58702 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
703 false, true, 0, "hello!"));
704 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:59705 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
[email protected]4dca587c2013-03-07 16:54:47706
rcha5399e02015-04-21 19:32:04707 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4dca587c2013-03-07 16:54:47708
rtennetib8e80fb2016-05-16 00:12:09709 // The non-alternate protocol job needs to hang in order to guarantee that
710 // the alternate-protocol job will "win".
711 AddHangingNonAlternateProtocolSocketData();
712
rch3f4b8452016-02-23 16:59:32713 params_.enable_alternative_service_with_different_host = false;
[email protected]4dca587c2013-03-07 16:54:47714 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47715
tbansal0f56a39a2016-04-07 22:03:38716 EXPECT_FALSE(
717 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]aa9b14d2013-05-10 23:45:19718 SendRequestAndExpectQuicResponse("hello!");
tbansal0f56a39a2016-04-07 22:03:38719 EXPECT_TRUE(
720 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]4dca587c2013-03-07 16:54:47721
[email protected]98b20ce2013-05-10 05:55:26722 // Check that the NetLog was filled reasonably.
mmenke43758e62015-05-04 21:09:46723 TestNetLogEntry::List entries;
[email protected]aa9b14d2013-05-10 23:45:19724 net_log_.GetEntries(&entries);
[email protected]98b20ce2013-05-10 05:55:26725 EXPECT_LT(0u, entries.size());
726
727 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29728 int pos = ExpectLogContainsSomewhere(
729 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
730 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26731 EXPECT_LT(0, pos);
732
rchfd527212015-08-25 00:41:26733 // ... and also a TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29734 pos = ExpectLogContainsSomewhere(
rchfd527212015-08-25 00:41:26735 entries, 0,
736 NetLog::TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED,
ttuttle859dc7a2015-04-23 19:42:29737 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26738 EXPECT_LT(0, pos);
739
rtennetia004d332015-08-28 06:44:57740 std::string packet_number;
741 ASSERT_TRUE(entries[pos].GetStringValue("packet_number", &packet_number));
742 EXPECT_EQ("1", packet_number);
[email protected]98b20ce2013-05-10 05:55:26743
rchfd527212015-08-25 00:41:26744 // ... and also a TYPE_QUIC_SESSION_PACKET_AUTHENTICATED.
745 pos = ExpectLogContainsSomewhere(
746 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_AUTHENTICATED,
747 NetLog::PHASE_NONE);
748 EXPECT_LT(0, pos);
749
[email protected]98b20ce2013-05-10 05:55:26750 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29751 pos = ExpectLogContainsSomewhere(
752 entries, 0, NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
753 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26754 EXPECT_LT(0, pos);
755
756 int log_stream_id;
757 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
[email protected]1e960032013-12-20 19:00:20758 EXPECT_EQ(3, log_stream_id);
[email protected]4dca587c2013-03-07 16:54:47759}
760
[email protected]cf3e3cd62014-02-05 16:16:16761TEST_P(QuicNetworkTransactionTest, QuicProxy) {
tbansal9bf26672016-05-11 18:32:45762 params_.enable_quic = true;
rchf114d982015-10-21 01:34:56763 proxy_service_ =
rch9ae5b3b2016-02-11 00:36:29764 ProxyService::CreateFixedFromPacResult("QUIC mail.example.org:70");
[email protected]cf3e3cd62014-02-05 16:16:16765
[email protected]cf3e3cd62014-02-05 16:16:16766 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58767 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
768 1, kClientDataStreamId1, true, true,
769 GetRequestHeaders("GET", "http", "/")));
770 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:02771 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58772 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
773 false, true, 0, "hello!"));
774 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50775 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59776 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]cf3e3cd62014-02-05 16:16:16777
rcha5399e02015-04-21 19:32:04778 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cf3e3cd62014-02-05 16:16:16779
tbansal0f56a39a2016-04-07 22:03:38780 EXPECT_FALSE(
781 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16782 // There is no need to set up an alternate protocol job, because
783 // no attempt will be made to speak to the proxy over TCP.
784
rch9ae5b3b2016-02-11 00:36:29785 request_.url = GURL("http://mail.example.org/");
rch3f4b8452016-02-23 16:59:32786 params_.enable_alternative_service_with_different_host = false;
[email protected]cf3e3cd62014-02-05 16:16:16787 CreateSession();
788
bnc62a44f022015-04-02 15:59:41789 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
tbansal0f56a39a2016-04-07 22:03:38790 EXPECT_TRUE(
791 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16792}
793
bnc313ba9c2015-06-11 15:42:31794// Regression test for https://crbug.com/492458. Test that for an HTTP
795// connection through a QUIC proxy, the certificate exhibited by the proxy is
796// checked against the proxy hostname, not the origin hostname.
797TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) {
rch9ae5b3b2016-02-11 00:36:29798 const std::string origin_host = "mail.example.com";
bnc313ba9c2015-06-11 15:42:31799 const std::string proxy_host = "www.example.org";
800
tbansal9bf26672016-05-11 18:32:45801 params_.enable_quic = true;
rdsmith82957ad2015-09-16 19:42:03802 proxy_service_ =
803 ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70");
bnc313ba9c2015-06-11 15:42:31804
alyssar2adf3ac2016-05-03 17:12:58805 client_maker_.set_hostname(origin_host);
bnc313ba9c2015-06-11 15:42:31806 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58807 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
808 1, kClientDataStreamId1, true, true,
809 GetRequestHeaders("GET", "http", "/")));
810 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc313ba9c2015-06-11 15:42:31811 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58812 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
813 false, true, 0, "hello!"));
814 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50815 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59816 mock_quic_data.AddRead(ASYNC, 0);
bnc313ba9c2015-06-11 15:42:31817 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
818
819 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29820 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bnc313ba9c2015-06-11 15:42:31821 ASSERT_TRUE(cert.get());
822 // This certificate is valid for the proxy, but not for the origin.
823 bool common_name_fallback_used;
824 EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used));
825 EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used));
826 ProofVerifyDetailsChromium verify_details;
827 verify_details.cert_verify_result.verified_cert = cert;
828 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rchf114d982015-10-21 01:34:56829 ProofVerifyDetailsChromium verify_details2;
830 verify_details2.cert_verify_result.verified_cert = cert;
831 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
bnc313ba9c2015-06-11 15:42:31832
833 request_.url = GURL("http://" + origin_host);
rtennetib8e80fb2016-05-16 00:12:09834 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32835 CreateSession();
bnc313ba9c2015-06-11 15:42:31836 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
837 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
838}
839
rchbe69cb902016-02-11 01:10:48840TEST_P(QuicNetworkTransactionTest, AlternativeServicesDifferentHost) {
841 params_.enable_alternative_service_with_different_host = true;
842 HostPortPair origin("www.example.org", 443);
843 HostPortPair alternative("mail.example.org", 443);
844
845 base::FilePath certs_dir = GetTestCertsDirectory();
846 scoped_refptr<X509Certificate> cert(
847 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
848 ASSERT_TRUE(cert.get());
849 // TODO(rch): the connection should be "to" the origin, so if the cert is
850 // valid for the origin but not the alternative, that should work too.
851 bool common_name_fallback_used;
852 EXPECT_TRUE(cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
853 EXPECT_TRUE(
854 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
855 ProofVerifyDetailsChromium verify_details;
856 verify_details.cert_verify_result.verified_cert = cert;
857 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
858
alyssar2adf3ac2016-05-03 17:12:58859 client_maker_.set_hostname(origin.host());
rchbe69cb902016-02-11 01:10:48860 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58861 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
862 1, kClientDataStreamId1, true, true,
863 GetRequestHeaders("GET", "https", "/")));
864 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rchbe69cb902016-02-11 01:10:48865 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58866 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
867 false, true, 0, "hello!"));
868 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchbe69cb902016-02-11 01:10:48869 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
870 mock_quic_data.AddRead(ASYNC, 0);
871 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
872
873 request_.url = GURL("https://" + origin.host());
874 AddQuicRemoteAlternativeServiceMapping(
875 MockCryptoClientStream::CONFIRM_HANDSHAKE, alternative);
rtennetib8e80fb2016-05-16 00:12:09876 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32877 CreateSession();
rchbe69cb902016-02-11 01:10:48878
879 SendRequestAndExpectQuicResponse("hello!");
880}
881
[email protected]1e960032013-12-20 19:00:20882TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
rtenneti8a2f4632016-03-21 20:26:57883 params_.origins_to_force_quic_on.insert(
884 HostPortPair::FromString("mail.example.org:443"));
[email protected]cebe3282013-05-22 23:49:30885
tbansalfdf5665b2015-09-21 22:46:40886 MockQuicData mock_quic_data1;
887 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
[email protected]1e960032013-12-20 19:00:20888
tbansalfdf5665b2015-09-21 22:46:40889 MockQuicData mock_quic_data2;
zhongyi32569c62016-01-08 02:54:30890 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40891 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
rch6faa4d42016-01-05 20:48:43892 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40893
894 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
895 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
[email protected]cebe3282013-05-22 23:49:30896
rch3f4b8452016-02-23 16:59:32897 params_.enable_alternative_service_with_different_host = false;
[email protected]cebe3282013-05-22 23:49:30898 CreateSession();
899
tbansal0f56a39a2016-04-07 22:03:38900 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40901 for (size_t i = 0; i < 2; ++i) {
danakjad1777e2016-04-16 00:56:42902 std::unique_ptr<HttpNetworkTransaction> trans(
tbansalfdf5665b2015-09-21 22:46:40903 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
904 TestCompletionCallback callback;
905 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
906 EXPECT_EQ(ERR_IO_PENDING, rv);
907 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
tbansal0f56a39a2016-04-07 22:03:38908 EXPECT_EQ(1 + i, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40909 }
[email protected]cebe3282013-05-22 23:49:30910}
911
tbansalc8a94ea2015-11-02 23:58:51912TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
913 // Attempt to "force" quic on 443, which will not be honored.
rtenneti8a2f4632016-03-21 20:26:57914 params_.origins_to_force_quic_on.insert(
915 HostPortPair::FromString("www.google.com:443"));
tbansalc8a94ea2015-11-02 23:58:51916
917 MockRead http_reads[] = {
918 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
919 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
920 MockRead(ASYNC, OK)};
921
922 StaticSocketDataProvider data(http_reads, arraysize(http_reads), nullptr, 0);
923 socket_factory_.AddSocketDataProvider(&data);
924 SSLSocketDataProvider ssl(ASYNC, OK);
925 socket_factory_.AddSSLSocketDataProvider(&ssl);
926
rch3f4b8452016-02-23 16:59:32927 params_.enable_alternative_service_with_different_host = false;
tbansalc8a94ea2015-11-02 23:58:51928 CreateSession();
929
930 SendRequestAndExpectHttpResponse("hello world");
tbansal0f56a39a2016-04-07 22:03:38931 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalc8a94ea2015-11-02 23:58:51932}
933
bncc958faa2015-07-31 18:14:52934TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52935 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56936 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
937 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52938 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
939 MockRead(ASYNC, OK)};
940
941 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
942 0);
943 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56944 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52945
946 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58947 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
948 1, kClientDataStreamId1, true, true,
949 GetRequestHeaders("GET", "https", "/")));
950 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:52951 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58952 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
953 false, true, 0, "hello!"));
954 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:52955 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59956 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52957
958 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
959
rtennetib8e80fb2016-05-16 00:12:09960 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32961 CreateSession();
bncc958faa2015-07-31 18:14:52962
963 SendRequestAndExpectHttpResponse("hello world");
964 SendRequestAndExpectQuicResponse("hello!");
965}
966
rchf47265dc2016-03-21 21:33:12967TEST_P(QuicNetworkTransactionTest,
968 UseAlternativeServiceWithProbabilityForQuic) {
969 MockRead http_reads[] = {
970 MockRead("HTTP/1.1 200 OK\r\n"),
971 MockRead(kQuicAlternativeServiceWithProbabilityHeader),
972 MockRead("hello world"),
973 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
974 MockRead(ASYNC, OK)};
975
976 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
977 0);
978 socket_factory_.AddSocketDataProvider(&http_data);
979 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
980
981 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58982 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
983 1, kClientDataStreamId1, true, true,
984 GetRequestHeaders("GET", "https", "/")));
985 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rchf47265dc2016-03-21 21:33:12986 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58987 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
988 false, true, 0, "hello!"));
989 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchf47265dc2016-03-21 21:33:12990 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
991 mock_quic_data.AddRead(ASYNC, 0); // EOF
992
993 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
994
rtennetib8e80fb2016-05-16 00:12:09995 AddHangingNonAlternateProtocolSocketData();
rchf47265dc2016-03-21 21:33:12996 CreateSession();
997
998 SendRequestAndExpectHttpResponse("hello world");
999 SendRequestAndExpectQuicResponse("hello!");
1000}
1001
zhongyi3d4a55e72016-04-22 20:36:461002TEST_P(QuicNetworkTransactionTest, SetAlternativeServiceWithScheme) {
1003 MockRead http_reads[] = {
1004 MockRead("HTTP/1.1 200 OK\r\n"),
1005 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
1006 MockRead("hello world"),
1007 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1008 MockRead(ASYNC, OK)};
1009
1010 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1011 0);
1012
1013 socket_factory_.AddSocketDataProvider(&http_data);
1014 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1015
1016 CreateSession();
1017 // Send http request, ignore alternative service advertising if response
1018 // header advertises alternative service for mail.example.org.
1019 request_.url = GURL("http://mail.example.org:443");
1020 SendRequestAndExpectHttpResponse("hello world");
1021 base::WeakPtr<HttpServerProperties> http_server_properties =
1022 session_->http_server_properties();
1023 url::SchemeHostPort http_server("http", "mail.example.org", 443);
1024 url::SchemeHostPort https_server("https", "mail.example.org", 443);
1025 // Check alternative service is set for the correct origin.
1026 EXPECT_EQ(2u,
1027 http_server_properties->GetAlternativeServices(http_server).size());
1028 EXPECT_EQ(
1029 0u, http_server_properties->GetAlternativeServices(https_server).size());
1030}
1031
1032TEST_P(QuicNetworkTransactionTest, DoNotGetAltSvcForDifferentOrigin) {
1033 MockRead http_reads[] = {
1034 MockRead("HTTP/1.1 200 OK\r\n"),
1035 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
1036 MockRead("hello world"),
1037 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1038 MockRead(ASYNC, OK)};
1039
1040 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1041 0);
1042
1043 socket_factory_.AddSocketDataProvider(&http_data);
1044 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1045 socket_factory_.AddSocketDataProvider(&http_data);
1046 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1047
1048 CreateSession();
1049
1050 // Send https request and set alternative services if response header
1051 // advertises alternative service for mail.example.org.
1052 SendRequestAndExpectHttpResponse("hello world");
1053 base::WeakPtr<HttpServerProperties> http_server_properties =
1054 session_->http_server_properties();
1055
1056 const url::SchemeHostPort https_server(request_.url);
1057 // Check alternative service is set.
1058 AlternativeServiceVector alternative_service_vector =
1059 http_server_properties->GetAlternativeServices(https_server);
1060 EXPECT_EQ(2u, alternative_service_vector.size());
1061
1062 // Send http request to the same origin but with diffrent scheme, should not
1063 // use QUIC.
1064 request_.url = GURL("http://mail.example.org:443");
1065 SendRequestAndExpectHttpResponse("hello world");
1066}
1067
bnc8be55ebb2015-10-30 14:12:071068TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) {
1069 std::string altsvc_header = base::StringPrintf(
1070 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam());
1071 MockRead http_reads[] = {
1072 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1073 MockRead("hello world"),
1074 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1075 MockRead(ASYNC, OK)};
1076
1077 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1078 0);
1079 socket_factory_.AddSocketDataProvider(&http_data);
1080 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1081
1082 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581083 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1084 1, kClientDataStreamId1, true, true,
1085 GetRequestHeaders("GET", "https", "/")));
1086 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc8be55ebb2015-10-30 14:12:071087 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581088 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1089 false, true, 0, "hello!"));
1090 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bnc8be55ebb2015-10-30 14:12:071091 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591092 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc8be55ebb2015-10-30 14:12:071093
1094 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1095
rtennetib8e80fb2016-05-16 00:12:091096 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321097 CreateSession();
bnc8be55ebb2015-10-30 14:12:071098
1099 SendRequestAndExpectHttpResponse("hello world");
1100 SendRequestAndExpectQuicResponse("hello!");
1101}
1102
zhongyi6b5a3892016-03-12 04:46:201103TEST_P(QuicNetworkTransactionTest, GoAwayWithConnectionMigrationOnPortsOnly) {
1104 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581105 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1106 1, kClientDataStreamId1, true, true,
1107 GetRequestHeaders("GET", "https", "/")));
1108 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi6b5a3892016-03-12 04:46:201109 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1110 // Read a GoAway packet with
1111 // QuicErrorCode: QUIC_ERROR_MIGRATING_PORT from the peer.
alyssar2adf3ac2016-05-03 17:12:581112 mock_quic_data.AddRead(ConstructServerGoAwayPacket(
1113 2, QUIC_ERROR_MIGRATING_PORT,
1114 "connection migration with port change only"));
1115 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
1116 mock_quic_data.AddRead(ConstructServerDataPacket(3, kClientDataStreamId1,
1117 false, true, 0, "hello!"));
1118 mock_quic_data.AddWrite(ConstructClientAckAndRstPacket(
zhongyi6b5a3892016-03-12 04:46:201119 3, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 3, 3, 1));
1120 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1121 mock_quic_data.AddRead(ASYNC, 0); // EOF
1122
1123 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1124
1125 // The non-alternate protocol job needs to hang in order to guarantee that
1126 // the alternate-protocol job will "win".
1127 AddHangingNonAlternateProtocolSocketData();
1128
1129 // In order for a new QUIC session to be established via alternate-protocol
1130 // without racing an HTTP connection, we need the host resolution to happen
1131 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1132 // connection to the the server, in this test we require confirmation
1133 // before encrypting so the HTTP job will still start.
1134 host_resolver_.set_synchronous_mode(true);
1135 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1136 "");
1137 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1138 AddressList address;
1139 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1140 nullptr, net_log_.bound());
1141
1142 CreateSession();
1143 session_->quic_stream_factory()->set_require_confirmation(true);
1144 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1145
danakjad1777e2016-04-16 00:56:421146 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyi6b5a3892016-03-12 04:46:201147 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1148 TestCompletionCallback callback;
1149 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1150 EXPECT_EQ(ERR_IO_PENDING, rv);
1151
1152 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1153 QuicSession::HANDSHAKE_CONFIRMED);
1154 EXPECT_EQ(OK, callback.WaitForResult());
1155
1156 // Check whether this transaction is correctly marked as received a go-away
1157 // because of migrating port.
1158 NetErrorDetails details;
1159 EXPECT_FALSE(details.quic_port_migration_detected);
1160 trans->PopulateNetErrorDetails(&details);
1161 EXPECT_TRUE(details.quic_port_migration_detected);
1162}
1163
bnc8be55ebb2015-10-30 14:12:071164TEST_P(QuicNetworkTransactionTest,
1165 DoNotUseAlternativeServiceQuicUnsupportedVersion) {
1166 std::string altsvc_header = base::StringPrintf(
1167 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam() - 1);
1168 MockRead http_reads[] = {
1169 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1170 MockRead("hello world"),
1171 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1172 MockRead(ASYNC, OK)};
1173
1174 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1175 0);
1176 socket_factory_.AddSocketDataProvider(&http_data);
1177 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1178 socket_factory_.AddSocketDataProvider(&http_data);
1179 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1180
rch3f4b8452016-02-23 16:59:321181 CreateSession();
bnc8be55ebb2015-10-30 14:12:071182
1183 SendRequestAndExpectHttpResponse("hello world");
1184 SendRequestAndExpectHttpResponse("hello world");
1185}
1186
bncc958faa2015-07-31 18:14:521187// When multiple alternative services are advertised,
zhongyi32569c62016-01-08 02:54:301188// HttpStreamFactoryImpl::RequestStreamInternal() should select the alternative
1189// service which uses existing QUIC session if available. If no existing QUIC
1190// session can be used, use the first alternative service from the list.
1191TEST_P(QuicNetworkTransactionTest, UseExistingAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:521192 MockRead http_reads[] = {
1193 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291194 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
bncc958faa2015-07-31 18:14:521195 MockRead("hello world"),
1196 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1197 MockRead(ASYNC, OK)};
1198
1199 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1200 0);
1201 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561202 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521203
zhongyi32569c62016-01-08 02:54:301204 QuicStreamOffset request_header_offset = 0;
1205 QuicStreamOffset response_header_offset = 0;
1206 // First QUIC request data.
rch9ae5b3b2016-02-11 00:36:291207 // Open a session to foo.example.org:443 using the first entry of the
zhongyi32569c62016-01-08 02:54:301208 // alternative service list.
bncc958faa2015-07-31 18:14:521209 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581210 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301211 1, kClientDataStreamId1, true, true,
1212 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1213
1214 std::string alt_svc_list =
rch9ae5b3b2016-02-11 00:36:291215 "quic=\"mail.example.org:444\", quic=\"foo.example.org:443\", "
1216 "quic=\"bar.example.org:445\"";
alyssar2adf3ac2016-05-03 17:12:581217 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301218 1, kClientDataStreamId1, false, false,
1219 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581220 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1221 false, true, 0, "hello!"));
1222 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301223
1224 // Second QUIC request data.
1225 // Connection pooling, using existing session, no need to include version
1226 // as version negotiation has been completed.
alyssar2adf3ac2016-05-03 17:12:581227 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301228 3, kClientDataStreamId2, false, true,
1229 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581230 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301231 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1232 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581233 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1234 false, true, 0, "hello!"));
1235 mock_quic_data.AddWrite(
1236 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
bncc958faa2015-07-31 18:14:521237 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591238 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521239
1240 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1241
rtennetib8e80fb2016-05-16 00:12:091242 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321243 CreateSession();
bncc958faa2015-07-31 18:14:521244
1245 SendRequestAndExpectHttpResponse("hello world");
zhongyi32569c62016-01-08 02:54:301246
bnc359ed2a2016-04-29 20:43:451247 SendRequestAndExpectQuicResponse("hello!");
1248 SendRequestAndExpectQuicResponse("hello!");
zhongyi32569c62016-01-08 02:54:301249}
1250
bnc359ed2a2016-04-29 20:43:451251// Pool to existing session with matching QuicServerId
1252// even if alternative service destination is different.
1253TEST_P(QuicNetworkTransactionTest, PoolByOrigin) {
zhongyi32569c62016-01-08 02:54:301254 MockQuicData mock_quic_data;
bnc359ed2a2016-04-29 20:43:451255 QuicStreamOffset request_header_offset(0);
1256 QuicStreamOffset response_header_offset(0);
1257
1258 // First request.
alyssar2adf3ac2016-05-03 17:12:581259 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301260 1, kClientDataStreamId1, true, true,
1261 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581262 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451263 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1264 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581265 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1266 false, true, 0, "hello!"));
1267 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301268
bnc359ed2a2016-04-29 20:43:451269 // Second request.
alyssar2adf3ac2016-05-03 17:12:581270 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301271 3, kClientDataStreamId2, false, true,
1272 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581273 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301274 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1275 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581276 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1277 false, true, 0, "hello!"));
1278 mock_quic_data.AddWrite(
1279 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
zhongyi32569c62016-01-08 02:54:301280 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1281 mock_quic_data.AddRead(ASYNC, 0); // EOF
1282
1283 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bnc359ed2a2016-04-29 20:43:451284
1285 AddHangingNonAlternateProtocolSocketData();
1286 AddHangingNonAlternateProtocolSocketData();
zhongyi32569c62016-01-08 02:54:301287
rch3f4b8452016-02-23 16:59:321288 CreateSession();
zhongyi32569c62016-01-08 02:54:301289
bnc359ed2a2016-04-29 20:43:451290 const char destination1[] = "first.example.com";
1291 const char destination2[] = "second.example.com";
1292
1293 // Set up alternative service entry to destination1.
1294 url::SchemeHostPort server(request_.url);
1295 AlternativeService alternative_service(QUIC, destination1, 443);
1296 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1297 http_server_properties_.SetAlternativeService(server, alternative_service,
1298 expiration);
1299 // First request opens connection to |destination1|
1300 // with QuicServerId.host() == kDefaultServerHostName.
1301 SendRequestAndExpectQuicResponse("hello!");
1302
1303 // Set up alternative service entry to a different destination.
1304 alternative_service = AlternativeService(QUIC, destination2, 443);
1305 http_server_properties_.SetAlternativeService(server, alternative_service,
1306 expiration);
1307 // Second request pools to existing connection with same QuicServerId,
1308 // even though alternative service destination is different.
1309 SendRequestAndExpectQuicResponse("hello!");
1310}
1311
1312// Pool to existing session with matching destination and matching certificate
1313// even if origin is different, and even if the alternative service with
1314// matching destination is not the first one on the list.
1315TEST_P(QuicNetworkTransactionTest, PoolByDestination) {
1316 GURL origin1 = request_.url;
1317 GURL origin2("https://www.example.org/");
1318 ASSERT_NE(origin1.host(), origin2.host());
1319
1320 MockQuicData mock_quic_data;
1321 QuicStreamOffset request_header_offset(0);
1322 QuicStreamOffset response_header_offset(0);
1323
1324 // First request.
alyssar2adf3ac2016-05-03 17:12:581325 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:451326 1, kClientDataStreamId1, true, true,
1327 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581328 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451329 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1330 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581331 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1332 false, true, 0, "hello!"));
1333 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bnc359ed2a2016-04-29 20:43:451334
1335 // Second request.
alyssar2adf3ac2016-05-03 17:12:581336 QuicTestPacketMaker client_maker2(GetParam(), 0, clock_, origin2.host(),
1337 Perspective::IS_CLIENT);
1338 QuicTestPacketMaker server_maker2(GetParam(), 0, clock_, origin2.host(),
1339 Perspective::IS_SERVER);
1340 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:451341 3, kClientDataStreamId2, false, true,
alyssar2adf3ac2016-05-03 17:12:581342 GetRequestHeaders("GET", "https", "/", &client_maker2),
1343 &request_header_offset, &client_maker2));
1344 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451345 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
alyssar2adf3ac2016-05-03 17:12:581346 &response_header_offset, &server_maker2));
1347 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1348 false, true, 0, "hello!"));
1349 mock_quic_data.AddWrite(
1350 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
bnc359ed2a2016-04-29 20:43:451351 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1352 mock_quic_data.AddRead(ASYNC, 0); // EOF
1353
1354 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1355
1356 AddHangingNonAlternateProtocolSocketData();
1357 AddHangingNonAlternateProtocolSocketData();
1358
1359 CreateSession();
1360
1361 const char destination1[] = "first.example.com";
1362 const char destination2[] = "second.example.com";
1363
1364 // Set up alternative service for |origin1|.
1365 AlternativeService alternative_service1(QUIC, destination1, 443);
1366 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1367 http_server_properties_.SetAlternativeService(
1368 url::SchemeHostPort(origin1), alternative_service1, expiration);
1369
1370 // Set up multiple alternative service entries for |origin2|,
1371 // the first one with a different destination as for |origin1|,
1372 // the second one with the same. The second one should be used,
1373 // because the request can be pooled to that one.
1374 AlternativeService alternative_service2(QUIC, destination2, 443);
1375 AlternativeServiceInfoVector alternative_services;
1376 alternative_services.push_back(
1377 AlternativeServiceInfo(alternative_service2, expiration));
1378 alternative_services.push_back(
1379 AlternativeServiceInfo(alternative_service1, expiration));
1380 http_server_properties_.SetAlternativeServices(url::SchemeHostPort(origin2),
1381 alternative_services);
bnc359ed2a2016-04-29 20:43:451382 // First request opens connection to |destination1|
1383 // with QuicServerId.host() == origin1.host().
1384 SendRequestAndExpectQuicResponse("hello!");
1385
1386 // Second request pools to existing connection with same destination,
1387 // because certificate matches, even though QuicServerId is different.
1388 request_.url = origin2;
alyssar2adf3ac2016-05-03 17:12:581389
bnc359ed2a2016-04-29 20:43:451390 SendRequestAndExpectQuicResponse("hello!");
zhongyi32569c62016-01-08 02:54:301391}
1392
1393// Multiple origins have listed the same alternative services. When there's a
1394// existing QUIC session opened by a request to other origin,
1395// if the cert is valid, should select this QUIC session to make the request
1396// if this is also the first existing QUIC session.
1397TEST_P(QuicNetworkTransactionTest,
1398 UseSharedExistingAlternativeServiceForQuicWithValidCert) {
rch9ae5b3b2016-02-11 00:36:291399 // Default cert is valid for *.example.org
zhongyi32569c62016-01-08 02:54:301400
rch9ae5b3b2016-02-11 00:36:291401 // HTTP data for request to www.example.org.
zhongyi32569c62016-01-08 02:54:301402 MockRead http_reads[] = {
1403 MockRead("HTTP/1.1 200 OK\r\n"),
1404 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
rch9ae5b3b2016-02-11 00:36:291405 MockRead("hello world from www.example.org"),
zhongyi32569c62016-01-08 02:54:301406 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1407 MockRead(ASYNC, OK)};
1408
1409 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1410 0);
1411 socket_factory_.AddSocketDataProvider(&http_data);
1412 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1413
1414 // HTTP data for request to mail.example.org.
1415 MockRead http_reads2[] = {
1416 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291417 MockRead("Alt-Svc: quic=\":444\", quic=\"www.example.org:443\"\r\n\r\n"),
zhongyi32569c62016-01-08 02:54:301418 MockRead("hello world from mail.example.org"),
1419 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1420 MockRead(ASYNC, OK)};
1421
1422 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1423 nullptr, 0);
1424 socket_factory_.AddSocketDataProvider(&http_data2);
1425 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1426
1427 QuicStreamOffset request_header_offset = 0;
1428 QuicStreamOffset response_header_offset = 0;
1429
alyssar2adf3ac2016-05-03 17:12:581430 QuicTestPacketMaker client_maker(GetParam(), 0, clock_, "mail.example.org",
1431 Perspective::IS_CLIENT);
1432 server_maker_.set_hostname("www.example.org");
1433 client_maker_.set_hostname("www.example.org");
zhongyi32569c62016-01-08 02:54:301434 MockQuicData mock_quic_data;
1435
1436 // First QUIC request data.
alyssar2adf3ac2016-05-03 17:12:581437 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301438 1, kClientDataStreamId1, true, true,
1439 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1440
alyssar2adf3ac2016-05-03 17:12:581441 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301442 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1443 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581444 mock_quic_data.AddRead(ConstructServerDataPacket(
1445 2, kClientDataStreamId1, false, true, 0, "hello from mail QUIC!"));
1446 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301447 // Second QUIC request data.
alyssar2adf3ac2016-05-03 17:12:581448 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301449 3, kClientDataStreamId2, false, true,
alyssar2adf3ac2016-05-03 17:12:581450 GetRequestHeaders("GET", "https", "/", &client_maker),
1451 &request_header_offset, &client_maker));
1452 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301453 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1454 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581455 mock_quic_data.AddRead(ConstructServerDataPacket(
1456 4, kClientDataStreamId2, false, true, 0, "hello from mail QUIC!"));
1457 mock_quic_data.AddWrite(
1458 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
zhongyi32569c62016-01-08 02:54:301459 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1460 mock_quic_data.AddRead(ASYNC, 0); // EOF
1461
1462 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
zhongyi32569c62016-01-08 02:54:301463
rtennetib8e80fb2016-05-16 00:12:091464 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321465 CreateSession();
zhongyi32569c62016-01-08 02:54:301466
1467 // Send two HTTP requests, responses set up alt-svc lists for the origins.
rch9ae5b3b2016-02-11 00:36:291468 request_.url = GURL("https://www.example.org/");
1469 SendRequestAndExpectHttpResponse("hello world from www.example.org");
zhongyi32569c62016-01-08 02:54:301470 request_.url = GURL("https://mail.example.org/");
1471 SendRequestAndExpectHttpResponse("hello world from mail.example.org");
1472
rch9ae5b3b2016-02-11 00:36:291473 // Open a QUIC session to mail.example.org:443 when making request
1474 // to mail.example.org.
1475 request_.url = GURL("https://www.example.org/");
bnc359ed2a2016-04-29 20:43:451476 SendRequestAndExpectQuicResponse("hello from mail QUIC!");
zhongyi32569c62016-01-08 02:54:301477
rch9ae5b3b2016-02-11 00:36:291478 // Uses the existing QUIC session when making request to www.example.org.
zhongyi32569c62016-01-08 02:54:301479 request_.url = GURL("https://mail.example.org/");
bnc359ed2a2016-04-29 20:43:451480 SendRequestAndExpectQuicResponse("hello from mail QUIC!");
bncc958faa2015-07-31 18:14:521481}
1482
1483TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) {
bncc958faa2015-07-31 18:14:521484 MockRead http_reads[] = {
1485 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561486 MockRead(kQuicAlternativeServiceDifferentPortHeader),
bncc958faa2015-07-31 18:14:521487 MockRead("hello world"),
1488 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1489 MockRead(ASYNC, OK)};
1490
1491 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1492 0);
1493 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561494 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521495
rtennetib8e80fb2016-05-16 00:12:091496 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321497 CreateSession();
bncc958faa2015-07-31 18:14:521498
1499 SendRequestAndExpectHttpResponse("hello world");
bnc359ed2a2016-04-29 20:43:451500
1501 url::SchemeHostPort http_server("https", kDefaultServerHostName, 443);
1502 AlternativeServiceVector alternative_service_vector =
1503 http_server_properties_.GetAlternativeServices(http_server);
1504 ASSERT_EQ(1u, alternative_service_vector.size());
1505 const AlternativeService alternative_service = alternative_service_vector[0];
1506 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
1507 EXPECT_EQ(kDefaultServerHostName, alternative_service_vector[0].host);
1508 EXPECT_EQ(137, alternative_service_vector[0].port);
bncc958faa2015-07-31 18:14:521509}
1510
1511TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) {
bncc958faa2015-07-31 18:14:521512 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561513 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1514 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521515 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1516 MockRead(ASYNC, OK)};
1517
1518 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1519 0);
1520 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561521 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521522
1523 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581524 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1525 1, kClientDataStreamId1, true, true,
1526 GetRequestHeaders("GET", "https", "/")));
1527 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:521528 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581529 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1530 false, true, 0, "hello!"));
1531 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:521532 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1533 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521534
1535 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1536
rtennetib8e80fb2016-05-16 00:12:091537 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321538 CreateSession();
bncc958faa2015-07-31 18:14:521539
1540 AlternativeService alternative_service(QUIC,
1541 HostPortPair::FromURL(request_.url));
1542 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
1543 alternative_service);
1544 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1545 alternative_service));
1546
1547 SendRequestAndExpectHttpResponse("hello world");
1548 SendRequestAndExpectQuicResponse("hello!");
1549
mmenkee24011922015-12-17 22:12:591550 mock_quic_data.Resume();
bncc958faa2015-07-31 18:14:521551
1552 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1553 alternative_service));
1554}
1555
bncc958faa2015-07-31 18:14:521556TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) {
bncc958faa2015-07-31 18:14:521557 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561558 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1559 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521560 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1561 MockRead(ASYNC, OK)};
1562
1563 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1564 0);
1565 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561566 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521567
1568 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581569 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1570 1, kClientDataStreamId1, true, true,
1571 GetRequestHeaders("GET", "https", "/")));
1572 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:521573 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581574 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1575 false, true, 0, "hello!"));
1576 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:521577 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
1578
1579 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1580
1581 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321582 CreateSession();
bncc958faa2015-07-31 18:14:521583
1584 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1585 SendRequestAndExpectHttpResponse("hello world");
1586}
1587
[email protected]1e960032013-12-20 19:00:201588TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
[email protected]aa9b14d2013-05-10 23:45:191589 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561590 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1591 MockRead("hello world"),
1592 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1593 MockRead(ASYNC, OK)};
[email protected]61a527782013-02-21 03:58:001594
rjshaded5ced072015-12-18 19:26:021595 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1596 0);
[email protected]aa9b14d2013-05-10 23:45:191597 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561598 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]61a527782013-02-21 03:58:001599
[email protected]1e960032013-12-20 19:00:201600 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581601 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1602 1, kClientDataStreamId1, true, true,
1603 GetRequestHeaders("GET", "https", "/")));
1604 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021605 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581606 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1607 false, true, 0, "hello!"));
1608 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501609 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591610 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]61a527782013-02-21 03:58:001611
rcha5399e02015-04-21 19:32:041612 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]61a527782013-02-21 03:58:001613
rtennetib8e80fb2016-05-16 00:12:091614 // The non-alternate protocol job needs to hang in order to guarantee that
1615 // the alternate-protocol job will "win".
1616 AddHangingNonAlternateProtocolSocketData();
1617
rch3f4b8452016-02-23 16:59:321618 params_.parse_alternative_services = false;
1619 params_.parse_alternative_services = false;
1620 CreateSession();
[email protected]61a527782013-02-21 03:58:001621
[email protected]aa9b14d2013-05-10 23:45:191622 SendRequestAndExpectHttpResponse("hello world");
1623 SendRequestAndExpectQuicResponse("hello!");
[email protected]61a527782013-02-21 03:58:001624}
1625
rchf47265dc2016-03-21 21:33:121626TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolWithProbabilityForQuic) {
1627 MockRead http_reads[] = {
1628 MockRead("HTTP/1.1 200 OK\r\n"),
1629 MockRead(kQuicAlternateProtocolWithProbabilityHeader),
1630 MockRead("hello world"),
1631 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1632 MockRead(ASYNC, OK)};
1633
1634 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1635 0);
1636 socket_factory_.AddSocketDataProvider(&http_data);
1637 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1638
1639 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581640 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1641 1, kClientDataStreamId1, true, true,
1642 GetRequestHeaders("GET", "https", "/")));
1643 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rchf47265dc2016-03-21 21:33:121644 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581645 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1646 false, true, 0, "hello!"));
1647 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchf47265dc2016-03-21 21:33:121648 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1649 mock_quic_data.AddRead(ASYNC, 0); // EOF
1650
1651 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1652
rtennetib8e80fb2016-05-16 00:12:091653 // The non-alternate protocol job needs to hang in order to guarantee that
1654 // the alternate-protocol job will "win".
1655 AddHangingNonAlternateProtocolSocketData();
1656
rchf47265dc2016-03-21 21:33:121657 params_.parse_alternative_services = false;
1658 params_.parse_alternative_services = false;
1659 CreateSession();
1660
1661 SendRequestAndExpectHttpResponse("hello world");
1662 SendRequestAndExpectQuicResponse("hello!");
1663}
1664
bnc62a44f022015-04-02 15:59:411665TEST_P(QuicNetworkTransactionTest, AlternateProtocolDifferentPort) {
1666 MockRead http_reads[] = {
1667 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561668 MockRead(kQuicAlternateProtocolDifferentPortHeader),
bnc62a44f022015-04-02 15:59:411669 MockRead("hello world"),
1670 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1671 MockRead(ASYNC, OK)};
1672
1673 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1674 0);
1675 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561676 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bnc62a44f022015-04-02 15:59:411677
rtennetib8e80fb2016-05-16 00:12:091678 // The non-alternate protocol job needs to hang in order to guarantee that
1679 // the alternate-protocol job will "win".
1680 AddHangingNonAlternateProtocolSocketData();
1681
rch3f4b8452016-02-23 16:59:321682 params_.parse_alternative_services = false;
1683 CreateSession();
bnc62a44f022015-04-02 15:59:411684
1685 SendRequestAndExpectHttpResponse("hello world");
bnc359ed2a2016-04-29 20:43:451686
1687 url::SchemeHostPort http_server("https", kDefaultServerHostName, 443);
1688 AlternativeServiceVector alternative_service_vector =
1689 http_server_properties_.GetAlternativeServices(http_server);
1690 ASSERT_EQ(1u, alternative_service_vector.size());
1691 const AlternativeService alternative_service = alternative_service_vector[0];
1692 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
1693 EXPECT_EQ(kDefaultServerHostName, alternative_service_vector[0].host);
1694 EXPECT_EQ(137, alternative_service_vector[0].port);
bnc62a44f022015-04-02 15:59:411695}
1696
bncc958faa2015-07-31 18:14:521697TEST_P(QuicNetworkTransactionTest, ConfirmAlternateProtocol) {
bncae8db8402015-03-26 20:13:501698 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561699 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
bncae8db8402015-03-26 20:13:501700 MockRead("hello world"),
1701 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1702 MockRead(ASYNC, OK)};
1703
1704 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1705 0);
1706 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561707 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncae8db8402015-03-26 20:13:501708
1709 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581710 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1711 1, kClientDataStreamId1, true, true,
1712 GetRequestHeaders("GET", "https", "/")));
1713 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncae8db8402015-03-26 20:13:501714 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581715 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1716 false, true, 0, "hello!"));
1717 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501718 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1719 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncae8db8402015-03-26 20:13:501720
rcha5399e02015-04-21 19:32:041721 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bncae8db8402015-03-26 20:13:501722
rtennetib8e80fb2016-05-16 00:12:091723 // The non-alternate protocol job needs to hang in order to guarantee that
1724 // the alternate-protocol job will "win".
1725 AddHangingNonAlternateProtocolSocketData();
1726
rch3f4b8452016-02-23 16:59:321727 params_.parse_alternative_services = false;
1728 CreateSession();
bncae8db8402015-03-26 20:13:501729
1730 AlternativeService alternative_service(QUIC,
1731 HostPortPair::FromURL(request_.url));
bnc6be245c12015-05-15 11:24:071732 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
bncae8db8402015-03-26 20:13:501733 alternative_service);
bnc6be245c12015-05-15 11:24:071734 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1735 alternative_service));
bncae8db8402015-03-26 20:13:501736
1737 SendRequestAndExpectHttpResponse("hello world");
1738 SendRequestAndExpectQuicResponse("hello!");
1739
mmenkee24011922015-12-17 22:12:591740 mock_quic_data.Resume();
rchb27683c2015-07-29 23:53:501741
bnc6be245c12015-05-15 11:24:071742 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1743 alternative_service));
bncae8db8402015-03-26 20:13:501744}
1745
[email protected]1e960032013-12-20 19:00:201746TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) {
[email protected]6d1b4ed2013-07-10 03:57:541747 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561748 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1749 MockRead("hello world"),
1750 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1751 MockRead(ASYNC, OK)};
[email protected]6d1b4ed2013-07-10 03:57:541752
rjshaded5ced072015-12-18 19:26:021753 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1754 0);
[email protected]6d1b4ed2013-07-10 03:57:541755 socket_factory_.AddSocketDataProvider(&http_data);
1756
[email protected]1e960032013-12-20 19:00:201757 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581758 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1759 1, kClientDataStreamId1, true, true,
1760 GetRequestHeaders("GET", "https", "/")));
1761 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021762 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581763 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1764 false, true, 0, "hello!"));
1765 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501766 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591767 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]6d1b4ed2013-07-10 03:57:541768
rcha5399e02015-04-21 19:32:041769 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]6d1b4ed2013-07-10 03:57:541770
rtennetib8e80fb2016-05-16 00:12:091771 // The non-alternate protocol job needs to hang in order to guarantee that
1772 // the alternate-protocol job will "win".
[email protected]6d1b4ed2013-07-10 03:57:541773 AddHangingNonAlternateProtocolSocketData();
rtennetib8e80fb2016-05-16 00:12:091774
rch3f4b8452016-02-23 16:59:321775 CreateSession();
[email protected]6d1b4ed2013-07-10 03:57:541776
1777 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1778 SendRequestAndExpectHttpResponse("hello world");
1779}
1780
[email protected]1e960032013-12-20 19:00:201781TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) {
rch3f4b8452016-02-23 16:59:321782 params_.parse_alternative_services = false;
[email protected]dda75ab2013-06-22 22:43:301783 crypto_client_stream_factory_.set_handshake_mode(
1784 MockCryptoClientStream::COLD_START);
1785
1786 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561787 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
rch9ae5b3b2016-02-11 00:36:291788 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561789 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")};
[email protected]dda75ab2013-06-22 22:43:301790
1791 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561792 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1793 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1794 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]dda75ab2013-06-22 22:43:301795
mmenke651bae7f2015-12-18 21:26:451796 SequencedSocketData http_data(http_reads, arraysize(http_reads), http_writes,
1797 arraysize(http_writes));
bnc912a04b2016-04-20 14:19:501798 socket_factory_.AddSocketDataProvider(&http_data);
1799 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301800
1801 // The QUIC transaction will not be allowed to complete.
mmenke651bae7f2015-12-18 21:26:451802 MockWrite quic_writes[] = {MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 1)};
[email protected]dda75ab2013-06-22 22:43:301803 MockRead quic_reads[] = {
mmenke651bae7f2015-12-18 21:26:451804 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0),
[email protected]dda75ab2013-06-22 22:43:301805 };
mmenke651bae7f2015-12-18 21:26:451806 SequencedSocketData quic_data(quic_reads, arraysize(quic_reads), quic_writes,
1807 arraysize(quic_writes));
bnc912a04b2016-04-20 14:19:501808 socket_factory_.AddSocketDataProvider(&quic_data);
[email protected]dda75ab2013-06-22 22:43:301809
1810 // The HTTP transaction will complete.
mmenke651bae7f2015-12-18 21:26:451811 SequencedSocketData http_data2(http_reads, arraysize(http_reads), http_writes,
1812 arraysize(http_writes));
bnc912a04b2016-04-20 14:19:501813 socket_factory_.AddSocketDataProvider(&http_data2);
1814 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301815
bnc912a04b2016-04-20 14:19:501816 CreateSession();
[email protected]dda75ab2013-06-22 22:43:301817
1818 // Run the first request.
[email protected]dda75ab2013-06-22 22:43:301819 SendRequestAndExpectHttpResponse("hello world");
rch37de576c2015-05-17 20:28:171820 ASSERT_TRUE(http_data.AllReadDataConsumed());
1821 ASSERT_TRUE(http_data.AllWriteDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301822
1823 // Now run the second request in which the QUIC socket hangs,
1824 // and verify the the transaction continues over HTTP.
[email protected]dda75ab2013-06-22 22:43:301825 SendRequestAndExpectHttpResponse("hello world");
mmenke651bae7f2015-12-18 21:26:451826 base::RunLoop().RunUntilIdle();
[email protected]dda75ab2013-06-22 22:43:301827
rch37de576c2015-05-17 20:28:171828 ASSERT_TRUE(http_data2.AllReadDataConsumed());
1829 ASSERT_TRUE(http_data2.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:451830 ASSERT_TRUE(quic_data.AllReadDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301831}
1832
[email protected]1e960032013-12-20 19:00:201833TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
[email protected]1e960032013-12-20 19:00:201834 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581835 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1836 1, kClientDataStreamId1, true, true,
1837 GetRequestHeaders("GET", "https", "/")));
1838 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021839 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581840 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1841 false, true, 0, "hello!"));
1842 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501843 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591844 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]8ba81212013-05-03 13:11:481845
rcha5399e02015-04-21 19:32:041846 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]8ba81212013-05-03 13:11:481847
rtennetib8e80fb2016-05-16 00:12:091848 // The non-alternate protocol job needs to hang in order to guarantee that
1849 // the alternate-protocol job will "win".
1850 AddHangingNonAlternateProtocolSocketData();
1851
rch3f4b8452016-02-23 16:59:321852 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:191853 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1854 SendRequestAndExpectQuicResponse("hello!");
[email protected]8ba81212013-05-03 13:11:481855}
1856
[email protected]1e960032013-12-20 19:00:201857TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
[email protected]1e960032013-12-20 19:00:201858 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581859 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1860 1, kClientDataStreamId1, true, true,
1861 GetRequestHeaders("GET", "https", "/")));
1862 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021863 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581864 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1865 false, true, 0, "hello!"));
1866 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501867 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591868 mock_quic_data.AddRead(ASYNC, 0); // EOF
rcha5399e02015-04-21 19:32:041869 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]3a120a6b2013-06-25 01:08:271870
1871 // In order for a new QUIC session to be established via alternate-protocol
1872 // without racing an HTTP connection, we need the host resolution to happen
1873 // synchronously.
1874 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291875 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561876 "");
rch9ae5b3b2016-02-11 00:36:291877 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]3a120a6b2013-06-25 01:08:271878 AddressList address;
rjshaded5ced072015-12-18 19:26:021879 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1880 nullptr, net_log_.bound());
[email protected]3a120a6b2013-06-25 01:08:271881
rtennetib8e80fb2016-05-16 00:12:091882 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321883 CreateSession();
[email protected]3a120a6b2013-06-25 01:08:271884 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1885 SendRequestAndExpectQuicResponse("hello!");
1886}
1887
[email protected]0fc924b2014-03-31 04:34:151888TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) {
rdsmith82957ad2015-09-16 19:42:031889 proxy_service_ = ProxyService::CreateFixedFromPacResult("PROXY myproxy:70");
[email protected]0fc924b2014-03-31 04:34:151890
1891 // Since we are using a proxy, the QUIC job will not succeed.
1892 MockWrite http_writes[] = {
rch9ae5b3b2016-02-11 00:36:291893 MockWrite(SYNCHRONOUS, 0, "GET http://mail.example.org/ HTTP/1.1\r\n"),
1894 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561895 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")};
[email protected]0fc924b2014-03-31 04:34:151896
1897 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561898 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1899 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1900 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]0fc924b2014-03-31 04:34:151901
1902 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
1903 http_writes, arraysize(http_writes));
1904 socket_factory_.AddSocketDataProvider(&http_data);
1905
1906 // In order for a new QUIC session to be established via alternate-protocol
1907 // without racing an HTTP connection, we need the host resolution to happen
1908 // synchronously.
1909 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291910 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561911 "");
rch9ae5b3b2016-02-11 00:36:291912 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]0fc924b2014-03-31 04:34:151913 AddressList address;
rjshaded5ced072015-12-18 19:26:021914 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1915 nullptr, net_log_.bound());
[email protected]0fc924b2014-03-31 04:34:151916
rch9ae5b3b2016-02-11 00:36:291917 request_.url = GURL("http://mail.example.org/");
rch3f4b8452016-02-23 16:59:321918 CreateSession();
[email protected]0fc924b2014-03-31 04:34:151919 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1920 SendRequestAndExpectHttpResponse("hello world");
1921}
1922
[email protected]1e960032013-12-20 19:00:201923TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
[email protected]1e960032013-12-20 19:00:201924 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581925 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1926 1, kClientDataStreamId1, true, true,
1927 GetRequestHeaders("GET", "https", "/")));
1928 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021929 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581930 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1931 false, true, 0, "hello!"));
1932 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591933 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
rcha5399e02015-04-21 19:32:041934 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]11c05872013-08-20 02:04:121935
rtennetib8e80fb2016-05-16 00:12:091936 // The non-alternate protocol job needs to hang in order to guarantee that
1937 // the alternate-protocol job will "win".
1938 AddHangingNonAlternateProtocolSocketData();
1939
[email protected]11c05872013-08-20 02:04:121940 // In order for a new QUIC session to be established via alternate-protocol
1941 // without racing an HTTP connection, we need the host resolution to happen
1942 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1943 // connection to the the server, in this test we require confirmation
1944 // before encrypting so the HTTP job will still start.
1945 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291946 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561947 "");
rch9ae5b3b2016-02-11 00:36:291948 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]11c05872013-08-20 02:04:121949 AddressList address;
rjshaded5ced072015-12-18 19:26:021950 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1951 nullptr, net_log_.bound());
[email protected]11c05872013-08-20 02:04:121952
rch3f4b8452016-02-23 16:59:321953 CreateSession();
[email protected]11c05872013-08-20 02:04:121954 session_->quic_stream_factory()->set_require_confirmation(true);
1955 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1956
danakjad1777e2016-04-16 00:56:421957 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]11c05872013-08-20 02:04:121958 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1959 TestCompletionCallback callback;
1960 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1961 EXPECT_EQ(ERR_IO_PENDING, rv);
1962
1963 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1964 QuicSession::HANDSHAKE_CONFIRMED);
1965 EXPECT_EQ(OK, callback.WaitForResult());
rchb27683c2015-07-29 23:53:501966
1967 CheckWasQuicResponse(trans);
1968 CheckResponseData(trans, "hello!");
[email protected]11c05872013-08-20 02:04:121969}
1970
zhongyica364fbb2015-12-12 03:39:121971TEST_P(QuicNetworkTransactionTest,
1972 LogGranularQuicErrorCodeOnQuicProtocolErrorLocal) {
1973 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581974 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1975 1, kClientDataStreamId1, true, true,
1976 GetRequestHeaders("GET", "https", "/")));
zhongyica364fbb2015-12-12 03:39:121977 // Read a close connection packet with
1978 // QuicErrorCode: QUIC_CRYPTO_VERSION_NOT_SUPPORTED from the peer.
alyssar2adf3ac2016-05-03 17:12:581979 mock_quic_data.AddRead(ConstructServerConnectionClosePacket(1));
zhongyica364fbb2015-12-12 03:39:121980 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1981
1982 // The non-alternate protocol job needs to hang in order to guarantee that
1983 // the alternate-protocol job will "win".
1984 AddHangingNonAlternateProtocolSocketData();
1985
1986 // In order for a new QUIC session to be established via alternate-protocol
1987 // without racing an HTTP connection, we need the host resolution to happen
1988 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1989 // connection to the the server, in this test we require confirmation
1990 // before encrypting so the HTTP job will still start.
1991 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291992 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:121993 "");
rch9ae5b3b2016-02-11 00:36:291994 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:121995 AddressList address;
1996 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1997 nullptr, net_log_.bound());
1998
rch3f4b8452016-02-23 16:59:321999 CreateSession();
zhongyica364fbb2015-12-12 03:39:122000 session_->quic_stream_factory()->set_require_confirmation(true);
2001 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2002
danakjad1777e2016-04-16 00:56:422003 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyica364fbb2015-12-12 03:39:122004 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2005 TestCompletionCallback callback;
2006 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2007 EXPECT_EQ(ERR_IO_PENDING, rv);
2008
2009 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
2010 QuicSession::HANDSHAKE_CONFIRMED);
2011 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
2012
2013 NetErrorDetails details;
2014 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
2015
2016 trans->PopulateNetErrorDetails(&details);
2017 // Verify the error code logged is what sent by the peer.
2018 EXPECT_EQ(QUIC_CRYPTO_VERSION_NOT_SUPPORTED, details.quic_connection_error);
2019}
2020
2021TEST_P(QuicNetworkTransactionTest,
2022 LogGranularQuicErrorCodeOnQuicProtocolErrorRemote) {
2023 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582024 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2025 1, kClientDataStreamId1, true, true,
2026 GetRequestHeaders("GET", "https", "/")));
zhongyif28b4a32016-04-25 21:35:212027 // Peer sending data from an non-existing stream causes this end to raise
2028 // error and close connection.
2029 mock_quic_data.AddRead(
alyssar2adf3ac2016-05-03 17:12:582030 ConstructServerRstPacket(1, false, 99, QUIC_STREAM_LAST_ERROR));
zhongyif28b4a32016-04-25 21:35:212031 std::string quic_error_details = "Data for nonexistent stream";
alyssar2adf3ac2016-05-03 17:12:582032 mock_quic_data.AddWrite(ConstructClientAckAndConnectionClosePacket(
zhongyif28b4a32016-04-25 21:35:212033 2, QuicTime::Delta::Infinite(), 0, 1, QUIC_INVALID_STREAM_ID,
zhongyica364fbb2015-12-12 03:39:122034 quic_error_details));
2035 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2036
2037 // The non-alternate protocol job needs to hang in order to guarantee that
2038 // the alternate-protocol job will "win".
2039 AddHangingNonAlternateProtocolSocketData();
2040
2041 // In order for a new QUIC session to be established via alternate-protocol
2042 // without racing an HTTP connection, we need the host resolution to happen
2043 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
2044 // connection to the the server, in this test we require confirmation
2045 // before encrypting so the HTTP job will still start.
2046 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:292047 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:122048 "");
rch9ae5b3b2016-02-11 00:36:292049 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:122050 AddressList address;
2051 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2052 nullptr, net_log_.bound());
2053
rch3f4b8452016-02-23 16:59:322054 CreateSession();
zhongyica364fbb2015-12-12 03:39:122055 session_->quic_stream_factory()->set_require_confirmation(true);
2056 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2057
danakjad1777e2016-04-16 00:56:422058 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyica364fbb2015-12-12 03:39:122059 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2060 TestCompletionCallback callback;
2061 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2062 EXPECT_EQ(ERR_IO_PENDING, rv);
2063
2064 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
2065 QuicSession::HANDSHAKE_CONFIRMED);
2066 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
2067 NetErrorDetails details;
2068 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
2069
2070 trans->PopulateNetErrorDetails(&details);
zhongyif28b4a32016-04-25 21:35:212071 EXPECT_EQ(QUIC_INVALID_STREAM_ID, details.quic_connection_error);
zhongyica364fbb2015-12-12 03:39:122072}
2073
[email protected]1e960032013-12-20 19:00:202074TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
[email protected]3316d422013-05-03 21:45:302075 // Alternate-protocol job
alyssar2adf3ac2016-05-03 17:12:582076 std::unique_ptr<QuicEncryptedPacket> close(
2077 ConstructServerConnectionClosePacket(1));
[email protected]3316d422013-05-03 21:45:302078 MockRead quic_reads[] = {
rchb27683c2015-07-29 23:53:502079 MockRead(ASYNC, close->data(), close->length()),
2080 MockRead(ASYNC, ERR_IO_PENDING), // No more data to read
2081 MockRead(ASYNC, OK), // EOF
[email protected]3316d422013-05-03 21:45:302082 };
rjshaded5ced072015-12-18 19:26:022083 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2084 0);
[email protected]3316d422013-05-03 21:45:302085 socket_factory_.AddSocketDataProvider(&quic_data);
2086
2087 // Main job which will succeed even though the alternate job fails.
2088 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022089 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2090 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2091 MockRead(ASYNC, OK)};
[email protected]3316d422013-05-03 21:45:302092
rjshaded5ced072015-12-18 19:26:022093 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2094 0);
[email protected]3316d422013-05-03 21:45:302095 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562096 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]3316d422013-05-03 21:45:302097
rch3f4b8452016-02-23 16:59:322098 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:192099 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2100 SendRequestAndExpectHttpResponse("hello from http");
2101 ExpectBrokenAlternateProtocolMapping();
[email protected]3316d422013-05-03 21:45:302102}
2103
[email protected]1e960032013-12-20 19:00:202104TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
[email protected]d03a66d2013-05-06 12:55:592105 // Alternate-protocol job
2106 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022107 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]d03a66d2013-05-06 12:55:592108 };
rjshaded5ced072015-12-18 19:26:022109 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2110 0);
[email protected]d03a66d2013-05-06 12:55:592111 socket_factory_.AddSocketDataProvider(&quic_data);
2112
2113 // Main job which will succeed even though the alternate job fails.
2114 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022115 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2116 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2117 MockRead(ASYNC, OK)};
[email protected]d03a66d2013-05-06 12:55:592118
rjshaded5ced072015-12-18 19:26:022119 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2120 0);
[email protected]d03a66d2013-05-06 12:55:592121 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562122 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]d03a66d2013-05-06 12:55:592123
rch3f4b8452016-02-23 16:59:322124 CreateSession();
[email protected]d03a66d2013-05-06 12:55:592125
[email protected]aa9b14d2013-05-10 23:45:192126 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2127 SendRequestAndExpectHttpResponse("hello from http");
2128 ExpectBrokenAlternateProtocolMapping();
[email protected]d03a66d2013-05-06 12:55:592129}
2130
[email protected]00c159f2014-05-21 22:38:162131TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) {
[email protected]eb71ab62014-05-23 07:57:532132 // Alternate-protocol job will fail when the session attempts to read.
[email protected]00c159f2014-05-21 22:38:162133 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022134 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162135 };
rjshaded5ced072015-12-18 19:26:022136 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2137 0);
[email protected]00c159f2014-05-21 22:38:162138 socket_factory_.AddSocketDataProvider(&quic_data);
2139
[email protected]eb71ab62014-05-23 07:57:532140 // Main job will also fail.
[email protected]00c159f2014-05-21 22:38:162141 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022142 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162143 };
2144
rjshaded5ced072015-12-18 19:26:022145 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2146 0);
[email protected]00c159f2014-05-21 22:38:162147 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED));
2148 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562149 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]00c159f2014-05-21 22:38:162150
rtennetib8e80fb2016-05-16 00:12:092151 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322152 CreateSession();
[email protected]00c159f2014-05-21 22:38:162153
2154 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
danakjad1777e2016-04-16 00:56:422155 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]00c159f2014-05-21 22:38:162156 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2157 TestCompletionCallback callback;
2158 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2159 EXPECT_EQ(ERR_IO_PENDING, rv);
2160 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult());
2161 ExpectQuicAlternateProtocolMapping();
2162}
2163
[email protected]1e960032013-12-20 19:00:202164TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
[email protected]77c6c162013-08-17 02:57:452165 // Alternate-protocol job
2166 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022167 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]77c6c162013-08-17 02:57:452168 };
rjshaded5ced072015-12-18 19:26:022169 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2170 0);
[email protected]77c6c162013-08-17 02:57:452171 socket_factory_.AddSocketDataProvider(&quic_data);
2172
[email protected]c92c1b52014-05-31 04:16:062173 // Second Alternate-protocol job which will race with the TCP job.
2174 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:422175 nullptr, 0);
[email protected]c92c1b52014-05-31 04:16:062176 socket_factory_.AddSocketDataProvider(&quic_data2);
2177
[email protected]4d283b32013-10-17 12:57:272178 // Final job that will proceed when the QUIC job fails.
2179 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022180 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2181 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2182 MockRead(ASYNC, OK)};
[email protected]4d283b32013-10-17 12:57:272183
rjshaded5ced072015-12-18 19:26:022184 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2185 0);
[email protected]4d283b32013-10-17 12:57:272186 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562187 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d283b32013-10-17 12:57:272188
rtennetiafccbc062016-05-16 18:21:142189 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322190 CreateSession();
[email protected]77c6c162013-08-17 02:57:452191
2192 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2193
[email protected]4d283b32013-10-17 12:57:272194 SendRequestAndExpectHttpResponse("hello from http");
[email protected]77c6c162013-08-17 02:57:452195
2196 ExpectBrokenAlternateProtocolMapping();
[email protected]4d283b32013-10-17 12:57:272197
rch37de576c2015-05-17 20:28:172198 EXPECT_TRUE(quic_data.AllReadDataConsumed());
2199 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
[email protected]77c6c162013-08-17 02:57:452200}
2201
[email protected]93b31772014-06-19 08:03:352202TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) {
[email protected]65768442014-06-06 23:37:032203 // Alternate-protocol job
2204 MockRead quic_reads[] = {
mmenkee24011922015-12-17 22:12:592205 MockRead(SYNCHRONOUS, ERR_IO_PENDING),
[email protected]65768442014-06-06 23:37:032206 };
rjshaded5ced072015-12-18 19:26:022207 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2208 0);
[email protected]65768442014-06-06 23:37:032209 socket_factory_.AddSocketDataProvider(&quic_data);
2210
2211 // Main job that will proceed when the QUIC job fails.
2212 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022213 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2214 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2215 MockRead(ASYNC, OK)};
[email protected]65768442014-06-06 23:37:032216
rjshaded5ced072015-12-18 19:26:022217 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2218 0);
[email protected]65768442014-06-06 23:37:032219 socket_factory_.AddSocketDataProvider(&http_data);
2220
rtennetib8e80fb2016-05-16 00:12:092221 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322222 CreateSession();
[email protected]65768442014-06-06 23:37:032223
2224 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2225
2226 SendRequestAndExpectHttpResponse("hello from http");
2227}
2228
[email protected]eb71ab62014-05-23 07:57:532229TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
[email protected]4d590c9c2014-05-02 05:14:332230 // Alternate-protocol job will fail before creating a QUIC session.
rtennetibe635732014-10-02 22:51:422231 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0);
rjshaded5ced072015-12-18 19:26:022232 quic_data.set_connect_data(
2233 MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED));
[email protected]4d590c9c2014-05-02 05:14:332234 socket_factory_.AddSocketDataProvider(&quic_data);
2235
2236 // Main job which will succeed even though the alternate job fails.
2237 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022238 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2239 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2240 MockRead(ASYNC, OK)};
[email protected]4d590c9c2014-05-02 05:14:332241
rjshaded5ced072015-12-18 19:26:022242 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2243 0);
[email protected]4d590c9c2014-05-02 05:14:332244 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562245 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d590c9c2014-05-02 05:14:332246
rch3f4b8452016-02-23 16:59:322247 CreateSession();
[email protected]4d590c9c2014-05-02 05:14:332248 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2249 SendRequestAndExpectHttpResponse("hello from http");
[email protected]eb71ab62014-05-23 07:57:532250
2251 ExpectBrokenAlternateProtocolMapping();
[email protected]4d590c9c2014-05-02 05:14:332252}
2253
[email protected]4fee9672014-01-08 14:47:152254TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
[email protected]4fee9672014-01-08 14:47:152255 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582256 mock_quic_data.AddSynchronousRead(ConstructServerConnectionClosePacket(1));
2257 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2258 1, kClientDataStreamId1, true, true,
2259 GetRequestHeaders("GET", "https", "/")));
2260 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rcha5399e02015-04-21 19:32:042261 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4fee9672014-01-08 14:47:152262
2263 // When the QUIC connection fails, we will try the request again over HTTP.
2264 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:562265 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
2266 MockRead("hello world"),
2267 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2268 MockRead(ASYNC, OK)};
[email protected]4fee9672014-01-08 14:47:152269
rjshaded5ced072015-12-18 19:26:022270 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2271 0);
[email protected]4fee9672014-01-08 14:47:152272 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562273 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4fee9672014-01-08 14:47:152274
2275 // In order for a new QUIC session to be established via alternate-protocol
2276 // without racing an HTTP connection, we need the host resolution to happen
2277 // synchronously.
2278 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:292279 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:562280 "");
rch9ae5b3b2016-02-11 00:36:292281 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]4fee9672014-01-08 14:47:152282 AddressList address;
rjshaded5ced072015-12-18 19:26:022283 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2284 nullptr, net_log_.bound());
[email protected]4fee9672014-01-08 14:47:152285
rch3f4b8452016-02-23 16:59:322286 CreateSession();
[email protected]4fee9672014-01-08 14:47:152287 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2288 SendRequestAndExpectHttpResponse("hello world");
2289}
2290
bnc508835902015-05-12 20:10:292291TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) {
alyssar2adf3ac2016-05-03 17:12:582292 client_maker_.set_hostname("www.example.org");
tbansal0f56a39a2016-04-07 22:03:382293 EXPECT_FALSE(
2294 test_socket_performance_watcher_factory_.rtt_notification_received());
bnc508835902015-05-12 20:10:292295 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582296 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2297 1, kClientDataStreamId1, true, true,
2298 GetRequestHeaders("GET", "https", "/")));
2299 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc508835902015-05-12 20:10:292300 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:582301 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
2302 false, true, 0, "hello!"));
2303 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:502304 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
bnc508835902015-05-12 20:10:292305 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2306
bncb07c05532015-05-14 19:07:202307 request_.url = GURL("https://www.example.org:443");
rtennetib8e80fb2016-05-16 00:12:092308 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322309 CreateSession();
bnc508835902015-05-12 20:10:292310 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
2311 SendRequestAndExpectQuicResponse("hello!");
tbansal0f56a39a2016-04-07 22:03:382312 EXPECT_TRUE(
2313 test_socket_performance_watcher_factory_.rtt_notification_received());
bnc508835902015-05-12 20:10:292314}
2315
rtenneti56977812016-01-15 19:26:562316TEST_P(QuicNetworkTransactionTest, QuicUpload) {
rtenneti8a2f4632016-03-21 20:26:572317 params_.origins_to_force_quic_on.insert(
2318 HostPortPair::FromString("mail.example.org:443"));
rtenneti56977812016-01-15 19:26:562319
2320 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2321 MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_FAILED, 1)};
2322 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2323 arraysize(writes));
2324 socket_factory_.AddSocketDataProvider(&socket_data);
2325
rtennetib8e80fb2016-05-16 00:12:092326 // The non-alternate protocol job needs to hang in order to guarantee that
2327 // the alternate-protocol job will "win".
2328 AddHangingNonAlternateProtocolSocketData();
2329
rch3f4b8452016-02-23 16:59:322330 params_.enable_alternative_service_with_different_host = false;
rtenneti56977812016-01-15 19:26:562331 CreateSession();
2332 request_.method = "POST";
2333 ChunkedUploadDataStream upload_data(0);
2334 upload_data.AppendData("1", 1, true);
2335
2336 request_.upload_data_stream = &upload_data;
2337
danakjad1777e2016-04-16 00:56:422338 std::unique_ptr<HttpNetworkTransaction> trans(
rtenneti56977812016-01-15 19:26:562339 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2340 TestCompletionCallback callback;
2341 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2342 EXPECT_EQ(ERR_IO_PENDING, rv);
2343 EXPECT_NE(OK, callback.WaitForResult());
2344}
2345
bnc359ed2a2016-04-29 20:43:452346class QuicNetworkTransactionWithDestinationTest
2347 : public PlatformTest,
2348 public ::testing::WithParamInterface<PoolingTestParams> {
2349 protected:
2350 QuicNetworkTransactionWithDestinationTest()
2351 : clock_(new MockClock),
2352 version_(GetParam().version),
2353 destination_type_(GetParam().destination_type),
2354 cert_transparency_verifier_(new MultiLogCTVerifier()),
2355 ssl_config_service_(new SSLConfigServiceDefaults),
2356 proxy_service_(ProxyService::CreateDirect()),
2357 auth_handler_factory_(
2358 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
2359 random_generator_(0),
2360 ssl_data_(ASYNC, OK) {}
2361
2362 void SetUp() override {
2363 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
2364 base::MessageLoop::current()->RunUntilIdle();
2365
2366 HttpNetworkSession::Params params;
2367
2368 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
2369 params.quic_clock = clock_;
2370
2371 crypto_client_stream_factory_.set_handshake_mode(
2372 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2373 params.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
2374
2375 params.enable_alternative_service_with_different_host = true;
2376 params.enable_quic = true;
2377 params.quic_random = &random_generator_;
2378 params.client_socket_factory = &socket_factory_;
2379 params.host_resolver = &host_resolver_;
2380 params.cert_verifier = &cert_verifier_;
2381 params.transport_security_state = &transport_security_state_;
2382 params.cert_transparency_verifier = cert_transparency_verifier_.get();
2383 params.socket_performance_watcher_factory =
2384 &test_socket_performance_watcher_factory_;
2385 params.ssl_config_service = ssl_config_service_.get();
2386 params.proxy_service = proxy_service_.get();
2387 params.http_auth_handler_factory = auth_handler_factory_.get();
2388 params.http_server_properties = http_server_properties_.GetWeakPtr();
2389 params.quic_supported_versions = SupportedVersions(version_);
2390 params.quic_host_whitelist.insert("news.example.org");
2391 params.quic_host_whitelist.insert("mail.example.org");
2392 params.quic_host_whitelist.insert("mail.example.com");
2393
2394 session_.reset(new HttpNetworkSession(params));
2395 session_->quic_stream_factory()->set_require_confirmation(true);
2396 ASSERT_EQ(params.quic_socket_receive_buffer_size,
2397 session_->quic_stream_factory()->socket_receive_buffer_size());
2398 }
2399
2400 void TearDown() override {
2401 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
2402 // Empty the current queue.
2403 base::MessageLoop::current()->RunUntilIdle();
2404 PlatformTest::TearDown();
2405 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
2406 base::MessageLoop::current()->RunUntilIdle();
2407 }
2408
2409 void SetAlternativeService(const std::string& origin) {
2410 HostPortPair destination;
2411 switch (destination_type_) {
2412 case SAME_AS_FIRST:
2413 destination = HostPortPair(origin1_, 443);
2414 break;
2415 case SAME_AS_SECOND:
2416 destination = HostPortPair(origin2_, 443);
2417 break;
2418 case DIFFERENT:
2419 destination = HostPortPair(kDifferentHostname, 443);
2420 break;
2421 }
2422 AlternativeService alternative_service(QUIC, destination);
2423 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
2424 http_server_properties_.SetAlternativeService(
2425 url::SchemeHostPort("https", origin, 443), alternative_service,
2426 expiration);
2427 }
2428
alyssar2adf3ac2016-05-03 17:12:582429 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452430 QuicPacketNumber packet_number,
2431 QuicStreamId stream_id,
2432 bool should_include_version,
2433 QuicStreamOffset* offset,
2434 QuicTestPacketMaker* maker) {
2435 SpdyPriority priority =
2436 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
2437 SpdyHeaderBlock headers(maker->GetRequestHeaders("GET", "https", "/"));
2438 return maker->MakeRequestHeadersPacketWithOffsetTracking(
2439 packet_number, stream_id, should_include_version, true, priority,
2440 headers, offset);
2441 }
2442
alyssar2adf3ac2016-05-03 17:12:582443 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452444 QuicPacketNumber packet_number,
2445 QuicStreamId stream_id,
2446 bool should_include_version,
2447 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:582448 return ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452449 packet_number, stream_id, should_include_version, nullptr, maker);
2450 }
2451
alyssar2adf3ac2016-05-03 17:12:582452 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:452453 QuicPacketNumber packet_number,
2454 QuicStreamId stream_id,
2455 QuicStreamOffset* offset,
2456 QuicTestPacketMaker* maker) {
2457 SpdyHeaderBlock headers(maker->GetResponseHeaders("200 OK"));
2458 return maker->MakeResponseHeadersPacketWithOffsetTracking(
2459 packet_number, stream_id, false, false, headers, offset);
2460 }
2461
alyssar2adf3ac2016-05-03 17:12:582462 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:452463 QuicPacketNumber packet_number,
2464 QuicStreamId stream_id,
2465 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:582466 return ConstructServerResponseHeadersPacket(packet_number, stream_id,
2467 nullptr, maker);
bnc359ed2a2016-04-29 20:43:452468 }
2469
alyssar2adf3ac2016-05-03 17:12:582470 std::unique_ptr<QuicEncryptedPacket> ConstructServerDataPacket(
bnc359ed2a2016-04-29 20:43:452471 QuicPacketNumber packet_number,
2472 QuicStreamId stream_id,
2473 QuicTestPacketMaker* maker) {
2474 return maker->MakeDataPacket(packet_number, stream_id, false, true, 0,
2475 "hello");
2476 }
2477
alyssar2adf3ac2016-05-03 17:12:582478 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
bnc359ed2a2016-04-29 20:43:452479 QuicPacketNumber packet_number,
2480 QuicPacketNumber largest_received,
2481 QuicPacketNumber ack_least_unacked,
2482 QuicPacketNumber stop_least_unacked,
2483 QuicTestPacketMaker* maker) {
2484 return maker->MakeAckPacket(packet_number, largest_received,
2485 ack_least_unacked, stop_least_unacked, true);
2486 }
2487
2488 void AddRefusedSocketData() {
2489 std::unique_ptr<StaticSocketDataProvider> refused_data(
2490 new StaticSocketDataProvider());
2491 MockConnect refused_connect(SYNCHRONOUS, ERR_CONNECTION_REFUSED);
2492 refused_data->set_connect_data(refused_connect);
2493 socket_factory_.AddSocketDataProvider(refused_data.get());
2494 static_socket_data_provider_vector_.push_back(std::move(refused_data));
2495 }
2496
2497 void AddHangingSocketData() {
2498 std::unique_ptr<StaticSocketDataProvider> hanging_data(
2499 new StaticSocketDataProvider());
2500 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
2501 hanging_data->set_connect_data(hanging_connect);
2502 socket_factory_.AddSocketDataProvider(hanging_data.get());
2503 static_socket_data_provider_vector_.push_back(std::move(hanging_data));
2504 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
2505 }
2506
2507 bool AllDataConsumed() {
2508 for (const auto& socket_data_ptr : static_socket_data_provider_vector_) {
2509 if (!socket_data_ptr->AllReadDataConsumed() ||
2510 !socket_data_ptr->AllWriteDataConsumed()) {
2511 return false;
2512 }
2513 }
2514 return true;
2515 }
2516
2517 void SendRequestAndExpectQuicResponse(const std::string& host) {
2518 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
2519 HttpRequestInfo request;
2520 std::string url("https://");
2521 url.append(host);
2522 request.url = GURL(url);
2523 request.load_flags = 0;
2524 request.method = "GET";
2525 TestCompletionCallback callback;
2526 int rv = trans.Start(&request, callback.callback(), net_log_.bound());
2527 EXPECT_EQ(OK, callback.GetResult(rv));
2528
2529 std::string response_data;
2530 ASSERT_EQ(OK, ReadTransaction(&trans, &response_data));
2531 EXPECT_EQ("hello", response_data);
2532
2533 const HttpResponseInfo* response = trans.GetResponseInfo();
2534 ASSERT_TRUE(response != nullptr);
2535 ASSERT_TRUE(response->headers.get() != nullptr);
2536 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
2537 EXPECT_TRUE(response->was_fetched_via_spdy);
2538 EXPECT_TRUE(response->was_npn_negotiated);
2539 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
2540 response->connection_info);
2541 EXPECT_EQ(443, response->socket_address.port());
2542 }
2543
2544 MockClock* clock_;
2545 QuicVersion version_;
2546 DestinationType destination_type_;
2547 std::string origin1_;
2548 std::string origin2_;
2549 std::unique_ptr<HttpNetworkSession> session_;
2550 MockClientSocketFactory socket_factory_;
2551 MockHostResolver host_resolver_;
2552 MockCertVerifier cert_verifier_;
2553 TransportSecurityState transport_security_state_;
2554 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
2555 TestSocketPerformanceWatcherFactory test_socket_performance_watcher_factory_;
2556 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
2557 std::unique_ptr<ProxyService> proxy_service_;
2558 std::unique_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
2559 MockRandom random_generator_;
2560 HttpServerPropertiesImpl http_server_properties_;
2561 BoundTestNetLog net_log_;
2562 MockCryptoClientStreamFactory crypto_client_stream_factory_;
2563 std::vector<std::unique_ptr<StaticSocketDataProvider>>
2564 static_socket_data_provider_vector_;
2565 SSLSocketDataProvider ssl_data_;
2566};
2567
2568INSTANTIATE_TEST_CASE_P(Version,
2569 QuicNetworkTransactionWithDestinationTest,
2570 ::testing::ValuesIn(GetPoolingTestParams()));
2571
2572// A single QUIC request fails because the certificate does not match the origin
2573// hostname, regardless of whether it matches the alternative service hostname.
2574TEST_P(QuicNetworkTransactionWithDestinationTest, InvalidCertificate) {
2575 if (destination_type_ == DIFFERENT)
2576 return;
2577
2578 GURL url("https://mail.example.com/");
2579 origin1_ = url.host();
2580
2581 // Not used for requests, but this provides a test case where the certificate
2582 // is valid for the hostname of the alternative service.
2583 origin2_ = "mail.example.org";
2584
2585 SetAlternativeService(origin1_);
2586
2587 scoped_refptr<X509Certificate> cert(
2588 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2589 bool unused;
2590 ASSERT_FALSE(cert->VerifyNameMatch(origin1_, &unused));
2591 ASSERT_TRUE(cert->VerifyNameMatch(origin2_, &unused));
2592
2593 ProofVerifyDetailsChromium verify_details;
2594 verify_details.cert_verify_result.verified_cert = cert;
2595 verify_details.cert_verify_result.is_issued_by_known_root = true;
2596 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2597
2598 MockQuicData mock_quic_data;
2599 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);
2600 mock_quic_data.AddRead(ASYNC, 0);
2601
2602 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2603
2604 AddRefusedSocketData();
2605
2606 HttpRequestInfo request;
2607 request.url = url;
2608
2609 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
2610 TestCompletionCallback callback;
2611 int rv = trans.Start(&request, callback.callback(), net_log_.bound());
2612 EXPECT_EQ(ERR_CONNECTION_REFUSED, callback.GetResult(rv));
2613
2614 EXPECT_TRUE(AllDataConsumed());
2615}
2616
2617// First request opens QUIC session to alternative service. Second request
2618// pools to it, because destination matches and certificate is valid, even
2619// though QuicServerId is different.
2620TEST_P(QuicNetworkTransactionWithDestinationTest, PoolIfCertificateValid) {
2621 origin1_ = "mail.example.org";
2622 origin2_ = "news.example.org";
2623
2624 SetAlternativeService(origin1_);
2625 SetAlternativeService(origin2_);
2626
2627 scoped_refptr<X509Certificate> cert(
2628 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2629 bool unused;
2630 ASSERT_TRUE(cert->VerifyNameMatch(origin1_, &unused));
2631 ASSERT_TRUE(cert->VerifyNameMatch(origin2_, &unused));
2632 ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname, &unused));
2633
2634 ProofVerifyDetailsChromium verify_details;
2635 verify_details.cert_verify_result.verified_cert = cert;
2636 verify_details.cert_verify_result.is_issued_by_known_root = true;
2637 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2638
alyssar2adf3ac2016-05-03 17:12:582639 QuicTestPacketMaker client_maker1(version_, 0, clock_, origin1_,
2640 Perspective::IS_CLIENT);
2641 QuicTestPacketMaker server_maker1(version_, 0, clock_, origin1_,
2642 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452643
2644 QuicStreamOffset request_header_offset(0);
2645 QuicStreamOffset response_header_offset(0);
2646
2647 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582648 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2649 1, kClientDataStreamId1, true, &request_header_offset, &client_maker1));
2650 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2651 1, kClientDataStreamId1, &response_header_offset, &server_maker1));
2652 mock_quic_data.AddRead(
2653 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker1));
2654 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 2, 1, 1, &client_maker1));
bnc359ed2a2016-04-29 20:43:452655
alyssar2adf3ac2016-05-03 17:12:582656 QuicTestPacketMaker client_maker2(version_, 0, clock_, origin2_,
2657 Perspective::IS_CLIENT);
2658 QuicTestPacketMaker server_maker2(version_, 0, clock_, origin2_,
2659 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452660
alyssar2adf3ac2016-05-03 17:12:582661 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2662 3, kClientDataStreamId2, false, &request_header_offset, &client_maker2));
2663 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2664 3, kClientDataStreamId2, &response_header_offset, &server_maker2));
2665 mock_quic_data.AddRead(
2666 ConstructServerDataPacket(4, kClientDataStreamId2, &server_maker2));
2667 mock_quic_data.AddWrite(ConstructClientAckPacket(4, 4, 3, 1, &client_maker2));
bnc359ed2a2016-04-29 20:43:452668 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2669 mock_quic_data.AddRead(ASYNC, 0); // EOF
2670
2671 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2672
2673 AddHangingSocketData();
2674 AddHangingSocketData();
2675
2676 SendRequestAndExpectQuicResponse(origin1_);
2677 SendRequestAndExpectQuicResponse(origin2_);
2678
2679 EXPECT_TRUE(AllDataConsumed());
2680}
2681
2682// First request opens QUIC session to alternative service. Second request does
2683// not pool to it, even though destination matches, because certificate is not
2684// valid. Instead, a new QUIC session is opened to the same destination with a
2685// different QuicServerId.
2686TEST_P(QuicNetworkTransactionWithDestinationTest,
2687 DoNotPoolIfCertificateInvalid) {
2688 origin1_ = "news.example.org";
2689 origin2_ = "mail.example.com";
2690
2691 SetAlternativeService(origin1_);
2692 SetAlternativeService(origin2_);
2693
2694 scoped_refptr<X509Certificate> cert1(
2695 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2696 bool unused;
2697 ASSERT_TRUE(cert1->VerifyNameMatch(origin1_, &unused));
2698 ASSERT_FALSE(cert1->VerifyNameMatch(origin2_, &unused));
2699 ASSERT_FALSE(cert1->VerifyNameMatch(kDifferentHostname, &unused));
2700
2701 scoped_refptr<X509Certificate> cert2(
2702 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
2703 ASSERT_TRUE(cert2->VerifyNameMatch(origin2_, &unused));
2704 ASSERT_FALSE(cert2->VerifyNameMatch(kDifferentHostname, &unused));
2705
2706 ProofVerifyDetailsChromium verify_details1;
2707 verify_details1.cert_verify_result.verified_cert = cert1;
2708 verify_details1.cert_verify_result.is_issued_by_known_root = true;
2709 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
2710
2711 ProofVerifyDetailsChromium verify_details2;
2712 verify_details2.cert_verify_result.verified_cert = cert2;
2713 verify_details2.cert_verify_result.is_issued_by_known_root = true;
2714 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
2715
alyssar2adf3ac2016-05-03 17:12:582716 QuicTestPacketMaker client_maker1(version_, 0, clock_, origin1_,
2717 Perspective::IS_CLIENT);
2718 QuicTestPacketMaker server_maker1(version_, 0, clock_, origin1_,
2719 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452720
2721 MockQuicData mock_quic_data1;
alyssar2adf3ac2016-05-03 17:12:582722 mock_quic_data1.AddWrite(ConstructClientRequestHeadersPacket(
2723 1, kClientDataStreamId1, true, &client_maker1));
2724 mock_quic_data1.AddRead(ConstructServerResponseHeadersPacket(
2725 1, kClientDataStreamId1, &server_maker1));
2726 mock_quic_data1.AddRead(
2727 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker1));
bnc359ed2a2016-04-29 20:43:452728 mock_quic_data1.AddWrite(
alyssar2adf3ac2016-05-03 17:12:582729 ConstructClientAckPacket(2, 2, 1, 1, &client_maker1));
bnc359ed2a2016-04-29 20:43:452730 mock_quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2731 mock_quic_data1.AddRead(ASYNC, 0); // EOF
2732
2733 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
2734
2735 AddHangingSocketData();
2736
alyssar2adf3ac2016-05-03 17:12:582737 QuicTestPacketMaker client_maker2(version_, 0, clock_, origin2_,
2738 Perspective::IS_CLIENT);
2739 QuicTestPacketMaker server_maker2(version_, 0, clock_, origin2_,
2740 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452741
2742 MockQuicData mock_quic_data2;
alyssar2adf3ac2016-05-03 17:12:582743 mock_quic_data2.AddWrite(ConstructClientRequestHeadersPacket(
2744 1, kClientDataStreamId1, true, &client_maker2));
2745 mock_quic_data2.AddRead(ConstructServerResponseHeadersPacket(
2746 1, kClientDataStreamId1, &server_maker2));
2747 mock_quic_data2.AddRead(
2748 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker2));
bnc359ed2a2016-04-29 20:43:452749 mock_quic_data2.AddWrite(
alyssar2adf3ac2016-05-03 17:12:582750 ConstructClientAckPacket(2, 2, 1, 1, &client_maker2));
bnc359ed2a2016-04-29 20:43:452751 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2752 mock_quic_data2.AddRead(ASYNC, 0); // EOF
2753
2754 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
2755
2756 AddHangingSocketData();
2757
2758 SendRequestAndExpectQuicResponse(origin1_);
2759 SendRequestAndExpectQuicResponse(origin2_);
2760
2761 EXPECT_TRUE(AllDataConsumed());
2762}
2763
[email protected]61a527782013-02-21 03:58:002764} // namespace test
2765} // namespace net