blob: 3d4bce6ed6badc54ed1c15e00b0f585de119037e [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"
rsleevia69c79a2016-06-22 03:28:4357#include "net/test/test_data_directory.h"
[email protected]61a527782013-02-21 03:58:0058#include "testing/gtest/include/gtest/gtest.h"
59#include "testing/platform_test.h"
zhongyi3d4a55e72016-04-22 20:36:4660#include "url/gurl.h"
[email protected]61a527782013-02-21 03:58:0061
bnc508835902015-05-12 20:10:2962namespace net {
63namespace test {
[email protected]61a527782013-02-21 03:58:0064
65namespace {
66
bnc359ed2a2016-04-29 20:43:4567enum DestinationType {
68 // In pooling tests with two requests for different origins to the same
69 // destination, the destination should be
70 SAME_AS_FIRST, // the same as the first origin,
71 SAME_AS_SECOND, // the same as the second origin, or
72 DIFFERENT, // different from both.
73};
74
rchf114d982015-10-21 01:34:5675static const char kQuicAlternativeServiceHeader[] =
bncc958faa2015-07-31 18:14:5276 "Alt-Svc: quic=\":443\"\r\n\r\n";
rchf47265dc2016-03-21 21:33:1277static const char kQuicAlternativeServiceWithProbabilityHeader[] =
78 "Alt-Svc: quic=\":443\";p=\".5\"\r\n\r\n";
rchf114d982015-10-21 01:34:5679static const char kQuicAlternativeServiceDifferentPortHeader[] =
80 "Alt-Svc: quic=\":137\"\r\n\r\n";
[email protected]1e960032013-12-20 19:00:2081
rch9ae5b3b2016-02-11 00:36:2982const char kDefaultServerHostName[] = "mail.example.org";
bnc359ed2a2016-04-29 20:43:4583const char kDifferentHostname[] = "different.example.com";
84
85// Run QuicNetworkTransactionWithDestinationTest instances with all value
86// combinations of version and destination_type.
87struct PoolingTestParams {
88 friend std::ostream& operator<<(std::ostream& os,
89 const PoolingTestParams& p) {
90 os << "{ version: " << QuicVersionToString(p.version)
91 << ", destination_type: ";
92 switch (p.destination_type) {
93 case SAME_AS_FIRST:
94 os << "SAME_AS_FIRST";
95 break;
96 case SAME_AS_SECOND:
97 os << "SAME_AS_SECOND";
98 break;
99 case DIFFERENT:
100 os << "DIFFERENT";
101 break;
102 }
103 os << " }";
104 return os;
105 }
106
107 QuicVersion version;
108 DestinationType destination_type;
109};
110
111std::vector<PoolingTestParams> GetPoolingTestParams() {
112 std::vector<PoolingTestParams> params;
113 QuicVersionVector all_supported_versions = QuicSupportedVersions();
114 for (const QuicVersion version : all_supported_versions) {
115 params.push_back(PoolingTestParams{version, SAME_AS_FIRST});
116 params.push_back(PoolingTestParams{version, SAME_AS_SECOND});
117 params.push_back(PoolingTestParams{version, DIFFERENT});
118 }
119 return params;
120}
bncb07c05532015-05-14 19:07:20121
[email protected]61a527782013-02-21 03:58:00122} // namespace
123
[email protected]1e960032013-12-20 19:00:20124// Helper class to encapsulate MockReads and MockWrites for QUIC.
125// Simplify ownership issues and the interaction with the MockSocketFactory.
126class MockQuicData {
127 public:
rtennetia004d332015-08-28 06:44:57128 MockQuicData() : packet_number_(0) {}
rcha5399e02015-04-21 19:32:04129
rjshaded5ced072015-12-18 19:26:02130 ~MockQuicData() { STLDeleteElements(&packets_); }
[email protected]1e960032013-12-20 19:00:20131
danakjad1777e2016-04-16 00:56:42132 void AddSynchronousRead(std::unique_ptr<QuicEncryptedPacket> packet) {
[email protected]1e960032013-12-20 19:00:20133 reads_.push_back(MockRead(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:57134 packet_number_++));
[email protected]1e960032013-12-20 19:00:20135 packets_.push_back(packet.release());
136 }
137
danakjad1777e2016-04-16 00:56:42138 void AddRead(std::unique_ptr<QuicEncryptedPacket> packet) {
rcha5399e02015-04-21 19:32:04139 reads_.push_back(
rtennetia004d332015-08-28 06:44:57140 MockRead(ASYNC, packet->data(), packet->length(), packet_number_++));
rcha5399e02015-04-21 19:32:04141 packets_.push_back(packet.release());
142 }
143
[email protected]1e960032013-12-20 19:00:20144 void AddRead(IoMode mode, int rv) {
rtennetia004d332015-08-28 06:44:57145 reads_.push_back(MockRead(mode, rv, packet_number_++));
[email protected]1e960032013-12-20 19:00:20146 }
147
danakjad1777e2016-04-16 00:56:42148 void AddWrite(std::unique_ptr<QuicEncryptedPacket> packet) {
[email protected]1e960032013-12-20 19:00:20149 writes_.push_back(MockWrite(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:57150 packet_number_++));
[email protected]1e960032013-12-20 19:00:20151 packets_.push_back(packet.release());
152 }
153
rcha5399e02015-04-21 19:32:04154 void AddSocketDataToFactory(MockClientSocketFactory* factory) {
rjshaded5ced072015-12-18 19:26:02155 MockRead* reads = reads_.empty() ? nullptr : &reads_[0];
156 MockWrite* writes = writes_.empty() ? nullptr : &writes_[0];
rcha5399e02015-04-21 19:32:04157 socket_data_.reset(
158 new SequencedSocketData(reads, reads_.size(), writes, writes_.size()));
[email protected]1e960032013-12-20 19:00:20159 factory->AddSocketDataProvider(socket_data_.get());
160 }
161
mmenkee24011922015-12-17 22:12:59162 void Resume() { socket_data_->Resume(); }
rchb27683c2015-07-29 23:53:50163
[email protected]1e960032013-12-20 19:00:20164 private:
165 std::vector<QuicEncryptedPacket*> packets_;
166 std::vector<MockWrite> writes_;
167 std::vector<MockRead> reads_;
rtennetia004d332015-08-28 06:44:57168 size_t packet_number_;
danakjad1777e2016-04-16 00:56:42169 std::unique_ptr<SequencedSocketData> socket_data_;
[email protected]1e960032013-12-20 19:00:20170};
171
ryansturm49a8cb12016-06-15 16:51:09172class HeadersHandler {
tbansal7cec3812015-02-05 21:25:12173 public:
ryansturm49a8cb12016-06-15 16:51:09174 HeadersHandler() : was_proxied_(false) {}
tbansal7cec3812015-02-05 21:25:12175
ryansturm49a8cb12016-06-15 16:51:09176 bool was_proxied() { return was_proxied_; }
tbansal7cec3812015-02-05 21:25:12177
ryansturm49a8cb12016-06-15 16:51:09178 void OnBeforeHeadersSent(const ProxyInfo& proxy_info,
179 HttpRequestHeaders* request_headers) {
180 if (!proxy_info.is_http() && !proxy_info.is_https() &&
181 !proxy_info.is_quic()) {
182 return;
183 }
184 was_proxied_ = true;
tbansal7cec3812015-02-05 21:25:12185 }
186
187 private:
ryansturm49a8cb12016-06-15 16:51:09188 bool was_proxied_;
tbansal7cec3812015-02-05 21:25:12189};
190
tbansal0f56a39a2016-04-07 22:03:38191class TestSocketPerformanceWatcher : public SocketPerformanceWatcher {
tbansalfdf5665b2015-09-21 22:46:40192 public:
tbansal0f56a39a2016-04-07 22:03:38193 explicit TestSocketPerformanceWatcher(bool* rtt_notification_received)
194 : rtt_notification_received_(rtt_notification_received) {}
195 ~TestSocketPerformanceWatcher() override {}
tbansalfdf5665b2015-09-21 22:46:40196
tbansal0f56a39a2016-04-07 22:03:38197 bool ShouldNotifyUpdatedRTT() const override { return true; }
tbansalfdf5665b2015-09-21 22:46:40198
tbansal0f56a39a2016-04-07 22:03:38199 void OnUpdatedRTTAvailable(const base::TimeDelta& rtt) override {
200 *rtt_notification_received_ = true;
201 }
202
203 void OnConnectionChanged() override {}
204
205 private:
206 bool* rtt_notification_received_;
207
208 DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcher);
209};
210
211class TestSocketPerformanceWatcherFactory
212 : public SocketPerformanceWatcherFactory {
213 public:
214 TestSocketPerformanceWatcherFactory()
215 : watcher_count_(0u), rtt_notification_received_(false) {}
216 ~TestSocketPerformanceWatcherFactory() override {}
217
218 // SocketPerformanceWatcherFactory implementation:
danakjad1777e2016-04-16 00:56:42219 std::unique_ptr<SocketPerformanceWatcher> CreateSocketPerformanceWatcher(
tbansalc8a94ea2015-11-02 23:58:51220 const Protocol protocol) override {
221 if (protocol != PROTOCOL_QUIC) {
tbansal0f56a39a2016-04-07 22:03:38222 return nullptr;
tbansalc8a94ea2015-11-02 23:58:51223 }
224 ++watcher_count_;
danakjad1777e2016-04-16 00:56:42225 return std::unique_ptr<SocketPerformanceWatcher>(
tbansal0f56a39a2016-04-07 22:03:38226 new TestSocketPerformanceWatcher(&rtt_notification_received_));
tbansalfdf5665b2015-09-21 22:46:40227 }
228
tbansalc8a94ea2015-11-02 23:58:51229 size_t watcher_count() const { return watcher_count_; }
tbansalfdf5665b2015-09-21 22:46:40230
tbansalc8a94ea2015-11-02 23:58:51231 bool rtt_notification_received() const { return rtt_notification_received_; }
232
tbansalc8a94ea2015-11-02 23:58:51233 private:
tbansal0f56a39a2016-04-07 22:03:38234 size_t watcher_count_;
tbansalc8a94ea2015-11-02 23:58:51235 bool rtt_notification_received_;
tbansal0f56a39a2016-04-07 22:03:38236
237 DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcherFactory);
tbansalc8a94ea2015-11-02 23:58:51238};
239
[email protected]1e960032013-12-20 19:00:20240class QuicNetworkTransactionTest
241 : public PlatformTest,
[email protected]5d03bbd2014-03-07 16:19:16242 public ::testing::WithParamInterface<QuicVersion> {
[email protected]61a527782013-02-21 03:58:00243 protected:
[email protected]1c04f9522013-02-21 20:32:43244 QuicNetworkTransactionTest()
rtenneti4b06ae72014-08-26 03:43:43245 : clock_(new MockClock),
alyssar2adf3ac2016-05-03 17:12:58246 client_maker_(GetParam(),
247 0,
248 clock_,
249 kDefaultServerHostName,
250 Perspective::IS_CLIENT),
251 server_maker_(GetParam(),
252 0,
253 clock_,
254 kDefaultServerHostName,
255 Perspective::IS_SERVER),
rtenneti052774e2015-11-24 21:00:12256 cert_transparency_verifier_(new MultiLogCTVerifier()),
[email protected]1c04f9522013-02-21 20:32:43257 ssl_config_service_(new SSLConfigServiceDefaults),
258 proxy_service_(ProxyService::CreateDirect()),
259 auth_handler_factory_(
[email protected]dda75ab2013-06-22 22:43:30260 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
[email protected]457d6952013-12-13 09:24:58261 random_generator_(0),
rchf114d982015-10-21 01:34:56262 ssl_data_(ASYNC, OK) {
[email protected]aa9b14d2013-05-10 23:45:19263 request_.method = "GET";
rchf114d982015-10-21 01:34:56264 std::string url("https://");
bncb07c05532015-05-14 19:07:20265 url.append(kDefaultServerHostName);
266 request_.url = GURL(url);
[email protected]aa9b14d2013-05-10 23:45:19267 request_.load_flags = 0;
[email protected]98a9d1252014-04-04 00:43:59268 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
rchf114d982015-10-21 01:34:56269
270 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29271 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
rchf114d982015-10-21 01:34:56272 verify_details_.cert_verify_result.verified_cert = cert;
273 verify_details_.cert_verify_result.is_issued_by_known_root = true;
274 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
[email protected]1c04f9522013-02-21 20:32:43275 }
[email protected]61a527782013-02-21 03:58:00276
dcheng67be2b1f2014-10-27 21:47:29277 void SetUp() override {
[email protected]61a527782013-02-21 03:58:00278 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:55279 base::RunLoop().RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00280 }
281
dcheng67be2b1f2014-10-27 21:47:29282 void TearDown() override {
[email protected]61a527782013-02-21 03:58:00283 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
284 // Empty the current queue.
fdoray92e35a72016-06-10 15:54:55285 base::RunLoop().RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00286 PlatformTest::TearDown();
287 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:55288 base::RunLoop().RunUntilIdle();
bnc525e175a2016-06-20 12:36:40289 session_.reset();
[email protected]61a527782013-02-21 03:58:00290 }
291
alyssar2adf3ac2016-05-03 17:12:58292 std::unique_ptr<QuicEncryptedPacket> ConstructClientConnectionClosePacket(
rtennetia004d332015-08-28 06:44:57293 QuicPacketNumber num) {
alyssar2adf3ac2016-05-03 17:12:58294 return client_maker_.MakeConnectionClosePacket(num);
[email protected]3316d422013-05-03 21:45:30295 }
296
alyssar2adf3ac2016-05-03 17:12:58297 std::unique_ptr<QuicEncryptedPacket> ConstructServerConnectionClosePacket(
298 QuicPacketNumber num) {
299 return server_maker_.MakeConnectionClosePacket(num);
300 }
301
302 std::unique_ptr<QuicEncryptedPacket> ConstructServerGoAwayPacket(
zhongyi6b5a3892016-03-12 04:46:20303 QuicPacketNumber num,
304 QuicErrorCode error_code,
305 std::string reason_phrase) {
alyssar2adf3ac2016-05-03 17:12:58306 return server_maker_.MakeGoAwayPacket(num, error_code, reason_phrase);
zhongyi6b5a3892016-03-12 04:46:20307 }
308
alyssar2adf3ac2016-05-03 17:12:58309 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
rtennetia004d332015-08-28 06:44:57310 QuicPacketNumber largest_received,
311 QuicPacketNumber least_unacked) {
alyssar2adf3ac2016-05-03 17:12:58312 return client_maker_.MakeAckPacket(2, largest_received, least_unacked,
313 least_unacked, true);
zhongyi32569c62016-01-08 02:54:30314 }
315
alyssar2adf3ac2016-05-03 17:12:58316 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckAndRstPacket(
zhongyi6b5a3892016-03-12 04:46:20317 QuicPacketNumber num,
318 QuicStreamId stream_id,
319 QuicRstStreamErrorCode error_code,
320 QuicPacketNumber largest_received,
321 QuicPacketNumber ack_least_unacked,
322 QuicPacketNumber stop_least_unacked) {
alyssar2adf3ac2016-05-03 17:12:58323 return client_maker_.MakeAckAndRstPacket(
324 num, false, stream_id, error_code, largest_received, ack_least_unacked,
325 stop_least_unacked, true);
zhongyi6b5a3892016-03-12 04:46:20326 }
327
alyssar2adf3ac2016-05-03 17:12:58328 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
zhongyi32569c62016-01-08 02:54:30329 QuicPacketNumber largest_received,
330 QuicPacketNumber least_unacked,
331 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:58332 return client_maker_.MakeAckPacket(2, largest_received, least_unacked,
333 least_unacked, true);
zhongyi32569c62016-01-08 02:54:30334 }
335
ckrasic769733c2016-06-30 00:42:13336 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
337 QuicPacketNumber packet_number,
338 QuicPacketNumber largest_received,
339 QuicPacketNumber ack_least_unacked,
340 QuicPacketNumber stop_least_unacked) {
341 return client_maker_.MakeAckPacket(packet_number, largest_received,
342 ack_least_unacked, stop_least_unacked,
343 true);
344 }
345
alyssar2adf3ac2016-05-03 17:12:58346 std::unique_ptr<QuicEncryptedPacket>
347 ConstructClientAckAndConnectionClosePacket(
zhongyi32569c62016-01-08 02:54:30348 QuicPacketNumber packet_number,
349 QuicPacketNumber largest_received,
350 QuicPacketNumber ack_least_unacked,
351 QuicPacketNumber stop_least_unacked) {
alyssar2adf3ac2016-05-03 17:12:58352 return client_maker_.MakeAckPacket(packet_number, largest_received,
353 ack_least_unacked, stop_least_unacked,
354 true);
[email protected]1e960032013-12-20 19:00:20355 }
[email protected]61a527782013-02-21 03:58:00356
alyssar2adf3ac2016-05-03 17:12:58357 std::unique_ptr<QuicEncryptedPacket>
358 ConstructClientAckAndConnectionClosePacket(
zhongyica364fbb2015-12-12 03:39:12359 QuicPacketNumber num,
360 QuicTime::Delta delta_time_largest_observed,
361 QuicPacketNumber largest_received,
362 QuicPacketNumber least_unacked,
363 QuicErrorCode quic_error,
bnc912a04b2016-04-20 14:19:50364 const std::string& quic_error_details) {
alyssar2adf3ac2016-05-03 17:12:58365 return client_maker_.MakeAckAndConnectionClosePacket(
zhongyica364fbb2015-12-12 03:39:12366 num, false, delta_time_largest_observed, largest_received,
367 least_unacked, quic_error, quic_error_details);
368 }
369
alyssar2adf3ac2016-05-03 17:12:58370 std::unique_ptr<QuicEncryptedPacket> ConstructServerRstPacket(
zhongyica364fbb2015-12-12 03:39:12371 QuicPacketNumber num,
372 bool include_version,
373 QuicStreamId stream_id,
374 QuicRstStreamErrorCode error_code) {
alyssar2adf3ac2016-05-03 17:12:58375 return server_maker_.MakeRstPacket(num, include_version, stream_id,
376 error_code);
zhongyica364fbb2015-12-12 03:39:12377 }
378
zhongyi32569c62016-01-08 02:54:30379 // Uses default QuicTestPacketMaker.
[email protected]1e960032013-12-20 19:00:20380 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
381 const std::string& scheme,
382 const std::string& path) {
alyssar2adf3ac2016-05-03 17:12:58383 return GetRequestHeaders(method, scheme, path, &client_maker_);
zhongyi32569c62016-01-08 02:54:30384 }
385
386 // Uses customized QuicTestPacketMaker.
387 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
388 const std::string& scheme,
389 const std::string& path,
bnc912a04b2016-04-20 14:19:50390 QuicTestPacketMaker* maker) {
391 return maker->GetRequestHeaders(method, scheme, path);
[email protected]61a527782013-02-21 03:58:00392 }
393
[email protected]1e960032013-12-20 19:00:20394 SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
alyssar2adf3ac2016-05-03 17:12:58395 return server_maker_.GetResponseHeaders(status);
[email protected]61a527782013-02-21 03:58:00396 }
397
zhongyi32569c62016-01-08 02:54:30398 // Appends alt_svc headers in the response headers.
399 SpdyHeaderBlock GetResponseHeaders(const std::string& status,
400 const std::string& alt_svc) {
alyssar2adf3ac2016-05-03 17:12:58401 return server_maker_.GetResponseHeaders(status, alt_svc);
zhongyi32569c62016-01-08 02:54:30402 }
403
alyssar2adf3ac2016-05-03 17:12:58404 std::unique_ptr<QuicEncryptedPacket> ConstructServerDataPacket(
rtennetia004d332015-08-28 06:44:57405 QuicPacketNumber packet_number,
[email protected]98b20ce2013-05-10 05:55:26406 QuicStreamId stream_id,
[email protected]e8ff26842013-03-22 21:02:05407 bool should_include_version,
[email protected]61a527782013-02-21 03:58:00408 bool fin,
409 QuicStreamOffset offset,
410 base::StringPiece data) {
alyssar2adf3ac2016-05-03 17:12:58411 return server_maker_.MakeDataPacket(
412 packet_number, stream_id, should_include_version, fin, offset, data);
[email protected]61a527782013-02-21 03:58:00413 }
414
alyssar2adf3ac2016-05-03 17:12:58415 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
rtennetia004d332015-08-28 06:44:57416 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20417 QuicStreamId stream_id,
418 bool should_include_version,
419 bool fin,
bnc086b39e12016-06-24 13:05:26420 SpdyHeaderBlock headers,
zhongyi32569c62016-01-08 02:54:30421 QuicStreamOffset* offset) {
ianswett0888cff2015-11-24 17:42:16422 SpdyPriority priority =
rtennetif4bdb542015-01-21 14:33:05423 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
alyssar2adf3ac2016-05-03 17:12:58424 return client_maker_.MakeRequestHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30425 packet_number, stream_id, should_include_version, fin, priority,
bnc94893a72016-06-30 13:45:25426 std::move(headers), offset);
zhongyi32569c62016-01-08 02:54:30427 }
428
alyssar2adf3ac2016-05-03 17:12:58429 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30430 QuicPacketNumber packet_number,
431 QuicStreamId stream_id,
432 bool should_include_version,
433 bool fin,
bnc086b39e12016-06-24 13:05:26434 SpdyHeaderBlock headers,
zhongyi32569c62016-01-08 02:54:30435 QuicStreamOffset* offset,
436 QuicTestPacketMaker* maker) {
437 SpdyPriority priority =
438 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
alyssar2adf3ac2016-05-03 17:12:58439 return client_maker_.MakeRequestHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30440 packet_number, stream_id, should_include_version, fin, priority,
bnc94893a72016-06-30 13:45:25441 std::move(headers), offset);
zhongyi32569c62016-01-08 02:54:30442 }
443
alyssar2adf3ac2016-05-03 17:12:58444 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30445 QuicPacketNumber packet_number,
446 QuicStreamId stream_id,
447 bool should_include_version,
448 bool fin,
bnc086b39e12016-06-24 13:05:26449 SpdyHeaderBlock headers) {
alyssar2adf3ac2016-05-03 17:12:58450 return ConstructClientRequestHeadersPacket(
bnc086b39e12016-06-24 13:05:26451 packet_number, stream_id, should_include_version, fin,
452 std::move(headers), nullptr, &client_maker_);
zhongyi32569c62016-01-08 02:54:30453 }
alyssar2adf3ac2016-05-03 17:12:58454 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30455 QuicPacketNumber packet_number,
456 QuicStreamId stream_id,
457 bool should_include_version,
458 bool fin,
bnc086b39e12016-06-24 13:05:26459 SpdyHeaderBlock headers,
zhongyi32569c62016-01-08 02:54:30460 QuicTestPacketMaker* maker) {
bnc086b39e12016-06-24 13:05:26461 return ConstructClientRequestHeadersPacket(
462 packet_number, stream_id, should_include_version, fin,
463 std::move(headers), nullptr, maker);
[email protected]61a527782013-02-21 03:58:00464 }
465
ckrasic769733c2016-06-30 00:42:13466 std::unique_ptr<QuicEncryptedPacket> ConstructServerPushPromisePacket(
467 QuicPacketNumber packet_number,
468 QuicStreamId stream_id,
469 QuicStreamId promised_stream_id,
470 bool should_include_version,
471 SpdyHeaderBlock headers,
472 QuicStreamOffset* offset,
473 QuicTestPacketMaker* maker) {
474 return maker->MakePushPromisePacket(
475 packet_number, stream_id, promised_stream_id, should_include_version,
476 false, std::move(headers), nullptr, offset);
477 }
478
alyssar2adf3ac2016-05-03 17:12:58479 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
rtennetia004d332015-08-28 06:44:57480 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20481 QuicStreamId stream_id,
482 bool should_include_version,
483 bool fin,
bnc086b39e12016-06-24 13:05:26484 SpdyHeaderBlock headers) {
alyssar2adf3ac2016-05-03 17:12:58485 return ConstructServerResponseHeadersPacket(
bnc086b39e12016-06-24 13:05:26486 packet_number, stream_id, should_include_version, fin,
487 std::move(headers), nullptr, &server_maker_);
zhongyi32569c62016-01-08 02:54:30488 }
489
alyssar2adf3ac2016-05-03 17:12:58490 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30491 QuicPacketNumber packet_number,
492 QuicStreamId stream_id,
493 bool should_include_version,
494 bool fin,
bnc086b39e12016-06-24 13:05:26495 SpdyHeaderBlock headers,
zhongyi32569c62016-01-08 02:54:30496 QuicTestPacketMaker* maker) {
bnc086b39e12016-06-24 13:05:26497 return ConstructServerResponseHeadersPacket(
498 packet_number, stream_id, should_include_version, fin,
499 std::move(headers), nullptr, maker);
zhongyi32569c62016-01-08 02:54:30500 }
501
alyssar2adf3ac2016-05-03 17:12:58502 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30503 QuicPacketNumber packet_number,
504 QuicStreamId stream_id,
505 bool should_include_version,
506 bool fin,
bnc086b39e12016-06-24 13:05:26507 SpdyHeaderBlock headers,
zhongyi32569c62016-01-08 02:54:30508 QuicStreamOffset* offset) {
alyssar2adf3ac2016-05-03 17:12:58509 return server_maker_.MakeResponseHeadersPacketWithOffsetTracking(
bnc94893a72016-06-30 13:45:25510 packet_number, stream_id, should_include_version, fin,
511 std::move(headers), offset);
zhongyi32569c62016-01-08 02:54:30512 }
513
alyssar2adf3ac2016-05-03 17:12:58514 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30515 QuicPacketNumber packet_number,
516 QuicStreamId stream_id,
517 bool should_include_version,
518 bool fin,
bnc086b39e12016-06-24 13:05:26519 SpdyHeaderBlock headers,
zhongyi32569c62016-01-08 02:54:30520 QuicStreamOffset* offset,
521 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:58522 return server_maker_.MakeResponseHeadersPacketWithOffsetTracking(
bnc94893a72016-06-30 13:45:25523 packet_number, stream_id, should_include_version, fin,
524 std::move(headers), offset);
[email protected]61a527782013-02-21 03:58:00525 }
526
bnc912a04b2016-04-20 14:19:50527 void CreateSession() {
[email protected]4dca587c2013-03-07 16:54:47528 params_.enable_quic = true;
529 params_.quic_clock = clock_;
530 params_.quic_random = &random_generator_;
bnc912a04b2016-04-20 14:19:50531 params_.client_socket_factory = &socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05532 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43533 params_.host_resolver = &host_resolver_;
534 params_.cert_verifier = &cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11535 params_.transport_security_state = &transport_security_state_;
rtenneti052774e2015-11-24 21:00:12536 params_.cert_transparency_verifier = cert_transparency_verifier_.get();
rsleevid6de8302016-06-21 01:33:20537 params_.ct_policy_enforcer = &ct_policy_enforcer_;
tbansalfdf5665b2015-09-21 22:46:40538 params_.socket_performance_watcher_factory =
tbansal0f56a39a2016-04-07 22:03:38539 &test_socket_performance_watcher_factory_;
[email protected]1c04f9522013-02-21 20:32:43540 params_.proxy_service = proxy_service_.get();
541 params_.ssl_config_service = ssl_config_service_.get();
542 params_.http_auth_handler_factory = auth_handler_factory_.get();
bnc525e175a2016-06-20 12:36:40543 params_.http_server_properties = &http_server_properties_;
[email protected]1e960032013-12-20 19:00:20544 params_.quic_supported_versions = SupportedVersions(GetParam());
rch74da0e1a2016-01-14 02:49:32545 for (const char* host :
rch9ae5b3b2016-02-11 00:36:29546 {kDefaultServerHostName, "www.example.org", "news.example.org",
547 "bar.example.org", "foo.example.org", "invalid.example.org",
548 "mail.example.com"}) {
rch74da0e1a2016-01-14 02:49:32549 params_.quic_host_whitelist.insert(host);
550 }
[email protected]61a527782013-02-21 03:58:00551
mmenkee65e7af2015-10-13 17:16:42552 session_.reset(new HttpNetworkSession(params_));
[email protected]11c05872013-08-20 02:04:12553 session_->quic_stream_factory()->set_require_confirmation(false);
rch185ebee2015-07-14 23:56:22554 ASSERT_EQ(params_.quic_socket_receive_buffer_size,
555 session_->quic_stream_factory()->socket_receive_buffer_size());
[email protected]61a527782013-02-21 03:58:00556 }
557
danakjad1777e2016-04-16 00:56:42558 void CheckWasQuicResponse(
559 const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19560 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42561 ASSERT_TRUE(response != nullptr);
562 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19563 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
564 EXPECT_TRUE(response->was_fetched_via_spdy);
565 EXPECT_TRUE(response->was_npn_negotiated);
566 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
567 response->connection_info);
568 }
569
danakjad1777e2016-04-16 00:56:42570 void CheckResponsePort(const std::unique_ptr<HttpNetworkTransaction>& trans,
Avi Drissman13fc8932015-12-20 04:40:46571 uint16_t port) {
bnc62a44f022015-04-02 15:59:41572 const HttpResponseInfo* response = trans->GetResponseInfo();
573 ASSERT_TRUE(response != nullptr);
574 EXPECT_EQ(port, response->socket_address.port());
575 }
576
danakjad1777e2016-04-16 00:56:42577 void CheckWasHttpResponse(
578 const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19579 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42580 ASSERT_TRUE(response != nullptr);
581 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19582 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
583 EXPECT_FALSE(response->was_fetched_via_spdy);
584 EXPECT_FALSE(response->was_npn_negotiated);
585 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1,
586 response->connection_info);
587 }
588
danakjad1777e2016-04-16 00:56:42589 void CheckResponseData(const std::unique_ptr<HttpNetworkTransaction>& trans,
[email protected]aa9b14d2013-05-10 23:45:19590 const std::string& expected) {
591 std::string response_data;
bncffc2fdf2015-05-14 18:29:49592 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
[email protected]aa9b14d2013-05-10 23:45:19593 EXPECT_EQ(expected, response_data);
594 }
595
danakjad1777e2016-04-16 00:56:42596 void RunTransaction(const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19597 TestCompletionCallback callback;
598 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
599 EXPECT_EQ(ERR_IO_PENDING, rv);
600 EXPECT_EQ(OK, callback.WaitForResult());
601 }
602
603 void SendRequestAndExpectHttpResponse(const std::string& expected) {
danakjad1777e2016-04-16 00:56:42604 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50605 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
bncffc2fdf2015-05-14 18:29:49606 RunTransaction(trans);
[email protected]aa9b14d2013-05-10 23:45:19607 CheckWasHttpResponse(trans);
bncffc2fdf2015-05-14 18:29:49608 CheckResponseData(trans, expected);
[email protected]aa9b14d2013-05-10 23:45:19609 }
610
611 void SendRequestAndExpectQuicResponse(const std::string& expected) {
rchf114d982015-10-21 01:34:56612 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, 443);
tbansal7cec3812015-02-05 21:25:12613 }
614
bnc62a44f022015-04-02 15:59:41615 void SendRequestAndExpectQuicResponseFromProxyOnPort(
616 const std::string& expected,
Avi Drissman13fc8932015-12-20 04:40:46617 uint16_t port) {
bnc62a44f022015-04-02 15:59:41618 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port);
[email protected]aa9b14d2013-05-10 23:45:19619 }
620
621 void AddQuicAlternateProtocolMapping(
622 MockCryptoClientStream::HandshakeMode handshake_mode) {
623 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
zhongyi3d4a55e72016-04-22 20:36:46624 url::SchemeHostPort server(request_.url);
625 AlternativeService alternative_service(QUIC, server.host(), 443);
bnc7dc7e1b42015-07-28 14:43:12626 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
zhongyi3d4a55e72016-04-22 20:36:46627 http_server_properties_.SetAlternativeService(server, alternative_service,
628 expiration);
[email protected]aa9b14d2013-05-10 23:45:19629 }
630
rchbe69cb902016-02-11 01:10:48631 void AddQuicRemoteAlternativeServiceMapping(
632 MockCryptoClientStream::HandshakeMode handshake_mode,
633 const HostPortPair& alternative) {
634 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
zhongyi3d4a55e72016-04-22 20:36:46635 url::SchemeHostPort server(request_.url);
rchbe69cb902016-02-11 01:10:48636 AlternativeService alternative_service(QUIC, alternative.host(),
637 alternative.port());
638 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
zhongyi3d4a55e72016-04-22 20:36:46639 http_server_properties_.SetAlternativeService(server, alternative_service,
640 expiration);
rchbe69cb902016-02-11 01:10:48641 }
642
[email protected]aa9b14d2013-05-10 23:45:19643 void ExpectBrokenAlternateProtocolMapping() {
zhongyi3d4a55e72016-04-22 20:36:46644 const url::SchemeHostPort server(request_.url);
bncd9b132e2015-07-08 05:16:10645 const AlternativeServiceVector alternative_service_vector =
zhongyi3d4a55e72016-04-22 20:36:46646 http_server_properties_.GetAlternativeServices(server);
bncd9b132e2015-07-08 05:16:10647 EXPECT_EQ(1u, alternative_service_vector.size());
bnc6be245c12015-05-15 11:24:07648 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken(
bncd9b132e2015-07-08 05:16:10649 alternative_service_vector[0]));
[email protected]aa9b14d2013-05-10 23:45:19650 }
651
[email protected]4d590c9c2014-05-02 05:14:33652 void ExpectQuicAlternateProtocolMapping() {
zhongyi3d4a55e72016-04-22 20:36:46653 const url::SchemeHostPort server(request_.url);
bncd9b132e2015-07-08 05:16:10654 const AlternativeServiceVector alternative_service_vector =
zhongyi3d4a55e72016-04-22 20:36:46655 http_server_properties_.GetAlternativeServices(server);
bncd9b132e2015-07-08 05:16:10656 EXPECT_EQ(1u, alternative_service_vector.size());
657 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
[email protected]4d590c9c2014-05-02 05:14:33658 }
659
[email protected]aa9b14d2013-05-10 23:45:19660 void AddHangingNonAlternateProtocolSocketData() {
danakjad1777e2016-04-16 00:56:42661 std::unique_ptr<StaticSocketDataProvider> hanging_data;
zhongyi32569c62016-01-08 02:54:30662 hanging_data.reset(new StaticSocketDataProvider());
[email protected]dda75ab2013-06-22 22:43:30663 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
zhongyi32569c62016-01-08 02:54:30664 hanging_data->set_connect_data(hanging_connect);
665 hanging_data_.push_back(std::move(hanging_data));
666 socket_factory_.AddSocketDataProvider(hanging_data_.back().get());
rchf114d982015-10-21 01:34:56667 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]aa9b14d2013-05-10 23:45:19668 }
669
rtenneti4b06ae72014-08-26 03:43:43670 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
alyssar2adf3ac2016-05-03 17:12:58671 QuicTestPacketMaker client_maker_;
672 QuicTestPacketMaker server_maker_;
danakjad1777e2016-04-16 00:56:42673 std::unique_ptr<HttpNetworkSession> session_;
[email protected]61a527782013-02-21 03:58:00674 MockClientSocketFactory socket_factory_;
rchf114d982015-10-21 01:34:56675 ProofVerifyDetailsChromium verify_details_;
[email protected]e8ff26842013-03-22 21:02:05676 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43677 MockHostResolver host_resolver_;
678 MockCertVerifier cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11679 TransportSecurityState transport_security_state_;
danakjad1777e2016-04-16 00:56:42680 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
rsleevid6de8302016-06-21 01:33:20681 CTPolicyEnforcer ct_policy_enforcer_;
tbansal0f56a39a2016-04-07 22:03:38682 TestSocketPerformanceWatcherFactory test_socket_performance_watcher_factory_;
[email protected]1c04f9522013-02-21 20:32:43683 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
danakjad1777e2016-04-16 00:56:42684 std::unique_ptr<ProxyService> proxy_service_;
685 std::unique_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
[email protected]61a527782013-02-21 03:58:00686 MockRandom random_generator_;
bnc6be245c12015-05-15 11:24:07687 HttpServerPropertiesImpl http_server_properties_;
[email protected]61a527782013-02-21 03:58:00688 HttpNetworkSession::Params params_;
[email protected]aa9b14d2013-05-10 23:45:19689 HttpRequestInfo request_;
vishal.b62985ca92015-04-17 08:45:51690 BoundTestNetLog net_log_;
danakjad1777e2016-04-16 00:56:42691 std::vector<std::unique_ptr<StaticSocketDataProvider>> hanging_data_;
rchf114d982015-10-21 01:34:56692 SSLSocketDataProvider ssl_data_;
tbansal7cec3812015-02-05 21:25:12693
694 private:
695 void SendRequestAndExpectQuicResponseMaybeFromProxy(
696 const std::string& expected,
bnc62a44f022015-04-02 15:59:41697 bool used_proxy,
Avi Drissman13fc8932015-12-20 04:40:46698 uint16_t port) {
danakjad1777e2016-04-16 00:56:42699 std::unique_ptr<HttpNetworkTransaction> trans(
tbansal7cec3812015-02-05 21:25:12700 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
ryansturm49a8cb12016-06-15 16:51:09701 HeadersHandler headers_handler;
702 trans->SetBeforeHeadersSentCallback(
703 base::Bind(&HeadersHandler::OnBeforeHeadersSent,
704 base::Unretained(&headers_handler)));
bncffc2fdf2015-05-14 18:29:49705 RunTransaction(trans);
tbansal7cec3812015-02-05 21:25:12706 CheckWasQuicResponse(trans);
bnc62a44f022015-04-02 15:59:41707 CheckResponsePort(trans, port);
bncffc2fdf2015-05-14 18:29:49708 CheckResponseData(trans, expected);
ryansturm49a8cb12016-06-15 16:51:09709 EXPECT_EQ(used_proxy, headers_handler.was_proxied());
tbansal7cec3812015-02-05 21:25:12710 }
[email protected]61a527782013-02-21 03:58:00711};
712
rjshaded5ced072015-12-18 19:26:02713INSTANTIATE_TEST_CASE_P(Version,
714 QuicNetworkTransactionTest,
[email protected]1e960032013-12-20 19:00:20715 ::testing::ValuesIn(QuicSupportedVersions()));
716
717TEST_P(QuicNetworkTransactionTest, ForceQuic) {
rtenneti8a2f4632016-03-21 20:26:57718 params_.origins_to_force_quic_on.insert(
719 HostPortPair::FromString("mail.example.org:443"));
[email protected]4dca587c2013-03-07 16:54:47720
[email protected]1e960032013-12-20 19:00:20721 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58722 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
723 1, kClientDataStreamId1, true, true,
724 GetRequestHeaders("GET", "https", "/")));
725 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:02726 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58727 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
728 false, true, 0, "hello!"));
729 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:59730 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
[email protected]4dca587c2013-03-07 16:54:47731
rcha5399e02015-04-21 19:32:04732 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4dca587c2013-03-07 16:54:47733
rtennetib8e80fb2016-05-16 00:12:09734 // The non-alternate protocol job needs to hang in order to guarantee that
735 // the alternate-protocol job will "win".
736 AddHangingNonAlternateProtocolSocketData();
737
[email protected]4dca587c2013-03-07 16:54:47738 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47739
tbansal0f56a39a2016-04-07 22:03:38740 EXPECT_FALSE(
741 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]aa9b14d2013-05-10 23:45:19742 SendRequestAndExpectQuicResponse("hello!");
tbansal0f56a39a2016-04-07 22:03:38743 EXPECT_TRUE(
744 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]4dca587c2013-03-07 16:54:47745
[email protected]98b20ce2013-05-10 05:55:26746 // Check that the NetLog was filled reasonably.
mmenke43758e62015-05-04 21:09:46747 TestNetLogEntry::List entries;
[email protected]aa9b14d2013-05-10 23:45:19748 net_log_.GetEntries(&entries);
[email protected]98b20ce2013-05-10 05:55:26749 EXPECT_LT(0u, entries.size());
750
751 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29752 int pos = ExpectLogContainsSomewhere(
753 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
754 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26755 EXPECT_LT(0, pos);
756
rchfd527212015-08-25 00:41:26757 // ... and also a TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29758 pos = ExpectLogContainsSomewhere(
rchfd527212015-08-25 00:41:26759 entries, 0,
760 NetLog::TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED,
ttuttle859dc7a2015-04-23 19:42:29761 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26762 EXPECT_LT(0, pos);
763
rtennetia004d332015-08-28 06:44:57764 std::string packet_number;
765 ASSERT_TRUE(entries[pos].GetStringValue("packet_number", &packet_number));
766 EXPECT_EQ("1", packet_number);
[email protected]98b20ce2013-05-10 05:55:26767
rchfd527212015-08-25 00:41:26768 // ... and also a TYPE_QUIC_SESSION_PACKET_AUTHENTICATED.
769 pos = ExpectLogContainsSomewhere(
770 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_AUTHENTICATED,
771 NetLog::PHASE_NONE);
772 EXPECT_LT(0, pos);
773
[email protected]98b20ce2013-05-10 05:55:26774 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29775 pos = ExpectLogContainsSomewhere(
776 entries, 0, NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
777 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26778 EXPECT_LT(0, pos);
779
780 int log_stream_id;
781 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
[email protected]1e960032013-12-20 19:00:20782 EXPECT_EQ(3, log_stream_id);
[email protected]4dca587c2013-03-07 16:54:47783}
784
[email protected]cf3e3cd62014-02-05 16:16:16785TEST_P(QuicNetworkTransactionTest, QuicProxy) {
tbansal9bf26672016-05-11 18:32:45786 params_.enable_quic = true;
rchf114d982015-10-21 01:34:56787 proxy_service_ =
rch9ae5b3b2016-02-11 00:36:29788 ProxyService::CreateFixedFromPacResult("QUIC mail.example.org:70");
[email protected]cf3e3cd62014-02-05 16:16:16789
[email protected]cf3e3cd62014-02-05 16:16:16790 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58791 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
792 1, kClientDataStreamId1, true, true,
793 GetRequestHeaders("GET", "http", "/")));
794 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:02795 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58796 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
797 false, true, 0, "hello!"));
798 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50799 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59800 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]cf3e3cd62014-02-05 16:16:16801
rcha5399e02015-04-21 19:32:04802 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cf3e3cd62014-02-05 16:16:16803
tbansal0f56a39a2016-04-07 22:03:38804 EXPECT_FALSE(
805 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16806 // There is no need to set up an alternate protocol job, because
807 // no attempt will be made to speak to the proxy over TCP.
808
rch9ae5b3b2016-02-11 00:36:29809 request_.url = GURL("http://mail.example.org/");
[email protected]cf3e3cd62014-02-05 16:16:16810 CreateSession();
811
bnc62a44f022015-04-02 15:59:41812 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
tbansal0f56a39a2016-04-07 22:03:38813 EXPECT_TRUE(
814 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16815}
816
bnc313ba9c2015-06-11 15:42:31817// Regression test for https://crbug.com/492458. Test that for an HTTP
818// connection through a QUIC proxy, the certificate exhibited by the proxy is
819// checked against the proxy hostname, not the origin hostname.
820TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) {
rch9ae5b3b2016-02-11 00:36:29821 const std::string origin_host = "mail.example.com";
bnc313ba9c2015-06-11 15:42:31822 const std::string proxy_host = "www.example.org";
823
tbansal9bf26672016-05-11 18:32:45824 params_.enable_quic = true;
rdsmith82957ad2015-09-16 19:42:03825 proxy_service_ =
826 ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70");
bnc313ba9c2015-06-11 15:42:31827
alyssar2adf3ac2016-05-03 17:12:58828 client_maker_.set_hostname(origin_host);
bnc313ba9c2015-06-11 15:42:31829 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58830 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
831 1, kClientDataStreamId1, true, true,
832 GetRequestHeaders("GET", "http", "/")));
833 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc313ba9c2015-06-11 15:42:31834 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58835 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
836 false, true, 0, "hello!"));
837 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50838 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59839 mock_quic_data.AddRead(ASYNC, 0);
bnc313ba9c2015-06-11 15:42:31840 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
841
842 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29843 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bnc313ba9c2015-06-11 15:42:31844 ASSERT_TRUE(cert.get());
845 // This certificate is valid for the proxy, but not for the origin.
846 bool common_name_fallback_used;
847 EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used));
848 EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used));
849 ProofVerifyDetailsChromium verify_details;
850 verify_details.cert_verify_result.verified_cert = cert;
851 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rchf114d982015-10-21 01:34:56852 ProofVerifyDetailsChromium verify_details2;
853 verify_details2.cert_verify_result.verified_cert = cert;
854 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
bnc313ba9c2015-06-11 15:42:31855
856 request_.url = GURL("http://" + origin_host);
rtennetib8e80fb2016-05-16 00:12:09857 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32858 CreateSession();
bnc313ba9c2015-06-11 15:42:31859 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
860 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
861}
862
rchbe69cb902016-02-11 01:10:48863TEST_P(QuicNetworkTransactionTest, AlternativeServicesDifferentHost) {
rchbe69cb902016-02-11 01:10:48864 HostPortPair origin("www.example.org", 443);
865 HostPortPair alternative("mail.example.org", 443);
866
867 base::FilePath certs_dir = GetTestCertsDirectory();
868 scoped_refptr<X509Certificate> cert(
869 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
870 ASSERT_TRUE(cert.get());
871 // TODO(rch): the connection should be "to" the origin, so if the cert is
872 // valid for the origin but not the alternative, that should work too.
873 bool common_name_fallback_used;
874 EXPECT_TRUE(cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
875 EXPECT_TRUE(
876 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
877 ProofVerifyDetailsChromium verify_details;
878 verify_details.cert_verify_result.verified_cert = cert;
879 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
880
alyssar2adf3ac2016-05-03 17:12:58881 client_maker_.set_hostname(origin.host());
rchbe69cb902016-02-11 01:10:48882 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58883 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
884 1, kClientDataStreamId1, true, true,
885 GetRequestHeaders("GET", "https", "/")));
886 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rchbe69cb902016-02-11 01:10:48887 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58888 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
889 false, true, 0, "hello!"));
890 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchbe69cb902016-02-11 01:10:48891 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
892 mock_quic_data.AddRead(ASYNC, 0);
893 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
894
895 request_.url = GURL("https://" + origin.host());
896 AddQuicRemoteAlternativeServiceMapping(
897 MockCryptoClientStream::CONFIRM_HANDSHAKE, alternative);
rtennetib8e80fb2016-05-16 00:12:09898 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32899 CreateSession();
rchbe69cb902016-02-11 01:10:48900
901 SendRequestAndExpectQuicResponse("hello!");
902}
903
[email protected]1e960032013-12-20 19:00:20904TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
rtenneti8a2f4632016-03-21 20:26:57905 params_.origins_to_force_quic_on.insert(
906 HostPortPair::FromString("mail.example.org:443"));
[email protected]cebe3282013-05-22 23:49:30907
tbansalfdf5665b2015-09-21 22:46:40908 MockQuicData mock_quic_data1;
909 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
[email protected]1e960032013-12-20 19:00:20910
tbansalfdf5665b2015-09-21 22:46:40911 MockQuicData mock_quic_data2;
zhongyi32569c62016-01-08 02:54:30912 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40913 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
rch6faa4d42016-01-05 20:48:43914 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40915
916 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
917 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
[email protected]cebe3282013-05-22 23:49:30918
919 CreateSession();
920
tbansal0f56a39a2016-04-07 22:03:38921 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40922 for (size_t i = 0; i < 2; ++i) {
danakjad1777e2016-04-16 00:56:42923 std::unique_ptr<HttpNetworkTransaction> trans(
tbansalfdf5665b2015-09-21 22:46:40924 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
925 TestCompletionCallback callback;
926 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
927 EXPECT_EQ(ERR_IO_PENDING, rv);
928 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
tbansal0f56a39a2016-04-07 22:03:38929 EXPECT_EQ(1 + i, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40930 }
[email protected]cebe3282013-05-22 23:49:30931}
932
tbansalc8a94ea2015-11-02 23:58:51933TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
934 // Attempt to "force" quic on 443, which will not be honored.
rtenneti8a2f4632016-03-21 20:26:57935 params_.origins_to_force_quic_on.insert(
936 HostPortPair::FromString("www.google.com:443"));
tbansalc8a94ea2015-11-02 23:58:51937
938 MockRead http_reads[] = {
939 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
940 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
941 MockRead(ASYNC, OK)};
942
943 StaticSocketDataProvider data(http_reads, arraysize(http_reads), nullptr, 0);
944 socket_factory_.AddSocketDataProvider(&data);
945 SSLSocketDataProvider ssl(ASYNC, OK);
946 socket_factory_.AddSSLSocketDataProvider(&ssl);
947
948 CreateSession();
949
950 SendRequestAndExpectHttpResponse("hello world");
tbansal0f56a39a2016-04-07 22:03:38951 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalc8a94ea2015-11-02 23:58:51952}
953
bncc958faa2015-07-31 18:14:52954TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52955 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56956 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
957 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52958 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
959 MockRead(ASYNC, OK)};
960
961 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
962 0);
963 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56964 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52965
966 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58967 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
968 1, kClientDataStreamId1, true, true,
969 GetRequestHeaders("GET", "https", "/")));
970 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:52971 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58972 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
973 false, true, 0, "hello!"));
974 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:52975 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59976 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52977
978 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
979
rtennetib8e80fb2016-05-16 00:12:09980 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32981 CreateSession();
bncc958faa2015-07-31 18:14:52982
983 SendRequestAndExpectHttpResponse("hello world");
984 SendRequestAndExpectQuicResponse("hello!");
985}
986
rchf47265dc2016-03-21 21:33:12987TEST_P(QuicNetworkTransactionTest,
988 UseAlternativeServiceWithProbabilityForQuic) {
989 MockRead http_reads[] = {
990 MockRead("HTTP/1.1 200 OK\r\n"),
991 MockRead(kQuicAlternativeServiceWithProbabilityHeader),
992 MockRead("hello world"),
993 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
994 MockRead(ASYNC, OK)};
995
996 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
997 0);
998 socket_factory_.AddSocketDataProvider(&http_data);
999 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1000
1001 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581002 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1003 1, kClientDataStreamId1, true, true,
1004 GetRequestHeaders("GET", "https", "/")));
1005 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rchf47265dc2016-03-21 21:33:121006 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581007 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1008 false, true, 0, "hello!"));
1009 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchf47265dc2016-03-21 21:33:121010 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1011 mock_quic_data.AddRead(ASYNC, 0); // EOF
1012
1013 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1014
rtennetib8e80fb2016-05-16 00:12:091015 AddHangingNonAlternateProtocolSocketData();
rchf47265dc2016-03-21 21:33:121016 CreateSession();
1017
1018 SendRequestAndExpectHttpResponse("hello world");
1019 SendRequestAndExpectQuicResponse("hello!");
1020}
1021
zhongyi3d4a55e72016-04-22 20:36:461022TEST_P(QuicNetworkTransactionTest, SetAlternativeServiceWithScheme) {
1023 MockRead http_reads[] = {
1024 MockRead("HTTP/1.1 200 OK\r\n"),
1025 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
1026 MockRead("hello world"),
1027 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1028 MockRead(ASYNC, OK)};
1029
1030 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1031 0);
1032
1033 socket_factory_.AddSocketDataProvider(&http_data);
1034 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1035
1036 CreateSession();
bncb26024382016-06-29 02:39:451037 // Send https request, ignore alternative service advertising if response
zhongyi3d4a55e72016-04-22 20:36:461038 // header advertises alternative service for mail.example.org.
bncb26024382016-06-29 02:39:451039 request_.url = GURL("https://mail.example.org:443");
zhongyi3d4a55e72016-04-22 20:36:461040 SendRequestAndExpectHttpResponse("hello world");
bnc525e175a2016-06-20 12:36:401041 HttpServerProperties* http_server_properties =
zhongyi3d4a55e72016-04-22 20:36:461042 session_->http_server_properties();
1043 url::SchemeHostPort http_server("http", "mail.example.org", 443);
1044 url::SchemeHostPort https_server("https", "mail.example.org", 443);
1045 // Check alternative service is set for the correct origin.
zhongyi3d4a55e72016-04-22 20:36:461046 EXPECT_EQ(
bncb26024382016-06-29 02:39:451047 2u, http_server_properties->GetAlternativeServices(https_server).size());
1048 EXPECT_TRUE(
1049 http_server_properties->GetAlternativeServices(http_server).empty());
zhongyi3d4a55e72016-04-22 20:36:461050}
1051
1052TEST_P(QuicNetworkTransactionTest, DoNotGetAltSvcForDifferentOrigin) {
1053 MockRead http_reads[] = {
1054 MockRead("HTTP/1.1 200 OK\r\n"),
1055 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
1056 MockRead("hello world"),
1057 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1058 MockRead(ASYNC, OK)};
1059
1060 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1061 0);
1062
1063 socket_factory_.AddSocketDataProvider(&http_data);
1064 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1065 socket_factory_.AddSocketDataProvider(&http_data);
1066 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1067
1068 CreateSession();
1069
1070 // Send https request and set alternative services if response header
1071 // advertises alternative service for mail.example.org.
1072 SendRequestAndExpectHttpResponse("hello world");
bnc525e175a2016-06-20 12:36:401073 HttpServerProperties* http_server_properties =
zhongyi3d4a55e72016-04-22 20:36:461074 session_->http_server_properties();
1075
1076 const url::SchemeHostPort https_server(request_.url);
1077 // Check alternative service is set.
1078 AlternativeServiceVector alternative_service_vector =
1079 http_server_properties->GetAlternativeServices(https_server);
1080 EXPECT_EQ(2u, alternative_service_vector.size());
1081
1082 // Send http request to the same origin but with diffrent scheme, should not
1083 // use QUIC.
1084 request_.url = GURL("http://mail.example.org:443");
1085 SendRequestAndExpectHttpResponse("hello world");
1086}
1087
bnc8be55ebb2015-10-30 14:12:071088TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) {
1089 std::string altsvc_header = base::StringPrintf(
1090 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam());
1091 MockRead http_reads[] = {
1092 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1093 MockRead("hello world"),
1094 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1095 MockRead(ASYNC, OK)};
1096
1097 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1098 0);
1099 socket_factory_.AddSocketDataProvider(&http_data);
1100 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1101
1102 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581103 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1104 1, kClientDataStreamId1, true, true,
1105 GetRequestHeaders("GET", "https", "/")));
1106 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc8be55ebb2015-10-30 14:12:071107 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581108 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1109 false, true, 0, "hello!"));
1110 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bnc8be55ebb2015-10-30 14:12:071111 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591112 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc8be55ebb2015-10-30 14:12:071113
1114 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1115
rtennetib8e80fb2016-05-16 00:12:091116 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321117 CreateSession();
bnc8be55ebb2015-10-30 14:12:071118
1119 SendRequestAndExpectHttpResponse("hello world");
1120 SendRequestAndExpectQuicResponse("hello!");
1121}
1122
zhongyi6b5a3892016-03-12 04:46:201123TEST_P(QuicNetworkTransactionTest, GoAwayWithConnectionMigrationOnPortsOnly) {
1124 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581125 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1126 1, kClientDataStreamId1, true, true,
1127 GetRequestHeaders("GET", "https", "/")));
1128 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi6b5a3892016-03-12 04:46:201129 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1130 // Read a GoAway packet with
1131 // QuicErrorCode: QUIC_ERROR_MIGRATING_PORT from the peer.
alyssar2adf3ac2016-05-03 17:12:581132 mock_quic_data.AddRead(ConstructServerGoAwayPacket(
1133 2, QUIC_ERROR_MIGRATING_PORT,
1134 "connection migration with port change only"));
1135 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
1136 mock_quic_data.AddRead(ConstructServerDataPacket(3, kClientDataStreamId1,
1137 false, true, 0, "hello!"));
1138 mock_quic_data.AddWrite(ConstructClientAckAndRstPacket(
zhongyi6b5a3892016-03-12 04:46:201139 3, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 3, 3, 1));
1140 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1141 mock_quic_data.AddRead(ASYNC, 0); // EOF
1142
1143 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1144
1145 // The non-alternate protocol job needs to hang in order to guarantee that
1146 // the alternate-protocol job will "win".
1147 AddHangingNonAlternateProtocolSocketData();
1148
1149 // In order for a new QUIC session to be established via alternate-protocol
1150 // without racing an HTTP connection, we need the host resolution to happen
1151 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1152 // connection to the the server, in this test we require confirmation
1153 // before encrypting so the HTTP job will still start.
1154 host_resolver_.set_synchronous_mode(true);
1155 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1156 "");
1157 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1158 AddressList address;
1159 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1160 nullptr, net_log_.bound());
1161
1162 CreateSession();
1163 session_->quic_stream_factory()->set_require_confirmation(true);
1164 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1165
danakjad1777e2016-04-16 00:56:421166 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyi6b5a3892016-03-12 04:46:201167 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1168 TestCompletionCallback callback;
1169 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1170 EXPECT_EQ(ERR_IO_PENDING, rv);
1171
1172 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1173 QuicSession::HANDSHAKE_CONFIRMED);
1174 EXPECT_EQ(OK, callback.WaitForResult());
1175
1176 // Check whether this transaction is correctly marked as received a go-away
1177 // because of migrating port.
1178 NetErrorDetails details;
1179 EXPECT_FALSE(details.quic_port_migration_detected);
1180 trans->PopulateNetErrorDetails(&details);
1181 EXPECT_TRUE(details.quic_port_migration_detected);
1182}
1183
bnc8be55ebb2015-10-30 14:12:071184TEST_P(QuicNetworkTransactionTest,
1185 DoNotUseAlternativeServiceQuicUnsupportedVersion) {
1186 std::string altsvc_header = base::StringPrintf(
1187 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam() - 1);
1188 MockRead http_reads[] = {
1189 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1190 MockRead("hello world"),
1191 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1192 MockRead(ASYNC, OK)};
1193
1194 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1195 0);
1196 socket_factory_.AddSocketDataProvider(&http_data);
1197 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1198 socket_factory_.AddSocketDataProvider(&http_data);
1199 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1200
rch3f4b8452016-02-23 16:59:321201 CreateSession();
bnc8be55ebb2015-10-30 14:12:071202
1203 SendRequestAndExpectHttpResponse("hello world");
1204 SendRequestAndExpectHttpResponse("hello world");
1205}
1206
bncc958faa2015-07-31 18:14:521207// When multiple alternative services are advertised,
zhongyi32569c62016-01-08 02:54:301208// HttpStreamFactoryImpl::RequestStreamInternal() should select the alternative
1209// service which uses existing QUIC session if available. If no existing QUIC
1210// session can be used, use the first alternative service from the list.
1211TEST_P(QuicNetworkTransactionTest, UseExistingAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:521212 MockRead http_reads[] = {
1213 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291214 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
bncc958faa2015-07-31 18:14:521215 MockRead("hello world"),
1216 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1217 MockRead(ASYNC, OK)};
1218
1219 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1220 0);
1221 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561222 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521223
zhongyi32569c62016-01-08 02:54:301224 QuicStreamOffset request_header_offset = 0;
1225 QuicStreamOffset response_header_offset = 0;
1226 // First QUIC request data.
rch9ae5b3b2016-02-11 00:36:291227 // Open a session to foo.example.org:443 using the first entry of the
zhongyi32569c62016-01-08 02:54:301228 // alternative service list.
bncc958faa2015-07-31 18:14:521229 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581230 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301231 1, kClientDataStreamId1, true, true,
1232 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1233
1234 std::string alt_svc_list =
rch9ae5b3b2016-02-11 00:36:291235 "quic=\"mail.example.org:444\", quic=\"foo.example.org:443\", "
1236 "quic=\"bar.example.org:445\"";
alyssar2adf3ac2016-05-03 17:12:581237 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301238 1, kClientDataStreamId1, false, false,
1239 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581240 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1241 false, true, 0, "hello!"));
1242 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301243
1244 // Second QUIC request data.
1245 // Connection pooling, using existing session, no need to include version
1246 // as version negotiation has been completed.
alyssar2adf3ac2016-05-03 17:12:581247 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301248 3, kClientDataStreamId2, false, true,
1249 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581250 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301251 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1252 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581253 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1254 false, true, 0, "hello!"));
1255 mock_quic_data.AddWrite(
1256 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
bncc958faa2015-07-31 18:14:521257 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591258 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521259
1260 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1261
rtennetib8e80fb2016-05-16 00:12:091262 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321263 CreateSession();
bncc958faa2015-07-31 18:14:521264
1265 SendRequestAndExpectHttpResponse("hello world");
zhongyi32569c62016-01-08 02:54:301266
bnc359ed2a2016-04-29 20:43:451267 SendRequestAndExpectQuicResponse("hello!");
1268 SendRequestAndExpectQuicResponse("hello!");
zhongyi32569c62016-01-08 02:54:301269}
1270
bnc359ed2a2016-04-29 20:43:451271// Pool to existing session with matching QuicServerId
1272// even if alternative service destination is different.
1273TEST_P(QuicNetworkTransactionTest, PoolByOrigin) {
zhongyi32569c62016-01-08 02:54:301274 MockQuicData mock_quic_data;
bnc359ed2a2016-04-29 20:43:451275 QuicStreamOffset request_header_offset(0);
1276 QuicStreamOffset response_header_offset(0);
1277
1278 // First request.
alyssar2adf3ac2016-05-03 17:12:581279 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301280 1, kClientDataStreamId1, true, true,
1281 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581282 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451283 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1284 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581285 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1286 false, true, 0, "hello!"));
1287 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301288
bnc359ed2a2016-04-29 20:43:451289 // Second request.
alyssar2adf3ac2016-05-03 17:12:581290 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301291 3, kClientDataStreamId2, false, true,
1292 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581293 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301294 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1295 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581296 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1297 false, true, 0, "hello!"));
1298 mock_quic_data.AddWrite(
1299 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
zhongyi32569c62016-01-08 02:54:301300 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1301 mock_quic_data.AddRead(ASYNC, 0); // EOF
1302
1303 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bnc359ed2a2016-04-29 20:43:451304
1305 AddHangingNonAlternateProtocolSocketData();
1306 AddHangingNonAlternateProtocolSocketData();
zhongyi32569c62016-01-08 02:54:301307
rch3f4b8452016-02-23 16:59:321308 CreateSession();
zhongyi32569c62016-01-08 02:54:301309
bnc359ed2a2016-04-29 20:43:451310 const char destination1[] = "first.example.com";
1311 const char destination2[] = "second.example.com";
1312
1313 // Set up alternative service entry to destination1.
1314 url::SchemeHostPort server(request_.url);
1315 AlternativeService alternative_service(QUIC, destination1, 443);
1316 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1317 http_server_properties_.SetAlternativeService(server, alternative_service,
1318 expiration);
1319 // First request opens connection to |destination1|
1320 // with QuicServerId.host() == kDefaultServerHostName.
1321 SendRequestAndExpectQuicResponse("hello!");
1322
1323 // Set up alternative service entry to a different destination.
1324 alternative_service = AlternativeService(QUIC, destination2, 443);
1325 http_server_properties_.SetAlternativeService(server, alternative_service,
1326 expiration);
1327 // Second request pools to existing connection with same QuicServerId,
1328 // even though alternative service destination is different.
1329 SendRequestAndExpectQuicResponse("hello!");
1330}
1331
1332// Pool to existing session with matching destination and matching certificate
1333// even if origin is different, and even if the alternative service with
1334// matching destination is not the first one on the list.
1335TEST_P(QuicNetworkTransactionTest, PoolByDestination) {
1336 GURL origin1 = request_.url;
1337 GURL origin2("https://www.example.org/");
1338 ASSERT_NE(origin1.host(), origin2.host());
1339
1340 MockQuicData mock_quic_data;
1341 QuicStreamOffset request_header_offset(0);
1342 QuicStreamOffset response_header_offset(0);
1343
1344 // First request.
alyssar2adf3ac2016-05-03 17:12:581345 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:451346 1, kClientDataStreamId1, true, true,
1347 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581348 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451349 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1350 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581351 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1352 false, true, 0, "hello!"));
1353 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bnc359ed2a2016-04-29 20:43:451354
1355 // Second request.
alyssar2adf3ac2016-05-03 17:12:581356 QuicTestPacketMaker client_maker2(GetParam(), 0, clock_, origin2.host(),
1357 Perspective::IS_CLIENT);
1358 QuicTestPacketMaker server_maker2(GetParam(), 0, clock_, origin2.host(),
1359 Perspective::IS_SERVER);
1360 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:451361 3, kClientDataStreamId2, false, true,
alyssar2adf3ac2016-05-03 17:12:581362 GetRequestHeaders("GET", "https", "/", &client_maker2),
1363 &request_header_offset, &client_maker2));
1364 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451365 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
alyssar2adf3ac2016-05-03 17:12:581366 &response_header_offset, &server_maker2));
1367 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1368 false, true, 0, "hello!"));
1369 mock_quic_data.AddWrite(
1370 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
bnc359ed2a2016-04-29 20:43:451371 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1372 mock_quic_data.AddRead(ASYNC, 0); // EOF
1373
1374 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1375
1376 AddHangingNonAlternateProtocolSocketData();
1377 AddHangingNonAlternateProtocolSocketData();
1378
1379 CreateSession();
1380
1381 const char destination1[] = "first.example.com";
1382 const char destination2[] = "second.example.com";
1383
1384 // Set up alternative service for |origin1|.
1385 AlternativeService alternative_service1(QUIC, destination1, 443);
1386 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1387 http_server_properties_.SetAlternativeService(
1388 url::SchemeHostPort(origin1), alternative_service1, expiration);
1389
1390 // Set up multiple alternative service entries for |origin2|,
1391 // the first one with a different destination as for |origin1|,
1392 // the second one with the same. The second one should be used,
1393 // because the request can be pooled to that one.
1394 AlternativeService alternative_service2(QUIC, destination2, 443);
1395 AlternativeServiceInfoVector alternative_services;
1396 alternative_services.push_back(
1397 AlternativeServiceInfo(alternative_service2, expiration));
1398 alternative_services.push_back(
1399 AlternativeServiceInfo(alternative_service1, expiration));
1400 http_server_properties_.SetAlternativeServices(url::SchemeHostPort(origin2),
1401 alternative_services);
bnc359ed2a2016-04-29 20:43:451402 // First request opens connection to |destination1|
1403 // with QuicServerId.host() == origin1.host().
1404 SendRequestAndExpectQuicResponse("hello!");
1405
1406 // Second request pools to existing connection with same destination,
1407 // because certificate matches, even though QuicServerId is different.
1408 request_.url = origin2;
alyssar2adf3ac2016-05-03 17:12:581409
bnc359ed2a2016-04-29 20:43:451410 SendRequestAndExpectQuicResponse("hello!");
zhongyi32569c62016-01-08 02:54:301411}
1412
1413// Multiple origins have listed the same alternative services. When there's a
1414// existing QUIC session opened by a request to other origin,
1415// if the cert is valid, should select this QUIC session to make the request
1416// if this is also the first existing QUIC session.
1417TEST_P(QuicNetworkTransactionTest,
1418 UseSharedExistingAlternativeServiceForQuicWithValidCert) {
rch9ae5b3b2016-02-11 00:36:291419 // Default cert is valid for *.example.org
zhongyi32569c62016-01-08 02:54:301420
rch9ae5b3b2016-02-11 00:36:291421 // HTTP data for request to www.example.org.
zhongyi32569c62016-01-08 02:54:301422 MockRead http_reads[] = {
1423 MockRead("HTTP/1.1 200 OK\r\n"),
1424 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
rch9ae5b3b2016-02-11 00:36:291425 MockRead("hello world from www.example.org"),
zhongyi32569c62016-01-08 02:54:301426 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1427 MockRead(ASYNC, OK)};
1428
1429 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1430 0);
1431 socket_factory_.AddSocketDataProvider(&http_data);
1432 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1433
1434 // HTTP data for request to mail.example.org.
1435 MockRead http_reads2[] = {
1436 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291437 MockRead("Alt-Svc: quic=\":444\", quic=\"www.example.org:443\"\r\n\r\n"),
zhongyi32569c62016-01-08 02:54:301438 MockRead("hello world from mail.example.org"),
1439 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1440 MockRead(ASYNC, OK)};
1441
1442 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1443 nullptr, 0);
1444 socket_factory_.AddSocketDataProvider(&http_data2);
1445 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1446
1447 QuicStreamOffset request_header_offset = 0;
1448 QuicStreamOffset response_header_offset = 0;
1449
alyssar2adf3ac2016-05-03 17:12:581450 QuicTestPacketMaker client_maker(GetParam(), 0, clock_, "mail.example.org",
1451 Perspective::IS_CLIENT);
1452 server_maker_.set_hostname("www.example.org");
1453 client_maker_.set_hostname("www.example.org");
zhongyi32569c62016-01-08 02:54:301454 MockQuicData mock_quic_data;
1455
1456 // First QUIC request data.
alyssar2adf3ac2016-05-03 17:12:581457 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301458 1, kClientDataStreamId1, true, true,
1459 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1460
alyssar2adf3ac2016-05-03 17:12:581461 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301462 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1463 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581464 mock_quic_data.AddRead(ConstructServerDataPacket(
1465 2, kClientDataStreamId1, false, true, 0, "hello from mail QUIC!"));
1466 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301467 // Second QUIC request data.
alyssar2adf3ac2016-05-03 17:12:581468 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301469 3, kClientDataStreamId2, false, true,
alyssar2adf3ac2016-05-03 17:12:581470 GetRequestHeaders("GET", "https", "/", &client_maker),
1471 &request_header_offset, &client_maker));
1472 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301473 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1474 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581475 mock_quic_data.AddRead(ConstructServerDataPacket(
1476 4, kClientDataStreamId2, false, true, 0, "hello from mail QUIC!"));
1477 mock_quic_data.AddWrite(
1478 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
zhongyi32569c62016-01-08 02:54:301479 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1480 mock_quic_data.AddRead(ASYNC, 0); // EOF
1481
1482 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
zhongyi32569c62016-01-08 02:54:301483
rtennetib8e80fb2016-05-16 00:12:091484 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321485 CreateSession();
zhongyi32569c62016-01-08 02:54:301486
1487 // Send two HTTP requests, responses set up alt-svc lists for the origins.
rch9ae5b3b2016-02-11 00:36:291488 request_.url = GURL("https://www.example.org/");
1489 SendRequestAndExpectHttpResponse("hello world from www.example.org");
zhongyi32569c62016-01-08 02:54:301490 request_.url = GURL("https://mail.example.org/");
1491 SendRequestAndExpectHttpResponse("hello world from mail.example.org");
1492
rch9ae5b3b2016-02-11 00:36:291493 // Open a QUIC session to mail.example.org:443 when making request
1494 // to mail.example.org.
1495 request_.url = GURL("https://www.example.org/");
bnc359ed2a2016-04-29 20:43:451496 SendRequestAndExpectQuicResponse("hello from mail QUIC!");
zhongyi32569c62016-01-08 02:54:301497
rch9ae5b3b2016-02-11 00:36:291498 // Uses the existing QUIC session when making request to www.example.org.
zhongyi32569c62016-01-08 02:54:301499 request_.url = GURL("https://mail.example.org/");
bnc359ed2a2016-04-29 20:43:451500 SendRequestAndExpectQuicResponse("hello from mail QUIC!");
bncc958faa2015-07-31 18:14:521501}
1502
1503TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) {
bncc958faa2015-07-31 18:14:521504 MockRead http_reads[] = {
1505 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561506 MockRead(kQuicAlternativeServiceDifferentPortHeader),
bncc958faa2015-07-31 18:14:521507 MockRead("hello world"),
1508 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1509 MockRead(ASYNC, OK)};
1510
1511 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1512 0);
1513 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561514 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521515
rtennetib8e80fb2016-05-16 00:12:091516 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321517 CreateSession();
bncc958faa2015-07-31 18:14:521518
1519 SendRequestAndExpectHttpResponse("hello world");
bnc359ed2a2016-04-29 20:43:451520
1521 url::SchemeHostPort http_server("https", kDefaultServerHostName, 443);
1522 AlternativeServiceVector alternative_service_vector =
1523 http_server_properties_.GetAlternativeServices(http_server);
1524 ASSERT_EQ(1u, alternative_service_vector.size());
1525 const AlternativeService alternative_service = alternative_service_vector[0];
1526 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
1527 EXPECT_EQ(kDefaultServerHostName, alternative_service_vector[0].host);
1528 EXPECT_EQ(137, alternative_service_vector[0].port);
bncc958faa2015-07-31 18:14:521529}
1530
1531TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) {
bncc958faa2015-07-31 18:14:521532 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561533 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1534 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521535 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1536 MockRead(ASYNC, OK)};
1537
1538 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1539 0);
1540 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561541 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521542
1543 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581544 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1545 1, kClientDataStreamId1, true, true,
1546 GetRequestHeaders("GET", "https", "/")));
1547 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:521548 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581549 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1550 false, true, 0, "hello!"));
1551 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:521552 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1553 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521554
1555 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1556
rtennetib8e80fb2016-05-16 00:12:091557 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321558 CreateSession();
bncc958faa2015-07-31 18:14:521559
1560 AlternativeService alternative_service(QUIC,
1561 HostPortPair::FromURL(request_.url));
1562 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
1563 alternative_service);
1564 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1565 alternative_service));
1566
1567 SendRequestAndExpectHttpResponse("hello world");
1568 SendRequestAndExpectQuicResponse("hello!");
1569
mmenkee24011922015-12-17 22:12:591570 mock_quic_data.Resume();
bncc958faa2015-07-31 18:14:521571
1572 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1573 alternative_service));
1574}
1575
bncc958faa2015-07-31 18:14:521576TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) {
bncc958faa2015-07-31 18:14:521577 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561578 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1579 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521580 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1581 MockRead(ASYNC, OK)};
1582
1583 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1584 0);
1585 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561586 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521587
1588 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581589 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1590 1, kClientDataStreamId1, true, true,
1591 GetRequestHeaders("GET", "https", "/")));
1592 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:521593 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581594 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1595 false, true, 0, "hello!"));
1596 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:521597 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
1598
1599 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1600
1601 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321602 CreateSession();
bncc958faa2015-07-31 18:14:521603
1604 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1605 SendRequestAndExpectHttpResponse("hello world");
1606}
1607
bnc1c196c6e2016-05-28 13:51:481608TEST_P(QuicNetworkTransactionTest, HungAlternativeService) {
[email protected]dda75ab2013-06-22 22:43:301609 crypto_client_stream_factory_.set_handshake_mode(
1610 MockCryptoClientStream::COLD_START);
1611
1612 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561613 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
rch9ae5b3b2016-02-11 00:36:291614 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561615 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")};
[email protected]dda75ab2013-06-22 22:43:301616
1617 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561618 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
bnc1c196c6e2016-05-28 13:51:481619 MockRead(SYNCHRONOUS, 4, kQuicAlternativeServiceHeader),
rchf114d982015-10-21 01:34:561620 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]dda75ab2013-06-22 22:43:301621
mmenke651bae7f2015-12-18 21:26:451622 SequencedSocketData http_data(http_reads, arraysize(http_reads), http_writes,
1623 arraysize(http_writes));
bnc912a04b2016-04-20 14:19:501624 socket_factory_.AddSocketDataProvider(&http_data);
1625 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301626
1627 // The QUIC transaction will not be allowed to complete.
mmenke651bae7f2015-12-18 21:26:451628 MockWrite quic_writes[] = {MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 1)};
[email protected]dda75ab2013-06-22 22:43:301629 MockRead quic_reads[] = {
mmenke651bae7f2015-12-18 21:26:451630 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0),
[email protected]dda75ab2013-06-22 22:43:301631 };
mmenke651bae7f2015-12-18 21:26:451632 SequencedSocketData quic_data(quic_reads, arraysize(quic_reads), quic_writes,
1633 arraysize(quic_writes));
bnc912a04b2016-04-20 14:19:501634 socket_factory_.AddSocketDataProvider(&quic_data);
[email protected]dda75ab2013-06-22 22:43:301635
1636 // The HTTP transaction will complete.
mmenke651bae7f2015-12-18 21:26:451637 SequencedSocketData http_data2(http_reads, arraysize(http_reads), http_writes,
1638 arraysize(http_writes));
bnc912a04b2016-04-20 14:19:501639 socket_factory_.AddSocketDataProvider(&http_data2);
1640 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301641
bnc912a04b2016-04-20 14:19:501642 CreateSession();
[email protected]dda75ab2013-06-22 22:43:301643
1644 // Run the first request.
[email protected]dda75ab2013-06-22 22:43:301645 SendRequestAndExpectHttpResponse("hello world");
rch37de576c2015-05-17 20:28:171646 ASSERT_TRUE(http_data.AllReadDataConsumed());
1647 ASSERT_TRUE(http_data.AllWriteDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301648
1649 // Now run the second request in which the QUIC socket hangs,
1650 // and verify the the transaction continues over HTTP.
[email protected]dda75ab2013-06-22 22:43:301651 SendRequestAndExpectHttpResponse("hello world");
mmenke651bae7f2015-12-18 21:26:451652 base::RunLoop().RunUntilIdle();
[email protected]dda75ab2013-06-22 22:43:301653
rch37de576c2015-05-17 20:28:171654 ASSERT_TRUE(http_data2.AllReadDataConsumed());
1655 ASSERT_TRUE(http_data2.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:451656 ASSERT_TRUE(quic_data.AllReadDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301657}
1658
[email protected]1e960032013-12-20 19:00:201659TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
[email protected]1e960032013-12-20 19:00:201660 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581661 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1662 1, kClientDataStreamId1, true, true,
1663 GetRequestHeaders("GET", "https", "/")));
1664 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021665 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581666 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1667 false, true, 0, "hello!"));
1668 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501669 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591670 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]8ba81212013-05-03 13:11:481671
rcha5399e02015-04-21 19:32:041672 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]8ba81212013-05-03 13:11:481673
rtennetib8e80fb2016-05-16 00:12:091674 // The non-alternate protocol job needs to hang in order to guarantee that
1675 // the alternate-protocol job will "win".
1676 AddHangingNonAlternateProtocolSocketData();
1677
rch3f4b8452016-02-23 16:59:321678 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:191679 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1680 SendRequestAndExpectQuicResponse("hello!");
[email protected]8ba81212013-05-03 13:11:481681}
1682
[email protected]1e960032013-12-20 19:00:201683TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
[email protected]1e960032013-12-20 19:00:201684 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581685 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1686 1, kClientDataStreamId1, true, true,
1687 GetRequestHeaders("GET", "https", "/")));
1688 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021689 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581690 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1691 false, true, 0, "hello!"));
1692 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501693 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591694 mock_quic_data.AddRead(ASYNC, 0); // EOF
rcha5399e02015-04-21 19:32:041695 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]3a120a6b2013-06-25 01:08:271696
1697 // In order for a new QUIC session to be established via alternate-protocol
1698 // without racing an HTTP connection, we need the host resolution to happen
1699 // synchronously.
1700 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291701 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561702 "");
rch9ae5b3b2016-02-11 00:36:291703 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]3a120a6b2013-06-25 01:08:271704 AddressList address;
rjshaded5ced072015-12-18 19:26:021705 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1706 nullptr, net_log_.bound());
[email protected]3a120a6b2013-06-25 01:08:271707
rtennetib8e80fb2016-05-16 00:12:091708 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321709 CreateSession();
[email protected]3a120a6b2013-06-25 01:08:271710 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1711 SendRequestAndExpectQuicResponse("hello!");
1712}
1713
[email protected]0fc924b2014-03-31 04:34:151714TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) {
rdsmith82957ad2015-09-16 19:42:031715 proxy_service_ = ProxyService::CreateFixedFromPacResult("PROXY myproxy:70");
[email protected]0fc924b2014-03-31 04:34:151716
1717 // Since we are using a proxy, the QUIC job will not succeed.
1718 MockWrite http_writes[] = {
rch9ae5b3b2016-02-11 00:36:291719 MockWrite(SYNCHRONOUS, 0, "GET http://mail.example.org/ HTTP/1.1\r\n"),
1720 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561721 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")};
[email protected]0fc924b2014-03-31 04:34:151722
1723 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561724 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
bnc1c196c6e2016-05-28 13:51:481725 MockRead(SYNCHRONOUS, 4, kQuicAlternativeServiceHeader),
rchf114d982015-10-21 01:34:561726 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]0fc924b2014-03-31 04:34:151727
1728 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
1729 http_writes, arraysize(http_writes));
1730 socket_factory_.AddSocketDataProvider(&http_data);
1731
1732 // In order for a new QUIC session to be established via alternate-protocol
1733 // without racing an HTTP connection, we need the host resolution to happen
1734 // synchronously.
1735 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291736 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561737 "");
rch9ae5b3b2016-02-11 00:36:291738 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]0fc924b2014-03-31 04:34:151739 AddressList address;
rjshaded5ced072015-12-18 19:26:021740 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1741 nullptr, net_log_.bound());
[email protected]0fc924b2014-03-31 04:34:151742
rch9ae5b3b2016-02-11 00:36:291743 request_.url = GURL("http://mail.example.org/");
rch3f4b8452016-02-23 16:59:321744 CreateSession();
[email protected]0fc924b2014-03-31 04:34:151745 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1746 SendRequestAndExpectHttpResponse("hello world");
1747}
1748
[email protected]1e960032013-12-20 19:00:201749TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
[email protected]1e960032013-12-20 19:00:201750 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581751 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1752 1, kClientDataStreamId1, true, true,
1753 GetRequestHeaders("GET", "https", "/")));
1754 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021755 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581756 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1757 false, true, 0, "hello!"));
1758 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591759 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
rcha5399e02015-04-21 19:32:041760 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]11c05872013-08-20 02:04:121761
rtennetib8e80fb2016-05-16 00:12:091762 // The non-alternate protocol job needs to hang in order to guarantee that
1763 // the alternate-protocol job will "win".
1764 AddHangingNonAlternateProtocolSocketData();
1765
[email protected]11c05872013-08-20 02:04:121766 // In order for a new QUIC session to be established via alternate-protocol
1767 // without racing an HTTP connection, we need the host resolution to happen
1768 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1769 // connection to the the server, in this test we require confirmation
1770 // before encrypting so the HTTP job will still start.
1771 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291772 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561773 "");
rch9ae5b3b2016-02-11 00:36:291774 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]11c05872013-08-20 02:04:121775 AddressList address;
rjshaded5ced072015-12-18 19:26:021776 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1777 nullptr, net_log_.bound());
[email protected]11c05872013-08-20 02:04:121778
rch3f4b8452016-02-23 16:59:321779 CreateSession();
[email protected]11c05872013-08-20 02:04:121780 session_->quic_stream_factory()->set_require_confirmation(true);
1781 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1782
danakjad1777e2016-04-16 00:56:421783 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]11c05872013-08-20 02:04:121784 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1785 TestCompletionCallback callback;
1786 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1787 EXPECT_EQ(ERR_IO_PENDING, rv);
1788
1789 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1790 QuicSession::HANDSHAKE_CONFIRMED);
1791 EXPECT_EQ(OK, callback.WaitForResult());
rchb27683c2015-07-29 23:53:501792
1793 CheckWasQuicResponse(trans);
1794 CheckResponseData(trans, "hello!");
[email protected]11c05872013-08-20 02:04:121795}
1796
zhongyica364fbb2015-12-12 03:39:121797TEST_P(QuicNetworkTransactionTest,
1798 LogGranularQuicErrorCodeOnQuicProtocolErrorLocal) {
1799 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581800 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1801 1, kClientDataStreamId1, true, true,
1802 GetRequestHeaders("GET", "https", "/")));
zhongyica364fbb2015-12-12 03:39:121803 // Read a close connection packet with
1804 // QuicErrorCode: QUIC_CRYPTO_VERSION_NOT_SUPPORTED from the peer.
alyssar2adf3ac2016-05-03 17:12:581805 mock_quic_data.AddRead(ConstructServerConnectionClosePacket(1));
zhongyica364fbb2015-12-12 03:39:121806 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1807
1808 // The non-alternate protocol job needs to hang in order to guarantee that
1809 // the alternate-protocol job will "win".
1810 AddHangingNonAlternateProtocolSocketData();
1811
1812 // In order for a new QUIC session to be established via alternate-protocol
1813 // without racing an HTTP connection, we need the host resolution to happen
1814 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1815 // connection to the the server, in this test we require confirmation
1816 // before encrypting so the HTTP job will still start.
1817 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291818 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:121819 "");
rch9ae5b3b2016-02-11 00:36:291820 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:121821 AddressList address;
1822 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1823 nullptr, net_log_.bound());
1824
rch3f4b8452016-02-23 16:59:321825 CreateSession();
zhongyica364fbb2015-12-12 03:39:121826 session_->quic_stream_factory()->set_require_confirmation(true);
1827 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1828
danakjad1777e2016-04-16 00:56:421829 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyica364fbb2015-12-12 03:39:121830 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1831 TestCompletionCallback callback;
1832 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1833 EXPECT_EQ(ERR_IO_PENDING, rv);
1834
1835 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1836 QuicSession::HANDSHAKE_CONFIRMED);
1837 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
1838
1839 NetErrorDetails details;
1840 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1841
1842 trans->PopulateNetErrorDetails(&details);
1843 // Verify the error code logged is what sent by the peer.
1844 EXPECT_EQ(QUIC_CRYPTO_VERSION_NOT_SUPPORTED, details.quic_connection_error);
1845}
1846
1847TEST_P(QuicNetworkTransactionTest,
1848 LogGranularQuicErrorCodeOnQuicProtocolErrorRemote) {
1849 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581850 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1851 1, kClientDataStreamId1, true, true,
1852 GetRequestHeaders("GET", "https", "/")));
zhongyif28b4a32016-04-25 21:35:211853 // Peer sending data from an non-existing stream causes this end to raise
1854 // error and close connection.
1855 mock_quic_data.AddRead(
alyssar2adf3ac2016-05-03 17:12:581856 ConstructServerRstPacket(1, false, 99, QUIC_STREAM_LAST_ERROR));
zhongyif28b4a32016-04-25 21:35:211857 std::string quic_error_details = "Data for nonexistent stream";
alyssar2adf3ac2016-05-03 17:12:581858 mock_quic_data.AddWrite(ConstructClientAckAndConnectionClosePacket(
zhongyif28b4a32016-04-25 21:35:211859 2, QuicTime::Delta::Infinite(), 0, 1, QUIC_INVALID_STREAM_ID,
zhongyica364fbb2015-12-12 03:39:121860 quic_error_details));
1861 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1862
1863 // The non-alternate protocol job needs to hang in order to guarantee that
1864 // the alternate-protocol job will "win".
1865 AddHangingNonAlternateProtocolSocketData();
1866
1867 // In order for a new QUIC session to be established via alternate-protocol
1868 // without racing an HTTP connection, we need the host resolution to happen
1869 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1870 // connection to the the server, in this test we require confirmation
1871 // before encrypting so the HTTP job will still start.
1872 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291873 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:121874 "");
rch9ae5b3b2016-02-11 00:36:291875 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:121876 AddressList address;
1877 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1878 nullptr, net_log_.bound());
1879
rch3f4b8452016-02-23 16:59:321880 CreateSession();
zhongyica364fbb2015-12-12 03:39:121881 session_->quic_stream_factory()->set_require_confirmation(true);
1882 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1883
danakjad1777e2016-04-16 00:56:421884 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyica364fbb2015-12-12 03:39:121885 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1886 TestCompletionCallback callback;
1887 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1888 EXPECT_EQ(ERR_IO_PENDING, rv);
1889
1890 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1891 QuicSession::HANDSHAKE_CONFIRMED);
1892 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
1893 NetErrorDetails details;
1894 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1895
1896 trans->PopulateNetErrorDetails(&details);
zhongyif28b4a32016-04-25 21:35:211897 EXPECT_EQ(QUIC_INVALID_STREAM_ID, details.quic_connection_error);
zhongyica364fbb2015-12-12 03:39:121898}
1899
rchcd5f1c62016-06-23 02:43:481900TEST_P(QuicNetworkTransactionTest, RstSteamErrorHandling) {
1901 MockQuicData mock_quic_data;
1902 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1903 1, kClientDataStreamId1, true, true,
1904 GetRequestHeaders("GET", "https", "/")));
1905 // Read the response headers, then a RST_STREAM frame.
1906 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
1907 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1908 mock_quic_data.AddRead(ConstructServerRstPacket(
1909 2, false, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1910 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
1911 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
1912 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1913
1914 // The non-alternate protocol job needs to hang in order to guarantee that
1915 // the alternate-protocol job will "win".
1916 AddHangingNonAlternateProtocolSocketData();
1917
1918 // In order for a new QUIC session to be established via alternate-protocol
1919 // without racing an HTTP connection, we need the host resolution to happen
1920 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1921 // connection to the the server, in this test we require confirmation
1922 // before encrypting so the HTTP job will still start.
1923 host_resolver_.set_synchronous_mode(true);
1924 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1925 "");
1926 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1927 AddressList address;
1928 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1929 nullptr, net_log_.bound());
1930
1931 CreateSession();
1932 session_->quic_stream_factory()->set_require_confirmation(true);
1933 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1934
1935 std::unique_ptr<HttpNetworkTransaction> trans(
1936 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1937 TestCompletionCallback callback;
1938 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1939 EXPECT_EQ(ERR_IO_PENDING, rv);
1940
1941 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1942 QuicSession::HANDSHAKE_CONFIRMED);
1943 // Read the headers.
1944 EXPECT_EQ(OK, callback.WaitForResult());
1945
1946 const HttpResponseInfo* response = trans->GetResponseInfo();
1947 ASSERT_TRUE(response != nullptr);
1948 ASSERT_TRUE(response->headers.get() != nullptr);
1949 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
1950 EXPECT_TRUE(response->was_fetched_via_spdy);
1951 EXPECT_TRUE(response->was_npn_negotiated);
1952 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
1953 response->connection_info);
1954
1955 std::string response_data;
1956 ASSERT_EQ(ERR_QUIC_PROTOCOL_ERROR,
1957 ReadTransaction(trans.get(), &response_data));
1958}
1959
1960TEST_P(QuicNetworkTransactionTest, RstSteamBeforeHeaders) {
1961 MockQuicData mock_quic_data;
1962 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1963 1, kClientDataStreamId1, true, true,
1964 GetRequestHeaders("GET", "https", "/")));
1965 mock_quic_data.AddRead(ConstructServerRstPacket(
1966 1, false, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1967 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
1968 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1969
1970 // The non-alternate protocol job needs to hang in order to guarantee that
1971 // the alternate-protocol job will "win".
1972 AddHangingNonAlternateProtocolSocketData();
1973
1974 // In order for a new QUIC session to be established via alternate-protocol
1975 // without racing an HTTP connection, we need the host resolution to happen
1976 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1977 // connection to the the server, in this test we require confirmation
1978 // before encrypting so the HTTP job will still start.
1979 host_resolver_.set_synchronous_mode(true);
1980 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1981 "");
1982 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1983 AddressList address;
1984 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1985 nullptr, net_log_.bound());
1986
1987 CreateSession();
1988 session_->quic_stream_factory()->set_require_confirmation(true);
1989 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1990
1991 std::unique_ptr<HttpNetworkTransaction> trans(
1992 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1993 TestCompletionCallback callback;
1994 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1995 EXPECT_EQ(ERR_IO_PENDING, rv);
1996
1997 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1998 QuicSession::HANDSHAKE_CONFIRMED);
1999 // Read the headers.
2000 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
2001}
2002
[email protected]1e960032013-12-20 19:00:202003TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
[email protected]3316d422013-05-03 21:45:302004 // Alternate-protocol job
alyssar2adf3ac2016-05-03 17:12:582005 std::unique_ptr<QuicEncryptedPacket> close(
2006 ConstructServerConnectionClosePacket(1));
[email protected]3316d422013-05-03 21:45:302007 MockRead quic_reads[] = {
rchb27683c2015-07-29 23:53:502008 MockRead(ASYNC, close->data(), close->length()),
2009 MockRead(ASYNC, ERR_IO_PENDING), // No more data to read
2010 MockRead(ASYNC, OK), // EOF
[email protected]3316d422013-05-03 21:45:302011 };
rjshaded5ced072015-12-18 19:26:022012 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2013 0);
[email protected]3316d422013-05-03 21:45:302014 socket_factory_.AddSocketDataProvider(&quic_data);
2015
2016 // Main job which will succeed even though the alternate job fails.
2017 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022018 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2019 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2020 MockRead(ASYNC, OK)};
[email protected]3316d422013-05-03 21:45:302021
rjshaded5ced072015-12-18 19:26:022022 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2023 0);
[email protected]3316d422013-05-03 21:45:302024 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562025 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]3316d422013-05-03 21:45:302026
rch3f4b8452016-02-23 16:59:322027 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:192028 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2029 SendRequestAndExpectHttpResponse("hello from http");
2030 ExpectBrokenAlternateProtocolMapping();
[email protected]3316d422013-05-03 21:45:302031}
2032
[email protected]1e960032013-12-20 19:00:202033TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
[email protected]d03a66d2013-05-06 12:55:592034 // Alternate-protocol job
2035 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022036 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]d03a66d2013-05-06 12:55:592037 };
rjshaded5ced072015-12-18 19:26:022038 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2039 0);
[email protected]d03a66d2013-05-06 12:55:592040 socket_factory_.AddSocketDataProvider(&quic_data);
2041
2042 // Main job which will succeed even though the alternate job fails.
2043 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022044 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2045 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2046 MockRead(ASYNC, OK)};
[email protected]d03a66d2013-05-06 12:55:592047
rjshaded5ced072015-12-18 19:26:022048 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2049 0);
[email protected]d03a66d2013-05-06 12:55:592050 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562051 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]d03a66d2013-05-06 12:55:592052
rch3f4b8452016-02-23 16:59:322053 CreateSession();
[email protected]d03a66d2013-05-06 12:55:592054
[email protected]aa9b14d2013-05-10 23:45:192055 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2056 SendRequestAndExpectHttpResponse("hello from http");
2057 ExpectBrokenAlternateProtocolMapping();
[email protected]d03a66d2013-05-06 12:55:592058}
2059
[email protected]00c159f2014-05-21 22:38:162060TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) {
[email protected]eb71ab62014-05-23 07:57:532061 // Alternate-protocol job will fail when the session attempts to read.
[email protected]00c159f2014-05-21 22:38:162062 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022063 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162064 };
rjshaded5ced072015-12-18 19:26:022065 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2066 0);
[email protected]00c159f2014-05-21 22:38:162067 socket_factory_.AddSocketDataProvider(&quic_data);
2068
[email protected]eb71ab62014-05-23 07:57:532069 // Main job will also fail.
[email protected]00c159f2014-05-21 22:38:162070 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022071 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162072 };
2073
rjshaded5ced072015-12-18 19:26:022074 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2075 0);
[email protected]00c159f2014-05-21 22:38:162076 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED));
2077 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562078 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]00c159f2014-05-21 22:38:162079
rtennetib8e80fb2016-05-16 00:12:092080 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322081 CreateSession();
[email protected]00c159f2014-05-21 22:38:162082
2083 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
danakjad1777e2016-04-16 00:56:422084 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]00c159f2014-05-21 22:38:162085 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2086 TestCompletionCallback callback;
2087 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2088 EXPECT_EQ(ERR_IO_PENDING, rv);
2089 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult());
2090 ExpectQuicAlternateProtocolMapping();
2091}
2092
[email protected]1e960032013-12-20 19:00:202093TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
[email protected]77c6c162013-08-17 02:57:452094 // Alternate-protocol job
2095 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022096 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]77c6c162013-08-17 02:57:452097 };
rjshaded5ced072015-12-18 19:26:022098 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2099 0);
[email protected]77c6c162013-08-17 02:57:452100 socket_factory_.AddSocketDataProvider(&quic_data);
2101
[email protected]c92c1b52014-05-31 04:16:062102 // Second Alternate-protocol job which will race with the TCP job.
2103 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:422104 nullptr, 0);
[email protected]c92c1b52014-05-31 04:16:062105 socket_factory_.AddSocketDataProvider(&quic_data2);
2106
[email protected]4d283b32013-10-17 12:57:272107 // Final job that will proceed when the QUIC job fails.
2108 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022109 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2110 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2111 MockRead(ASYNC, OK)};
[email protected]4d283b32013-10-17 12:57:272112
rjshaded5ced072015-12-18 19:26:022113 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2114 0);
[email protected]4d283b32013-10-17 12:57:272115 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562116 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d283b32013-10-17 12:57:272117
rtennetiafccbc062016-05-16 18:21:142118 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322119 CreateSession();
[email protected]77c6c162013-08-17 02:57:452120
2121 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2122
[email protected]4d283b32013-10-17 12:57:272123 SendRequestAndExpectHttpResponse("hello from http");
[email protected]77c6c162013-08-17 02:57:452124
2125 ExpectBrokenAlternateProtocolMapping();
[email protected]4d283b32013-10-17 12:57:272126
rch37de576c2015-05-17 20:28:172127 EXPECT_TRUE(quic_data.AllReadDataConsumed());
2128 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
[email protected]77c6c162013-08-17 02:57:452129}
2130
[email protected]93b31772014-06-19 08:03:352131TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) {
[email protected]65768442014-06-06 23:37:032132 // Alternate-protocol job
2133 MockRead quic_reads[] = {
mmenkee24011922015-12-17 22:12:592134 MockRead(SYNCHRONOUS, ERR_IO_PENDING),
[email protected]65768442014-06-06 23:37:032135 };
rjshaded5ced072015-12-18 19:26:022136 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2137 0);
[email protected]65768442014-06-06 23:37:032138 socket_factory_.AddSocketDataProvider(&quic_data);
2139
2140 // Main job that will proceed when the QUIC job fails.
2141 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022142 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2143 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2144 MockRead(ASYNC, OK)};
[email protected]65768442014-06-06 23:37:032145
rjshaded5ced072015-12-18 19:26:022146 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2147 0);
[email protected]65768442014-06-06 23:37:032148 socket_factory_.AddSocketDataProvider(&http_data);
2149
rtennetib8e80fb2016-05-16 00:12:092150 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322151 CreateSession();
[email protected]65768442014-06-06 23:37:032152
2153 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2154
2155 SendRequestAndExpectHttpResponse("hello from http");
2156}
2157
[email protected]eb71ab62014-05-23 07:57:532158TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
[email protected]4d590c9c2014-05-02 05:14:332159 // Alternate-protocol job will fail before creating a QUIC session.
rtennetibe635732014-10-02 22:51:422160 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0);
rjshaded5ced072015-12-18 19:26:022161 quic_data.set_connect_data(
2162 MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED));
[email protected]4d590c9c2014-05-02 05:14:332163 socket_factory_.AddSocketDataProvider(&quic_data);
2164
2165 // Main job which will succeed even though the alternate job fails.
2166 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022167 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2168 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2169 MockRead(ASYNC, OK)};
[email protected]4d590c9c2014-05-02 05:14:332170
rjshaded5ced072015-12-18 19:26:022171 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2172 0);
[email protected]4d590c9c2014-05-02 05:14:332173 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562174 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d590c9c2014-05-02 05:14:332175
rch3f4b8452016-02-23 16:59:322176 CreateSession();
[email protected]4d590c9c2014-05-02 05:14:332177 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2178 SendRequestAndExpectHttpResponse("hello from http");
[email protected]eb71ab62014-05-23 07:57:532179
2180 ExpectBrokenAlternateProtocolMapping();
[email protected]4d590c9c2014-05-02 05:14:332181}
2182
[email protected]4fee9672014-01-08 14:47:152183TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
[email protected]4fee9672014-01-08 14:47:152184 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582185 mock_quic_data.AddSynchronousRead(ConstructServerConnectionClosePacket(1));
2186 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2187 1, kClientDataStreamId1, true, true,
2188 GetRequestHeaders("GET", "https", "/")));
2189 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rcha5399e02015-04-21 19:32:042190 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4fee9672014-01-08 14:47:152191
2192 // When the QUIC connection fails, we will try the request again over HTTP.
2193 MockRead http_reads[] = {
bnc1c196c6e2016-05-28 13:51:482194 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
rchf114d982015-10-21 01:34:562195 MockRead("hello world"),
2196 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2197 MockRead(ASYNC, OK)};
[email protected]4fee9672014-01-08 14:47:152198
rjshaded5ced072015-12-18 19:26:022199 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2200 0);
[email protected]4fee9672014-01-08 14:47:152201 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562202 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4fee9672014-01-08 14:47:152203
2204 // In order for a new QUIC session to be established via alternate-protocol
2205 // without racing an HTTP connection, we need the host resolution to happen
2206 // synchronously.
2207 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:292208 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:562209 "");
rch9ae5b3b2016-02-11 00:36:292210 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]4fee9672014-01-08 14:47:152211 AddressList address;
rjshaded5ced072015-12-18 19:26:022212 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2213 nullptr, net_log_.bound());
[email protected]4fee9672014-01-08 14:47:152214
rch3f4b8452016-02-23 16:59:322215 CreateSession();
[email protected]4fee9672014-01-08 14:47:152216 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2217 SendRequestAndExpectHttpResponse("hello world");
2218}
2219
bnc508835902015-05-12 20:10:292220TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) {
alyssar2adf3ac2016-05-03 17:12:582221 client_maker_.set_hostname("www.example.org");
tbansal0f56a39a2016-04-07 22:03:382222 EXPECT_FALSE(
2223 test_socket_performance_watcher_factory_.rtt_notification_received());
bnc508835902015-05-12 20:10:292224 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582225 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2226 1, kClientDataStreamId1, true, true,
2227 GetRequestHeaders("GET", "https", "/")));
2228 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc508835902015-05-12 20:10:292229 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:582230 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
2231 false, true, 0, "hello!"));
2232 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:502233 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
bnc508835902015-05-12 20:10:292234 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2235
bncb07c05532015-05-14 19:07:202236 request_.url = GURL("https://www.example.org:443");
rtennetib8e80fb2016-05-16 00:12:092237 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322238 CreateSession();
bnc508835902015-05-12 20:10:292239 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
2240 SendRequestAndExpectQuicResponse("hello!");
tbansal0f56a39a2016-04-07 22:03:382241 EXPECT_TRUE(
2242 test_socket_performance_watcher_factory_.rtt_notification_received());
bnc508835902015-05-12 20:10:292243}
2244
rtenneti56977812016-01-15 19:26:562245TEST_P(QuicNetworkTransactionTest, QuicUpload) {
rtenneti8a2f4632016-03-21 20:26:572246 params_.origins_to_force_quic_on.insert(
2247 HostPortPair::FromString("mail.example.org:443"));
rtenneti56977812016-01-15 19:26:562248
2249 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2250 MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_FAILED, 1)};
2251 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2252 arraysize(writes));
2253 socket_factory_.AddSocketDataProvider(&socket_data);
2254
rtennetib8e80fb2016-05-16 00:12:092255 // The non-alternate protocol job needs to hang in order to guarantee that
2256 // the alternate-protocol job will "win".
2257 AddHangingNonAlternateProtocolSocketData();
2258
rtenneti56977812016-01-15 19:26:562259 CreateSession();
2260 request_.method = "POST";
2261 ChunkedUploadDataStream upload_data(0);
2262 upload_data.AppendData("1", 1, true);
2263
2264 request_.upload_data_stream = &upload_data;
2265
danakjad1777e2016-04-16 00:56:422266 std::unique_ptr<HttpNetworkTransaction> trans(
rtenneti56977812016-01-15 19:26:562267 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2268 TestCompletionCallback callback;
2269 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2270 EXPECT_EQ(ERR_IO_PENDING, rv);
2271 EXPECT_NE(OK, callback.WaitForResult());
2272}
2273
ckrasic769733c2016-06-30 00:42:132274// Adds coverage to catch regression such as https://crbug.com/622043
2275TEST_P(QuicNetworkTransactionTest, QuicServerPush) {
2276 params_.origins_to_force_quic_on.insert(
2277 HostPortPair::FromString("mail.example.org:443"));
2278
2279 MockQuicData mock_quic_data;
2280 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2281 1, kClientDataStreamId1, true, true,
2282 GetRequestHeaders("GET", "https", "/")));
2283 QuicStreamOffset server_header_offset = 0;
2284 mock_quic_data.AddRead(ConstructServerPushPromisePacket(
2285 1, kClientDataStreamId1, kServerDataStreamId1, false,
2286 GetRequestHeaders("GET", "https", "/pushed.jpg"), &server_header_offset,
2287 &server_maker_));
2288 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2289 2, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
2290 &server_header_offset));
2291 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 2, 1, 1));
2292 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2293 3, kServerDataStreamId1, false, false, GetResponseHeaders("200 OK"),
2294 &server_header_offset));
2295 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId1,
2296 false, true, 0, "hello!"));
2297 mock_quic_data.AddWrite(ConstructClientAckPacket(3, 4, 3, 1));
2298 mock_quic_data.AddRead(ConstructServerDataPacket(
2299 5, kServerDataStreamId1, false, true, 0, "and hello!"));
2300 mock_quic_data.AddWrite(
2301 ConstructClientAckAndRstPacket(4, 4, QUIC_RST_ACKNOWLEDGEMENT, 5, 5, 1));
2302 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2303 mock_quic_data.AddRead(ASYNC, 0); // EOF
2304 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2305
2306 // The non-alternate protocol job needs to hang in order to guarantee that
2307 // the alternate-protocol job will "win".
2308 AddHangingNonAlternateProtocolSocketData();
2309
2310 CreateSession();
2311
2312 // PUSH_PROMISE handling in the http layer gets exercised here.
2313 SendRequestAndExpectQuicResponse("hello!");
2314
2315 request_.url = GURL("https://mail.example.org/pushed.jpg");
2316 SendRequestAndExpectQuicResponse("and hello!");
2317
2318 // Check that the NetLog was filled reasonably.
2319 TestNetLogEntry::List entries;
2320 net_log_.GetEntries(&entries);
2321 EXPECT_LT(0u, entries.size());
2322
2323 // Check that we logged a QUIC_HTTP_STREAM_ADOPTED_PUSH_STREAM
2324 int pos = ExpectLogContainsSomewhere(
2325 entries, 0, NetLog::TYPE_QUIC_HTTP_STREAM_ADOPTED_PUSH_STREAM,
2326 NetLog::PHASE_NONE);
2327 EXPECT_LT(0, pos);
2328}
2329
bnc359ed2a2016-04-29 20:43:452330class QuicNetworkTransactionWithDestinationTest
2331 : public PlatformTest,
2332 public ::testing::WithParamInterface<PoolingTestParams> {
2333 protected:
2334 QuicNetworkTransactionWithDestinationTest()
2335 : clock_(new MockClock),
2336 version_(GetParam().version),
2337 destination_type_(GetParam().destination_type),
2338 cert_transparency_verifier_(new MultiLogCTVerifier()),
2339 ssl_config_service_(new SSLConfigServiceDefaults),
2340 proxy_service_(ProxyService::CreateDirect()),
2341 auth_handler_factory_(
2342 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
2343 random_generator_(0),
2344 ssl_data_(ASYNC, OK) {}
2345
2346 void SetUp() override {
2347 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:552348 base::RunLoop().RunUntilIdle();
bnc359ed2a2016-04-29 20:43:452349
2350 HttpNetworkSession::Params params;
2351
2352 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
2353 params.quic_clock = clock_;
2354
2355 crypto_client_stream_factory_.set_handshake_mode(
2356 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2357 params.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
2358
bnc359ed2a2016-04-29 20:43:452359 params.enable_quic = true;
2360 params.quic_random = &random_generator_;
2361 params.client_socket_factory = &socket_factory_;
2362 params.host_resolver = &host_resolver_;
2363 params.cert_verifier = &cert_verifier_;
2364 params.transport_security_state = &transport_security_state_;
2365 params.cert_transparency_verifier = cert_transparency_verifier_.get();
rsleevid6de8302016-06-21 01:33:202366 params.ct_policy_enforcer = &ct_policy_enforcer_;
bnc359ed2a2016-04-29 20:43:452367 params.socket_performance_watcher_factory =
2368 &test_socket_performance_watcher_factory_;
2369 params.ssl_config_service = ssl_config_service_.get();
2370 params.proxy_service = proxy_service_.get();
2371 params.http_auth_handler_factory = auth_handler_factory_.get();
bnc525e175a2016-06-20 12:36:402372 params.http_server_properties = &http_server_properties_;
bnc359ed2a2016-04-29 20:43:452373 params.quic_supported_versions = SupportedVersions(version_);
2374 params.quic_host_whitelist.insert("news.example.org");
2375 params.quic_host_whitelist.insert("mail.example.org");
2376 params.quic_host_whitelist.insert("mail.example.com");
2377
2378 session_.reset(new HttpNetworkSession(params));
2379 session_->quic_stream_factory()->set_require_confirmation(true);
2380 ASSERT_EQ(params.quic_socket_receive_buffer_size,
2381 session_->quic_stream_factory()->socket_receive_buffer_size());
2382 }
2383
2384 void TearDown() override {
2385 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
2386 // Empty the current queue.
fdoray92e35a72016-06-10 15:54:552387 base::RunLoop().RunUntilIdle();
bnc359ed2a2016-04-29 20:43:452388 PlatformTest::TearDown();
2389 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:552390 base::RunLoop().RunUntilIdle();
bnc525e175a2016-06-20 12:36:402391 session_.reset();
bnc359ed2a2016-04-29 20:43:452392 }
2393
2394 void SetAlternativeService(const std::string& origin) {
2395 HostPortPair destination;
2396 switch (destination_type_) {
2397 case SAME_AS_FIRST:
2398 destination = HostPortPair(origin1_, 443);
2399 break;
2400 case SAME_AS_SECOND:
2401 destination = HostPortPair(origin2_, 443);
2402 break;
2403 case DIFFERENT:
2404 destination = HostPortPair(kDifferentHostname, 443);
2405 break;
2406 }
2407 AlternativeService alternative_service(QUIC, destination);
2408 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
2409 http_server_properties_.SetAlternativeService(
2410 url::SchemeHostPort("https", origin, 443), alternative_service,
2411 expiration);
2412 }
2413
alyssar2adf3ac2016-05-03 17:12:582414 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452415 QuicPacketNumber packet_number,
2416 QuicStreamId stream_id,
2417 bool should_include_version,
2418 QuicStreamOffset* offset,
2419 QuicTestPacketMaker* maker) {
2420 SpdyPriority priority =
2421 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
2422 SpdyHeaderBlock headers(maker->GetRequestHeaders("GET", "https", "/"));
2423 return maker->MakeRequestHeadersPacketWithOffsetTracking(
2424 packet_number, stream_id, should_include_version, true, priority,
bnc086b39e12016-06-24 13:05:262425 std::move(headers), offset);
bnc359ed2a2016-04-29 20:43:452426 }
2427
alyssar2adf3ac2016-05-03 17:12:582428 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452429 QuicPacketNumber packet_number,
2430 QuicStreamId stream_id,
2431 bool should_include_version,
2432 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:582433 return ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452434 packet_number, stream_id, should_include_version, nullptr, maker);
2435 }
2436
alyssar2adf3ac2016-05-03 17:12:582437 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:452438 QuicPacketNumber packet_number,
2439 QuicStreamId stream_id,
2440 QuicStreamOffset* offset,
2441 QuicTestPacketMaker* maker) {
2442 SpdyHeaderBlock headers(maker->GetResponseHeaders("200 OK"));
2443 return maker->MakeResponseHeadersPacketWithOffsetTracking(
bnc086b39e12016-06-24 13:05:262444 packet_number, stream_id, false, false, std::move(headers), offset);
bnc359ed2a2016-04-29 20:43:452445 }
2446
alyssar2adf3ac2016-05-03 17:12:582447 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:452448 QuicPacketNumber packet_number,
2449 QuicStreamId stream_id,
2450 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:582451 return ConstructServerResponseHeadersPacket(packet_number, stream_id,
2452 nullptr, maker);
bnc359ed2a2016-04-29 20:43:452453 }
2454
alyssar2adf3ac2016-05-03 17:12:582455 std::unique_ptr<QuicEncryptedPacket> ConstructServerDataPacket(
bnc359ed2a2016-04-29 20:43:452456 QuicPacketNumber packet_number,
2457 QuicStreamId stream_id,
2458 QuicTestPacketMaker* maker) {
2459 return maker->MakeDataPacket(packet_number, stream_id, false, true, 0,
2460 "hello");
2461 }
2462
alyssar2adf3ac2016-05-03 17:12:582463 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
bnc359ed2a2016-04-29 20:43:452464 QuicPacketNumber packet_number,
2465 QuicPacketNumber largest_received,
2466 QuicPacketNumber ack_least_unacked,
2467 QuicPacketNumber stop_least_unacked,
2468 QuicTestPacketMaker* maker) {
2469 return maker->MakeAckPacket(packet_number, largest_received,
2470 ack_least_unacked, stop_least_unacked, true);
2471 }
2472
2473 void AddRefusedSocketData() {
2474 std::unique_ptr<StaticSocketDataProvider> refused_data(
2475 new StaticSocketDataProvider());
2476 MockConnect refused_connect(SYNCHRONOUS, ERR_CONNECTION_REFUSED);
2477 refused_data->set_connect_data(refused_connect);
2478 socket_factory_.AddSocketDataProvider(refused_data.get());
2479 static_socket_data_provider_vector_.push_back(std::move(refused_data));
2480 }
2481
2482 void AddHangingSocketData() {
2483 std::unique_ptr<StaticSocketDataProvider> hanging_data(
2484 new StaticSocketDataProvider());
2485 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
2486 hanging_data->set_connect_data(hanging_connect);
2487 socket_factory_.AddSocketDataProvider(hanging_data.get());
2488 static_socket_data_provider_vector_.push_back(std::move(hanging_data));
2489 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
2490 }
2491
2492 bool AllDataConsumed() {
2493 for (const auto& socket_data_ptr : static_socket_data_provider_vector_) {
2494 if (!socket_data_ptr->AllReadDataConsumed() ||
2495 !socket_data_ptr->AllWriteDataConsumed()) {
2496 return false;
2497 }
2498 }
2499 return true;
2500 }
2501
2502 void SendRequestAndExpectQuicResponse(const std::string& host) {
2503 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
2504 HttpRequestInfo request;
2505 std::string url("https://");
2506 url.append(host);
2507 request.url = GURL(url);
2508 request.load_flags = 0;
2509 request.method = "GET";
2510 TestCompletionCallback callback;
2511 int rv = trans.Start(&request, callback.callback(), net_log_.bound());
2512 EXPECT_EQ(OK, callback.GetResult(rv));
2513
2514 std::string response_data;
2515 ASSERT_EQ(OK, ReadTransaction(&trans, &response_data));
2516 EXPECT_EQ("hello", response_data);
2517
2518 const HttpResponseInfo* response = trans.GetResponseInfo();
2519 ASSERT_TRUE(response != nullptr);
2520 ASSERT_TRUE(response->headers.get() != nullptr);
2521 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
2522 EXPECT_TRUE(response->was_fetched_via_spdy);
2523 EXPECT_TRUE(response->was_npn_negotiated);
2524 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
2525 response->connection_info);
2526 EXPECT_EQ(443, response->socket_address.port());
2527 }
2528
2529 MockClock* clock_;
2530 QuicVersion version_;
2531 DestinationType destination_type_;
2532 std::string origin1_;
2533 std::string origin2_;
2534 std::unique_ptr<HttpNetworkSession> session_;
2535 MockClientSocketFactory socket_factory_;
2536 MockHostResolver host_resolver_;
2537 MockCertVerifier cert_verifier_;
2538 TransportSecurityState transport_security_state_;
2539 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
rsleevid6de8302016-06-21 01:33:202540 CTPolicyEnforcer ct_policy_enforcer_;
bnc359ed2a2016-04-29 20:43:452541 TestSocketPerformanceWatcherFactory test_socket_performance_watcher_factory_;
2542 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
2543 std::unique_ptr<ProxyService> proxy_service_;
2544 std::unique_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
2545 MockRandom random_generator_;
2546 HttpServerPropertiesImpl http_server_properties_;
2547 BoundTestNetLog net_log_;
2548 MockCryptoClientStreamFactory crypto_client_stream_factory_;
2549 std::vector<std::unique_ptr<StaticSocketDataProvider>>
2550 static_socket_data_provider_vector_;
2551 SSLSocketDataProvider ssl_data_;
2552};
2553
2554INSTANTIATE_TEST_CASE_P(Version,
2555 QuicNetworkTransactionWithDestinationTest,
2556 ::testing::ValuesIn(GetPoolingTestParams()));
2557
2558// A single QUIC request fails because the certificate does not match the origin
2559// hostname, regardless of whether it matches the alternative service hostname.
2560TEST_P(QuicNetworkTransactionWithDestinationTest, InvalidCertificate) {
2561 if (destination_type_ == DIFFERENT)
2562 return;
2563
2564 GURL url("https://mail.example.com/");
2565 origin1_ = url.host();
2566
2567 // Not used for requests, but this provides a test case where the certificate
2568 // is valid for the hostname of the alternative service.
2569 origin2_ = "mail.example.org";
2570
2571 SetAlternativeService(origin1_);
2572
2573 scoped_refptr<X509Certificate> cert(
2574 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2575 bool unused;
2576 ASSERT_FALSE(cert->VerifyNameMatch(origin1_, &unused));
2577 ASSERT_TRUE(cert->VerifyNameMatch(origin2_, &unused));
2578
2579 ProofVerifyDetailsChromium verify_details;
2580 verify_details.cert_verify_result.verified_cert = cert;
2581 verify_details.cert_verify_result.is_issued_by_known_root = true;
2582 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2583
2584 MockQuicData mock_quic_data;
2585 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);
2586 mock_quic_data.AddRead(ASYNC, 0);
2587
2588 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2589
2590 AddRefusedSocketData();
2591
2592 HttpRequestInfo request;
2593 request.url = url;
2594
2595 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
2596 TestCompletionCallback callback;
2597 int rv = trans.Start(&request, callback.callback(), net_log_.bound());
2598 EXPECT_EQ(ERR_CONNECTION_REFUSED, callback.GetResult(rv));
2599
2600 EXPECT_TRUE(AllDataConsumed());
2601}
2602
2603// First request opens QUIC session to alternative service. Second request
2604// pools to it, because destination matches and certificate is valid, even
2605// though QuicServerId is different.
2606TEST_P(QuicNetworkTransactionWithDestinationTest, PoolIfCertificateValid) {
2607 origin1_ = "mail.example.org";
2608 origin2_ = "news.example.org";
2609
2610 SetAlternativeService(origin1_);
2611 SetAlternativeService(origin2_);
2612
2613 scoped_refptr<X509Certificate> cert(
2614 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2615 bool unused;
2616 ASSERT_TRUE(cert->VerifyNameMatch(origin1_, &unused));
2617 ASSERT_TRUE(cert->VerifyNameMatch(origin2_, &unused));
2618 ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname, &unused));
2619
2620 ProofVerifyDetailsChromium verify_details;
2621 verify_details.cert_verify_result.verified_cert = cert;
2622 verify_details.cert_verify_result.is_issued_by_known_root = true;
2623 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2624
alyssar2adf3ac2016-05-03 17:12:582625 QuicTestPacketMaker client_maker1(version_, 0, clock_, origin1_,
2626 Perspective::IS_CLIENT);
2627 QuicTestPacketMaker server_maker1(version_, 0, clock_, origin1_,
2628 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452629
2630 QuicStreamOffset request_header_offset(0);
2631 QuicStreamOffset response_header_offset(0);
2632
2633 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582634 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2635 1, kClientDataStreamId1, true, &request_header_offset, &client_maker1));
2636 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2637 1, kClientDataStreamId1, &response_header_offset, &server_maker1));
2638 mock_quic_data.AddRead(
2639 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker1));
2640 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 2, 1, 1, &client_maker1));
bnc359ed2a2016-04-29 20:43:452641
alyssar2adf3ac2016-05-03 17:12:582642 QuicTestPacketMaker client_maker2(version_, 0, clock_, origin2_,
2643 Perspective::IS_CLIENT);
2644 QuicTestPacketMaker server_maker2(version_, 0, clock_, origin2_,
2645 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452646
alyssar2adf3ac2016-05-03 17:12:582647 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2648 3, kClientDataStreamId2, false, &request_header_offset, &client_maker2));
2649 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2650 3, kClientDataStreamId2, &response_header_offset, &server_maker2));
2651 mock_quic_data.AddRead(
2652 ConstructServerDataPacket(4, kClientDataStreamId2, &server_maker2));
2653 mock_quic_data.AddWrite(ConstructClientAckPacket(4, 4, 3, 1, &client_maker2));
bnc359ed2a2016-04-29 20:43:452654 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2655 mock_quic_data.AddRead(ASYNC, 0); // EOF
2656
2657 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2658
2659 AddHangingSocketData();
2660 AddHangingSocketData();
2661
2662 SendRequestAndExpectQuicResponse(origin1_);
2663 SendRequestAndExpectQuicResponse(origin2_);
2664
2665 EXPECT_TRUE(AllDataConsumed());
2666}
2667
2668// First request opens QUIC session to alternative service. Second request does
2669// not pool to it, even though destination matches, because certificate is not
2670// valid. Instead, a new QUIC session is opened to the same destination with a
2671// different QuicServerId.
2672TEST_P(QuicNetworkTransactionWithDestinationTest,
2673 DoNotPoolIfCertificateInvalid) {
2674 origin1_ = "news.example.org";
2675 origin2_ = "mail.example.com";
2676
2677 SetAlternativeService(origin1_);
2678 SetAlternativeService(origin2_);
2679
2680 scoped_refptr<X509Certificate> cert1(
2681 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2682 bool unused;
2683 ASSERT_TRUE(cert1->VerifyNameMatch(origin1_, &unused));
2684 ASSERT_FALSE(cert1->VerifyNameMatch(origin2_, &unused));
2685 ASSERT_FALSE(cert1->VerifyNameMatch(kDifferentHostname, &unused));
2686
2687 scoped_refptr<X509Certificate> cert2(
2688 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
2689 ASSERT_TRUE(cert2->VerifyNameMatch(origin2_, &unused));
2690 ASSERT_FALSE(cert2->VerifyNameMatch(kDifferentHostname, &unused));
2691
2692 ProofVerifyDetailsChromium verify_details1;
2693 verify_details1.cert_verify_result.verified_cert = cert1;
2694 verify_details1.cert_verify_result.is_issued_by_known_root = true;
2695 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
2696
2697 ProofVerifyDetailsChromium verify_details2;
2698 verify_details2.cert_verify_result.verified_cert = cert2;
2699 verify_details2.cert_verify_result.is_issued_by_known_root = true;
2700 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
2701
alyssar2adf3ac2016-05-03 17:12:582702 QuicTestPacketMaker client_maker1(version_, 0, clock_, origin1_,
2703 Perspective::IS_CLIENT);
2704 QuicTestPacketMaker server_maker1(version_, 0, clock_, origin1_,
2705 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452706
2707 MockQuicData mock_quic_data1;
alyssar2adf3ac2016-05-03 17:12:582708 mock_quic_data1.AddWrite(ConstructClientRequestHeadersPacket(
2709 1, kClientDataStreamId1, true, &client_maker1));
2710 mock_quic_data1.AddRead(ConstructServerResponseHeadersPacket(
2711 1, kClientDataStreamId1, &server_maker1));
2712 mock_quic_data1.AddRead(
2713 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker1));
bnc359ed2a2016-04-29 20:43:452714 mock_quic_data1.AddWrite(
alyssar2adf3ac2016-05-03 17:12:582715 ConstructClientAckPacket(2, 2, 1, 1, &client_maker1));
bnc359ed2a2016-04-29 20:43:452716 mock_quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2717 mock_quic_data1.AddRead(ASYNC, 0); // EOF
2718
2719 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
2720
2721 AddHangingSocketData();
2722
alyssar2adf3ac2016-05-03 17:12:582723 QuicTestPacketMaker client_maker2(version_, 0, clock_, origin2_,
2724 Perspective::IS_CLIENT);
2725 QuicTestPacketMaker server_maker2(version_, 0, clock_, origin2_,
2726 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452727
2728 MockQuicData mock_quic_data2;
alyssar2adf3ac2016-05-03 17:12:582729 mock_quic_data2.AddWrite(ConstructClientRequestHeadersPacket(
2730 1, kClientDataStreamId1, true, &client_maker2));
2731 mock_quic_data2.AddRead(ConstructServerResponseHeadersPacket(
2732 1, kClientDataStreamId1, &server_maker2));
2733 mock_quic_data2.AddRead(
2734 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker2));
bnc359ed2a2016-04-29 20:43:452735 mock_quic_data2.AddWrite(
alyssar2adf3ac2016-05-03 17:12:582736 ConstructClientAckPacket(2, 2, 1, 1, &client_maker2));
bnc359ed2a2016-04-29 20:43:452737 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2738 mock_quic_data2.AddRead(ASYNC, 0); // EOF
2739
2740 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
2741
2742 AddHangingSocketData();
2743
2744 SendRequestAndExpectQuicResponse(origin1_);
2745 SendRequestAndExpectQuicResponse(origin2_);
2746
2747 EXPECT_TRUE(AllDataConsumed());
2748}
2749
[email protected]61a527782013-02-21 03:58:002750} // namespace test
2751} // namespace net