blob: ed7c5f458e1f3035826a1c134bc7dd51251e2482 [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
rch3f4b8452016-02-23 16:59:32709 params_.enable_alternative_service_with_different_host = false;
[email protected]4dca587c2013-03-07 16:54:47710 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47711
tbansal0f56a39a2016-04-07 22:03:38712 EXPECT_FALSE(
713 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]aa9b14d2013-05-10 23:45:19714 SendRequestAndExpectQuicResponse("hello!");
tbansal0f56a39a2016-04-07 22:03:38715 EXPECT_TRUE(
716 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]4dca587c2013-03-07 16:54:47717
[email protected]98b20ce2013-05-10 05:55:26718 // Check that the NetLog was filled reasonably.
mmenke43758e62015-05-04 21:09:46719 TestNetLogEntry::List entries;
[email protected]aa9b14d2013-05-10 23:45:19720 net_log_.GetEntries(&entries);
[email protected]98b20ce2013-05-10 05:55:26721 EXPECT_LT(0u, entries.size());
722
723 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29724 int pos = ExpectLogContainsSomewhere(
725 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
726 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26727 EXPECT_LT(0, pos);
728
rchfd527212015-08-25 00:41:26729 // ... and also a TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29730 pos = ExpectLogContainsSomewhere(
rchfd527212015-08-25 00:41:26731 entries, 0,
732 NetLog::TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED,
ttuttle859dc7a2015-04-23 19:42:29733 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26734 EXPECT_LT(0, pos);
735
rtennetia004d332015-08-28 06:44:57736 std::string packet_number;
737 ASSERT_TRUE(entries[pos].GetStringValue("packet_number", &packet_number));
738 EXPECT_EQ("1", packet_number);
[email protected]98b20ce2013-05-10 05:55:26739
rchfd527212015-08-25 00:41:26740 // ... and also a TYPE_QUIC_SESSION_PACKET_AUTHENTICATED.
741 pos = ExpectLogContainsSomewhere(
742 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_AUTHENTICATED,
743 NetLog::PHASE_NONE);
744 EXPECT_LT(0, pos);
745
[email protected]98b20ce2013-05-10 05:55:26746 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29747 pos = ExpectLogContainsSomewhere(
748 entries, 0, NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
749 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26750 EXPECT_LT(0, pos);
751
752 int log_stream_id;
753 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
[email protected]1e960032013-12-20 19:00:20754 EXPECT_EQ(3, log_stream_id);
[email protected]4dca587c2013-03-07 16:54:47755}
756
[email protected]cf3e3cd62014-02-05 16:16:16757TEST_P(QuicNetworkTransactionTest, QuicProxy) {
tbansal9bf26672016-05-11 18:32:45758 params_.enable_quic = true;
rchf114d982015-10-21 01:34:56759 proxy_service_ =
rch9ae5b3b2016-02-11 00:36:29760 ProxyService::CreateFixedFromPacResult("QUIC mail.example.org:70");
[email protected]cf3e3cd62014-02-05 16:16:16761
[email protected]cf3e3cd62014-02-05 16:16:16762 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58763 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
764 1, kClientDataStreamId1, true, true,
765 GetRequestHeaders("GET", "http", "/")));
766 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:02767 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58768 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
769 false, true, 0, "hello!"));
770 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50771 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59772 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]cf3e3cd62014-02-05 16:16:16773
rcha5399e02015-04-21 19:32:04774 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cf3e3cd62014-02-05 16:16:16775
tbansal0f56a39a2016-04-07 22:03:38776 EXPECT_FALSE(
777 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16778 // There is no need to set up an alternate protocol job, because
779 // no attempt will be made to speak to the proxy over TCP.
780
rch9ae5b3b2016-02-11 00:36:29781 request_.url = GURL("http://mail.example.org/");
rch3f4b8452016-02-23 16:59:32782 params_.enable_alternative_service_with_different_host = false;
[email protected]cf3e3cd62014-02-05 16:16:16783 CreateSession();
784
bnc62a44f022015-04-02 15:59:41785 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
tbansal0f56a39a2016-04-07 22:03:38786 EXPECT_TRUE(
787 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16788}
789
bnc313ba9c2015-06-11 15:42:31790// Regression test for https://crbug.com/492458. Test that for an HTTP
791// connection through a QUIC proxy, the certificate exhibited by the proxy is
792// checked against the proxy hostname, not the origin hostname.
793TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) {
rch9ae5b3b2016-02-11 00:36:29794 const std::string origin_host = "mail.example.com";
bnc313ba9c2015-06-11 15:42:31795 const std::string proxy_host = "www.example.org";
796
tbansal9bf26672016-05-11 18:32:45797 params_.enable_quic = true;
rdsmith82957ad2015-09-16 19:42:03798 proxy_service_ =
799 ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70");
bnc313ba9c2015-06-11 15:42:31800
alyssar2adf3ac2016-05-03 17:12:58801 client_maker_.set_hostname(origin_host);
bnc313ba9c2015-06-11 15:42:31802 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58803 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
804 1, kClientDataStreamId1, true, true,
805 GetRequestHeaders("GET", "http", "/")));
806 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc313ba9c2015-06-11 15:42:31807 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58808 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
809 false, true, 0, "hello!"));
810 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50811 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59812 mock_quic_data.AddRead(ASYNC, 0);
bnc313ba9c2015-06-11 15:42:31813 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
814
815 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29816 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bnc313ba9c2015-06-11 15:42:31817 ASSERT_TRUE(cert.get());
818 // This certificate is valid for the proxy, but not for the origin.
819 bool common_name_fallback_used;
820 EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used));
821 EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used));
822 ProofVerifyDetailsChromium verify_details;
823 verify_details.cert_verify_result.verified_cert = cert;
824 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rchf114d982015-10-21 01:34:56825 ProofVerifyDetailsChromium verify_details2;
826 verify_details2.cert_verify_result.verified_cert = cert;
827 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
bnc313ba9c2015-06-11 15:42:31828
829 request_.url = GURL("http://" + origin_host);
rch3f4b8452016-02-23 16:59:32830 CreateSession();
bnc313ba9c2015-06-11 15:42:31831 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
832 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
833}
834
rchbe69cb902016-02-11 01:10:48835TEST_P(QuicNetworkTransactionTest, AlternativeServicesDifferentHost) {
836 params_.enable_alternative_service_with_different_host = true;
837 HostPortPair origin("www.example.org", 443);
838 HostPortPair alternative("mail.example.org", 443);
839
840 base::FilePath certs_dir = GetTestCertsDirectory();
841 scoped_refptr<X509Certificate> cert(
842 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
843 ASSERT_TRUE(cert.get());
844 // TODO(rch): the connection should be "to" the origin, so if the cert is
845 // valid for the origin but not the alternative, that should work too.
846 bool common_name_fallback_used;
847 EXPECT_TRUE(cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
848 EXPECT_TRUE(
849 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
850 ProofVerifyDetailsChromium verify_details;
851 verify_details.cert_verify_result.verified_cert = cert;
852 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
853
alyssar2adf3ac2016-05-03 17:12:58854 client_maker_.set_hostname(origin.host());
rchbe69cb902016-02-11 01:10:48855 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58856 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
857 1, kClientDataStreamId1, true, true,
858 GetRequestHeaders("GET", "https", "/")));
859 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rchbe69cb902016-02-11 01:10:48860 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58861 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
862 false, true, 0, "hello!"));
863 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchbe69cb902016-02-11 01:10:48864 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
865 mock_quic_data.AddRead(ASYNC, 0);
866 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
867
868 request_.url = GURL("https://" + origin.host());
869 AddQuicRemoteAlternativeServiceMapping(
870 MockCryptoClientStream::CONFIRM_HANDSHAKE, alternative);
rch3f4b8452016-02-23 16:59:32871 CreateSession();
rchbe69cb902016-02-11 01:10:48872
873 SendRequestAndExpectQuicResponse("hello!");
874}
875
[email protected]1e960032013-12-20 19:00:20876TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
rtenneti8a2f4632016-03-21 20:26:57877 params_.origins_to_force_quic_on.insert(
878 HostPortPair::FromString("mail.example.org:443"));
[email protected]cebe3282013-05-22 23:49:30879
tbansalfdf5665b2015-09-21 22:46:40880 MockQuicData mock_quic_data1;
881 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
[email protected]1e960032013-12-20 19:00:20882
tbansalfdf5665b2015-09-21 22:46:40883 MockQuicData mock_quic_data2;
zhongyi32569c62016-01-08 02:54:30884 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40885 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
rch6faa4d42016-01-05 20:48:43886 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40887
888 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
889 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
[email protected]cebe3282013-05-22 23:49:30890
rch3f4b8452016-02-23 16:59:32891 params_.enable_alternative_service_with_different_host = false;
[email protected]cebe3282013-05-22 23:49:30892 CreateSession();
893
tbansal0f56a39a2016-04-07 22:03:38894 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40895 for (size_t i = 0; i < 2; ++i) {
danakjad1777e2016-04-16 00:56:42896 std::unique_ptr<HttpNetworkTransaction> trans(
tbansalfdf5665b2015-09-21 22:46:40897 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
898 TestCompletionCallback callback;
899 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
900 EXPECT_EQ(ERR_IO_PENDING, rv);
901 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
tbansal0f56a39a2016-04-07 22:03:38902 EXPECT_EQ(1 + i, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40903 }
[email protected]cebe3282013-05-22 23:49:30904}
905
tbansalc8a94ea2015-11-02 23:58:51906TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
907 // Attempt to "force" quic on 443, which will not be honored.
rtenneti8a2f4632016-03-21 20:26:57908 params_.origins_to_force_quic_on.insert(
909 HostPortPair::FromString("www.google.com:443"));
tbansalc8a94ea2015-11-02 23:58:51910
911 MockRead http_reads[] = {
912 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
913 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
914 MockRead(ASYNC, OK)};
915
916 StaticSocketDataProvider data(http_reads, arraysize(http_reads), nullptr, 0);
917 socket_factory_.AddSocketDataProvider(&data);
918 SSLSocketDataProvider ssl(ASYNC, OK);
919 socket_factory_.AddSSLSocketDataProvider(&ssl);
920
rch3f4b8452016-02-23 16:59:32921 params_.enable_alternative_service_with_different_host = false;
tbansalc8a94ea2015-11-02 23:58:51922 CreateSession();
923
924 SendRequestAndExpectHttpResponse("hello world");
tbansal0f56a39a2016-04-07 22:03:38925 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalc8a94ea2015-11-02 23:58:51926}
927
bncc958faa2015-07-31 18:14:52928TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52929 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56930 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
931 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52932 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
933 MockRead(ASYNC, OK)};
934
935 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
936 0);
937 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56938 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52939
940 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58941 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
942 1, kClientDataStreamId1, true, true,
943 GetRequestHeaders("GET", "https", "/")));
944 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:52945 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58946 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
947 false, true, 0, "hello!"));
948 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:52949 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59950 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52951
952 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
953
rch3f4b8452016-02-23 16:59:32954 CreateSession();
bncc958faa2015-07-31 18:14:52955
956 SendRequestAndExpectHttpResponse("hello world");
957 SendRequestAndExpectQuicResponse("hello!");
958}
959
rchf47265dc2016-03-21 21:33:12960TEST_P(QuicNetworkTransactionTest,
961 UseAlternativeServiceWithProbabilityForQuic) {
962 MockRead http_reads[] = {
963 MockRead("HTTP/1.1 200 OK\r\n"),
964 MockRead(kQuicAlternativeServiceWithProbabilityHeader),
965 MockRead("hello world"),
966 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
967 MockRead(ASYNC, OK)};
968
969 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
970 0);
971 socket_factory_.AddSocketDataProvider(&http_data);
972 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
973
974 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58975 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
976 1, kClientDataStreamId1, true, true,
977 GetRequestHeaders("GET", "https", "/")));
978 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rchf47265dc2016-03-21 21:33:12979 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58980 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
981 false, true, 0, "hello!"));
982 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchf47265dc2016-03-21 21:33:12983 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
984 mock_quic_data.AddRead(ASYNC, 0); // EOF
985
986 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
987
rchf47265dc2016-03-21 21:33:12988 CreateSession();
989
990 SendRequestAndExpectHttpResponse("hello world");
991 SendRequestAndExpectQuicResponse("hello!");
992}
993
zhongyi3d4a55e72016-04-22 20:36:46994TEST_P(QuicNetworkTransactionTest, SetAlternativeServiceWithScheme) {
995 MockRead http_reads[] = {
996 MockRead("HTTP/1.1 200 OK\r\n"),
997 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
998 MockRead("hello world"),
999 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1000 MockRead(ASYNC, OK)};
1001
1002 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1003 0);
1004
1005 socket_factory_.AddSocketDataProvider(&http_data);
1006 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1007
1008 CreateSession();
1009 // Send http request, ignore alternative service advertising if response
1010 // header advertises alternative service for mail.example.org.
1011 request_.url = GURL("http://mail.example.org:443");
1012 SendRequestAndExpectHttpResponse("hello world");
1013 base::WeakPtr<HttpServerProperties> http_server_properties =
1014 session_->http_server_properties();
1015 url::SchemeHostPort http_server("http", "mail.example.org", 443);
1016 url::SchemeHostPort https_server("https", "mail.example.org", 443);
1017 // Check alternative service is set for the correct origin.
1018 EXPECT_EQ(2u,
1019 http_server_properties->GetAlternativeServices(http_server).size());
1020 EXPECT_EQ(
1021 0u, http_server_properties->GetAlternativeServices(https_server).size());
1022}
1023
1024TEST_P(QuicNetworkTransactionTest, DoNotGetAltSvcForDifferentOrigin) {
1025 MockRead http_reads[] = {
1026 MockRead("HTTP/1.1 200 OK\r\n"),
1027 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
1028 MockRead("hello world"),
1029 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1030 MockRead(ASYNC, OK)};
1031
1032 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1033 0);
1034
1035 socket_factory_.AddSocketDataProvider(&http_data);
1036 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1037 socket_factory_.AddSocketDataProvider(&http_data);
1038 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1039
1040 CreateSession();
1041
1042 // Send https request and set alternative services if response header
1043 // advertises alternative service for mail.example.org.
1044 SendRequestAndExpectHttpResponse("hello world");
1045 base::WeakPtr<HttpServerProperties> http_server_properties =
1046 session_->http_server_properties();
1047
1048 const url::SchemeHostPort https_server(request_.url);
1049 // Check alternative service is set.
1050 AlternativeServiceVector alternative_service_vector =
1051 http_server_properties->GetAlternativeServices(https_server);
1052 EXPECT_EQ(2u, alternative_service_vector.size());
1053
1054 // Send http request to the same origin but with diffrent scheme, should not
1055 // use QUIC.
1056 request_.url = GURL("http://mail.example.org:443");
1057 SendRequestAndExpectHttpResponse("hello world");
1058}
1059
bnc8be55ebb2015-10-30 14:12:071060TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) {
1061 std::string altsvc_header = base::StringPrintf(
1062 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam());
1063 MockRead http_reads[] = {
1064 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1065 MockRead("hello world"),
1066 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1067 MockRead(ASYNC, OK)};
1068
1069 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1070 0);
1071 socket_factory_.AddSocketDataProvider(&http_data);
1072 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1073
1074 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581075 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1076 1, kClientDataStreamId1, true, true,
1077 GetRequestHeaders("GET", "https", "/")));
1078 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc8be55ebb2015-10-30 14:12:071079 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581080 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1081 false, true, 0, "hello!"));
1082 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bnc8be55ebb2015-10-30 14:12:071083 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591084 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc8be55ebb2015-10-30 14:12:071085
1086 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1087
rch3f4b8452016-02-23 16:59:321088 CreateSession();
bnc8be55ebb2015-10-30 14:12:071089
1090 SendRequestAndExpectHttpResponse("hello world");
1091 SendRequestAndExpectQuicResponse("hello!");
1092}
1093
zhongyi6b5a3892016-03-12 04:46:201094TEST_P(QuicNetworkTransactionTest, GoAwayWithConnectionMigrationOnPortsOnly) {
1095 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581096 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1097 1, kClientDataStreamId1, true, true,
1098 GetRequestHeaders("GET", "https", "/")));
1099 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi6b5a3892016-03-12 04:46:201100 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1101 // Read a GoAway packet with
1102 // QuicErrorCode: QUIC_ERROR_MIGRATING_PORT from the peer.
alyssar2adf3ac2016-05-03 17:12:581103 mock_quic_data.AddRead(ConstructServerGoAwayPacket(
1104 2, QUIC_ERROR_MIGRATING_PORT,
1105 "connection migration with port change only"));
1106 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
1107 mock_quic_data.AddRead(ConstructServerDataPacket(3, kClientDataStreamId1,
1108 false, true, 0, "hello!"));
1109 mock_quic_data.AddWrite(ConstructClientAckAndRstPacket(
zhongyi6b5a3892016-03-12 04:46:201110 3, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 3, 3, 1));
1111 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1112 mock_quic_data.AddRead(ASYNC, 0); // EOF
1113
1114 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1115
1116 // The non-alternate protocol job needs to hang in order to guarantee that
1117 // the alternate-protocol job will "win".
1118 AddHangingNonAlternateProtocolSocketData();
1119
1120 // In order for a new QUIC session to be established via alternate-protocol
1121 // without racing an HTTP connection, we need the host resolution to happen
1122 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1123 // connection to the the server, in this test we require confirmation
1124 // before encrypting so the HTTP job will still start.
1125 host_resolver_.set_synchronous_mode(true);
1126 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1127 "");
1128 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1129 AddressList address;
1130 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1131 nullptr, net_log_.bound());
1132
1133 CreateSession();
1134 session_->quic_stream_factory()->set_require_confirmation(true);
1135 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1136
danakjad1777e2016-04-16 00:56:421137 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyi6b5a3892016-03-12 04:46:201138 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1139 TestCompletionCallback callback;
1140 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1141 EXPECT_EQ(ERR_IO_PENDING, rv);
1142
1143 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1144 QuicSession::HANDSHAKE_CONFIRMED);
1145 EXPECT_EQ(OK, callback.WaitForResult());
1146
1147 // Check whether this transaction is correctly marked as received a go-away
1148 // because of migrating port.
1149 NetErrorDetails details;
1150 EXPECT_FALSE(details.quic_port_migration_detected);
1151 trans->PopulateNetErrorDetails(&details);
1152 EXPECT_TRUE(details.quic_port_migration_detected);
1153}
1154
bnc8be55ebb2015-10-30 14:12:071155TEST_P(QuicNetworkTransactionTest,
1156 DoNotUseAlternativeServiceQuicUnsupportedVersion) {
1157 std::string altsvc_header = base::StringPrintf(
1158 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam() - 1);
1159 MockRead http_reads[] = {
1160 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1161 MockRead("hello world"),
1162 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1163 MockRead(ASYNC, OK)};
1164
1165 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1166 0);
1167 socket_factory_.AddSocketDataProvider(&http_data);
1168 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1169 socket_factory_.AddSocketDataProvider(&http_data);
1170 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1171
rch3f4b8452016-02-23 16:59:321172 CreateSession();
bnc8be55ebb2015-10-30 14:12:071173
1174 SendRequestAndExpectHttpResponse("hello world");
1175 SendRequestAndExpectHttpResponse("hello world");
1176}
1177
bncc958faa2015-07-31 18:14:521178// When multiple alternative services are advertised,
zhongyi32569c62016-01-08 02:54:301179// HttpStreamFactoryImpl::RequestStreamInternal() should select the alternative
1180// service which uses existing QUIC session if available. If no existing QUIC
1181// session can be used, use the first alternative service from the list.
1182TEST_P(QuicNetworkTransactionTest, UseExistingAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:521183 MockRead http_reads[] = {
1184 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291185 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
bncc958faa2015-07-31 18:14:521186 MockRead("hello world"),
1187 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1188 MockRead(ASYNC, OK)};
1189
1190 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1191 0);
1192 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561193 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521194
zhongyi32569c62016-01-08 02:54:301195 QuicStreamOffset request_header_offset = 0;
1196 QuicStreamOffset response_header_offset = 0;
1197 // First QUIC request data.
rch9ae5b3b2016-02-11 00:36:291198 // Open a session to foo.example.org:443 using the first entry of the
zhongyi32569c62016-01-08 02:54:301199 // alternative service list.
bncc958faa2015-07-31 18:14:521200 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581201 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301202 1, kClientDataStreamId1, true, true,
1203 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1204
1205 std::string alt_svc_list =
rch9ae5b3b2016-02-11 00:36:291206 "quic=\"mail.example.org:444\", quic=\"foo.example.org:443\", "
1207 "quic=\"bar.example.org:445\"";
alyssar2adf3ac2016-05-03 17:12:581208 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301209 1, kClientDataStreamId1, false, false,
1210 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581211 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1212 false, true, 0, "hello!"));
1213 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301214
1215 // Second QUIC request data.
1216 // Connection pooling, using existing session, no need to include version
1217 // as version negotiation has been completed.
alyssar2adf3ac2016-05-03 17:12:581218 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301219 3, kClientDataStreamId2, false, true,
1220 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581221 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301222 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1223 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581224 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1225 false, true, 0, "hello!"));
1226 mock_quic_data.AddWrite(
1227 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
bncc958faa2015-07-31 18:14:521228 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591229 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521230
1231 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1232
rch3f4b8452016-02-23 16:59:321233 CreateSession();
bncc958faa2015-07-31 18:14:521234
1235 SendRequestAndExpectHttpResponse("hello world");
zhongyi32569c62016-01-08 02:54:301236
bnc359ed2a2016-04-29 20:43:451237 SendRequestAndExpectQuicResponse("hello!");
1238 SendRequestAndExpectQuicResponse("hello!");
zhongyi32569c62016-01-08 02:54:301239}
1240
bnc359ed2a2016-04-29 20:43:451241// Pool to existing session with matching QuicServerId
1242// even if alternative service destination is different.
1243TEST_P(QuicNetworkTransactionTest, PoolByOrigin) {
zhongyi32569c62016-01-08 02:54:301244 MockQuicData mock_quic_data;
bnc359ed2a2016-04-29 20:43:451245 QuicStreamOffset request_header_offset(0);
1246 QuicStreamOffset response_header_offset(0);
1247
1248 // First request.
alyssar2adf3ac2016-05-03 17:12:581249 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301250 1, kClientDataStreamId1, true, true,
1251 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581252 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451253 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1254 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581255 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1256 false, true, 0, "hello!"));
1257 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301258
bnc359ed2a2016-04-29 20:43:451259 // Second request.
alyssar2adf3ac2016-05-03 17:12:581260 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301261 3, kClientDataStreamId2, false, true,
1262 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581263 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301264 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1265 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581266 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1267 false, true, 0, "hello!"));
1268 mock_quic_data.AddWrite(
1269 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
zhongyi32569c62016-01-08 02:54:301270 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1271 mock_quic_data.AddRead(ASYNC, 0); // EOF
1272
1273 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bnc359ed2a2016-04-29 20:43:451274
1275 AddHangingNonAlternateProtocolSocketData();
1276 AddHangingNonAlternateProtocolSocketData();
zhongyi32569c62016-01-08 02:54:301277
rch3f4b8452016-02-23 16:59:321278 CreateSession();
zhongyi32569c62016-01-08 02:54:301279
bnc359ed2a2016-04-29 20:43:451280 const char destination1[] = "first.example.com";
1281 const char destination2[] = "second.example.com";
1282
1283 // Set up alternative service entry to destination1.
1284 url::SchemeHostPort server(request_.url);
1285 AlternativeService alternative_service(QUIC, destination1, 443);
1286 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1287 http_server_properties_.SetAlternativeService(server, alternative_service,
1288 expiration);
1289 // First request opens connection to |destination1|
1290 // with QuicServerId.host() == kDefaultServerHostName.
1291 SendRequestAndExpectQuicResponse("hello!");
1292
1293 // Set up alternative service entry to a different destination.
1294 alternative_service = AlternativeService(QUIC, destination2, 443);
1295 http_server_properties_.SetAlternativeService(server, alternative_service,
1296 expiration);
1297 // Second request pools to existing connection with same QuicServerId,
1298 // even though alternative service destination is different.
1299 SendRequestAndExpectQuicResponse("hello!");
1300}
1301
1302// Pool to existing session with matching destination and matching certificate
1303// even if origin is different, and even if the alternative service with
1304// matching destination is not the first one on the list.
1305TEST_P(QuicNetworkTransactionTest, PoolByDestination) {
1306 GURL origin1 = request_.url;
1307 GURL origin2("https://www.example.org/");
1308 ASSERT_NE(origin1.host(), origin2.host());
1309
1310 MockQuicData mock_quic_data;
1311 QuicStreamOffset request_header_offset(0);
1312 QuicStreamOffset response_header_offset(0);
1313
1314 // First request.
alyssar2adf3ac2016-05-03 17:12:581315 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:451316 1, kClientDataStreamId1, true, true,
1317 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581318 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451319 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1320 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581321 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1322 false, true, 0, "hello!"));
1323 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bnc359ed2a2016-04-29 20:43:451324
1325 // Second request.
alyssar2adf3ac2016-05-03 17:12:581326 QuicTestPacketMaker client_maker2(GetParam(), 0, clock_, origin2.host(),
1327 Perspective::IS_CLIENT);
1328 QuicTestPacketMaker server_maker2(GetParam(), 0, clock_, origin2.host(),
1329 Perspective::IS_SERVER);
1330 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:451331 3, kClientDataStreamId2, false, true,
alyssar2adf3ac2016-05-03 17:12:581332 GetRequestHeaders("GET", "https", "/", &client_maker2),
1333 &request_header_offset, &client_maker2));
1334 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451335 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
alyssar2adf3ac2016-05-03 17:12:581336 &response_header_offset, &server_maker2));
1337 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1338 false, true, 0, "hello!"));
1339 mock_quic_data.AddWrite(
1340 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
bnc359ed2a2016-04-29 20:43:451341 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1342 mock_quic_data.AddRead(ASYNC, 0); // EOF
1343
1344 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1345
1346 AddHangingNonAlternateProtocolSocketData();
1347 AddHangingNonAlternateProtocolSocketData();
1348
1349 CreateSession();
1350
1351 const char destination1[] = "first.example.com";
1352 const char destination2[] = "second.example.com";
1353
1354 // Set up alternative service for |origin1|.
1355 AlternativeService alternative_service1(QUIC, destination1, 443);
1356 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1357 http_server_properties_.SetAlternativeService(
1358 url::SchemeHostPort(origin1), alternative_service1, expiration);
1359
1360 // Set up multiple alternative service entries for |origin2|,
1361 // the first one with a different destination as for |origin1|,
1362 // the second one with the same. The second one should be used,
1363 // because the request can be pooled to that one.
1364 AlternativeService alternative_service2(QUIC, destination2, 443);
1365 AlternativeServiceInfoVector alternative_services;
1366 alternative_services.push_back(
1367 AlternativeServiceInfo(alternative_service2, expiration));
1368 alternative_services.push_back(
1369 AlternativeServiceInfo(alternative_service1, expiration));
1370 http_server_properties_.SetAlternativeServices(url::SchemeHostPort(origin2),
1371 alternative_services);
bnc359ed2a2016-04-29 20:43:451372 // First request opens connection to |destination1|
1373 // with QuicServerId.host() == origin1.host().
1374 SendRequestAndExpectQuicResponse("hello!");
1375
1376 // Second request pools to existing connection with same destination,
1377 // because certificate matches, even though QuicServerId is different.
1378 request_.url = origin2;
alyssar2adf3ac2016-05-03 17:12:581379
bnc359ed2a2016-04-29 20:43:451380 SendRequestAndExpectQuicResponse("hello!");
zhongyi32569c62016-01-08 02:54:301381}
1382
1383// Multiple origins have listed the same alternative services. When there's a
1384// existing QUIC session opened by a request to other origin,
1385// if the cert is valid, should select this QUIC session to make the request
1386// if this is also the first existing QUIC session.
1387TEST_P(QuicNetworkTransactionTest,
1388 UseSharedExistingAlternativeServiceForQuicWithValidCert) {
rch9ae5b3b2016-02-11 00:36:291389 // Default cert is valid for *.example.org
zhongyi32569c62016-01-08 02:54:301390
rch9ae5b3b2016-02-11 00:36:291391 // HTTP data for request to www.example.org.
zhongyi32569c62016-01-08 02:54:301392 MockRead http_reads[] = {
1393 MockRead("HTTP/1.1 200 OK\r\n"),
1394 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
rch9ae5b3b2016-02-11 00:36:291395 MockRead("hello world from www.example.org"),
zhongyi32569c62016-01-08 02:54:301396 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1397 MockRead(ASYNC, OK)};
1398
1399 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1400 0);
1401 socket_factory_.AddSocketDataProvider(&http_data);
1402 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1403
1404 // HTTP data for request to mail.example.org.
1405 MockRead http_reads2[] = {
1406 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291407 MockRead("Alt-Svc: quic=\":444\", quic=\"www.example.org:443\"\r\n\r\n"),
zhongyi32569c62016-01-08 02:54:301408 MockRead("hello world from mail.example.org"),
1409 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1410 MockRead(ASYNC, OK)};
1411
1412 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1413 nullptr, 0);
1414 socket_factory_.AddSocketDataProvider(&http_data2);
1415 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1416
1417 QuicStreamOffset request_header_offset = 0;
1418 QuicStreamOffset response_header_offset = 0;
1419
alyssar2adf3ac2016-05-03 17:12:581420 QuicTestPacketMaker client_maker(GetParam(), 0, clock_, "mail.example.org",
1421 Perspective::IS_CLIENT);
1422 server_maker_.set_hostname("www.example.org");
1423 client_maker_.set_hostname("www.example.org");
zhongyi32569c62016-01-08 02:54:301424 MockQuicData mock_quic_data;
1425
1426 // First QUIC request data.
alyssar2adf3ac2016-05-03 17:12:581427 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301428 1, kClientDataStreamId1, true, true,
1429 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1430
alyssar2adf3ac2016-05-03 17:12:581431 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301432 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1433 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581434 mock_quic_data.AddRead(ConstructServerDataPacket(
1435 2, kClientDataStreamId1, false, true, 0, "hello from mail QUIC!"));
1436 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301437 // Second QUIC request data.
alyssar2adf3ac2016-05-03 17:12:581438 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301439 3, kClientDataStreamId2, false, true,
alyssar2adf3ac2016-05-03 17:12:581440 GetRequestHeaders("GET", "https", "/", &client_maker),
1441 &request_header_offset, &client_maker));
1442 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301443 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1444 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581445 mock_quic_data.AddRead(ConstructServerDataPacket(
1446 4, kClientDataStreamId2, false, true, 0, "hello from mail QUIC!"));
1447 mock_quic_data.AddWrite(
1448 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
zhongyi32569c62016-01-08 02:54:301449 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1450 mock_quic_data.AddRead(ASYNC, 0); // EOF
1451
1452 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
zhongyi32569c62016-01-08 02:54:301453
rch3f4b8452016-02-23 16:59:321454 CreateSession();
zhongyi32569c62016-01-08 02:54:301455
1456 // Send two HTTP requests, responses set up alt-svc lists for the origins.
rch9ae5b3b2016-02-11 00:36:291457 request_.url = GURL("https://www.example.org/");
1458 SendRequestAndExpectHttpResponse("hello world from www.example.org");
zhongyi32569c62016-01-08 02:54:301459 request_.url = GURL("https://mail.example.org/");
1460 SendRequestAndExpectHttpResponse("hello world from mail.example.org");
1461
rch9ae5b3b2016-02-11 00:36:291462 // Open a QUIC session to mail.example.org:443 when making request
1463 // to mail.example.org.
1464 request_.url = GURL("https://www.example.org/");
bnc359ed2a2016-04-29 20:43:451465 SendRequestAndExpectQuicResponse("hello from mail QUIC!");
zhongyi32569c62016-01-08 02:54:301466
rch9ae5b3b2016-02-11 00:36:291467 // Uses the existing QUIC session when making request to www.example.org.
zhongyi32569c62016-01-08 02:54:301468 request_.url = GURL("https://mail.example.org/");
bnc359ed2a2016-04-29 20:43:451469 SendRequestAndExpectQuicResponse("hello from mail QUIC!");
bncc958faa2015-07-31 18:14:521470}
1471
1472TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) {
bncc958faa2015-07-31 18:14:521473 MockRead http_reads[] = {
1474 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561475 MockRead(kQuicAlternativeServiceDifferentPortHeader),
bncc958faa2015-07-31 18:14:521476 MockRead("hello world"),
1477 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1478 MockRead(ASYNC, OK)};
1479
1480 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1481 0);
1482 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561483 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521484
rch3f4b8452016-02-23 16:59:321485 CreateSession();
bncc958faa2015-07-31 18:14:521486
1487 SendRequestAndExpectHttpResponse("hello world");
bnc359ed2a2016-04-29 20:43:451488
1489 url::SchemeHostPort http_server("https", kDefaultServerHostName, 443);
1490 AlternativeServiceVector alternative_service_vector =
1491 http_server_properties_.GetAlternativeServices(http_server);
1492 ASSERT_EQ(1u, alternative_service_vector.size());
1493 const AlternativeService alternative_service = alternative_service_vector[0];
1494 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
1495 EXPECT_EQ(kDefaultServerHostName, alternative_service_vector[0].host);
1496 EXPECT_EQ(137, alternative_service_vector[0].port);
bncc958faa2015-07-31 18:14:521497}
1498
1499TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) {
bncc958faa2015-07-31 18:14:521500 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561501 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1502 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521503 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1504 MockRead(ASYNC, OK)};
1505
1506 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1507 0);
1508 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561509 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521510
1511 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581512 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1513 1, kClientDataStreamId1, true, true,
1514 GetRequestHeaders("GET", "https", "/")));
1515 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:521516 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581517 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1518 false, true, 0, "hello!"));
1519 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:521520 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1521 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521522
1523 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1524
rch3f4b8452016-02-23 16:59:321525 CreateSession();
bncc958faa2015-07-31 18:14:521526
1527 AlternativeService alternative_service(QUIC,
1528 HostPortPair::FromURL(request_.url));
1529 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
1530 alternative_service);
1531 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1532 alternative_service));
1533
1534 SendRequestAndExpectHttpResponse("hello world");
1535 SendRequestAndExpectQuicResponse("hello!");
1536
mmenkee24011922015-12-17 22:12:591537 mock_quic_data.Resume();
bncc958faa2015-07-31 18:14:521538
1539 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1540 alternative_service));
1541}
1542
bncc958faa2015-07-31 18:14:521543TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) {
bncc958faa2015-07-31 18:14:521544 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561545 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1546 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521547 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1548 MockRead(ASYNC, OK)};
1549
1550 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1551 0);
1552 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561553 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521554
1555 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581556 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1557 1, kClientDataStreamId1, true, true,
1558 GetRequestHeaders("GET", "https", "/")));
1559 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:521560 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581561 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1562 false, true, 0, "hello!"));
1563 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:521564 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
1565
1566 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1567
1568 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321569 CreateSession();
bncc958faa2015-07-31 18:14:521570
1571 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1572 SendRequestAndExpectHttpResponse("hello world");
1573}
1574
[email protected]1e960032013-12-20 19:00:201575TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
[email protected]aa9b14d2013-05-10 23:45:191576 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561577 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1578 MockRead("hello world"),
1579 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1580 MockRead(ASYNC, OK)};
[email protected]61a527782013-02-21 03:58:001581
rjshaded5ced072015-12-18 19:26:021582 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1583 0);
[email protected]aa9b14d2013-05-10 23:45:191584 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561585 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]61a527782013-02-21 03:58:001586
[email protected]1e960032013-12-20 19:00:201587 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581588 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1589 1, kClientDataStreamId1, true, true,
1590 GetRequestHeaders("GET", "https", "/")));
1591 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021592 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581593 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1594 false, true, 0, "hello!"));
1595 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501596 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591597 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]61a527782013-02-21 03:58:001598
rcha5399e02015-04-21 19:32:041599 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]61a527782013-02-21 03:58:001600
rch3f4b8452016-02-23 16:59:321601 params_.parse_alternative_services = false;
1602 params_.parse_alternative_services = false;
1603 CreateSession();
[email protected]61a527782013-02-21 03:58:001604
[email protected]aa9b14d2013-05-10 23:45:191605 SendRequestAndExpectHttpResponse("hello world");
1606 SendRequestAndExpectQuicResponse("hello!");
[email protected]61a527782013-02-21 03:58:001607}
1608
rchf47265dc2016-03-21 21:33:121609TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolWithProbabilityForQuic) {
1610 MockRead http_reads[] = {
1611 MockRead("HTTP/1.1 200 OK\r\n"),
1612 MockRead(kQuicAlternateProtocolWithProbabilityHeader),
1613 MockRead("hello world"),
1614 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1615 MockRead(ASYNC, OK)};
1616
1617 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1618 0);
1619 socket_factory_.AddSocketDataProvider(&http_data);
1620 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1621
1622 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581623 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1624 1, kClientDataStreamId1, true, true,
1625 GetRequestHeaders("GET", "https", "/")));
1626 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rchf47265dc2016-03-21 21:33:121627 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581628 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1629 false, true, 0, "hello!"));
1630 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchf47265dc2016-03-21 21:33:121631 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1632 mock_quic_data.AddRead(ASYNC, 0); // EOF
1633
1634 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1635
rchf47265dc2016-03-21 21:33:121636 params_.parse_alternative_services = false;
1637 params_.parse_alternative_services = false;
1638 CreateSession();
1639
1640 SendRequestAndExpectHttpResponse("hello world");
1641 SendRequestAndExpectQuicResponse("hello!");
1642}
1643
bnc62a44f022015-04-02 15:59:411644TEST_P(QuicNetworkTransactionTest, AlternateProtocolDifferentPort) {
1645 MockRead http_reads[] = {
1646 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561647 MockRead(kQuicAlternateProtocolDifferentPortHeader),
bnc62a44f022015-04-02 15:59:411648 MockRead("hello world"),
1649 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1650 MockRead(ASYNC, OK)};
1651
1652 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1653 0);
1654 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561655 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bnc62a44f022015-04-02 15:59:411656
rch3f4b8452016-02-23 16:59:321657 params_.parse_alternative_services = false;
1658 CreateSession();
bnc62a44f022015-04-02 15:59:411659
1660 SendRequestAndExpectHttpResponse("hello world");
bnc359ed2a2016-04-29 20:43:451661
1662 url::SchemeHostPort http_server("https", kDefaultServerHostName, 443);
1663 AlternativeServiceVector alternative_service_vector =
1664 http_server_properties_.GetAlternativeServices(http_server);
1665 ASSERT_EQ(1u, alternative_service_vector.size());
1666 const AlternativeService alternative_service = alternative_service_vector[0];
1667 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
1668 EXPECT_EQ(kDefaultServerHostName, alternative_service_vector[0].host);
1669 EXPECT_EQ(137, alternative_service_vector[0].port);
bnc62a44f022015-04-02 15:59:411670}
1671
bncc958faa2015-07-31 18:14:521672TEST_P(QuicNetworkTransactionTest, ConfirmAlternateProtocol) {
bncae8db8402015-03-26 20:13:501673 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561674 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
bncae8db8402015-03-26 20:13:501675 MockRead("hello world"),
1676 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1677 MockRead(ASYNC, OK)};
1678
1679 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1680 0);
1681 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561682 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncae8db8402015-03-26 20:13:501683
1684 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581685 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1686 1, kClientDataStreamId1, true, true,
1687 GetRequestHeaders("GET", "https", "/")));
1688 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncae8db8402015-03-26 20:13:501689 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581690 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1691 false, true, 0, "hello!"));
1692 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501693 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1694 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncae8db8402015-03-26 20:13:501695
rcha5399e02015-04-21 19:32:041696 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bncae8db8402015-03-26 20:13:501697
rch3f4b8452016-02-23 16:59:321698 params_.parse_alternative_services = false;
1699 CreateSession();
bncae8db8402015-03-26 20:13:501700
1701 AlternativeService alternative_service(QUIC,
1702 HostPortPair::FromURL(request_.url));
bnc6be245c12015-05-15 11:24:071703 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
bncae8db8402015-03-26 20:13:501704 alternative_service);
bnc6be245c12015-05-15 11:24:071705 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1706 alternative_service));
bncae8db8402015-03-26 20:13:501707
1708 SendRequestAndExpectHttpResponse("hello world");
1709 SendRequestAndExpectQuicResponse("hello!");
1710
mmenkee24011922015-12-17 22:12:591711 mock_quic_data.Resume();
rchb27683c2015-07-29 23:53:501712
bnc6be245c12015-05-15 11:24:071713 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1714 alternative_service));
bncae8db8402015-03-26 20:13:501715}
1716
[email protected]1e960032013-12-20 19:00:201717TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) {
[email protected]6d1b4ed2013-07-10 03:57:541718 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561719 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1720 MockRead("hello world"),
1721 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1722 MockRead(ASYNC, OK)};
[email protected]6d1b4ed2013-07-10 03:57:541723
rjshaded5ced072015-12-18 19:26:021724 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1725 0);
[email protected]6d1b4ed2013-07-10 03:57:541726 socket_factory_.AddSocketDataProvider(&http_data);
1727
[email protected]1e960032013-12-20 19:00:201728 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581729 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1730 1, kClientDataStreamId1, true, true,
1731 GetRequestHeaders("GET", "https", "/")));
1732 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021733 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581734 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1735 false, true, 0, "hello!"));
1736 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501737 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591738 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]6d1b4ed2013-07-10 03:57:541739
rcha5399e02015-04-21 19:32:041740 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]6d1b4ed2013-07-10 03:57:541741
[email protected]6d1b4ed2013-07-10 03:57:541742 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321743 CreateSession();
[email protected]6d1b4ed2013-07-10 03:57:541744
1745 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1746 SendRequestAndExpectHttpResponse("hello world");
1747}
1748
[email protected]1e960032013-12-20 19:00:201749TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) {
rch3f4b8452016-02-23 16:59:321750 params_.parse_alternative_services = false;
[email protected]dda75ab2013-06-22 22:43:301751 crypto_client_stream_factory_.set_handshake_mode(
1752 MockCryptoClientStream::COLD_START);
1753
1754 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561755 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
rch9ae5b3b2016-02-11 00:36:291756 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561757 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")};
[email protected]dda75ab2013-06-22 22:43:301758
1759 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561760 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1761 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1762 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]dda75ab2013-06-22 22:43:301763
mmenke651bae7f2015-12-18 21:26:451764 SequencedSocketData http_data(http_reads, arraysize(http_reads), http_writes,
1765 arraysize(http_writes));
bnc912a04b2016-04-20 14:19:501766 socket_factory_.AddSocketDataProvider(&http_data);
1767 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301768
1769 // The QUIC transaction will not be allowed to complete.
mmenke651bae7f2015-12-18 21:26:451770 MockWrite quic_writes[] = {MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 1)};
[email protected]dda75ab2013-06-22 22:43:301771 MockRead quic_reads[] = {
mmenke651bae7f2015-12-18 21:26:451772 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0),
[email protected]dda75ab2013-06-22 22:43:301773 };
mmenke651bae7f2015-12-18 21:26:451774 SequencedSocketData quic_data(quic_reads, arraysize(quic_reads), quic_writes,
1775 arraysize(quic_writes));
bnc912a04b2016-04-20 14:19:501776 socket_factory_.AddSocketDataProvider(&quic_data);
[email protected]dda75ab2013-06-22 22:43:301777
1778 // The HTTP transaction will complete.
mmenke651bae7f2015-12-18 21:26:451779 SequencedSocketData http_data2(http_reads, arraysize(http_reads), http_writes,
1780 arraysize(http_writes));
bnc912a04b2016-04-20 14:19:501781 socket_factory_.AddSocketDataProvider(&http_data2);
1782 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301783
bnc912a04b2016-04-20 14:19:501784 CreateSession();
[email protected]dda75ab2013-06-22 22:43:301785
1786 // Run the first request.
[email protected]dda75ab2013-06-22 22:43:301787 SendRequestAndExpectHttpResponse("hello world");
rch37de576c2015-05-17 20:28:171788 ASSERT_TRUE(http_data.AllReadDataConsumed());
1789 ASSERT_TRUE(http_data.AllWriteDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301790
1791 // Now run the second request in which the QUIC socket hangs,
1792 // and verify the the transaction continues over HTTP.
[email protected]dda75ab2013-06-22 22:43:301793 SendRequestAndExpectHttpResponse("hello world");
mmenke651bae7f2015-12-18 21:26:451794 base::RunLoop().RunUntilIdle();
[email protected]dda75ab2013-06-22 22:43:301795
rch37de576c2015-05-17 20:28:171796 ASSERT_TRUE(http_data2.AllReadDataConsumed());
1797 ASSERT_TRUE(http_data2.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:451798 ASSERT_TRUE(quic_data.AllReadDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301799}
1800
[email protected]1e960032013-12-20 19:00:201801TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
[email protected]1e960032013-12-20 19:00:201802 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581803 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1804 1, kClientDataStreamId1, true, true,
1805 GetRequestHeaders("GET", "https", "/")));
1806 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021807 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581808 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1809 false, true, 0, "hello!"));
1810 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501811 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591812 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]8ba81212013-05-03 13:11:481813
rcha5399e02015-04-21 19:32:041814 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]8ba81212013-05-03 13:11:481815
rch3f4b8452016-02-23 16:59:321816 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:191817 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1818 SendRequestAndExpectQuicResponse("hello!");
[email protected]8ba81212013-05-03 13:11:481819}
1820
[email protected]1e960032013-12-20 19:00:201821TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
[email protected]1e960032013-12-20 19:00:201822 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581823 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1824 1, kClientDataStreamId1, true, true,
1825 GetRequestHeaders("GET", "https", "/")));
1826 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021827 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581828 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1829 false, true, 0, "hello!"));
1830 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501831 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591832 mock_quic_data.AddRead(ASYNC, 0); // EOF
rcha5399e02015-04-21 19:32:041833 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]3a120a6b2013-06-25 01:08:271834
1835 // In order for a new QUIC session to be established via alternate-protocol
1836 // without racing an HTTP connection, we need the host resolution to happen
1837 // synchronously.
1838 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291839 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561840 "");
rch9ae5b3b2016-02-11 00:36:291841 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]3a120a6b2013-06-25 01:08:271842 AddressList address;
rjshaded5ced072015-12-18 19:26:021843 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1844 nullptr, net_log_.bound());
[email protected]3a120a6b2013-06-25 01:08:271845
rch3f4b8452016-02-23 16:59:321846 CreateSession();
[email protected]3a120a6b2013-06-25 01:08:271847 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1848 SendRequestAndExpectQuicResponse("hello!");
1849}
1850
[email protected]0fc924b2014-03-31 04:34:151851TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) {
rdsmith82957ad2015-09-16 19:42:031852 proxy_service_ = ProxyService::CreateFixedFromPacResult("PROXY myproxy:70");
[email protected]0fc924b2014-03-31 04:34:151853
1854 // Since we are using a proxy, the QUIC job will not succeed.
1855 MockWrite http_writes[] = {
rch9ae5b3b2016-02-11 00:36:291856 MockWrite(SYNCHRONOUS, 0, "GET http://mail.example.org/ HTTP/1.1\r\n"),
1857 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561858 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")};
[email protected]0fc924b2014-03-31 04:34:151859
1860 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561861 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1862 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1863 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]0fc924b2014-03-31 04:34:151864
1865 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
1866 http_writes, arraysize(http_writes));
1867 socket_factory_.AddSocketDataProvider(&http_data);
1868
1869 // In order for a new QUIC session to be established via alternate-protocol
1870 // without racing an HTTP connection, we need the host resolution to happen
1871 // synchronously.
1872 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291873 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561874 "");
rch9ae5b3b2016-02-11 00:36:291875 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]0fc924b2014-03-31 04:34:151876 AddressList address;
rjshaded5ced072015-12-18 19:26:021877 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1878 nullptr, net_log_.bound());
[email protected]0fc924b2014-03-31 04:34:151879
rch9ae5b3b2016-02-11 00:36:291880 request_.url = GURL("http://mail.example.org/");
rch3f4b8452016-02-23 16:59:321881 CreateSession();
[email protected]0fc924b2014-03-31 04:34:151882 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1883 SendRequestAndExpectHttpResponse("hello world");
1884}
1885
[email protected]1e960032013-12-20 19:00:201886TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
[email protected]1e960032013-12-20 19:00:201887 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581888 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1889 1, kClientDataStreamId1, true, true,
1890 GetRequestHeaders("GET", "https", "/")));
1891 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021892 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581893 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1894 false, true, 0, "hello!"));
1895 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591896 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
rcha5399e02015-04-21 19:32:041897 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]11c05872013-08-20 02:04:121898
[email protected]11c05872013-08-20 02:04:121899 // In order for a new QUIC session to be established via alternate-protocol
1900 // without racing an HTTP connection, we need the host resolution to happen
1901 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1902 // connection to the the server, in this test we require confirmation
1903 // before encrypting so the HTTP job will still start.
1904 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291905 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561906 "");
rch9ae5b3b2016-02-11 00:36:291907 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]11c05872013-08-20 02:04:121908 AddressList address;
rjshaded5ced072015-12-18 19:26:021909 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1910 nullptr, net_log_.bound());
[email protected]11c05872013-08-20 02:04:121911
rtenneti634050c2016-04-28 20:41:541912 // The non-alternate protocol job needs to hang in order to guarantee that
1913 // the alternate-protocol job will "win".
1914 AddHangingNonAlternateProtocolSocketData();
1915
rch3f4b8452016-02-23 16:59:321916 CreateSession();
[email protected]11c05872013-08-20 02:04:121917 session_->quic_stream_factory()->set_require_confirmation(true);
1918 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1919
danakjad1777e2016-04-16 00:56:421920 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]11c05872013-08-20 02:04:121921 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1922 TestCompletionCallback callback;
1923 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1924 EXPECT_EQ(ERR_IO_PENDING, rv);
1925
1926 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1927 QuicSession::HANDSHAKE_CONFIRMED);
1928 EXPECT_EQ(OK, callback.WaitForResult());
rchb27683c2015-07-29 23:53:501929
1930 CheckWasQuicResponse(trans);
1931 CheckResponseData(trans, "hello!");
[email protected]11c05872013-08-20 02:04:121932}
1933
zhongyica364fbb2015-12-12 03:39:121934TEST_P(QuicNetworkTransactionTest,
1935 LogGranularQuicErrorCodeOnQuicProtocolErrorLocal) {
1936 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581937 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1938 1, kClientDataStreamId1, true, true,
1939 GetRequestHeaders("GET", "https", "/")));
zhongyica364fbb2015-12-12 03:39:121940 // Read a close connection packet with
1941 // QuicErrorCode: QUIC_CRYPTO_VERSION_NOT_SUPPORTED from the peer.
alyssar2adf3ac2016-05-03 17:12:581942 mock_quic_data.AddRead(ConstructServerConnectionClosePacket(1));
zhongyica364fbb2015-12-12 03:39:121943 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1944
1945 // The non-alternate protocol job needs to hang in order to guarantee that
1946 // the alternate-protocol job will "win".
1947 AddHangingNonAlternateProtocolSocketData();
1948
1949 // In order for a new QUIC session to be established via alternate-protocol
1950 // without racing an HTTP connection, we need the host resolution to happen
1951 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1952 // connection to the the server, in this test we require confirmation
1953 // before encrypting so the HTTP job will still start.
1954 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291955 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:121956 "");
rch9ae5b3b2016-02-11 00:36:291957 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:121958 AddressList address;
1959 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1960 nullptr, net_log_.bound());
1961
rch3f4b8452016-02-23 16:59:321962 CreateSession();
zhongyica364fbb2015-12-12 03:39:121963 session_->quic_stream_factory()->set_require_confirmation(true);
1964 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1965
danakjad1777e2016-04-16 00:56:421966 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyica364fbb2015-12-12 03:39:121967 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1968 TestCompletionCallback callback;
1969 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1970 EXPECT_EQ(ERR_IO_PENDING, rv);
1971
1972 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1973 QuicSession::HANDSHAKE_CONFIRMED);
1974 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
1975
1976 NetErrorDetails details;
1977 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1978
1979 trans->PopulateNetErrorDetails(&details);
1980 // Verify the error code logged is what sent by the peer.
1981 EXPECT_EQ(QUIC_CRYPTO_VERSION_NOT_SUPPORTED, details.quic_connection_error);
1982}
1983
1984TEST_P(QuicNetworkTransactionTest,
1985 LogGranularQuicErrorCodeOnQuicProtocolErrorRemote) {
1986 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581987 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1988 1, kClientDataStreamId1, true, true,
1989 GetRequestHeaders("GET", "https", "/")));
zhongyif28b4a32016-04-25 21:35:211990 // Peer sending data from an non-existing stream causes this end to raise
1991 // error and close connection.
1992 mock_quic_data.AddRead(
alyssar2adf3ac2016-05-03 17:12:581993 ConstructServerRstPacket(1, false, 99, QUIC_STREAM_LAST_ERROR));
zhongyif28b4a32016-04-25 21:35:211994 std::string quic_error_details = "Data for nonexistent stream";
alyssar2adf3ac2016-05-03 17:12:581995 mock_quic_data.AddWrite(ConstructClientAckAndConnectionClosePacket(
zhongyif28b4a32016-04-25 21:35:211996 2, QuicTime::Delta::Infinite(), 0, 1, QUIC_INVALID_STREAM_ID,
zhongyica364fbb2015-12-12 03:39:121997 quic_error_details));
1998 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1999
2000 // The non-alternate protocol job needs to hang in order to guarantee that
2001 // the alternate-protocol job will "win".
2002 AddHangingNonAlternateProtocolSocketData();
2003
2004 // In order for a new QUIC session to be established via alternate-protocol
2005 // without racing an HTTP connection, we need the host resolution to happen
2006 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
2007 // connection to the the server, in this test we require confirmation
2008 // before encrypting so the HTTP job will still start.
2009 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:292010 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:122011 "");
rch9ae5b3b2016-02-11 00:36:292012 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:122013 AddressList address;
2014 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2015 nullptr, net_log_.bound());
2016
rch3f4b8452016-02-23 16:59:322017 CreateSession();
zhongyica364fbb2015-12-12 03:39:122018 session_->quic_stream_factory()->set_require_confirmation(true);
2019 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2020
danakjad1777e2016-04-16 00:56:422021 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyica364fbb2015-12-12 03:39:122022 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2023 TestCompletionCallback callback;
2024 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2025 EXPECT_EQ(ERR_IO_PENDING, rv);
2026
2027 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
2028 QuicSession::HANDSHAKE_CONFIRMED);
2029 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
2030 NetErrorDetails details;
2031 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
2032
2033 trans->PopulateNetErrorDetails(&details);
zhongyif28b4a32016-04-25 21:35:212034 EXPECT_EQ(QUIC_INVALID_STREAM_ID, details.quic_connection_error);
zhongyica364fbb2015-12-12 03:39:122035}
2036
[email protected]1e960032013-12-20 19:00:202037TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
[email protected]3316d422013-05-03 21:45:302038 // Alternate-protocol job
alyssar2adf3ac2016-05-03 17:12:582039 std::unique_ptr<QuicEncryptedPacket> close(
2040 ConstructServerConnectionClosePacket(1));
[email protected]3316d422013-05-03 21:45:302041 MockRead quic_reads[] = {
rchb27683c2015-07-29 23:53:502042 MockRead(ASYNC, close->data(), close->length()),
2043 MockRead(ASYNC, ERR_IO_PENDING), // No more data to read
2044 MockRead(ASYNC, OK), // EOF
[email protected]3316d422013-05-03 21:45:302045 };
rjshaded5ced072015-12-18 19:26:022046 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2047 0);
[email protected]3316d422013-05-03 21:45:302048 socket_factory_.AddSocketDataProvider(&quic_data);
2049
2050 // Main job which will succeed even though the alternate job fails.
2051 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022052 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2053 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2054 MockRead(ASYNC, OK)};
[email protected]3316d422013-05-03 21:45:302055
rjshaded5ced072015-12-18 19:26:022056 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2057 0);
[email protected]3316d422013-05-03 21:45:302058 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562059 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]3316d422013-05-03 21:45:302060
rch3f4b8452016-02-23 16:59:322061 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:192062 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2063 SendRequestAndExpectHttpResponse("hello from http");
2064 ExpectBrokenAlternateProtocolMapping();
[email protected]3316d422013-05-03 21:45:302065}
2066
[email protected]1e960032013-12-20 19:00:202067TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
[email protected]d03a66d2013-05-06 12:55:592068 // Alternate-protocol job
2069 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022070 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]d03a66d2013-05-06 12:55:592071 };
rjshaded5ced072015-12-18 19:26:022072 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2073 0);
[email protected]d03a66d2013-05-06 12:55:592074 socket_factory_.AddSocketDataProvider(&quic_data);
2075
2076 // Main job which will succeed even though the alternate job fails.
2077 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022078 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2079 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2080 MockRead(ASYNC, OK)};
[email protected]d03a66d2013-05-06 12:55:592081
rjshaded5ced072015-12-18 19:26:022082 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2083 0);
[email protected]d03a66d2013-05-06 12:55:592084 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562085 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]d03a66d2013-05-06 12:55:592086
rch3f4b8452016-02-23 16:59:322087 CreateSession();
[email protected]d03a66d2013-05-06 12:55:592088
[email protected]aa9b14d2013-05-10 23:45:192089 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2090 SendRequestAndExpectHttpResponse("hello from http");
2091 ExpectBrokenAlternateProtocolMapping();
[email protected]d03a66d2013-05-06 12:55:592092}
2093
[email protected]00c159f2014-05-21 22:38:162094TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) {
[email protected]eb71ab62014-05-23 07:57:532095 // Alternate-protocol job will fail when the session attempts to read.
[email protected]00c159f2014-05-21 22:38:162096 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022097 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162098 };
rjshaded5ced072015-12-18 19:26:022099 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2100 0);
[email protected]00c159f2014-05-21 22:38:162101 socket_factory_.AddSocketDataProvider(&quic_data);
2102
[email protected]eb71ab62014-05-23 07:57:532103 // Main job will also fail.
[email protected]00c159f2014-05-21 22:38:162104 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022105 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162106 };
2107
rjshaded5ced072015-12-18 19:26:022108 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2109 0);
[email protected]00c159f2014-05-21 22:38:162110 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED));
2111 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562112 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]00c159f2014-05-21 22:38:162113
rch3f4b8452016-02-23 16:59:322114 CreateSession();
[email protected]00c159f2014-05-21 22:38:162115
2116 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
danakjad1777e2016-04-16 00:56:422117 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]00c159f2014-05-21 22:38:162118 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2119 TestCompletionCallback callback;
2120 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2121 EXPECT_EQ(ERR_IO_PENDING, rv);
2122 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult());
2123 ExpectQuicAlternateProtocolMapping();
2124}
2125
[email protected]1e960032013-12-20 19:00:202126TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
[email protected]77c6c162013-08-17 02:57:452127 // Alternate-protocol job
2128 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022129 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]77c6c162013-08-17 02:57:452130 };
rjshaded5ced072015-12-18 19:26:022131 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2132 0);
[email protected]77c6c162013-08-17 02:57:452133 socket_factory_.AddSocketDataProvider(&quic_data);
2134
[email protected]c92c1b52014-05-31 04:16:062135 // Second Alternate-protocol job which will race with the TCP job.
2136 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:422137 nullptr, 0);
[email protected]c92c1b52014-05-31 04:16:062138 socket_factory_.AddSocketDataProvider(&quic_data2);
2139
[email protected]4d283b32013-10-17 12:57:272140 // Final job that will proceed when the QUIC job fails.
2141 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022142 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2143 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2144 MockRead(ASYNC, OK)};
[email protected]4d283b32013-10-17 12:57:272145
rjshaded5ced072015-12-18 19:26:022146 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2147 0);
[email protected]4d283b32013-10-17 12:57:272148 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562149 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d283b32013-10-17 12:57:272150
rtenneti634050c2016-04-28 20:41:542151 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322152 CreateSession();
[email protected]77c6c162013-08-17 02:57:452153
2154 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2155
[email protected]4d283b32013-10-17 12:57:272156 SendRequestAndExpectHttpResponse("hello from http");
[email protected]77c6c162013-08-17 02:57:452157
2158 ExpectBrokenAlternateProtocolMapping();
[email protected]4d283b32013-10-17 12:57:272159
rch37de576c2015-05-17 20:28:172160 EXPECT_TRUE(quic_data.AllReadDataConsumed());
2161 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
[email protected]77c6c162013-08-17 02:57:452162}
2163
[email protected]93b31772014-06-19 08:03:352164TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) {
[email protected]65768442014-06-06 23:37:032165 // Alternate-protocol job
2166 MockRead quic_reads[] = {
mmenkee24011922015-12-17 22:12:592167 MockRead(SYNCHRONOUS, ERR_IO_PENDING),
[email protected]65768442014-06-06 23:37:032168 };
rjshaded5ced072015-12-18 19:26:022169 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2170 0);
[email protected]65768442014-06-06 23:37:032171 socket_factory_.AddSocketDataProvider(&quic_data);
2172
2173 // Main job that will proceed when the QUIC job fails.
2174 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022175 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2176 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2177 MockRead(ASYNC, OK)};
[email protected]65768442014-06-06 23:37:032178
rjshaded5ced072015-12-18 19:26:022179 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2180 0);
[email protected]65768442014-06-06 23:37:032181 socket_factory_.AddSocketDataProvider(&http_data);
2182
rch3f4b8452016-02-23 16:59:322183 CreateSession();
[email protected]65768442014-06-06 23:37:032184
2185 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2186
2187 SendRequestAndExpectHttpResponse("hello from http");
2188}
2189
[email protected]eb71ab62014-05-23 07:57:532190TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
[email protected]4d590c9c2014-05-02 05:14:332191 // Alternate-protocol job will fail before creating a QUIC session.
rtennetibe635732014-10-02 22:51:422192 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0);
rjshaded5ced072015-12-18 19:26:022193 quic_data.set_connect_data(
2194 MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED));
[email protected]4d590c9c2014-05-02 05:14:332195 socket_factory_.AddSocketDataProvider(&quic_data);
2196
2197 // Main job which will succeed even though the alternate job fails.
2198 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022199 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2200 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2201 MockRead(ASYNC, OK)};
[email protected]4d590c9c2014-05-02 05:14:332202
rjshaded5ced072015-12-18 19:26:022203 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2204 0);
[email protected]4d590c9c2014-05-02 05:14:332205 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562206 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d590c9c2014-05-02 05:14:332207
rch3f4b8452016-02-23 16:59:322208 CreateSession();
[email protected]4d590c9c2014-05-02 05:14:332209 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2210 SendRequestAndExpectHttpResponse("hello from http");
[email protected]eb71ab62014-05-23 07:57:532211
2212 ExpectBrokenAlternateProtocolMapping();
[email protected]4d590c9c2014-05-02 05:14:332213}
2214
[email protected]4fee9672014-01-08 14:47:152215TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
[email protected]4fee9672014-01-08 14:47:152216 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582217 mock_quic_data.AddSynchronousRead(ConstructServerConnectionClosePacket(1));
2218 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2219 1, kClientDataStreamId1, true, true,
2220 GetRequestHeaders("GET", "https", "/")));
2221 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rcha5399e02015-04-21 19:32:042222 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4fee9672014-01-08 14:47:152223
2224 // When the QUIC connection fails, we will try the request again over HTTP.
2225 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:562226 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
2227 MockRead("hello world"),
2228 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2229 MockRead(ASYNC, OK)};
[email protected]4fee9672014-01-08 14:47:152230
rjshaded5ced072015-12-18 19:26:022231 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2232 0);
[email protected]4fee9672014-01-08 14:47:152233 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562234 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4fee9672014-01-08 14:47:152235
2236 // In order for a new QUIC session to be established via alternate-protocol
2237 // without racing an HTTP connection, we need the host resolution to happen
2238 // synchronously.
2239 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:292240 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:562241 "");
rch9ae5b3b2016-02-11 00:36:292242 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]4fee9672014-01-08 14:47:152243 AddressList address;
rjshaded5ced072015-12-18 19:26:022244 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2245 nullptr, net_log_.bound());
[email protected]4fee9672014-01-08 14:47:152246
rch3f4b8452016-02-23 16:59:322247 CreateSession();
[email protected]4fee9672014-01-08 14:47:152248 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2249 SendRequestAndExpectHttpResponse("hello world");
2250}
2251
bnc508835902015-05-12 20:10:292252TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) {
alyssar2adf3ac2016-05-03 17:12:582253 client_maker_.set_hostname("www.example.org");
tbansal0f56a39a2016-04-07 22:03:382254 EXPECT_FALSE(
2255 test_socket_performance_watcher_factory_.rtt_notification_received());
bnc508835902015-05-12 20:10:292256 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582257 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2258 1, kClientDataStreamId1, true, true,
2259 GetRequestHeaders("GET", "https", "/")));
2260 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc508835902015-05-12 20:10:292261 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:582262 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
2263 false, true, 0, "hello!"));
2264 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:502265 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
bnc508835902015-05-12 20:10:292266 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2267
bncb07c05532015-05-14 19:07:202268 request_.url = GURL("https://www.example.org:443");
rch3f4b8452016-02-23 16:59:322269 CreateSession();
bnc508835902015-05-12 20:10:292270 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
2271 SendRequestAndExpectQuicResponse("hello!");
tbansal0f56a39a2016-04-07 22:03:382272 EXPECT_TRUE(
2273 test_socket_performance_watcher_factory_.rtt_notification_received());
bnc508835902015-05-12 20:10:292274}
2275
rtenneti56977812016-01-15 19:26:562276TEST_P(QuicNetworkTransactionTest, QuicUpload) {
rtenneti8a2f4632016-03-21 20:26:572277 params_.origins_to_force_quic_on.insert(
2278 HostPortPair::FromString("mail.example.org:443"));
rtenneti56977812016-01-15 19:26:562279
2280 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2281 MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_FAILED, 1)};
2282 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2283 arraysize(writes));
2284 socket_factory_.AddSocketDataProvider(&socket_data);
2285
rch3f4b8452016-02-23 16:59:322286 params_.enable_alternative_service_with_different_host = false;
rtenneti56977812016-01-15 19:26:562287 CreateSession();
2288 request_.method = "POST";
2289 ChunkedUploadDataStream upload_data(0);
2290 upload_data.AppendData("1", 1, true);
2291
2292 request_.upload_data_stream = &upload_data;
2293
danakjad1777e2016-04-16 00:56:422294 std::unique_ptr<HttpNetworkTransaction> trans(
rtenneti56977812016-01-15 19:26:562295 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2296 TestCompletionCallback callback;
2297 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2298 EXPECT_EQ(ERR_IO_PENDING, rv);
2299 EXPECT_NE(OK, callback.WaitForResult());
2300}
2301
bnc359ed2a2016-04-29 20:43:452302class QuicNetworkTransactionWithDestinationTest
2303 : public PlatformTest,
2304 public ::testing::WithParamInterface<PoolingTestParams> {
2305 protected:
2306 QuicNetworkTransactionWithDestinationTest()
2307 : clock_(new MockClock),
2308 version_(GetParam().version),
2309 destination_type_(GetParam().destination_type),
2310 cert_transparency_verifier_(new MultiLogCTVerifier()),
2311 ssl_config_service_(new SSLConfigServiceDefaults),
2312 proxy_service_(ProxyService::CreateDirect()),
2313 auth_handler_factory_(
2314 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
2315 random_generator_(0),
2316 ssl_data_(ASYNC, OK) {}
2317
2318 void SetUp() override {
2319 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
2320 base::MessageLoop::current()->RunUntilIdle();
2321
2322 HttpNetworkSession::Params params;
2323
2324 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
2325 params.quic_clock = clock_;
2326
2327 crypto_client_stream_factory_.set_handshake_mode(
2328 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2329 params.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
2330
2331 params.enable_alternative_service_with_different_host = true;
2332 params.enable_quic = true;
2333 params.quic_random = &random_generator_;
2334 params.client_socket_factory = &socket_factory_;
2335 params.host_resolver = &host_resolver_;
2336 params.cert_verifier = &cert_verifier_;
2337 params.transport_security_state = &transport_security_state_;
2338 params.cert_transparency_verifier = cert_transparency_verifier_.get();
2339 params.socket_performance_watcher_factory =
2340 &test_socket_performance_watcher_factory_;
2341 params.ssl_config_service = ssl_config_service_.get();
2342 params.proxy_service = proxy_service_.get();
2343 params.http_auth_handler_factory = auth_handler_factory_.get();
2344 params.http_server_properties = http_server_properties_.GetWeakPtr();
2345 params.quic_supported_versions = SupportedVersions(version_);
2346 params.quic_host_whitelist.insert("news.example.org");
2347 params.quic_host_whitelist.insert("mail.example.org");
2348 params.quic_host_whitelist.insert("mail.example.com");
2349
2350 session_.reset(new HttpNetworkSession(params));
2351 session_->quic_stream_factory()->set_require_confirmation(true);
2352 ASSERT_EQ(params.quic_socket_receive_buffer_size,
2353 session_->quic_stream_factory()->socket_receive_buffer_size());
2354 }
2355
2356 void TearDown() override {
2357 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
2358 // Empty the current queue.
2359 base::MessageLoop::current()->RunUntilIdle();
2360 PlatformTest::TearDown();
2361 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
2362 base::MessageLoop::current()->RunUntilIdle();
2363 }
2364
2365 void SetAlternativeService(const std::string& origin) {
2366 HostPortPair destination;
2367 switch (destination_type_) {
2368 case SAME_AS_FIRST:
2369 destination = HostPortPair(origin1_, 443);
2370 break;
2371 case SAME_AS_SECOND:
2372 destination = HostPortPair(origin2_, 443);
2373 break;
2374 case DIFFERENT:
2375 destination = HostPortPair(kDifferentHostname, 443);
2376 break;
2377 }
2378 AlternativeService alternative_service(QUIC, destination);
2379 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
2380 http_server_properties_.SetAlternativeService(
2381 url::SchemeHostPort("https", origin, 443), alternative_service,
2382 expiration);
2383 }
2384
alyssar2adf3ac2016-05-03 17:12:582385 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452386 QuicPacketNumber packet_number,
2387 QuicStreamId stream_id,
2388 bool should_include_version,
2389 QuicStreamOffset* offset,
2390 QuicTestPacketMaker* maker) {
2391 SpdyPriority priority =
2392 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
2393 SpdyHeaderBlock headers(maker->GetRequestHeaders("GET", "https", "/"));
2394 return maker->MakeRequestHeadersPacketWithOffsetTracking(
2395 packet_number, stream_id, should_include_version, true, priority,
2396 headers, offset);
2397 }
2398
alyssar2adf3ac2016-05-03 17:12:582399 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452400 QuicPacketNumber packet_number,
2401 QuicStreamId stream_id,
2402 bool should_include_version,
2403 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:582404 return ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452405 packet_number, stream_id, should_include_version, nullptr, maker);
2406 }
2407
alyssar2adf3ac2016-05-03 17:12:582408 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:452409 QuicPacketNumber packet_number,
2410 QuicStreamId stream_id,
2411 QuicStreamOffset* offset,
2412 QuicTestPacketMaker* maker) {
2413 SpdyHeaderBlock headers(maker->GetResponseHeaders("200 OK"));
2414 return maker->MakeResponseHeadersPacketWithOffsetTracking(
2415 packet_number, stream_id, false, false, headers, offset);
2416 }
2417
alyssar2adf3ac2016-05-03 17:12:582418 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:452419 QuicPacketNumber packet_number,
2420 QuicStreamId stream_id,
2421 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:582422 return ConstructServerResponseHeadersPacket(packet_number, stream_id,
2423 nullptr, maker);
bnc359ed2a2016-04-29 20:43:452424 }
2425
alyssar2adf3ac2016-05-03 17:12:582426 std::unique_ptr<QuicEncryptedPacket> ConstructServerDataPacket(
bnc359ed2a2016-04-29 20:43:452427 QuicPacketNumber packet_number,
2428 QuicStreamId stream_id,
2429 QuicTestPacketMaker* maker) {
2430 return maker->MakeDataPacket(packet_number, stream_id, false, true, 0,
2431 "hello");
2432 }
2433
alyssar2adf3ac2016-05-03 17:12:582434 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
bnc359ed2a2016-04-29 20:43:452435 QuicPacketNumber packet_number,
2436 QuicPacketNumber largest_received,
2437 QuicPacketNumber ack_least_unacked,
2438 QuicPacketNumber stop_least_unacked,
2439 QuicTestPacketMaker* maker) {
2440 return maker->MakeAckPacket(packet_number, largest_received,
2441 ack_least_unacked, stop_least_unacked, true);
2442 }
2443
2444 void AddRefusedSocketData() {
2445 std::unique_ptr<StaticSocketDataProvider> refused_data(
2446 new StaticSocketDataProvider());
2447 MockConnect refused_connect(SYNCHRONOUS, ERR_CONNECTION_REFUSED);
2448 refused_data->set_connect_data(refused_connect);
2449 socket_factory_.AddSocketDataProvider(refused_data.get());
2450 static_socket_data_provider_vector_.push_back(std::move(refused_data));
2451 }
2452
2453 void AddHangingSocketData() {
2454 std::unique_ptr<StaticSocketDataProvider> hanging_data(
2455 new StaticSocketDataProvider());
2456 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
2457 hanging_data->set_connect_data(hanging_connect);
2458 socket_factory_.AddSocketDataProvider(hanging_data.get());
2459 static_socket_data_provider_vector_.push_back(std::move(hanging_data));
2460 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
2461 }
2462
2463 bool AllDataConsumed() {
2464 for (const auto& socket_data_ptr : static_socket_data_provider_vector_) {
2465 if (!socket_data_ptr->AllReadDataConsumed() ||
2466 !socket_data_ptr->AllWriteDataConsumed()) {
2467 return false;
2468 }
2469 }
2470 return true;
2471 }
2472
2473 void SendRequestAndExpectQuicResponse(const std::string& host) {
2474 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
2475 HttpRequestInfo request;
2476 std::string url("https://");
2477 url.append(host);
2478 request.url = GURL(url);
2479 request.load_flags = 0;
2480 request.method = "GET";
2481 TestCompletionCallback callback;
2482 int rv = trans.Start(&request, callback.callback(), net_log_.bound());
2483 EXPECT_EQ(OK, callback.GetResult(rv));
2484
2485 std::string response_data;
2486 ASSERT_EQ(OK, ReadTransaction(&trans, &response_data));
2487 EXPECT_EQ("hello", response_data);
2488
2489 const HttpResponseInfo* response = trans.GetResponseInfo();
2490 ASSERT_TRUE(response != nullptr);
2491 ASSERT_TRUE(response->headers.get() != nullptr);
2492 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
2493 EXPECT_TRUE(response->was_fetched_via_spdy);
2494 EXPECT_TRUE(response->was_npn_negotiated);
2495 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
2496 response->connection_info);
2497 EXPECT_EQ(443, response->socket_address.port());
2498 }
2499
2500 MockClock* clock_;
2501 QuicVersion version_;
2502 DestinationType destination_type_;
2503 std::string origin1_;
2504 std::string origin2_;
2505 std::unique_ptr<HttpNetworkSession> session_;
2506 MockClientSocketFactory socket_factory_;
2507 MockHostResolver host_resolver_;
2508 MockCertVerifier cert_verifier_;
2509 TransportSecurityState transport_security_state_;
2510 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
2511 TestSocketPerformanceWatcherFactory test_socket_performance_watcher_factory_;
2512 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
2513 std::unique_ptr<ProxyService> proxy_service_;
2514 std::unique_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
2515 MockRandom random_generator_;
2516 HttpServerPropertiesImpl http_server_properties_;
2517 BoundTestNetLog net_log_;
2518 MockCryptoClientStreamFactory crypto_client_stream_factory_;
2519 std::vector<std::unique_ptr<StaticSocketDataProvider>>
2520 static_socket_data_provider_vector_;
2521 SSLSocketDataProvider ssl_data_;
2522};
2523
2524INSTANTIATE_TEST_CASE_P(Version,
2525 QuicNetworkTransactionWithDestinationTest,
2526 ::testing::ValuesIn(GetPoolingTestParams()));
2527
2528// A single QUIC request fails because the certificate does not match the origin
2529// hostname, regardless of whether it matches the alternative service hostname.
2530TEST_P(QuicNetworkTransactionWithDestinationTest, InvalidCertificate) {
2531 if (destination_type_ == DIFFERENT)
2532 return;
2533
2534 GURL url("https://mail.example.com/");
2535 origin1_ = url.host();
2536
2537 // Not used for requests, but this provides a test case where the certificate
2538 // is valid for the hostname of the alternative service.
2539 origin2_ = "mail.example.org";
2540
2541 SetAlternativeService(origin1_);
2542
2543 scoped_refptr<X509Certificate> cert(
2544 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2545 bool unused;
2546 ASSERT_FALSE(cert->VerifyNameMatch(origin1_, &unused));
2547 ASSERT_TRUE(cert->VerifyNameMatch(origin2_, &unused));
2548
2549 ProofVerifyDetailsChromium verify_details;
2550 verify_details.cert_verify_result.verified_cert = cert;
2551 verify_details.cert_verify_result.is_issued_by_known_root = true;
2552 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2553
2554 MockQuicData mock_quic_data;
2555 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);
2556 mock_quic_data.AddRead(ASYNC, 0);
2557
2558 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2559
2560 AddRefusedSocketData();
2561
2562 HttpRequestInfo request;
2563 request.url = url;
2564
2565 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
2566 TestCompletionCallback callback;
2567 int rv = trans.Start(&request, callback.callback(), net_log_.bound());
2568 EXPECT_EQ(ERR_CONNECTION_REFUSED, callback.GetResult(rv));
2569
2570 EXPECT_TRUE(AllDataConsumed());
2571}
2572
2573// First request opens QUIC session to alternative service. Second request
2574// pools to it, because destination matches and certificate is valid, even
2575// though QuicServerId is different.
2576TEST_P(QuicNetworkTransactionWithDestinationTest, PoolIfCertificateValid) {
2577 origin1_ = "mail.example.org";
2578 origin2_ = "news.example.org";
2579
2580 SetAlternativeService(origin1_);
2581 SetAlternativeService(origin2_);
2582
2583 scoped_refptr<X509Certificate> cert(
2584 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2585 bool unused;
2586 ASSERT_TRUE(cert->VerifyNameMatch(origin1_, &unused));
2587 ASSERT_TRUE(cert->VerifyNameMatch(origin2_, &unused));
2588 ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname, &unused));
2589
2590 ProofVerifyDetailsChromium verify_details;
2591 verify_details.cert_verify_result.verified_cert = cert;
2592 verify_details.cert_verify_result.is_issued_by_known_root = true;
2593 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2594
alyssar2adf3ac2016-05-03 17:12:582595 QuicTestPacketMaker client_maker1(version_, 0, clock_, origin1_,
2596 Perspective::IS_CLIENT);
2597 QuicTestPacketMaker server_maker1(version_, 0, clock_, origin1_,
2598 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452599
2600 QuicStreamOffset request_header_offset(0);
2601 QuicStreamOffset response_header_offset(0);
2602
2603 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582604 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2605 1, kClientDataStreamId1, true, &request_header_offset, &client_maker1));
2606 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2607 1, kClientDataStreamId1, &response_header_offset, &server_maker1));
2608 mock_quic_data.AddRead(
2609 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker1));
2610 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 2, 1, 1, &client_maker1));
bnc359ed2a2016-04-29 20:43:452611
alyssar2adf3ac2016-05-03 17:12:582612 QuicTestPacketMaker client_maker2(version_, 0, clock_, origin2_,
2613 Perspective::IS_CLIENT);
2614 QuicTestPacketMaker server_maker2(version_, 0, clock_, origin2_,
2615 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452616
alyssar2adf3ac2016-05-03 17:12:582617 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2618 3, kClientDataStreamId2, false, &request_header_offset, &client_maker2));
2619 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2620 3, kClientDataStreamId2, &response_header_offset, &server_maker2));
2621 mock_quic_data.AddRead(
2622 ConstructServerDataPacket(4, kClientDataStreamId2, &server_maker2));
2623 mock_quic_data.AddWrite(ConstructClientAckPacket(4, 4, 3, 1, &client_maker2));
bnc359ed2a2016-04-29 20:43:452624 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2625 mock_quic_data.AddRead(ASYNC, 0); // EOF
2626
2627 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2628
2629 AddHangingSocketData();
2630 AddHangingSocketData();
2631
2632 SendRequestAndExpectQuicResponse(origin1_);
2633 SendRequestAndExpectQuicResponse(origin2_);
2634
2635 EXPECT_TRUE(AllDataConsumed());
2636}
2637
2638// First request opens QUIC session to alternative service. Second request does
2639// not pool to it, even though destination matches, because certificate is not
2640// valid. Instead, a new QUIC session is opened to the same destination with a
2641// different QuicServerId.
2642TEST_P(QuicNetworkTransactionWithDestinationTest,
2643 DoNotPoolIfCertificateInvalid) {
2644 origin1_ = "news.example.org";
2645 origin2_ = "mail.example.com";
2646
2647 SetAlternativeService(origin1_);
2648 SetAlternativeService(origin2_);
2649
2650 scoped_refptr<X509Certificate> cert1(
2651 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2652 bool unused;
2653 ASSERT_TRUE(cert1->VerifyNameMatch(origin1_, &unused));
2654 ASSERT_FALSE(cert1->VerifyNameMatch(origin2_, &unused));
2655 ASSERT_FALSE(cert1->VerifyNameMatch(kDifferentHostname, &unused));
2656
2657 scoped_refptr<X509Certificate> cert2(
2658 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
2659 ASSERT_TRUE(cert2->VerifyNameMatch(origin2_, &unused));
2660 ASSERT_FALSE(cert2->VerifyNameMatch(kDifferentHostname, &unused));
2661
2662 ProofVerifyDetailsChromium verify_details1;
2663 verify_details1.cert_verify_result.verified_cert = cert1;
2664 verify_details1.cert_verify_result.is_issued_by_known_root = true;
2665 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
2666
2667 ProofVerifyDetailsChromium verify_details2;
2668 verify_details2.cert_verify_result.verified_cert = cert2;
2669 verify_details2.cert_verify_result.is_issued_by_known_root = true;
2670 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
2671
alyssar2adf3ac2016-05-03 17:12:582672 QuicTestPacketMaker client_maker1(version_, 0, clock_, origin1_,
2673 Perspective::IS_CLIENT);
2674 QuicTestPacketMaker server_maker1(version_, 0, clock_, origin1_,
2675 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452676
2677 MockQuicData mock_quic_data1;
alyssar2adf3ac2016-05-03 17:12:582678 mock_quic_data1.AddWrite(ConstructClientRequestHeadersPacket(
2679 1, kClientDataStreamId1, true, &client_maker1));
2680 mock_quic_data1.AddRead(ConstructServerResponseHeadersPacket(
2681 1, kClientDataStreamId1, &server_maker1));
2682 mock_quic_data1.AddRead(
2683 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker1));
bnc359ed2a2016-04-29 20:43:452684 mock_quic_data1.AddWrite(
alyssar2adf3ac2016-05-03 17:12:582685 ConstructClientAckPacket(2, 2, 1, 1, &client_maker1));
bnc359ed2a2016-04-29 20:43:452686 mock_quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2687 mock_quic_data1.AddRead(ASYNC, 0); // EOF
2688
2689 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
2690
2691 AddHangingSocketData();
2692
alyssar2adf3ac2016-05-03 17:12:582693 QuicTestPacketMaker client_maker2(version_, 0, clock_, origin2_,
2694 Perspective::IS_CLIENT);
2695 QuicTestPacketMaker server_maker2(version_, 0, clock_, origin2_,
2696 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452697
2698 MockQuicData mock_quic_data2;
alyssar2adf3ac2016-05-03 17:12:582699 mock_quic_data2.AddWrite(ConstructClientRequestHeadersPacket(
2700 1, kClientDataStreamId1, true, &client_maker2));
2701 mock_quic_data2.AddRead(ConstructServerResponseHeadersPacket(
2702 1, kClientDataStreamId1, &server_maker2));
2703 mock_quic_data2.AddRead(
2704 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker2));
bnc359ed2a2016-04-29 20:43:452705 mock_quic_data2.AddWrite(
alyssar2adf3ac2016-05-03 17:12:582706 ConstructClientAckPacket(2, 2, 1, 1, &client_maker2));
bnc359ed2a2016-04-29 20:43:452707 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2708 mock_quic_data2.AddRead(ASYNC, 0); // EOF
2709
2710 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
2711
2712 AddHangingSocketData();
2713
2714 SendRequestAndExpectQuicResponse(origin1_);
2715 SendRequestAndExpectQuicResponse(origin2_);
2716
2717 EXPECT_TRUE(AllDataConsumed());
2718}
2719
[email protected]61a527782013-02-21 03:58:002720} // namespace test
2721} // namespace net