blob: 12a94cc13a4afb1159c71e5eb3d6b5074c61b3f9 [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"
rsleevid6de8302016-06-21 01:33:2018#include "net/cert/ct_policy_enforcer.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"
robpercival214763f2016-07-01 23:27:0157#include "net/test/gtest_util.h"
rsleevia69c79a2016-06-22 03:28:4358#include "net/test/test_data_directory.h"
robpercival214763f2016-07-01 23:27:0159#include "testing/gmock/include/gmock/gmock.h"
[email protected]61a527782013-02-21 03:58:0060#include "testing/gtest/include/gtest/gtest.h"
61#include "testing/platform_test.h"
zhongyi3d4a55e72016-04-22 20:36:4662#include "url/gurl.h"
[email protected]61a527782013-02-21 03:58:0063
robpercival214763f2016-07-01 23:27:0164using net::test::IsError;
65using net::test::IsOk;
66
bnc508835902015-05-12 20:10:2967namespace net {
68namespace test {
[email protected]61a527782013-02-21 03:58:0069
70namespace {
71
bnc359ed2a2016-04-29 20:43:4572enum DestinationType {
73 // In pooling tests with two requests for different origins to the same
74 // destination, the destination should be
75 SAME_AS_FIRST, // the same as the first origin,
76 SAME_AS_SECOND, // the same as the second origin, or
77 DIFFERENT, // different from both.
78};
79
rchf114d982015-10-21 01:34:5680static 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
ryansturm49a8cb12016-06-15 16:51:09177class HeadersHandler {
tbansal7cec3812015-02-05 21:25:12178 public:
ryansturm49a8cb12016-06-15 16:51:09179 HeadersHandler() : was_proxied_(false) {}
tbansal7cec3812015-02-05 21:25:12180
ryansturm49a8cb12016-06-15 16:51:09181 bool was_proxied() { return was_proxied_; }
tbansal7cec3812015-02-05 21:25:12182
ryansturm49a8cb12016-06-15 16:51:09183 void OnBeforeHeadersSent(const ProxyInfo& proxy_info,
184 HttpRequestHeaders* request_headers) {
185 if (!proxy_info.is_http() && !proxy_info.is_https() &&
186 !proxy_info.is_quic()) {
187 return;
188 }
189 was_proxied_ = true;
tbansal7cec3812015-02-05 21:25:12190 }
191
192 private:
ryansturm49a8cb12016-06-15 16:51:09193 bool was_proxied_;
tbansal7cec3812015-02-05 21:25:12194};
195
tbansal0f56a39a2016-04-07 22:03:38196class TestSocketPerformanceWatcher : public SocketPerformanceWatcher {
tbansalfdf5665b2015-09-21 22:46:40197 public:
tbansal0f56a39a2016-04-07 22:03:38198 explicit TestSocketPerformanceWatcher(bool* rtt_notification_received)
199 : rtt_notification_received_(rtt_notification_received) {}
200 ~TestSocketPerformanceWatcher() override {}
tbansalfdf5665b2015-09-21 22:46:40201
tbansal0f56a39a2016-04-07 22:03:38202 bool ShouldNotifyUpdatedRTT() const override { return true; }
tbansalfdf5665b2015-09-21 22:46:40203
tbansal0f56a39a2016-04-07 22:03:38204 void OnUpdatedRTTAvailable(const base::TimeDelta& rtt) override {
205 *rtt_notification_received_ = true;
206 }
207
208 void OnConnectionChanged() override {}
209
210 private:
211 bool* rtt_notification_received_;
212
213 DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcher);
214};
215
216class TestSocketPerformanceWatcherFactory
217 : public SocketPerformanceWatcherFactory {
218 public:
219 TestSocketPerformanceWatcherFactory()
220 : watcher_count_(0u), rtt_notification_received_(false) {}
221 ~TestSocketPerformanceWatcherFactory() override {}
222
223 // SocketPerformanceWatcherFactory implementation:
danakjad1777e2016-04-16 00:56:42224 std::unique_ptr<SocketPerformanceWatcher> CreateSocketPerformanceWatcher(
tbansalc8a94ea2015-11-02 23:58:51225 const Protocol protocol) override {
226 if (protocol != PROTOCOL_QUIC) {
tbansal0f56a39a2016-04-07 22:03:38227 return nullptr;
tbansalc8a94ea2015-11-02 23:58:51228 }
229 ++watcher_count_;
danakjad1777e2016-04-16 00:56:42230 return std::unique_ptr<SocketPerformanceWatcher>(
tbansal0f56a39a2016-04-07 22:03:38231 new TestSocketPerformanceWatcher(&rtt_notification_received_));
tbansalfdf5665b2015-09-21 22:46:40232 }
233
tbansalc8a94ea2015-11-02 23:58:51234 size_t watcher_count() const { return watcher_count_; }
tbansalfdf5665b2015-09-21 22:46:40235
tbansalc8a94ea2015-11-02 23:58:51236 bool rtt_notification_received() const { return rtt_notification_received_; }
237
tbansalc8a94ea2015-11-02 23:58:51238 private:
tbansal0f56a39a2016-04-07 22:03:38239 size_t watcher_count_;
tbansalc8a94ea2015-11-02 23:58:51240 bool rtt_notification_received_;
tbansal0f56a39a2016-04-07 22:03:38241
242 DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcherFactory);
tbansalc8a94ea2015-11-02 23:58:51243};
244
[email protected]1e960032013-12-20 19:00:20245class QuicNetworkTransactionTest
246 : public PlatformTest,
[email protected]5d03bbd2014-03-07 16:19:16247 public ::testing::WithParamInterface<QuicVersion> {
[email protected]61a527782013-02-21 03:58:00248 protected:
[email protected]1c04f9522013-02-21 20:32:43249 QuicNetworkTransactionTest()
rtenneti4b06ae72014-08-26 03:43:43250 : clock_(new MockClock),
alyssar2adf3ac2016-05-03 17:12:58251 client_maker_(GetParam(),
252 0,
253 clock_,
254 kDefaultServerHostName,
255 Perspective::IS_CLIENT),
256 server_maker_(GetParam(),
257 0,
258 clock_,
259 kDefaultServerHostName,
260 Perspective::IS_SERVER),
rtenneti052774e2015-11-24 21:00:12261 cert_transparency_verifier_(new MultiLogCTVerifier()),
[email protected]1c04f9522013-02-21 20:32:43262 ssl_config_service_(new SSLConfigServiceDefaults),
263 proxy_service_(ProxyService::CreateDirect()),
264 auth_handler_factory_(
[email protected]dda75ab2013-06-22 22:43:30265 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
[email protected]457d6952013-12-13 09:24:58266 random_generator_(0),
rchf114d982015-10-21 01:34:56267 ssl_data_(ASYNC, OK) {
[email protected]aa9b14d2013-05-10 23:45:19268 request_.method = "GET";
rchf114d982015-10-21 01:34:56269 std::string url("https://");
bncb07c05532015-05-14 19:07:20270 url.append(kDefaultServerHostName);
271 request_.url = GURL(url);
[email protected]aa9b14d2013-05-10 23:45:19272 request_.load_flags = 0;
[email protected]98a9d1252014-04-04 00:43:59273 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
rchf114d982015-10-21 01:34:56274
275 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29276 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
rchf114d982015-10-21 01:34:56277 verify_details_.cert_verify_result.verified_cert = cert;
278 verify_details_.cert_verify_result.is_issued_by_known_root = true;
279 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
[email protected]1c04f9522013-02-21 20:32:43280 }
[email protected]61a527782013-02-21 03:58:00281
dcheng67be2b1f2014-10-27 21:47:29282 void SetUp() override {
[email protected]61a527782013-02-21 03:58:00283 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:55284 base::RunLoop().RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00285 }
286
dcheng67be2b1f2014-10-27 21:47:29287 void TearDown() override {
[email protected]61a527782013-02-21 03:58:00288 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
289 // Empty the current queue.
fdoray92e35a72016-06-10 15:54:55290 base::RunLoop().RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00291 PlatformTest::TearDown();
292 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:55293 base::RunLoop().RunUntilIdle();
bnc525e175a2016-06-20 12:36:40294 session_.reset();
[email protected]61a527782013-02-21 03:58:00295 }
296
alyssar2adf3ac2016-05-03 17:12:58297 std::unique_ptr<QuicEncryptedPacket> ConstructClientConnectionClosePacket(
rtennetia004d332015-08-28 06:44:57298 QuicPacketNumber num) {
alyssar2adf3ac2016-05-03 17:12:58299 return client_maker_.MakeConnectionClosePacket(num);
[email protected]3316d422013-05-03 21:45:30300 }
301
alyssar2adf3ac2016-05-03 17:12:58302 std::unique_ptr<QuicEncryptedPacket> ConstructServerConnectionClosePacket(
303 QuicPacketNumber num) {
304 return server_maker_.MakeConnectionClosePacket(num);
305 }
306
307 std::unique_ptr<QuicEncryptedPacket> ConstructServerGoAwayPacket(
zhongyi6b5a3892016-03-12 04:46:20308 QuicPacketNumber num,
309 QuicErrorCode error_code,
310 std::string reason_phrase) {
alyssar2adf3ac2016-05-03 17:12:58311 return server_maker_.MakeGoAwayPacket(num, error_code, reason_phrase);
zhongyi6b5a3892016-03-12 04:46:20312 }
313
alyssar2adf3ac2016-05-03 17:12:58314 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
rtennetia004d332015-08-28 06:44:57315 QuicPacketNumber largest_received,
316 QuicPacketNumber least_unacked) {
alyssar2adf3ac2016-05-03 17:12:58317 return client_maker_.MakeAckPacket(2, largest_received, least_unacked,
318 least_unacked, true);
zhongyi32569c62016-01-08 02:54:30319 }
320
alyssar2adf3ac2016-05-03 17:12:58321 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckAndRstPacket(
zhongyi6b5a3892016-03-12 04:46:20322 QuicPacketNumber num,
323 QuicStreamId stream_id,
324 QuicRstStreamErrorCode error_code,
325 QuicPacketNumber largest_received,
326 QuicPacketNumber ack_least_unacked,
327 QuicPacketNumber stop_least_unacked) {
alyssar2adf3ac2016-05-03 17:12:58328 return client_maker_.MakeAckAndRstPacket(
329 num, false, stream_id, error_code, largest_received, ack_least_unacked,
330 stop_least_unacked, true);
zhongyi6b5a3892016-03-12 04:46:20331 }
332
alyssar2adf3ac2016-05-03 17:12:58333 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
zhongyi32569c62016-01-08 02:54:30334 QuicPacketNumber largest_received,
335 QuicPacketNumber least_unacked,
336 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:58337 return client_maker_.MakeAckPacket(2, largest_received, least_unacked,
338 least_unacked, true);
zhongyi32569c62016-01-08 02:54:30339 }
340
ckrasic769733c2016-06-30 00:42:13341 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
342 QuicPacketNumber packet_number,
343 QuicPacketNumber largest_received,
344 QuicPacketNumber ack_least_unacked,
345 QuicPacketNumber stop_least_unacked) {
346 return client_maker_.MakeAckPacket(packet_number, largest_received,
347 ack_least_unacked, stop_least_unacked,
348 true);
349 }
350
alyssar2adf3ac2016-05-03 17:12:58351 std::unique_ptr<QuicEncryptedPacket>
352 ConstructClientAckAndConnectionClosePacket(
zhongyi32569c62016-01-08 02:54:30353 QuicPacketNumber packet_number,
354 QuicPacketNumber largest_received,
355 QuicPacketNumber ack_least_unacked,
356 QuicPacketNumber stop_least_unacked) {
alyssar2adf3ac2016-05-03 17:12:58357 return client_maker_.MakeAckPacket(packet_number, largest_received,
358 ack_least_unacked, stop_least_unacked,
359 true);
[email protected]1e960032013-12-20 19:00:20360 }
[email protected]61a527782013-02-21 03:58:00361
alyssar2adf3ac2016-05-03 17:12:58362 std::unique_ptr<QuicEncryptedPacket>
363 ConstructClientAckAndConnectionClosePacket(
zhongyica364fbb2015-12-12 03:39:12364 QuicPacketNumber num,
365 QuicTime::Delta delta_time_largest_observed,
366 QuicPacketNumber largest_received,
367 QuicPacketNumber least_unacked,
368 QuicErrorCode quic_error,
bnc912a04b2016-04-20 14:19:50369 const std::string& quic_error_details) {
alyssar2adf3ac2016-05-03 17:12:58370 return client_maker_.MakeAckAndConnectionClosePacket(
zhongyica364fbb2015-12-12 03:39:12371 num, false, delta_time_largest_observed, largest_received,
372 least_unacked, quic_error, quic_error_details);
373 }
374
alyssar2adf3ac2016-05-03 17:12:58375 std::unique_ptr<QuicEncryptedPacket> ConstructServerRstPacket(
zhongyica364fbb2015-12-12 03:39:12376 QuicPacketNumber num,
377 bool include_version,
378 QuicStreamId stream_id,
379 QuicRstStreamErrorCode error_code) {
alyssar2adf3ac2016-05-03 17:12:58380 return server_maker_.MakeRstPacket(num, include_version, stream_id,
381 error_code);
zhongyica364fbb2015-12-12 03:39:12382 }
383
zhongyi32569c62016-01-08 02:54:30384 // Uses default QuicTestPacketMaker.
[email protected]1e960032013-12-20 19:00:20385 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
386 const std::string& scheme,
387 const std::string& path) {
alyssar2adf3ac2016-05-03 17:12:58388 return GetRequestHeaders(method, scheme, path, &client_maker_);
zhongyi32569c62016-01-08 02:54:30389 }
390
391 // Uses customized QuicTestPacketMaker.
392 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
393 const std::string& scheme,
394 const std::string& path,
bnc912a04b2016-04-20 14:19:50395 QuicTestPacketMaker* maker) {
396 return maker->GetRequestHeaders(method, scheme, path);
[email protected]61a527782013-02-21 03:58:00397 }
398
[email protected]1e960032013-12-20 19:00:20399 SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
alyssar2adf3ac2016-05-03 17:12:58400 return server_maker_.GetResponseHeaders(status);
[email protected]61a527782013-02-21 03:58:00401 }
402
zhongyi32569c62016-01-08 02:54:30403 // Appends alt_svc headers in the response headers.
404 SpdyHeaderBlock GetResponseHeaders(const std::string& status,
405 const std::string& alt_svc) {
alyssar2adf3ac2016-05-03 17:12:58406 return server_maker_.GetResponseHeaders(status, alt_svc);
zhongyi32569c62016-01-08 02:54:30407 }
408
alyssar2adf3ac2016-05-03 17:12:58409 std::unique_ptr<QuicEncryptedPacket> ConstructServerDataPacket(
rtennetia004d332015-08-28 06:44:57410 QuicPacketNumber packet_number,
[email protected]98b20ce2013-05-10 05:55:26411 QuicStreamId stream_id,
[email protected]e8ff26842013-03-22 21:02:05412 bool should_include_version,
[email protected]61a527782013-02-21 03:58:00413 bool fin,
414 QuicStreamOffset offset,
415 base::StringPiece data) {
alyssar2adf3ac2016-05-03 17:12:58416 return server_maker_.MakeDataPacket(
417 packet_number, stream_id, should_include_version, fin, offset, data);
[email protected]61a527782013-02-21 03:58:00418 }
419
alyssar2adf3ac2016-05-03 17:12:58420 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
rtennetia004d332015-08-28 06:44:57421 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20422 QuicStreamId stream_id,
423 bool should_include_version,
424 bool fin,
bnc086b39e12016-06-24 13:05:26425 SpdyHeaderBlock headers,
zhongyi32569c62016-01-08 02:54:30426 QuicStreamOffset* offset) {
ianswett0888cff2015-11-24 17:42:16427 SpdyPriority priority =
rtennetif4bdb542015-01-21 14:33:05428 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
alyssar2adf3ac2016-05-03 17:12:58429 return client_maker_.MakeRequestHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30430 packet_number, stream_id, should_include_version, fin, priority,
bnc94893a72016-06-30 13:45:25431 std::move(headers), offset);
zhongyi32569c62016-01-08 02:54:30432 }
433
alyssar2adf3ac2016-05-03 17:12:58434 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30435 QuicPacketNumber packet_number,
436 QuicStreamId stream_id,
437 bool should_include_version,
438 bool fin,
bnc086b39e12016-06-24 13:05:26439 SpdyHeaderBlock headers,
zhongyi32569c62016-01-08 02:54:30440 QuicStreamOffset* offset,
441 QuicTestPacketMaker* maker) {
442 SpdyPriority priority =
443 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
alyssar2adf3ac2016-05-03 17:12:58444 return client_maker_.MakeRequestHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30445 packet_number, stream_id, should_include_version, fin, priority,
bnc94893a72016-06-30 13:45:25446 std::move(headers), offset);
zhongyi32569c62016-01-08 02:54:30447 }
448
alyssar2adf3ac2016-05-03 17:12:58449 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30450 QuicPacketNumber packet_number,
451 QuicStreamId stream_id,
452 bool should_include_version,
453 bool fin,
bnc086b39e12016-06-24 13:05:26454 SpdyHeaderBlock headers) {
alyssar2adf3ac2016-05-03 17:12:58455 return ConstructClientRequestHeadersPacket(
bnc086b39e12016-06-24 13:05:26456 packet_number, stream_id, should_include_version, fin,
457 std::move(headers), nullptr, &client_maker_);
zhongyi32569c62016-01-08 02:54:30458 }
alyssar2adf3ac2016-05-03 17:12:58459 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30460 QuicPacketNumber packet_number,
461 QuicStreamId stream_id,
462 bool should_include_version,
463 bool fin,
bnc086b39e12016-06-24 13:05:26464 SpdyHeaderBlock headers,
zhongyi32569c62016-01-08 02:54:30465 QuicTestPacketMaker* maker) {
bnc086b39e12016-06-24 13:05:26466 return ConstructClientRequestHeadersPacket(
467 packet_number, stream_id, should_include_version, fin,
468 std::move(headers), nullptr, maker);
[email protected]61a527782013-02-21 03:58:00469 }
470
ckrasic769733c2016-06-30 00:42:13471 std::unique_ptr<QuicEncryptedPacket> ConstructServerPushPromisePacket(
472 QuicPacketNumber packet_number,
473 QuicStreamId stream_id,
474 QuicStreamId promised_stream_id,
475 bool should_include_version,
476 SpdyHeaderBlock headers,
477 QuicStreamOffset* offset,
478 QuicTestPacketMaker* maker) {
479 return maker->MakePushPromisePacket(
480 packet_number, stream_id, promised_stream_id, should_include_version,
481 false, std::move(headers), nullptr, offset);
482 }
483
alyssar2adf3ac2016-05-03 17:12:58484 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
rtennetia004d332015-08-28 06:44:57485 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20486 QuicStreamId stream_id,
487 bool should_include_version,
488 bool fin,
bnc086b39e12016-06-24 13:05:26489 SpdyHeaderBlock headers) {
alyssar2adf3ac2016-05-03 17:12:58490 return ConstructServerResponseHeadersPacket(
bnc086b39e12016-06-24 13:05:26491 packet_number, stream_id, should_include_version, fin,
492 std::move(headers), nullptr, &server_maker_);
zhongyi32569c62016-01-08 02:54:30493 }
494
alyssar2adf3ac2016-05-03 17:12:58495 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30496 QuicPacketNumber packet_number,
497 QuicStreamId stream_id,
498 bool should_include_version,
499 bool fin,
bnc086b39e12016-06-24 13:05:26500 SpdyHeaderBlock headers,
zhongyi32569c62016-01-08 02:54:30501 QuicTestPacketMaker* maker) {
bnc086b39e12016-06-24 13:05:26502 return ConstructServerResponseHeadersPacket(
503 packet_number, stream_id, should_include_version, fin,
504 std::move(headers), nullptr, maker);
zhongyi32569c62016-01-08 02:54:30505 }
506
alyssar2adf3ac2016-05-03 17:12:58507 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30508 QuicPacketNumber packet_number,
509 QuicStreamId stream_id,
510 bool should_include_version,
511 bool fin,
bnc086b39e12016-06-24 13:05:26512 SpdyHeaderBlock headers,
zhongyi32569c62016-01-08 02:54:30513 QuicStreamOffset* offset) {
alyssar2adf3ac2016-05-03 17:12:58514 return server_maker_.MakeResponseHeadersPacketWithOffsetTracking(
bnc94893a72016-06-30 13:45:25515 packet_number, stream_id, should_include_version, fin,
516 std::move(headers), offset);
zhongyi32569c62016-01-08 02:54:30517 }
518
alyssar2adf3ac2016-05-03 17:12:58519 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30520 QuicPacketNumber packet_number,
521 QuicStreamId stream_id,
522 bool should_include_version,
523 bool fin,
bnc086b39e12016-06-24 13:05:26524 SpdyHeaderBlock headers,
zhongyi32569c62016-01-08 02:54:30525 QuicStreamOffset* offset,
526 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:58527 return server_maker_.MakeResponseHeadersPacketWithOffsetTracking(
bnc94893a72016-06-30 13:45:25528 packet_number, stream_id, should_include_version, fin,
529 std::move(headers), offset);
[email protected]61a527782013-02-21 03:58:00530 }
531
bnc912a04b2016-04-20 14:19:50532 void CreateSession() {
[email protected]4dca587c2013-03-07 16:54:47533 params_.enable_quic = true;
534 params_.quic_clock = clock_;
535 params_.quic_random = &random_generator_;
bnc912a04b2016-04-20 14:19:50536 params_.client_socket_factory = &socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05537 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43538 params_.host_resolver = &host_resolver_;
539 params_.cert_verifier = &cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11540 params_.transport_security_state = &transport_security_state_;
rtenneti052774e2015-11-24 21:00:12541 params_.cert_transparency_verifier = cert_transparency_verifier_.get();
rsleevid6de8302016-06-21 01:33:20542 params_.ct_policy_enforcer = &ct_policy_enforcer_;
tbansalfdf5665b2015-09-21 22:46:40543 params_.socket_performance_watcher_factory =
tbansal0f56a39a2016-04-07 22:03:38544 &test_socket_performance_watcher_factory_;
[email protected]1c04f9522013-02-21 20:32:43545 params_.proxy_service = proxy_service_.get();
546 params_.ssl_config_service = ssl_config_service_.get();
547 params_.http_auth_handler_factory = auth_handler_factory_.get();
bnc525e175a2016-06-20 12:36:40548 params_.http_server_properties = &http_server_properties_;
[email protected]1e960032013-12-20 19:00:20549 params_.quic_supported_versions = SupportedVersions(GetParam());
rch74da0e1a2016-01-14 02:49:32550 for (const char* host :
rch9ae5b3b2016-02-11 00:36:29551 {kDefaultServerHostName, "www.example.org", "news.example.org",
552 "bar.example.org", "foo.example.org", "invalid.example.org",
553 "mail.example.com"}) {
rch74da0e1a2016-01-14 02:49:32554 params_.quic_host_whitelist.insert(host);
555 }
[email protected]61a527782013-02-21 03:58:00556
mmenkee65e7af2015-10-13 17:16:42557 session_.reset(new HttpNetworkSession(params_));
[email protected]11c05872013-08-20 02:04:12558 session_->quic_stream_factory()->set_require_confirmation(false);
rch185ebee2015-07-14 23:56:22559 ASSERT_EQ(params_.quic_socket_receive_buffer_size,
560 session_->quic_stream_factory()->socket_receive_buffer_size());
[email protected]61a527782013-02-21 03:58:00561 }
562
danakjad1777e2016-04-16 00:56:42563 void CheckWasQuicResponse(
564 const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19565 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42566 ASSERT_TRUE(response != nullptr);
567 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19568 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
569 EXPECT_TRUE(response->was_fetched_via_spdy);
570 EXPECT_TRUE(response->was_npn_negotiated);
571 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
572 response->connection_info);
573 }
574
danakjad1777e2016-04-16 00:56:42575 void CheckResponsePort(const std::unique_ptr<HttpNetworkTransaction>& trans,
Avi Drissman13fc8932015-12-20 04:40:46576 uint16_t port) {
bnc62a44f022015-04-02 15:59:41577 const HttpResponseInfo* response = trans->GetResponseInfo();
578 ASSERT_TRUE(response != nullptr);
579 EXPECT_EQ(port, response->socket_address.port());
580 }
581
danakjad1777e2016-04-16 00:56:42582 void CheckWasHttpResponse(
583 const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19584 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42585 ASSERT_TRUE(response != nullptr);
586 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19587 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
588 EXPECT_FALSE(response->was_fetched_via_spdy);
589 EXPECT_FALSE(response->was_npn_negotiated);
590 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1,
591 response->connection_info);
592 }
593
danakjad1777e2016-04-16 00:56:42594 void CheckResponseData(const std::unique_ptr<HttpNetworkTransaction>& trans,
[email protected]aa9b14d2013-05-10 23:45:19595 const std::string& expected) {
596 std::string response_data;
robpercival214763f2016-07-01 23:27:01597 ASSERT_THAT(ReadTransaction(trans.get(), &response_data), IsOk());
[email protected]aa9b14d2013-05-10 23:45:19598 EXPECT_EQ(expected, response_data);
599 }
600
danakjad1777e2016-04-16 00:56:42601 void RunTransaction(const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19602 TestCompletionCallback callback;
603 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
robpercival214763f2016-07-01 23:27:01604 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
605 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]aa9b14d2013-05-10 23:45:19606 }
607
608 void SendRequestAndExpectHttpResponse(const std::string& expected) {
danakjad1777e2016-04-16 00:56:42609 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50610 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
bncffc2fdf2015-05-14 18:29:49611 RunTransaction(trans);
[email protected]aa9b14d2013-05-10 23:45:19612 CheckWasHttpResponse(trans);
bncffc2fdf2015-05-14 18:29:49613 CheckResponseData(trans, expected);
[email protected]aa9b14d2013-05-10 23:45:19614 }
615
616 void SendRequestAndExpectQuicResponse(const std::string& expected) {
rchf114d982015-10-21 01:34:56617 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, 443);
tbansal7cec3812015-02-05 21:25:12618 }
619
bnc62a44f022015-04-02 15:59:41620 void SendRequestAndExpectQuicResponseFromProxyOnPort(
621 const std::string& expected,
Avi Drissman13fc8932015-12-20 04:40:46622 uint16_t port) {
bnc62a44f022015-04-02 15:59:41623 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port);
[email protected]aa9b14d2013-05-10 23:45:19624 }
625
626 void AddQuicAlternateProtocolMapping(
627 MockCryptoClientStream::HandshakeMode handshake_mode) {
628 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
zhongyi3d4a55e72016-04-22 20:36:46629 url::SchemeHostPort server(request_.url);
630 AlternativeService alternative_service(QUIC, server.host(), 443);
bnc7dc7e1b42015-07-28 14:43:12631 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
zhongyi3d4a55e72016-04-22 20:36:46632 http_server_properties_.SetAlternativeService(server, alternative_service,
633 expiration);
[email protected]aa9b14d2013-05-10 23:45:19634 }
635
rchbe69cb902016-02-11 01:10:48636 void AddQuicRemoteAlternativeServiceMapping(
637 MockCryptoClientStream::HandshakeMode handshake_mode,
638 const HostPortPair& alternative) {
639 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
zhongyi3d4a55e72016-04-22 20:36:46640 url::SchemeHostPort server(request_.url);
rchbe69cb902016-02-11 01:10:48641 AlternativeService alternative_service(QUIC, alternative.host(),
642 alternative.port());
643 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
zhongyi3d4a55e72016-04-22 20:36:46644 http_server_properties_.SetAlternativeService(server, alternative_service,
645 expiration);
rchbe69cb902016-02-11 01:10:48646 }
647
[email protected]aa9b14d2013-05-10 23:45:19648 void ExpectBrokenAlternateProtocolMapping() {
zhongyi3d4a55e72016-04-22 20:36:46649 const url::SchemeHostPort server(request_.url);
bncd9b132e2015-07-08 05:16:10650 const AlternativeServiceVector alternative_service_vector =
zhongyi3d4a55e72016-04-22 20:36:46651 http_server_properties_.GetAlternativeServices(server);
bncd9b132e2015-07-08 05:16:10652 EXPECT_EQ(1u, alternative_service_vector.size());
bnc6be245c12015-05-15 11:24:07653 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken(
bncd9b132e2015-07-08 05:16:10654 alternative_service_vector[0]));
[email protected]aa9b14d2013-05-10 23:45:19655 }
656
[email protected]4d590c9c2014-05-02 05:14:33657 void ExpectQuicAlternateProtocolMapping() {
zhongyi3d4a55e72016-04-22 20:36:46658 const url::SchemeHostPort server(request_.url);
bncd9b132e2015-07-08 05:16:10659 const AlternativeServiceVector alternative_service_vector =
zhongyi3d4a55e72016-04-22 20:36:46660 http_server_properties_.GetAlternativeServices(server);
bncd9b132e2015-07-08 05:16:10661 EXPECT_EQ(1u, alternative_service_vector.size());
662 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
[email protected]4d590c9c2014-05-02 05:14:33663 }
664
[email protected]aa9b14d2013-05-10 23:45:19665 void AddHangingNonAlternateProtocolSocketData() {
danakjad1777e2016-04-16 00:56:42666 std::unique_ptr<StaticSocketDataProvider> hanging_data;
zhongyi32569c62016-01-08 02:54:30667 hanging_data.reset(new StaticSocketDataProvider());
[email protected]dda75ab2013-06-22 22:43:30668 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
zhongyi32569c62016-01-08 02:54:30669 hanging_data->set_connect_data(hanging_connect);
670 hanging_data_.push_back(std::move(hanging_data));
671 socket_factory_.AddSocketDataProvider(hanging_data_.back().get());
rchf114d982015-10-21 01:34:56672 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]aa9b14d2013-05-10 23:45:19673 }
674
rtenneti4b06ae72014-08-26 03:43:43675 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
alyssar2adf3ac2016-05-03 17:12:58676 QuicTestPacketMaker client_maker_;
677 QuicTestPacketMaker server_maker_;
danakjad1777e2016-04-16 00:56:42678 std::unique_ptr<HttpNetworkSession> session_;
[email protected]61a527782013-02-21 03:58:00679 MockClientSocketFactory socket_factory_;
rchf114d982015-10-21 01:34:56680 ProofVerifyDetailsChromium verify_details_;
[email protected]e8ff26842013-03-22 21:02:05681 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43682 MockHostResolver host_resolver_;
683 MockCertVerifier cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11684 TransportSecurityState transport_security_state_;
danakjad1777e2016-04-16 00:56:42685 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
rsleevid6de8302016-06-21 01:33:20686 CTPolicyEnforcer ct_policy_enforcer_;
tbansal0f56a39a2016-04-07 22:03:38687 TestSocketPerformanceWatcherFactory test_socket_performance_watcher_factory_;
[email protected]1c04f9522013-02-21 20:32:43688 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
danakjad1777e2016-04-16 00:56:42689 std::unique_ptr<ProxyService> proxy_service_;
690 std::unique_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
[email protected]61a527782013-02-21 03:58:00691 MockRandom random_generator_;
bnc6be245c12015-05-15 11:24:07692 HttpServerPropertiesImpl http_server_properties_;
[email protected]61a527782013-02-21 03:58:00693 HttpNetworkSession::Params params_;
[email protected]aa9b14d2013-05-10 23:45:19694 HttpRequestInfo request_;
vishal.b62985ca92015-04-17 08:45:51695 BoundTestNetLog net_log_;
danakjad1777e2016-04-16 00:56:42696 std::vector<std::unique_ptr<StaticSocketDataProvider>> hanging_data_;
rchf114d982015-10-21 01:34:56697 SSLSocketDataProvider ssl_data_;
tbansal7cec3812015-02-05 21:25:12698
699 private:
700 void SendRequestAndExpectQuicResponseMaybeFromProxy(
701 const std::string& expected,
bnc62a44f022015-04-02 15:59:41702 bool used_proxy,
Avi Drissman13fc8932015-12-20 04:40:46703 uint16_t port) {
danakjad1777e2016-04-16 00:56:42704 std::unique_ptr<HttpNetworkTransaction> trans(
tbansal7cec3812015-02-05 21:25:12705 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
ryansturm49a8cb12016-06-15 16:51:09706 HeadersHandler headers_handler;
707 trans->SetBeforeHeadersSentCallback(
708 base::Bind(&HeadersHandler::OnBeforeHeadersSent,
709 base::Unretained(&headers_handler)));
bncffc2fdf2015-05-14 18:29:49710 RunTransaction(trans);
tbansal7cec3812015-02-05 21:25:12711 CheckWasQuicResponse(trans);
bnc62a44f022015-04-02 15:59:41712 CheckResponsePort(trans, port);
bncffc2fdf2015-05-14 18:29:49713 CheckResponseData(trans, expected);
ryansturm49a8cb12016-06-15 16:51:09714 EXPECT_EQ(used_proxy, headers_handler.was_proxied());
tbansal7cec3812015-02-05 21:25:12715 }
[email protected]61a527782013-02-21 03:58:00716};
717
rjshaded5ced072015-12-18 19:26:02718INSTANTIATE_TEST_CASE_P(Version,
719 QuicNetworkTransactionTest,
[email protected]1e960032013-12-20 19:00:20720 ::testing::ValuesIn(QuicSupportedVersions()));
721
722TEST_P(QuicNetworkTransactionTest, ForceQuic) {
rtenneti8a2f4632016-03-21 20:26:57723 params_.origins_to_force_quic_on.insert(
724 HostPortPair::FromString("mail.example.org:443"));
[email protected]4dca587c2013-03-07 16:54:47725
[email protected]1e960032013-12-20 19:00:20726 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58727 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
728 1, kClientDataStreamId1, true, true,
729 GetRequestHeaders("GET", "https", "/")));
730 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:02731 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58732 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
733 false, true, 0, "hello!"));
734 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:59735 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
[email protected]4dca587c2013-03-07 16:54:47736
rcha5399e02015-04-21 19:32:04737 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4dca587c2013-03-07 16:54:47738
rtennetib8e80fb2016-05-16 00:12:09739 // The non-alternate protocol job needs to hang in order to guarantee that
740 // the alternate-protocol job will "win".
741 AddHangingNonAlternateProtocolSocketData();
742
[email protected]4dca587c2013-03-07 16:54:47743 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47744
tbansal0f56a39a2016-04-07 22:03:38745 EXPECT_FALSE(
746 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]aa9b14d2013-05-10 23:45:19747 SendRequestAndExpectQuicResponse("hello!");
tbansal0f56a39a2016-04-07 22:03:38748 EXPECT_TRUE(
749 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]4dca587c2013-03-07 16:54:47750
[email protected]98b20ce2013-05-10 05:55:26751 // Check that the NetLog was filled reasonably.
mmenke43758e62015-05-04 21:09:46752 TestNetLogEntry::List entries;
[email protected]aa9b14d2013-05-10 23:45:19753 net_log_.GetEntries(&entries);
[email protected]98b20ce2013-05-10 05:55:26754 EXPECT_LT(0u, entries.size());
755
756 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29757 int pos = ExpectLogContainsSomewhere(
758 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
759 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26760 EXPECT_LT(0, pos);
761
rchfd527212015-08-25 00:41:26762 // ... and also a TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29763 pos = ExpectLogContainsSomewhere(
rchfd527212015-08-25 00:41:26764 entries, 0,
765 NetLog::TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED,
ttuttle859dc7a2015-04-23 19:42:29766 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26767 EXPECT_LT(0, pos);
768
rtennetia004d332015-08-28 06:44:57769 std::string packet_number;
770 ASSERT_TRUE(entries[pos].GetStringValue("packet_number", &packet_number));
771 EXPECT_EQ("1", packet_number);
[email protected]98b20ce2013-05-10 05:55:26772
rchfd527212015-08-25 00:41:26773 // ... and also a TYPE_QUIC_SESSION_PACKET_AUTHENTICATED.
774 pos = ExpectLogContainsSomewhere(
775 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_AUTHENTICATED,
776 NetLog::PHASE_NONE);
777 EXPECT_LT(0, pos);
778
[email protected]98b20ce2013-05-10 05:55:26779 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29780 pos = ExpectLogContainsSomewhere(
781 entries, 0, NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
782 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26783 EXPECT_LT(0, pos);
784
785 int log_stream_id;
786 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
[email protected]1e960032013-12-20 19:00:20787 EXPECT_EQ(3, log_stream_id);
[email protected]4dca587c2013-03-07 16:54:47788}
789
[email protected]cf3e3cd62014-02-05 16:16:16790TEST_P(QuicNetworkTransactionTest, QuicProxy) {
tbansal9bf26672016-05-11 18:32:45791 params_.enable_quic = true;
rchf114d982015-10-21 01:34:56792 proxy_service_ =
rch9ae5b3b2016-02-11 00:36:29793 ProxyService::CreateFixedFromPacResult("QUIC mail.example.org:70");
[email protected]cf3e3cd62014-02-05 16:16:16794
[email protected]cf3e3cd62014-02-05 16:16:16795 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58796 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
797 1, kClientDataStreamId1, true, true,
798 GetRequestHeaders("GET", "http", "/")));
799 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:02800 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58801 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
802 false, true, 0, "hello!"));
803 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50804 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59805 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]cf3e3cd62014-02-05 16:16:16806
rcha5399e02015-04-21 19:32:04807 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cf3e3cd62014-02-05 16:16:16808
tbansal0f56a39a2016-04-07 22:03:38809 EXPECT_FALSE(
810 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16811 // There is no need to set up an alternate protocol job, because
812 // no attempt will be made to speak to the proxy over TCP.
813
rch9ae5b3b2016-02-11 00:36:29814 request_.url = GURL("http://mail.example.org/");
[email protected]cf3e3cd62014-02-05 16:16:16815 CreateSession();
816
bnc62a44f022015-04-02 15:59:41817 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
tbansal0f56a39a2016-04-07 22:03:38818 EXPECT_TRUE(
819 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16820}
821
bnc313ba9c2015-06-11 15:42:31822// Regression test for https://crbug.com/492458. Test that for an HTTP
823// connection through a QUIC proxy, the certificate exhibited by the proxy is
824// checked against the proxy hostname, not the origin hostname.
825TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) {
rch9ae5b3b2016-02-11 00:36:29826 const std::string origin_host = "mail.example.com";
bnc313ba9c2015-06-11 15:42:31827 const std::string proxy_host = "www.example.org";
828
tbansal9bf26672016-05-11 18:32:45829 params_.enable_quic = true;
rdsmith82957ad2015-09-16 19:42:03830 proxy_service_ =
831 ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70");
bnc313ba9c2015-06-11 15:42:31832
alyssar2adf3ac2016-05-03 17:12:58833 client_maker_.set_hostname(origin_host);
bnc313ba9c2015-06-11 15:42:31834 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58835 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
836 1, kClientDataStreamId1, true, true,
837 GetRequestHeaders("GET", "http", "/")));
838 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc313ba9c2015-06-11 15:42:31839 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58840 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
841 false, true, 0, "hello!"));
842 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50843 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59844 mock_quic_data.AddRead(ASYNC, 0);
bnc313ba9c2015-06-11 15:42:31845 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
846
847 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29848 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bnc313ba9c2015-06-11 15:42:31849 ASSERT_TRUE(cert.get());
850 // This certificate is valid for the proxy, but not for the origin.
851 bool common_name_fallback_used;
852 EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used));
853 EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used));
854 ProofVerifyDetailsChromium verify_details;
855 verify_details.cert_verify_result.verified_cert = cert;
856 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rchf114d982015-10-21 01:34:56857 ProofVerifyDetailsChromium verify_details2;
858 verify_details2.cert_verify_result.verified_cert = cert;
859 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
bnc313ba9c2015-06-11 15:42:31860
861 request_.url = GURL("http://" + origin_host);
rtennetib8e80fb2016-05-16 00:12:09862 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32863 CreateSession();
bnc313ba9c2015-06-11 15:42:31864 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
865 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
866}
867
rchbe69cb902016-02-11 01:10:48868TEST_P(QuicNetworkTransactionTest, AlternativeServicesDifferentHost) {
rchbe69cb902016-02-11 01:10:48869 HostPortPair origin("www.example.org", 443);
870 HostPortPair alternative("mail.example.org", 443);
871
872 base::FilePath certs_dir = GetTestCertsDirectory();
873 scoped_refptr<X509Certificate> cert(
874 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
875 ASSERT_TRUE(cert.get());
876 // TODO(rch): the connection should be "to" the origin, so if the cert is
877 // valid for the origin but not the alternative, that should work too.
878 bool common_name_fallback_used;
879 EXPECT_TRUE(cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
880 EXPECT_TRUE(
881 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
882 ProofVerifyDetailsChromium verify_details;
883 verify_details.cert_verify_result.verified_cert = cert;
884 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
885
alyssar2adf3ac2016-05-03 17:12:58886 client_maker_.set_hostname(origin.host());
rchbe69cb902016-02-11 01:10:48887 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58888 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
889 1, kClientDataStreamId1, true, true,
890 GetRequestHeaders("GET", "https", "/")));
891 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rchbe69cb902016-02-11 01:10:48892 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58893 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
894 false, true, 0, "hello!"));
895 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchbe69cb902016-02-11 01:10:48896 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
897 mock_quic_data.AddRead(ASYNC, 0);
898 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
899
900 request_.url = GURL("https://" + origin.host());
901 AddQuicRemoteAlternativeServiceMapping(
902 MockCryptoClientStream::CONFIRM_HANDSHAKE, alternative);
rtennetib8e80fb2016-05-16 00:12:09903 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32904 CreateSession();
rchbe69cb902016-02-11 01:10:48905
906 SendRequestAndExpectQuicResponse("hello!");
907}
908
[email protected]1e960032013-12-20 19:00:20909TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
rtenneti8a2f4632016-03-21 20:26:57910 params_.origins_to_force_quic_on.insert(
911 HostPortPair::FromString("mail.example.org:443"));
[email protected]cebe3282013-05-22 23:49:30912
tbansalfdf5665b2015-09-21 22:46:40913 MockQuicData mock_quic_data1;
914 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
[email protected]1e960032013-12-20 19:00:20915
tbansalfdf5665b2015-09-21 22:46:40916 MockQuicData mock_quic_data2;
zhongyi32569c62016-01-08 02:54:30917 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40918 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
rch6faa4d42016-01-05 20:48:43919 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40920
921 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
922 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
[email protected]cebe3282013-05-22 23:49:30923
924 CreateSession();
925
tbansal0f56a39a2016-04-07 22:03:38926 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40927 for (size_t i = 0; i < 2; ++i) {
danakjad1777e2016-04-16 00:56:42928 std::unique_ptr<HttpNetworkTransaction> trans(
tbansalfdf5665b2015-09-21 22:46:40929 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
930 TestCompletionCallback callback;
931 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
robpercival214763f2016-07-01 23:27:01932 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
933 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_CLOSED));
tbansal0f56a39a2016-04-07 22:03:38934 EXPECT_EQ(1 + i, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40935 }
[email protected]cebe3282013-05-22 23:49:30936}
937
tbansalc8a94ea2015-11-02 23:58:51938TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
939 // Attempt to "force" quic on 443, which will not be honored.
rtenneti8a2f4632016-03-21 20:26:57940 params_.origins_to_force_quic_on.insert(
941 HostPortPair::FromString("www.google.com:443"));
tbansalc8a94ea2015-11-02 23:58:51942
943 MockRead http_reads[] = {
944 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
945 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
946 MockRead(ASYNC, OK)};
947
948 StaticSocketDataProvider data(http_reads, arraysize(http_reads), nullptr, 0);
949 socket_factory_.AddSocketDataProvider(&data);
950 SSLSocketDataProvider ssl(ASYNC, OK);
951 socket_factory_.AddSSLSocketDataProvider(&ssl);
952
953 CreateSession();
954
955 SendRequestAndExpectHttpResponse("hello world");
tbansal0f56a39a2016-04-07 22:03:38956 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalc8a94ea2015-11-02 23:58:51957}
958
bncc958faa2015-07-31 18:14:52959TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52960 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56961 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
962 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52963 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
964 MockRead(ASYNC, OK)};
965
966 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
967 0);
968 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56969 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52970
971 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58972 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
973 1, kClientDataStreamId1, true, true,
974 GetRequestHeaders("GET", "https", "/")));
975 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:52976 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58977 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
978 false, true, 0, "hello!"));
979 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:52980 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59981 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52982
983 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
984
rtennetib8e80fb2016-05-16 00:12:09985 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32986 CreateSession();
bncc958faa2015-07-31 18:14:52987
988 SendRequestAndExpectHttpResponse("hello world");
989 SendRequestAndExpectQuicResponse("hello!");
990}
991
rchf47265dc2016-03-21 21:33:12992TEST_P(QuicNetworkTransactionTest,
993 UseAlternativeServiceWithProbabilityForQuic) {
994 MockRead http_reads[] = {
995 MockRead("HTTP/1.1 200 OK\r\n"),
996 MockRead(kQuicAlternativeServiceWithProbabilityHeader),
997 MockRead("hello world"),
998 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
999 MockRead(ASYNC, OK)};
1000
1001 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1002 0);
1003 socket_factory_.AddSocketDataProvider(&http_data);
1004 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1005
1006 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581007 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1008 1, kClientDataStreamId1, true, true,
1009 GetRequestHeaders("GET", "https", "/")));
1010 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rchf47265dc2016-03-21 21:33:121011 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581012 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1013 false, true, 0, "hello!"));
1014 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchf47265dc2016-03-21 21:33:121015 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1016 mock_quic_data.AddRead(ASYNC, 0); // EOF
1017
1018 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1019
rtennetib8e80fb2016-05-16 00:12:091020 AddHangingNonAlternateProtocolSocketData();
rchf47265dc2016-03-21 21:33:121021 CreateSession();
1022
1023 SendRequestAndExpectHttpResponse("hello world");
1024 SendRequestAndExpectQuicResponse("hello!");
1025}
1026
zhongyi3d4a55e72016-04-22 20:36:461027TEST_P(QuicNetworkTransactionTest, SetAlternativeServiceWithScheme) {
1028 MockRead http_reads[] = {
1029 MockRead("HTTP/1.1 200 OK\r\n"),
1030 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
1031 MockRead("hello world"),
1032 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1033 MockRead(ASYNC, OK)};
1034
1035 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1036 0);
1037
1038 socket_factory_.AddSocketDataProvider(&http_data);
1039 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1040
1041 CreateSession();
bncb26024382016-06-29 02:39:451042 // Send https request, ignore alternative service advertising if response
zhongyi3d4a55e72016-04-22 20:36:461043 // header advertises alternative service for mail.example.org.
bncb26024382016-06-29 02:39:451044 request_.url = GURL("https://mail.example.org:443");
zhongyi3d4a55e72016-04-22 20:36:461045 SendRequestAndExpectHttpResponse("hello world");
bnc525e175a2016-06-20 12:36:401046 HttpServerProperties* http_server_properties =
zhongyi3d4a55e72016-04-22 20:36:461047 session_->http_server_properties();
1048 url::SchemeHostPort http_server("http", "mail.example.org", 443);
1049 url::SchemeHostPort https_server("https", "mail.example.org", 443);
1050 // Check alternative service is set for the correct origin.
zhongyi3d4a55e72016-04-22 20:36:461051 EXPECT_EQ(
bncb26024382016-06-29 02:39:451052 2u, http_server_properties->GetAlternativeServices(https_server).size());
1053 EXPECT_TRUE(
1054 http_server_properties->GetAlternativeServices(http_server).empty());
zhongyi3d4a55e72016-04-22 20:36:461055}
1056
1057TEST_P(QuicNetworkTransactionTest, DoNotGetAltSvcForDifferentOrigin) {
1058 MockRead http_reads[] = {
1059 MockRead("HTTP/1.1 200 OK\r\n"),
1060 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
1061 MockRead("hello world"),
1062 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1063 MockRead(ASYNC, OK)};
1064
1065 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1066 0);
1067
1068 socket_factory_.AddSocketDataProvider(&http_data);
1069 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1070 socket_factory_.AddSocketDataProvider(&http_data);
1071 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1072
1073 CreateSession();
1074
1075 // Send https request and set alternative services if response header
1076 // advertises alternative service for mail.example.org.
1077 SendRequestAndExpectHttpResponse("hello world");
bnc525e175a2016-06-20 12:36:401078 HttpServerProperties* http_server_properties =
zhongyi3d4a55e72016-04-22 20:36:461079 session_->http_server_properties();
1080
1081 const url::SchemeHostPort https_server(request_.url);
1082 // Check alternative service is set.
1083 AlternativeServiceVector alternative_service_vector =
1084 http_server_properties->GetAlternativeServices(https_server);
1085 EXPECT_EQ(2u, alternative_service_vector.size());
1086
1087 // Send http request to the same origin but with diffrent scheme, should not
1088 // use QUIC.
1089 request_.url = GURL("http://mail.example.org:443");
1090 SendRequestAndExpectHttpResponse("hello world");
1091}
1092
bnc8be55ebb2015-10-30 14:12:071093TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) {
1094 std::string altsvc_header = base::StringPrintf(
1095 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam());
1096 MockRead http_reads[] = {
1097 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1098 MockRead("hello world"),
1099 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1100 MockRead(ASYNC, OK)};
1101
1102 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1103 0);
1104 socket_factory_.AddSocketDataProvider(&http_data);
1105 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1106
1107 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581108 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1109 1, kClientDataStreamId1, true, true,
1110 GetRequestHeaders("GET", "https", "/")));
1111 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc8be55ebb2015-10-30 14:12:071112 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581113 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1114 false, true, 0, "hello!"));
1115 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bnc8be55ebb2015-10-30 14:12:071116 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591117 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc8be55ebb2015-10-30 14:12:071118
1119 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1120
rtennetib8e80fb2016-05-16 00:12:091121 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321122 CreateSession();
bnc8be55ebb2015-10-30 14:12:071123
1124 SendRequestAndExpectHttpResponse("hello world");
1125 SendRequestAndExpectQuicResponse("hello!");
1126}
1127
zhongyi6b5a3892016-03-12 04:46:201128TEST_P(QuicNetworkTransactionTest, GoAwayWithConnectionMigrationOnPortsOnly) {
1129 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581130 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1131 1, kClientDataStreamId1, true, true,
1132 GetRequestHeaders("GET", "https", "/")));
1133 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi6b5a3892016-03-12 04:46:201134 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1135 // Read a GoAway packet with
1136 // QuicErrorCode: QUIC_ERROR_MIGRATING_PORT from the peer.
alyssar2adf3ac2016-05-03 17:12:581137 mock_quic_data.AddRead(ConstructServerGoAwayPacket(
1138 2, QUIC_ERROR_MIGRATING_PORT,
1139 "connection migration with port change only"));
1140 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
1141 mock_quic_data.AddRead(ConstructServerDataPacket(3, kClientDataStreamId1,
1142 false, true, 0, "hello!"));
1143 mock_quic_data.AddWrite(ConstructClientAckAndRstPacket(
zhongyi6b5a3892016-03-12 04:46:201144 3, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 3, 3, 1));
1145 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1146 mock_quic_data.AddRead(ASYNC, 0); // EOF
1147
1148 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1149
1150 // The non-alternate protocol job needs to hang in order to guarantee that
1151 // the alternate-protocol job will "win".
1152 AddHangingNonAlternateProtocolSocketData();
1153
1154 // In order for a new QUIC session to be established via alternate-protocol
1155 // without racing an HTTP connection, we need the host resolution to happen
1156 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1157 // connection to the the server, in this test we require confirmation
1158 // before encrypting so the HTTP job will still start.
1159 host_resolver_.set_synchronous_mode(true);
1160 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1161 "");
1162 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1163 AddressList address;
1164 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1165 nullptr, net_log_.bound());
1166
1167 CreateSession();
1168 session_->quic_stream_factory()->set_require_confirmation(true);
1169 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1170
danakjad1777e2016-04-16 00:56:421171 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyi6b5a3892016-03-12 04:46:201172 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1173 TestCompletionCallback callback;
1174 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
robpercival214763f2016-07-01 23:27:011175 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
zhongyi6b5a3892016-03-12 04:46:201176
1177 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1178 QuicSession::HANDSHAKE_CONFIRMED);
robpercival214763f2016-07-01 23:27:011179 EXPECT_THAT(callback.WaitForResult(), IsOk());
zhongyi6b5a3892016-03-12 04:46:201180
1181 // Check whether this transaction is correctly marked as received a go-away
1182 // because of migrating port.
1183 NetErrorDetails details;
1184 EXPECT_FALSE(details.quic_port_migration_detected);
1185 trans->PopulateNetErrorDetails(&details);
1186 EXPECT_TRUE(details.quic_port_migration_detected);
1187}
1188
bnc8be55ebb2015-10-30 14:12:071189TEST_P(QuicNetworkTransactionTest,
1190 DoNotUseAlternativeServiceQuicUnsupportedVersion) {
1191 std::string altsvc_header = base::StringPrintf(
1192 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam() - 1);
1193 MockRead http_reads[] = {
1194 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1195 MockRead("hello world"),
1196 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1197 MockRead(ASYNC, OK)};
1198
1199 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1200 0);
1201 socket_factory_.AddSocketDataProvider(&http_data);
1202 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1203 socket_factory_.AddSocketDataProvider(&http_data);
1204 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1205
rch3f4b8452016-02-23 16:59:321206 CreateSession();
bnc8be55ebb2015-10-30 14:12:071207
1208 SendRequestAndExpectHttpResponse("hello world");
1209 SendRequestAndExpectHttpResponse("hello world");
1210}
1211
bncc958faa2015-07-31 18:14:521212// When multiple alternative services are advertised,
zhongyi32569c62016-01-08 02:54:301213// HttpStreamFactoryImpl::RequestStreamInternal() should select the alternative
1214// service which uses existing QUIC session if available. If no existing QUIC
1215// session can be used, use the first alternative service from the list.
1216TEST_P(QuicNetworkTransactionTest, UseExistingAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:521217 MockRead http_reads[] = {
1218 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291219 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
bncc958faa2015-07-31 18:14:521220 MockRead("hello world"),
1221 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1222 MockRead(ASYNC, OK)};
1223
1224 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1225 0);
1226 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561227 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521228
zhongyi32569c62016-01-08 02:54:301229 QuicStreamOffset request_header_offset = 0;
1230 QuicStreamOffset response_header_offset = 0;
1231 // First QUIC request data.
rch9ae5b3b2016-02-11 00:36:291232 // Open a session to foo.example.org:443 using the first entry of the
zhongyi32569c62016-01-08 02:54:301233 // alternative service list.
bncc958faa2015-07-31 18:14:521234 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581235 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301236 1, kClientDataStreamId1, true, true,
1237 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1238
1239 std::string alt_svc_list =
rch9ae5b3b2016-02-11 00:36:291240 "quic=\"mail.example.org:444\", quic=\"foo.example.org:443\", "
1241 "quic=\"bar.example.org:445\"";
alyssar2adf3ac2016-05-03 17:12:581242 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301243 1, kClientDataStreamId1, false, false,
1244 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581245 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1246 false, true, 0, "hello!"));
1247 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301248
1249 // Second QUIC request data.
1250 // Connection pooling, using existing session, no need to include version
1251 // as version negotiation has been completed.
alyssar2adf3ac2016-05-03 17:12:581252 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301253 3, kClientDataStreamId2, false, true,
1254 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581255 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301256 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1257 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581258 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1259 false, true, 0, "hello!"));
1260 mock_quic_data.AddWrite(
1261 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
bncc958faa2015-07-31 18:14:521262 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591263 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521264
1265 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1266
rtennetib8e80fb2016-05-16 00:12:091267 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321268 CreateSession();
bncc958faa2015-07-31 18:14:521269
1270 SendRequestAndExpectHttpResponse("hello world");
zhongyi32569c62016-01-08 02:54:301271
bnc359ed2a2016-04-29 20:43:451272 SendRequestAndExpectQuicResponse("hello!");
1273 SendRequestAndExpectQuicResponse("hello!");
zhongyi32569c62016-01-08 02:54:301274}
1275
bnc359ed2a2016-04-29 20:43:451276// Pool to existing session with matching QuicServerId
1277// even if alternative service destination is different.
1278TEST_P(QuicNetworkTransactionTest, PoolByOrigin) {
zhongyi32569c62016-01-08 02:54:301279 MockQuicData mock_quic_data;
bnc359ed2a2016-04-29 20:43:451280 QuicStreamOffset request_header_offset(0);
1281 QuicStreamOffset response_header_offset(0);
1282
1283 // First request.
alyssar2adf3ac2016-05-03 17:12:581284 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301285 1, kClientDataStreamId1, true, true,
1286 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581287 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451288 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1289 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581290 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1291 false, true, 0, "hello!"));
1292 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301293
bnc359ed2a2016-04-29 20:43:451294 // Second request.
alyssar2adf3ac2016-05-03 17:12:581295 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301296 3, kClientDataStreamId2, false, true,
1297 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581298 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301299 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1300 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581301 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1302 false, true, 0, "hello!"));
1303 mock_quic_data.AddWrite(
1304 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
zhongyi32569c62016-01-08 02:54:301305 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1306 mock_quic_data.AddRead(ASYNC, 0); // EOF
1307
1308 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bnc359ed2a2016-04-29 20:43:451309
1310 AddHangingNonAlternateProtocolSocketData();
1311 AddHangingNonAlternateProtocolSocketData();
zhongyi32569c62016-01-08 02:54:301312
rch3f4b8452016-02-23 16:59:321313 CreateSession();
zhongyi32569c62016-01-08 02:54:301314
bnc359ed2a2016-04-29 20:43:451315 const char destination1[] = "first.example.com";
1316 const char destination2[] = "second.example.com";
1317
1318 // Set up alternative service entry to destination1.
1319 url::SchemeHostPort server(request_.url);
1320 AlternativeService alternative_service(QUIC, destination1, 443);
1321 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1322 http_server_properties_.SetAlternativeService(server, alternative_service,
1323 expiration);
1324 // First request opens connection to |destination1|
1325 // with QuicServerId.host() == kDefaultServerHostName.
1326 SendRequestAndExpectQuicResponse("hello!");
1327
1328 // Set up alternative service entry to a different destination.
1329 alternative_service = AlternativeService(QUIC, destination2, 443);
1330 http_server_properties_.SetAlternativeService(server, alternative_service,
1331 expiration);
1332 // Second request pools to existing connection with same QuicServerId,
1333 // even though alternative service destination is different.
1334 SendRequestAndExpectQuicResponse("hello!");
1335}
1336
1337// Pool to existing session with matching destination and matching certificate
1338// even if origin is different, and even if the alternative service with
1339// matching destination is not the first one on the list.
1340TEST_P(QuicNetworkTransactionTest, PoolByDestination) {
1341 GURL origin1 = request_.url;
1342 GURL origin2("https://www.example.org/");
1343 ASSERT_NE(origin1.host(), origin2.host());
1344
1345 MockQuicData mock_quic_data;
1346 QuicStreamOffset request_header_offset(0);
1347 QuicStreamOffset response_header_offset(0);
1348
1349 // First request.
alyssar2adf3ac2016-05-03 17:12:581350 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:451351 1, kClientDataStreamId1, true, true,
1352 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581353 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451354 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1355 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581356 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1357 false, true, 0, "hello!"));
1358 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bnc359ed2a2016-04-29 20:43:451359
1360 // Second request.
alyssar2adf3ac2016-05-03 17:12:581361 QuicTestPacketMaker client_maker2(GetParam(), 0, clock_, origin2.host(),
1362 Perspective::IS_CLIENT);
1363 QuicTestPacketMaker server_maker2(GetParam(), 0, clock_, origin2.host(),
1364 Perspective::IS_SERVER);
1365 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:451366 3, kClientDataStreamId2, false, true,
alyssar2adf3ac2016-05-03 17:12:581367 GetRequestHeaders("GET", "https", "/", &client_maker2),
1368 &request_header_offset, &client_maker2));
1369 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451370 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
alyssar2adf3ac2016-05-03 17:12:581371 &response_header_offset, &server_maker2));
1372 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1373 false, true, 0, "hello!"));
1374 mock_quic_data.AddWrite(
1375 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
bnc359ed2a2016-04-29 20:43:451376 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1377 mock_quic_data.AddRead(ASYNC, 0); // EOF
1378
1379 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1380
1381 AddHangingNonAlternateProtocolSocketData();
1382 AddHangingNonAlternateProtocolSocketData();
1383
1384 CreateSession();
1385
1386 const char destination1[] = "first.example.com";
1387 const char destination2[] = "second.example.com";
1388
1389 // Set up alternative service for |origin1|.
1390 AlternativeService alternative_service1(QUIC, destination1, 443);
1391 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1392 http_server_properties_.SetAlternativeService(
1393 url::SchemeHostPort(origin1), alternative_service1, expiration);
1394
1395 // Set up multiple alternative service entries for |origin2|,
1396 // the first one with a different destination as for |origin1|,
1397 // the second one with the same. The second one should be used,
1398 // because the request can be pooled to that one.
1399 AlternativeService alternative_service2(QUIC, destination2, 443);
1400 AlternativeServiceInfoVector alternative_services;
1401 alternative_services.push_back(
1402 AlternativeServiceInfo(alternative_service2, expiration));
1403 alternative_services.push_back(
1404 AlternativeServiceInfo(alternative_service1, expiration));
1405 http_server_properties_.SetAlternativeServices(url::SchemeHostPort(origin2),
1406 alternative_services);
bnc359ed2a2016-04-29 20:43:451407 // First request opens connection to |destination1|
1408 // with QuicServerId.host() == origin1.host().
1409 SendRequestAndExpectQuicResponse("hello!");
1410
1411 // Second request pools to existing connection with same destination,
1412 // because certificate matches, even though QuicServerId is different.
1413 request_.url = origin2;
alyssar2adf3ac2016-05-03 17:12:581414
bnc359ed2a2016-04-29 20:43:451415 SendRequestAndExpectQuicResponse("hello!");
zhongyi32569c62016-01-08 02:54:301416}
1417
1418// Multiple origins have listed the same alternative services. When there's a
1419// existing QUIC session opened by a request to other origin,
1420// if the cert is valid, should select this QUIC session to make the request
1421// if this is also the first existing QUIC session.
1422TEST_P(QuicNetworkTransactionTest,
1423 UseSharedExistingAlternativeServiceForQuicWithValidCert) {
rch9ae5b3b2016-02-11 00:36:291424 // Default cert is valid for *.example.org
zhongyi32569c62016-01-08 02:54:301425
rch9ae5b3b2016-02-11 00:36:291426 // HTTP data for request to www.example.org.
zhongyi32569c62016-01-08 02:54:301427 MockRead http_reads[] = {
1428 MockRead("HTTP/1.1 200 OK\r\n"),
1429 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
rch9ae5b3b2016-02-11 00:36:291430 MockRead("hello world from www.example.org"),
zhongyi32569c62016-01-08 02:54:301431 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1432 MockRead(ASYNC, OK)};
1433
1434 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1435 0);
1436 socket_factory_.AddSocketDataProvider(&http_data);
1437 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1438
1439 // HTTP data for request to mail.example.org.
1440 MockRead http_reads2[] = {
1441 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291442 MockRead("Alt-Svc: quic=\":444\", quic=\"www.example.org:443\"\r\n\r\n"),
zhongyi32569c62016-01-08 02:54:301443 MockRead("hello world from mail.example.org"),
1444 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1445 MockRead(ASYNC, OK)};
1446
1447 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1448 nullptr, 0);
1449 socket_factory_.AddSocketDataProvider(&http_data2);
1450 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1451
1452 QuicStreamOffset request_header_offset = 0;
1453 QuicStreamOffset response_header_offset = 0;
1454
alyssar2adf3ac2016-05-03 17:12:581455 QuicTestPacketMaker client_maker(GetParam(), 0, clock_, "mail.example.org",
1456 Perspective::IS_CLIENT);
1457 server_maker_.set_hostname("www.example.org");
1458 client_maker_.set_hostname("www.example.org");
zhongyi32569c62016-01-08 02:54:301459 MockQuicData mock_quic_data;
1460
1461 // First QUIC request data.
alyssar2adf3ac2016-05-03 17:12:581462 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301463 1, kClientDataStreamId1, true, true,
1464 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1465
alyssar2adf3ac2016-05-03 17:12:581466 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301467 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1468 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581469 mock_quic_data.AddRead(ConstructServerDataPacket(
1470 2, kClientDataStreamId1, false, true, 0, "hello from mail QUIC!"));
1471 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301472 // Second QUIC request data.
alyssar2adf3ac2016-05-03 17:12:581473 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301474 3, kClientDataStreamId2, false, true,
alyssar2adf3ac2016-05-03 17:12:581475 GetRequestHeaders("GET", "https", "/", &client_maker),
1476 &request_header_offset, &client_maker));
1477 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301478 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1479 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581480 mock_quic_data.AddRead(ConstructServerDataPacket(
1481 4, kClientDataStreamId2, false, true, 0, "hello from mail QUIC!"));
1482 mock_quic_data.AddWrite(
1483 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
zhongyi32569c62016-01-08 02:54:301484 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1485 mock_quic_data.AddRead(ASYNC, 0); // EOF
1486
1487 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
zhongyi32569c62016-01-08 02:54:301488
rtennetib8e80fb2016-05-16 00:12:091489 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321490 CreateSession();
zhongyi32569c62016-01-08 02:54:301491
1492 // Send two HTTP requests, responses set up alt-svc lists for the origins.
rch9ae5b3b2016-02-11 00:36:291493 request_.url = GURL("https://www.example.org/");
1494 SendRequestAndExpectHttpResponse("hello world from www.example.org");
zhongyi32569c62016-01-08 02:54:301495 request_.url = GURL("https://mail.example.org/");
1496 SendRequestAndExpectHttpResponse("hello world from mail.example.org");
1497
rch9ae5b3b2016-02-11 00:36:291498 // Open a QUIC session to mail.example.org:443 when making request
1499 // to mail.example.org.
1500 request_.url = GURL("https://www.example.org/");
bnc359ed2a2016-04-29 20:43:451501 SendRequestAndExpectQuicResponse("hello from mail QUIC!");
zhongyi32569c62016-01-08 02:54:301502
rch9ae5b3b2016-02-11 00:36:291503 // Uses the existing QUIC session when making request to www.example.org.
zhongyi32569c62016-01-08 02:54:301504 request_.url = GURL("https://mail.example.org/");
bnc359ed2a2016-04-29 20:43:451505 SendRequestAndExpectQuicResponse("hello from mail QUIC!");
bncc958faa2015-07-31 18:14:521506}
1507
1508TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) {
bncc958faa2015-07-31 18:14:521509 MockRead http_reads[] = {
1510 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561511 MockRead(kQuicAlternativeServiceDifferentPortHeader),
bncc958faa2015-07-31 18:14:521512 MockRead("hello world"),
1513 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1514 MockRead(ASYNC, OK)};
1515
1516 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1517 0);
1518 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561519 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521520
rtennetib8e80fb2016-05-16 00:12:091521 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321522 CreateSession();
bncc958faa2015-07-31 18:14:521523
1524 SendRequestAndExpectHttpResponse("hello world");
bnc359ed2a2016-04-29 20:43:451525
1526 url::SchemeHostPort http_server("https", kDefaultServerHostName, 443);
1527 AlternativeServiceVector alternative_service_vector =
1528 http_server_properties_.GetAlternativeServices(http_server);
1529 ASSERT_EQ(1u, alternative_service_vector.size());
1530 const AlternativeService alternative_service = alternative_service_vector[0];
1531 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
1532 EXPECT_EQ(kDefaultServerHostName, alternative_service_vector[0].host);
1533 EXPECT_EQ(137, alternative_service_vector[0].port);
bncc958faa2015-07-31 18:14:521534}
1535
1536TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) {
bncc958faa2015-07-31 18:14:521537 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561538 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1539 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521540 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1541 MockRead(ASYNC, OK)};
1542
1543 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1544 0);
1545 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561546 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521547
1548 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581549 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1550 1, kClientDataStreamId1, true, true,
1551 GetRequestHeaders("GET", "https", "/")));
1552 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:521553 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581554 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1555 false, true, 0, "hello!"));
1556 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:521557 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1558 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521559
1560 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1561
rtennetib8e80fb2016-05-16 00:12:091562 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321563 CreateSession();
bncc958faa2015-07-31 18:14:521564
1565 AlternativeService alternative_service(QUIC,
1566 HostPortPair::FromURL(request_.url));
1567 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
1568 alternative_service);
1569 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1570 alternative_service));
1571
1572 SendRequestAndExpectHttpResponse("hello world");
1573 SendRequestAndExpectQuicResponse("hello!");
1574
mmenkee24011922015-12-17 22:12:591575 mock_quic_data.Resume();
bncc958faa2015-07-31 18:14:521576
1577 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1578 alternative_service));
1579}
1580
bncc958faa2015-07-31 18:14:521581TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) {
bncc958faa2015-07-31 18:14:521582 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561583 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1584 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521585 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1586 MockRead(ASYNC, OK)};
1587
1588 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1589 0);
1590 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561591 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521592
1593 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581594 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1595 1, kClientDataStreamId1, true, true,
1596 GetRequestHeaders("GET", "https", "/")));
1597 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:521598 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581599 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1600 false, true, 0, "hello!"));
1601 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:521602 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
1603
1604 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1605
1606 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321607 CreateSession();
bncc958faa2015-07-31 18:14:521608
1609 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1610 SendRequestAndExpectHttpResponse("hello world");
1611}
1612
bnc1c196c6e2016-05-28 13:51:481613TEST_P(QuicNetworkTransactionTest, HungAlternativeService) {
[email protected]dda75ab2013-06-22 22:43:301614 crypto_client_stream_factory_.set_handshake_mode(
1615 MockCryptoClientStream::COLD_START);
1616
1617 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561618 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
rch9ae5b3b2016-02-11 00:36:291619 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561620 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")};
[email protected]dda75ab2013-06-22 22:43:301621
1622 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561623 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
bnc1c196c6e2016-05-28 13:51:481624 MockRead(SYNCHRONOUS, 4, kQuicAlternativeServiceHeader),
rchf114d982015-10-21 01:34:561625 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]dda75ab2013-06-22 22:43:301626
mmenke651bae7f2015-12-18 21:26:451627 SequencedSocketData http_data(http_reads, arraysize(http_reads), http_writes,
1628 arraysize(http_writes));
bnc912a04b2016-04-20 14:19:501629 socket_factory_.AddSocketDataProvider(&http_data);
1630 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301631
1632 // The QUIC transaction will not be allowed to complete.
mmenke651bae7f2015-12-18 21:26:451633 MockWrite quic_writes[] = {MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 1)};
[email protected]dda75ab2013-06-22 22:43:301634 MockRead quic_reads[] = {
mmenke651bae7f2015-12-18 21:26:451635 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0),
[email protected]dda75ab2013-06-22 22:43:301636 };
mmenke651bae7f2015-12-18 21:26:451637 SequencedSocketData quic_data(quic_reads, arraysize(quic_reads), quic_writes,
1638 arraysize(quic_writes));
bnc912a04b2016-04-20 14:19:501639 socket_factory_.AddSocketDataProvider(&quic_data);
[email protected]dda75ab2013-06-22 22:43:301640
1641 // The HTTP transaction will complete.
mmenke651bae7f2015-12-18 21:26:451642 SequencedSocketData http_data2(http_reads, arraysize(http_reads), http_writes,
1643 arraysize(http_writes));
bnc912a04b2016-04-20 14:19:501644 socket_factory_.AddSocketDataProvider(&http_data2);
1645 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301646
bnc912a04b2016-04-20 14:19:501647 CreateSession();
[email protected]dda75ab2013-06-22 22:43:301648
1649 // Run the first request.
[email protected]dda75ab2013-06-22 22:43:301650 SendRequestAndExpectHttpResponse("hello world");
rch37de576c2015-05-17 20:28:171651 ASSERT_TRUE(http_data.AllReadDataConsumed());
1652 ASSERT_TRUE(http_data.AllWriteDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301653
1654 // Now run the second request in which the QUIC socket hangs,
1655 // and verify the the transaction continues over HTTP.
[email protected]dda75ab2013-06-22 22:43:301656 SendRequestAndExpectHttpResponse("hello world");
mmenke651bae7f2015-12-18 21:26:451657 base::RunLoop().RunUntilIdle();
[email protected]dda75ab2013-06-22 22:43:301658
rch37de576c2015-05-17 20:28:171659 ASSERT_TRUE(http_data2.AllReadDataConsumed());
1660 ASSERT_TRUE(http_data2.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:451661 ASSERT_TRUE(quic_data.AllReadDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301662}
1663
[email protected]1e960032013-12-20 19:00:201664TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
[email protected]1e960032013-12-20 19:00:201665 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581666 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1667 1, kClientDataStreamId1, true, true,
1668 GetRequestHeaders("GET", "https", "/")));
1669 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021670 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581671 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1672 false, true, 0, "hello!"));
1673 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501674 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591675 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]8ba81212013-05-03 13:11:481676
rcha5399e02015-04-21 19:32:041677 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]8ba81212013-05-03 13:11:481678
rtennetib8e80fb2016-05-16 00:12:091679 // The non-alternate protocol job needs to hang in order to guarantee that
1680 // the alternate-protocol job will "win".
1681 AddHangingNonAlternateProtocolSocketData();
1682
rch3f4b8452016-02-23 16:59:321683 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:191684 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1685 SendRequestAndExpectQuicResponse("hello!");
[email protected]8ba81212013-05-03 13:11:481686}
1687
[email protected]1e960032013-12-20 19:00:201688TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
[email protected]1e960032013-12-20 19:00:201689 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581690 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1691 1, kClientDataStreamId1, true, true,
1692 GetRequestHeaders("GET", "https", "/")));
1693 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021694 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581695 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1696 false, true, 0, "hello!"));
1697 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501698 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591699 mock_quic_data.AddRead(ASYNC, 0); // EOF
rcha5399e02015-04-21 19:32:041700 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]3a120a6b2013-06-25 01:08:271701
1702 // In order for a new QUIC session to be established via alternate-protocol
1703 // without racing an HTTP connection, we need the host resolution to happen
1704 // synchronously.
1705 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291706 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561707 "");
rch9ae5b3b2016-02-11 00:36:291708 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]3a120a6b2013-06-25 01:08:271709 AddressList address;
rjshaded5ced072015-12-18 19:26:021710 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1711 nullptr, net_log_.bound());
[email protected]3a120a6b2013-06-25 01:08:271712
rtennetib8e80fb2016-05-16 00:12:091713 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321714 CreateSession();
[email protected]3a120a6b2013-06-25 01:08:271715 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1716 SendRequestAndExpectQuicResponse("hello!");
1717}
1718
[email protected]0fc924b2014-03-31 04:34:151719TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) {
rdsmith82957ad2015-09-16 19:42:031720 proxy_service_ = ProxyService::CreateFixedFromPacResult("PROXY myproxy:70");
[email protected]0fc924b2014-03-31 04:34:151721
1722 // Since we are using a proxy, the QUIC job will not succeed.
1723 MockWrite http_writes[] = {
rch9ae5b3b2016-02-11 00:36:291724 MockWrite(SYNCHRONOUS, 0, "GET http://mail.example.org/ HTTP/1.1\r\n"),
1725 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561726 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")};
[email protected]0fc924b2014-03-31 04:34:151727
1728 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561729 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
bnc1c196c6e2016-05-28 13:51:481730 MockRead(SYNCHRONOUS, 4, kQuicAlternativeServiceHeader),
rchf114d982015-10-21 01:34:561731 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]0fc924b2014-03-31 04:34:151732
1733 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
1734 http_writes, arraysize(http_writes));
1735 socket_factory_.AddSocketDataProvider(&http_data);
1736
1737 // In order for a new QUIC session to be established via alternate-protocol
1738 // without racing an HTTP connection, we need the host resolution to happen
1739 // synchronously.
1740 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291741 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561742 "");
rch9ae5b3b2016-02-11 00:36:291743 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]0fc924b2014-03-31 04:34:151744 AddressList address;
rjshaded5ced072015-12-18 19:26:021745 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1746 nullptr, net_log_.bound());
[email protected]0fc924b2014-03-31 04:34:151747
rch9ae5b3b2016-02-11 00:36:291748 request_.url = GURL("http://mail.example.org/");
rch3f4b8452016-02-23 16:59:321749 CreateSession();
[email protected]0fc924b2014-03-31 04:34:151750 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1751 SendRequestAndExpectHttpResponse("hello world");
1752}
1753
[email protected]1e960032013-12-20 19:00:201754TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
[email protected]1e960032013-12-20 19:00:201755 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581756 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1757 1, kClientDataStreamId1, true, true,
1758 GetRequestHeaders("GET", "https", "/")));
1759 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021760 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581761 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1762 false, true, 0, "hello!"));
1763 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591764 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
rcha5399e02015-04-21 19:32:041765 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]11c05872013-08-20 02:04:121766
rtennetib8e80fb2016-05-16 00:12:091767 // The non-alternate protocol job needs to hang in order to guarantee that
1768 // the alternate-protocol job will "win".
1769 AddHangingNonAlternateProtocolSocketData();
1770
[email protected]11c05872013-08-20 02:04:121771 // In order for a new QUIC session to be established via alternate-protocol
1772 // without racing an HTTP connection, we need the host resolution to happen
1773 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1774 // connection to the the server, in this test we require confirmation
1775 // before encrypting so the HTTP job will still start.
1776 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291777 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561778 "");
rch9ae5b3b2016-02-11 00:36:291779 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]11c05872013-08-20 02:04:121780 AddressList address;
rjshaded5ced072015-12-18 19:26:021781 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1782 nullptr, net_log_.bound());
[email protected]11c05872013-08-20 02:04:121783
rch3f4b8452016-02-23 16:59:321784 CreateSession();
[email protected]11c05872013-08-20 02:04:121785 session_->quic_stream_factory()->set_require_confirmation(true);
1786 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1787
danakjad1777e2016-04-16 00:56:421788 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]11c05872013-08-20 02:04:121789 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1790 TestCompletionCallback callback;
1791 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
robpercival214763f2016-07-01 23:27:011792 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]11c05872013-08-20 02:04:121793
1794 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1795 QuicSession::HANDSHAKE_CONFIRMED);
robpercival214763f2016-07-01 23:27:011796 EXPECT_THAT(callback.WaitForResult(), IsOk());
rchb27683c2015-07-29 23:53:501797
1798 CheckWasQuicResponse(trans);
1799 CheckResponseData(trans, "hello!");
[email protected]11c05872013-08-20 02:04:121800}
1801
zhongyica364fbb2015-12-12 03:39:121802TEST_P(QuicNetworkTransactionTest,
1803 LogGranularQuicErrorCodeOnQuicProtocolErrorLocal) {
1804 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581805 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1806 1, kClientDataStreamId1, true, true,
1807 GetRequestHeaders("GET", "https", "/")));
zhongyica364fbb2015-12-12 03:39:121808 // Read a close connection packet with
1809 // QuicErrorCode: QUIC_CRYPTO_VERSION_NOT_SUPPORTED from the peer.
alyssar2adf3ac2016-05-03 17:12:581810 mock_quic_data.AddRead(ConstructServerConnectionClosePacket(1));
zhongyica364fbb2015-12-12 03:39:121811 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1812
1813 // The non-alternate protocol job needs to hang in order to guarantee that
1814 // the alternate-protocol job will "win".
1815 AddHangingNonAlternateProtocolSocketData();
1816
1817 // In order for a new QUIC session to be established via alternate-protocol
1818 // without racing an HTTP connection, we need the host resolution to happen
1819 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1820 // connection to the the server, in this test we require confirmation
1821 // before encrypting so the HTTP job will still start.
1822 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291823 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:121824 "");
rch9ae5b3b2016-02-11 00:36:291825 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:121826 AddressList address;
1827 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1828 nullptr, net_log_.bound());
1829
rch3f4b8452016-02-23 16:59:321830 CreateSession();
zhongyica364fbb2015-12-12 03:39:121831 session_->quic_stream_factory()->set_require_confirmation(true);
1832 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1833
danakjad1777e2016-04-16 00:56:421834 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyica364fbb2015-12-12 03:39:121835 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1836 TestCompletionCallback callback;
1837 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
robpercival214763f2016-07-01 23:27:011838 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
zhongyica364fbb2015-12-12 03:39:121839
1840 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1841 QuicSession::HANDSHAKE_CONFIRMED);
robpercival214763f2016-07-01 23:27:011842 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_QUIC_PROTOCOL_ERROR));
zhongyica364fbb2015-12-12 03:39:121843
1844 NetErrorDetails details;
1845 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1846
1847 trans->PopulateNetErrorDetails(&details);
1848 // Verify the error code logged is what sent by the peer.
1849 EXPECT_EQ(QUIC_CRYPTO_VERSION_NOT_SUPPORTED, details.quic_connection_error);
1850}
1851
1852TEST_P(QuicNetworkTransactionTest,
1853 LogGranularQuicErrorCodeOnQuicProtocolErrorRemote) {
1854 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581855 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1856 1, kClientDataStreamId1, true, true,
1857 GetRequestHeaders("GET", "https", "/")));
zhongyif28b4a32016-04-25 21:35:211858 // Peer sending data from an non-existing stream causes this end to raise
1859 // error and close connection.
1860 mock_quic_data.AddRead(
alyssar2adf3ac2016-05-03 17:12:581861 ConstructServerRstPacket(1, false, 99, QUIC_STREAM_LAST_ERROR));
zhongyif28b4a32016-04-25 21:35:211862 std::string quic_error_details = "Data for nonexistent stream";
alyssar2adf3ac2016-05-03 17:12:581863 mock_quic_data.AddWrite(ConstructClientAckAndConnectionClosePacket(
zhongyif28b4a32016-04-25 21:35:211864 2, QuicTime::Delta::Infinite(), 0, 1, QUIC_INVALID_STREAM_ID,
zhongyica364fbb2015-12-12 03:39:121865 quic_error_details));
1866 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1867
1868 // The non-alternate protocol job needs to hang in order to guarantee that
1869 // the alternate-protocol job will "win".
1870 AddHangingNonAlternateProtocolSocketData();
1871
1872 // In order for a new QUIC session to be established via alternate-protocol
1873 // without racing an HTTP connection, we need the host resolution to happen
1874 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1875 // connection to the the server, in this test we require confirmation
1876 // before encrypting so the HTTP job will still start.
1877 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291878 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:121879 "");
rch9ae5b3b2016-02-11 00:36:291880 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:121881 AddressList address;
1882 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1883 nullptr, net_log_.bound());
1884
rch3f4b8452016-02-23 16:59:321885 CreateSession();
zhongyica364fbb2015-12-12 03:39:121886 session_->quic_stream_factory()->set_require_confirmation(true);
1887 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1888
danakjad1777e2016-04-16 00:56:421889 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyica364fbb2015-12-12 03:39:121890 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1891 TestCompletionCallback callback;
1892 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
robpercival214763f2016-07-01 23:27:011893 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
zhongyica364fbb2015-12-12 03:39:121894
1895 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1896 QuicSession::HANDSHAKE_CONFIRMED);
robpercival214763f2016-07-01 23:27:011897 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_QUIC_PROTOCOL_ERROR));
zhongyica364fbb2015-12-12 03:39:121898 NetErrorDetails details;
1899 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1900
1901 trans->PopulateNetErrorDetails(&details);
zhongyif28b4a32016-04-25 21:35:211902 EXPECT_EQ(QUIC_INVALID_STREAM_ID, details.quic_connection_error);
zhongyica364fbb2015-12-12 03:39:121903}
1904
rchcd5f1c62016-06-23 02:43:481905TEST_P(QuicNetworkTransactionTest, RstSteamErrorHandling) {
1906 MockQuicData mock_quic_data;
1907 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1908 1, kClientDataStreamId1, true, true,
1909 GetRequestHeaders("GET", "https", "/")));
1910 // Read the response headers, then a RST_STREAM frame.
1911 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
1912 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1913 mock_quic_data.AddRead(ConstructServerRstPacket(
1914 2, false, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1915 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
1916 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
1917 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1918
1919 // The non-alternate protocol job needs to hang in order to guarantee that
1920 // the alternate-protocol job will "win".
1921 AddHangingNonAlternateProtocolSocketData();
1922
1923 // In order for a new QUIC session to be established via alternate-protocol
1924 // without racing an HTTP connection, we need the host resolution to happen
1925 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1926 // connection to the the server, in this test we require confirmation
1927 // before encrypting so the HTTP job will still start.
1928 host_resolver_.set_synchronous_mode(true);
1929 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1930 "");
1931 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1932 AddressList address;
1933 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1934 nullptr, net_log_.bound());
1935
1936 CreateSession();
1937 session_->quic_stream_factory()->set_require_confirmation(true);
1938 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1939
1940 std::unique_ptr<HttpNetworkTransaction> trans(
1941 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1942 TestCompletionCallback callback;
1943 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
robpercival214763f2016-07-01 23:27:011944 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
rchcd5f1c62016-06-23 02:43:481945
1946 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1947 QuicSession::HANDSHAKE_CONFIRMED);
1948 // Read the headers.
robpercival214763f2016-07-01 23:27:011949 EXPECT_THAT(callback.WaitForResult(), IsOk());
rchcd5f1c62016-06-23 02:43:481950
1951 const HttpResponseInfo* response = trans->GetResponseInfo();
1952 ASSERT_TRUE(response != nullptr);
1953 ASSERT_TRUE(response->headers.get() != nullptr);
1954 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
1955 EXPECT_TRUE(response->was_fetched_via_spdy);
1956 EXPECT_TRUE(response->was_npn_negotiated);
1957 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
1958 response->connection_info);
1959
1960 std::string response_data;
1961 ASSERT_EQ(ERR_QUIC_PROTOCOL_ERROR,
1962 ReadTransaction(trans.get(), &response_data));
1963}
1964
1965TEST_P(QuicNetworkTransactionTest, RstSteamBeforeHeaders) {
1966 MockQuicData mock_quic_data;
1967 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1968 1, kClientDataStreamId1, true, true,
1969 GetRequestHeaders("GET", "https", "/")));
1970 mock_quic_data.AddRead(ConstructServerRstPacket(
1971 1, false, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1972 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
1973 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1974
1975 // The non-alternate protocol job needs to hang in order to guarantee that
1976 // the alternate-protocol job will "win".
1977 AddHangingNonAlternateProtocolSocketData();
1978
1979 // In order for a new QUIC session to be established via alternate-protocol
1980 // without racing an HTTP connection, we need the host resolution to happen
1981 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1982 // connection to the the server, in this test we require confirmation
1983 // before encrypting so the HTTP job will still start.
1984 host_resolver_.set_synchronous_mode(true);
1985 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1986 "");
1987 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1988 AddressList address;
1989 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1990 nullptr, net_log_.bound());
1991
1992 CreateSession();
1993 session_->quic_stream_factory()->set_require_confirmation(true);
1994 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1995
1996 std::unique_ptr<HttpNetworkTransaction> trans(
1997 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1998 TestCompletionCallback callback;
1999 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
robpercival214763f2016-07-01 23:27:012000 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
rchcd5f1c62016-06-23 02:43:482001
2002 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
2003 QuicSession::HANDSHAKE_CONFIRMED);
2004 // Read the headers.
robpercival214763f2016-07-01 23:27:012005 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_QUIC_PROTOCOL_ERROR));
rchcd5f1c62016-06-23 02:43:482006}
2007
[email protected]1e960032013-12-20 19:00:202008TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
[email protected]3316d422013-05-03 21:45:302009 // Alternate-protocol job
alyssar2adf3ac2016-05-03 17:12:582010 std::unique_ptr<QuicEncryptedPacket> close(
2011 ConstructServerConnectionClosePacket(1));
[email protected]3316d422013-05-03 21:45:302012 MockRead quic_reads[] = {
rchb27683c2015-07-29 23:53:502013 MockRead(ASYNC, close->data(), close->length()),
2014 MockRead(ASYNC, ERR_IO_PENDING), // No more data to read
2015 MockRead(ASYNC, OK), // EOF
[email protected]3316d422013-05-03 21:45:302016 };
rjshaded5ced072015-12-18 19:26:022017 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2018 0);
[email protected]3316d422013-05-03 21:45:302019 socket_factory_.AddSocketDataProvider(&quic_data);
2020
2021 // Main job which will succeed even though the alternate job fails.
2022 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022023 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2024 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2025 MockRead(ASYNC, OK)};
[email protected]3316d422013-05-03 21:45:302026
rjshaded5ced072015-12-18 19:26:022027 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2028 0);
[email protected]3316d422013-05-03 21:45:302029 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562030 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]3316d422013-05-03 21:45:302031
rch3f4b8452016-02-23 16:59:322032 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:192033 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2034 SendRequestAndExpectHttpResponse("hello from http");
2035 ExpectBrokenAlternateProtocolMapping();
[email protected]3316d422013-05-03 21:45:302036}
2037
[email protected]1e960032013-12-20 19:00:202038TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
[email protected]d03a66d2013-05-06 12:55:592039 // Alternate-protocol job
2040 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022041 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]d03a66d2013-05-06 12:55:592042 };
rjshaded5ced072015-12-18 19:26:022043 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2044 0);
[email protected]d03a66d2013-05-06 12:55:592045 socket_factory_.AddSocketDataProvider(&quic_data);
2046
2047 // Main job which will succeed even though the alternate job fails.
2048 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022049 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2050 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2051 MockRead(ASYNC, OK)};
[email protected]d03a66d2013-05-06 12:55:592052
rjshaded5ced072015-12-18 19:26:022053 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2054 0);
[email protected]d03a66d2013-05-06 12:55:592055 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562056 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]d03a66d2013-05-06 12:55:592057
rch3f4b8452016-02-23 16:59:322058 CreateSession();
[email protected]d03a66d2013-05-06 12:55:592059
[email protected]aa9b14d2013-05-10 23:45:192060 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2061 SendRequestAndExpectHttpResponse("hello from http");
2062 ExpectBrokenAlternateProtocolMapping();
[email protected]d03a66d2013-05-06 12:55:592063}
2064
[email protected]00c159f2014-05-21 22:38:162065TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) {
[email protected]eb71ab62014-05-23 07:57:532066 // Alternate-protocol job will fail when the session attempts to read.
[email protected]00c159f2014-05-21 22:38:162067 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022068 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162069 };
rjshaded5ced072015-12-18 19:26:022070 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2071 0);
[email protected]00c159f2014-05-21 22:38:162072 socket_factory_.AddSocketDataProvider(&quic_data);
2073
[email protected]eb71ab62014-05-23 07:57:532074 // Main job will also fail.
[email protected]00c159f2014-05-21 22:38:162075 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022076 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162077 };
2078
rjshaded5ced072015-12-18 19:26:022079 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2080 0);
[email protected]00c159f2014-05-21 22:38:162081 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED));
2082 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562083 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]00c159f2014-05-21 22:38:162084
rtennetib8e80fb2016-05-16 00:12:092085 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322086 CreateSession();
[email protected]00c159f2014-05-21 22:38:162087
2088 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
danakjad1777e2016-04-16 00:56:422089 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]00c159f2014-05-21 22:38:162090 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2091 TestCompletionCallback callback;
2092 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
robpercival214763f2016-07-01 23:27:012093 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2094 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_SOCKET_NOT_CONNECTED));
[email protected]00c159f2014-05-21 22:38:162095 ExpectQuicAlternateProtocolMapping();
2096}
2097
[email protected]1e960032013-12-20 19:00:202098TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
[email protected]77c6c162013-08-17 02:57:452099 // Alternate-protocol job
2100 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022101 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]77c6c162013-08-17 02:57:452102 };
rjshaded5ced072015-12-18 19:26:022103 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2104 0);
[email protected]77c6c162013-08-17 02:57:452105 socket_factory_.AddSocketDataProvider(&quic_data);
2106
[email protected]c92c1b52014-05-31 04:16:062107 // Second Alternate-protocol job which will race with the TCP job.
2108 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:422109 nullptr, 0);
[email protected]c92c1b52014-05-31 04:16:062110 socket_factory_.AddSocketDataProvider(&quic_data2);
2111
[email protected]4d283b32013-10-17 12:57:272112 // Final job that will proceed when the QUIC job fails.
2113 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022114 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2115 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2116 MockRead(ASYNC, OK)};
[email protected]4d283b32013-10-17 12:57:272117
rjshaded5ced072015-12-18 19:26:022118 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2119 0);
[email protected]4d283b32013-10-17 12:57:272120 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562121 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d283b32013-10-17 12:57:272122
rtennetiafccbc062016-05-16 18:21:142123 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322124 CreateSession();
[email protected]77c6c162013-08-17 02:57:452125
2126 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2127
[email protected]4d283b32013-10-17 12:57:272128 SendRequestAndExpectHttpResponse("hello from http");
[email protected]77c6c162013-08-17 02:57:452129
2130 ExpectBrokenAlternateProtocolMapping();
[email protected]4d283b32013-10-17 12:57:272131
rch37de576c2015-05-17 20:28:172132 EXPECT_TRUE(quic_data.AllReadDataConsumed());
2133 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
[email protected]77c6c162013-08-17 02:57:452134}
2135
[email protected]93b31772014-06-19 08:03:352136TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) {
[email protected]65768442014-06-06 23:37:032137 // Alternate-protocol job
2138 MockRead quic_reads[] = {
mmenkee24011922015-12-17 22:12:592139 MockRead(SYNCHRONOUS, ERR_IO_PENDING),
[email protected]65768442014-06-06 23:37:032140 };
rjshaded5ced072015-12-18 19:26:022141 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2142 0);
[email protected]65768442014-06-06 23:37:032143 socket_factory_.AddSocketDataProvider(&quic_data);
2144
2145 // Main job that will proceed when the QUIC job fails.
2146 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022147 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2148 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2149 MockRead(ASYNC, OK)};
[email protected]65768442014-06-06 23:37:032150
rjshaded5ced072015-12-18 19:26:022151 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2152 0);
[email protected]65768442014-06-06 23:37:032153 socket_factory_.AddSocketDataProvider(&http_data);
2154
rtennetib8e80fb2016-05-16 00:12:092155 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322156 CreateSession();
[email protected]65768442014-06-06 23:37:032157
2158 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2159
2160 SendRequestAndExpectHttpResponse("hello from http");
2161}
2162
[email protected]eb71ab62014-05-23 07:57:532163TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
[email protected]4d590c9c2014-05-02 05:14:332164 // Alternate-protocol job will fail before creating a QUIC session.
rtennetibe635732014-10-02 22:51:422165 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0);
rjshaded5ced072015-12-18 19:26:022166 quic_data.set_connect_data(
2167 MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED));
[email protected]4d590c9c2014-05-02 05:14:332168 socket_factory_.AddSocketDataProvider(&quic_data);
2169
2170 // Main job which will succeed even though the alternate job fails.
2171 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022172 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2173 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2174 MockRead(ASYNC, OK)};
[email protected]4d590c9c2014-05-02 05:14:332175
rjshaded5ced072015-12-18 19:26:022176 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2177 0);
[email protected]4d590c9c2014-05-02 05:14:332178 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562179 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d590c9c2014-05-02 05:14:332180
rch3f4b8452016-02-23 16:59:322181 CreateSession();
[email protected]4d590c9c2014-05-02 05:14:332182 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2183 SendRequestAndExpectHttpResponse("hello from http");
[email protected]eb71ab62014-05-23 07:57:532184
2185 ExpectBrokenAlternateProtocolMapping();
[email protected]4d590c9c2014-05-02 05:14:332186}
2187
[email protected]4fee9672014-01-08 14:47:152188TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
[email protected]4fee9672014-01-08 14:47:152189 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582190 mock_quic_data.AddSynchronousRead(ConstructServerConnectionClosePacket(1));
2191 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2192 1, kClientDataStreamId1, true, true,
2193 GetRequestHeaders("GET", "https", "/")));
2194 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rcha5399e02015-04-21 19:32:042195 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4fee9672014-01-08 14:47:152196
2197 // When the QUIC connection fails, we will try the request again over HTTP.
2198 MockRead http_reads[] = {
bnc1c196c6e2016-05-28 13:51:482199 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
rchf114d982015-10-21 01:34:562200 MockRead("hello world"),
2201 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2202 MockRead(ASYNC, OK)};
[email protected]4fee9672014-01-08 14:47:152203
rjshaded5ced072015-12-18 19:26:022204 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2205 0);
[email protected]4fee9672014-01-08 14:47:152206 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562207 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4fee9672014-01-08 14:47:152208
2209 // In order for a new QUIC session to be established via alternate-protocol
2210 // without racing an HTTP connection, we need the host resolution to happen
2211 // synchronously.
2212 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:292213 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:562214 "");
rch9ae5b3b2016-02-11 00:36:292215 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]4fee9672014-01-08 14:47:152216 AddressList address;
rjshaded5ced072015-12-18 19:26:022217 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2218 nullptr, net_log_.bound());
[email protected]4fee9672014-01-08 14:47:152219
rch3f4b8452016-02-23 16:59:322220 CreateSession();
[email protected]4fee9672014-01-08 14:47:152221 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2222 SendRequestAndExpectHttpResponse("hello world");
2223}
2224
bnc508835902015-05-12 20:10:292225TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) {
alyssar2adf3ac2016-05-03 17:12:582226 client_maker_.set_hostname("www.example.org");
tbansal0f56a39a2016-04-07 22:03:382227 EXPECT_FALSE(
2228 test_socket_performance_watcher_factory_.rtt_notification_received());
bnc508835902015-05-12 20:10:292229 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582230 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2231 1, kClientDataStreamId1, true, true,
2232 GetRequestHeaders("GET", "https", "/")));
2233 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc508835902015-05-12 20:10:292234 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:582235 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
2236 false, true, 0, "hello!"));
2237 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:502238 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
bnc508835902015-05-12 20:10:292239 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2240
bncb07c05532015-05-14 19:07:202241 request_.url = GURL("https://www.example.org:443");
rtennetib8e80fb2016-05-16 00:12:092242 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322243 CreateSession();
bnc508835902015-05-12 20:10:292244 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
2245 SendRequestAndExpectQuicResponse("hello!");
tbansal0f56a39a2016-04-07 22:03:382246 EXPECT_TRUE(
2247 test_socket_performance_watcher_factory_.rtt_notification_received());
bnc508835902015-05-12 20:10:292248}
2249
rtenneti56977812016-01-15 19:26:562250TEST_P(QuicNetworkTransactionTest, QuicUpload) {
rtenneti8a2f4632016-03-21 20:26:572251 params_.origins_to_force_quic_on.insert(
2252 HostPortPair::FromString("mail.example.org:443"));
rtenneti56977812016-01-15 19:26:562253
2254 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2255 MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_FAILED, 1)};
2256 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2257 arraysize(writes));
2258 socket_factory_.AddSocketDataProvider(&socket_data);
2259
rtennetib8e80fb2016-05-16 00:12:092260 // The non-alternate protocol job needs to hang in order to guarantee that
2261 // the alternate-protocol job will "win".
2262 AddHangingNonAlternateProtocolSocketData();
2263
rtenneti56977812016-01-15 19:26:562264 CreateSession();
2265 request_.method = "POST";
2266 ChunkedUploadDataStream upload_data(0);
2267 upload_data.AppendData("1", 1, true);
2268
2269 request_.upload_data_stream = &upload_data;
2270
danakjad1777e2016-04-16 00:56:422271 std::unique_ptr<HttpNetworkTransaction> trans(
rtenneti56977812016-01-15 19:26:562272 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2273 TestCompletionCallback callback;
2274 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
robpercival214763f2016-07-01 23:27:012275 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
rtenneti56977812016-01-15 19:26:562276 EXPECT_NE(OK, callback.WaitForResult());
2277}
2278
ckrasic769733c2016-06-30 00:42:132279// Adds coverage to catch regression such as https://crbug.com/622043
2280TEST_P(QuicNetworkTransactionTest, QuicServerPush) {
2281 params_.origins_to_force_quic_on.insert(
2282 HostPortPair::FromString("mail.example.org:443"));
2283
2284 MockQuicData mock_quic_data;
2285 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2286 1, kClientDataStreamId1, true, true,
2287 GetRequestHeaders("GET", "https", "/")));
2288 QuicStreamOffset server_header_offset = 0;
2289 mock_quic_data.AddRead(ConstructServerPushPromisePacket(
2290 1, kClientDataStreamId1, kServerDataStreamId1, false,
2291 GetRequestHeaders("GET", "https", "/pushed.jpg"), &server_header_offset,
2292 &server_maker_));
2293 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2294 2, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
2295 &server_header_offset));
2296 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 2, 1, 1));
2297 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2298 3, kServerDataStreamId1, false, false, GetResponseHeaders("200 OK"),
2299 &server_header_offset));
2300 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId1,
2301 false, true, 0, "hello!"));
2302 mock_quic_data.AddWrite(ConstructClientAckPacket(3, 4, 3, 1));
2303 mock_quic_data.AddRead(ConstructServerDataPacket(
2304 5, kServerDataStreamId1, false, true, 0, "and hello!"));
2305 mock_quic_data.AddWrite(
2306 ConstructClientAckAndRstPacket(4, 4, QUIC_RST_ACKNOWLEDGEMENT, 5, 5, 1));
2307 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2308 mock_quic_data.AddRead(ASYNC, 0); // EOF
2309 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2310
2311 // The non-alternate protocol job needs to hang in order to guarantee that
2312 // the alternate-protocol job will "win".
2313 AddHangingNonAlternateProtocolSocketData();
2314
2315 CreateSession();
2316
2317 // PUSH_PROMISE handling in the http layer gets exercised here.
2318 SendRequestAndExpectQuicResponse("hello!");
2319
2320 request_.url = GURL("https://mail.example.org/pushed.jpg");
2321 SendRequestAndExpectQuicResponse("and hello!");
2322
2323 // Check that the NetLog was filled reasonably.
2324 TestNetLogEntry::List entries;
2325 net_log_.GetEntries(&entries);
2326 EXPECT_LT(0u, entries.size());
2327
2328 // Check that we logged a QUIC_HTTP_STREAM_ADOPTED_PUSH_STREAM
2329 int pos = ExpectLogContainsSomewhere(
2330 entries, 0, NetLog::TYPE_QUIC_HTTP_STREAM_ADOPTED_PUSH_STREAM,
2331 NetLog::PHASE_NONE);
2332 EXPECT_LT(0, pos);
2333}
2334
bnc359ed2a2016-04-29 20:43:452335class QuicNetworkTransactionWithDestinationTest
2336 : public PlatformTest,
2337 public ::testing::WithParamInterface<PoolingTestParams> {
2338 protected:
2339 QuicNetworkTransactionWithDestinationTest()
2340 : clock_(new MockClock),
2341 version_(GetParam().version),
2342 destination_type_(GetParam().destination_type),
2343 cert_transparency_verifier_(new MultiLogCTVerifier()),
2344 ssl_config_service_(new SSLConfigServiceDefaults),
2345 proxy_service_(ProxyService::CreateDirect()),
2346 auth_handler_factory_(
2347 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
2348 random_generator_(0),
2349 ssl_data_(ASYNC, OK) {}
2350
2351 void SetUp() override {
2352 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:552353 base::RunLoop().RunUntilIdle();
bnc359ed2a2016-04-29 20:43:452354
2355 HttpNetworkSession::Params params;
2356
2357 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
2358 params.quic_clock = clock_;
2359
2360 crypto_client_stream_factory_.set_handshake_mode(
2361 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2362 params.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
2363
bnc359ed2a2016-04-29 20:43:452364 params.enable_quic = true;
2365 params.quic_random = &random_generator_;
2366 params.client_socket_factory = &socket_factory_;
2367 params.host_resolver = &host_resolver_;
2368 params.cert_verifier = &cert_verifier_;
2369 params.transport_security_state = &transport_security_state_;
2370 params.cert_transparency_verifier = cert_transparency_verifier_.get();
rsleevid6de8302016-06-21 01:33:202371 params.ct_policy_enforcer = &ct_policy_enforcer_;
bnc359ed2a2016-04-29 20:43:452372 params.socket_performance_watcher_factory =
2373 &test_socket_performance_watcher_factory_;
2374 params.ssl_config_service = ssl_config_service_.get();
2375 params.proxy_service = proxy_service_.get();
2376 params.http_auth_handler_factory = auth_handler_factory_.get();
bnc525e175a2016-06-20 12:36:402377 params.http_server_properties = &http_server_properties_;
bnc359ed2a2016-04-29 20:43:452378 params.quic_supported_versions = SupportedVersions(version_);
2379 params.quic_host_whitelist.insert("news.example.org");
2380 params.quic_host_whitelist.insert("mail.example.org");
2381 params.quic_host_whitelist.insert("mail.example.com");
2382
2383 session_.reset(new HttpNetworkSession(params));
2384 session_->quic_stream_factory()->set_require_confirmation(true);
2385 ASSERT_EQ(params.quic_socket_receive_buffer_size,
2386 session_->quic_stream_factory()->socket_receive_buffer_size());
2387 }
2388
2389 void TearDown() override {
2390 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
2391 // Empty the current queue.
fdoray92e35a72016-06-10 15:54:552392 base::RunLoop().RunUntilIdle();
bnc359ed2a2016-04-29 20:43:452393 PlatformTest::TearDown();
2394 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:552395 base::RunLoop().RunUntilIdle();
bnc525e175a2016-06-20 12:36:402396 session_.reset();
bnc359ed2a2016-04-29 20:43:452397 }
2398
2399 void SetAlternativeService(const std::string& origin) {
2400 HostPortPair destination;
2401 switch (destination_type_) {
2402 case SAME_AS_FIRST:
2403 destination = HostPortPair(origin1_, 443);
2404 break;
2405 case SAME_AS_SECOND:
2406 destination = HostPortPair(origin2_, 443);
2407 break;
2408 case DIFFERENT:
2409 destination = HostPortPair(kDifferentHostname, 443);
2410 break;
2411 }
2412 AlternativeService alternative_service(QUIC, destination);
2413 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
2414 http_server_properties_.SetAlternativeService(
2415 url::SchemeHostPort("https", origin, 443), alternative_service,
2416 expiration);
2417 }
2418
alyssar2adf3ac2016-05-03 17:12:582419 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452420 QuicPacketNumber packet_number,
2421 QuicStreamId stream_id,
2422 bool should_include_version,
2423 QuicStreamOffset* offset,
2424 QuicTestPacketMaker* maker) {
2425 SpdyPriority priority =
2426 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
2427 SpdyHeaderBlock headers(maker->GetRequestHeaders("GET", "https", "/"));
2428 return maker->MakeRequestHeadersPacketWithOffsetTracking(
2429 packet_number, stream_id, should_include_version, true, priority,
bnc086b39e12016-06-24 13:05:262430 std::move(headers), offset);
bnc359ed2a2016-04-29 20:43:452431 }
2432
alyssar2adf3ac2016-05-03 17:12:582433 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452434 QuicPacketNumber packet_number,
2435 QuicStreamId stream_id,
2436 bool should_include_version,
2437 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:582438 return ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452439 packet_number, stream_id, should_include_version, nullptr, maker);
2440 }
2441
alyssar2adf3ac2016-05-03 17:12:582442 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:452443 QuicPacketNumber packet_number,
2444 QuicStreamId stream_id,
2445 QuicStreamOffset* offset,
2446 QuicTestPacketMaker* maker) {
2447 SpdyHeaderBlock headers(maker->GetResponseHeaders("200 OK"));
2448 return maker->MakeResponseHeadersPacketWithOffsetTracking(
bnc086b39e12016-06-24 13:05:262449 packet_number, stream_id, false, false, std::move(headers), offset);
bnc359ed2a2016-04-29 20:43:452450 }
2451
alyssar2adf3ac2016-05-03 17:12:582452 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:452453 QuicPacketNumber packet_number,
2454 QuicStreamId stream_id,
2455 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:582456 return ConstructServerResponseHeadersPacket(packet_number, stream_id,
2457 nullptr, maker);
bnc359ed2a2016-04-29 20:43:452458 }
2459
alyssar2adf3ac2016-05-03 17:12:582460 std::unique_ptr<QuicEncryptedPacket> ConstructServerDataPacket(
bnc359ed2a2016-04-29 20:43:452461 QuicPacketNumber packet_number,
2462 QuicStreamId stream_id,
2463 QuicTestPacketMaker* maker) {
2464 return maker->MakeDataPacket(packet_number, stream_id, false, true, 0,
2465 "hello");
2466 }
2467
alyssar2adf3ac2016-05-03 17:12:582468 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
bnc359ed2a2016-04-29 20:43:452469 QuicPacketNumber packet_number,
2470 QuicPacketNumber largest_received,
2471 QuicPacketNumber ack_least_unacked,
2472 QuicPacketNumber stop_least_unacked,
2473 QuicTestPacketMaker* maker) {
2474 return maker->MakeAckPacket(packet_number, largest_received,
2475 ack_least_unacked, stop_least_unacked, true);
2476 }
2477
2478 void AddRefusedSocketData() {
2479 std::unique_ptr<StaticSocketDataProvider> refused_data(
2480 new StaticSocketDataProvider());
2481 MockConnect refused_connect(SYNCHRONOUS, ERR_CONNECTION_REFUSED);
2482 refused_data->set_connect_data(refused_connect);
2483 socket_factory_.AddSocketDataProvider(refused_data.get());
2484 static_socket_data_provider_vector_.push_back(std::move(refused_data));
2485 }
2486
2487 void AddHangingSocketData() {
2488 std::unique_ptr<StaticSocketDataProvider> hanging_data(
2489 new StaticSocketDataProvider());
2490 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
2491 hanging_data->set_connect_data(hanging_connect);
2492 socket_factory_.AddSocketDataProvider(hanging_data.get());
2493 static_socket_data_provider_vector_.push_back(std::move(hanging_data));
2494 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
2495 }
2496
2497 bool AllDataConsumed() {
2498 for (const auto& socket_data_ptr : static_socket_data_provider_vector_) {
2499 if (!socket_data_ptr->AllReadDataConsumed() ||
2500 !socket_data_ptr->AllWriteDataConsumed()) {
2501 return false;
2502 }
2503 }
2504 return true;
2505 }
2506
2507 void SendRequestAndExpectQuicResponse(const std::string& host) {
2508 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
2509 HttpRequestInfo request;
2510 std::string url("https://");
2511 url.append(host);
2512 request.url = GURL(url);
2513 request.load_flags = 0;
2514 request.method = "GET";
2515 TestCompletionCallback callback;
2516 int rv = trans.Start(&request, callback.callback(), net_log_.bound());
robpercival214763f2016-07-01 23:27:012517 EXPECT_THAT(callback.GetResult(rv), IsOk());
bnc359ed2a2016-04-29 20:43:452518
2519 std::string response_data;
robpercival214763f2016-07-01 23:27:012520 ASSERT_THAT(ReadTransaction(&trans, &response_data), IsOk());
bnc359ed2a2016-04-29 20:43:452521 EXPECT_EQ("hello", response_data);
2522
2523 const HttpResponseInfo* response = trans.GetResponseInfo();
2524 ASSERT_TRUE(response != nullptr);
2525 ASSERT_TRUE(response->headers.get() != nullptr);
2526 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
2527 EXPECT_TRUE(response->was_fetched_via_spdy);
2528 EXPECT_TRUE(response->was_npn_negotiated);
2529 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
2530 response->connection_info);
2531 EXPECT_EQ(443, response->socket_address.port());
2532 }
2533
2534 MockClock* clock_;
2535 QuicVersion version_;
2536 DestinationType destination_type_;
2537 std::string origin1_;
2538 std::string origin2_;
2539 std::unique_ptr<HttpNetworkSession> session_;
2540 MockClientSocketFactory socket_factory_;
2541 MockHostResolver host_resolver_;
2542 MockCertVerifier cert_verifier_;
2543 TransportSecurityState transport_security_state_;
2544 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
rsleevid6de8302016-06-21 01:33:202545 CTPolicyEnforcer ct_policy_enforcer_;
bnc359ed2a2016-04-29 20:43:452546 TestSocketPerformanceWatcherFactory test_socket_performance_watcher_factory_;
2547 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
2548 std::unique_ptr<ProxyService> proxy_service_;
2549 std::unique_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
2550 MockRandom random_generator_;
2551 HttpServerPropertiesImpl http_server_properties_;
2552 BoundTestNetLog net_log_;
2553 MockCryptoClientStreamFactory crypto_client_stream_factory_;
2554 std::vector<std::unique_ptr<StaticSocketDataProvider>>
2555 static_socket_data_provider_vector_;
2556 SSLSocketDataProvider ssl_data_;
2557};
2558
2559INSTANTIATE_TEST_CASE_P(Version,
2560 QuicNetworkTransactionWithDestinationTest,
2561 ::testing::ValuesIn(GetPoolingTestParams()));
2562
2563// A single QUIC request fails because the certificate does not match the origin
2564// hostname, regardless of whether it matches the alternative service hostname.
2565TEST_P(QuicNetworkTransactionWithDestinationTest, InvalidCertificate) {
2566 if (destination_type_ == DIFFERENT)
2567 return;
2568
2569 GURL url("https://mail.example.com/");
2570 origin1_ = url.host();
2571
2572 // Not used for requests, but this provides a test case where the certificate
2573 // is valid for the hostname of the alternative service.
2574 origin2_ = "mail.example.org";
2575
2576 SetAlternativeService(origin1_);
2577
2578 scoped_refptr<X509Certificate> cert(
2579 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2580 bool unused;
2581 ASSERT_FALSE(cert->VerifyNameMatch(origin1_, &unused));
2582 ASSERT_TRUE(cert->VerifyNameMatch(origin2_, &unused));
2583
2584 ProofVerifyDetailsChromium verify_details;
2585 verify_details.cert_verify_result.verified_cert = cert;
2586 verify_details.cert_verify_result.is_issued_by_known_root = true;
2587 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2588
2589 MockQuicData mock_quic_data;
2590 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);
2591 mock_quic_data.AddRead(ASYNC, 0);
2592
2593 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2594
2595 AddRefusedSocketData();
2596
2597 HttpRequestInfo request;
2598 request.url = url;
2599
2600 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
2601 TestCompletionCallback callback;
2602 int rv = trans.Start(&request, callback.callback(), net_log_.bound());
robpercival214763f2016-07-01 23:27:012603 EXPECT_THAT(callback.GetResult(rv), IsError(ERR_CONNECTION_REFUSED));
bnc359ed2a2016-04-29 20:43:452604
2605 EXPECT_TRUE(AllDataConsumed());
2606}
2607
2608// First request opens QUIC session to alternative service. Second request
2609// pools to it, because destination matches and certificate is valid, even
2610// though QuicServerId is different.
2611TEST_P(QuicNetworkTransactionWithDestinationTest, PoolIfCertificateValid) {
2612 origin1_ = "mail.example.org";
2613 origin2_ = "news.example.org";
2614
2615 SetAlternativeService(origin1_);
2616 SetAlternativeService(origin2_);
2617
2618 scoped_refptr<X509Certificate> cert(
2619 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2620 bool unused;
2621 ASSERT_TRUE(cert->VerifyNameMatch(origin1_, &unused));
2622 ASSERT_TRUE(cert->VerifyNameMatch(origin2_, &unused));
2623 ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname, &unused));
2624
2625 ProofVerifyDetailsChromium verify_details;
2626 verify_details.cert_verify_result.verified_cert = cert;
2627 verify_details.cert_verify_result.is_issued_by_known_root = true;
2628 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2629
alyssar2adf3ac2016-05-03 17:12:582630 QuicTestPacketMaker client_maker1(version_, 0, clock_, origin1_,
2631 Perspective::IS_CLIENT);
2632 QuicTestPacketMaker server_maker1(version_, 0, clock_, origin1_,
2633 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452634
2635 QuicStreamOffset request_header_offset(0);
2636 QuicStreamOffset response_header_offset(0);
2637
2638 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582639 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2640 1, kClientDataStreamId1, true, &request_header_offset, &client_maker1));
2641 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2642 1, kClientDataStreamId1, &response_header_offset, &server_maker1));
2643 mock_quic_data.AddRead(
2644 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker1));
2645 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 2, 1, 1, &client_maker1));
bnc359ed2a2016-04-29 20:43:452646
alyssar2adf3ac2016-05-03 17:12:582647 QuicTestPacketMaker client_maker2(version_, 0, clock_, origin2_,
2648 Perspective::IS_CLIENT);
2649 QuicTestPacketMaker server_maker2(version_, 0, clock_, origin2_,
2650 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452651
alyssar2adf3ac2016-05-03 17:12:582652 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2653 3, kClientDataStreamId2, false, &request_header_offset, &client_maker2));
2654 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2655 3, kClientDataStreamId2, &response_header_offset, &server_maker2));
2656 mock_quic_data.AddRead(
2657 ConstructServerDataPacket(4, kClientDataStreamId2, &server_maker2));
2658 mock_quic_data.AddWrite(ConstructClientAckPacket(4, 4, 3, 1, &client_maker2));
bnc359ed2a2016-04-29 20:43:452659 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2660 mock_quic_data.AddRead(ASYNC, 0); // EOF
2661
2662 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2663
2664 AddHangingSocketData();
2665 AddHangingSocketData();
2666
2667 SendRequestAndExpectQuicResponse(origin1_);
2668 SendRequestAndExpectQuicResponse(origin2_);
2669
2670 EXPECT_TRUE(AllDataConsumed());
2671}
2672
2673// First request opens QUIC session to alternative service. Second request does
2674// not pool to it, even though destination matches, because certificate is not
2675// valid. Instead, a new QUIC session is opened to the same destination with a
2676// different QuicServerId.
2677TEST_P(QuicNetworkTransactionWithDestinationTest,
2678 DoNotPoolIfCertificateInvalid) {
2679 origin1_ = "news.example.org";
2680 origin2_ = "mail.example.com";
2681
2682 SetAlternativeService(origin1_);
2683 SetAlternativeService(origin2_);
2684
2685 scoped_refptr<X509Certificate> cert1(
2686 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2687 bool unused;
2688 ASSERT_TRUE(cert1->VerifyNameMatch(origin1_, &unused));
2689 ASSERT_FALSE(cert1->VerifyNameMatch(origin2_, &unused));
2690 ASSERT_FALSE(cert1->VerifyNameMatch(kDifferentHostname, &unused));
2691
2692 scoped_refptr<X509Certificate> cert2(
2693 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
2694 ASSERT_TRUE(cert2->VerifyNameMatch(origin2_, &unused));
2695 ASSERT_FALSE(cert2->VerifyNameMatch(kDifferentHostname, &unused));
2696
2697 ProofVerifyDetailsChromium verify_details1;
2698 verify_details1.cert_verify_result.verified_cert = cert1;
2699 verify_details1.cert_verify_result.is_issued_by_known_root = true;
2700 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
2701
2702 ProofVerifyDetailsChromium verify_details2;
2703 verify_details2.cert_verify_result.verified_cert = cert2;
2704 verify_details2.cert_verify_result.is_issued_by_known_root = true;
2705 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
2706
alyssar2adf3ac2016-05-03 17:12:582707 QuicTestPacketMaker client_maker1(version_, 0, clock_, origin1_,
2708 Perspective::IS_CLIENT);
2709 QuicTestPacketMaker server_maker1(version_, 0, clock_, origin1_,
2710 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452711
2712 MockQuicData mock_quic_data1;
alyssar2adf3ac2016-05-03 17:12:582713 mock_quic_data1.AddWrite(ConstructClientRequestHeadersPacket(
2714 1, kClientDataStreamId1, true, &client_maker1));
2715 mock_quic_data1.AddRead(ConstructServerResponseHeadersPacket(
2716 1, kClientDataStreamId1, &server_maker1));
2717 mock_quic_data1.AddRead(
2718 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker1));
bnc359ed2a2016-04-29 20:43:452719 mock_quic_data1.AddWrite(
alyssar2adf3ac2016-05-03 17:12:582720 ConstructClientAckPacket(2, 2, 1, 1, &client_maker1));
bnc359ed2a2016-04-29 20:43:452721 mock_quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2722 mock_quic_data1.AddRead(ASYNC, 0); // EOF
2723
2724 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
2725
2726 AddHangingSocketData();
2727
alyssar2adf3ac2016-05-03 17:12:582728 QuicTestPacketMaker client_maker2(version_, 0, clock_, origin2_,
2729 Perspective::IS_CLIENT);
2730 QuicTestPacketMaker server_maker2(version_, 0, clock_, origin2_,
2731 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452732
2733 MockQuicData mock_quic_data2;
alyssar2adf3ac2016-05-03 17:12:582734 mock_quic_data2.AddWrite(ConstructClientRequestHeadersPacket(
2735 1, kClientDataStreamId1, true, &client_maker2));
2736 mock_quic_data2.AddRead(ConstructServerResponseHeadersPacket(
2737 1, kClientDataStreamId1, &server_maker2));
2738 mock_quic_data2.AddRead(
2739 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker2));
bnc359ed2a2016-04-29 20:43:452740 mock_quic_data2.AddWrite(
alyssar2adf3ac2016-05-03 17:12:582741 ConstructClientAckPacket(2, 2, 1, 1, &client_maker2));
bnc359ed2a2016-04-29 20:43:452742 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2743 mock_quic_data2.AddRead(ASYNC, 0); // EOF
2744
2745 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
2746
2747 AddHangingSocketData();
2748
2749 SendRequestAndExpectQuicResponse(origin1_);
2750 SendRequestAndExpectQuicResponse(origin2_);
2751
2752 EXPECT_TRUE(AllDataConsumed());
2753}
2754
[email protected]61a527782013-02-21 03:58:002755} // namespace test
2756} // namespace net