blob: 7460a51eb7253ab7a5a640f90cd714ca15344ce4 [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
alyssar2adf3ac2016-05-03 17:12:58336 std::unique_ptr<QuicEncryptedPacket>
337 ConstructClientAckAndConnectionClosePacket(
zhongyi32569c62016-01-08 02:54:30338 QuicPacketNumber packet_number,
339 QuicPacketNumber largest_received,
340 QuicPacketNumber ack_least_unacked,
341 QuicPacketNumber stop_least_unacked) {
alyssar2adf3ac2016-05-03 17:12:58342 return client_maker_.MakeAckPacket(packet_number, largest_received,
343 ack_least_unacked, stop_least_unacked,
344 true);
[email protected]1e960032013-12-20 19:00:20345 }
[email protected]61a527782013-02-21 03:58:00346
alyssar2adf3ac2016-05-03 17:12:58347 std::unique_ptr<QuicEncryptedPacket>
348 ConstructClientAckAndConnectionClosePacket(
zhongyica364fbb2015-12-12 03:39:12349 QuicPacketNumber num,
350 QuicTime::Delta delta_time_largest_observed,
351 QuicPacketNumber largest_received,
352 QuicPacketNumber least_unacked,
353 QuicErrorCode quic_error,
bnc912a04b2016-04-20 14:19:50354 const std::string& quic_error_details) {
alyssar2adf3ac2016-05-03 17:12:58355 return client_maker_.MakeAckAndConnectionClosePacket(
zhongyica364fbb2015-12-12 03:39:12356 num, false, delta_time_largest_observed, largest_received,
357 least_unacked, quic_error, quic_error_details);
358 }
359
alyssar2adf3ac2016-05-03 17:12:58360 std::unique_ptr<QuicEncryptedPacket> ConstructServerRstPacket(
zhongyica364fbb2015-12-12 03:39:12361 QuicPacketNumber num,
362 bool include_version,
363 QuicStreamId stream_id,
364 QuicRstStreamErrorCode error_code) {
alyssar2adf3ac2016-05-03 17:12:58365 return server_maker_.MakeRstPacket(num, include_version, stream_id,
366 error_code);
zhongyica364fbb2015-12-12 03:39:12367 }
368
zhongyi32569c62016-01-08 02:54:30369 // Uses default QuicTestPacketMaker.
[email protected]1e960032013-12-20 19:00:20370 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
371 const std::string& scheme,
372 const std::string& path) {
alyssar2adf3ac2016-05-03 17:12:58373 return GetRequestHeaders(method, scheme, path, &client_maker_);
zhongyi32569c62016-01-08 02:54:30374 }
375
376 // Uses customized QuicTestPacketMaker.
377 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
378 const std::string& scheme,
379 const std::string& path,
bnc912a04b2016-04-20 14:19:50380 QuicTestPacketMaker* maker) {
381 return maker->GetRequestHeaders(method, scheme, path);
[email protected]61a527782013-02-21 03:58:00382 }
383
[email protected]1e960032013-12-20 19:00:20384 SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
alyssar2adf3ac2016-05-03 17:12:58385 return server_maker_.GetResponseHeaders(status);
[email protected]61a527782013-02-21 03:58:00386 }
387
zhongyi32569c62016-01-08 02:54:30388 // Appends alt_svc headers in the response headers.
389 SpdyHeaderBlock GetResponseHeaders(const std::string& status,
390 const std::string& alt_svc) {
alyssar2adf3ac2016-05-03 17:12:58391 return server_maker_.GetResponseHeaders(status, alt_svc);
zhongyi32569c62016-01-08 02:54:30392 }
393
alyssar2adf3ac2016-05-03 17:12:58394 std::unique_ptr<QuicEncryptedPacket> ConstructServerDataPacket(
rtennetia004d332015-08-28 06:44:57395 QuicPacketNumber packet_number,
[email protected]98b20ce2013-05-10 05:55:26396 QuicStreamId stream_id,
[email protected]e8ff26842013-03-22 21:02:05397 bool should_include_version,
[email protected]61a527782013-02-21 03:58:00398 bool fin,
399 QuicStreamOffset offset,
400 base::StringPiece data) {
alyssar2adf3ac2016-05-03 17:12:58401 return server_maker_.MakeDataPacket(
402 packet_number, stream_id, should_include_version, fin, offset, data);
[email protected]61a527782013-02-21 03:58:00403 }
404
alyssar2adf3ac2016-05-03 17:12:58405 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
rtennetia004d332015-08-28 06:44:57406 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20407 QuicStreamId stream_id,
408 bool should_include_version,
409 bool fin,
bnc086b39e12016-06-24 13:05:26410 SpdyHeaderBlock headers,
zhongyi32569c62016-01-08 02:54:30411 QuicStreamOffset* offset) {
ianswett0888cff2015-11-24 17:42:16412 SpdyPriority priority =
rtennetif4bdb542015-01-21 14:33:05413 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
alyssar2adf3ac2016-05-03 17:12:58414 return client_maker_.MakeRequestHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30415 packet_number, stream_id, should_include_version, fin, priority,
416 headers, offset);
417 }
418
alyssar2adf3ac2016-05-03 17:12:58419 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30420 QuicPacketNumber packet_number,
421 QuicStreamId stream_id,
422 bool should_include_version,
423 bool fin,
bnc086b39e12016-06-24 13:05:26424 SpdyHeaderBlock headers,
zhongyi32569c62016-01-08 02:54:30425 QuicStreamOffset* offset,
426 QuicTestPacketMaker* maker) {
427 SpdyPriority priority =
428 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
alyssar2adf3ac2016-05-03 17:12:58429 return client_maker_.MakeRequestHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30430 packet_number, stream_id, should_include_version, fin, priority,
431 headers, offset);
432 }
433
alyssar2adf3ac2016-05-03 17:12:58434 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30435 QuicPacketNumber packet_number,
436 QuicStreamId stream_id,
437 bool should_include_version,
438 bool fin,
bnc086b39e12016-06-24 13:05:26439 SpdyHeaderBlock headers) {
alyssar2adf3ac2016-05-03 17:12:58440 return ConstructClientRequestHeadersPacket(
bnc086b39e12016-06-24 13:05:26441 packet_number, stream_id, should_include_version, fin,
442 std::move(headers), nullptr, &client_maker_);
zhongyi32569c62016-01-08 02:54:30443 }
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,
zhongyi32569c62016-01-08 02:54:30450 QuicTestPacketMaker* maker) {
bnc086b39e12016-06-24 13:05:26451 return ConstructClientRequestHeadersPacket(
452 packet_number, stream_id, should_include_version, fin,
453 std::move(headers), nullptr, maker);
[email protected]61a527782013-02-21 03:58:00454 }
455
alyssar2adf3ac2016-05-03 17:12:58456 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
rtennetia004d332015-08-28 06:44:57457 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20458 QuicStreamId stream_id,
459 bool should_include_version,
460 bool fin,
bnc086b39e12016-06-24 13:05:26461 SpdyHeaderBlock headers) {
alyssar2adf3ac2016-05-03 17:12:58462 return ConstructServerResponseHeadersPacket(
bnc086b39e12016-06-24 13:05:26463 packet_number, stream_id, should_include_version, fin,
464 std::move(headers), nullptr, &server_maker_);
zhongyi32569c62016-01-08 02:54:30465 }
466
alyssar2adf3ac2016-05-03 17:12:58467 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30468 QuicPacketNumber packet_number,
469 QuicStreamId stream_id,
470 bool should_include_version,
471 bool fin,
bnc086b39e12016-06-24 13:05:26472 SpdyHeaderBlock headers,
zhongyi32569c62016-01-08 02:54:30473 QuicTestPacketMaker* maker) {
bnc086b39e12016-06-24 13:05:26474 return ConstructServerResponseHeadersPacket(
475 packet_number, stream_id, should_include_version, fin,
476 std::move(headers), nullptr, maker);
zhongyi32569c62016-01-08 02:54:30477 }
478
alyssar2adf3ac2016-05-03 17:12:58479 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30480 QuicPacketNumber packet_number,
481 QuicStreamId stream_id,
482 bool should_include_version,
483 bool fin,
bnc086b39e12016-06-24 13:05:26484 SpdyHeaderBlock headers,
zhongyi32569c62016-01-08 02:54:30485 QuicStreamOffset* offset) {
alyssar2adf3ac2016-05-03 17:12:58486 return server_maker_.MakeResponseHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30487 packet_number, stream_id, should_include_version, fin, headers, offset);
488 }
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 QuicStreamOffset* offset,
497 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:58498 return server_maker_.MakeResponseHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30499 packet_number, stream_id, should_include_version, fin, headers, offset);
[email protected]61a527782013-02-21 03:58:00500 }
501
bnc912a04b2016-04-20 14:19:50502 void CreateSession() {
[email protected]4dca587c2013-03-07 16:54:47503 params_.enable_quic = true;
504 params_.quic_clock = clock_;
505 params_.quic_random = &random_generator_;
bnc912a04b2016-04-20 14:19:50506 params_.client_socket_factory = &socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05507 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43508 params_.host_resolver = &host_resolver_;
509 params_.cert_verifier = &cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11510 params_.transport_security_state = &transport_security_state_;
rtenneti052774e2015-11-24 21:00:12511 params_.cert_transparency_verifier = cert_transparency_verifier_.get();
rsleevid6de8302016-06-21 01:33:20512 params_.ct_policy_enforcer = &ct_policy_enforcer_;
tbansalfdf5665b2015-09-21 22:46:40513 params_.socket_performance_watcher_factory =
tbansal0f56a39a2016-04-07 22:03:38514 &test_socket_performance_watcher_factory_;
[email protected]1c04f9522013-02-21 20:32:43515 params_.proxy_service = proxy_service_.get();
516 params_.ssl_config_service = ssl_config_service_.get();
517 params_.http_auth_handler_factory = auth_handler_factory_.get();
bnc525e175a2016-06-20 12:36:40518 params_.http_server_properties = &http_server_properties_;
[email protected]1e960032013-12-20 19:00:20519 params_.quic_supported_versions = SupportedVersions(GetParam());
rch74da0e1a2016-01-14 02:49:32520 for (const char* host :
rch9ae5b3b2016-02-11 00:36:29521 {kDefaultServerHostName, "www.example.org", "news.example.org",
522 "bar.example.org", "foo.example.org", "invalid.example.org",
523 "mail.example.com"}) {
rch74da0e1a2016-01-14 02:49:32524 params_.quic_host_whitelist.insert(host);
525 }
[email protected]61a527782013-02-21 03:58:00526
mmenkee65e7af2015-10-13 17:16:42527 session_.reset(new HttpNetworkSession(params_));
[email protected]11c05872013-08-20 02:04:12528 session_->quic_stream_factory()->set_require_confirmation(false);
rch185ebee2015-07-14 23:56:22529 ASSERT_EQ(params_.quic_socket_receive_buffer_size,
530 session_->quic_stream_factory()->socket_receive_buffer_size());
[email protected]61a527782013-02-21 03:58:00531 }
532
danakjad1777e2016-04-16 00:56:42533 void CheckWasQuicResponse(
534 const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19535 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42536 ASSERT_TRUE(response != nullptr);
537 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19538 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
539 EXPECT_TRUE(response->was_fetched_via_spdy);
540 EXPECT_TRUE(response->was_npn_negotiated);
541 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
542 response->connection_info);
543 }
544
danakjad1777e2016-04-16 00:56:42545 void CheckResponsePort(const std::unique_ptr<HttpNetworkTransaction>& trans,
Avi Drissman13fc8932015-12-20 04:40:46546 uint16_t port) {
bnc62a44f022015-04-02 15:59:41547 const HttpResponseInfo* response = trans->GetResponseInfo();
548 ASSERT_TRUE(response != nullptr);
549 EXPECT_EQ(port, response->socket_address.port());
550 }
551
danakjad1777e2016-04-16 00:56:42552 void CheckWasHttpResponse(
553 const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19554 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42555 ASSERT_TRUE(response != nullptr);
556 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19557 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
558 EXPECT_FALSE(response->was_fetched_via_spdy);
559 EXPECT_FALSE(response->was_npn_negotiated);
560 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1,
561 response->connection_info);
562 }
563
danakjad1777e2016-04-16 00:56:42564 void CheckResponseData(const std::unique_ptr<HttpNetworkTransaction>& trans,
[email protected]aa9b14d2013-05-10 23:45:19565 const std::string& expected) {
566 std::string response_data;
bncffc2fdf2015-05-14 18:29:49567 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
[email protected]aa9b14d2013-05-10 23:45:19568 EXPECT_EQ(expected, response_data);
569 }
570
danakjad1777e2016-04-16 00:56:42571 void RunTransaction(const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19572 TestCompletionCallback callback;
573 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
574 EXPECT_EQ(ERR_IO_PENDING, rv);
575 EXPECT_EQ(OK, callback.WaitForResult());
576 }
577
578 void SendRequestAndExpectHttpResponse(const std::string& expected) {
danakjad1777e2016-04-16 00:56:42579 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50580 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
bncffc2fdf2015-05-14 18:29:49581 RunTransaction(trans);
[email protected]aa9b14d2013-05-10 23:45:19582 CheckWasHttpResponse(trans);
bncffc2fdf2015-05-14 18:29:49583 CheckResponseData(trans, expected);
[email protected]aa9b14d2013-05-10 23:45:19584 }
585
586 void SendRequestAndExpectQuicResponse(const std::string& expected) {
rchf114d982015-10-21 01:34:56587 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, 443);
tbansal7cec3812015-02-05 21:25:12588 }
589
bnc62a44f022015-04-02 15:59:41590 void SendRequestAndExpectQuicResponseFromProxyOnPort(
591 const std::string& expected,
Avi Drissman13fc8932015-12-20 04:40:46592 uint16_t port) {
bnc62a44f022015-04-02 15:59:41593 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port);
[email protected]aa9b14d2013-05-10 23:45:19594 }
595
596 void AddQuicAlternateProtocolMapping(
597 MockCryptoClientStream::HandshakeMode handshake_mode) {
598 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
zhongyi3d4a55e72016-04-22 20:36:46599 url::SchemeHostPort server(request_.url);
600 AlternativeService alternative_service(QUIC, server.host(), 443);
bnc7dc7e1b42015-07-28 14:43:12601 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
zhongyi3d4a55e72016-04-22 20:36:46602 http_server_properties_.SetAlternativeService(server, alternative_service,
603 expiration);
[email protected]aa9b14d2013-05-10 23:45:19604 }
605
rchbe69cb902016-02-11 01:10:48606 void AddQuicRemoteAlternativeServiceMapping(
607 MockCryptoClientStream::HandshakeMode handshake_mode,
608 const HostPortPair& alternative) {
609 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
zhongyi3d4a55e72016-04-22 20:36:46610 url::SchemeHostPort server(request_.url);
rchbe69cb902016-02-11 01:10:48611 AlternativeService alternative_service(QUIC, alternative.host(),
612 alternative.port());
613 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
zhongyi3d4a55e72016-04-22 20:36:46614 http_server_properties_.SetAlternativeService(server, alternative_service,
615 expiration);
rchbe69cb902016-02-11 01:10:48616 }
617
[email protected]aa9b14d2013-05-10 23:45:19618 void ExpectBrokenAlternateProtocolMapping() {
zhongyi3d4a55e72016-04-22 20:36:46619 const url::SchemeHostPort server(request_.url);
bncd9b132e2015-07-08 05:16:10620 const AlternativeServiceVector alternative_service_vector =
zhongyi3d4a55e72016-04-22 20:36:46621 http_server_properties_.GetAlternativeServices(server);
bncd9b132e2015-07-08 05:16:10622 EXPECT_EQ(1u, alternative_service_vector.size());
bnc6be245c12015-05-15 11:24:07623 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken(
bncd9b132e2015-07-08 05:16:10624 alternative_service_vector[0]));
[email protected]aa9b14d2013-05-10 23:45:19625 }
626
[email protected]4d590c9c2014-05-02 05:14:33627 void ExpectQuicAlternateProtocolMapping() {
zhongyi3d4a55e72016-04-22 20:36:46628 const url::SchemeHostPort server(request_.url);
bncd9b132e2015-07-08 05:16:10629 const AlternativeServiceVector alternative_service_vector =
zhongyi3d4a55e72016-04-22 20:36:46630 http_server_properties_.GetAlternativeServices(server);
bncd9b132e2015-07-08 05:16:10631 EXPECT_EQ(1u, alternative_service_vector.size());
632 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
[email protected]4d590c9c2014-05-02 05:14:33633 }
634
[email protected]aa9b14d2013-05-10 23:45:19635 void AddHangingNonAlternateProtocolSocketData() {
danakjad1777e2016-04-16 00:56:42636 std::unique_ptr<StaticSocketDataProvider> hanging_data;
zhongyi32569c62016-01-08 02:54:30637 hanging_data.reset(new StaticSocketDataProvider());
[email protected]dda75ab2013-06-22 22:43:30638 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
zhongyi32569c62016-01-08 02:54:30639 hanging_data->set_connect_data(hanging_connect);
640 hanging_data_.push_back(std::move(hanging_data));
641 socket_factory_.AddSocketDataProvider(hanging_data_.back().get());
rchf114d982015-10-21 01:34:56642 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]aa9b14d2013-05-10 23:45:19643 }
644
rtenneti4b06ae72014-08-26 03:43:43645 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
alyssar2adf3ac2016-05-03 17:12:58646 QuicTestPacketMaker client_maker_;
647 QuicTestPacketMaker server_maker_;
danakjad1777e2016-04-16 00:56:42648 std::unique_ptr<HttpNetworkSession> session_;
[email protected]61a527782013-02-21 03:58:00649 MockClientSocketFactory socket_factory_;
rchf114d982015-10-21 01:34:56650 ProofVerifyDetailsChromium verify_details_;
[email protected]e8ff26842013-03-22 21:02:05651 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43652 MockHostResolver host_resolver_;
653 MockCertVerifier cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11654 TransportSecurityState transport_security_state_;
danakjad1777e2016-04-16 00:56:42655 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
rsleevid6de8302016-06-21 01:33:20656 CTPolicyEnforcer ct_policy_enforcer_;
tbansal0f56a39a2016-04-07 22:03:38657 TestSocketPerformanceWatcherFactory test_socket_performance_watcher_factory_;
[email protected]1c04f9522013-02-21 20:32:43658 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
danakjad1777e2016-04-16 00:56:42659 std::unique_ptr<ProxyService> proxy_service_;
660 std::unique_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
[email protected]61a527782013-02-21 03:58:00661 MockRandom random_generator_;
bnc6be245c12015-05-15 11:24:07662 HttpServerPropertiesImpl http_server_properties_;
[email protected]61a527782013-02-21 03:58:00663 HttpNetworkSession::Params params_;
[email protected]aa9b14d2013-05-10 23:45:19664 HttpRequestInfo request_;
vishal.b62985ca92015-04-17 08:45:51665 BoundTestNetLog net_log_;
danakjad1777e2016-04-16 00:56:42666 std::vector<std::unique_ptr<StaticSocketDataProvider>> hanging_data_;
rchf114d982015-10-21 01:34:56667 SSLSocketDataProvider ssl_data_;
tbansal7cec3812015-02-05 21:25:12668
669 private:
670 void SendRequestAndExpectQuicResponseMaybeFromProxy(
671 const std::string& expected,
bnc62a44f022015-04-02 15:59:41672 bool used_proxy,
Avi Drissman13fc8932015-12-20 04:40:46673 uint16_t port) {
danakjad1777e2016-04-16 00:56:42674 std::unique_ptr<HttpNetworkTransaction> trans(
tbansal7cec3812015-02-05 21:25:12675 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
ryansturm49a8cb12016-06-15 16:51:09676 HeadersHandler headers_handler;
677 trans->SetBeforeHeadersSentCallback(
678 base::Bind(&HeadersHandler::OnBeforeHeadersSent,
679 base::Unretained(&headers_handler)));
bncffc2fdf2015-05-14 18:29:49680 RunTransaction(trans);
tbansal7cec3812015-02-05 21:25:12681 CheckWasQuicResponse(trans);
bnc62a44f022015-04-02 15:59:41682 CheckResponsePort(trans, port);
bncffc2fdf2015-05-14 18:29:49683 CheckResponseData(trans, expected);
ryansturm49a8cb12016-06-15 16:51:09684 EXPECT_EQ(used_proxy, headers_handler.was_proxied());
tbansal7cec3812015-02-05 21:25:12685 }
[email protected]61a527782013-02-21 03:58:00686};
687
rjshaded5ced072015-12-18 19:26:02688INSTANTIATE_TEST_CASE_P(Version,
689 QuicNetworkTransactionTest,
[email protected]1e960032013-12-20 19:00:20690 ::testing::ValuesIn(QuicSupportedVersions()));
691
692TEST_P(QuicNetworkTransactionTest, ForceQuic) {
rtenneti8a2f4632016-03-21 20:26:57693 params_.origins_to_force_quic_on.insert(
694 HostPortPair::FromString("mail.example.org:443"));
[email protected]4dca587c2013-03-07 16:54:47695
[email protected]1e960032013-12-20 19:00:20696 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58697 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
698 1, kClientDataStreamId1, true, true,
699 GetRequestHeaders("GET", "https", "/")));
700 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:02701 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58702 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
703 false, true, 0, "hello!"));
704 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:59705 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
[email protected]4dca587c2013-03-07 16:54:47706
rcha5399e02015-04-21 19:32:04707 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4dca587c2013-03-07 16:54:47708
rtennetib8e80fb2016-05-16 00:12:09709 // The non-alternate protocol job needs to hang in order to guarantee that
710 // the alternate-protocol job will "win".
711 AddHangingNonAlternateProtocolSocketData();
712
[email protected]4dca587c2013-03-07 16:54:47713 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47714
tbansal0f56a39a2016-04-07 22:03:38715 EXPECT_FALSE(
716 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]aa9b14d2013-05-10 23:45:19717 SendRequestAndExpectQuicResponse("hello!");
tbansal0f56a39a2016-04-07 22:03:38718 EXPECT_TRUE(
719 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]4dca587c2013-03-07 16:54:47720
[email protected]98b20ce2013-05-10 05:55:26721 // Check that the NetLog was filled reasonably.
mmenke43758e62015-05-04 21:09:46722 TestNetLogEntry::List entries;
[email protected]aa9b14d2013-05-10 23:45:19723 net_log_.GetEntries(&entries);
[email protected]98b20ce2013-05-10 05:55:26724 EXPECT_LT(0u, entries.size());
725
726 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29727 int pos = ExpectLogContainsSomewhere(
728 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
729 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26730 EXPECT_LT(0, pos);
731
rchfd527212015-08-25 00:41:26732 // ... and also a TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29733 pos = ExpectLogContainsSomewhere(
rchfd527212015-08-25 00:41:26734 entries, 0,
735 NetLog::TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED,
ttuttle859dc7a2015-04-23 19:42:29736 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26737 EXPECT_LT(0, pos);
738
rtennetia004d332015-08-28 06:44:57739 std::string packet_number;
740 ASSERT_TRUE(entries[pos].GetStringValue("packet_number", &packet_number));
741 EXPECT_EQ("1", packet_number);
[email protected]98b20ce2013-05-10 05:55:26742
rchfd527212015-08-25 00:41:26743 // ... and also a TYPE_QUIC_SESSION_PACKET_AUTHENTICATED.
744 pos = ExpectLogContainsSomewhere(
745 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_AUTHENTICATED,
746 NetLog::PHASE_NONE);
747 EXPECT_LT(0, pos);
748
[email protected]98b20ce2013-05-10 05:55:26749 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29750 pos = ExpectLogContainsSomewhere(
751 entries, 0, NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
752 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26753 EXPECT_LT(0, pos);
754
755 int log_stream_id;
756 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
[email protected]1e960032013-12-20 19:00:20757 EXPECT_EQ(3, log_stream_id);
[email protected]4dca587c2013-03-07 16:54:47758}
759
[email protected]cf3e3cd62014-02-05 16:16:16760TEST_P(QuicNetworkTransactionTest, QuicProxy) {
tbansal9bf26672016-05-11 18:32:45761 params_.enable_quic = true;
rchf114d982015-10-21 01:34:56762 proxy_service_ =
rch9ae5b3b2016-02-11 00:36:29763 ProxyService::CreateFixedFromPacResult("QUIC mail.example.org:70");
[email protected]cf3e3cd62014-02-05 16:16:16764
[email protected]cf3e3cd62014-02-05 16:16:16765 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58766 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
767 1, kClientDataStreamId1, true, true,
768 GetRequestHeaders("GET", "http", "/")));
769 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:02770 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58771 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
772 false, true, 0, "hello!"));
773 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50774 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59775 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]cf3e3cd62014-02-05 16:16:16776
rcha5399e02015-04-21 19:32:04777 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cf3e3cd62014-02-05 16:16:16778
tbansal0f56a39a2016-04-07 22:03:38779 EXPECT_FALSE(
780 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16781 // There is no need to set up an alternate protocol job, because
782 // no attempt will be made to speak to the proxy over TCP.
783
rch9ae5b3b2016-02-11 00:36:29784 request_.url = GURL("http://mail.example.org/");
[email protected]cf3e3cd62014-02-05 16:16:16785 CreateSession();
786
bnc62a44f022015-04-02 15:59:41787 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
tbansal0f56a39a2016-04-07 22:03:38788 EXPECT_TRUE(
789 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16790}
791
bnc313ba9c2015-06-11 15:42:31792// Regression test for https://crbug.com/492458. Test that for an HTTP
793// connection through a QUIC proxy, the certificate exhibited by the proxy is
794// checked against the proxy hostname, not the origin hostname.
795TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) {
rch9ae5b3b2016-02-11 00:36:29796 const std::string origin_host = "mail.example.com";
bnc313ba9c2015-06-11 15:42:31797 const std::string proxy_host = "www.example.org";
798
tbansal9bf26672016-05-11 18:32:45799 params_.enable_quic = true;
rdsmith82957ad2015-09-16 19:42:03800 proxy_service_ =
801 ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70");
bnc313ba9c2015-06-11 15:42:31802
alyssar2adf3ac2016-05-03 17:12:58803 client_maker_.set_hostname(origin_host);
bnc313ba9c2015-06-11 15:42:31804 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58805 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
806 1, kClientDataStreamId1, true, true,
807 GetRequestHeaders("GET", "http", "/")));
808 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc313ba9c2015-06-11 15:42:31809 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58810 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
811 false, true, 0, "hello!"));
812 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50813 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59814 mock_quic_data.AddRead(ASYNC, 0);
bnc313ba9c2015-06-11 15:42:31815 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
816
817 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29818 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bnc313ba9c2015-06-11 15:42:31819 ASSERT_TRUE(cert.get());
820 // This certificate is valid for the proxy, but not for the origin.
821 bool common_name_fallback_used;
822 EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used));
823 EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used));
824 ProofVerifyDetailsChromium verify_details;
825 verify_details.cert_verify_result.verified_cert = cert;
826 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rchf114d982015-10-21 01:34:56827 ProofVerifyDetailsChromium verify_details2;
828 verify_details2.cert_verify_result.verified_cert = cert;
829 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
bnc313ba9c2015-06-11 15:42:31830
831 request_.url = GURL("http://" + origin_host);
rtennetib8e80fb2016-05-16 00:12:09832 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32833 CreateSession();
bnc313ba9c2015-06-11 15:42:31834 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
835 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
836}
837
rchbe69cb902016-02-11 01:10:48838TEST_P(QuicNetworkTransactionTest, AlternativeServicesDifferentHost) {
rchbe69cb902016-02-11 01:10:48839 HostPortPair origin("www.example.org", 443);
840 HostPortPair alternative("mail.example.org", 443);
841
842 base::FilePath certs_dir = GetTestCertsDirectory();
843 scoped_refptr<X509Certificate> cert(
844 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
845 ASSERT_TRUE(cert.get());
846 // TODO(rch): the connection should be "to" the origin, so if the cert is
847 // valid for the origin but not the alternative, that should work too.
848 bool common_name_fallback_used;
849 EXPECT_TRUE(cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
850 EXPECT_TRUE(
851 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
852 ProofVerifyDetailsChromium verify_details;
853 verify_details.cert_verify_result.verified_cert = cert;
854 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
855
alyssar2adf3ac2016-05-03 17:12:58856 client_maker_.set_hostname(origin.host());
rchbe69cb902016-02-11 01:10:48857 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58858 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
859 1, kClientDataStreamId1, true, true,
860 GetRequestHeaders("GET", "https", "/")));
861 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rchbe69cb902016-02-11 01:10:48862 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58863 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
864 false, true, 0, "hello!"));
865 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchbe69cb902016-02-11 01:10:48866 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
867 mock_quic_data.AddRead(ASYNC, 0);
868 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
869
870 request_.url = GURL("https://" + origin.host());
871 AddQuicRemoteAlternativeServiceMapping(
872 MockCryptoClientStream::CONFIRM_HANDSHAKE, alternative);
rtennetib8e80fb2016-05-16 00:12:09873 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32874 CreateSession();
rchbe69cb902016-02-11 01:10:48875
876 SendRequestAndExpectQuicResponse("hello!");
877}
878
[email protected]1e960032013-12-20 19:00:20879TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
rtenneti8a2f4632016-03-21 20:26:57880 params_.origins_to_force_quic_on.insert(
881 HostPortPair::FromString("mail.example.org:443"));
[email protected]cebe3282013-05-22 23:49:30882
tbansalfdf5665b2015-09-21 22:46:40883 MockQuicData mock_quic_data1;
884 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
[email protected]1e960032013-12-20 19:00:20885
tbansalfdf5665b2015-09-21 22:46:40886 MockQuicData mock_quic_data2;
zhongyi32569c62016-01-08 02:54:30887 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40888 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
rch6faa4d42016-01-05 20:48:43889 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40890
891 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
892 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
[email protected]cebe3282013-05-22 23:49:30893
894 CreateSession();
895
tbansal0f56a39a2016-04-07 22:03:38896 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40897 for (size_t i = 0; i < 2; ++i) {
danakjad1777e2016-04-16 00:56:42898 std::unique_ptr<HttpNetworkTransaction> trans(
tbansalfdf5665b2015-09-21 22:46:40899 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
900 TestCompletionCallback callback;
901 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
902 EXPECT_EQ(ERR_IO_PENDING, rv);
903 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
tbansal0f56a39a2016-04-07 22:03:38904 EXPECT_EQ(1 + i, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40905 }
[email protected]cebe3282013-05-22 23:49:30906}
907
tbansalc8a94ea2015-11-02 23:58:51908TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
909 // Attempt to "force" quic on 443, which will not be honored.
rtenneti8a2f4632016-03-21 20:26:57910 params_.origins_to_force_quic_on.insert(
911 HostPortPair::FromString("www.google.com:443"));
tbansalc8a94ea2015-11-02 23:58:51912
913 MockRead http_reads[] = {
914 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
915 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
916 MockRead(ASYNC, OK)};
917
918 StaticSocketDataProvider data(http_reads, arraysize(http_reads), nullptr, 0);
919 socket_factory_.AddSocketDataProvider(&data);
920 SSLSocketDataProvider ssl(ASYNC, OK);
921 socket_factory_.AddSSLSocketDataProvider(&ssl);
922
923 CreateSession();
924
925 SendRequestAndExpectHttpResponse("hello world");
tbansal0f56a39a2016-04-07 22:03:38926 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalc8a94ea2015-11-02 23:58:51927}
928
bncc958faa2015-07-31 18:14:52929TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52930 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56931 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
932 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52933 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
934 MockRead(ASYNC, OK)};
935
936 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
937 0);
938 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56939 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52940
941 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58942 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
943 1, kClientDataStreamId1, true, true,
944 GetRequestHeaders("GET", "https", "/")));
945 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:52946 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58947 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
948 false, true, 0, "hello!"));
949 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:52950 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59951 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52952
953 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
954
rtennetib8e80fb2016-05-16 00:12:09955 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32956 CreateSession();
bncc958faa2015-07-31 18:14:52957
958 SendRequestAndExpectHttpResponse("hello world");
959 SendRequestAndExpectQuicResponse("hello!");
960}
961
rchf47265dc2016-03-21 21:33:12962TEST_P(QuicNetworkTransactionTest,
963 UseAlternativeServiceWithProbabilityForQuic) {
964 MockRead http_reads[] = {
965 MockRead("HTTP/1.1 200 OK\r\n"),
966 MockRead(kQuicAlternativeServiceWithProbabilityHeader),
967 MockRead("hello world"),
968 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
969 MockRead(ASYNC, OK)};
970
971 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
972 0);
973 socket_factory_.AddSocketDataProvider(&http_data);
974 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
975
976 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58977 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
978 1, kClientDataStreamId1, true, true,
979 GetRequestHeaders("GET", "https", "/")));
980 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rchf47265dc2016-03-21 21:33:12981 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58982 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
983 false, true, 0, "hello!"));
984 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchf47265dc2016-03-21 21:33:12985 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
986 mock_quic_data.AddRead(ASYNC, 0); // EOF
987
988 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
989
rtennetib8e80fb2016-05-16 00:12:09990 AddHangingNonAlternateProtocolSocketData();
rchf47265dc2016-03-21 21:33:12991 CreateSession();
992
993 SendRequestAndExpectHttpResponse("hello world");
994 SendRequestAndExpectQuicResponse("hello!");
995}
996
zhongyi3d4a55e72016-04-22 20:36:46997TEST_P(QuicNetworkTransactionTest, SetAlternativeServiceWithScheme) {
998 MockRead http_reads[] = {
999 MockRead("HTTP/1.1 200 OK\r\n"),
1000 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
1001 MockRead("hello world"),
1002 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1003 MockRead(ASYNC, OK)};
1004
1005 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1006 0);
1007
1008 socket_factory_.AddSocketDataProvider(&http_data);
1009 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1010
1011 CreateSession();
bncb26024382016-06-29 02:39:451012 // Send https request, ignore alternative service advertising if response
zhongyi3d4a55e72016-04-22 20:36:461013 // header advertises alternative service for mail.example.org.
bncb26024382016-06-29 02:39:451014 request_.url = GURL("https://mail.example.org:443");
zhongyi3d4a55e72016-04-22 20:36:461015 SendRequestAndExpectHttpResponse("hello world");
bnc525e175a2016-06-20 12:36:401016 HttpServerProperties* http_server_properties =
zhongyi3d4a55e72016-04-22 20:36:461017 session_->http_server_properties();
1018 url::SchemeHostPort http_server("http", "mail.example.org", 443);
1019 url::SchemeHostPort https_server("https", "mail.example.org", 443);
1020 // Check alternative service is set for the correct origin.
zhongyi3d4a55e72016-04-22 20:36:461021 EXPECT_EQ(
bncb26024382016-06-29 02:39:451022 2u, http_server_properties->GetAlternativeServices(https_server).size());
1023 EXPECT_TRUE(
1024 http_server_properties->GetAlternativeServices(http_server).empty());
zhongyi3d4a55e72016-04-22 20:36:461025}
1026
1027TEST_P(QuicNetworkTransactionTest, DoNotGetAltSvcForDifferentOrigin) {
1028 MockRead http_reads[] = {
1029 MockRead("HTTP/1.1 200 OK\r\n"),
1030 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
1031 MockRead("hello world"),
1032 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1033 MockRead(ASYNC, OK)};
1034
1035 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1036 0);
1037
1038 socket_factory_.AddSocketDataProvider(&http_data);
1039 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1040 socket_factory_.AddSocketDataProvider(&http_data);
1041 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1042
1043 CreateSession();
1044
1045 // Send https request and set alternative services if response header
1046 // advertises alternative service for mail.example.org.
1047 SendRequestAndExpectHttpResponse("hello world");
bnc525e175a2016-06-20 12:36:401048 HttpServerProperties* http_server_properties =
zhongyi3d4a55e72016-04-22 20:36:461049 session_->http_server_properties();
1050
1051 const url::SchemeHostPort https_server(request_.url);
1052 // Check alternative service is set.
1053 AlternativeServiceVector alternative_service_vector =
1054 http_server_properties->GetAlternativeServices(https_server);
1055 EXPECT_EQ(2u, alternative_service_vector.size());
1056
1057 // Send http request to the same origin but with diffrent scheme, should not
1058 // use QUIC.
1059 request_.url = GURL("http://mail.example.org:443");
1060 SendRequestAndExpectHttpResponse("hello world");
1061}
1062
bnc8be55ebb2015-10-30 14:12:071063TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) {
1064 std::string altsvc_header = base::StringPrintf(
1065 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam());
1066 MockRead http_reads[] = {
1067 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1068 MockRead("hello world"),
1069 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1070 MockRead(ASYNC, OK)};
1071
1072 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1073 0);
1074 socket_factory_.AddSocketDataProvider(&http_data);
1075 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1076
1077 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581078 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1079 1, kClientDataStreamId1, true, true,
1080 GetRequestHeaders("GET", "https", "/")));
1081 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc8be55ebb2015-10-30 14:12:071082 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581083 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1084 false, true, 0, "hello!"));
1085 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bnc8be55ebb2015-10-30 14:12:071086 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591087 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc8be55ebb2015-10-30 14:12:071088
1089 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1090
rtennetib8e80fb2016-05-16 00:12:091091 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321092 CreateSession();
bnc8be55ebb2015-10-30 14:12:071093
1094 SendRequestAndExpectHttpResponse("hello world");
1095 SendRequestAndExpectQuicResponse("hello!");
1096}
1097
zhongyi6b5a3892016-03-12 04:46:201098TEST_P(QuicNetworkTransactionTest, GoAwayWithConnectionMigrationOnPortsOnly) {
1099 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581100 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1101 1, kClientDataStreamId1, true, true,
1102 GetRequestHeaders("GET", "https", "/")));
1103 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi6b5a3892016-03-12 04:46:201104 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1105 // Read a GoAway packet with
1106 // QuicErrorCode: QUIC_ERROR_MIGRATING_PORT from the peer.
alyssar2adf3ac2016-05-03 17:12:581107 mock_quic_data.AddRead(ConstructServerGoAwayPacket(
1108 2, QUIC_ERROR_MIGRATING_PORT,
1109 "connection migration with port change only"));
1110 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
1111 mock_quic_data.AddRead(ConstructServerDataPacket(3, kClientDataStreamId1,
1112 false, true, 0, "hello!"));
1113 mock_quic_data.AddWrite(ConstructClientAckAndRstPacket(
zhongyi6b5a3892016-03-12 04:46:201114 3, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 3, 3, 1));
1115 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1116 mock_quic_data.AddRead(ASYNC, 0); // EOF
1117
1118 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1119
1120 // The non-alternate protocol job needs to hang in order to guarantee that
1121 // the alternate-protocol job will "win".
1122 AddHangingNonAlternateProtocolSocketData();
1123
1124 // In order for a new QUIC session to be established via alternate-protocol
1125 // without racing an HTTP connection, we need the host resolution to happen
1126 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1127 // connection to the the server, in this test we require confirmation
1128 // before encrypting so the HTTP job will still start.
1129 host_resolver_.set_synchronous_mode(true);
1130 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1131 "");
1132 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1133 AddressList address;
1134 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1135 nullptr, net_log_.bound());
1136
1137 CreateSession();
1138 session_->quic_stream_factory()->set_require_confirmation(true);
1139 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1140
danakjad1777e2016-04-16 00:56:421141 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyi6b5a3892016-03-12 04:46:201142 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1143 TestCompletionCallback callback;
1144 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1145 EXPECT_EQ(ERR_IO_PENDING, rv);
1146
1147 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1148 QuicSession::HANDSHAKE_CONFIRMED);
1149 EXPECT_EQ(OK, callback.WaitForResult());
1150
1151 // Check whether this transaction is correctly marked as received a go-away
1152 // because of migrating port.
1153 NetErrorDetails details;
1154 EXPECT_FALSE(details.quic_port_migration_detected);
1155 trans->PopulateNetErrorDetails(&details);
1156 EXPECT_TRUE(details.quic_port_migration_detected);
1157}
1158
bnc8be55ebb2015-10-30 14:12:071159TEST_P(QuicNetworkTransactionTest,
1160 DoNotUseAlternativeServiceQuicUnsupportedVersion) {
1161 std::string altsvc_header = base::StringPrintf(
1162 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam() - 1);
1163 MockRead http_reads[] = {
1164 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1165 MockRead("hello world"),
1166 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1167 MockRead(ASYNC, OK)};
1168
1169 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1170 0);
1171 socket_factory_.AddSocketDataProvider(&http_data);
1172 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1173 socket_factory_.AddSocketDataProvider(&http_data);
1174 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1175
rch3f4b8452016-02-23 16:59:321176 CreateSession();
bnc8be55ebb2015-10-30 14:12:071177
1178 SendRequestAndExpectHttpResponse("hello world");
1179 SendRequestAndExpectHttpResponse("hello world");
1180}
1181
bncc958faa2015-07-31 18:14:521182// When multiple alternative services are advertised,
zhongyi32569c62016-01-08 02:54:301183// HttpStreamFactoryImpl::RequestStreamInternal() should select the alternative
1184// service which uses existing QUIC session if available. If no existing QUIC
1185// session can be used, use the first alternative service from the list.
1186TEST_P(QuicNetworkTransactionTest, UseExistingAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:521187 MockRead http_reads[] = {
1188 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291189 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
bncc958faa2015-07-31 18:14:521190 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);
rchf114d982015-10-21 01:34:561197 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521198
zhongyi32569c62016-01-08 02:54:301199 QuicStreamOffset request_header_offset = 0;
1200 QuicStreamOffset response_header_offset = 0;
1201 // First QUIC request data.
rch9ae5b3b2016-02-11 00:36:291202 // Open a session to foo.example.org:443 using the first entry of the
zhongyi32569c62016-01-08 02:54:301203 // alternative service list.
bncc958faa2015-07-31 18:14:521204 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581205 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301206 1, kClientDataStreamId1, true, true,
1207 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1208
1209 std::string alt_svc_list =
rch9ae5b3b2016-02-11 00:36:291210 "quic=\"mail.example.org:444\", quic=\"foo.example.org:443\", "
1211 "quic=\"bar.example.org:445\"";
alyssar2adf3ac2016-05-03 17:12:581212 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301213 1, kClientDataStreamId1, false, false,
1214 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581215 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1216 false, true, 0, "hello!"));
1217 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301218
1219 // Second QUIC request data.
1220 // Connection pooling, using existing session, no need to include version
1221 // as version negotiation has been completed.
alyssar2adf3ac2016-05-03 17:12:581222 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301223 3, kClientDataStreamId2, false, true,
1224 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581225 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301226 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1227 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581228 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1229 false, true, 0, "hello!"));
1230 mock_quic_data.AddWrite(
1231 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
bncc958faa2015-07-31 18:14:521232 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591233 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521234
1235 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1236
rtennetib8e80fb2016-05-16 00:12:091237 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321238 CreateSession();
bncc958faa2015-07-31 18:14:521239
1240 SendRequestAndExpectHttpResponse("hello world");
zhongyi32569c62016-01-08 02:54:301241
bnc359ed2a2016-04-29 20:43:451242 SendRequestAndExpectQuicResponse("hello!");
1243 SendRequestAndExpectQuicResponse("hello!");
zhongyi32569c62016-01-08 02:54:301244}
1245
bnc359ed2a2016-04-29 20:43:451246// Pool to existing session with matching QuicServerId
1247// even if alternative service destination is different.
1248TEST_P(QuicNetworkTransactionTest, PoolByOrigin) {
zhongyi32569c62016-01-08 02:54:301249 MockQuicData mock_quic_data;
bnc359ed2a2016-04-29 20:43:451250 QuicStreamOffset request_header_offset(0);
1251 QuicStreamOffset response_header_offset(0);
1252
1253 // First request.
alyssar2adf3ac2016-05-03 17:12:581254 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301255 1, kClientDataStreamId1, true, true,
1256 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581257 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451258 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1259 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581260 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1261 false, true, 0, "hello!"));
1262 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301263
bnc359ed2a2016-04-29 20:43:451264 // Second request.
alyssar2adf3ac2016-05-03 17:12:581265 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301266 3, kClientDataStreamId2, false, true,
1267 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581268 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301269 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1270 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581271 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1272 false, true, 0, "hello!"));
1273 mock_quic_data.AddWrite(
1274 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
zhongyi32569c62016-01-08 02:54:301275 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1276 mock_quic_data.AddRead(ASYNC, 0); // EOF
1277
1278 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bnc359ed2a2016-04-29 20:43:451279
1280 AddHangingNonAlternateProtocolSocketData();
1281 AddHangingNonAlternateProtocolSocketData();
zhongyi32569c62016-01-08 02:54:301282
rch3f4b8452016-02-23 16:59:321283 CreateSession();
zhongyi32569c62016-01-08 02:54:301284
bnc359ed2a2016-04-29 20:43:451285 const char destination1[] = "first.example.com";
1286 const char destination2[] = "second.example.com";
1287
1288 // Set up alternative service entry to destination1.
1289 url::SchemeHostPort server(request_.url);
1290 AlternativeService alternative_service(QUIC, destination1, 443);
1291 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1292 http_server_properties_.SetAlternativeService(server, alternative_service,
1293 expiration);
1294 // First request opens connection to |destination1|
1295 // with QuicServerId.host() == kDefaultServerHostName.
1296 SendRequestAndExpectQuicResponse("hello!");
1297
1298 // Set up alternative service entry to a different destination.
1299 alternative_service = AlternativeService(QUIC, destination2, 443);
1300 http_server_properties_.SetAlternativeService(server, alternative_service,
1301 expiration);
1302 // Second request pools to existing connection with same QuicServerId,
1303 // even though alternative service destination is different.
1304 SendRequestAndExpectQuicResponse("hello!");
1305}
1306
1307// Pool to existing session with matching destination and matching certificate
1308// even if origin is different, and even if the alternative service with
1309// matching destination is not the first one on the list.
1310TEST_P(QuicNetworkTransactionTest, PoolByDestination) {
1311 GURL origin1 = request_.url;
1312 GURL origin2("https://www.example.org/");
1313 ASSERT_NE(origin1.host(), origin2.host());
1314
1315 MockQuicData mock_quic_data;
1316 QuicStreamOffset request_header_offset(0);
1317 QuicStreamOffset response_header_offset(0);
1318
1319 // First request.
alyssar2adf3ac2016-05-03 17:12:581320 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:451321 1, kClientDataStreamId1, true, true,
1322 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581323 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451324 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1325 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581326 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1327 false, true, 0, "hello!"));
1328 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bnc359ed2a2016-04-29 20:43:451329
1330 // Second request.
alyssar2adf3ac2016-05-03 17:12:581331 QuicTestPacketMaker client_maker2(GetParam(), 0, clock_, origin2.host(),
1332 Perspective::IS_CLIENT);
1333 QuicTestPacketMaker server_maker2(GetParam(), 0, clock_, origin2.host(),
1334 Perspective::IS_SERVER);
1335 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:451336 3, kClientDataStreamId2, false, true,
alyssar2adf3ac2016-05-03 17:12:581337 GetRequestHeaders("GET", "https", "/", &client_maker2),
1338 &request_header_offset, &client_maker2));
1339 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451340 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
alyssar2adf3ac2016-05-03 17:12:581341 &response_header_offset, &server_maker2));
1342 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1343 false, true, 0, "hello!"));
1344 mock_quic_data.AddWrite(
1345 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
bnc359ed2a2016-04-29 20:43:451346 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1347 mock_quic_data.AddRead(ASYNC, 0); // EOF
1348
1349 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1350
1351 AddHangingNonAlternateProtocolSocketData();
1352 AddHangingNonAlternateProtocolSocketData();
1353
1354 CreateSession();
1355
1356 const char destination1[] = "first.example.com";
1357 const char destination2[] = "second.example.com";
1358
1359 // Set up alternative service for |origin1|.
1360 AlternativeService alternative_service1(QUIC, destination1, 443);
1361 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1362 http_server_properties_.SetAlternativeService(
1363 url::SchemeHostPort(origin1), alternative_service1, expiration);
1364
1365 // Set up multiple alternative service entries for |origin2|,
1366 // the first one with a different destination as for |origin1|,
1367 // the second one with the same. The second one should be used,
1368 // because the request can be pooled to that one.
1369 AlternativeService alternative_service2(QUIC, destination2, 443);
1370 AlternativeServiceInfoVector alternative_services;
1371 alternative_services.push_back(
1372 AlternativeServiceInfo(alternative_service2, expiration));
1373 alternative_services.push_back(
1374 AlternativeServiceInfo(alternative_service1, expiration));
1375 http_server_properties_.SetAlternativeServices(url::SchemeHostPort(origin2),
1376 alternative_services);
bnc359ed2a2016-04-29 20:43:451377 // First request opens connection to |destination1|
1378 // with QuicServerId.host() == origin1.host().
1379 SendRequestAndExpectQuicResponse("hello!");
1380
1381 // Second request pools to existing connection with same destination,
1382 // because certificate matches, even though QuicServerId is different.
1383 request_.url = origin2;
alyssar2adf3ac2016-05-03 17:12:581384
bnc359ed2a2016-04-29 20:43:451385 SendRequestAndExpectQuicResponse("hello!");
zhongyi32569c62016-01-08 02:54:301386}
1387
1388// Multiple origins have listed the same alternative services. When there's a
1389// existing QUIC session opened by a request to other origin,
1390// if the cert is valid, should select this QUIC session to make the request
1391// if this is also the first existing QUIC session.
1392TEST_P(QuicNetworkTransactionTest,
1393 UseSharedExistingAlternativeServiceForQuicWithValidCert) {
rch9ae5b3b2016-02-11 00:36:291394 // Default cert is valid for *.example.org
zhongyi32569c62016-01-08 02:54:301395
rch9ae5b3b2016-02-11 00:36:291396 // HTTP data for request to www.example.org.
zhongyi32569c62016-01-08 02:54:301397 MockRead http_reads[] = {
1398 MockRead("HTTP/1.1 200 OK\r\n"),
1399 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
rch9ae5b3b2016-02-11 00:36:291400 MockRead("hello world from www.example.org"),
zhongyi32569c62016-01-08 02:54:301401 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1402 MockRead(ASYNC, OK)};
1403
1404 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1405 0);
1406 socket_factory_.AddSocketDataProvider(&http_data);
1407 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1408
1409 // HTTP data for request to mail.example.org.
1410 MockRead http_reads2[] = {
1411 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291412 MockRead("Alt-Svc: quic=\":444\", quic=\"www.example.org:443\"\r\n\r\n"),
zhongyi32569c62016-01-08 02:54:301413 MockRead("hello world from mail.example.org"),
1414 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1415 MockRead(ASYNC, OK)};
1416
1417 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1418 nullptr, 0);
1419 socket_factory_.AddSocketDataProvider(&http_data2);
1420 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1421
1422 QuicStreamOffset request_header_offset = 0;
1423 QuicStreamOffset response_header_offset = 0;
1424
alyssar2adf3ac2016-05-03 17:12:581425 QuicTestPacketMaker client_maker(GetParam(), 0, clock_, "mail.example.org",
1426 Perspective::IS_CLIENT);
1427 server_maker_.set_hostname("www.example.org");
1428 client_maker_.set_hostname("www.example.org");
zhongyi32569c62016-01-08 02:54:301429 MockQuicData mock_quic_data;
1430
1431 // First QUIC request data.
alyssar2adf3ac2016-05-03 17:12:581432 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301433 1, kClientDataStreamId1, true, true,
1434 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1435
alyssar2adf3ac2016-05-03 17:12:581436 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301437 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1438 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581439 mock_quic_data.AddRead(ConstructServerDataPacket(
1440 2, kClientDataStreamId1, false, true, 0, "hello from mail QUIC!"));
1441 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301442 // Second QUIC request data.
alyssar2adf3ac2016-05-03 17:12:581443 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301444 3, kClientDataStreamId2, false, true,
alyssar2adf3ac2016-05-03 17:12:581445 GetRequestHeaders("GET", "https", "/", &client_maker),
1446 &request_header_offset, &client_maker));
1447 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301448 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1449 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581450 mock_quic_data.AddRead(ConstructServerDataPacket(
1451 4, kClientDataStreamId2, false, true, 0, "hello from mail QUIC!"));
1452 mock_quic_data.AddWrite(
1453 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
zhongyi32569c62016-01-08 02:54:301454 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1455 mock_quic_data.AddRead(ASYNC, 0); // EOF
1456
1457 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
zhongyi32569c62016-01-08 02:54:301458
rtennetib8e80fb2016-05-16 00:12:091459 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321460 CreateSession();
zhongyi32569c62016-01-08 02:54:301461
1462 // Send two HTTP requests, responses set up alt-svc lists for the origins.
rch9ae5b3b2016-02-11 00:36:291463 request_.url = GURL("https://www.example.org/");
1464 SendRequestAndExpectHttpResponse("hello world from www.example.org");
zhongyi32569c62016-01-08 02:54:301465 request_.url = GURL("https://mail.example.org/");
1466 SendRequestAndExpectHttpResponse("hello world from mail.example.org");
1467
rch9ae5b3b2016-02-11 00:36:291468 // Open a QUIC session to mail.example.org:443 when making request
1469 // to mail.example.org.
1470 request_.url = GURL("https://www.example.org/");
bnc359ed2a2016-04-29 20:43:451471 SendRequestAndExpectQuicResponse("hello from mail QUIC!");
zhongyi32569c62016-01-08 02:54:301472
rch9ae5b3b2016-02-11 00:36:291473 // Uses the existing QUIC session when making request to www.example.org.
zhongyi32569c62016-01-08 02:54:301474 request_.url = GURL("https://mail.example.org/");
bnc359ed2a2016-04-29 20:43:451475 SendRequestAndExpectQuicResponse("hello from mail QUIC!");
bncc958faa2015-07-31 18:14:521476}
1477
1478TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) {
bncc958faa2015-07-31 18:14:521479 MockRead http_reads[] = {
1480 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561481 MockRead(kQuicAlternativeServiceDifferentPortHeader),
bncc958faa2015-07-31 18:14:521482 MockRead("hello world"),
1483 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1484 MockRead(ASYNC, OK)};
1485
1486 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1487 0);
1488 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561489 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521490
rtennetib8e80fb2016-05-16 00:12:091491 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321492 CreateSession();
bncc958faa2015-07-31 18:14:521493
1494 SendRequestAndExpectHttpResponse("hello world");
bnc359ed2a2016-04-29 20:43:451495
1496 url::SchemeHostPort http_server("https", kDefaultServerHostName, 443);
1497 AlternativeServiceVector alternative_service_vector =
1498 http_server_properties_.GetAlternativeServices(http_server);
1499 ASSERT_EQ(1u, alternative_service_vector.size());
1500 const AlternativeService alternative_service = alternative_service_vector[0];
1501 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
1502 EXPECT_EQ(kDefaultServerHostName, alternative_service_vector[0].host);
1503 EXPECT_EQ(137, alternative_service_vector[0].port);
bncc958faa2015-07-31 18:14:521504}
1505
1506TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) {
bncc958faa2015-07-31 18:14:521507 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561508 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1509 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521510 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1511 MockRead(ASYNC, OK)};
1512
1513 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1514 0);
1515 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561516 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521517
1518 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581519 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1520 1, kClientDataStreamId1, true, true,
1521 GetRequestHeaders("GET", "https", "/")));
1522 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:521523 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581524 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1525 false, true, 0, "hello!"));
1526 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:521527 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1528 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521529
1530 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1531
rtennetib8e80fb2016-05-16 00:12:091532 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321533 CreateSession();
bncc958faa2015-07-31 18:14:521534
1535 AlternativeService alternative_service(QUIC,
1536 HostPortPair::FromURL(request_.url));
1537 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
1538 alternative_service);
1539 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1540 alternative_service));
1541
1542 SendRequestAndExpectHttpResponse("hello world");
1543 SendRequestAndExpectQuicResponse("hello!");
1544
mmenkee24011922015-12-17 22:12:591545 mock_quic_data.Resume();
bncc958faa2015-07-31 18:14:521546
1547 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1548 alternative_service));
1549}
1550
bncc958faa2015-07-31 18:14:521551TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) {
bncc958faa2015-07-31 18:14:521552 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561553 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1554 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521555 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1556 MockRead(ASYNC, OK)};
1557
1558 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1559 0);
1560 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561561 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521562
1563 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581564 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1565 1, kClientDataStreamId1, true, true,
1566 GetRequestHeaders("GET", "https", "/")));
1567 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:521568 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581569 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1570 false, true, 0, "hello!"));
1571 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:521572 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
1573
1574 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1575
1576 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321577 CreateSession();
bncc958faa2015-07-31 18:14:521578
1579 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1580 SendRequestAndExpectHttpResponse("hello world");
1581}
1582
bnc1c196c6e2016-05-28 13:51:481583TEST_P(QuicNetworkTransactionTest, HungAlternativeService) {
[email protected]dda75ab2013-06-22 22:43:301584 crypto_client_stream_factory_.set_handshake_mode(
1585 MockCryptoClientStream::COLD_START);
1586
1587 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561588 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
rch9ae5b3b2016-02-11 00:36:291589 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561590 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")};
[email protected]dda75ab2013-06-22 22:43:301591
1592 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561593 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
bnc1c196c6e2016-05-28 13:51:481594 MockRead(SYNCHRONOUS, 4, kQuicAlternativeServiceHeader),
rchf114d982015-10-21 01:34:561595 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]dda75ab2013-06-22 22:43:301596
mmenke651bae7f2015-12-18 21:26:451597 SequencedSocketData http_data(http_reads, arraysize(http_reads), http_writes,
1598 arraysize(http_writes));
bnc912a04b2016-04-20 14:19:501599 socket_factory_.AddSocketDataProvider(&http_data);
1600 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301601
1602 // The QUIC transaction will not be allowed to complete.
mmenke651bae7f2015-12-18 21:26:451603 MockWrite quic_writes[] = {MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 1)};
[email protected]dda75ab2013-06-22 22:43:301604 MockRead quic_reads[] = {
mmenke651bae7f2015-12-18 21:26:451605 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0),
[email protected]dda75ab2013-06-22 22:43:301606 };
mmenke651bae7f2015-12-18 21:26:451607 SequencedSocketData quic_data(quic_reads, arraysize(quic_reads), quic_writes,
1608 arraysize(quic_writes));
bnc912a04b2016-04-20 14:19:501609 socket_factory_.AddSocketDataProvider(&quic_data);
[email protected]dda75ab2013-06-22 22:43:301610
1611 // The HTTP transaction will complete.
mmenke651bae7f2015-12-18 21:26:451612 SequencedSocketData http_data2(http_reads, arraysize(http_reads), http_writes,
1613 arraysize(http_writes));
bnc912a04b2016-04-20 14:19:501614 socket_factory_.AddSocketDataProvider(&http_data2);
1615 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301616
bnc912a04b2016-04-20 14:19:501617 CreateSession();
[email protected]dda75ab2013-06-22 22:43:301618
1619 // Run the first request.
[email protected]dda75ab2013-06-22 22:43:301620 SendRequestAndExpectHttpResponse("hello world");
rch37de576c2015-05-17 20:28:171621 ASSERT_TRUE(http_data.AllReadDataConsumed());
1622 ASSERT_TRUE(http_data.AllWriteDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301623
1624 // Now run the second request in which the QUIC socket hangs,
1625 // and verify the the transaction continues over HTTP.
[email protected]dda75ab2013-06-22 22:43:301626 SendRequestAndExpectHttpResponse("hello world");
mmenke651bae7f2015-12-18 21:26:451627 base::RunLoop().RunUntilIdle();
[email protected]dda75ab2013-06-22 22:43:301628
rch37de576c2015-05-17 20:28:171629 ASSERT_TRUE(http_data2.AllReadDataConsumed());
1630 ASSERT_TRUE(http_data2.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:451631 ASSERT_TRUE(quic_data.AllReadDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301632}
1633
[email protected]1e960032013-12-20 19:00:201634TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
[email protected]1e960032013-12-20 19:00:201635 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581636 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1637 1, kClientDataStreamId1, true, true,
1638 GetRequestHeaders("GET", "https", "/")));
1639 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021640 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581641 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1642 false, true, 0, "hello!"));
1643 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501644 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591645 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]8ba81212013-05-03 13:11:481646
rcha5399e02015-04-21 19:32:041647 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]8ba81212013-05-03 13:11:481648
rtennetib8e80fb2016-05-16 00:12:091649 // The non-alternate protocol job needs to hang in order to guarantee that
1650 // the alternate-protocol job will "win".
1651 AddHangingNonAlternateProtocolSocketData();
1652
rch3f4b8452016-02-23 16:59:321653 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:191654 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1655 SendRequestAndExpectQuicResponse("hello!");
[email protected]8ba81212013-05-03 13:11:481656}
1657
[email protected]1e960032013-12-20 19:00:201658TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
[email protected]1e960032013-12-20 19:00:201659 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581660 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1661 1, kClientDataStreamId1, true, true,
1662 GetRequestHeaders("GET", "https", "/")));
1663 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021664 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581665 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1666 false, true, 0, "hello!"));
1667 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501668 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591669 mock_quic_data.AddRead(ASYNC, 0); // EOF
rcha5399e02015-04-21 19:32:041670 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]3a120a6b2013-06-25 01:08:271671
1672 // In order for a new QUIC session to be established via alternate-protocol
1673 // without racing an HTTP connection, we need the host resolution to happen
1674 // synchronously.
1675 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291676 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561677 "");
rch9ae5b3b2016-02-11 00:36:291678 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]3a120a6b2013-06-25 01:08:271679 AddressList address;
rjshaded5ced072015-12-18 19:26:021680 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1681 nullptr, net_log_.bound());
[email protected]3a120a6b2013-06-25 01:08:271682
rtennetib8e80fb2016-05-16 00:12:091683 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321684 CreateSession();
[email protected]3a120a6b2013-06-25 01:08:271685 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1686 SendRequestAndExpectQuicResponse("hello!");
1687}
1688
[email protected]0fc924b2014-03-31 04:34:151689TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) {
rdsmith82957ad2015-09-16 19:42:031690 proxy_service_ = ProxyService::CreateFixedFromPacResult("PROXY myproxy:70");
[email protected]0fc924b2014-03-31 04:34:151691
1692 // Since we are using a proxy, the QUIC job will not succeed.
1693 MockWrite http_writes[] = {
rch9ae5b3b2016-02-11 00:36:291694 MockWrite(SYNCHRONOUS, 0, "GET http://mail.example.org/ HTTP/1.1\r\n"),
1695 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561696 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")};
[email protected]0fc924b2014-03-31 04:34:151697
1698 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561699 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
bnc1c196c6e2016-05-28 13:51:481700 MockRead(SYNCHRONOUS, 4, kQuicAlternativeServiceHeader),
rchf114d982015-10-21 01:34:561701 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]0fc924b2014-03-31 04:34:151702
1703 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
1704 http_writes, arraysize(http_writes));
1705 socket_factory_.AddSocketDataProvider(&http_data);
1706
1707 // In order for a new QUIC session to be established via alternate-protocol
1708 // without racing an HTTP connection, we need the host resolution to happen
1709 // synchronously.
1710 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291711 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561712 "");
rch9ae5b3b2016-02-11 00:36:291713 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]0fc924b2014-03-31 04:34:151714 AddressList address;
rjshaded5ced072015-12-18 19:26:021715 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1716 nullptr, net_log_.bound());
[email protected]0fc924b2014-03-31 04:34:151717
rch9ae5b3b2016-02-11 00:36:291718 request_.url = GURL("http://mail.example.org/");
rch3f4b8452016-02-23 16:59:321719 CreateSession();
[email protected]0fc924b2014-03-31 04:34:151720 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1721 SendRequestAndExpectHttpResponse("hello world");
1722}
1723
[email protected]1e960032013-12-20 19:00:201724TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
[email protected]1e960032013-12-20 19:00:201725 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581726 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1727 1, kClientDataStreamId1, true, true,
1728 GetRequestHeaders("GET", "https", "/")));
1729 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021730 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581731 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1732 false, true, 0, "hello!"));
1733 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591734 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
rcha5399e02015-04-21 19:32:041735 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]11c05872013-08-20 02:04:121736
rtennetib8e80fb2016-05-16 00:12:091737 // The non-alternate protocol job needs to hang in order to guarantee that
1738 // the alternate-protocol job will "win".
1739 AddHangingNonAlternateProtocolSocketData();
1740
[email protected]11c05872013-08-20 02:04:121741 // In order for a new QUIC session to be established via alternate-protocol
1742 // without racing an HTTP connection, we need the host resolution to happen
1743 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1744 // connection to the the server, in this test we require confirmation
1745 // before encrypting so the HTTP job will still start.
1746 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291747 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561748 "");
rch9ae5b3b2016-02-11 00:36:291749 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]11c05872013-08-20 02:04:121750 AddressList address;
rjshaded5ced072015-12-18 19:26:021751 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1752 nullptr, net_log_.bound());
[email protected]11c05872013-08-20 02:04:121753
rch3f4b8452016-02-23 16:59:321754 CreateSession();
[email protected]11c05872013-08-20 02:04:121755 session_->quic_stream_factory()->set_require_confirmation(true);
1756 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1757
danakjad1777e2016-04-16 00:56:421758 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]11c05872013-08-20 02:04:121759 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1760 TestCompletionCallback callback;
1761 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1762 EXPECT_EQ(ERR_IO_PENDING, rv);
1763
1764 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1765 QuicSession::HANDSHAKE_CONFIRMED);
1766 EXPECT_EQ(OK, callback.WaitForResult());
rchb27683c2015-07-29 23:53:501767
1768 CheckWasQuicResponse(trans);
1769 CheckResponseData(trans, "hello!");
[email protected]11c05872013-08-20 02:04:121770}
1771
zhongyica364fbb2015-12-12 03:39:121772TEST_P(QuicNetworkTransactionTest,
1773 LogGranularQuicErrorCodeOnQuicProtocolErrorLocal) {
1774 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581775 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1776 1, kClientDataStreamId1, true, true,
1777 GetRequestHeaders("GET", "https", "/")));
zhongyica364fbb2015-12-12 03:39:121778 // Read a close connection packet with
1779 // QuicErrorCode: QUIC_CRYPTO_VERSION_NOT_SUPPORTED from the peer.
alyssar2adf3ac2016-05-03 17:12:581780 mock_quic_data.AddRead(ConstructServerConnectionClosePacket(1));
zhongyica364fbb2015-12-12 03:39:121781 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1782
1783 // The non-alternate protocol job needs to hang in order to guarantee that
1784 // the alternate-protocol job will "win".
1785 AddHangingNonAlternateProtocolSocketData();
1786
1787 // In order for a new QUIC session to be established via alternate-protocol
1788 // without racing an HTTP connection, we need the host resolution to happen
1789 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1790 // connection to the the server, in this test we require confirmation
1791 // before encrypting so the HTTP job will still start.
1792 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291793 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:121794 "");
rch9ae5b3b2016-02-11 00:36:291795 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:121796 AddressList address;
1797 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1798 nullptr, net_log_.bound());
1799
rch3f4b8452016-02-23 16:59:321800 CreateSession();
zhongyica364fbb2015-12-12 03:39:121801 session_->quic_stream_factory()->set_require_confirmation(true);
1802 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1803
danakjad1777e2016-04-16 00:56:421804 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyica364fbb2015-12-12 03:39:121805 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1806 TestCompletionCallback callback;
1807 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1808 EXPECT_EQ(ERR_IO_PENDING, rv);
1809
1810 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1811 QuicSession::HANDSHAKE_CONFIRMED);
1812 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
1813
1814 NetErrorDetails details;
1815 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1816
1817 trans->PopulateNetErrorDetails(&details);
1818 // Verify the error code logged is what sent by the peer.
1819 EXPECT_EQ(QUIC_CRYPTO_VERSION_NOT_SUPPORTED, details.quic_connection_error);
1820}
1821
1822TEST_P(QuicNetworkTransactionTest,
1823 LogGranularQuicErrorCodeOnQuicProtocolErrorRemote) {
1824 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581825 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1826 1, kClientDataStreamId1, true, true,
1827 GetRequestHeaders("GET", "https", "/")));
zhongyif28b4a32016-04-25 21:35:211828 // Peer sending data from an non-existing stream causes this end to raise
1829 // error and close connection.
1830 mock_quic_data.AddRead(
alyssar2adf3ac2016-05-03 17:12:581831 ConstructServerRstPacket(1, false, 99, QUIC_STREAM_LAST_ERROR));
zhongyif28b4a32016-04-25 21:35:211832 std::string quic_error_details = "Data for nonexistent stream";
alyssar2adf3ac2016-05-03 17:12:581833 mock_quic_data.AddWrite(ConstructClientAckAndConnectionClosePacket(
zhongyif28b4a32016-04-25 21:35:211834 2, QuicTime::Delta::Infinite(), 0, 1, QUIC_INVALID_STREAM_ID,
zhongyica364fbb2015-12-12 03:39:121835 quic_error_details));
1836 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1837
1838 // The non-alternate protocol job needs to hang in order to guarantee that
1839 // the alternate-protocol job will "win".
1840 AddHangingNonAlternateProtocolSocketData();
1841
1842 // In order for a new QUIC session to be established via alternate-protocol
1843 // without racing an HTTP connection, we need the host resolution to happen
1844 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1845 // connection to the the server, in this test we require confirmation
1846 // before encrypting so the HTTP job will still start.
1847 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291848 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:121849 "");
rch9ae5b3b2016-02-11 00:36:291850 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:121851 AddressList address;
1852 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1853 nullptr, net_log_.bound());
1854
rch3f4b8452016-02-23 16:59:321855 CreateSession();
zhongyica364fbb2015-12-12 03:39:121856 session_->quic_stream_factory()->set_require_confirmation(true);
1857 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1858
danakjad1777e2016-04-16 00:56:421859 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyica364fbb2015-12-12 03:39:121860 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1861 TestCompletionCallback callback;
1862 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1863 EXPECT_EQ(ERR_IO_PENDING, rv);
1864
1865 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1866 QuicSession::HANDSHAKE_CONFIRMED);
1867 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
1868 NetErrorDetails details;
1869 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1870
1871 trans->PopulateNetErrorDetails(&details);
zhongyif28b4a32016-04-25 21:35:211872 EXPECT_EQ(QUIC_INVALID_STREAM_ID, details.quic_connection_error);
zhongyica364fbb2015-12-12 03:39:121873}
1874
rchcd5f1c62016-06-23 02:43:481875TEST_P(QuicNetworkTransactionTest, RstSteamErrorHandling) {
1876 MockQuicData mock_quic_data;
1877 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1878 1, kClientDataStreamId1, true, true,
1879 GetRequestHeaders("GET", "https", "/")));
1880 // Read the response headers, then a RST_STREAM frame.
1881 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
1882 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1883 mock_quic_data.AddRead(ConstructServerRstPacket(
1884 2, false, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1885 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
1886 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
1887 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1888
1889 // The non-alternate protocol job needs to hang in order to guarantee that
1890 // the alternate-protocol job will "win".
1891 AddHangingNonAlternateProtocolSocketData();
1892
1893 // In order for a new QUIC session to be established via alternate-protocol
1894 // without racing an HTTP connection, we need the host resolution to happen
1895 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1896 // connection to the the server, in this test we require confirmation
1897 // before encrypting so the HTTP job will still start.
1898 host_resolver_.set_synchronous_mode(true);
1899 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1900 "");
1901 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1902 AddressList address;
1903 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1904 nullptr, net_log_.bound());
1905
1906 CreateSession();
1907 session_->quic_stream_factory()->set_require_confirmation(true);
1908 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1909
1910 std::unique_ptr<HttpNetworkTransaction> trans(
1911 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1912 TestCompletionCallback callback;
1913 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1914 EXPECT_EQ(ERR_IO_PENDING, rv);
1915
1916 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1917 QuicSession::HANDSHAKE_CONFIRMED);
1918 // Read the headers.
1919 EXPECT_EQ(OK, callback.WaitForResult());
1920
1921 const HttpResponseInfo* response = trans->GetResponseInfo();
1922 ASSERT_TRUE(response != nullptr);
1923 ASSERT_TRUE(response->headers.get() != nullptr);
1924 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
1925 EXPECT_TRUE(response->was_fetched_via_spdy);
1926 EXPECT_TRUE(response->was_npn_negotiated);
1927 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
1928 response->connection_info);
1929
1930 std::string response_data;
1931 ASSERT_EQ(ERR_QUIC_PROTOCOL_ERROR,
1932 ReadTransaction(trans.get(), &response_data));
1933}
1934
1935TEST_P(QuicNetworkTransactionTest, RstSteamBeforeHeaders) {
1936 MockQuicData mock_quic_data;
1937 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1938 1, kClientDataStreamId1, true, true,
1939 GetRequestHeaders("GET", "https", "/")));
1940 mock_quic_data.AddRead(ConstructServerRstPacket(
1941 1, false, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1942 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
1943 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1944
1945 // The non-alternate protocol job needs to hang in order to guarantee that
1946 // the alternate-protocol job will "win".
1947 AddHangingNonAlternateProtocolSocketData();
1948
1949 // In order for a new QUIC session to be established via alternate-protocol
1950 // without racing an HTTP connection, we need the host resolution to happen
1951 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1952 // connection to the the server, in this test we require confirmation
1953 // before encrypting so the HTTP job will still start.
1954 host_resolver_.set_synchronous_mode(true);
1955 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1956 "");
1957 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1958 AddressList address;
1959 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1960 nullptr, net_log_.bound());
1961
1962 CreateSession();
1963 session_->quic_stream_factory()->set_require_confirmation(true);
1964 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1965
1966 std::unique_ptr<HttpNetworkTransaction> trans(
1967 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1968 TestCompletionCallback callback;
1969 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1970 EXPECT_EQ(ERR_IO_PENDING, rv);
1971
1972 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1973 QuicSession::HANDSHAKE_CONFIRMED);
1974 // Read the headers.
1975 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
1976}
1977
[email protected]1e960032013-12-20 19:00:201978TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
[email protected]3316d422013-05-03 21:45:301979 // Alternate-protocol job
alyssar2adf3ac2016-05-03 17:12:581980 std::unique_ptr<QuicEncryptedPacket> close(
1981 ConstructServerConnectionClosePacket(1));
[email protected]3316d422013-05-03 21:45:301982 MockRead quic_reads[] = {
rchb27683c2015-07-29 23:53:501983 MockRead(ASYNC, close->data(), close->length()),
1984 MockRead(ASYNC, ERR_IO_PENDING), // No more data to read
1985 MockRead(ASYNC, OK), // EOF
[email protected]3316d422013-05-03 21:45:301986 };
rjshaded5ced072015-12-18 19:26:021987 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
1988 0);
[email protected]3316d422013-05-03 21:45:301989 socket_factory_.AddSocketDataProvider(&quic_data);
1990
1991 // Main job which will succeed even though the alternate job fails.
1992 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021993 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
1994 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1995 MockRead(ASYNC, OK)};
[email protected]3316d422013-05-03 21:45:301996
rjshaded5ced072015-12-18 19:26:021997 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1998 0);
[email protected]3316d422013-05-03 21:45:301999 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562000 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]3316d422013-05-03 21:45:302001
rch3f4b8452016-02-23 16:59:322002 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:192003 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2004 SendRequestAndExpectHttpResponse("hello from http");
2005 ExpectBrokenAlternateProtocolMapping();
[email protected]3316d422013-05-03 21:45:302006}
2007
[email protected]1e960032013-12-20 19:00:202008TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
[email protected]d03a66d2013-05-06 12:55:592009 // Alternate-protocol job
2010 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022011 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]d03a66d2013-05-06 12:55:592012 };
rjshaded5ced072015-12-18 19:26:022013 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2014 0);
[email protected]d03a66d2013-05-06 12:55:592015 socket_factory_.AddSocketDataProvider(&quic_data);
2016
2017 // Main job which will succeed even though the alternate job fails.
2018 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022019 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2020 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2021 MockRead(ASYNC, OK)};
[email protected]d03a66d2013-05-06 12:55:592022
rjshaded5ced072015-12-18 19:26:022023 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2024 0);
[email protected]d03a66d2013-05-06 12:55:592025 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562026 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]d03a66d2013-05-06 12:55:592027
rch3f4b8452016-02-23 16:59:322028 CreateSession();
[email protected]d03a66d2013-05-06 12:55:592029
[email protected]aa9b14d2013-05-10 23:45:192030 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2031 SendRequestAndExpectHttpResponse("hello from http");
2032 ExpectBrokenAlternateProtocolMapping();
[email protected]d03a66d2013-05-06 12:55:592033}
2034
[email protected]00c159f2014-05-21 22:38:162035TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) {
[email protected]eb71ab62014-05-23 07:57:532036 // Alternate-protocol job will fail when the session attempts to read.
[email protected]00c159f2014-05-21 22:38:162037 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022038 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162039 };
rjshaded5ced072015-12-18 19:26:022040 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2041 0);
[email protected]00c159f2014-05-21 22:38:162042 socket_factory_.AddSocketDataProvider(&quic_data);
2043
[email protected]eb71ab62014-05-23 07:57:532044 // Main job will also fail.
[email protected]00c159f2014-05-21 22:38:162045 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022046 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162047 };
2048
rjshaded5ced072015-12-18 19:26:022049 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2050 0);
[email protected]00c159f2014-05-21 22:38:162051 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED));
2052 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562053 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]00c159f2014-05-21 22:38:162054
rtennetib8e80fb2016-05-16 00:12:092055 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322056 CreateSession();
[email protected]00c159f2014-05-21 22:38:162057
2058 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
danakjad1777e2016-04-16 00:56:422059 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]00c159f2014-05-21 22:38:162060 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2061 TestCompletionCallback callback;
2062 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2063 EXPECT_EQ(ERR_IO_PENDING, rv);
2064 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult());
2065 ExpectQuicAlternateProtocolMapping();
2066}
2067
[email protected]1e960032013-12-20 19:00:202068TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
[email protected]77c6c162013-08-17 02:57:452069 // Alternate-protocol job
2070 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022071 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]77c6c162013-08-17 02:57:452072 };
rjshaded5ced072015-12-18 19:26:022073 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2074 0);
[email protected]77c6c162013-08-17 02:57:452075 socket_factory_.AddSocketDataProvider(&quic_data);
2076
[email protected]c92c1b52014-05-31 04:16:062077 // Second Alternate-protocol job which will race with the TCP job.
2078 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:422079 nullptr, 0);
[email protected]c92c1b52014-05-31 04:16:062080 socket_factory_.AddSocketDataProvider(&quic_data2);
2081
[email protected]4d283b32013-10-17 12:57:272082 // Final job that will proceed when the QUIC job fails.
2083 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022084 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2085 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2086 MockRead(ASYNC, OK)};
[email protected]4d283b32013-10-17 12:57:272087
rjshaded5ced072015-12-18 19:26:022088 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2089 0);
[email protected]4d283b32013-10-17 12:57:272090 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562091 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d283b32013-10-17 12:57:272092
rtennetiafccbc062016-05-16 18:21:142093 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322094 CreateSession();
[email protected]77c6c162013-08-17 02:57:452095
2096 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2097
[email protected]4d283b32013-10-17 12:57:272098 SendRequestAndExpectHttpResponse("hello from http");
[email protected]77c6c162013-08-17 02:57:452099
2100 ExpectBrokenAlternateProtocolMapping();
[email protected]4d283b32013-10-17 12:57:272101
rch37de576c2015-05-17 20:28:172102 EXPECT_TRUE(quic_data.AllReadDataConsumed());
2103 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
[email protected]77c6c162013-08-17 02:57:452104}
2105
[email protected]93b31772014-06-19 08:03:352106TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) {
[email protected]65768442014-06-06 23:37:032107 // Alternate-protocol job
2108 MockRead quic_reads[] = {
mmenkee24011922015-12-17 22:12:592109 MockRead(SYNCHRONOUS, ERR_IO_PENDING),
[email protected]65768442014-06-06 23:37:032110 };
rjshaded5ced072015-12-18 19:26:022111 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2112 0);
[email protected]65768442014-06-06 23:37:032113 socket_factory_.AddSocketDataProvider(&quic_data);
2114
2115 // Main job that will proceed when the QUIC job fails.
2116 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022117 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2118 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2119 MockRead(ASYNC, OK)};
[email protected]65768442014-06-06 23:37:032120
rjshaded5ced072015-12-18 19:26:022121 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2122 0);
[email protected]65768442014-06-06 23:37:032123 socket_factory_.AddSocketDataProvider(&http_data);
2124
rtennetib8e80fb2016-05-16 00:12:092125 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322126 CreateSession();
[email protected]65768442014-06-06 23:37:032127
2128 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2129
2130 SendRequestAndExpectHttpResponse("hello from http");
2131}
2132
[email protected]eb71ab62014-05-23 07:57:532133TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
[email protected]4d590c9c2014-05-02 05:14:332134 // Alternate-protocol job will fail before creating a QUIC session.
rtennetibe635732014-10-02 22:51:422135 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0);
rjshaded5ced072015-12-18 19:26:022136 quic_data.set_connect_data(
2137 MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED));
[email protected]4d590c9c2014-05-02 05:14:332138 socket_factory_.AddSocketDataProvider(&quic_data);
2139
2140 // Main job which will succeed even though the alternate 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]4d590c9c2014-05-02 05:14:332145
rjshaded5ced072015-12-18 19:26:022146 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2147 0);
[email protected]4d590c9c2014-05-02 05:14:332148 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562149 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d590c9c2014-05-02 05:14:332150
rch3f4b8452016-02-23 16:59:322151 CreateSession();
[email protected]4d590c9c2014-05-02 05:14:332152 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2153 SendRequestAndExpectHttpResponse("hello from http");
[email protected]eb71ab62014-05-23 07:57:532154
2155 ExpectBrokenAlternateProtocolMapping();
[email protected]4d590c9c2014-05-02 05:14:332156}
2157
[email protected]4fee9672014-01-08 14:47:152158TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
[email protected]4fee9672014-01-08 14:47:152159 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582160 mock_quic_data.AddSynchronousRead(ConstructServerConnectionClosePacket(1));
2161 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2162 1, kClientDataStreamId1, true, true,
2163 GetRequestHeaders("GET", "https", "/")));
2164 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rcha5399e02015-04-21 19:32:042165 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4fee9672014-01-08 14:47:152166
2167 // When the QUIC connection fails, we will try the request again over HTTP.
2168 MockRead http_reads[] = {
bnc1c196c6e2016-05-28 13:51:482169 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
rchf114d982015-10-21 01:34:562170 MockRead("hello world"),
2171 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2172 MockRead(ASYNC, OK)};
[email protected]4fee9672014-01-08 14:47:152173
rjshaded5ced072015-12-18 19:26:022174 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2175 0);
[email protected]4fee9672014-01-08 14:47:152176 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562177 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4fee9672014-01-08 14:47:152178
2179 // In order for a new QUIC session to be established via alternate-protocol
2180 // without racing an HTTP connection, we need the host resolution to happen
2181 // synchronously.
2182 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:292183 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:562184 "");
rch9ae5b3b2016-02-11 00:36:292185 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]4fee9672014-01-08 14:47:152186 AddressList address;
rjshaded5ced072015-12-18 19:26:022187 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2188 nullptr, net_log_.bound());
[email protected]4fee9672014-01-08 14:47:152189
rch3f4b8452016-02-23 16:59:322190 CreateSession();
[email protected]4fee9672014-01-08 14:47:152191 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2192 SendRequestAndExpectHttpResponse("hello world");
2193}
2194
bnc508835902015-05-12 20:10:292195TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) {
alyssar2adf3ac2016-05-03 17:12:582196 client_maker_.set_hostname("www.example.org");
tbansal0f56a39a2016-04-07 22:03:382197 EXPECT_FALSE(
2198 test_socket_performance_watcher_factory_.rtt_notification_received());
bnc508835902015-05-12 20:10:292199 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582200 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2201 1, kClientDataStreamId1, true, true,
2202 GetRequestHeaders("GET", "https", "/")));
2203 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc508835902015-05-12 20:10:292204 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:582205 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
2206 false, true, 0, "hello!"));
2207 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:502208 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
bnc508835902015-05-12 20:10:292209 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2210
bncb07c05532015-05-14 19:07:202211 request_.url = GURL("https://www.example.org:443");
rtennetib8e80fb2016-05-16 00:12:092212 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322213 CreateSession();
bnc508835902015-05-12 20:10:292214 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
2215 SendRequestAndExpectQuicResponse("hello!");
tbansal0f56a39a2016-04-07 22:03:382216 EXPECT_TRUE(
2217 test_socket_performance_watcher_factory_.rtt_notification_received());
bnc508835902015-05-12 20:10:292218}
2219
rtenneti56977812016-01-15 19:26:562220TEST_P(QuicNetworkTransactionTest, QuicUpload) {
rtenneti8a2f4632016-03-21 20:26:572221 params_.origins_to_force_quic_on.insert(
2222 HostPortPair::FromString("mail.example.org:443"));
rtenneti56977812016-01-15 19:26:562223
2224 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2225 MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_FAILED, 1)};
2226 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2227 arraysize(writes));
2228 socket_factory_.AddSocketDataProvider(&socket_data);
2229
rtennetib8e80fb2016-05-16 00:12:092230 // The non-alternate protocol job needs to hang in order to guarantee that
2231 // the alternate-protocol job will "win".
2232 AddHangingNonAlternateProtocolSocketData();
2233
rtenneti56977812016-01-15 19:26:562234 CreateSession();
2235 request_.method = "POST";
2236 ChunkedUploadDataStream upload_data(0);
2237 upload_data.AppendData("1", 1, true);
2238
2239 request_.upload_data_stream = &upload_data;
2240
danakjad1777e2016-04-16 00:56:422241 std::unique_ptr<HttpNetworkTransaction> trans(
rtenneti56977812016-01-15 19:26:562242 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2243 TestCompletionCallback callback;
2244 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2245 EXPECT_EQ(ERR_IO_PENDING, rv);
2246 EXPECT_NE(OK, callback.WaitForResult());
2247}
2248
bnc359ed2a2016-04-29 20:43:452249class QuicNetworkTransactionWithDestinationTest
2250 : public PlatformTest,
2251 public ::testing::WithParamInterface<PoolingTestParams> {
2252 protected:
2253 QuicNetworkTransactionWithDestinationTest()
2254 : clock_(new MockClock),
2255 version_(GetParam().version),
2256 destination_type_(GetParam().destination_type),
2257 cert_transparency_verifier_(new MultiLogCTVerifier()),
2258 ssl_config_service_(new SSLConfigServiceDefaults),
2259 proxy_service_(ProxyService::CreateDirect()),
2260 auth_handler_factory_(
2261 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
2262 random_generator_(0),
2263 ssl_data_(ASYNC, OK) {}
2264
2265 void SetUp() override {
2266 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:552267 base::RunLoop().RunUntilIdle();
bnc359ed2a2016-04-29 20:43:452268
2269 HttpNetworkSession::Params params;
2270
2271 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
2272 params.quic_clock = clock_;
2273
2274 crypto_client_stream_factory_.set_handshake_mode(
2275 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2276 params.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
2277
bnc359ed2a2016-04-29 20:43:452278 params.enable_quic = true;
2279 params.quic_random = &random_generator_;
2280 params.client_socket_factory = &socket_factory_;
2281 params.host_resolver = &host_resolver_;
2282 params.cert_verifier = &cert_verifier_;
2283 params.transport_security_state = &transport_security_state_;
2284 params.cert_transparency_verifier = cert_transparency_verifier_.get();
rsleevid6de8302016-06-21 01:33:202285 params.ct_policy_enforcer = &ct_policy_enforcer_;
bnc359ed2a2016-04-29 20:43:452286 params.socket_performance_watcher_factory =
2287 &test_socket_performance_watcher_factory_;
2288 params.ssl_config_service = ssl_config_service_.get();
2289 params.proxy_service = proxy_service_.get();
2290 params.http_auth_handler_factory = auth_handler_factory_.get();
bnc525e175a2016-06-20 12:36:402291 params.http_server_properties = &http_server_properties_;
bnc359ed2a2016-04-29 20:43:452292 params.quic_supported_versions = SupportedVersions(version_);
2293 params.quic_host_whitelist.insert("news.example.org");
2294 params.quic_host_whitelist.insert("mail.example.org");
2295 params.quic_host_whitelist.insert("mail.example.com");
2296
2297 session_.reset(new HttpNetworkSession(params));
2298 session_->quic_stream_factory()->set_require_confirmation(true);
2299 ASSERT_EQ(params.quic_socket_receive_buffer_size,
2300 session_->quic_stream_factory()->socket_receive_buffer_size());
2301 }
2302
2303 void TearDown() override {
2304 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
2305 // Empty the current queue.
fdoray92e35a72016-06-10 15:54:552306 base::RunLoop().RunUntilIdle();
bnc359ed2a2016-04-29 20:43:452307 PlatformTest::TearDown();
2308 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:552309 base::RunLoop().RunUntilIdle();
bnc525e175a2016-06-20 12:36:402310 session_.reset();
bnc359ed2a2016-04-29 20:43:452311 }
2312
2313 void SetAlternativeService(const std::string& origin) {
2314 HostPortPair destination;
2315 switch (destination_type_) {
2316 case SAME_AS_FIRST:
2317 destination = HostPortPair(origin1_, 443);
2318 break;
2319 case SAME_AS_SECOND:
2320 destination = HostPortPair(origin2_, 443);
2321 break;
2322 case DIFFERENT:
2323 destination = HostPortPair(kDifferentHostname, 443);
2324 break;
2325 }
2326 AlternativeService alternative_service(QUIC, destination);
2327 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
2328 http_server_properties_.SetAlternativeService(
2329 url::SchemeHostPort("https", origin, 443), alternative_service,
2330 expiration);
2331 }
2332
alyssar2adf3ac2016-05-03 17:12:582333 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452334 QuicPacketNumber packet_number,
2335 QuicStreamId stream_id,
2336 bool should_include_version,
2337 QuicStreamOffset* offset,
2338 QuicTestPacketMaker* maker) {
2339 SpdyPriority priority =
2340 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
2341 SpdyHeaderBlock headers(maker->GetRequestHeaders("GET", "https", "/"));
2342 return maker->MakeRequestHeadersPacketWithOffsetTracking(
2343 packet_number, stream_id, should_include_version, true, priority,
bnc086b39e12016-06-24 13:05:262344 std::move(headers), offset);
bnc359ed2a2016-04-29 20:43:452345 }
2346
alyssar2adf3ac2016-05-03 17:12:582347 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452348 QuicPacketNumber packet_number,
2349 QuicStreamId stream_id,
2350 bool should_include_version,
2351 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:582352 return ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452353 packet_number, stream_id, should_include_version, nullptr, maker);
2354 }
2355
alyssar2adf3ac2016-05-03 17:12:582356 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:452357 QuicPacketNumber packet_number,
2358 QuicStreamId stream_id,
2359 QuicStreamOffset* offset,
2360 QuicTestPacketMaker* maker) {
2361 SpdyHeaderBlock headers(maker->GetResponseHeaders("200 OK"));
2362 return maker->MakeResponseHeadersPacketWithOffsetTracking(
bnc086b39e12016-06-24 13:05:262363 packet_number, stream_id, false, false, std::move(headers), offset);
bnc359ed2a2016-04-29 20:43:452364 }
2365
alyssar2adf3ac2016-05-03 17:12:582366 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:452367 QuicPacketNumber packet_number,
2368 QuicStreamId stream_id,
2369 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:582370 return ConstructServerResponseHeadersPacket(packet_number, stream_id,
2371 nullptr, maker);
bnc359ed2a2016-04-29 20:43:452372 }
2373
alyssar2adf3ac2016-05-03 17:12:582374 std::unique_ptr<QuicEncryptedPacket> ConstructServerDataPacket(
bnc359ed2a2016-04-29 20:43:452375 QuicPacketNumber packet_number,
2376 QuicStreamId stream_id,
2377 QuicTestPacketMaker* maker) {
2378 return maker->MakeDataPacket(packet_number, stream_id, false, true, 0,
2379 "hello");
2380 }
2381
alyssar2adf3ac2016-05-03 17:12:582382 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
bnc359ed2a2016-04-29 20:43:452383 QuicPacketNumber packet_number,
2384 QuicPacketNumber largest_received,
2385 QuicPacketNumber ack_least_unacked,
2386 QuicPacketNumber stop_least_unacked,
2387 QuicTestPacketMaker* maker) {
2388 return maker->MakeAckPacket(packet_number, largest_received,
2389 ack_least_unacked, stop_least_unacked, true);
2390 }
2391
2392 void AddRefusedSocketData() {
2393 std::unique_ptr<StaticSocketDataProvider> refused_data(
2394 new StaticSocketDataProvider());
2395 MockConnect refused_connect(SYNCHRONOUS, ERR_CONNECTION_REFUSED);
2396 refused_data->set_connect_data(refused_connect);
2397 socket_factory_.AddSocketDataProvider(refused_data.get());
2398 static_socket_data_provider_vector_.push_back(std::move(refused_data));
2399 }
2400
2401 void AddHangingSocketData() {
2402 std::unique_ptr<StaticSocketDataProvider> hanging_data(
2403 new StaticSocketDataProvider());
2404 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
2405 hanging_data->set_connect_data(hanging_connect);
2406 socket_factory_.AddSocketDataProvider(hanging_data.get());
2407 static_socket_data_provider_vector_.push_back(std::move(hanging_data));
2408 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
2409 }
2410
2411 bool AllDataConsumed() {
2412 for (const auto& socket_data_ptr : static_socket_data_provider_vector_) {
2413 if (!socket_data_ptr->AllReadDataConsumed() ||
2414 !socket_data_ptr->AllWriteDataConsumed()) {
2415 return false;
2416 }
2417 }
2418 return true;
2419 }
2420
2421 void SendRequestAndExpectQuicResponse(const std::string& host) {
2422 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
2423 HttpRequestInfo request;
2424 std::string url("https://");
2425 url.append(host);
2426 request.url = GURL(url);
2427 request.load_flags = 0;
2428 request.method = "GET";
2429 TestCompletionCallback callback;
2430 int rv = trans.Start(&request, callback.callback(), net_log_.bound());
2431 EXPECT_EQ(OK, callback.GetResult(rv));
2432
2433 std::string response_data;
2434 ASSERT_EQ(OK, ReadTransaction(&trans, &response_data));
2435 EXPECT_EQ("hello", response_data);
2436
2437 const HttpResponseInfo* response = trans.GetResponseInfo();
2438 ASSERT_TRUE(response != nullptr);
2439 ASSERT_TRUE(response->headers.get() != nullptr);
2440 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
2441 EXPECT_TRUE(response->was_fetched_via_spdy);
2442 EXPECT_TRUE(response->was_npn_negotiated);
2443 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
2444 response->connection_info);
2445 EXPECT_EQ(443, response->socket_address.port());
2446 }
2447
2448 MockClock* clock_;
2449 QuicVersion version_;
2450 DestinationType destination_type_;
2451 std::string origin1_;
2452 std::string origin2_;
2453 std::unique_ptr<HttpNetworkSession> session_;
2454 MockClientSocketFactory socket_factory_;
2455 MockHostResolver host_resolver_;
2456 MockCertVerifier cert_verifier_;
2457 TransportSecurityState transport_security_state_;
2458 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
rsleevid6de8302016-06-21 01:33:202459 CTPolicyEnforcer ct_policy_enforcer_;
bnc359ed2a2016-04-29 20:43:452460 TestSocketPerformanceWatcherFactory test_socket_performance_watcher_factory_;
2461 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
2462 std::unique_ptr<ProxyService> proxy_service_;
2463 std::unique_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
2464 MockRandom random_generator_;
2465 HttpServerPropertiesImpl http_server_properties_;
2466 BoundTestNetLog net_log_;
2467 MockCryptoClientStreamFactory crypto_client_stream_factory_;
2468 std::vector<std::unique_ptr<StaticSocketDataProvider>>
2469 static_socket_data_provider_vector_;
2470 SSLSocketDataProvider ssl_data_;
2471};
2472
2473INSTANTIATE_TEST_CASE_P(Version,
2474 QuicNetworkTransactionWithDestinationTest,
2475 ::testing::ValuesIn(GetPoolingTestParams()));
2476
2477// A single QUIC request fails because the certificate does not match the origin
2478// hostname, regardless of whether it matches the alternative service hostname.
2479TEST_P(QuicNetworkTransactionWithDestinationTest, InvalidCertificate) {
2480 if (destination_type_ == DIFFERENT)
2481 return;
2482
2483 GURL url("https://mail.example.com/");
2484 origin1_ = url.host();
2485
2486 // Not used for requests, but this provides a test case where the certificate
2487 // is valid for the hostname of the alternative service.
2488 origin2_ = "mail.example.org";
2489
2490 SetAlternativeService(origin1_);
2491
2492 scoped_refptr<X509Certificate> cert(
2493 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2494 bool unused;
2495 ASSERT_FALSE(cert->VerifyNameMatch(origin1_, &unused));
2496 ASSERT_TRUE(cert->VerifyNameMatch(origin2_, &unused));
2497
2498 ProofVerifyDetailsChromium verify_details;
2499 verify_details.cert_verify_result.verified_cert = cert;
2500 verify_details.cert_verify_result.is_issued_by_known_root = true;
2501 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2502
2503 MockQuicData mock_quic_data;
2504 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);
2505 mock_quic_data.AddRead(ASYNC, 0);
2506
2507 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2508
2509 AddRefusedSocketData();
2510
2511 HttpRequestInfo request;
2512 request.url = url;
2513
2514 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
2515 TestCompletionCallback callback;
2516 int rv = trans.Start(&request, callback.callback(), net_log_.bound());
2517 EXPECT_EQ(ERR_CONNECTION_REFUSED, callback.GetResult(rv));
2518
2519 EXPECT_TRUE(AllDataConsumed());
2520}
2521
2522// First request opens QUIC session to alternative service. Second request
2523// pools to it, because destination matches and certificate is valid, even
2524// though QuicServerId is different.
2525TEST_P(QuicNetworkTransactionWithDestinationTest, PoolIfCertificateValid) {
2526 origin1_ = "mail.example.org";
2527 origin2_ = "news.example.org";
2528
2529 SetAlternativeService(origin1_);
2530 SetAlternativeService(origin2_);
2531
2532 scoped_refptr<X509Certificate> cert(
2533 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2534 bool unused;
2535 ASSERT_TRUE(cert->VerifyNameMatch(origin1_, &unused));
2536 ASSERT_TRUE(cert->VerifyNameMatch(origin2_, &unused));
2537 ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname, &unused));
2538
2539 ProofVerifyDetailsChromium verify_details;
2540 verify_details.cert_verify_result.verified_cert = cert;
2541 verify_details.cert_verify_result.is_issued_by_known_root = true;
2542 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2543
alyssar2adf3ac2016-05-03 17:12:582544 QuicTestPacketMaker client_maker1(version_, 0, clock_, origin1_,
2545 Perspective::IS_CLIENT);
2546 QuicTestPacketMaker server_maker1(version_, 0, clock_, origin1_,
2547 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452548
2549 QuicStreamOffset request_header_offset(0);
2550 QuicStreamOffset response_header_offset(0);
2551
2552 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582553 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2554 1, kClientDataStreamId1, true, &request_header_offset, &client_maker1));
2555 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2556 1, kClientDataStreamId1, &response_header_offset, &server_maker1));
2557 mock_quic_data.AddRead(
2558 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker1));
2559 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 2, 1, 1, &client_maker1));
bnc359ed2a2016-04-29 20:43:452560
alyssar2adf3ac2016-05-03 17:12:582561 QuicTestPacketMaker client_maker2(version_, 0, clock_, origin2_,
2562 Perspective::IS_CLIENT);
2563 QuicTestPacketMaker server_maker2(version_, 0, clock_, origin2_,
2564 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452565
alyssar2adf3ac2016-05-03 17:12:582566 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2567 3, kClientDataStreamId2, false, &request_header_offset, &client_maker2));
2568 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2569 3, kClientDataStreamId2, &response_header_offset, &server_maker2));
2570 mock_quic_data.AddRead(
2571 ConstructServerDataPacket(4, kClientDataStreamId2, &server_maker2));
2572 mock_quic_data.AddWrite(ConstructClientAckPacket(4, 4, 3, 1, &client_maker2));
bnc359ed2a2016-04-29 20:43:452573 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2574 mock_quic_data.AddRead(ASYNC, 0); // EOF
2575
2576 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2577
2578 AddHangingSocketData();
2579 AddHangingSocketData();
2580
2581 SendRequestAndExpectQuicResponse(origin1_);
2582 SendRequestAndExpectQuicResponse(origin2_);
2583
2584 EXPECT_TRUE(AllDataConsumed());
2585}
2586
2587// First request opens QUIC session to alternative service. Second request does
2588// not pool to it, even though destination matches, because certificate is not
2589// valid. Instead, a new QUIC session is opened to the same destination with a
2590// different QuicServerId.
2591TEST_P(QuicNetworkTransactionWithDestinationTest,
2592 DoNotPoolIfCertificateInvalid) {
2593 origin1_ = "news.example.org";
2594 origin2_ = "mail.example.com";
2595
2596 SetAlternativeService(origin1_);
2597 SetAlternativeService(origin2_);
2598
2599 scoped_refptr<X509Certificate> cert1(
2600 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2601 bool unused;
2602 ASSERT_TRUE(cert1->VerifyNameMatch(origin1_, &unused));
2603 ASSERT_FALSE(cert1->VerifyNameMatch(origin2_, &unused));
2604 ASSERT_FALSE(cert1->VerifyNameMatch(kDifferentHostname, &unused));
2605
2606 scoped_refptr<X509Certificate> cert2(
2607 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
2608 ASSERT_TRUE(cert2->VerifyNameMatch(origin2_, &unused));
2609 ASSERT_FALSE(cert2->VerifyNameMatch(kDifferentHostname, &unused));
2610
2611 ProofVerifyDetailsChromium verify_details1;
2612 verify_details1.cert_verify_result.verified_cert = cert1;
2613 verify_details1.cert_verify_result.is_issued_by_known_root = true;
2614 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
2615
2616 ProofVerifyDetailsChromium verify_details2;
2617 verify_details2.cert_verify_result.verified_cert = cert2;
2618 verify_details2.cert_verify_result.is_issued_by_known_root = true;
2619 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
2620
alyssar2adf3ac2016-05-03 17:12:582621 QuicTestPacketMaker client_maker1(version_, 0, clock_, origin1_,
2622 Perspective::IS_CLIENT);
2623 QuicTestPacketMaker server_maker1(version_, 0, clock_, origin1_,
2624 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452625
2626 MockQuicData mock_quic_data1;
alyssar2adf3ac2016-05-03 17:12:582627 mock_quic_data1.AddWrite(ConstructClientRequestHeadersPacket(
2628 1, kClientDataStreamId1, true, &client_maker1));
2629 mock_quic_data1.AddRead(ConstructServerResponseHeadersPacket(
2630 1, kClientDataStreamId1, &server_maker1));
2631 mock_quic_data1.AddRead(
2632 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker1));
bnc359ed2a2016-04-29 20:43:452633 mock_quic_data1.AddWrite(
alyssar2adf3ac2016-05-03 17:12:582634 ConstructClientAckPacket(2, 2, 1, 1, &client_maker1));
bnc359ed2a2016-04-29 20:43:452635 mock_quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2636 mock_quic_data1.AddRead(ASYNC, 0); // EOF
2637
2638 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
2639
2640 AddHangingSocketData();
2641
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
2647 MockQuicData mock_quic_data2;
alyssar2adf3ac2016-05-03 17:12:582648 mock_quic_data2.AddWrite(ConstructClientRequestHeadersPacket(
2649 1, kClientDataStreamId1, true, &client_maker2));
2650 mock_quic_data2.AddRead(ConstructServerResponseHeadersPacket(
2651 1, kClientDataStreamId1, &server_maker2));
2652 mock_quic_data2.AddRead(
2653 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker2));
bnc359ed2a2016-04-29 20:43:452654 mock_quic_data2.AddWrite(
alyssar2adf3ac2016-05-03 17:12:582655 ConstructClientAckPacket(2, 2, 1, 1, &client_maker2));
bnc359ed2a2016-04-29 20:43:452656 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2657 mock_quic_data2.AddRead(ASYNC, 0); // EOF
2658
2659 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
2660
2661 AddHangingSocketData();
2662
2663 SendRequestAndExpectQuicResponse(origin1_);
2664 SendRequestAndExpectQuicResponse(origin2_);
2665
2666 EXPECT_TRUE(AllDataConsumed());
2667}
2668
[email protected]61a527782013-02-21 03:58:002669} // namespace test
2670} // namespace net