blob: 998a8f9839f0d19df7e42ebabef9a44e6328a26b [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
rch3f4b8452016-02-23 16:59:32270 params_.enable_alternative_service_with_different_host = true;
bnce3dd56f2016-06-01 10:37:11271 params_.enable_alternative_service_for_insecure_origins = true;
rch3f4b8452016-02-23 16:59:32272
rchf114d982015-10-21 01:34:56273 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29274 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
rchf114d982015-10-21 01:34:56275 verify_details_.cert_verify_result.verified_cert = cert;
276 verify_details_.cert_verify_result.is_issued_by_known_root = true;
277 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
[email protected]1c04f9522013-02-21 20:32:43278 }
[email protected]61a527782013-02-21 03:58:00279
dcheng67be2b1f2014-10-27 21:47:29280 void SetUp() override {
[email protected]61a527782013-02-21 03:58:00281 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:55282 base::RunLoop().RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00283 }
284
dcheng67be2b1f2014-10-27 21:47:29285 void TearDown() override {
[email protected]61a527782013-02-21 03:58:00286 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
287 // Empty the current queue.
fdoray92e35a72016-06-10 15:54:55288 base::RunLoop().RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00289 PlatformTest::TearDown();
290 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:55291 base::RunLoop().RunUntilIdle();
bnc525e175a2016-06-20 12:36:40292 session_.reset();
[email protected]61a527782013-02-21 03:58:00293 }
294
alyssar2adf3ac2016-05-03 17:12:58295 std::unique_ptr<QuicEncryptedPacket> ConstructClientConnectionClosePacket(
rtennetia004d332015-08-28 06:44:57296 QuicPacketNumber num) {
alyssar2adf3ac2016-05-03 17:12:58297 return client_maker_.MakeConnectionClosePacket(num);
[email protected]3316d422013-05-03 21:45:30298 }
299
alyssar2adf3ac2016-05-03 17:12:58300 std::unique_ptr<QuicEncryptedPacket> ConstructServerConnectionClosePacket(
301 QuicPacketNumber num) {
302 return server_maker_.MakeConnectionClosePacket(num);
303 }
304
305 std::unique_ptr<QuicEncryptedPacket> ConstructServerGoAwayPacket(
zhongyi6b5a3892016-03-12 04:46:20306 QuicPacketNumber num,
307 QuicErrorCode error_code,
308 std::string reason_phrase) {
alyssar2adf3ac2016-05-03 17:12:58309 return server_maker_.MakeGoAwayPacket(num, error_code, reason_phrase);
zhongyi6b5a3892016-03-12 04:46:20310 }
311
alyssar2adf3ac2016-05-03 17:12:58312 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
rtennetia004d332015-08-28 06:44:57313 QuicPacketNumber largest_received,
314 QuicPacketNumber least_unacked) {
alyssar2adf3ac2016-05-03 17:12:58315 return client_maker_.MakeAckPacket(2, largest_received, least_unacked,
316 least_unacked, true);
zhongyi32569c62016-01-08 02:54:30317 }
318
alyssar2adf3ac2016-05-03 17:12:58319 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckAndRstPacket(
zhongyi6b5a3892016-03-12 04:46:20320 QuicPacketNumber num,
321 QuicStreamId stream_id,
322 QuicRstStreamErrorCode error_code,
323 QuicPacketNumber largest_received,
324 QuicPacketNumber ack_least_unacked,
325 QuicPacketNumber stop_least_unacked) {
alyssar2adf3ac2016-05-03 17:12:58326 return client_maker_.MakeAckAndRstPacket(
327 num, false, stream_id, error_code, largest_received, ack_least_unacked,
328 stop_least_unacked, true);
zhongyi6b5a3892016-03-12 04:46:20329 }
330
alyssar2adf3ac2016-05-03 17:12:58331 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
zhongyi32569c62016-01-08 02:54:30332 QuicPacketNumber largest_received,
333 QuicPacketNumber least_unacked,
334 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:58335 return client_maker_.MakeAckPacket(2, largest_received, least_unacked,
336 least_unacked, true);
zhongyi32569c62016-01-08 02:54:30337 }
338
alyssar2adf3ac2016-05-03 17:12:58339 std::unique_ptr<QuicEncryptedPacket>
340 ConstructClientAckAndConnectionClosePacket(
zhongyi32569c62016-01-08 02:54:30341 QuicPacketNumber packet_number,
342 QuicPacketNumber largest_received,
343 QuicPacketNumber ack_least_unacked,
344 QuicPacketNumber stop_least_unacked) {
alyssar2adf3ac2016-05-03 17:12:58345 return client_maker_.MakeAckPacket(packet_number, largest_received,
346 ack_least_unacked, stop_least_unacked,
347 true);
[email protected]1e960032013-12-20 19:00:20348 }
[email protected]61a527782013-02-21 03:58:00349
alyssar2adf3ac2016-05-03 17:12:58350 std::unique_ptr<QuicEncryptedPacket>
351 ConstructClientAckAndConnectionClosePacket(
zhongyica364fbb2015-12-12 03:39:12352 QuicPacketNumber num,
353 QuicTime::Delta delta_time_largest_observed,
354 QuicPacketNumber largest_received,
355 QuicPacketNumber least_unacked,
356 QuicErrorCode quic_error,
bnc912a04b2016-04-20 14:19:50357 const std::string& quic_error_details) {
alyssar2adf3ac2016-05-03 17:12:58358 return client_maker_.MakeAckAndConnectionClosePacket(
zhongyica364fbb2015-12-12 03:39:12359 num, false, delta_time_largest_observed, largest_received,
360 least_unacked, quic_error, quic_error_details);
361 }
362
alyssar2adf3ac2016-05-03 17:12:58363 std::unique_ptr<QuicEncryptedPacket> ConstructServerRstPacket(
zhongyica364fbb2015-12-12 03:39:12364 QuicPacketNumber num,
365 bool include_version,
366 QuicStreamId stream_id,
367 QuicRstStreamErrorCode error_code) {
alyssar2adf3ac2016-05-03 17:12:58368 return server_maker_.MakeRstPacket(num, include_version, stream_id,
369 error_code);
zhongyica364fbb2015-12-12 03:39:12370 }
371
zhongyi32569c62016-01-08 02:54:30372 // Uses default QuicTestPacketMaker.
[email protected]1e960032013-12-20 19:00:20373 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
374 const std::string& scheme,
375 const std::string& path) {
alyssar2adf3ac2016-05-03 17:12:58376 return GetRequestHeaders(method, scheme, path, &client_maker_);
zhongyi32569c62016-01-08 02:54:30377 }
378
379 // Uses customized QuicTestPacketMaker.
380 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
381 const std::string& scheme,
382 const std::string& path,
bnc912a04b2016-04-20 14:19:50383 QuicTestPacketMaker* maker) {
384 return maker->GetRequestHeaders(method, scheme, path);
[email protected]61a527782013-02-21 03:58:00385 }
386
[email protected]1e960032013-12-20 19:00:20387 SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
alyssar2adf3ac2016-05-03 17:12:58388 return server_maker_.GetResponseHeaders(status);
[email protected]61a527782013-02-21 03:58:00389 }
390
zhongyi32569c62016-01-08 02:54:30391 // Appends alt_svc headers in the response headers.
392 SpdyHeaderBlock GetResponseHeaders(const std::string& status,
393 const std::string& alt_svc) {
alyssar2adf3ac2016-05-03 17:12:58394 return server_maker_.GetResponseHeaders(status, alt_svc);
zhongyi32569c62016-01-08 02:54:30395 }
396
alyssar2adf3ac2016-05-03 17:12:58397 std::unique_ptr<QuicEncryptedPacket> ConstructServerDataPacket(
rtennetia004d332015-08-28 06:44:57398 QuicPacketNumber packet_number,
[email protected]98b20ce2013-05-10 05:55:26399 QuicStreamId stream_id,
[email protected]e8ff26842013-03-22 21:02:05400 bool should_include_version,
[email protected]61a527782013-02-21 03:58:00401 bool fin,
402 QuicStreamOffset offset,
403 base::StringPiece data) {
alyssar2adf3ac2016-05-03 17:12:58404 return server_maker_.MakeDataPacket(
405 packet_number, stream_id, should_include_version, fin, offset, data);
[email protected]61a527782013-02-21 03:58:00406 }
407
alyssar2adf3ac2016-05-03 17:12:58408 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
rtennetia004d332015-08-28 06:44:57409 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20410 QuicStreamId stream_id,
411 bool should_include_version,
412 bool fin,
bnc086b39e12016-06-24 13:05:26413 SpdyHeaderBlock headers,
zhongyi32569c62016-01-08 02:54:30414 QuicStreamOffset* offset) {
ianswett0888cff2015-11-24 17:42:16415 SpdyPriority priority =
rtennetif4bdb542015-01-21 14:33:05416 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
alyssar2adf3ac2016-05-03 17:12:58417 return client_maker_.MakeRequestHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30418 packet_number, stream_id, should_include_version, fin, priority,
419 headers, offset);
420 }
421
alyssar2adf3ac2016-05-03 17:12:58422 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30423 QuicPacketNumber packet_number,
424 QuicStreamId stream_id,
425 bool should_include_version,
426 bool fin,
bnc086b39e12016-06-24 13:05:26427 SpdyHeaderBlock headers,
zhongyi32569c62016-01-08 02:54:30428 QuicStreamOffset* offset,
429 QuicTestPacketMaker* maker) {
430 SpdyPriority priority =
431 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
alyssar2adf3ac2016-05-03 17:12:58432 return client_maker_.MakeRequestHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30433 packet_number, stream_id, should_include_version, fin, priority,
434 headers, offset);
435 }
436
alyssar2adf3ac2016-05-03 17:12:58437 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30438 QuicPacketNumber packet_number,
439 QuicStreamId stream_id,
440 bool should_include_version,
441 bool fin,
bnc086b39e12016-06-24 13:05:26442 SpdyHeaderBlock headers) {
alyssar2adf3ac2016-05-03 17:12:58443 return ConstructClientRequestHeadersPacket(
bnc086b39e12016-06-24 13:05:26444 packet_number, stream_id, should_include_version, fin,
445 std::move(headers), nullptr, &client_maker_);
zhongyi32569c62016-01-08 02:54:30446 }
alyssar2adf3ac2016-05-03 17:12:58447 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30448 QuicPacketNumber packet_number,
449 QuicStreamId stream_id,
450 bool should_include_version,
451 bool fin,
bnc086b39e12016-06-24 13:05:26452 SpdyHeaderBlock headers,
zhongyi32569c62016-01-08 02:54:30453 QuicTestPacketMaker* maker) {
bnc086b39e12016-06-24 13:05:26454 return ConstructClientRequestHeadersPacket(
455 packet_number, stream_id, should_include_version, fin,
456 std::move(headers), nullptr, maker);
[email protected]61a527782013-02-21 03:58:00457 }
458
alyssar2adf3ac2016-05-03 17:12:58459 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
rtennetia004d332015-08-28 06:44:57460 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20461 QuicStreamId stream_id,
462 bool should_include_version,
463 bool fin,
bnc086b39e12016-06-24 13:05:26464 SpdyHeaderBlock headers) {
alyssar2adf3ac2016-05-03 17:12:58465 return ConstructServerResponseHeadersPacket(
bnc086b39e12016-06-24 13:05:26466 packet_number, stream_id, should_include_version, fin,
467 std::move(headers), nullptr, &server_maker_);
zhongyi32569c62016-01-08 02:54:30468 }
469
alyssar2adf3ac2016-05-03 17:12:58470 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30471 QuicPacketNumber packet_number,
472 QuicStreamId stream_id,
473 bool should_include_version,
474 bool fin,
bnc086b39e12016-06-24 13:05:26475 SpdyHeaderBlock headers,
zhongyi32569c62016-01-08 02:54:30476 QuicTestPacketMaker* maker) {
bnc086b39e12016-06-24 13:05:26477 return ConstructServerResponseHeadersPacket(
478 packet_number, stream_id, should_include_version, fin,
479 std::move(headers), nullptr, maker);
zhongyi32569c62016-01-08 02:54:30480 }
481
alyssar2adf3ac2016-05-03 17:12:58482 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30483 QuicPacketNumber packet_number,
484 QuicStreamId stream_id,
485 bool should_include_version,
486 bool fin,
bnc086b39e12016-06-24 13:05:26487 SpdyHeaderBlock headers,
zhongyi32569c62016-01-08 02:54:30488 QuicStreamOffset* offset) {
alyssar2adf3ac2016-05-03 17:12:58489 return server_maker_.MakeResponseHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30490 packet_number, stream_id, should_include_version, fin, headers, offset);
491 }
492
alyssar2adf3ac2016-05-03 17:12:58493 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30494 QuicPacketNumber packet_number,
495 QuicStreamId stream_id,
496 bool should_include_version,
497 bool fin,
bnc086b39e12016-06-24 13:05:26498 SpdyHeaderBlock headers,
zhongyi32569c62016-01-08 02:54:30499 QuicStreamOffset* offset,
500 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:58501 return server_maker_.MakeResponseHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30502 packet_number, stream_id, should_include_version, fin, headers, offset);
[email protected]61a527782013-02-21 03:58:00503 }
504
bnc912a04b2016-04-20 14:19:50505 void CreateSession() {
[email protected]4dca587c2013-03-07 16:54:47506 params_.enable_quic = true;
507 params_.quic_clock = clock_;
508 params_.quic_random = &random_generator_;
bnc912a04b2016-04-20 14:19:50509 params_.client_socket_factory = &socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05510 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43511 params_.host_resolver = &host_resolver_;
512 params_.cert_verifier = &cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11513 params_.transport_security_state = &transport_security_state_;
rtenneti052774e2015-11-24 21:00:12514 params_.cert_transparency_verifier = cert_transparency_verifier_.get();
rsleevid6de8302016-06-21 01:33:20515 params_.ct_policy_enforcer = &ct_policy_enforcer_;
tbansalfdf5665b2015-09-21 22:46:40516 params_.socket_performance_watcher_factory =
tbansal0f56a39a2016-04-07 22:03:38517 &test_socket_performance_watcher_factory_;
[email protected]1c04f9522013-02-21 20:32:43518 params_.proxy_service = proxy_service_.get();
519 params_.ssl_config_service = ssl_config_service_.get();
520 params_.http_auth_handler_factory = auth_handler_factory_.get();
bnc525e175a2016-06-20 12:36:40521 params_.http_server_properties = &http_server_properties_;
[email protected]1e960032013-12-20 19:00:20522 params_.quic_supported_versions = SupportedVersions(GetParam());
rch74da0e1a2016-01-14 02:49:32523 for (const char* host :
rch9ae5b3b2016-02-11 00:36:29524 {kDefaultServerHostName, "www.example.org", "news.example.org",
525 "bar.example.org", "foo.example.org", "invalid.example.org",
526 "mail.example.com"}) {
rch74da0e1a2016-01-14 02:49:32527 params_.quic_host_whitelist.insert(host);
528 }
[email protected]61a527782013-02-21 03:58:00529
mmenkee65e7af2015-10-13 17:16:42530 session_.reset(new HttpNetworkSession(params_));
[email protected]11c05872013-08-20 02:04:12531 session_->quic_stream_factory()->set_require_confirmation(false);
rch185ebee2015-07-14 23:56:22532 ASSERT_EQ(params_.quic_socket_receive_buffer_size,
533 session_->quic_stream_factory()->socket_receive_buffer_size());
[email protected]61a527782013-02-21 03:58:00534 }
535
danakjad1777e2016-04-16 00:56:42536 void CheckWasQuicResponse(
537 const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19538 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42539 ASSERT_TRUE(response != nullptr);
540 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19541 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
542 EXPECT_TRUE(response->was_fetched_via_spdy);
543 EXPECT_TRUE(response->was_npn_negotiated);
544 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
545 response->connection_info);
546 }
547
danakjad1777e2016-04-16 00:56:42548 void CheckResponsePort(const std::unique_ptr<HttpNetworkTransaction>& trans,
Avi Drissman13fc8932015-12-20 04:40:46549 uint16_t port) {
bnc62a44f022015-04-02 15:59:41550 const HttpResponseInfo* response = trans->GetResponseInfo();
551 ASSERT_TRUE(response != nullptr);
552 EXPECT_EQ(port, response->socket_address.port());
553 }
554
danakjad1777e2016-04-16 00:56:42555 void CheckWasHttpResponse(
556 const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19557 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42558 ASSERT_TRUE(response != nullptr);
559 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19560 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
561 EXPECT_FALSE(response->was_fetched_via_spdy);
562 EXPECT_FALSE(response->was_npn_negotiated);
563 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1,
564 response->connection_info);
565 }
566
danakjad1777e2016-04-16 00:56:42567 void CheckResponseData(const std::unique_ptr<HttpNetworkTransaction>& trans,
[email protected]aa9b14d2013-05-10 23:45:19568 const std::string& expected) {
569 std::string response_data;
bncffc2fdf2015-05-14 18:29:49570 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
[email protected]aa9b14d2013-05-10 23:45:19571 EXPECT_EQ(expected, response_data);
572 }
573
danakjad1777e2016-04-16 00:56:42574 void RunTransaction(const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19575 TestCompletionCallback callback;
576 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
577 EXPECT_EQ(ERR_IO_PENDING, rv);
578 EXPECT_EQ(OK, callback.WaitForResult());
579 }
580
581 void SendRequestAndExpectHttpResponse(const std::string& expected) {
danakjad1777e2016-04-16 00:56:42582 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50583 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
bncffc2fdf2015-05-14 18:29:49584 RunTransaction(trans);
[email protected]aa9b14d2013-05-10 23:45:19585 CheckWasHttpResponse(trans);
bncffc2fdf2015-05-14 18:29:49586 CheckResponseData(trans, expected);
[email protected]aa9b14d2013-05-10 23:45:19587 }
588
589 void SendRequestAndExpectQuicResponse(const std::string& expected) {
rchf114d982015-10-21 01:34:56590 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, 443);
tbansal7cec3812015-02-05 21:25:12591 }
592
bnc62a44f022015-04-02 15:59:41593 void SendRequestAndExpectQuicResponseFromProxyOnPort(
594 const std::string& expected,
Avi Drissman13fc8932015-12-20 04:40:46595 uint16_t port) {
bnc62a44f022015-04-02 15:59:41596 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port);
[email protected]aa9b14d2013-05-10 23:45:19597 }
598
599 void AddQuicAlternateProtocolMapping(
600 MockCryptoClientStream::HandshakeMode handshake_mode) {
601 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
zhongyi3d4a55e72016-04-22 20:36:46602 url::SchemeHostPort server(request_.url);
603 AlternativeService alternative_service(QUIC, server.host(), 443);
bnc7dc7e1b42015-07-28 14:43:12604 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
zhongyi3d4a55e72016-04-22 20:36:46605 http_server_properties_.SetAlternativeService(server, alternative_service,
606 expiration);
[email protected]aa9b14d2013-05-10 23:45:19607 }
608
rchbe69cb902016-02-11 01:10:48609 void AddQuicRemoteAlternativeServiceMapping(
610 MockCryptoClientStream::HandshakeMode handshake_mode,
611 const HostPortPair& alternative) {
612 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
zhongyi3d4a55e72016-04-22 20:36:46613 url::SchemeHostPort server(request_.url);
rchbe69cb902016-02-11 01:10:48614 AlternativeService alternative_service(QUIC, alternative.host(),
615 alternative.port());
616 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
zhongyi3d4a55e72016-04-22 20:36:46617 http_server_properties_.SetAlternativeService(server, alternative_service,
618 expiration);
rchbe69cb902016-02-11 01:10:48619 }
620
[email protected]aa9b14d2013-05-10 23:45:19621 void ExpectBrokenAlternateProtocolMapping() {
zhongyi3d4a55e72016-04-22 20:36:46622 const url::SchemeHostPort server(request_.url);
bncd9b132e2015-07-08 05:16:10623 const AlternativeServiceVector alternative_service_vector =
zhongyi3d4a55e72016-04-22 20:36:46624 http_server_properties_.GetAlternativeServices(server);
bncd9b132e2015-07-08 05:16:10625 EXPECT_EQ(1u, alternative_service_vector.size());
bnc6be245c12015-05-15 11:24:07626 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken(
bncd9b132e2015-07-08 05:16:10627 alternative_service_vector[0]));
[email protected]aa9b14d2013-05-10 23:45:19628 }
629
[email protected]4d590c9c2014-05-02 05:14:33630 void ExpectQuicAlternateProtocolMapping() {
zhongyi3d4a55e72016-04-22 20:36:46631 const url::SchemeHostPort server(request_.url);
bncd9b132e2015-07-08 05:16:10632 const AlternativeServiceVector alternative_service_vector =
zhongyi3d4a55e72016-04-22 20:36:46633 http_server_properties_.GetAlternativeServices(server);
bncd9b132e2015-07-08 05:16:10634 EXPECT_EQ(1u, alternative_service_vector.size());
635 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
[email protected]4d590c9c2014-05-02 05:14:33636 }
637
[email protected]aa9b14d2013-05-10 23:45:19638 void AddHangingNonAlternateProtocolSocketData() {
danakjad1777e2016-04-16 00:56:42639 std::unique_ptr<StaticSocketDataProvider> hanging_data;
zhongyi32569c62016-01-08 02:54:30640 hanging_data.reset(new StaticSocketDataProvider());
[email protected]dda75ab2013-06-22 22:43:30641 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
zhongyi32569c62016-01-08 02:54:30642 hanging_data->set_connect_data(hanging_connect);
643 hanging_data_.push_back(std::move(hanging_data));
644 socket_factory_.AddSocketDataProvider(hanging_data_.back().get());
rchf114d982015-10-21 01:34:56645 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]aa9b14d2013-05-10 23:45:19646 }
647
rtenneti4b06ae72014-08-26 03:43:43648 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
alyssar2adf3ac2016-05-03 17:12:58649 QuicTestPacketMaker client_maker_;
650 QuicTestPacketMaker server_maker_;
danakjad1777e2016-04-16 00:56:42651 std::unique_ptr<HttpNetworkSession> session_;
[email protected]61a527782013-02-21 03:58:00652 MockClientSocketFactory socket_factory_;
rchf114d982015-10-21 01:34:56653 ProofVerifyDetailsChromium verify_details_;
[email protected]e8ff26842013-03-22 21:02:05654 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43655 MockHostResolver host_resolver_;
656 MockCertVerifier cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11657 TransportSecurityState transport_security_state_;
danakjad1777e2016-04-16 00:56:42658 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
rsleevid6de8302016-06-21 01:33:20659 CTPolicyEnforcer ct_policy_enforcer_;
tbansal0f56a39a2016-04-07 22:03:38660 TestSocketPerformanceWatcherFactory test_socket_performance_watcher_factory_;
[email protected]1c04f9522013-02-21 20:32:43661 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
danakjad1777e2016-04-16 00:56:42662 std::unique_ptr<ProxyService> proxy_service_;
663 std::unique_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
[email protected]61a527782013-02-21 03:58:00664 MockRandom random_generator_;
bnc6be245c12015-05-15 11:24:07665 HttpServerPropertiesImpl http_server_properties_;
[email protected]61a527782013-02-21 03:58:00666 HttpNetworkSession::Params params_;
[email protected]aa9b14d2013-05-10 23:45:19667 HttpRequestInfo request_;
vishal.b62985ca92015-04-17 08:45:51668 BoundTestNetLog net_log_;
danakjad1777e2016-04-16 00:56:42669 std::vector<std::unique_ptr<StaticSocketDataProvider>> hanging_data_;
rchf114d982015-10-21 01:34:56670 SSLSocketDataProvider ssl_data_;
tbansal7cec3812015-02-05 21:25:12671
672 private:
673 void SendRequestAndExpectQuicResponseMaybeFromProxy(
674 const std::string& expected,
bnc62a44f022015-04-02 15:59:41675 bool used_proxy,
Avi Drissman13fc8932015-12-20 04:40:46676 uint16_t port) {
danakjad1777e2016-04-16 00:56:42677 std::unique_ptr<HttpNetworkTransaction> trans(
tbansal7cec3812015-02-05 21:25:12678 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
ryansturm49a8cb12016-06-15 16:51:09679 HeadersHandler headers_handler;
680 trans->SetBeforeHeadersSentCallback(
681 base::Bind(&HeadersHandler::OnBeforeHeadersSent,
682 base::Unretained(&headers_handler)));
bncffc2fdf2015-05-14 18:29:49683 RunTransaction(trans);
tbansal7cec3812015-02-05 21:25:12684 CheckWasQuicResponse(trans);
bnc62a44f022015-04-02 15:59:41685 CheckResponsePort(trans, port);
bncffc2fdf2015-05-14 18:29:49686 CheckResponseData(trans, expected);
ryansturm49a8cb12016-06-15 16:51:09687 EXPECT_EQ(used_proxy, headers_handler.was_proxied());
tbansal7cec3812015-02-05 21:25:12688 }
[email protected]61a527782013-02-21 03:58:00689};
690
rjshaded5ced072015-12-18 19:26:02691INSTANTIATE_TEST_CASE_P(Version,
692 QuicNetworkTransactionTest,
[email protected]1e960032013-12-20 19:00:20693 ::testing::ValuesIn(QuicSupportedVersions()));
694
695TEST_P(QuicNetworkTransactionTest, ForceQuic) {
rtenneti8a2f4632016-03-21 20:26:57696 params_.origins_to_force_quic_on.insert(
697 HostPortPair::FromString("mail.example.org:443"));
[email protected]4dca587c2013-03-07 16:54:47698
[email protected]1e960032013-12-20 19:00:20699 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58700 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
701 1, kClientDataStreamId1, true, true,
702 GetRequestHeaders("GET", "https", "/")));
703 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:02704 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58705 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
706 false, true, 0, "hello!"));
707 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:59708 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
[email protected]4dca587c2013-03-07 16:54:47709
rcha5399e02015-04-21 19:32:04710 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4dca587c2013-03-07 16:54:47711
rtennetib8e80fb2016-05-16 00:12:09712 // The non-alternate protocol job needs to hang in order to guarantee that
713 // the alternate-protocol job will "win".
714 AddHangingNonAlternateProtocolSocketData();
715
rch3f4b8452016-02-23 16:59:32716 params_.enable_alternative_service_with_different_host = false;
[email protected]4dca587c2013-03-07 16:54:47717 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47718
tbansal0f56a39a2016-04-07 22:03:38719 EXPECT_FALSE(
720 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]aa9b14d2013-05-10 23:45:19721 SendRequestAndExpectQuicResponse("hello!");
tbansal0f56a39a2016-04-07 22:03:38722 EXPECT_TRUE(
723 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]4dca587c2013-03-07 16:54:47724
[email protected]98b20ce2013-05-10 05:55:26725 // Check that the NetLog was filled reasonably.
mmenke43758e62015-05-04 21:09:46726 TestNetLogEntry::List entries;
[email protected]aa9b14d2013-05-10 23:45:19727 net_log_.GetEntries(&entries);
[email protected]98b20ce2013-05-10 05:55:26728 EXPECT_LT(0u, entries.size());
729
730 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29731 int pos = ExpectLogContainsSomewhere(
732 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
733 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26734 EXPECT_LT(0, pos);
735
rchfd527212015-08-25 00:41:26736 // ... and also a TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29737 pos = ExpectLogContainsSomewhere(
rchfd527212015-08-25 00:41:26738 entries, 0,
739 NetLog::TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED,
ttuttle859dc7a2015-04-23 19:42:29740 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26741 EXPECT_LT(0, pos);
742
rtennetia004d332015-08-28 06:44:57743 std::string packet_number;
744 ASSERT_TRUE(entries[pos].GetStringValue("packet_number", &packet_number));
745 EXPECT_EQ("1", packet_number);
[email protected]98b20ce2013-05-10 05:55:26746
rchfd527212015-08-25 00:41:26747 // ... and also a TYPE_QUIC_SESSION_PACKET_AUTHENTICATED.
748 pos = ExpectLogContainsSomewhere(
749 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_AUTHENTICATED,
750 NetLog::PHASE_NONE);
751 EXPECT_LT(0, pos);
752
[email protected]98b20ce2013-05-10 05:55:26753 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29754 pos = ExpectLogContainsSomewhere(
755 entries, 0, NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
756 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26757 EXPECT_LT(0, pos);
758
759 int log_stream_id;
760 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
[email protected]1e960032013-12-20 19:00:20761 EXPECT_EQ(3, log_stream_id);
[email protected]4dca587c2013-03-07 16:54:47762}
763
[email protected]cf3e3cd62014-02-05 16:16:16764TEST_P(QuicNetworkTransactionTest, QuicProxy) {
tbansal9bf26672016-05-11 18:32:45765 params_.enable_quic = true;
rchf114d982015-10-21 01:34:56766 proxy_service_ =
rch9ae5b3b2016-02-11 00:36:29767 ProxyService::CreateFixedFromPacResult("QUIC mail.example.org:70");
[email protected]cf3e3cd62014-02-05 16:16:16768
[email protected]cf3e3cd62014-02-05 16:16:16769 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58770 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
771 1, kClientDataStreamId1, true, true,
772 GetRequestHeaders("GET", "http", "/")));
773 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:02774 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58775 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
776 false, true, 0, "hello!"));
777 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50778 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59779 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]cf3e3cd62014-02-05 16:16:16780
rcha5399e02015-04-21 19:32:04781 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cf3e3cd62014-02-05 16:16:16782
tbansal0f56a39a2016-04-07 22:03:38783 EXPECT_FALSE(
784 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16785 // There is no need to set up an alternate protocol job, because
786 // no attempt will be made to speak to the proxy over TCP.
787
rch9ae5b3b2016-02-11 00:36:29788 request_.url = GURL("http://mail.example.org/");
rch3f4b8452016-02-23 16:59:32789 params_.enable_alternative_service_with_different_host = false;
[email protected]cf3e3cd62014-02-05 16:16:16790 CreateSession();
791
bnc62a44f022015-04-02 15:59:41792 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
tbansal0f56a39a2016-04-07 22:03:38793 EXPECT_TRUE(
794 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16795}
796
bnc313ba9c2015-06-11 15:42:31797// Regression test for https://crbug.com/492458. Test that for an HTTP
798// connection through a QUIC proxy, the certificate exhibited by the proxy is
799// checked against the proxy hostname, not the origin hostname.
800TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) {
rch9ae5b3b2016-02-11 00:36:29801 const std::string origin_host = "mail.example.com";
bnc313ba9c2015-06-11 15:42:31802 const std::string proxy_host = "www.example.org";
803
tbansal9bf26672016-05-11 18:32:45804 params_.enable_quic = true;
rdsmith82957ad2015-09-16 19:42:03805 proxy_service_ =
806 ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70");
bnc313ba9c2015-06-11 15:42:31807
alyssar2adf3ac2016-05-03 17:12:58808 client_maker_.set_hostname(origin_host);
bnc313ba9c2015-06-11 15:42:31809 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58810 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
811 1, kClientDataStreamId1, true, true,
812 GetRequestHeaders("GET", "http", "/")));
813 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc313ba9c2015-06-11 15:42:31814 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58815 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
816 false, true, 0, "hello!"));
817 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50818 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59819 mock_quic_data.AddRead(ASYNC, 0);
bnc313ba9c2015-06-11 15:42:31820 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
821
822 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29823 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bnc313ba9c2015-06-11 15:42:31824 ASSERT_TRUE(cert.get());
825 // This certificate is valid for the proxy, but not for the origin.
826 bool common_name_fallback_used;
827 EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used));
828 EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used));
829 ProofVerifyDetailsChromium verify_details;
830 verify_details.cert_verify_result.verified_cert = cert;
831 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rchf114d982015-10-21 01:34:56832 ProofVerifyDetailsChromium verify_details2;
833 verify_details2.cert_verify_result.verified_cert = cert;
834 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
bnc313ba9c2015-06-11 15:42:31835
836 request_.url = GURL("http://" + origin_host);
rtennetib8e80fb2016-05-16 00:12:09837 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32838 CreateSession();
bnc313ba9c2015-06-11 15:42:31839 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
840 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
841}
842
rchbe69cb902016-02-11 01:10:48843TEST_P(QuicNetworkTransactionTest, AlternativeServicesDifferentHost) {
844 params_.enable_alternative_service_with_different_host = true;
845 HostPortPair origin("www.example.org", 443);
846 HostPortPair alternative("mail.example.org", 443);
847
848 base::FilePath certs_dir = GetTestCertsDirectory();
849 scoped_refptr<X509Certificate> cert(
850 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
851 ASSERT_TRUE(cert.get());
852 // TODO(rch): the connection should be "to" the origin, so if the cert is
853 // valid for the origin but not the alternative, that should work too.
854 bool common_name_fallback_used;
855 EXPECT_TRUE(cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
856 EXPECT_TRUE(
857 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
858 ProofVerifyDetailsChromium verify_details;
859 verify_details.cert_verify_result.verified_cert = cert;
860 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
861
alyssar2adf3ac2016-05-03 17:12:58862 client_maker_.set_hostname(origin.host());
rchbe69cb902016-02-11 01:10:48863 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58864 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
865 1, kClientDataStreamId1, true, true,
866 GetRequestHeaders("GET", "https", "/")));
867 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rchbe69cb902016-02-11 01:10:48868 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58869 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
870 false, true, 0, "hello!"));
871 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchbe69cb902016-02-11 01:10:48872 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
873 mock_quic_data.AddRead(ASYNC, 0);
874 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
875
876 request_.url = GURL("https://" + origin.host());
877 AddQuicRemoteAlternativeServiceMapping(
878 MockCryptoClientStream::CONFIRM_HANDSHAKE, alternative);
rtennetib8e80fb2016-05-16 00:12:09879 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32880 CreateSession();
rchbe69cb902016-02-11 01:10:48881
882 SendRequestAndExpectQuicResponse("hello!");
883}
884
[email protected]1e960032013-12-20 19:00:20885TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
rtenneti8a2f4632016-03-21 20:26:57886 params_.origins_to_force_quic_on.insert(
887 HostPortPair::FromString("mail.example.org:443"));
[email protected]cebe3282013-05-22 23:49:30888
tbansalfdf5665b2015-09-21 22:46:40889 MockQuicData mock_quic_data1;
890 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
[email protected]1e960032013-12-20 19:00:20891
tbansalfdf5665b2015-09-21 22:46:40892 MockQuicData mock_quic_data2;
zhongyi32569c62016-01-08 02:54:30893 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40894 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
rch6faa4d42016-01-05 20:48:43895 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40896
897 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
898 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
[email protected]cebe3282013-05-22 23:49:30899
rch3f4b8452016-02-23 16:59:32900 params_.enable_alternative_service_with_different_host = false;
[email protected]cebe3282013-05-22 23:49:30901 CreateSession();
902
tbansal0f56a39a2016-04-07 22:03:38903 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40904 for (size_t i = 0; i < 2; ++i) {
danakjad1777e2016-04-16 00:56:42905 std::unique_ptr<HttpNetworkTransaction> trans(
tbansalfdf5665b2015-09-21 22:46:40906 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
907 TestCompletionCallback callback;
908 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
909 EXPECT_EQ(ERR_IO_PENDING, rv);
910 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
tbansal0f56a39a2016-04-07 22:03:38911 EXPECT_EQ(1 + i, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40912 }
[email protected]cebe3282013-05-22 23:49:30913}
914
tbansalc8a94ea2015-11-02 23:58:51915TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
916 // Attempt to "force" quic on 443, which will not be honored.
rtenneti8a2f4632016-03-21 20:26:57917 params_.origins_to_force_quic_on.insert(
918 HostPortPair::FromString("www.google.com:443"));
tbansalc8a94ea2015-11-02 23:58:51919
920 MockRead http_reads[] = {
921 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
922 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
923 MockRead(ASYNC, OK)};
924
925 StaticSocketDataProvider data(http_reads, arraysize(http_reads), nullptr, 0);
926 socket_factory_.AddSocketDataProvider(&data);
927 SSLSocketDataProvider ssl(ASYNC, OK);
928 socket_factory_.AddSSLSocketDataProvider(&ssl);
929
rch3f4b8452016-02-23 16:59:32930 params_.enable_alternative_service_with_different_host = false;
tbansalc8a94ea2015-11-02 23:58:51931 CreateSession();
932
933 SendRequestAndExpectHttpResponse("hello world");
tbansal0f56a39a2016-04-07 22:03:38934 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalc8a94ea2015-11-02 23:58:51935}
936
bncc958faa2015-07-31 18:14:52937TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52938 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56939 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
940 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52941 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
942 MockRead(ASYNC, OK)};
943
944 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
945 0);
946 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56947 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52948
949 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58950 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
951 1, kClientDataStreamId1, true, true,
952 GetRequestHeaders("GET", "https", "/")));
953 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:52954 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58955 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
956 false, true, 0, "hello!"));
957 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:52958 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59959 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52960
961 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
962
rtennetib8e80fb2016-05-16 00:12:09963 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32964 CreateSession();
bncc958faa2015-07-31 18:14:52965
966 SendRequestAndExpectHttpResponse("hello world");
967 SendRequestAndExpectQuicResponse("hello!");
968}
969
rchf47265dc2016-03-21 21:33:12970TEST_P(QuicNetworkTransactionTest,
971 UseAlternativeServiceWithProbabilityForQuic) {
972 MockRead http_reads[] = {
973 MockRead("HTTP/1.1 200 OK\r\n"),
974 MockRead(kQuicAlternativeServiceWithProbabilityHeader),
975 MockRead("hello world"),
976 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
977 MockRead(ASYNC, OK)};
978
979 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
980 0);
981 socket_factory_.AddSocketDataProvider(&http_data);
982 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
983
984 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58985 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
986 1, kClientDataStreamId1, true, true,
987 GetRequestHeaders("GET", "https", "/")));
988 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rchf47265dc2016-03-21 21:33:12989 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58990 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
991 false, true, 0, "hello!"));
992 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchf47265dc2016-03-21 21:33:12993 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
994 mock_quic_data.AddRead(ASYNC, 0); // EOF
995
996 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
997
rtennetib8e80fb2016-05-16 00:12:09998 AddHangingNonAlternateProtocolSocketData();
rchf47265dc2016-03-21 21:33:12999 CreateSession();
1000
1001 SendRequestAndExpectHttpResponse("hello world");
1002 SendRequestAndExpectQuicResponse("hello!");
1003}
1004
zhongyi3d4a55e72016-04-22 20:36:461005TEST_P(QuicNetworkTransactionTest, SetAlternativeServiceWithScheme) {
1006 MockRead http_reads[] = {
1007 MockRead("HTTP/1.1 200 OK\r\n"),
1008 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
1009 MockRead("hello world"),
1010 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1011 MockRead(ASYNC, OK)};
1012
1013 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1014 0);
1015
1016 socket_factory_.AddSocketDataProvider(&http_data);
1017 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1018
1019 CreateSession();
1020 // Send http request, ignore alternative service advertising if response
1021 // header advertises alternative service for mail.example.org.
1022 request_.url = GURL("http://mail.example.org:443");
1023 SendRequestAndExpectHttpResponse("hello world");
bnc525e175a2016-06-20 12:36:401024 HttpServerProperties* http_server_properties =
zhongyi3d4a55e72016-04-22 20:36:461025 session_->http_server_properties();
1026 url::SchemeHostPort http_server("http", "mail.example.org", 443);
1027 url::SchemeHostPort https_server("https", "mail.example.org", 443);
1028 // Check alternative service is set for the correct origin.
1029 EXPECT_EQ(2u,
1030 http_server_properties->GetAlternativeServices(http_server).size());
1031 EXPECT_EQ(
1032 0u, http_server_properties->GetAlternativeServices(https_server).size());
1033}
1034
1035TEST_P(QuicNetworkTransactionTest, DoNotGetAltSvcForDifferentOrigin) {
1036 MockRead http_reads[] = {
1037 MockRead("HTTP/1.1 200 OK\r\n"),
1038 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
1039 MockRead("hello world"),
1040 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1041 MockRead(ASYNC, OK)};
1042
1043 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1044 0);
1045
1046 socket_factory_.AddSocketDataProvider(&http_data);
1047 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1048 socket_factory_.AddSocketDataProvider(&http_data);
1049 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1050
1051 CreateSession();
1052
1053 // Send https request and set alternative services if response header
1054 // advertises alternative service for mail.example.org.
1055 SendRequestAndExpectHttpResponse("hello world");
bnc525e175a2016-06-20 12:36:401056 HttpServerProperties* http_server_properties =
zhongyi3d4a55e72016-04-22 20:36:461057 session_->http_server_properties();
1058
1059 const url::SchemeHostPort https_server(request_.url);
1060 // Check alternative service is set.
1061 AlternativeServiceVector alternative_service_vector =
1062 http_server_properties->GetAlternativeServices(https_server);
1063 EXPECT_EQ(2u, alternative_service_vector.size());
1064
1065 // Send http request to the same origin but with diffrent scheme, should not
1066 // use QUIC.
1067 request_.url = GURL("http://mail.example.org:443");
1068 SendRequestAndExpectHttpResponse("hello world");
1069}
1070
bnc8be55ebb2015-10-30 14:12:071071TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) {
1072 std::string altsvc_header = base::StringPrintf(
1073 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam());
1074 MockRead http_reads[] = {
1075 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1076 MockRead("hello world"),
1077 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1078 MockRead(ASYNC, OK)};
1079
1080 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1081 0);
1082 socket_factory_.AddSocketDataProvider(&http_data);
1083 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1084
1085 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581086 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1087 1, kClientDataStreamId1, true, true,
1088 GetRequestHeaders("GET", "https", "/")));
1089 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc8be55ebb2015-10-30 14:12:071090 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581091 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1092 false, true, 0, "hello!"));
1093 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bnc8be55ebb2015-10-30 14:12:071094 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591095 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc8be55ebb2015-10-30 14:12:071096
1097 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1098
rtennetib8e80fb2016-05-16 00:12:091099 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321100 CreateSession();
bnc8be55ebb2015-10-30 14:12:071101
1102 SendRequestAndExpectHttpResponse("hello world");
1103 SendRequestAndExpectQuicResponse("hello!");
1104}
1105
zhongyi6b5a3892016-03-12 04:46:201106TEST_P(QuicNetworkTransactionTest, GoAwayWithConnectionMigrationOnPortsOnly) {
1107 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581108 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1109 1, kClientDataStreamId1, true, true,
1110 GetRequestHeaders("GET", "https", "/")));
1111 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi6b5a3892016-03-12 04:46:201112 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1113 // Read a GoAway packet with
1114 // QuicErrorCode: QUIC_ERROR_MIGRATING_PORT from the peer.
alyssar2adf3ac2016-05-03 17:12:581115 mock_quic_data.AddRead(ConstructServerGoAwayPacket(
1116 2, QUIC_ERROR_MIGRATING_PORT,
1117 "connection migration with port change only"));
1118 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
1119 mock_quic_data.AddRead(ConstructServerDataPacket(3, kClientDataStreamId1,
1120 false, true, 0, "hello!"));
1121 mock_quic_data.AddWrite(ConstructClientAckAndRstPacket(
zhongyi6b5a3892016-03-12 04:46:201122 3, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 3, 3, 1));
1123 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1124 mock_quic_data.AddRead(ASYNC, 0); // EOF
1125
1126 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1127
1128 // The non-alternate protocol job needs to hang in order to guarantee that
1129 // the alternate-protocol job will "win".
1130 AddHangingNonAlternateProtocolSocketData();
1131
1132 // In order for a new QUIC session to be established via alternate-protocol
1133 // without racing an HTTP connection, we need the host resolution to happen
1134 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1135 // connection to the the server, in this test we require confirmation
1136 // before encrypting so the HTTP job will still start.
1137 host_resolver_.set_synchronous_mode(true);
1138 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1139 "");
1140 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1141 AddressList address;
1142 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1143 nullptr, net_log_.bound());
1144
1145 CreateSession();
1146 session_->quic_stream_factory()->set_require_confirmation(true);
1147 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1148
danakjad1777e2016-04-16 00:56:421149 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyi6b5a3892016-03-12 04:46:201150 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1151 TestCompletionCallback callback;
1152 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1153 EXPECT_EQ(ERR_IO_PENDING, rv);
1154
1155 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1156 QuicSession::HANDSHAKE_CONFIRMED);
1157 EXPECT_EQ(OK, callback.WaitForResult());
1158
1159 // Check whether this transaction is correctly marked as received a go-away
1160 // because of migrating port.
1161 NetErrorDetails details;
1162 EXPECT_FALSE(details.quic_port_migration_detected);
1163 trans->PopulateNetErrorDetails(&details);
1164 EXPECT_TRUE(details.quic_port_migration_detected);
1165}
1166
bnc8be55ebb2015-10-30 14:12:071167TEST_P(QuicNetworkTransactionTest,
1168 DoNotUseAlternativeServiceQuicUnsupportedVersion) {
1169 std::string altsvc_header = base::StringPrintf(
1170 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam() - 1);
1171 MockRead http_reads[] = {
1172 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1173 MockRead("hello world"),
1174 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1175 MockRead(ASYNC, OK)};
1176
1177 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1178 0);
1179 socket_factory_.AddSocketDataProvider(&http_data);
1180 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1181 socket_factory_.AddSocketDataProvider(&http_data);
1182 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1183
rch3f4b8452016-02-23 16:59:321184 CreateSession();
bnc8be55ebb2015-10-30 14:12:071185
1186 SendRequestAndExpectHttpResponse("hello world");
1187 SendRequestAndExpectHttpResponse("hello world");
1188}
1189
bncc958faa2015-07-31 18:14:521190// When multiple alternative services are advertised,
zhongyi32569c62016-01-08 02:54:301191// HttpStreamFactoryImpl::RequestStreamInternal() should select the alternative
1192// service which uses existing QUIC session if available. If no existing QUIC
1193// session can be used, use the first alternative service from the list.
1194TEST_P(QuicNetworkTransactionTest, UseExistingAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:521195 MockRead http_reads[] = {
1196 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291197 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
bncc958faa2015-07-31 18:14:521198 MockRead("hello world"),
1199 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1200 MockRead(ASYNC, OK)};
1201
1202 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1203 0);
1204 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561205 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521206
zhongyi32569c62016-01-08 02:54:301207 QuicStreamOffset request_header_offset = 0;
1208 QuicStreamOffset response_header_offset = 0;
1209 // First QUIC request data.
rch9ae5b3b2016-02-11 00:36:291210 // Open a session to foo.example.org:443 using the first entry of the
zhongyi32569c62016-01-08 02:54:301211 // alternative service list.
bncc958faa2015-07-31 18:14:521212 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581213 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301214 1, kClientDataStreamId1, true, true,
1215 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1216
1217 std::string alt_svc_list =
rch9ae5b3b2016-02-11 00:36:291218 "quic=\"mail.example.org:444\", quic=\"foo.example.org:443\", "
1219 "quic=\"bar.example.org:445\"";
alyssar2adf3ac2016-05-03 17:12:581220 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301221 1, kClientDataStreamId1, false, false,
1222 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581223 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1224 false, true, 0, "hello!"));
1225 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301226
1227 // Second QUIC request data.
1228 // Connection pooling, using existing session, no need to include version
1229 // as version negotiation has been completed.
alyssar2adf3ac2016-05-03 17:12:581230 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301231 3, kClientDataStreamId2, false, true,
1232 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581233 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301234 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1235 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581236 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1237 false, true, 0, "hello!"));
1238 mock_quic_data.AddWrite(
1239 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
bncc958faa2015-07-31 18:14:521240 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591241 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521242
1243 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1244
rtennetib8e80fb2016-05-16 00:12:091245 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321246 CreateSession();
bncc958faa2015-07-31 18:14:521247
1248 SendRequestAndExpectHttpResponse("hello world");
zhongyi32569c62016-01-08 02:54:301249
bnc359ed2a2016-04-29 20:43:451250 SendRequestAndExpectQuicResponse("hello!");
1251 SendRequestAndExpectQuicResponse("hello!");
zhongyi32569c62016-01-08 02:54:301252}
1253
bnc359ed2a2016-04-29 20:43:451254// Pool to existing session with matching QuicServerId
1255// even if alternative service destination is different.
1256TEST_P(QuicNetworkTransactionTest, PoolByOrigin) {
zhongyi32569c62016-01-08 02:54:301257 MockQuicData mock_quic_data;
bnc359ed2a2016-04-29 20:43:451258 QuicStreamOffset request_header_offset(0);
1259 QuicStreamOffset response_header_offset(0);
1260
1261 // First request.
alyssar2adf3ac2016-05-03 17:12:581262 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301263 1, kClientDataStreamId1, true, true,
1264 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581265 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451266 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1267 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581268 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1269 false, true, 0, "hello!"));
1270 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301271
bnc359ed2a2016-04-29 20:43:451272 // Second request.
alyssar2adf3ac2016-05-03 17:12:581273 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301274 3, kClientDataStreamId2, false, true,
1275 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581276 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301277 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1278 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581279 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1280 false, true, 0, "hello!"));
1281 mock_quic_data.AddWrite(
1282 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
zhongyi32569c62016-01-08 02:54:301283 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1284 mock_quic_data.AddRead(ASYNC, 0); // EOF
1285
1286 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bnc359ed2a2016-04-29 20:43:451287
1288 AddHangingNonAlternateProtocolSocketData();
1289 AddHangingNonAlternateProtocolSocketData();
zhongyi32569c62016-01-08 02:54:301290
rch3f4b8452016-02-23 16:59:321291 CreateSession();
zhongyi32569c62016-01-08 02:54:301292
bnc359ed2a2016-04-29 20:43:451293 const char destination1[] = "first.example.com";
1294 const char destination2[] = "second.example.com";
1295
1296 // Set up alternative service entry to destination1.
1297 url::SchemeHostPort server(request_.url);
1298 AlternativeService alternative_service(QUIC, destination1, 443);
1299 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1300 http_server_properties_.SetAlternativeService(server, alternative_service,
1301 expiration);
1302 // First request opens connection to |destination1|
1303 // with QuicServerId.host() == kDefaultServerHostName.
1304 SendRequestAndExpectQuicResponse("hello!");
1305
1306 // Set up alternative service entry to a different destination.
1307 alternative_service = AlternativeService(QUIC, destination2, 443);
1308 http_server_properties_.SetAlternativeService(server, alternative_service,
1309 expiration);
1310 // Second request pools to existing connection with same QuicServerId,
1311 // even though alternative service destination is different.
1312 SendRequestAndExpectQuicResponse("hello!");
1313}
1314
1315// Pool to existing session with matching destination and matching certificate
1316// even if origin is different, and even if the alternative service with
1317// matching destination is not the first one on the list.
1318TEST_P(QuicNetworkTransactionTest, PoolByDestination) {
1319 GURL origin1 = request_.url;
1320 GURL origin2("https://www.example.org/");
1321 ASSERT_NE(origin1.host(), origin2.host());
1322
1323 MockQuicData mock_quic_data;
1324 QuicStreamOffset request_header_offset(0);
1325 QuicStreamOffset response_header_offset(0);
1326
1327 // First request.
alyssar2adf3ac2016-05-03 17:12:581328 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:451329 1, kClientDataStreamId1, true, true,
1330 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581331 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451332 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1333 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581334 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1335 false, true, 0, "hello!"));
1336 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bnc359ed2a2016-04-29 20:43:451337
1338 // Second request.
alyssar2adf3ac2016-05-03 17:12:581339 QuicTestPacketMaker client_maker2(GetParam(), 0, clock_, origin2.host(),
1340 Perspective::IS_CLIENT);
1341 QuicTestPacketMaker server_maker2(GetParam(), 0, clock_, origin2.host(),
1342 Perspective::IS_SERVER);
1343 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:451344 3, kClientDataStreamId2, false, true,
alyssar2adf3ac2016-05-03 17:12:581345 GetRequestHeaders("GET", "https", "/", &client_maker2),
1346 &request_header_offset, &client_maker2));
1347 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451348 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
alyssar2adf3ac2016-05-03 17:12:581349 &response_header_offset, &server_maker2));
1350 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1351 false, true, 0, "hello!"));
1352 mock_quic_data.AddWrite(
1353 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
bnc359ed2a2016-04-29 20:43:451354 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1355 mock_quic_data.AddRead(ASYNC, 0); // EOF
1356
1357 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1358
1359 AddHangingNonAlternateProtocolSocketData();
1360 AddHangingNonAlternateProtocolSocketData();
1361
1362 CreateSession();
1363
1364 const char destination1[] = "first.example.com";
1365 const char destination2[] = "second.example.com";
1366
1367 // Set up alternative service for |origin1|.
1368 AlternativeService alternative_service1(QUIC, destination1, 443);
1369 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1370 http_server_properties_.SetAlternativeService(
1371 url::SchemeHostPort(origin1), alternative_service1, expiration);
1372
1373 // Set up multiple alternative service entries for |origin2|,
1374 // the first one with a different destination as for |origin1|,
1375 // the second one with the same. The second one should be used,
1376 // because the request can be pooled to that one.
1377 AlternativeService alternative_service2(QUIC, destination2, 443);
1378 AlternativeServiceInfoVector alternative_services;
1379 alternative_services.push_back(
1380 AlternativeServiceInfo(alternative_service2, expiration));
1381 alternative_services.push_back(
1382 AlternativeServiceInfo(alternative_service1, expiration));
1383 http_server_properties_.SetAlternativeServices(url::SchemeHostPort(origin2),
1384 alternative_services);
bnc359ed2a2016-04-29 20:43:451385 // First request opens connection to |destination1|
1386 // with QuicServerId.host() == origin1.host().
1387 SendRequestAndExpectQuicResponse("hello!");
1388
1389 // Second request pools to existing connection with same destination,
1390 // because certificate matches, even though QuicServerId is different.
1391 request_.url = origin2;
alyssar2adf3ac2016-05-03 17:12:581392
bnc359ed2a2016-04-29 20:43:451393 SendRequestAndExpectQuicResponse("hello!");
zhongyi32569c62016-01-08 02:54:301394}
1395
1396// Multiple origins have listed the same alternative services. When there's a
1397// existing QUIC session opened by a request to other origin,
1398// if the cert is valid, should select this QUIC session to make the request
1399// if this is also the first existing QUIC session.
1400TEST_P(QuicNetworkTransactionTest,
1401 UseSharedExistingAlternativeServiceForQuicWithValidCert) {
rch9ae5b3b2016-02-11 00:36:291402 // Default cert is valid for *.example.org
zhongyi32569c62016-01-08 02:54:301403
rch9ae5b3b2016-02-11 00:36:291404 // HTTP data for request to www.example.org.
zhongyi32569c62016-01-08 02:54:301405 MockRead http_reads[] = {
1406 MockRead("HTTP/1.1 200 OK\r\n"),
1407 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
rch9ae5b3b2016-02-11 00:36:291408 MockRead("hello world from www.example.org"),
zhongyi32569c62016-01-08 02:54:301409 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1410 MockRead(ASYNC, OK)};
1411
1412 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1413 0);
1414 socket_factory_.AddSocketDataProvider(&http_data);
1415 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1416
1417 // HTTP data for request to mail.example.org.
1418 MockRead http_reads2[] = {
1419 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291420 MockRead("Alt-Svc: quic=\":444\", quic=\"www.example.org:443\"\r\n\r\n"),
zhongyi32569c62016-01-08 02:54:301421 MockRead("hello world from mail.example.org"),
1422 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1423 MockRead(ASYNC, OK)};
1424
1425 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1426 nullptr, 0);
1427 socket_factory_.AddSocketDataProvider(&http_data2);
1428 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1429
1430 QuicStreamOffset request_header_offset = 0;
1431 QuicStreamOffset response_header_offset = 0;
1432
alyssar2adf3ac2016-05-03 17:12:581433 QuicTestPacketMaker client_maker(GetParam(), 0, clock_, "mail.example.org",
1434 Perspective::IS_CLIENT);
1435 server_maker_.set_hostname("www.example.org");
1436 client_maker_.set_hostname("www.example.org");
zhongyi32569c62016-01-08 02:54:301437 MockQuicData mock_quic_data;
1438
1439 // First QUIC request data.
alyssar2adf3ac2016-05-03 17:12:581440 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301441 1, kClientDataStreamId1, true, true,
1442 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1443
alyssar2adf3ac2016-05-03 17:12:581444 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301445 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1446 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581447 mock_quic_data.AddRead(ConstructServerDataPacket(
1448 2, kClientDataStreamId1, false, true, 0, "hello from mail QUIC!"));
1449 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301450 // Second QUIC request data.
alyssar2adf3ac2016-05-03 17:12:581451 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301452 3, kClientDataStreamId2, false, true,
alyssar2adf3ac2016-05-03 17:12:581453 GetRequestHeaders("GET", "https", "/", &client_maker),
1454 &request_header_offset, &client_maker));
1455 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301456 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1457 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581458 mock_quic_data.AddRead(ConstructServerDataPacket(
1459 4, kClientDataStreamId2, false, true, 0, "hello from mail QUIC!"));
1460 mock_quic_data.AddWrite(
1461 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
zhongyi32569c62016-01-08 02:54:301462 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1463 mock_quic_data.AddRead(ASYNC, 0); // EOF
1464
1465 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
zhongyi32569c62016-01-08 02:54:301466
rtennetib8e80fb2016-05-16 00:12:091467 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321468 CreateSession();
zhongyi32569c62016-01-08 02:54:301469
1470 // Send two HTTP requests, responses set up alt-svc lists for the origins.
rch9ae5b3b2016-02-11 00:36:291471 request_.url = GURL("https://www.example.org/");
1472 SendRequestAndExpectHttpResponse("hello world from www.example.org");
zhongyi32569c62016-01-08 02:54:301473 request_.url = GURL("https://mail.example.org/");
1474 SendRequestAndExpectHttpResponse("hello world from mail.example.org");
1475
rch9ae5b3b2016-02-11 00:36:291476 // Open a QUIC session to mail.example.org:443 when making request
1477 // to mail.example.org.
1478 request_.url = GURL("https://www.example.org/");
bnc359ed2a2016-04-29 20:43:451479 SendRequestAndExpectQuicResponse("hello from mail QUIC!");
zhongyi32569c62016-01-08 02:54:301480
rch9ae5b3b2016-02-11 00:36:291481 // Uses the existing QUIC session when making request to www.example.org.
zhongyi32569c62016-01-08 02:54:301482 request_.url = GURL("https://mail.example.org/");
bnc359ed2a2016-04-29 20:43:451483 SendRequestAndExpectQuicResponse("hello from mail QUIC!");
bncc958faa2015-07-31 18:14:521484}
1485
1486TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) {
bncc958faa2015-07-31 18:14:521487 MockRead http_reads[] = {
1488 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561489 MockRead(kQuicAlternativeServiceDifferentPortHeader),
bncc958faa2015-07-31 18:14:521490 MockRead("hello world"),
1491 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1492 MockRead(ASYNC, OK)};
1493
1494 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1495 0);
1496 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561497 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521498
rtennetib8e80fb2016-05-16 00:12:091499 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321500 CreateSession();
bncc958faa2015-07-31 18:14:521501
1502 SendRequestAndExpectHttpResponse("hello world");
bnc359ed2a2016-04-29 20:43:451503
1504 url::SchemeHostPort http_server("https", kDefaultServerHostName, 443);
1505 AlternativeServiceVector alternative_service_vector =
1506 http_server_properties_.GetAlternativeServices(http_server);
1507 ASSERT_EQ(1u, alternative_service_vector.size());
1508 const AlternativeService alternative_service = alternative_service_vector[0];
1509 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
1510 EXPECT_EQ(kDefaultServerHostName, alternative_service_vector[0].host);
1511 EXPECT_EQ(137, alternative_service_vector[0].port);
bncc958faa2015-07-31 18:14:521512}
1513
1514TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) {
bncc958faa2015-07-31 18:14:521515 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561516 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1517 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521518 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1519 MockRead(ASYNC, OK)};
1520
1521 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1522 0);
1523 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561524 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521525
1526 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581527 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1528 1, kClientDataStreamId1, true, true,
1529 GetRequestHeaders("GET", "https", "/")));
1530 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:521531 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581532 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1533 false, true, 0, "hello!"));
1534 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:521535 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1536 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521537
1538 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1539
rtennetib8e80fb2016-05-16 00:12:091540 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321541 CreateSession();
bncc958faa2015-07-31 18:14:521542
1543 AlternativeService alternative_service(QUIC,
1544 HostPortPair::FromURL(request_.url));
1545 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
1546 alternative_service);
1547 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1548 alternative_service));
1549
1550 SendRequestAndExpectHttpResponse("hello world");
1551 SendRequestAndExpectQuicResponse("hello!");
1552
mmenkee24011922015-12-17 22:12:591553 mock_quic_data.Resume();
bncc958faa2015-07-31 18:14:521554
1555 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1556 alternative_service));
1557}
1558
bncc958faa2015-07-31 18:14:521559TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) {
bncc958faa2015-07-31 18:14:521560 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561561 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1562 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521563 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1564 MockRead(ASYNC, OK)};
1565
1566 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1567 0);
1568 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561569 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521570
1571 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581572 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1573 1, kClientDataStreamId1, true, true,
1574 GetRequestHeaders("GET", "https", "/")));
1575 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:521576 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581577 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1578 false, true, 0, "hello!"));
1579 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:521580 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
1581
1582 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1583
1584 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321585 CreateSession();
bncc958faa2015-07-31 18:14:521586
1587 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1588 SendRequestAndExpectHttpResponse("hello world");
1589}
1590
bnc1c196c6e2016-05-28 13:51:481591TEST_P(QuicNetworkTransactionTest, HungAlternativeService) {
[email protected]dda75ab2013-06-22 22:43:301592 crypto_client_stream_factory_.set_handshake_mode(
1593 MockCryptoClientStream::COLD_START);
1594
1595 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561596 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
rch9ae5b3b2016-02-11 00:36:291597 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561598 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")};
[email protected]dda75ab2013-06-22 22:43:301599
1600 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561601 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
bnc1c196c6e2016-05-28 13:51:481602 MockRead(SYNCHRONOUS, 4, kQuicAlternativeServiceHeader),
rchf114d982015-10-21 01:34:561603 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]dda75ab2013-06-22 22:43:301604
mmenke651bae7f2015-12-18 21:26:451605 SequencedSocketData http_data(http_reads, arraysize(http_reads), http_writes,
1606 arraysize(http_writes));
bnc912a04b2016-04-20 14:19:501607 socket_factory_.AddSocketDataProvider(&http_data);
1608 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301609
1610 // The QUIC transaction will not be allowed to complete.
mmenke651bae7f2015-12-18 21:26:451611 MockWrite quic_writes[] = {MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 1)};
[email protected]dda75ab2013-06-22 22:43:301612 MockRead quic_reads[] = {
mmenke651bae7f2015-12-18 21:26:451613 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0),
[email protected]dda75ab2013-06-22 22:43:301614 };
mmenke651bae7f2015-12-18 21:26:451615 SequencedSocketData quic_data(quic_reads, arraysize(quic_reads), quic_writes,
1616 arraysize(quic_writes));
bnc912a04b2016-04-20 14:19:501617 socket_factory_.AddSocketDataProvider(&quic_data);
[email protected]dda75ab2013-06-22 22:43:301618
1619 // The HTTP transaction will complete.
mmenke651bae7f2015-12-18 21:26:451620 SequencedSocketData http_data2(http_reads, arraysize(http_reads), http_writes,
1621 arraysize(http_writes));
bnc912a04b2016-04-20 14:19:501622 socket_factory_.AddSocketDataProvider(&http_data2);
1623 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301624
bnc912a04b2016-04-20 14:19:501625 CreateSession();
[email protected]dda75ab2013-06-22 22:43:301626
1627 // Run the first request.
[email protected]dda75ab2013-06-22 22:43:301628 SendRequestAndExpectHttpResponse("hello world");
rch37de576c2015-05-17 20:28:171629 ASSERT_TRUE(http_data.AllReadDataConsumed());
1630 ASSERT_TRUE(http_data.AllWriteDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301631
1632 // Now run the second request in which the QUIC socket hangs,
1633 // and verify the the transaction continues over HTTP.
[email protected]dda75ab2013-06-22 22:43:301634 SendRequestAndExpectHttpResponse("hello world");
mmenke651bae7f2015-12-18 21:26:451635 base::RunLoop().RunUntilIdle();
[email protected]dda75ab2013-06-22 22:43:301636
rch37de576c2015-05-17 20:28:171637 ASSERT_TRUE(http_data2.AllReadDataConsumed());
1638 ASSERT_TRUE(http_data2.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:451639 ASSERT_TRUE(quic_data.AllReadDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301640}
1641
[email protected]1e960032013-12-20 19:00:201642TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
[email protected]1e960032013-12-20 19:00:201643 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581644 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1645 1, kClientDataStreamId1, true, true,
1646 GetRequestHeaders("GET", "https", "/")));
1647 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021648 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581649 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1650 false, true, 0, "hello!"));
1651 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501652 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591653 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]8ba81212013-05-03 13:11:481654
rcha5399e02015-04-21 19:32:041655 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]8ba81212013-05-03 13:11:481656
rtennetib8e80fb2016-05-16 00:12:091657 // The non-alternate protocol job needs to hang in order to guarantee that
1658 // the alternate-protocol job will "win".
1659 AddHangingNonAlternateProtocolSocketData();
1660
rch3f4b8452016-02-23 16:59:321661 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:191662 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1663 SendRequestAndExpectQuicResponse("hello!");
[email protected]8ba81212013-05-03 13:11:481664}
1665
[email protected]1e960032013-12-20 19:00:201666TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
[email protected]1e960032013-12-20 19:00:201667 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581668 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1669 1, kClientDataStreamId1, true, true,
1670 GetRequestHeaders("GET", "https", "/")));
1671 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021672 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581673 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1674 false, true, 0, "hello!"));
1675 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501676 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591677 mock_quic_data.AddRead(ASYNC, 0); // EOF
rcha5399e02015-04-21 19:32:041678 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]3a120a6b2013-06-25 01:08:271679
1680 // In order for a new QUIC session to be established via alternate-protocol
1681 // without racing an HTTP connection, we need the host resolution to happen
1682 // synchronously.
1683 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291684 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561685 "");
rch9ae5b3b2016-02-11 00:36:291686 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]3a120a6b2013-06-25 01:08:271687 AddressList address;
rjshaded5ced072015-12-18 19:26:021688 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1689 nullptr, net_log_.bound());
[email protected]3a120a6b2013-06-25 01:08:271690
rtennetib8e80fb2016-05-16 00:12:091691 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321692 CreateSession();
[email protected]3a120a6b2013-06-25 01:08:271693 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1694 SendRequestAndExpectQuicResponse("hello!");
1695}
1696
[email protected]0fc924b2014-03-31 04:34:151697TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) {
rdsmith82957ad2015-09-16 19:42:031698 proxy_service_ = ProxyService::CreateFixedFromPacResult("PROXY myproxy:70");
[email protected]0fc924b2014-03-31 04:34:151699
1700 // Since we are using a proxy, the QUIC job will not succeed.
1701 MockWrite http_writes[] = {
rch9ae5b3b2016-02-11 00:36:291702 MockWrite(SYNCHRONOUS, 0, "GET http://mail.example.org/ HTTP/1.1\r\n"),
1703 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561704 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")};
[email protected]0fc924b2014-03-31 04:34:151705
1706 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561707 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
bnc1c196c6e2016-05-28 13:51:481708 MockRead(SYNCHRONOUS, 4, kQuicAlternativeServiceHeader),
rchf114d982015-10-21 01:34:561709 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]0fc924b2014-03-31 04:34:151710
1711 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
1712 http_writes, arraysize(http_writes));
1713 socket_factory_.AddSocketDataProvider(&http_data);
1714
1715 // In order for a new QUIC session to be established via alternate-protocol
1716 // without racing an HTTP connection, we need the host resolution to happen
1717 // synchronously.
1718 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291719 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561720 "");
rch9ae5b3b2016-02-11 00:36:291721 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]0fc924b2014-03-31 04:34:151722 AddressList address;
rjshaded5ced072015-12-18 19:26:021723 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1724 nullptr, net_log_.bound());
[email protected]0fc924b2014-03-31 04:34:151725
rch9ae5b3b2016-02-11 00:36:291726 request_.url = GURL("http://mail.example.org/");
rch3f4b8452016-02-23 16:59:321727 CreateSession();
[email protected]0fc924b2014-03-31 04:34:151728 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1729 SendRequestAndExpectHttpResponse("hello world");
1730}
1731
[email protected]1e960032013-12-20 19:00:201732TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
[email protected]1e960032013-12-20 19:00:201733 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581734 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1735 1, kClientDataStreamId1, true, true,
1736 GetRequestHeaders("GET", "https", "/")));
1737 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021738 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581739 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1740 false, true, 0, "hello!"));
1741 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591742 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
rcha5399e02015-04-21 19:32:041743 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]11c05872013-08-20 02:04:121744
rtennetib8e80fb2016-05-16 00:12:091745 // The non-alternate protocol job needs to hang in order to guarantee that
1746 // the alternate-protocol job will "win".
1747 AddHangingNonAlternateProtocolSocketData();
1748
[email protected]11c05872013-08-20 02:04:121749 // In order for a new QUIC session to be established via alternate-protocol
1750 // without racing an HTTP connection, we need the host resolution to happen
1751 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1752 // connection to the the server, in this test we require confirmation
1753 // before encrypting so the HTTP job will still start.
1754 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291755 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561756 "");
rch9ae5b3b2016-02-11 00:36:291757 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]11c05872013-08-20 02:04:121758 AddressList address;
rjshaded5ced072015-12-18 19:26:021759 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1760 nullptr, net_log_.bound());
[email protected]11c05872013-08-20 02:04:121761
rch3f4b8452016-02-23 16:59:321762 CreateSession();
[email protected]11c05872013-08-20 02:04:121763 session_->quic_stream_factory()->set_require_confirmation(true);
1764 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1765
danakjad1777e2016-04-16 00:56:421766 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]11c05872013-08-20 02:04:121767 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1768 TestCompletionCallback callback;
1769 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1770 EXPECT_EQ(ERR_IO_PENDING, rv);
1771
1772 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1773 QuicSession::HANDSHAKE_CONFIRMED);
1774 EXPECT_EQ(OK, callback.WaitForResult());
rchb27683c2015-07-29 23:53:501775
1776 CheckWasQuicResponse(trans);
1777 CheckResponseData(trans, "hello!");
[email protected]11c05872013-08-20 02:04:121778}
1779
zhongyica364fbb2015-12-12 03:39:121780TEST_P(QuicNetworkTransactionTest,
1781 LogGranularQuicErrorCodeOnQuicProtocolErrorLocal) {
1782 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581783 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1784 1, kClientDataStreamId1, true, true,
1785 GetRequestHeaders("GET", "https", "/")));
zhongyica364fbb2015-12-12 03:39:121786 // Read a close connection packet with
1787 // QuicErrorCode: QUIC_CRYPTO_VERSION_NOT_SUPPORTED from the peer.
alyssar2adf3ac2016-05-03 17:12:581788 mock_quic_data.AddRead(ConstructServerConnectionClosePacket(1));
zhongyica364fbb2015-12-12 03:39:121789 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1790
1791 // The non-alternate protocol job needs to hang in order to guarantee that
1792 // the alternate-protocol job will "win".
1793 AddHangingNonAlternateProtocolSocketData();
1794
1795 // In order for a new QUIC session to be established via alternate-protocol
1796 // without racing an HTTP connection, we need the host resolution to happen
1797 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1798 // connection to the the server, in this test we require confirmation
1799 // before encrypting so the HTTP job will still start.
1800 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291801 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:121802 "");
rch9ae5b3b2016-02-11 00:36:291803 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:121804 AddressList address;
1805 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1806 nullptr, net_log_.bound());
1807
rch3f4b8452016-02-23 16:59:321808 CreateSession();
zhongyica364fbb2015-12-12 03:39:121809 session_->quic_stream_factory()->set_require_confirmation(true);
1810 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1811
danakjad1777e2016-04-16 00:56:421812 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyica364fbb2015-12-12 03:39:121813 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1814 TestCompletionCallback callback;
1815 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1816 EXPECT_EQ(ERR_IO_PENDING, rv);
1817
1818 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1819 QuicSession::HANDSHAKE_CONFIRMED);
1820 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
1821
1822 NetErrorDetails details;
1823 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1824
1825 trans->PopulateNetErrorDetails(&details);
1826 // Verify the error code logged is what sent by the peer.
1827 EXPECT_EQ(QUIC_CRYPTO_VERSION_NOT_SUPPORTED, details.quic_connection_error);
1828}
1829
1830TEST_P(QuicNetworkTransactionTest,
1831 LogGranularQuicErrorCodeOnQuicProtocolErrorRemote) {
1832 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581833 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1834 1, kClientDataStreamId1, true, true,
1835 GetRequestHeaders("GET", "https", "/")));
zhongyif28b4a32016-04-25 21:35:211836 // Peer sending data from an non-existing stream causes this end to raise
1837 // error and close connection.
1838 mock_quic_data.AddRead(
alyssar2adf3ac2016-05-03 17:12:581839 ConstructServerRstPacket(1, false, 99, QUIC_STREAM_LAST_ERROR));
zhongyif28b4a32016-04-25 21:35:211840 std::string quic_error_details = "Data for nonexistent stream";
alyssar2adf3ac2016-05-03 17:12:581841 mock_quic_data.AddWrite(ConstructClientAckAndConnectionClosePacket(
zhongyif28b4a32016-04-25 21:35:211842 2, QuicTime::Delta::Infinite(), 0, 1, QUIC_INVALID_STREAM_ID,
zhongyica364fbb2015-12-12 03:39:121843 quic_error_details));
1844 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1845
1846 // The non-alternate protocol job needs to hang in order to guarantee that
1847 // the alternate-protocol job will "win".
1848 AddHangingNonAlternateProtocolSocketData();
1849
1850 // In order for a new QUIC session to be established via alternate-protocol
1851 // without racing an HTTP connection, we need the host resolution to happen
1852 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1853 // connection to the the server, in this test we require confirmation
1854 // before encrypting so the HTTP job will still start.
1855 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291856 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:121857 "");
rch9ae5b3b2016-02-11 00:36:291858 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:121859 AddressList address;
1860 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1861 nullptr, net_log_.bound());
1862
rch3f4b8452016-02-23 16:59:321863 CreateSession();
zhongyica364fbb2015-12-12 03:39:121864 session_->quic_stream_factory()->set_require_confirmation(true);
1865 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1866
danakjad1777e2016-04-16 00:56:421867 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyica364fbb2015-12-12 03:39:121868 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1869 TestCompletionCallback callback;
1870 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1871 EXPECT_EQ(ERR_IO_PENDING, rv);
1872
1873 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1874 QuicSession::HANDSHAKE_CONFIRMED);
1875 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
1876 NetErrorDetails details;
1877 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1878
1879 trans->PopulateNetErrorDetails(&details);
zhongyif28b4a32016-04-25 21:35:211880 EXPECT_EQ(QUIC_INVALID_STREAM_ID, details.quic_connection_error);
zhongyica364fbb2015-12-12 03:39:121881}
1882
rchcd5f1c62016-06-23 02:43:481883TEST_P(QuicNetworkTransactionTest, RstSteamErrorHandling) {
1884 MockQuicData mock_quic_data;
1885 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1886 1, kClientDataStreamId1, true, true,
1887 GetRequestHeaders("GET", "https", "/")));
1888 // Read the response headers, then a RST_STREAM frame.
1889 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
1890 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1891 mock_quic_data.AddRead(ConstructServerRstPacket(
1892 2, false, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1893 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
1894 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
1895 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1896
1897 // The non-alternate protocol job needs to hang in order to guarantee that
1898 // the alternate-protocol job will "win".
1899 AddHangingNonAlternateProtocolSocketData();
1900
1901 // In order for a new QUIC session to be established via alternate-protocol
1902 // without racing an HTTP connection, we need the host resolution to happen
1903 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1904 // connection to the the server, in this test we require confirmation
1905 // before encrypting so the HTTP job will still start.
1906 host_resolver_.set_synchronous_mode(true);
1907 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1908 "");
1909 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1910 AddressList address;
1911 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1912 nullptr, net_log_.bound());
1913
1914 CreateSession();
1915 session_->quic_stream_factory()->set_require_confirmation(true);
1916 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1917
1918 std::unique_ptr<HttpNetworkTransaction> trans(
1919 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1920 TestCompletionCallback callback;
1921 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1922 EXPECT_EQ(ERR_IO_PENDING, rv);
1923
1924 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1925 QuicSession::HANDSHAKE_CONFIRMED);
1926 // Read the headers.
1927 EXPECT_EQ(OK, callback.WaitForResult());
1928
1929 const HttpResponseInfo* response = trans->GetResponseInfo();
1930 ASSERT_TRUE(response != nullptr);
1931 ASSERT_TRUE(response->headers.get() != nullptr);
1932 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
1933 EXPECT_TRUE(response->was_fetched_via_spdy);
1934 EXPECT_TRUE(response->was_npn_negotiated);
1935 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
1936 response->connection_info);
1937
1938 std::string response_data;
1939 ASSERT_EQ(ERR_QUIC_PROTOCOL_ERROR,
1940 ReadTransaction(trans.get(), &response_data));
1941}
1942
1943TEST_P(QuicNetworkTransactionTest, RstSteamBeforeHeaders) {
1944 MockQuicData mock_quic_data;
1945 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1946 1, kClientDataStreamId1, true, true,
1947 GetRequestHeaders("GET", "https", "/")));
1948 mock_quic_data.AddRead(ConstructServerRstPacket(
1949 1, false, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1950 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
1951 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1952
1953 // The non-alternate protocol job needs to hang in order to guarantee that
1954 // the alternate-protocol job will "win".
1955 AddHangingNonAlternateProtocolSocketData();
1956
1957 // In order for a new QUIC session to be established via alternate-protocol
1958 // without racing an HTTP connection, we need the host resolution to happen
1959 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1960 // connection to the the server, in this test we require confirmation
1961 // before encrypting so the HTTP job will still start.
1962 host_resolver_.set_synchronous_mode(true);
1963 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1964 "");
1965 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1966 AddressList address;
1967 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1968 nullptr, net_log_.bound());
1969
1970 CreateSession();
1971 session_->quic_stream_factory()->set_require_confirmation(true);
1972 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1973
1974 std::unique_ptr<HttpNetworkTransaction> trans(
1975 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1976 TestCompletionCallback callback;
1977 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1978 EXPECT_EQ(ERR_IO_PENDING, rv);
1979
1980 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1981 QuicSession::HANDSHAKE_CONFIRMED);
1982 // Read the headers.
1983 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
1984}
1985
[email protected]1e960032013-12-20 19:00:201986TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
[email protected]3316d422013-05-03 21:45:301987 // Alternate-protocol job
alyssar2adf3ac2016-05-03 17:12:581988 std::unique_ptr<QuicEncryptedPacket> close(
1989 ConstructServerConnectionClosePacket(1));
[email protected]3316d422013-05-03 21:45:301990 MockRead quic_reads[] = {
rchb27683c2015-07-29 23:53:501991 MockRead(ASYNC, close->data(), close->length()),
1992 MockRead(ASYNC, ERR_IO_PENDING), // No more data to read
1993 MockRead(ASYNC, OK), // EOF
[email protected]3316d422013-05-03 21:45:301994 };
rjshaded5ced072015-12-18 19:26:021995 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
1996 0);
[email protected]3316d422013-05-03 21:45:301997 socket_factory_.AddSocketDataProvider(&quic_data);
1998
1999 // Main job which will succeed even though the alternate job fails.
2000 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022001 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2002 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2003 MockRead(ASYNC, OK)};
[email protected]3316d422013-05-03 21:45:302004
rjshaded5ced072015-12-18 19:26:022005 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2006 0);
[email protected]3316d422013-05-03 21:45:302007 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562008 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]3316d422013-05-03 21:45:302009
rch3f4b8452016-02-23 16:59:322010 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:192011 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2012 SendRequestAndExpectHttpResponse("hello from http");
2013 ExpectBrokenAlternateProtocolMapping();
[email protected]3316d422013-05-03 21:45:302014}
2015
[email protected]1e960032013-12-20 19:00:202016TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
[email protected]d03a66d2013-05-06 12:55:592017 // Alternate-protocol job
2018 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022019 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]d03a66d2013-05-06 12:55:592020 };
rjshaded5ced072015-12-18 19:26:022021 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2022 0);
[email protected]d03a66d2013-05-06 12:55:592023 socket_factory_.AddSocketDataProvider(&quic_data);
2024
2025 // Main job which will succeed even though the alternate job fails.
2026 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022027 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2028 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2029 MockRead(ASYNC, OK)};
[email protected]d03a66d2013-05-06 12:55:592030
rjshaded5ced072015-12-18 19:26:022031 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2032 0);
[email protected]d03a66d2013-05-06 12:55:592033 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562034 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]d03a66d2013-05-06 12:55:592035
rch3f4b8452016-02-23 16:59:322036 CreateSession();
[email protected]d03a66d2013-05-06 12:55:592037
[email protected]aa9b14d2013-05-10 23:45:192038 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2039 SendRequestAndExpectHttpResponse("hello from http");
2040 ExpectBrokenAlternateProtocolMapping();
[email protected]d03a66d2013-05-06 12:55:592041}
2042
[email protected]00c159f2014-05-21 22:38:162043TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) {
[email protected]eb71ab62014-05-23 07:57:532044 // Alternate-protocol job will fail when the session attempts to read.
[email protected]00c159f2014-05-21 22:38:162045 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022046 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162047 };
rjshaded5ced072015-12-18 19:26:022048 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2049 0);
[email protected]00c159f2014-05-21 22:38:162050 socket_factory_.AddSocketDataProvider(&quic_data);
2051
[email protected]eb71ab62014-05-23 07:57:532052 // Main job will also fail.
[email protected]00c159f2014-05-21 22:38:162053 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022054 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162055 };
2056
rjshaded5ced072015-12-18 19:26:022057 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2058 0);
[email protected]00c159f2014-05-21 22:38:162059 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED));
2060 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562061 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]00c159f2014-05-21 22:38:162062
rtennetib8e80fb2016-05-16 00:12:092063 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322064 CreateSession();
[email protected]00c159f2014-05-21 22:38:162065
2066 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
danakjad1777e2016-04-16 00:56:422067 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]00c159f2014-05-21 22:38:162068 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2069 TestCompletionCallback callback;
2070 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2071 EXPECT_EQ(ERR_IO_PENDING, rv);
2072 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult());
2073 ExpectQuicAlternateProtocolMapping();
2074}
2075
[email protected]1e960032013-12-20 19:00:202076TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
[email protected]77c6c162013-08-17 02:57:452077 // Alternate-protocol job
2078 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022079 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]77c6c162013-08-17 02:57:452080 };
rjshaded5ced072015-12-18 19:26:022081 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2082 0);
[email protected]77c6c162013-08-17 02:57:452083 socket_factory_.AddSocketDataProvider(&quic_data);
2084
[email protected]c92c1b52014-05-31 04:16:062085 // Second Alternate-protocol job which will race with the TCP job.
2086 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:422087 nullptr, 0);
[email protected]c92c1b52014-05-31 04:16:062088 socket_factory_.AddSocketDataProvider(&quic_data2);
2089
[email protected]4d283b32013-10-17 12:57:272090 // Final job that will proceed when the QUIC job fails.
2091 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022092 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2093 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2094 MockRead(ASYNC, OK)};
[email protected]4d283b32013-10-17 12:57:272095
rjshaded5ced072015-12-18 19:26:022096 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2097 0);
[email protected]4d283b32013-10-17 12:57:272098 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562099 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d283b32013-10-17 12:57:272100
rtennetiafccbc062016-05-16 18:21:142101 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322102 CreateSession();
[email protected]77c6c162013-08-17 02:57:452103
2104 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2105
[email protected]4d283b32013-10-17 12:57:272106 SendRequestAndExpectHttpResponse("hello from http");
[email protected]77c6c162013-08-17 02:57:452107
2108 ExpectBrokenAlternateProtocolMapping();
[email protected]4d283b32013-10-17 12:57:272109
rch37de576c2015-05-17 20:28:172110 EXPECT_TRUE(quic_data.AllReadDataConsumed());
2111 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
[email protected]77c6c162013-08-17 02:57:452112}
2113
[email protected]93b31772014-06-19 08:03:352114TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) {
[email protected]65768442014-06-06 23:37:032115 // Alternate-protocol job
2116 MockRead quic_reads[] = {
mmenkee24011922015-12-17 22:12:592117 MockRead(SYNCHRONOUS, ERR_IO_PENDING),
[email protected]65768442014-06-06 23:37:032118 };
rjshaded5ced072015-12-18 19:26:022119 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2120 0);
[email protected]65768442014-06-06 23:37:032121 socket_factory_.AddSocketDataProvider(&quic_data);
2122
2123 // Main job that will proceed when the QUIC job fails.
2124 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022125 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2126 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2127 MockRead(ASYNC, OK)};
[email protected]65768442014-06-06 23:37:032128
rjshaded5ced072015-12-18 19:26:022129 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2130 0);
[email protected]65768442014-06-06 23:37:032131 socket_factory_.AddSocketDataProvider(&http_data);
2132
rtennetib8e80fb2016-05-16 00:12:092133 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322134 CreateSession();
[email protected]65768442014-06-06 23:37:032135
2136 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2137
2138 SendRequestAndExpectHttpResponse("hello from http");
2139}
2140
[email protected]eb71ab62014-05-23 07:57:532141TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
[email protected]4d590c9c2014-05-02 05:14:332142 // Alternate-protocol job will fail before creating a QUIC session.
rtennetibe635732014-10-02 22:51:422143 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0);
rjshaded5ced072015-12-18 19:26:022144 quic_data.set_connect_data(
2145 MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED));
[email protected]4d590c9c2014-05-02 05:14:332146 socket_factory_.AddSocketDataProvider(&quic_data);
2147
2148 // Main job which will succeed even though the alternate job fails.
2149 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022150 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2151 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2152 MockRead(ASYNC, OK)};
[email protected]4d590c9c2014-05-02 05:14:332153
rjshaded5ced072015-12-18 19:26:022154 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2155 0);
[email protected]4d590c9c2014-05-02 05:14:332156 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562157 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d590c9c2014-05-02 05:14:332158
rch3f4b8452016-02-23 16:59:322159 CreateSession();
[email protected]4d590c9c2014-05-02 05:14:332160 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2161 SendRequestAndExpectHttpResponse("hello from http");
[email protected]eb71ab62014-05-23 07:57:532162
2163 ExpectBrokenAlternateProtocolMapping();
[email protected]4d590c9c2014-05-02 05:14:332164}
2165
[email protected]4fee9672014-01-08 14:47:152166TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
[email protected]4fee9672014-01-08 14:47:152167 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582168 mock_quic_data.AddSynchronousRead(ConstructServerConnectionClosePacket(1));
2169 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2170 1, kClientDataStreamId1, true, true,
2171 GetRequestHeaders("GET", "https", "/")));
2172 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rcha5399e02015-04-21 19:32:042173 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4fee9672014-01-08 14:47:152174
2175 // When the QUIC connection fails, we will try the request again over HTTP.
2176 MockRead http_reads[] = {
bnc1c196c6e2016-05-28 13:51:482177 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
rchf114d982015-10-21 01:34:562178 MockRead("hello world"),
2179 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2180 MockRead(ASYNC, OK)};
[email protected]4fee9672014-01-08 14:47:152181
rjshaded5ced072015-12-18 19:26:022182 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2183 0);
[email protected]4fee9672014-01-08 14:47:152184 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562185 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4fee9672014-01-08 14:47:152186
2187 // In order for a new QUIC session to be established via alternate-protocol
2188 // without racing an HTTP connection, we need the host resolution to happen
2189 // synchronously.
2190 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:292191 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:562192 "");
rch9ae5b3b2016-02-11 00:36:292193 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]4fee9672014-01-08 14:47:152194 AddressList address;
rjshaded5ced072015-12-18 19:26:022195 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2196 nullptr, net_log_.bound());
[email protected]4fee9672014-01-08 14:47:152197
rch3f4b8452016-02-23 16:59:322198 CreateSession();
[email protected]4fee9672014-01-08 14:47:152199 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2200 SendRequestAndExpectHttpResponse("hello world");
2201}
2202
bnc508835902015-05-12 20:10:292203TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) {
alyssar2adf3ac2016-05-03 17:12:582204 client_maker_.set_hostname("www.example.org");
tbansal0f56a39a2016-04-07 22:03:382205 EXPECT_FALSE(
2206 test_socket_performance_watcher_factory_.rtt_notification_received());
bnc508835902015-05-12 20:10:292207 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582208 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2209 1, kClientDataStreamId1, true, true,
2210 GetRequestHeaders("GET", "https", "/")));
2211 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc508835902015-05-12 20:10:292212 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:582213 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
2214 false, true, 0, "hello!"));
2215 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:502216 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
bnc508835902015-05-12 20:10:292217 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2218
bncb07c05532015-05-14 19:07:202219 request_.url = GURL("https://www.example.org:443");
rtennetib8e80fb2016-05-16 00:12:092220 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322221 CreateSession();
bnc508835902015-05-12 20:10:292222 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
2223 SendRequestAndExpectQuicResponse("hello!");
tbansal0f56a39a2016-04-07 22:03:382224 EXPECT_TRUE(
2225 test_socket_performance_watcher_factory_.rtt_notification_received());
bnc508835902015-05-12 20:10:292226}
2227
rtenneti56977812016-01-15 19:26:562228TEST_P(QuicNetworkTransactionTest, QuicUpload) {
rtenneti8a2f4632016-03-21 20:26:572229 params_.origins_to_force_quic_on.insert(
2230 HostPortPair::FromString("mail.example.org:443"));
rtenneti56977812016-01-15 19:26:562231
2232 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2233 MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_FAILED, 1)};
2234 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2235 arraysize(writes));
2236 socket_factory_.AddSocketDataProvider(&socket_data);
2237
rtennetib8e80fb2016-05-16 00:12:092238 // The non-alternate protocol job needs to hang in order to guarantee that
2239 // the alternate-protocol job will "win".
2240 AddHangingNonAlternateProtocolSocketData();
2241
rch3f4b8452016-02-23 16:59:322242 params_.enable_alternative_service_with_different_host = false;
rtenneti56977812016-01-15 19:26:562243 CreateSession();
2244 request_.method = "POST";
2245 ChunkedUploadDataStream upload_data(0);
2246 upload_data.AppendData("1", 1, true);
2247
2248 request_.upload_data_stream = &upload_data;
2249
danakjad1777e2016-04-16 00:56:422250 std::unique_ptr<HttpNetworkTransaction> trans(
rtenneti56977812016-01-15 19:26:562251 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2252 TestCompletionCallback callback;
2253 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2254 EXPECT_EQ(ERR_IO_PENDING, rv);
2255 EXPECT_NE(OK, callback.WaitForResult());
2256}
2257
bnc359ed2a2016-04-29 20:43:452258class QuicNetworkTransactionWithDestinationTest
2259 : public PlatformTest,
2260 public ::testing::WithParamInterface<PoolingTestParams> {
2261 protected:
2262 QuicNetworkTransactionWithDestinationTest()
2263 : clock_(new MockClock),
2264 version_(GetParam().version),
2265 destination_type_(GetParam().destination_type),
2266 cert_transparency_verifier_(new MultiLogCTVerifier()),
2267 ssl_config_service_(new SSLConfigServiceDefaults),
2268 proxy_service_(ProxyService::CreateDirect()),
2269 auth_handler_factory_(
2270 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
2271 random_generator_(0),
2272 ssl_data_(ASYNC, OK) {}
2273
2274 void SetUp() override {
2275 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:552276 base::RunLoop().RunUntilIdle();
bnc359ed2a2016-04-29 20:43:452277
2278 HttpNetworkSession::Params params;
2279
2280 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
2281 params.quic_clock = clock_;
2282
2283 crypto_client_stream_factory_.set_handshake_mode(
2284 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2285 params.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
2286
2287 params.enable_alternative_service_with_different_host = true;
2288 params.enable_quic = true;
2289 params.quic_random = &random_generator_;
2290 params.client_socket_factory = &socket_factory_;
2291 params.host_resolver = &host_resolver_;
2292 params.cert_verifier = &cert_verifier_;
2293 params.transport_security_state = &transport_security_state_;
2294 params.cert_transparency_verifier = cert_transparency_verifier_.get();
rsleevid6de8302016-06-21 01:33:202295 params.ct_policy_enforcer = &ct_policy_enforcer_;
bnc359ed2a2016-04-29 20:43:452296 params.socket_performance_watcher_factory =
2297 &test_socket_performance_watcher_factory_;
2298 params.ssl_config_service = ssl_config_service_.get();
2299 params.proxy_service = proxy_service_.get();
2300 params.http_auth_handler_factory = auth_handler_factory_.get();
bnc525e175a2016-06-20 12:36:402301 params.http_server_properties = &http_server_properties_;
bnc359ed2a2016-04-29 20:43:452302 params.quic_supported_versions = SupportedVersions(version_);
2303 params.quic_host_whitelist.insert("news.example.org");
2304 params.quic_host_whitelist.insert("mail.example.org");
2305 params.quic_host_whitelist.insert("mail.example.com");
2306
2307 session_.reset(new HttpNetworkSession(params));
2308 session_->quic_stream_factory()->set_require_confirmation(true);
2309 ASSERT_EQ(params.quic_socket_receive_buffer_size,
2310 session_->quic_stream_factory()->socket_receive_buffer_size());
2311 }
2312
2313 void TearDown() override {
2314 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
2315 // Empty the current queue.
fdoray92e35a72016-06-10 15:54:552316 base::RunLoop().RunUntilIdle();
bnc359ed2a2016-04-29 20:43:452317 PlatformTest::TearDown();
2318 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:552319 base::RunLoop().RunUntilIdle();
bnc525e175a2016-06-20 12:36:402320 session_.reset();
bnc359ed2a2016-04-29 20:43:452321 }
2322
2323 void SetAlternativeService(const std::string& origin) {
2324 HostPortPair destination;
2325 switch (destination_type_) {
2326 case SAME_AS_FIRST:
2327 destination = HostPortPair(origin1_, 443);
2328 break;
2329 case SAME_AS_SECOND:
2330 destination = HostPortPair(origin2_, 443);
2331 break;
2332 case DIFFERENT:
2333 destination = HostPortPair(kDifferentHostname, 443);
2334 break;
2335 }
2336 AlternativeService alternative_service(QUIC, destination);
2337 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
2338 http_server_properties_.SetAlternativeService(
2339 url::SchemeHostPort("https", origin, 443), alternative_service,
2340 expiration);
2341 }
2342
alyssar2adf3ac2016-05-03 17:12:582343 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452344 QuicPacketNumber packet_number,
2345 QuicStreamId stream_id,
2346 bool should_include_version,
2347 QuicStreamOffset* offset,
2348 QuicTestPacketMaker* maker) {
2349 SpdyPriority priority =
2350 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
2351 SpdyHeaderBlock headers(maker->GetRequestHeaders("GET", "https", "/"));
2352 return maker->MakeRequestHeadersPacketWithOffsetTracking(
2353 packet_number, stream_id, should_include_version, true, priority,
bnc086b39e12016-06-24 13:05:262354 std::move(headers), offset);
bnc359ed2a2016-04-29 20:43:452355 }
2356
alyssar2adf3ac2016-05-03 17:12:582357 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452358 QuicPacketNumber packet_number,
2359 QuicStreamId stream_id,
2360 bool should_include_version,
2361 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:582362 return ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452363 packet_number, stream_id, should_include_version, nullptr, maker);
2364 }
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 QuicStreamOffset* offset,
2370 QuicTestPacketMaker* maker) {
2371 SpdyHeaderBlock headers(maker->GetResponseHeaders("200 OK"));
2372 return maker->MakeResponseHeadersPacketWithOffsetTracking(
bnc086b39e12016-06-24 13:05:262373 packet_number, stream_id, false, false, std::move(headers), offset);
bnc359ed2a2016-04-29 20:43:452374 }
2375
alyssar2adf3ac2016-05-03 17:12:582376 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:452377 QuicPacketNumber packet_number,
2378 QuicStreamId stream_id,
2379 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:582380 return ConstructServerResponseHeadersPacket(packet_number, stream_id,
2381 nullptr, maker);
bnc359ed2a2016-04-29 20:43:452382 }
2383
alyssar2adf3ac2016-05-03 17:12:582384 std::unique_ptr<QuicEncryptedPacket> ConstructServerDataPacket(
bnc359ed2a2016-04-29 20:43:452385 QuicPacketNumber packet_number,
2386 QuicStreamId stream_id,
2387 QuicTestPacketMaker* maker) {
2388 return maker->MakeDataPacket(packet_number, stream_id, false, true, 0,
2389 "hello");
2390 }
2391
alyssar2adf3ac2016-05-03 17:12:582392 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
bnc359ed2a2016-04-29 20:43:452393 QuicPacketNumber packet_number,
2394 QuicPacketNumber largest_received,
2395 QuicPacketNumber ack_least_unacked,
2396 QuicPacketNumber stop_least_unacked,
2397 QuicTestPacketMaker* maker) {
2398 return maker->MakeAckPacket(packet_number, largest_received,
2399 ack_least_unacked, stop_least_unacked, true);
2400 }
2401
2402 void AddRefusedSocketData() {
2403 std::unique_ptr<StaticSocketDataProvider> refused_data(
2404 new StaticSocketDataProvider());
2405 MockConnect refused_connect(SYNCHRONOUS, ERR_CONNECTION_REFUSED);
2406 refused_data->set_connect_data(refused_connect);
2407 socket_factory_.AddSocketDataProvider(refused_data.get());
2408 static_socket_data_provider_vector_.push_back(std::move(refused_data));
2409 }
2410
2411 void AddHangingSocketData() {
2412 std::unique_ptr<StaticSocketDataProvider> hanging_data(
2413 new StaticSocketDataProvider());
2414 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
2415 hanging_data->set_connect_data(hanging_connect);
2416 socket_factory_.AddSocketDataProvider(hanging_data.get());
2417 static_socket_data_provider_vector_.push_back(std::move(hanging_data));
2418 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
2419 }
2420
2421 bool AllDataConsumed() {
2422 for (const auto& socket_data_ptr : static_socket_data_provider_vector_) {
2423 if (!socket_data_ptr->AllReadDataConsumed() ||
2424 !socket_data_ptr->AllWriteDataConsumed()) {
2425 return false;
2426 }
2427 }
2428 return true;
2429 }
2430
2431 void SendRequestAndExpectQuicResponse(const std::string& host) {
2432 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
2433 HttpRequestInfo request;
2434 std::string url("https://");
2435 url.append(host);
2436 request.url = GURL(url);
2437 request.load_flags = 0;
2438 request.method = "GET";
2439 TestCompletionCallback callback;
2440 int rv = trans.Start(&request, callback.callback(), net_log_.bound());
2441 EXPECT_EQ(OK, callback.GetResult(rv));
2442
2443 std::string response_data;
2444 ASSERT_EQ(OK, ReadTransaction(&trans, &response_data));
2445 EXPECT_EQ("hello", response_data);
2446
2447 const HttpResponseInfo* response = trans.GetResponseInfo();
2448 ASSERT_TRUE(response != nullptr);
2449 ASSERT_TRUE(response->headers.get() != nullptr);
2450 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
2451 EXPECT_TRUE(response->was_fetched_via_spdy);
2452 EXPECT_TRUE(response->was_npn_negotiated);
2453 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
2454 response->connection_info);
2455 EXPECT_EQ(443, response->socket_address.port());
2456 }
2457
2458 MockClock* clock_;
2459 QuicVersion version_;
2460 DestinationType destination_type_;
2461 std::string origin1_;
2462 std::string origin2_;
2463 std::unique_ptr<HttpNetworkSession> session_;
2464 MockClientSocketFactory socket_factory_;
2465 MockHostResolver host_resolver_;
2466 MockCertVerifier cert_verifier_;
2467 TransportSecurityState transport_security_state_;
2468 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
rsleevid6de8302016-06-21 01:33:202469 CTPolicyEnforcer ct_policy_enforcer_;
bnc359ed2a2016-04-29 20:43:452470 TestSocketPerformanceWatcherFactory test_socket_performance_watcher_factory_;
2471 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
2472 std::unique_ptr<ProxyService> proxy_service_;
2473 std::unique_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
2474 MockRandom random_generator_;
2475 HttpServerPropertiesImpl http_server_properties_;
2476 BoundTestNetLog net_log_;
2477 MockCryptoClientStreamFactory crypto_client_stream_factory_;
2478 std::vector<std::unique_ptr<StaticSocketDataProvider>>
2479 static_socket_data_provider_vector_;
2480 SSLSocketDataProvider ssl_data_;
2481};
2482
2483INSTANTIATE_TEST_CASE_P(Version,
2484 QuicNetworkTransactionWithDestinationTest,
2485 ::testing::ValuesIn(GetPoolingTestParams()));
2486
2487// A single QUIC request fails because the certificate does not match the origin
2488// hostname, regardless of whether it matches the alternative service hostname.
2489TEST_P(QuicNetworkTransactionWithDestinationTest, InvalidCertificate) {
2490 if (destination_type_ == DIFFERENT)
2491 return;
2492
2493 GURL url("https://mail.example.com/");
2494 origin1_ = url.host();
2495
2496 // Not used for requests, but this provides a test case where the certificate
2497 // is valid for the hostname of the alternative service.
2498 origin2_ = "mail.example.org";
2499
2500 SetAlternativeService(origin1_);
2501
2502 scoped_refptr<X509Certificate> cert(
2503 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2504 bool unused;
2505 ASSERT_FALSE(cert->VerifyNameMatch(origin1_, &unused));
2506 ASSERT_TRUE(cert->VerifyNameMatch(origin2_, &unused));
2507
2508 ProofVerifyDetailsChromium verify_details;
2509 verify_details.cert_verify_result.verified_cert = cert;
2510 verify_details.cert_verify_result.is_issued_by_known_root = true;
2511 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2512
2513 MockQuicData mock_quic_data;
2514 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);
2515 mock_quic_data.AddRead(ASYNC, 0);
2516
2517 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2518
2519 AddRefusedSocketData();
2520
2521 HttpRequestInfo request;
2522 request.url = url;
2523
2524 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
2525 TestCompletionCallback callback;
2526 int rv = trans.Start(&request, callback.callback(), net_log_.bound());
2527 EXPECT_EQ(ERR_CONNECTION_REFUSED, callback.GetResult(rv));
2528
2529 EXPECT_TRUE(AllDataConsumed());
2530}
2531
2532// First request opens QUIC session to alternative service. Second request
2533// pools to it, because destination matches and certificate is valid, even
2534// though QuicServerId is different.
2535TEST_P(QuicNetworkTransactionWithDestinationTest, PoolIfCertificateValid) {
2536 origin1_ = "mail.example.org";
2537 origin2_ = "news.example.org";
2538
2539 SetAlternativeService(origin1_);
2540 SetAlternativeService(origin2_);
2541
2542 scoped_refptr<X509Certificate> cert(
2543 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2544 bool unused;
2545 ASSERT_TRUE(cert->VerifyNameMatch(origin1_, &unused));
2546 ASSERT_TRUE(cert->VerifyNameMatch(origin2_, &unused));
2547 ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname, &unused));
2548
2549 ProofVerifyDetailsChromium verify_details;
2550 verify_details.cert_verify_result.verified_cert = cert;
2551 verify_details.cert_verify_result.is_issued_by_known_root = true;
2552 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2553
alyssar2adf3ac2016-05-03 17:12:582554 QuicTestPacketMaker client_maker1(version_, 0, clock_, origin1_,
2555 Perspective::IS_CLIENT);
2556 QuicTestPacketMaker server_maker1(version_, 0, clock_, origin1_,
2557 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452558
2559 QuicStreamOffset request_header_offset(0);
2560 QuicStreamOffset response_header_offset(0);
2561
2562 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582563 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2564 1, kClientDataStreamId1, true, &request_header_offset, &client_maker1));
2565 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2566 1, kClientDataStreamId1, &response_header_offset, &server_maker1));
2567 mock_quic_data.AddRead(
2568 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker1));
2569 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 2, 1, 1, &client_maker1));
bnc359ed2a2016-04-29 20:43:452570
alyssar2adf3ac2016-05-03 17:12:582571 QuicTestPacketMaker client_maker2(version_, 0, clock_, origin2_,
2572 Perspective::IS_CLIENT);
2573 QuicTestPacketMaker server_maker2(version_, 0, clock_, origin2_,
2574 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452575
alyssar2adf3ac2016-05-03 17:12:582576 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2577 3, kClientDataStreamId2, false, &request_header_offset, &client_maker2));
2578 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2579 3, kClientDataStreamId2, &response_header_offset, &server_maker2));
2580 mock_quic_data.AddRead(
2581 ConstructServerDataPacket(4, kClientDataStreamId2, &server_maker2));
2582 mock_quic_data.AddWrite(ConstructClientAckPacket(4, 4, 3, 1, &client_maker2));
bnc359ed2a2016-04-29 20:43:452583 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2584 mock_quic_data.AddRead(ASYNC, 0); // EOF
2585
2586 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2587
2588 AddHangingSocketData();
2589 AddHangingSocketData();
2590
2591 SendRequestAndExpectQuicResponse(origin1_);
2592 SendRequestAndExpectQuicResponse(origin2_);
2593
2594 EXPECT_TRUE(AllDataConsumed());
2595}
2596
2597// First request opens QUIC session to alternative service. Second request does
2598// not pool to it, even though destination matches, because certificate is not
2599// valid. Instead, a new QUIC session is opened to the same destination with a
2600// different QuicServerId.
2601TEST_P(QuicNetworkTransactionWithDestinationTest,
2602 DoNotPoolIfCertificateInvalid) {
2603 origin1_ = "news.example.org";
2604 origin2_ = "mail.example.com";
2605
2606 SetAlternativeService(origin1_);
2607 SetAlternativeService(origin2_);
2608
2609 scoped_refptr<X509Certificate> cert1(
2610 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2611 bool unused;
2612 ASSERT_TRUE(cert1->VerifyNameMatch(origin1_, &unused));
2613 ASSERT_FALSE(cert1->VerifyNameMatch(origin2_, &unused));
2614 ASSERT_FALSE(cert1->VerifyNameMatch(kDifferentHostname, &unused));
2615
2616 scoped_refptr<X509Certificate> cert2(
2617 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
2618 ASSERT_TRUE(cert2->VerifyNameMatch(origin2_, &unused));
2619 ASSERT_FALSE(cert2->VerifyNameMatch(kDifferentHostname, &unused));
2620
2621 ProofVerifyDetailsChromium verify_details1;
2622 verify_details1.cert_verify_result.verified_cert = cert1;
2623 verify_details1.cert_verify_result.is_issued_by_known_root = true;
2624 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
2625
2626 ProofVerifyDetailsChromium verify_details2;
2627 verify_details2.cert_verify_result.verified_cert = cert2;
2628 verify_details2.cert_verify_result.is_issued_by_known_root = true;
2629 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
2630
alyssar2adf3ac2016-05-03 17:12:582631 QuicTestPacketMaker client_maker1(version_, 0, clock_, origin1_,
2632 Perspective::IS_CLIENT);
2633 QuicTestPacketMaker server_maker1(version_, 0, clock_, origin1_,
2634 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452635
2636 MockQuicData mock_quic_data1;
alyssar2adf3ac2016-05-03 17:12:582637 mock_quic_data1.AddWrite(ConstructClientRequestHeadersPacket(
2638 1, kClientDataStreamId1, true, &client_maker1));
2639 mock_quic_data1.AddRead(ConstructServerResponseHeadersPacket(
2640 1, kClientDataStreamId1, &server_maker1));
2641 mock_quic_data1.AddRead(
2642 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker1));
bnc359ed2a2016-04-29 20:43:452643 mock_quic_data1.AddWrite(
alyssar2adf3ac2016-05-03 17:12:582644 ConstructClientAckPacket(2, 2, 1, 1, &client_maker1));
bnc359ed2a2016-04-29 20:43:452645 mock_quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2646 mock_quic_data1.AddRead(ASYNC, 0); // EOF
2647
2648 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
2649
2650 AddHangingSocketData();
2651
alyssar2adf3ac2016-05-03 17:12:582652 QuicTestPacketMaker client_maker2(version_, 0, clock_, origin2_,
2653 Perspective::IS_CLIENT);
2654 QuicTestPacketMaker server_maker2(version_, 0, clock_, origin2_,
2655 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452656
2657 MockQuicData mock_quic_data2;
alyssar2adf3ac2016-05-03 17:12:582658 mock_quic_data2.AddWrite(ConstructClientRequestHeadersPacket(
2659 1, kClientDataStreamId1, true, &client_maker2));
2660 mock_quic_data2.AddRead(ConstructServerResponseHeadersPacket(
2661 1, kClientDataStreamId1, &server_maker2));
2662 mock_quic_data2.AddRead(
2663 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker2));
bnc359ed2a2016-04-29 20:43:452664 mock_quic_data2.AddWrite(
alyssar2adf3ac2016-05-03 17:12:582665 ConstructClientAckPacket(2, 2, 1, 1, &client_maker2));
bnc359ed2a2016-04-29 20:43:452666 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2667 mock_quic_data2.AddRead(ASYNC, 0); // EOF
2668
2669 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
2670
2671 AddHangingSocketData();
2672
2673 SendRequestAndExpectQuicResponse(origin1_);
2674 SendRequestAndExpectQuicResponse(origin2_);
2675
2676 EXPECT_TRUE(AllDataConsumed());
2677}
2678
[email protected]61a527782013-02-21 03:58:002679} // namespace test
2680} // namespace net