blob: 7902832c15278e08aa69060d48386007004188b3 [file] [log] [blame]
[email protected]61a527782013-02-21 03:58:001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
danakjad1777e2016-04-16 00:56:425#include <memory>
bnc359ed2a2016-04-29 20:43:456#include <ostream>
bnc912a04b2016-04-20 14:19:507#include <string>
8#include <utility>
[email protected]1e960032013-12-20 19:00:209#include <vector>
10
[email protected]61a527782013-02-21 03:58:0011#include "base/compiler_specific.h"
Avi Drissman13fc8932015-12-20 04:40:4612#include "base/macros.h"
mmenke651bae7f2015-12-18 21:26:4513#include "base/run_loop.h"
[email protected]98b20ce2013-05-10 05:55:2614#include "base/stl_util.h"
bnc8be55ebb2015-10-30 14:12:0715#include "base/strings/stringprintf.h"
rtenneti56977812016-01-15 19:26:5616#include "net/base/chunked_upload_data_stream.h"
[email protected]61a527782013-02-21 03:58:0017#include "net/base/test_completion_callback.h"
rsleevid6de8302016-06-21 01:33:2018#include "net/cert/ct_policy_enforcer.h"
[email protected]6e7845ae2013-03-29 21:48:1119#include "net/cert/mock_cert_verifier.h"
rtenneti052774e2015-11-24 21:00:1220#include "net/cert/multi_log_ct_verifier.h"
[email protected]f2cb3cf2013-03-21 01:40:5321#include "net/dns/mock_host_resolver.h"
[email protected]61a527782013-02-21 03:58:0022#include "net/http/http_auth_handler_factory.h"
23#include "net/http/http_network_session.h"
24#include "net/http/http_network_transaction.h"
25#include "net/http/http_server_properties_impl.h"
26#include "net/http/http_stream.h"
27#include "net/http/http_stream_factory.h"
[email protected]c41737d2014-05-14 07:47:1928#include "net/http/http_transaction_test_util.h"
[email protected]b1c988b2013-06-13 06:48:1129#include "net/http/transport_security_state.h"
vishal.b62985ca92015-04-17 08:45:5130#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4631#include "net/log/test_net_log_entry.h"
32#include "net/log/test_net_log_util.h"
[email protected]61a527782013-02-21 03:58:0033#include "net/proxy/proxy_config_service_fixed.h"
34#include "net/proxy/proxy_resolver.h"
35#include "net/proxy/proxy_service.h"
bnc508835902015-05-12 20:10:2936#include "net/quic/crypto/proof_verifier_chromium.h"
[email protected]61a527782013-02-21 03:58:0037#include "net/quic/crypto/quic_decrypter.h"
38#include "net/quic/crypto/quic_encrypter.h"
39#include "net/quic/quic_framer.h"
[email protected]24e5bc52013-09-18 15:36:5840#include "net/quic/quic_http_utils.h"
[email protected]ed3fc15d2013-03-08 18:37:4441#include "net/quic/test_tools/crypto_test_utils.h"
[email protected]61a527782013-02-21 03:58:0042#include "net/quic/test_tools/mock_clock.h"
[email protected]e8ff26842013-03-22 21:02:0543#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
[email protected]61a527782013-02-21 03:58:0044#include "net/quic/test_tools/mock_random.h"
[email protected]1e960032013-12-20 19:00:2045#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]61a527782013-02-21 03:58:0046#include "net/quic/test_tools/quic_test_utils.h"
47#include "net/socket/client_socket_factory.h"
48#include "net/socket/mock_client_socket_pool_manager.h"
tbansalca83c002016-04-28 20:56:2849#include "net/socket/socket_performance_watcher.h"
50#include "net/socket/socket_performance_watcher_factory.h"
[email protected]61a527782013-02-21 03:58:0051#include "net/socket/socket_test_util.h"
52#include "net/socket/ssl_client_socket.h"
53#include "net/spdy/spdy_frame_builder.h"
54#include "net/spdy/spdy_framer.h"
[email protected]536fd0b2013-03-14 17:41:5755#include "net/ssl/ssl_config_service_defaults.h"
bnc508835902015-05-12 20:10:2956#include "net/test/cert_test_util.h"
robpercival214763f2016-07-01 23:27:0157#include "net/test/gtest_util.h"
rsleevia69c79a2016-06-22 03:28:4358#include "net/test/test_data_directory.h"
robpercival214763f2016-07-01 23:27:0159#include "testing/gmock/include/gmock/gmock.h"
[email protected]61a527782013-02-21 03:58:0060#include "testing/gtest/include/gtest/gtest.h"
61#include "testing/platform_test.h"
zhongyi3d4a55e72016-04-22 20:36:4662#include "url/gurl.h"
[email protected]61a527782013-02-21 03:58:0063
robpercival214763f2016-07-01 23:27:0164using net::test::IsError;
65using net::test::IsOk;
66
bnc508835902015-05-12 20:10:2967namespace net {
68namespace test {
[email protected]61a527782013-02-21 03:58:0069
70namespace {
71
bnc359ed2a2016-04-29 20:43:4572enum DestinationType {
73 // In pooling tests with two requests for different origins to the same
74 // destination, the destination should be
75 SAME_AS_FIRST, // the same as the first origin,
76 SAME_AS_SECOND, // the same as the second origin, or
77 DIFFERENT, // different from both.
78};
79
rchf114d982015-10-21 01:34:5680static const char kQuicAlternativeServiceHeader[] =
bncc958faa2015-07-31 18:14:5281 "Alt-Svc: quic=\":443\"\r\n\r\n";
rchf47265dc2016-03-21 21:33:1282static const char kQuicAlternativeServiceWithProbabilityHeader[] =
83 "Alt-Svc: quic=\":443\";p=\".5\"\r\n\r\n";
rchf114d982015-10-21 01:34:5684static const char kQuicAlternativeServiceDifferentPortHeader[] =
85 "Alt-Svc: quic=\":137\"\r\n\r\n";
[email protected]1e960032013-12-20 19:00:2086
rch9ae5b3b2016-02-11 00:36:2987const char kDefaultServerHostName[] = "mail.example.org";
bnc359ed2a2016-04-29 20:43:4588const char kDifferentHostname[] = "different.example.com";
89
90// Run QuicNetworkTransactionWithDestinationTest instances with all value
91// combinations of version and destination_type.
92struct PoolingTestParams {
93 friend std::ostream& operator<<(std::ostream& os,
94 const PoolingTestParams& p) {
95 os << "{ version: " << QuicVersionToString(p.version)
96 << ", destination_type: ";
97 switch (p.destination_type) {
98 case SAME_AS_FIRST:
99 os << "SAME_AS_FIRST";
100 break;
101 case SAME_AS_SECOND:
102 os << "SAME_AS_SECOND";
103 break;
104 case DIFFERENT:
105 os << "DIFFERENT";
106 break;
107 }
108 os << " }";
109 return os;
110 }
111
112 QuicVersion version;
113 DestinationType destination_type;
114};
115
116std::vector<PoolingTestParams> GetPoolingTestParams() {
117 std::vector<PoolingTestParams> params;
118 QuicVersionVector all_supported_versions = QuicSupportedVersions();
119 for (const QuicVersion version : all_supported_versions) {
120 params.push_back(PoolingTestParams{version, SAME_AS_FIRST});
121 params.push_back(PoolingTestParams{version, SAME_AS_SECOND});
122 params.push_back(PoolingTestParams{version, DIFFERENT});
123 }
124 return params;
125}
bncb07c05532015-05-14 19:07:20126
[email protected]61a527782013-02-21 03:58:00127} // namespace
128
[email protected]1e960032013-12-20 19:00:20129// Helper class to encapsulate MockReads and MockWrites for QUIC.
130// Simplify ownership issues and the interaction with the MockSocketFactory.
131class MockQuicData {
132 public:
rtennetia004d332015-08-28 06:44:57133 MockQuicData() : packet_number_(0) {}
rcha5399e02015-04-21 19:32:04134
rjshaded5ced072015-12-18 19:26:02135 ~MockQuicData() { STLDeleteElements(&packets_); }
[email protected]1e960032013-12-20 19:00:20136
danakjad1777e2016-04-16 00:56:42137 void AddSynchronousRead(std::unique_ptr<QuicEncryptedPacket> packet) {
[email protected]1e960032013-12-20 19:00:20138 reads_.push_back(MockRead(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:57139 packet_number_++));
[email protected]1e960032013-12-20 19:00:20140 packets_.push_back(packet.release());
141 }
142
danakjad1777e2016-04-16 00:56:42143 void AddRead(std::unique_ptr<QuicEncryptedPacket> packet) {
rcha5399e02015-04-21 19:32:04144 reads_.push_back(
rtennetia004d332015-08-28 06:44:57145 MockRead(ASYNC, packet->data(), packet->length(), packet_number_++));
rcha5399e02015-04-21 19:32:04146 packets_.push_back(packet.release());
147 }
148
[email protected]1e960032013-12-20 19:00:20149 void AddRead(IoMode mode, int rv) {
rtennetia004d332015-08-28 06:44:57150 reads_.push_back(MockRead(mode, rv, packet_number_++));
[email protected]1e960032013-12-20 19:00:20151 }
152
danakjad1777e2016-04-16 00:56:42153 void AddWrite(std::unique_ptr<QuicEncryptedPacket> packet) {
[email protected]1e960032013-12-20 19:00:20154 writes_.push_back(MockWrite(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:57155 packet_number_++));
[email protected]1e960032013-12-20 19:00:20156 packets_.push_back(packet.release());
157 }
158
rcha5399e02015-04-21 19:32:04159 void AddSocketDataToFactory(MockClientSocketFactory* factory) {
rjshaded5ced072015-12-18 19:26:02160 MockRead* reads = reads_.empty() ? nullptr : &reads_[0];
161 MockWrite* writes = writes_.empty() ? nullptr : &writes_[0];
rcha5399e02015-04-21 19:32:04162 socket_data_.reset(
163 new SequencedSocketData(reads, reads_.size(), writes, writes_.size()));
[email protected]1e960032013-12-20 19:00:20164 factory->AddSocketDataProvider(socket_data_.get());
165 }
166
mmenkee24011922015-12-17 22:12:59167 void Resume() { socket_data_->Resume(); }
rchb27683c2015-07-29 23:53:50168
[email protected]1e960032013-12-20 19:00:20169 private:
170 std::vector<QuicEncryptedPacket*> packets_;
171 std::vector<MockWrite> writes_;
172 std::vector<MockRead> reads_;
rtennetia004d332015-08-28 06:44:57173 size_t packet_number_;
danakjad1777e2016-04-16 00:56:42174 std::unique_ptr<SequencedSocketData> socket_data_;
[email protected]1e960032013-12-20 19:00:20175};
176
ryansturm49a8cb12016-06-15 16:51:09177class HeadersHandler {
tbansal7cec3812015-02-05 21:25:12178 public:
ryansturm49a8cb12016-06-15 16:51:09179 HeadersHandler() : was_proxied_(false) {}
tbansal7cec3812015-02-05 21:25:12180
ryansturm49a8cb12016-06-15 16:51:09181 bool was_proxied() { return was_proxied_; }
tbansal7cec3812015-02-05 21:25:12182
ryansturm49a8cb12016-06-15 16:51:09183 void OnBeforeHeadersSent(const ProxyInfo& proxy_info,
184 HttpRequestHeaders* request_headers) {
185 if (!proxy_info.is_http() && !proxy_info.is_https() &&
186 !proxy_info.is_quic()) {
187 return;
188 }
189 was_proxied_ = true;
tbansal7cec3812015-02-05 21:25:12190 }
191
192 private:
ryansturm49a8cb12016-06-15 16:51:09193 bool was_proxied_;
tbansal7cec3812015-02-05 21:25:12194};
195
tbansal0f56a39a2016-04-07 22:03:38196class TestSocketPerformanceWatcher : public SocketPerformanceWatcher {
tbansalfdf5665b2015-09-21 22:46:40197 public:
tbansal0f56a39a2016-04-07 22:03:38198 explicit TestSocketPerformanceWatcher(bool* rtt_notification_received)
199 : rtt_notification_received_(rtt_notification_received) {}
200 ~TestSocketPerformanceWatcher() override {}
tbansalfdf5665b2015-09-21 22:46:40201
tbansal0f56a39a2016-04-07 22:03:38202 bool ShouldNotifyUpdatedRTT() const override { return true; }
tbansalfdf5665b2015-09-21 22:46:40203
tbansal0f56a39a2016-04-07 22:03:38204 void OnUpdatedRTTAvailable(const base::TimeDelta& rtt) override {
205 *rtt_notification_received_ = true;
206 }
207
208 void OnConnectionChanged() override {}
209
210 private:
211 bool* rtt_notification_received_;
212
213 DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcher);
214};
215
216class TestSocketPerformanceWatcherFactory
217 : public SocketPerformanceWatcherFactory {
218 public:
219 TestSocketPerformanceWatcherFactory()
220 : watcher_count_(0u), rtt_notification_received_(false) {}
221 ~TestSocketPerformanceWatcherFactory() override {}
222
223 // SocketPerformanceWatcherFactory implementation:
danakjad1777e2016-04-16 00:56:42224 std::unique_ptr<SocketPerformanceWatcher> CreateSocketPerformanceWatcher(
tbansalc8a94ea2015-11-02 23:58:51225 const Protocol protocol) override {
226 if (protocol != PROTOCOL_QUIC) {
tbansal0f56a39a2016-04-07 22:03:38227 return nullptr;
tbansalc8a94ea2015-11-02 23:58:51228 }
229 ++watcher_count_;
danakjad1777e2016-04-16 00:56:42230 return std::unique_ptr<SocketPerformanceWatcher>(
tbansal0f56a39a2016-04-07 22:03:38231 new TestSocketPerformanceWatcher(&rtt_notification_received_));
tbansalfdf5665b2015-09-21 22:46:40232 }
233
tbansalc8a94ea2015-11-02 23:58:51234 size_t watcher_count() const { return watcher_count_; }
tbansalfdf5665b2015-09-21 22:46:40235
tbansalc8a94ea2015-11-02 23:58:51236 bool rtt_notification_received() const { return rtt_notification_received_; }
237
tbansalc8a94ea2015-11-02 23:58:51238 private:
tbansal0f56a39a2016-04-07 22:03:38239 size_t watcher_count_;
tbansalc8a94ea2015-11-02 23:58:51240 bool rtt_notification_received_;
tbansal0f56a39a2016-04-07 22:03:38241
242 DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcherFactory);
tbansalc8a94ea2015-11-02 23:58:51243};
244
[email protected]1e960032013-12-20 19:00:20245class QuicNetworkTransactionTest
246 : public PlatformTest,
[email protected]5d03bbd2014-03-07 16:19:16247 public ::testing::WithParamInterface<QuicVersion> {
[email protected]61a527782013-02-21 03:58:00248 protected:
[email protected]1c04f9522013-02-21 20:32:43249 QuicNetworkTransactionTest()
rtenneti4b06ae72014-08-26 03:43:43250 : clock_(new MockClock),
alyssar2adf3ac2016-05-03 17:12:58251 client_maker_(GetParam(),
252 0,
253 clock_,
254 kDefaultServerHostName,
255 Perspective::IS_CLIENT),
256 server_maker_(GetParam(),
257 0,
258 clock_,
259 kDefaultServerHostName,
260 Perspective::IS_SERVER),
rtenneti052774e2015-11-24 21:00:12261 cert_transparency_verifier_(new MultiLogCTVerifier()),
[email protected]1c04f9522013-02-21 20:32:43262 ssl_config_service_(new SSLConfigServiceDefaults),
263 proxy_service_(ProxyService::CreateDirect()),
264 auth_handler_factory_(
[email protected]dda75ab2013-06-22 22:43:30265 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
[email protected]457d6952013-12-13 09:24:58266 random_generator_(0),
rchf114d982015-10-21 01:34:56267 ssl_data_(ASYNC, OK) {
[email protected]aa9b14d2013-05-10 23:45:19268 request_.method = "GET";
rchf114d982015-10-21 01:34:56269 std::string url("https://");
bncb07c05532015-05-14 19:07:20270 url.append(kDefaultServerHostName);
271 request_.url = GURL(url);
[email protected]aa9b14d2013-05-10 23:45:19272 request_.load_flags = 0;
[email protected]98a9d1252014-04-04 00:43:59273 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
rchf114d982015-10-21 01:34:56274
275 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29276 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
rchf114d982015-10-21 01:34:56277 verify_details_.cert_verify_result.verified_cert = cert;
278 verify_details_.cert_verify_result.is_issued_by_known_root = true;
279 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
[email protected]1c04f9522013-02-21 20:32:43280 }
[email protected]61a527782013-02-21 03:58:00281
dcheng67be2b1f2014-10-27 21:47:29282 void SetUp() override {
[email protected]61a527782013-02-21 03:58:00283 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:55284 base::RunLoop().RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00285 }
286
dcheng67be2b1f2014-10-27 21:47:29287 void TearDown() override {
[email protected]61a527782013-02-21 03:58:00288 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
289 // Empty the current queue.
fdoray92e35a72016-06-10 15:54:55290 base::RunLoop().RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00291 PlatformTest::TearDown();
292 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:55293 base::RunLoop().RunUntilIdle();
bnc525e175a2016-06-20 12:36:40294 session_.reset();
[email protected]61a527782013-02-21 03:58:00295 }
296
alyssar2adf3ac2016-05-03 17:12:58297 std::unique_ptr<QuicEncryptedPacket> ConstructClientConnectionClosePacket(
rtennetia004d332015-08-28 06:44:57298 QuicPacketNumber num) {
alyssar2adf3ac2016-05-03 17:12:58299 return client_maker_.MakeConnectionClosePacket(num);
[email protected]3316d422013-05-03 21:45:30300 }
301
alyssar2adf3ac2016-05-03 17:12:58302 std::unique_ptr<QuicEncryptedPacket> ConstructServerConnectionClosePacket(
303 QuicPacketNumber num) {
304 return server_maker_.MakeConnectionClosePacket(num);
305 }
306
307 std::unique_ptr<QuicEncryptedPacket> ConstructServerGoAwayPacket(
zhongyi6b5a3892016-03-12 04:46:20308 QuicPacketNumber num,
309 QuicErrorCode error_code,
310 std::string reason_phrase) {
alyssar2adf3ac2016-05-03 17:12:58311 return server_maker_.MakeGoAwayPacket(num, error_code, reason_phrase);
zhongyi6b5a3892016-03-12 04:46:20312 }
313
alyssar2adf3ac2016-05-03 17:12:58314 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
rtennetia004d332015-08-28 06:44:57315 QuicPacketNumber largest_received,
316 QuicPacketNumber least_unacked) {
alyssar2adf3ac2016-05-03 17:12:58317 return client_maker_.MakeAckPacket(2, largest_received, least_unacked,
318 least_unacked, true);
zhongyi32569c62016-01-08 02:54:30319 }
320
zhongyi76cfa7602016-07-12 19:56:27321 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
322 QuicPacketNumber packet_number,
323 QuicPacketNumber largest_received,
324 QuicPacketNumber ack_least_unacked,
325 QuicPacketNumber stop_least_unacked) {
326 return client_maker_.MakeAckPacket(packet_number, largest_received,
327 ack_least_unacked, stop_least_unacked,
328 true);
329 }
330
alyssar2adf3ac2016-05-03 17:12:58331 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckAndRstPacket(
zhongyi6b5a3892016-03-12 04:46:20332 QuicPacketNumber num,
333 QuicStreamId stream_id,
334 QuicRstStreamErrorCode error_code,
335 QuicPacketNumber largest_received,
336 QuicPacketNumber ack_least_unacked,
337 QuicPacketNumber stop_least_unacked) {
alyssar2adf3ac2016-05-03 17:12:58338 return client_maker_.MakeAckAndRstPacket(
339 num, false, stream_id, error_code, largest_received, ack_least_unacked,
340 stop_least_unacked, true);
zhongyi6b5a3892016-03-12 04:46:20341 }
342
alyssar2adf3ac2016-05-03 17:12:58343 std::unique_ptr<QuicEncryptedPacket>
344 ConstructClientAckAndConnectionClosePacket(
zhongyi32569c62016-01-08 02:54:30345 QuicPacketNumber packet_number,
346 QuicPacketNumber largest_received,
347 QuicPacketNumber ack_least_unacked,
348 QuicPacketNumber stop_least_unacked) {
alyssar2adf3ac2016-05-03 17:12:58349 return client_maker_.MakeAckPacket(packet_number, largest_received,
350 ack_least_unacked, stop_least_unacked,
351 true);
[email protected]1e960032013-12-20 19:00:20352 }
[email protected]61a527782013-02-21 03:58:00353
alyssar2adf3ac2016-05-03 17:12:58354 std::unique_ptr<QuicEncryptedPacket>
355 ConstructClientAckAndConnectionClosePacket(
zhongyica364fbb2015-12-12 03:39:12356 QuicPacketNumber num,
357 QuicTime::Delta delta_time_largest_observed,
358 QuicPacketNumber largest_received,
359 QuicPacketNumber least_unacked,
360 QuicErrorCode quic_error,
bnc912a04b2016-04-20 14:19:50361 const std::string& quic_error_details) {
alyssar2adf3ac2016-05-03 17:12:58362 return client_maker_.MakeAckAndConnectionClosePacket(
zhongyica364fbb2015-12-12 03:39:12363 num, false, delta_time_largest_observed, largest_received,
364 least_unacked, quic_error, quic_error_details);
365 }
366
alyssar2adf3ac2016-05-03 17:12:58367 std::unique_ptr<QuicEncryptedPacket> ConstructServerRstPacket(
zhongyica364fbb2015-12-12 03:39:12368 QuicPacketNumber num,
369 bool include_version,
370 QuicStreamId stream_id,
371 QuicRstStreamErrorCode error_code) {
alyssar2adf3ac2016-05-03 17:12:58372 return server_maker_.MakeRstPacket(num, include_version, stream_id,
373 error_code);
zhongyica364fbb2015-12-12 03:39:12374 }
375
zhongyi32569c62016-01-08 02:54:30376 // Uses default QuicTestPacketMaker.
[email protected]1e960032013-12-20 19:00:20377 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
378 const std::string& scheme,
379 const std::string& path) {
alyssar2adf3ac2016-05-03 17:12:58380 return GetRequestHeaders(method, scheme, path, &client_maker_);
zhongyi32569c62016-01-08 02:54:30381 }
382
383 // Uses customized QuicTestPacketMaker.
384 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
385 const std::string& scheme,
386 const std::string& path,
bnc912a04b2016-04-20 14:19:50387 QuicTestPacketMaker* maker) {
388 return maker->GetRequestHeaders(method, scheme, path);
[email protected]61a527782013-02-21 03:58:00389 }
390
[email protected]1e960032013-12-20 19:00:20391 SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
alyssar2adf3ac2016-05-03 17:12:58392 return server_maker_.GetResponseHeaders(status);
[email protected]61a527782013-02-21 03:58:00393 }
394
zhongyi32569c62016-01-08 02:54:30395 // Appends alt_svc headers in the response headers.
396 SpdyHeaderBlock GetResponseHeaders(const std::string& status,
397 const std::string& alt_svc) {
alyssar2adf3ac2016-05-03 17:12:58398 return server_maker_.GetResponseHeaders(status, alt_svc);
zhongyi32569c62016-01-08 02:54:30399 }
400
alyssar2adf3ac2016-05-03 17:12:58401 std::unique_ptr<QuicEncryptedPacket> ConstructServerDataPacket(
rtennetia004d332015-08-28 06:44:57402 QuicPacketNumber packet_number,
[email protected]98b20ce2013-05-10 05:55:26403 QuicStreamId stream_id,
[email protected]e8ff26842013-03-22 21:02:05404 bool should_include_version,
[email protected]61a527782013-02-21 03:58:00405 bool fin,
406 QuicStreamOffset offset,
407 base::StringPiece data) {
alyssar2adf3ac2016-05-03 17:12:58408 return server_maker_.MakeDataPacket(
409 packet_number, stream_id, should_include_version, fin, offset, data);
[email protected]61a527782013-02-21 03:58:00410 }
411
ckrasicda193a82016-07-09 00:39:36412 std::unique_ptr<QuicEncryptedPacket> ConstructClientDataPacket(
413 QuicPacketNumber packet_number,
414 QuicStreamId stream_id,
415 bool should_include_version,
416 bool fin,
417 QuicStreamOffset offset,
418 base::StringPiece data) {
419 return client_maker_.MakeDataPacket(
420 packet_number, stream_id, should_include_version, fin, offset, data);
421 }
422
423 std::unique_ptr<QuicEncryptedPacket> ConstructClientForceHolDataPacket(
424 QuicPacketNumber packet_number,
425 QuicStreamId stream_id,
426 bool should_include_version,
427 bool fin,
428 QuicStreamOffset* offset,
429 base::StringPiece data) {
430 return client_maker_.MakeForceHolDataPacket(
431 packet_number, stream_id, should_include_version, fin, offset, data);
432 }
433
alyssar2adf3ac2016-05-03 17:12:58434 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
rtennetia004d332015-08-28 06:44:57435 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20436 QuicStreamId stream_id,
437 bool should_include_version,
438 bool fin,
bnc086b39e12016-06-24 13:05:26439 SpdyHeaderBlock headers,
zhongyi32569c62016-01-08 02:54:30440 QuicStreamOffset* offset) {
ianswett0888cff2015-11-24 17:42:16441 SpdyPriority priority =
rtennetif4bdb542015-01-21 14:33:05442 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
alyssar2adf3ac2016-05-03 17:12:58443 return client_maker_.MakeRequestHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30444 packet_number, stream_id, should_include_version, fin, priority,
bnc94893a72016-06-30 13:45:25445 std::move(headers), offset);
zhongyi32569c62016-01-08 02:54:30446 }
447
alyssar2adf3ac2016-05-03 17:12:58448 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30449 QuicPacketNumber packet_number,
450 QuicStreamId stream_id,
451 bool should_include_version,
452 bool fin,
bnc086b39e12016-06-24 13:05:26453 SpdyHeaderBlock headers) {
zhongyi76cfa7602016-07-12 19:56:27454 return ConstructClientRequestHeadersPacket(packet_number, stream_id,
455 should_include_version, fin,
456 std::move(headers), nullptr);
[email protected]61a527782013-02-21 03:58:00457 }
458
ckrasic769733c2016-06-30 00:42:13459 std::unique_ptr<QuicEncryptedPacket> ConstructServerPushPromisePacket(
460 QuicPacketNumber packet_number,
461 QuicStreamId stream_id,
462 QuicStreamId promised_stream_id,
463 bool should_include_version,
464 SpdyHeaderBlock headers,
465 QuicStreamOffset* offset,
466 QuicTestPacketMaker* maker) {
467 return maker->MakePushPromisePacket(
468 packet_number, stream_id, promised_stream_id, should_include_version,
469 false, std::move(headers), nullptr, offset);
470 }
471
alyssar2adf3ac2016-05-03 17:12:58472 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
rtennetia004d332015-08-28 06:44:57473 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20474 QuicStreamId stream_id,
475 bool should_include_version,
476 bool fin,
bnc086b39e12016-06-24 13:05:26477 SpdyHeaderBlock headers) {
zhongyi76cfa7602016-07-12 19:56:27478 return ConstructServerResponseHeadersPacket(packet_number, stream_id,
479 should_include_version, fin,
480 std::move(headers), nullptr);
zhongyi32569c62016-01-08 02:54:30481 }
482
alyssar2adf3ac2016-05-03 17:12:58483 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30484 QuicPacketNumber packet_number,
485 QuicStreamId stream_id,
486 bool should_include_version,
487 bool fin,
bnc086b39e12016-06-24 13:05:26488 SpdyHeaderBlock headers,
zhongyi32569c62016-01-08 02:54:30489 QuicStreamOffset* offset) {
alyssar2adf3ac2016-05-03 17:12:58490 return server_maker_.MakeResponseHeadersPacketWithOffsetTracking(
bnc94893a72016-06-30 13:45:25491 packet_number, stream_id, should_include_version, fin,
492 std::move(headers), offset);
zhongyi32569c62016-01-08 02:54:30493 }
494
bnc912a04b2016-04-20 14:19:50495 void CreateSession() {
[email protected]4dca587c2013-03-07 16:54:47496 params_.enable_quic = true;
497 params_.quic_clock = clock_;
498 params_.quic_random = &random_generator_;
bnc912a04b2016-04-20 14:19:50499 params_.client_socket_factory = &socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05500 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43501 params_.host_resolver = &host_resolver_;
502 params_.cert_verifier = &cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11503 params_.transport_security_state = &transport_security_state_;
rtenneti052774e2015-11-24 21:00:12504 params_.cert_transparency_verifier = cert_transparency_verifier_.get();
rsleevid6de8302016-06-21 01:33:20505 params_.ct_policy_enforcer = &ct_policy_enforcer_;
tbansalfdf5665b2015-09-21 22:46:40506 params_.socket_performance_watcher_factory =
tbansal0f56a39a2016-04-07 22:03:38507 &test_socket_performance_watcher_factory_;
[email protected]1c04f9522013-02-21 20:32:43508 params_.proxy_service = proxy_service_.get();
509 params_.ssl_config_service = ssl_config_service_.get();
510 params_.http_auth_handler_factory = auth_handler_factory_.get();
bnc525e175a2016-06-20 12:36:40511 params_.http_server_properties = &http_server_properties_;
[email protected]1e960032013-12-20 19:00:20512 params_.quic_supported_versions = SupportedVersions(GetParam());
rch74da0e1a2016-01-14 02:49:32513 for (const char* host :
rch9ae5b3b2016-02-11 00:36:29514 {kDefaultServerHostName, "www.example.org", "news.example.org",
515 "bar.example.org", "foo.example.org", "invalid.example.org",
516 "mail.example.com"}) {
rch74da0e1a2016-01-14 02:49:32517 params_.quic_host_whitelist.insert(host);
518 }
[email protected]61a527782013-02-21 03:58:00519
mmenkee65e7af2015-10-13 17:16:42520 session_.reset(new HttpNetworkSession(params_));
[email protected]11c05872013-08-20 02:04:12521 session_->quic_stream_factory()->set_require_confirmation(false);
rch185ebee2015-07-14 23:56:22522 ASSERT_EQ(params_.quic_socket_receive_buffer_size,
523 session_->quic_stream_factory()->socket_receive_buffer_size());
[email protected]61a527782013-02-21 03:58:00524 }
525
danakjad1777e2016-04-16 00:56:42526 void CheckWasQuicResponse(
527 const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19528 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42529 ASSERT_TRUE(response != nullptr);
530 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19531 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
532 EXPECT_TRUE(response->was_fetched_via_spdy);
533 EXPECT_TRUE(response->was_npn_negotiated);
534 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
535 response->connection_info);
536 }
537
danakjad1777e2016-04-16 00:56:42538 void CheckResponsePort(const std::unique_ptr<HttpNetworkTransaction>& trans,
Avi Drissman13fc8932015-12-20 04:40:46539 uint16_t port) {
bnc62a44f022015-04-02 15:59:41540 const HttpResponseInfo* response = trans->GetResponseInfo();
541 ASSERT_TRUE(response != nullptr);
542 EXPECT_EQ(port, response->socket_address.port());
543 }
544
danakjad1777e2016-04-16 00:56:42545 void CheckWasHttpResponse(
546 const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19547 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42548 ASSERT_TRUE(response != nullptr);
549 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19550 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
551 EXPECT_FALSE(response->was_fetched_via_spdy);
552 EXPECT_FALSE(response->was_npn_negotiated);
mmenke8210acc2016-07-11 16:34:52553 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1_1,
[email protected]aa9b14d2013-05-10 23:45:19554 response->connection_info);
555 }
556
danakjad1777e2016-04-16 00:56:42557 void CheckResponseData(const std::unique_ptr<HttpNetworkTransaction>& trans,
[email protected]aa9b14d2013-05-10 23:45:19558 const std::string& expected) {
559 std::string response_data;
robpercival214763f2016-07-01 23:27:01560 ASSERT_THAT(ReadTransaction(trans.get(), &response_data), IsOk());
[email protected]aa9b14d2013-05-10 23:45:19561 EXPECT_EQ(expected, response_data);
562 }
563
danakjad1777e2016-04-16 00:56:42564 void RunTransaction(const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19565 TestCompletionCallback callback;
566 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
robpercival214763f2016-07-01 23:27:01567 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
568 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]aa9b14d2013-05-10 23:45:19569 }
570
571 void SendRequestAndExpectHttpResponse(const std::string& expected) {
danakjad1777e2016-04-16 00:56:42572 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50573 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
bncffc2fdf2015-05-14 18:29:49574 RunTransaction(trans);
[email protected]aa9b14d2013-05-10 23:45:19575 CheckWasHttpResponse(trans);
bncffc2fdf2015-05-14 18:29:49576 CheckResponseData(trans, expected);
[email protected]aa9b14d2013-05-10 23:45:19577 }
578
579 void SendRequestAndExpectQuicResponse(const std::string& expected) {
rchf114d982015-10-21 01:34:56580 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, 443);
tbansal7cec3812015-02-05 21:25:12581 }
582
bnc62a44f022015-04-02 15:59:41583 void SendRequestAndExpectQuicResponseFromProxyOnPort(
584 const std::string& expected,
Avi Drissman13fc8932015-12-20 04:40:46585 uint16_t port) {
bnc62a44f022015-04-02 15:59:41586 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port);
[email protected]aa9b14d2013-05-10 23:45:19587 }
588
589 void AddQuicAlternateProtocolMapping(
590 MockCryptoClientStream::HandshakeMode handshake_mode) {
591 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
zhongyi3d4a55e72016-04-22 20:36:46592 url::SchemeHostPort server(request_.url);
593 AlternativeService alternative_service(QUIC, server.host(), 443);
bnc7dc7e1b42015-07-28 14:43:12594 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
zhongyi3d4a55e72016-04-22 20:36:46595 http_server_properties_.SetAlternativeService(server, alternative_service,
596 expiration);
[email protected]aa9b14d2013-05-10 23:45:19597 }
598
rchbe69cb902016-02-11 01:10:48599 void AddQuicRemoteAlternativeServiceMapping(
600 MockCryptoClientStream::HandshakeMode handshake_mode,
601 const HostPortPair& alternative) {
602 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
zhongyi3d4a55e72016-04-22 20:36:46603 url::SchemeHostPort server(request_.url);
rchbe69cb902016-02-11 01:10:48604 AlternativeService alternative_service(QUIC, alternative.host(),
605 alternative.port());
606 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
zhongyi3d4a55e72016-04-22 20:36:46607 http_server_properties_.SetAlternativeService(server, alternative_service,
608 expiration);
rchbe69cb902016-02-11 01:10:48609 }
610
[email protected]aa9b14d2013-05-10 23:45:19611 void ExpectBrokenAlternateProtocolMapping() {
zhongyi3d4a55e72016-04-22 20:36:46612 const url::SchemeHostPort server(request_.url);
bncd9b132e2015-07-08 05:16:10613 const AlternativeServiceVector alternative_service_vector =
zhongyi3d4a55e72016-04-22 20:36:46614 http_server_properties_.GetAlternativeServices(server);
bncd9b132e2015-07-08 05:16:10615 EXPECT_EQ(1u, alternative_service_vector.size());
bnc6be245c12015-05-15 11:24:07616 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken(
bncd9b132e2015-07-08 05:16:10617 alternative_service_vector[0]));
[email protected]aa9b14d2013-05-10 23:45:19618 }
619
[email protected]4d590c9c2014-05-02 05:14:33620 void ExpectQuicAlternateProtocolMapping() {
zhongyi3d4a55e72016-04-22 20:36:46621 const url::SchemeHostPort server(request_.url);
bncd9b132e2015-07-08 05:16:10622 const AlternativeServiceVector alternative_service_vector =
zhongyi3d4a55e72016-04-22 20:36:46623 http_server_properties_.GetAlternativeServices(server);
bncd9b132e2015-07-08 05:16:10624 EXPECT_EQ(1u, alternative_service_vector.size());
625 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
[email protected]4d590c9c2014-05-02 05:14:33626 }
627
[email protected]aa9b14d2013-05-10 23:45:19628 void AddHangingNonAlternateProtocolSocketData() {
danakjad1777e2016-04-16 00:56:42629 std::unique_ptr<StaticSocketDataProvider> hanging_data;
zhongyi32569c62016-01-08 02:54:30630 hanging_data.reset(new StaticSocketDataProvider());
[email protected]dda75ab2013-06-22 22:43:30631 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
zhongyi32569c62016-01-08 02:54:30632 hanging_data->set_connect_data(hanging_connect);
633 hanging_data_.push_back(std::move(hanging_data));
634 socket_factory_.AddSocketDataProvider(hanging_data_.back().get());
rchf114d982015-10-21 01:34:56635 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]aa9b14d2013-05-10 23:45:19636 }
637
rtenneti4b06ae72014-08-26 03:43:43638 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
alyssar2adf3ac2016-05-03 17:12:58639 QuicTestPacketMaker client_maker_;
640 QuicTestPacketMaker server_maker_;
danakjad1777e2016-04-16 00:56:42641 std::unique_ptr<HttpNetworkSession> session_;
[email protected]61a527782013-02-21 03:58:00642 MockClientSocketFactory socket_factory_;
rchf114d982015-10-21 01:34:56643 ProofVerifyDetailsChromium verify_details_;
[email protected]e8ff26842013-03-22 21:02:05644 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43645 MockHostResolver host_resolver_;
646 MockCertVerifier cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11647 TransportSecurityState transport_security_state_;
danakjad1777e2016-04-16 00:56:42648 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
rsleevid6de8302016-06-21 01:33:20649 CTPolicyEnforcer ct_policy_enforcer_;
tbansal0f56a39a2016-04-07 22:03:38650 TestSocketPerformanceWatcherFactory test_socket_performance_watcher_factory_;
[email protected]1c04f9522013-02-21 20:32:43651 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
danakjad1777e2016-04-16 00:56:42652 std::unique_ptr<ProxyService> proxy_service_;
653 std::unique_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
[email protected]61a527782013-02-21 03:58:00654 MockRandom random_generator_;
bnc6be245c12015-05-15 11:24:07655 HttpServerPropertiesImpl http_server_properties_;
[email protected]61a527782013-02-21 03:58:00656 HttpNetworkSession::Params params_;
[email protected]aa9b14d2013-05-10 23:45:19657 HttpRequestInfo request_;
vishal.b62985ca92015-04-17 08:45:51658 BoundTestNetLog net_log_;
danakjad1777e2016-04-16 00:56:42659 std::vector<std::unique_ptr<StaticSocketDataProvider>> hanging_data_;
rchf114d982015-10-21 01:34:56660 SSLSocketDataProvider ssl_data_;
tbansal7cec3812015-02-05 21:25:12661
662 private:
663 void SendRequestAndExpectQuicResponseMaybeFromProxy(
664 const std::string& expected,
bnc62a44f022015-04-02 15:59:41665 bool used_proxy,
Avi Drissman13fc8932015-12-20 04:40:46666 uint16_t port) {
danakjad1777e2016-04-16 00:56:42667 std::unique_ptr<HttpNetworkTransaction> trans(
tbansal7cec3812015-02-05 21:25:12668 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
ryansturm49a8cb12016-06-15 16:51:09669 HeadersHandler headers_handler;
670 trans->SetBeforeHeadersSentCallback(
671 base::Bind(&HeadersHandler::OnBeforeHeadersSent,
672 base::Unretained(&headers_handler)));
bncffc2fdf2015-05-14 18:29:49673 RunTransaction(trans);
tbansal7cec3812015-02-05 21:25:12674 CheckWasQuicResponse(trans);
bnc62a44f022015-04-02 15:59:41675 CheckResponsePort(trans, port);
bncffc2fdf2015-05-14 18:29:49676 CheckResponseData(trans, expected);
ryansturm49a8cb12016-06-15 16:51:09677 EXPECT_EQ(used_proxy, headers_handler.was_proxied());
tbansal7cec3812015-02-05 21:25:12678 }
[email protected]61a527782013-02-21 03:58:00679};
680
rjshaded5ced072015-12-18 19:26:02681INSTANTIATE_TEST_CASE_P(Version,
682 QuicNetworkTransactionTest,
[email protected]1e960032013-12-20 19:00:20683 ::testing::ValuesIn(QuicSupportedVersions()));
684
685TEST_P(QuicNetworkTransactionTest, ForceQuic) {
rtenneti8a2f4632016-03-21 20:26:57686 params_.origins_to_force_quic_on.insert(
687 HostPortPair::FromString("mail.example.org:443"));
[email protected]4dca587c2013-03-07 16:54:47688
[email protected]1e960032013-12-20 19:00:20689 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58690 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
691 1, kClientDataStreamId1, true, true,
692 GetRequestHeaders("GET", "https", "/")));
693 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:02694 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58695 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
696 false, true, 0, "hello!"));
697 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:59698 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
[email protected]4dca587c2013-03-07 16:54:47699
rcha5399e02015-04-21 19:32:04700 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4dca587c2013-03-07 16:54:47701
[email protected]4dca587c2013-03-07 16:54:47702 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47703
tbansal0f56a39a2016-04-07 22:03:38704 EXPECT_FALSE(
705 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]aa9b14d2013-05-10 23:45:19706 SendRequestAndExpectQuicResponse("hello!");
tbansal0f56a39a2016-04-07 22:03:38707 EXPECT_TRUE(
708 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]4dca587c2013-03-07 16:54:47709
[email protected]98b20ce2013-05-10 05:55:26710 // Check that the NetLog was filled reasonably.
mmenke43758e62015-05-04 21:09:46711 TestNetLogEntry::List entries;
[email protected]aa9b14d2013-05-10 23:45:19712 net_log_.GetEntries(&entries);
[email protected]98b20ce2013-05-10 05:55:26713 EXPECT_LT(0u, entries.size());
714
715 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29716 int pos = ExpectLogContainsSomewhere(
717 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
718 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26719 EXPECT_LT(0, pos);
720
rchfd527212015-08-25 00:41:26721 // ... and also a TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29722 pos = ExpectLogContainsSomewhere(
rchfd527212015-08-25 00:41:26723 entries, 0,
724 NetLog::TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED,
ttuttle859dc7a2015-04-23 19:42:29725 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26726 EXPECT_LT(0, pos);
727
rtennetia004d332015-08-28 06:44:57728 std::string packet_number;
729 ASSERT_TRUE(entries[pos].GetStringValue("packet_number", &packet_number));
730 EXPECT_EQ("1", packet_number);
[email protected]98b20ce2013-05-10 05:55:26731
rchfd527212015-08-25 00:41:26732 // ... and also a TYPE_QUIC_SESSION_PACKET_AUTHENTICATED.
733 pos = ExpectLogContainsSomewhere(
734 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_AUTHENTICATED,
735 NetLog::PHASE_NONE);
736 EXPECT_LT(0, pos);
737
[email protected]98b20ce2013-05-10 05:55:26738 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29739 pos = ExpectLogContainsSomewhere(
740 entries, 0, NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
741 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26742 EXPECT_LT(0, pos);
743
744 int log_stream_id;
745 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
[email protected]1e960032013-12-20 19:00:20746 EXPECT_EQ(3, log_stream_id);
[email protected]4dca587c2013-03-07 16:54:47747}
748
rcha2bd44b2016-07-02 00:42:55749TEST_P(QuicNetworkTransactionTest, ForceQuicForAll) {
750 params_.origins_to_force_quic_on.insert(HostPortPair());
751
752 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
753
754 MockQuicData mock_quic_data;
755 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
756 1, kClientDataStreamId1, true, true,
757 GetRequestHeaders("GET", "https", "/")));
758 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
759 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
760 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
761 false, true, 0, "hello!"));
762 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
763 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
764
765 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
766
767 CreateSession();
768
769 SendRequestAndExpectQuicResponse("hello!");
770 EXPECT_TRUE(
771 test_socket_performance_watcher_factory_.rtt_notification_received());
772}
773
[email protected]cf3e3cd62014-02-05 16:16:16774TEST_P(QuicNetworkTransactionTest, QuicProxy) {
tbansal9bf26672016-05-11 18:32:45775 params_.enable_quic = true;
rchf114d982015-10-21 01:34:56776 proxy_service_ =
rch9ae5b3b2016-02-11 00:36:29777 ProxyService::CreateFixedFromPacResult("QUIC mail.example.org:70");
[email protected]cf3e3cd62014-02-05 16:16:16778
[email protected]cf3e3cd62014-02-05 16:16:16779 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58780 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
781 1, kClientDataStreamId1, true, true,
782 GetRequestHeaders("GET", "http", "/")));
783 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:02784 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58785 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
786 false, true, 0, "hello!"));
787 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50788 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59789 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]cf3e3cd62014-02-05 16:16:16790
rcha5399e02015-04-21 19:32:04791 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cf3e3cd62014-02-05 16:16:16792
tbansal0f56a39a2016-04-07 22:03:38793 EXPECT_FALSE(
794 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16795 // There is no need to set up an alternate protocol job, because
796 // no attempt will be made to speak to the proxy over TCP.
797
rch9ae5b3b2016-02-11 00:36:29798 request_.url = GURL("http://mail.example.org/");
[email protected]cf3e3cd62014-02-05 16:16:16799 CreateSession();
800
bnc62a44f022015-04-02 15:59:41801 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
tbansal0f56a39a2016-04-07 22:03:38802 EXPECT_TRUE(
803 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16804}
805
bnc313ba9c2015-06-11 15:42:31806// Regression test for https://crbug.com/492458. Test that for an HTTP
807// connection through a QUIC proxy, the certificate exhibited by the proxy is
808// checked against the proxy hostname, not the origin hostname.
809TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) {
rch9ae5b3b2016-02-11 00:36:29810 const std::string origin_host = "mail.example.com";
bnc313ba9c2015-06-11 15:42:31811 const std::string proxy_host = "www.example.org";
812
tbansal9bf26672016-05-11 18:32:45813 params_.enable_quic = true;
rdsmith82957ad2015-09-16 19:42:03814 proxy_service_ =
815 ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70");
bnc313ba9c2015-06-11 15:42:31816
alyssar2adf3ac2016-05-03 17:12:58817 client_maker_.set_hostname(origin_host);
bnc313ba9c2015-06-11 15:42:31818 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58819 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
820 1, kClientDataStreamId1, true, true,
821 GetRequestHeaders("GET", "http", "/")));
822 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc313ba9c2015-06-11 15:42:31823 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58824 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
825 false, true, 0, "hello!"));
826 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50827 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59828 mock_quic_data.AddRead(ASYNC, 0);
bnc313ba9c2015-06-11 15:42:31829 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
830
831 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29832 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bnc313ba9c2015-06-11 15:42:31833 ASSERT_TRUE(cert.get());
834 // This certificate is valid for the proxy, but not for the origin.
835 bool common_name_fallback_used;
836 EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used));
837 EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used));
838 ProofVerifyDetailsChromium verify_details;
839 verify_details.cert_verify_result.verified_cert = cert;
840 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rchf114d982015-10-21 01:34:56841 ProofVerifyDetailsChromium verify_details2;
842 verify_details2.cert_verify_result.verified_cert = cert;
843 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
bnc313ba9c2015-06-11 15:42:31844
845 request_.url = GURL("http://" + origin_host);
rtennetib8e80fb2016-05-16 00:12:09846 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32847 CreateSession();
bnc313ba9c2015-06-11 15:42:31848 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
849 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
850}
851
rchbe69cb902016-02-11 01:10:48852TEST_P(QuicNetworkTransactionTest, AlternativeServicesDifferentHost) {
rchbe69cb902016-02-11 01:10:48853 HostPortPair origin("www.example.org", 443);
854 HostPortPair alternative("mail.example.org", 443);
855
856 base::FilePath certs_dir = GetTestCertsDirectory();
857 scoped_refptr<X509Certificate> cert(
858 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
859 ASSERT_TRUE(cert.get());
860 // TODO(rch): the connection should be "to" the origin, so if the cert is
861 // valid for the origin but not the alternative, that should work too.
862 bool common_name_fallback_used;
863 EXPECT_TRUE(cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
864 EXPECT_TRUE(
865 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
866 ProofVerifyDetailsChromium verify_details;
867 verify_details.cert_verify_result.verified_cert = cert;
868 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
869
alyssar2adf3ac2016-05-03 17:12:58870 client_maker_.set_hostname(origin.host());
rchbe69cb902016-02-11 01:10:48871 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58872 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
873 1, kClientDataStreamId1, true, true,
874 GetRequestHeaders("GET", "https", "/")));
875 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rchbe69cb902016-02-11 01:10:48876 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58877 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
878 false, true, 0, "hello!"));
879 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchbe69cb902016-02-11 01:10:48880 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
881 mock_quic_data.AddRead(ASYNC, 0);
882 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
883
884 request_.url = GURL("https://" + origin.host());
885 AddQuicRemoteAlternativeServiceMapping(
886 MockCryptoClientStream::CONFIRM_HANDSHAKE, alternative);
rtennetib8e80fb2016-05-16 00:12:09887 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32888 CreateSession();
rchbe69cb902016-02-11 01:10:48889
890 SendRequestAndExpectQuicResponse("hello!");
891}
892
[email protected]1e960032013-12-20 19:00:20893TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
rtenneti8a2f4632016-03-21 20:26:57894 params_.origins_to_force_quic_on.insert(
895 HostPortPair::FromString("mail.example.org:443"));
[email protected]cebe3282013-05-22 23:49:30896
tbansalfdf5665b2015-09-21 22:46:40897 MockQuicData mock_quic_data1;
898 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
[email protected]1e960032013-12-20 19:00:20899
tbansalfdf5665b2015-09-21 22:46:40900 MockQuicData mock_quic_data2;
zhongyi32569c62016-01-08 02:54:30901 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40902 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
rch6faa4d42016-01-05 20:48:43903 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40904
905 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
906 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
[email protected]cebe3282013-05-22 23:49:30907
908 CreateSession();
909
tbansal0f56a39a2016-04-07 22:03:38910 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40911 for (size_t i = 0; i < 2; ++i) {
danakjad1777e2016-04-16 00:56:42912 std::unique_ptr<HttpNetworkTransaction> trans(
tbansalfdf5665b2015-09-21 22:46:40913 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
914 TestCompletionCallback callback;
915 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
robpercival214763f2016-07-01 23:27:01916 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
917 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_CLOSED));
tbansal0f56a39a2016-04-07 22:03:38918 EXPECT_EQ(1 + i, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40919 }
[email protected]cebe3282013-05-22 23:49:30920}
921
tbansalc8a94ea2015-11-02 23:58:51922TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
923 // Attempt to "force" quic on 443, which will not be honored.
rtenneti8a2f4632016-03-21 20:26:57924 params_.origins_to_force_quic_on.insert(
925 HostPortPair::FromString("www.google.com:443"));
tbansalc8a94ea2015-11-02 23:58:51926
927 MockRead http_reads[] = {
928 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
929 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
930 MockRead(ASYNC, OK)};
931
932 StaticSocketDataProvider data(http_reads, arraysize(http_reads), nullptr, 0);
933 socket_factory_.AddSocketDataProvider(&data);
934 SSLSocketDataProvider ssl(ASYNC, OK);
935 socket_factory_.AddSSLSocketDataProvider(&ssl);
936
937 CreateSession();
938
939 SendRequestAndExpectHttpResponse("hello world");
tbansal0f56a39a2016-04-07 22:03:38940 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalc8a94ea2015-11-02 23:58:51941}
942
bncc958faa2015-07-31 18:14:52943TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52944 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56945 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
946 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52947 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
948 MockRead(ASYNC, OK)};
949
950 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
951 0);
952 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56953 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52954
955 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58956 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
957 1, kClientDataStreamId1, true, true,
958 GetRequestHeaders("GET", "https", "/")));
959 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:52960 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58961 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
962 false, true, 0, "hello!"));
963 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:52964 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59965 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52966
967 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
968
rtennetib8e80fb2016-05-16 00:12:09969 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32970 CreateSession();
bncc958faa2015-07-31 18:14:52971
972 SendRequestAndExpectHttpResponse("hello world");
973 SendRequestAndExpectQuicResponse("hello!");
974}
975
rchf47265dc2016-03-21 21:33:12976TEST_P(QuicNetworkTransactionTest,
977 UseAlternativeServiceWithProbabilityForQuic) {
978 MockRead http_reads[] = {
979 MockRead("HTTP/1.1 200 OK\r\n"),
980 MockRead(kQuicAlternativeServiceWithProbabilityHeader),
981 MockRead("hello world"),
982 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
983 MockRead(ASYNC, OK)};
984
985 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
986 0);
987 socket_factory_.AddSocketDataProvider(&http_data);
988 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
989
990 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58991 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
992 1, kClientDataStreamId1, true, true,
993 GetRequestHeaders("GET", "https", "/")));
994 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rchf47265dc2016-03-21 21:33:12995 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58996 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
997 false, true, 0, "hello!"));
998 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchf47265dc2016-03-21 21:33:12999 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1000 mock_quic_data.AddRead(ASYNC, 0); // EOF
1001
1002 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1003
rtennetib8e80fb2016-05-16 00:12:091004 AddHangingNonAlternateProtocolSocketData();
rchf47265dc2016-03-21 21:33:121005 CreateSession();
1006
1007 SendRequestAndExpectHttpResponse("hello world");
1008 SendRequestAndExpectQuicResponse("hello!");
1009}
1010
zhongyi3d4a55e72016-04-22 20:36:461011TEST_P(QuicNetworkTransactionTest, SetAlternativeServiceWithScheme) {
1012 MockRead http_reads[] = {
1013 MockRead("HTTP/1.1 200 OK\r\n"),
1014 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
1015 MockRead("hello world"),
1016 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1017 MockRead(ASYNC, OK)};
1018
1019 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1020 0);
1021
1022 socket_factory_.AddSocketDataProvider(&http_data);
1023 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1024
1025 CreateSession();
bncb26024382016-06-29 02:39:451026 // Send https request, ignore alternative service advertising if response
zhongyi3d4a55e72016-04-22 20:36:461027 // header advertises alternative service for mail.example.org.
bncb26024382016-06-29 02:39:451028 request_.url = GURL("https://mail.example.org:443");
zhongyi3d4a55e72016-04-22 20:36:461029 SendRequestAndExpectHttpResponse("hello world");
bnc525e175a2016-06-20 12:36:401030 HttpServerProperties* http_server_properties =
zhongyi3d4a55e72016-04-22 20:36:461031 session_->http_server_properties();
1032 url::SchemeHostPort http_server("http", "mail.example.org", 443);
1033 url::SchemeHostPort https_server("https", "mail.example.org", 443);
1034 // Check alternative service is set for the correct origin.
zhongyi3d4a55e72016-04-22 20:36:461035 EXPECT_EQ(
bncb26024382016-06-29 02:39:451036 2u, http_server_properties->GetAlternativeServices(https_server).size());
1037 EXPECT_TRUE(
1038 http_server_properties->GetAlternativeServices(http_server).empty());
zhongyi3d4a55e72016-04-22 20:36:461039}
1040
1041TEST_P(QuicNetworkTransactionTest, DoNotGetAltSvcForDifferentOrigin) {
1042 MockRead http_reads[] = {
1043 MockRead("HTTP/1.1 200 OK\r\n"),
1044 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
1045 MockRead("hello world"),
1046 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1047 MockRead(ASYNC, OK)};
1048
1049 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1050 0);
1051
1052 socket_factory_.AddSocketDataProvider(&http_data);
1053 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1054 socket_factory_.AddSocketDataProvider(&http_data);
1055 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1056
1057 CreateSession();
1058
1059 // Send https request and set alternative services if response header
1060 // advertises alternative service for mail.example.org.
1061 SendRequestAndExpectHttpResponse("hello world");
bnc525e175a2016-06-20 12:36:401062 HttpServerProperties* http_server_properties =
zhongyi3d4a55e72016-04-22 20:36:461063 session_->http_server_properties();
1064
1065 const url::SchemeHostPort https_server(request_.url);
1066 // Check alternative service is set.
1067 AlternativeServiceVector alternative_service_vector =
1068 http_server_properties->GetAlternativeServices(https_server);
1069 EXPECT_EQ(2u, alternative_service_vector.size());
1070
1071 // Send http request to the same origin but with diffrent scheme, should not
1072 // use QUIC.
1073 request_.url = GURL("http://mail.example.org:443");
1074 SendRequestAndExpectHttpResponse("hello world");
1075}
1076
bnc8be55ebb2015-10-30 14:12:071077TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) {
1078 std::string altsvc_header = base::StringPrintf(
1079 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam());
1080 MockRead http_reads[] = {
1081 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1082 MockRead("hello world"),
1083 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1084 MockRead(ASYNC, OK)};
1085
1086 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1087 0);
1088 socket_factory_.AddSocketDataProvider(&http_data);
1089 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1090
1091 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581092 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1093 1, kClientDataStreamId1, true, true,
1094 GetRequestHeaders("GET", "https", "/")));
1095 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc8be55ebb2015-10-30 14:12:071096 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581097 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1098 false, true, 0, "hello!"));
1099 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bnc8be55ebb2015-10-30 14:12:071100 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591101 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc8be55ebb2015-10-30 14:12:071102
1103 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1104
rtennetib8e80fb2016-05-16 00:12:091105 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321106 CreateSession();
bnc8be55ebb2015-10-30 14:12:071107
1108 SendRequestAndExpectHttpResponse("hello world");
1109 SendRequestAndExpectQuicResponse("hello!");
1110}
1111
zhongyi6b5a3892016-03-12 04:46:201112TEST_P(QuicNetworkTransactionTest, GoAwayWithConnectionMigrationOnPortsOnly) {
1113 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581114 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1115 1, kClientDataStreamId1, true, true,
1116 GetRequestHeaders("GET", "https", "/")));
1117 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi6b5a3892016-03-12 04:46:201118 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1119 // Read a GoAway packet with
1120 // QuicErrorCode: QUIC_ERROR_MIGRATING_PORT from the peer.
alyssar2adf3ac2016-05-03 17:12:581121 mock_quic_data.AddRead(ConstructServerGoAwayPacket(
1122 2, QUIC_ERROR_MIGRATING_PORT,
1123 "connection migration with port change only"));
1124 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
1125 mock_quic_data.AddRead(ConstructServerDataPacket(3, kClientDataStreamId1,
1126 false, true, 0, "hello!"));
1127 mock_quic_data.AddWrite(ConstructClientAckAndRstPacket(
zhongyi6b5a3892016-03-12 04:46:201128 3, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 3, 3, 1));
1129 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1130 mock_quic_data.AddRead(ASYNC, 0); // EOF
1131
1132 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1133
1134 // The non-alternate protocol job needs to hang in order to guarantee that
1135 // the alternate-protocol job will "win".
1136 AddHangingNonAlternateProtocolSocketData();
1137
1138 // In order for a new QUIC session to be established via alternate-protocol
1139 // without racing an HTTP connection, we need the host resolution to happen
1140 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1141 // connection to the the server, in this test we require confirmation
1142 // before encrypting so the HTTP job will still start.
1143 host_resolver_.set_synchronous_mode(true);
1144 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1145 "");
1146 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1147 AddressList address;
maksim.sisov31452af2016-07-27 06:38:101148 std::unique_ptr<HostResolver::Request> request;
zhongyi6b5a3892016-03-12 04:46:201149 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
maksim.sisov31452af2016-07-27 06:38:101150 &request, net_log_.bound());
zhongyi6b5a3892016-03-12 04:46:201151
1152 CreateSession();
1153 session_->quic_stream_factory()->set_require_confirmation(true);
1154 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1155
danakjad1777e2016-04-16 00:56:421156 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyi6b5a3892016-03-12 04:46:201157 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1158 TestCompletionCallback callback;
1159 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
robpercival214763f2016-07-01 23:27:011160 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
zhongyi6b5a3892016-03-12 04:46:201161
1162 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1163 QuicSession::HANDSHAKE_CONFIRMED);
robpercival214763f2016-07-01 23:27:011164 EXPECT_THAT(callback.WaitForResult(), IsOk());
zhongyi6b5a3892016-03-12 04:46:201165
1166 // Check whether this transaction is correctly marked as received a go-away
1167 // because of migrating port.
1168 NetErrorDetails details;
1169 EXPECT_FALSE(details.quic_port_migration_detected);
1170 trans->PopulateNetErrorDetails(&details);
1171 EXPECT_TRUE(details.quic_port_migration_detected);
1172}
1173
bnc8be55ebb2015-10-30 14:12:071174TEST_P(QuicNetworkTransactionTest,
1175 DoNotUseAlternativeServiceQuicUnsupportedVersion) {
1176 std::string altsvc_header = base::StringPrintf(
1177 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam() - 1);
1178 MockRead http_reads[] = {
1179 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1180 MockRead("hello world"),
1181 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1182 MockRead(ASYNC, OK)};
1183
1184 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1185 0);
1186 socket_factory_.AddSocketDataProvider(&http_data);
1187 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1188 socket_factory_.AddSocketDataProvider(&http_data);
1189 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1190
rch3f4b8452016-02-23 16:59:321191 CreateSession();
bnc8be55ebb2015-10-30 14:12:071192
1193 SendRequestAndExpectHttpResponse("hello world");
1194 SendRequestAndExpectHttpResponse("hello world");
1195}
1196
bncc958faa2015-07-31 18:14:521197// When multiple alternative services are advertised,
zhongyi32569c62016-01-08 02:54:301198// HttpStreamFactoryImpl::RequestStreamInternal() should select the alternative
1199// service which uses existing QUIC session if available. If no existing QUIC
1200// session can be used, use the first alternative service from the list.
1201TEST_P(QuicNetworkTransactionTest, UseExistingAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:521202 MockRead http_reads[] = {
1203 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291204 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
bncc958faa2015-07-31 18:14:521205 MockRead("hello world"),
1206 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1207 MockRead(ASYNC, OK)};
1208
1209 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1210 0);
1211 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561212 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521213
zhongyi32569c62016-01-08 02:54:301214 QuicStreamOffset request_header_offset = 0;
1215 QuicStreamOffset response_header_offset = 0;
1216 // First QUIC request data.
rch9ae5b3b2016-02-11 00:36:291217 // Open a session to foo.example.org:443 using the first entry of the
zhongyi32569c62016-01-08 02:54:301218 // alternative service list.
bncc958faa2015-07-31 18:14:521219 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581220 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301221 1, kClientDataStreamId1, true, true,
1222 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1223
1224 std::string alt_svc_list =
rch9ae5b3b2016-02-11 00:36:291225 "quic=\"mail.example.org:444\", quic=\"foo.example.org:443\", "
1226 "quic=\"bar.example.org:445\"";
alyssar2adf3ac2016-05-03 17:12:581227 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301228 1, kClientDataStreamId1, false, false,
1229 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581230 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1231 false, true, 0, "hello!"));
1232 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301233
1234 // Second QUIC request data.
1235 // Connection pooling, using existing session, no need to include version
1236 // as version negotiation has been completed.
alyssar2adf3ac2016-05-03 17:12:581237 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301238 3, kClientDataStreamId2, false, true,
1239 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581240 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301241 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1242 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581243 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1244 false, true, 0, "hello!"));
1245 mock_quic_data.AddWrite(
1246 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
bncc958faa2015-07-31 18:14:521247 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591248 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521249
1250 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1251
rtennetib8e80fb2016-05-16 00:12:091252 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321253 CreateSession();
bncc958faa2015-07-31 18:14:521254
1255 SendRequestAndExpectHttpResponse("hello world");
zhongyi32569c62016-01-08 02:54:301256
bnc359ed2a2016-04-29 20:43:451257 SendRequestAndExpectQuicResponse("hello!");
1258 SendRequestAndExpectQuicResponse("hello!");
zhongyi32569c62016-01-08 02:54:301259}
1260
bnc359ed2a2016-04-29 20:43:451261// Pool to existing session with matching QuicServerId
1262// even if alternative service destination is different.
1263TEST_P(QuicNetworkTransactionTest, PoolByOrigin) {
zhongyi32569c62016-01-08 02:54:301264 MockQuicData mock_quic_data;
bnc359ed2a2016-04-29 20:43:451265 QuicStreamOffset request_header_offset(0);
1266 QuicStreamOffset response_header_offset(0);
1267
1268 // First request.
alyssar2adf3ac2016-05-03 17:12:581269 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301270 1, kClientDataStreamId1, true, true,
1271 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581272 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451273 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1274 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581275 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1276 false, true, 0, "hello!"));
1277 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301278
bnc359ed2a2016-04-29 20:43:451279 // Second request.
alyssar2adf3ac2016-05-03 17:12:581280 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301281 3, kClientDataStreamId2, false, true,
1282 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581283 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301284 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1285 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581286 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1287 false, true, 0, "hello!"));
1288 mock_quic_data.AddWrite(
1289 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
zhongyi32569c62016-01-08 02:54:301290 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1291 mock_quic_data.AddRead(ASYNC, 0); // EOF
1292
1293 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bnc359ed2a2016-04-29 20:43:451294
1295 AddHangingNonAlternateProtocolSocketData();
1296 AddHangingNonAlternateProtocolSocketData();
zhongyi32569c62016-01-08 02:54:301297
rch3f4b8452016-02-23 16:59:321298 CreateSession();
zhongyi32569c62016-01-08 02:54:301299
bnc359ed2a2016-04-29 20:43:451300 const char destination1[] = "first.example.com";
1301 const char destination2[] = "second.example.com";
1302
1303 // Set up alternative service entry to destination1.
1304 url::SchemeHostPort server(request_.url);
1305 AlternativeService alternative_service(QUIC, destination1, 443);
1306 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1307 http_server_properties_.SetAlternativeService(server, alternative_service,
1308 expiration);
1309 // First request opens connection to |destination1|
1310 // with QuicServerId.host() == kDefaultServerHostName.
1311 SendRequestAndExpectQuicResponse("hello!");
1312
1313 // Set up alternative service entry to a different destination.
1314 alternative_service = AlternativeService(QUIC, destination2, 443);
1315 http_server_properties_.SetAlternativeService(server, alternative_service,
1316 expiration);
1317 // Second request pools to existing connection with same QuicServerId,
1318 // even though alternative service destination is different.
1319 SendRequestAndExpectQuicResponse("hello!");
1320}
1321
1322// Pool to existing session with matching destination and matching certificate
1323// even if origin is different, and even if the alternative service with
1324// matching destination is not the first one on the list.
1325TEST_P(QuicNetworkTransactionTest, PoolByDestination) {
1326 GURL origin1 = request_.url;
1327 GURL origin2("https://www.example.org/");
1328 ASSERT_NE(origin1.host(), origin2.host());
1329
1330 MockQuicData mock_quic_data;
1331 QuicStreamOffset request_header_offset(0);
1332 QuicStreamOffset response_header_offset(0);
1333
1334 // First request.
alyssar2adf3ac2016-05-03 17:12:581335 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:451336 1, kClientDataStreamId1, true, true,
1337 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581338 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451339 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1340 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581341 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1342 false, true, 0, "hello!"));
1343 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bnc359ed2a2016-04-29 20:43:451344
1345 // Second request.
alyssar2adf3ac2016-05-03 17:12:581346 QuicTestPacketMaker client_maker2(GetParam(), 0, clock_, origin2.host(),
1347 Perspective::IS_CLIENT);
1348 QuicTestPacketMaker server_maker2(GetParam(), 0, clock_, origin2.host(),
1349 Perspective::IS_SERVER);
1350 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:451351 3, kClientDataStreamId2, false, true,
alyssar2adf3ac2016-05-03 17:12:581352 GetRequestHeaders("GET", "https", "/", &client_maker2),
zhongyi76cfa7602016-07-12 19:56:271353 &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581354 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451355 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
zhongyi76cfa7602016-07-12 19:56:271356 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581357 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1358 false, true, 0, "hello!"));
1359 mock_quic_data.AddWrite(
1360 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
bnc359ed2a2016-04-29 20:43:451361 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1362 mock_quic_data.AddRead(ASYNC, 0); // EOF
1363
1364 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1365
1366 AddHangingNonAlternateProtocolSocketData();
1367 AddHangingNonAlternateProtocolSocketData();
1368
1369 CreateSession();
1370
1371 const char destination1[] = "first.example.com";
1372 const char destination2[] = "second.example.com";
1373
1374 // Set up alternative service for |origin1|.
1375 AlternativeService alternative_service1(QUIC, destination1, 443);
1376 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1377 http_server_properties_.SetAlternativeService(
1378 url::SchemeHostPort(origin1), alternative_service1, expiration);
1379
1380 // Set up multiple alternative service entries for |origin2|,
1381 // the first one with a different destination as for |origin1|,
1382 // the second one with the same. The second one should be used,
1383 // because the request can be pooled to that one.
1384 AlternativeService alternative_service2(QUIC, destination2, 443);
1385 AlternativeServiceInfoVector alternative_services;
1386 alternative_services.push_back(
1387 AlternativeServiceInfo(alternative_service2, expiration));
1388 alternative_services.push_back(
1389 AlternativeServiceInfo(alternative_service1, expiration));
1390 http_server_properties_.SetAlternativeServices(url::SchemeHostPort(origin2),
1391 alternative_services);
bnc359ed2a2016-04-29 20:43:451392 // First request opens connection to |destination1|
1393 // with QuicServerId.host() == origin1.host().
1394 SendRequestAndExpectQuicResponse("hello!");
1395
1396 // Second request pools to existing connection with same destination,
1397 // because certificate matches, even though QuicServerId is different.
1398 request_.url = origin2;
alyssar2adf3ac2016-05-03 17:12:581399
bnc359ed2a2016-04-29 20:43:451400 SendRequestAndExpectQuicResponse("hello!");
zhongyi32569c62016-01-08 02:54:301401}
1402
1403// Multiple origins have listed the same alternative services. When there's a
1404// existing QUIC session opened by a request to other origin,
1405// if the cert is valid, should select this QUIC session to make the request
1406// if this is also the first existing QUIC session.
1407TEST_P(QuicNetworkTransactionTest,
1408 UseSharedExistingAlternativeServiceForQuicWithValidCert) {
rch9ae5b3b2016-02-11 00:36:291409 // Default cert is valid for *.example.org
zhongyi32569c62016-01-08 02:54:301410
rch9ae5b3b2016-02-11 00:36:291411 // HTTP data for request to www.example.org.
zhongyi32569c62016-01-08 02:54:301412 MockRead http_reads[] = {
1413 MockRead("HTTP/1.1 200 OK\r\n"),
1414 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
rch9ae5b3b2016-02-11 00:36:291415 MockRead("hello world from www.example.org"),
zhongyi32569c62016-01-08 02:54:301416 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1417 MockRead(ASYNC, OK)};
1418
1419 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1420 0);
1421 socket_factory_.AddSocketDataProvider(&http_data);
1422 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1423
1424 // HTTP data for request to mail.example.org.
1425 MockRead http_reads2[] = {
1426 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291427 MockRead("Alt-Svc: quic=\":444\", quic=\"www.example.org:443\"\r\n\r\n"),
zhongyi32569c62016-01-08 02:54:301428 MockRead("hello world from mail.example.org"),
1429 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1430 MockRead(ASYNC, OK)};
1431
1432 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1433 nullptr, 0);
1434 socket_factory_.AddSocketDataProvider(&http_data2);
1435 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1436
1437 QuicStreamOffset request_header_offset = 0;
1438 QuicStreamOffset response_header_offset = 0;
1439
alyssar2adf3ac2016-05-03 17:12:581440 QuicTestPacketMaker client_maker(GetParam(), 0, clock_, "mail.example.org",
1441 Perspective::IS_CLIENT);
1442 server_maker_.set_hostname("www.example.org");
1443 client_maker_.set_hostname("www.example.org");
zhongyi32569c62016-01-08 02:54:301444 MockQuicData mock_quic_data;
1445
1446 // First QUIC request data.
alyssar2adf3ac2016-05-03 17:12:581447 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301448 1, kClientDataStreamId1, true, true,
1449 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1450
alyssar2adf3ac2016-05-03 17:12:581451 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301452 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1453 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581454 mock_quic_data.AddRead(ConstructServerDataPacket(
1455 2, kClientDataStreamId1, false, true, 0, "hello from mail QUIC!"));
1456 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301457 // Second QUIC request data.
alyssar2adf3ac2016-05-03 17:12:581458 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301459 3, kClientDataStreamId2, false, true,
alyssar2adf3ac2016-05-03 17:12:581460 GetRequestHeaders("GET", "https", "/", &client_maker),
zhongyi76cfa7602016-07-12 19:56:271461 &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581462 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301463 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1464 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581465 mock_quic_data.AddRead(ConstructServerDataPacket(
1466 4, kClientDataStreamId2, false, true, 0, "hello from mail QUIC!"));
1467 mock_quic_data.AddWrite(
1468 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
zhongyi32569c62016-01-08 02:54:301469 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1470 mock_quic_data.AddRead(ASYNC, 0); // EOF
1471
1472 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
zhongyi32569c62016-01-08 02:54:301473
rtennetib8e80fb2016-05-16 00:12:091474 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321475 CreateSession();
zhongyi32569c62016-01-08 02:54:301476
1477 // Send two HTTP requests, responses set up alt-svc lists for the origins.
rch9ae5b3b2016-02-11 00:36:291478 request_.url = GURL("https://www.example.org/");
1479 SendRequestAndExpectHttpResponse("hello world from www.example.org");
zhongyi32569c62016-01-08 02:54:301480 request_.url = GURL("https://mail.example.org/");
1481 SendRequestAndExpectHttpResponse("hello world from mail.example.org");
1482
rch9ae5b3b2016-02-11 00:36:291483 // Open a QUIC session to mail.example.org:443 when making request
1484 // to mail.example.org.
1485 request_.url = GURL("https://www.example.org/");
bnc359ed2a2016-04-29 20:43:451486 SendRequestAndExpectQuicResponse("hello from mail QUIC!");
zhongyi32569c62016-01-08 02:54:301487
rch9ae5b3b2016-02-11 00:36:291488 // Uses the existing QUIC session when making request to www.example.org.
zhongyi32569c62016-01-08 02:54:301489 request_.url = GURL("https://mail.example.org/");
bnc359ed2a2016-04-29 20:43:451490 SendRequestAndExpectQuicResponse("hello from mail QUIC!");
bncc958faa2015-07-31 18:14:521491}
1492
1493TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) {
bncc958faa2015-07-31 18:14:521494 MockRead http_reads[] = {
1495 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561496 MockRead(kQuicAlternativeServiceDifferentPortHeader),
bncc958faa2015-07-31 18:14:521497 MockRead("hello world"),
1498 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1499 MockRead(ASYNC, OK)};
1500
1501 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1502 0);
1503 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561504 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521505
rtennetib8e80fb2016-05-16 00:12:091506 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321507 CreateSession();
bncc958faa2015-07-31 18:14:521508
1509 SendRequestAndExpectHttpResponse("hello world");
bnc359ed2a2016-04-29 20:43:451510
1511 url::SchemeHostPort http_server("https", kDefaultServerHostName, 443);
1512 AlternativeServiceVector alternative_service_vector =
1513 http_server_properties_.GetAlternativeServices(http_server);
1514 ASSERT_EQ(1u, alternative_service_vector.size());
1515 const AlternativeService alternative_service = alternative_service_vector[0];
1516 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
1517 EXPECT_EQ(kDefaultServerHostName, alternative_service_vector[0].host);
1518 EXPECT_EQ(137, alternative_service_vector[0].port);
bncc958faa2015-07-31 18:14:521519}
1520
1521TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) {
bncc958faa2015-07-31 18:14:521522 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561523 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1524 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521525 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1526 MockRead(ASYNC, OK)};
1527
1528 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1529 0);
1530 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561531 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521532
1533 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581534 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1535 1, kClientDataStreamId1, true, true,
1536 GetRequestHeaders("GET", "https", "/")));
1537 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:521538 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581539 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1540 false, true, 0, "hello!"));
1541 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:521542 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1543 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521544
1545 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1546
rtennetib8e80fb2016-05-16 00:12:091547 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321548 CreateSession();
bncc958faa2015-07-31 18:14:521549
1550 AlternativeService alternative_service(QUIC,
1551 HostPortPair::FromURL(request_.url));
1552 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
1553 alternative_service);
1554 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1555 alternative_service));
1556
1557 SendRequestAndExpectHttpResponse("hello world");
1558 SendRequestAndExpectQuicResponse("hello!");
1559
mmenkee24011922015-12-17 22:12:591560 mock_quic_data.Resume();
bncc958faa2015-07-31 18:14:521561
1562 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1563 alternative_service));
1564}
1565
bncc958faa2015-07-31 18:14:521566TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) {
bncc958faa2015-07-31 18:14:521567 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561568 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1569 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521570 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1571 MockRead(ASYNC, OK)};
1572
1573 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1574 0);
1575 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561576 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521577
1578 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581579 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1580 1, kClientDataStreamId1, true, true,
1581 GetRequestHeaders("GET", "https", "/")));
1582 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:521583 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581584 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1585 false, true, 0, "hello!"));
1586 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:521587 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
1588
1589 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1590
1591 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321592 CreateSession();
bncc958faa2015-07-31 18:14:521593
1594 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1595 SendRequestAndExpectHttpResponse("hello world");
1596}
1597
bnc1c196c6e2016-05-28 13:51:481598TEST_P(QuicNetworkTransactionTest, HungAlternativeService) {
[email protected]dda75ab2013-06-22 22:43:301599 crypto_client_stream_factory_.set_handshake_mode(
1600 MockCryptoClientStream::COLD_START);
1601
1602 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561603 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
rch9ae5b3b2016-02-11 00:36:291604 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561605 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")};
[email protected]dda75ab2013-06-22 22:43:301606
1607 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561608 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
bnc1c196c6e2016-05-28 13:51:481609 MockRead(SYNCHRONOUS, 4, kQuicAlternativeServiceHeader),
rchf114d982015-10-21 01:34:561610 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]dda75ab2013-06-22 22:43:301611
mmenke651bae7f2015-12-18 21:26:451612 SequencedSocketData http_data(http_reads, arraysize(http_reads), http_writes,
1613 arraysize(http_writes));
bnc912a04b2016-04-20 14:19:501614 socket_factory_.AddSocketDataProvider(&http_data);
1615 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301616
1617 // The QUIC transaction will not be allowed to complete.
mmenke651bae7f2015-12-18 21:26:451618 MockWrite quic_writes[] = {MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 1)};
[email protected]dda75ab2013-06-22 22:43:301619 MockRead quic_reads[] = {
mmenke651bae7f2015-12-18 21:26:451620 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0),
[email protected]dda75ab2013-06-22 22:43:301621 };
mmenke651bae7f2015-12-18 21:26:451622 SequencedSocketData quic_data(quic_reads, arraysize(quic_reads), quic_writes,
1623 arraysize(quic_writes));
bnc912a04b2016-04-20 14:19:501624 socket_factory_.AddSocketDataProvider(&quic_data);
[email protected]dda75ab2013-06-22 22:43:301625
1626 // The HTTP transaction will complete.
mmenke651bae7f2015-12-18 21:26:451627 SequencedSocketData http_data2(http_reads, arraysize(http_reads), http_writes,
1628 arraysize(http_writes));
bnc912a04b2016-04-20 14:19:501629 socket_factory_.AddSocketDataProvider(&http_data2);
1630 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301631
bnc912a04b2016-04-20 14:19:501632 CreateSession();
[email protected]dda75ab2013-06-22 22:43:301633
1634 // Run the first request.
[email protected]dda75ab2013-06-22 22:43:301635 SendRequestAndExpectHttpResponse("hello world");
rch37de576c2015-05-17 20:28:171636 ASSERT_TRUE(http_data.AllReadDataConsumed());
1637 ASSERT_TRUE(http_data.AllWriteDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301638
1639 // Now run the second request in which the QUIC socket hangs,
1640 // and verify the the transaction continues over HTTP.
[email protected]dda75ab2013-06-22 22:43:301641 SendRequestAndExpectHttpResponse("hello world");
mmenke651bae7f2015-12-18 21:26:451642 base::RunLoop().RunUntilIdle();
[email protected]dda75ab2013-06-22 22:43:301643
rch37de576c2015-05-17 20:28:171644 ASSERT_TRUE(http_data2.AllReadDataConsumed());
1645 ASSERT_TRUE(http_data2.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:451646 ASSERT_TRUE(quic_data.AllReadDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301647}
1648
[email protected]1e960032013-12-20 19:00:201649TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
[email protected]1e960032013-12-20 19:00:201650 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581651 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1652 1, kClientDataStreamId1, true, true,
1653 GetRequestHeaders("GET", "https", "/")));
1654 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021655 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581656 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1657 false, true, 0, "hello!"));
1658 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501659 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591660 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]8ba81212013-05-03 13:11:481661
rcha5399e02015-04-21 19:32:041662 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]8ba81212013-05-03 13:11:481663
rtennetib8e80fb2016-05-16 00:12:091664 // The non-alternate protocol job needs to hang in order to guarantee that
1665 // the alternate-protocol job will "win".
1666 AddHangingNonAlternateProtocolSocketData();
1667
rch3f4b8452016-02-23 16:59:321668 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:191669 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1670 SendRequestAndExpectQuicResponse("hello!");
[email protected]8ba81212013-05-03 13:11:481671}
1672
[email protected]1e960032013-12-20 19:00:201673TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
[email protected]1e960032013-12-20 19:00:201674 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581675 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1676 1, kClientDataStreamId1, true, true,
1677 GetRequestHeaders("GET", "https", "/")));
1678 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021679 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581680 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1681 false, true, 0, "hello!"));
1682 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501683 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591684 mock_quic_data.AddRead(ASYNC, 0); // EOF
rcha5399e02015-04-21 19:32:041685 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]3a120a6b2013-06-25 01:08:271686
1687 // In order for a new QUIC session to be established via alternate-protocol
1688 // without racing an HTTP connection, we need the host resolution to happen
1689 // synchronously.
1690 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291691 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561692 "");
rch9ae5b3b2016-02-11 00:36:291693 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]3a120a6b2013-06-25 01:08:271694 AddressList address;
maksim.sisov31452af2016-07-27 06:38:101695 std::unique_ptr<HostResolver::Request> request;
rjshaded5ced072015-12-18 19:26:021696 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
maksim.sisov31452af2016-07-27 06:38:101697 &request, net_log_.bound());
[email protected]3a120a6b2013-06-25 01:08:271698
rtennetib8e80fb2016-05-16 00:12:091699 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321700 CreateSession();
[email protected]3a120a6b2013-06-25 01:08:271701 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1702 SendRequestAndExpectQuicResponse("hello!");
1703}
1704
[email protected]0fc924b2014-03-31 04:34:151705TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) {
rdsmith82957ad2015-09-16 19:42:031706 proxy_service_ = ProxyService::CreateFixedFromPacResult("PROXY myproxy:70");
[email protected]0fc924b2014-03-31 04:34:151707
1708 // Since we are using a proxy, the QUIC job will not succeed.
1709 MockWrite http_writes[] = {
rch9ae5b3b2016-02-11 00:36:291710 MockWrite(SYNCHRONOUS, 0, "GET http://mail.example.org/ HTTP/1.1\r\n"),
1711 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561712 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")};
[email protected]0fc924b2014-03-31 04:34:151713
1714 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561715 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
bnc1c196c6e2016-05-28 13:51:481716 MockRead(SYNCHRONOUS, 4, kQuicAlternativeServiceHeader),
rchf114d982015-10-21 01:34:561717 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]0fc924b2014-03-31 04:34:151718
1719 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
1720 http_writes, arraysize(http_writes));
1721 socket_factory_.AddSocketDataProvider(&http_data);
1722
1723 // In order for a new QUIC session to be established via alternate-protocol
1724 // without racing an HTTP connection, we need the host resolution to happen
1725 // synchronously.
1726 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291727 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561728 "");
rch9ae5b3b2016-02-11 00:36:291729 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]0fc924b2014-03-31 04:34:151730 AddressList address;
maksim.sisov31452af2016-07-27 06:38:101731 std::unique_ptr<HostResolver::Request> request;
rjshaded5ced072015-12-18 19:26:021732 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
maksim.sisov31452af2016-07-27 06:38:101733 &request, net_log_.bound());
[email protected]0fc924b2014-03-31 04:34:151734
rch9ae5b3b2016-02-11 00:36:291735 request_.url = GURL("http://mail.example.org/");
rch3f4b8452016-02-23 16:59:321736 CreateSession();
[email protected]0fc924b2014-03-31 04:34:151737 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1738 SendRequestAndExpectHttpResponse("hello world");
1739}
1740
[email protected]1e960032013-12-20 19:00:201741TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
[email protected]1e960032013-12-20 19:00:201742 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581743 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1744 1, kClientDataStreamId1, true, true,
1745 GetRequestHeaders("GET", "https", "/")));
1746 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021747 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581748 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1749 false, true, 0, "hello!"));
1750 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591751 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
rcha5399e02015-04-21 19:32:041752 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]11c05872013-08-20 02:04:121753
rtennetib8e80fb2016-05-16 00:12:091754 // The non-alternate protocol job needs to hang in order to guarantee that
1755 // the alternate-protocol job will "win".
1756 AddHangingNonAlternateProtocolSocketData();
1757
[email protected]11c05872013-08-20 02:04:121758 // In order for a new QUIC session to be established via alternate-protocol
1759 // without racing an HTTP connection, we need the host resolution to happen
1760 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1761 // connection to the the server, in this test we require confirmation
1762 // before encrypting so the HTTP job will still start.
1763 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291764 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561765 "");
rch9ae5b3b2016-02-11 00:36:291766 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]11c05872013-08-20 02:04:121767 AddressList address;
maksim.sisov31452af2016-07-27 06:38:101768 std::unique_ptr<HostResolver::Request> request;
rjshaded5ced072015-12-18 19:26:021769 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
maksim.sisov31452af2016-07-27 06:38:101770 &request, net_log_.bound());
[email protected]11c05872013-08-20 02:04:121771
rch3f4b8452016-02-23 16:59:321772 CreateSession();
[email protected]11c05872013-08-20 02:04:121773 session_->quic_stream_factory()->set_require_confirmation(true);
1774 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1775
danakjad1777e2016-04-16 00:56:421776 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]11c05872013-08-20 02:04:121777 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1778 TestCompletionCallback callback;
1779 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
robpercival214763f2016-07-01 23:27:011780 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]11c05872013-08-20 02:04:121781
1782 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1783 QuicSession::HANDSHAKE_CONFIRMED);
robpercival214763f2016-07-01 23:27:011784 EXPECT_THAT(callback.WaitForResult(), IsOk());
rchb27683c2015-07-29 23:53:501785
1786 CheckWasQuicResponse(trans);
1787 CheckResponseData(trans, "hello!");
[email protected]11c05872013-08-20 02:04:121788}
1789
zhongyica364fbb2015-12-12 03:39:121790TEST_P(QuicNetworkTransactionTest,
1791 LogGranularQuicErrorCodeOnQuicProtocolErrorLocal) {
1792 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581793 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1794 1, kClientDataStreamId1, true, true,
1795 GetRequestHeaders("GET", "https", "/")));
zhongyica364fbb2015-12-12 03:39:121796 // Read a close connection packet with
1797 // QuicErrorCode: QUIC_CRYPTO_VERSION_NOT_SUPPORTED from the peer.
alyssar2adf3ac2016-05-03 17:12:581798 mock_quic_data.AddRead(ConstructServerConnectionClosePacket(1));
zhongyica364fbb2015-12-12 03:39:121799 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1800
1801 // The non-alternate protocol job needs to hang in order to guarantee that
1802 // the alternate-protocol job will "win".
1803 AddHangingNonAlternateProtocolSocketData();
1804
1805 // In order for a new QUIC session to be established via alternate-protocol
1806 // without racing an HTTP connection, we need the host resolution to happen
1807 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1808 // connection to the the server, in this test we require confirmation
1809 // before encrypting so the HTTP job will still start.
1810 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291811 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:121812 "");
rch9ae5b3b2016-02-11 00:36:291813 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:121814 AddressList address;
maksim.sisov31452af2016-07-27 06:38:101815 std::unique_ptr<HostResolver::Request> request;
zhongyica364fbb2015-12-12 03:39:121816 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
maksim.sisov31452af2016-07-27 06:38:101817 &request, net_log_.bound());
zhongyica364fbb2015-12-12 03:39:121818
rch3f4b8452016-02-23 16:59:321819 CreateSession();
zhongyica364fbb2015-12-12 03:39:121820 session_->quic_stream_factory()->set_require_confirmation(true);
1821 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1822
danakjad1777e2016-04-16 00:56:421823 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyica364fbb2015-12-12 03:39:121824 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1825 TestCompletionCallback callback;
1826 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
robpercival214763f2016-07-01 23:27:011827 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
zhongyica364fbb2015-12-12 03:39:121828
1829 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1830 QuicSession::HANDSHAKE_CONFIRMED);
robpercival214763f2016-07-01 23:27:011831 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_QUIC_PROTOCOL_ERROR));
zhongyica364fbb2015-12-12 03:39:121832
1833 NetErrorDetails details;
1834 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1835
1836 trans->PopulateNetErrorDetails(&details);
1837 // Verify the error code logged is what sent by the peer.
1838 EXPECT_EQ(QUIC_CRYPTO_VERSION_NOT_SUPPORTED, details.quic_connection_error);
1839}
1840
1841TEST_P(QuicNetworkTransactionTest,
1842 LogGranularQuicErrorCodeOnQuicProtocolErrorRemote) {
1843 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581844 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1845 1, kClientDataStreamId1, true, true,
1846 GetRequestHeaders("GET", "https", "/")));
zhongyif28b4a32016-04-25 21:35:211847 // Peer sending data from an non-existing stream causes this end to raise
1848 // error and close connection.
1849 mock_quic_data.AddRead(
alyssar2adf3ac2016-05-03 17:12:581850 ConstructServerRstPacket(1, false, 99, QUIC_STREAM_LAST_ERROR));
zhongyif28b4a32016-04-25 21:35:211851 std::string quic_error_details = "Data for nonexistent stream";
alyssar2adf3ac2016-05-03 17:12:581852 mock_quic_data.AddWrite(ConstructClientAckAndConnectionClosePacket(
zhongyif28b4a32016-04-25 21:35:211853 2, QuicTime::Delta::Infinite(), 0, 1, QUIC_INVALID_STREAM_ID,
zhongyica364fbb2015-12-12 03:39:121854 quic_error_details));
1855 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1856
1857 // The non-alternate protocol job needs to hang in order to guarantee that
1858 // the alternate-protocol job will "win".
1859 AddHangingNonAlternateProtocolSocketData();
1860
1861 // In order for a new QUIC session to be established via alternate-protocol
1862 // without racing an HTTP connection, we need the host resolution to happen
1863 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1864 // connection to the the server, in this test we require confirmation
1865 // before encrypting so the HTTP job will still start.
1866 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291867 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:121868 "");
rch9ae5b3b2016-02-11 00:36:291869 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:121870 AddressList address;
maksim.sisov31452af2016-07-27 06:38:101871 std::unique_ptr<HostResolver::Request> request;
zhongyica364fbb2015-12-12 03:39:121872 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
maksim.sisov31452af2016-07-27 06:38:101873 &request, net_log_.bound());
zhongyica364fbb2015-12-12 03:39:121874
rch3f4b8452016-02-23 16:59:321875 CreateSession();
zhongyica364fbb2015-12-12 03:39:121876 session_->quic_stream_factory()->set_require_confirmation(true);
1877 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1878
danakjad1777e2016-04-16 00:56:421879 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyica364fbb2015-12-12 03:39:121880 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1881 TestCompletionCallback callback;
1882 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
robpercival214763f2016-07-01 23:27:011883 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
zhongyica364fbb2015-12-12 03:39:121884
1885 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1886 QuicSession::HANDSHAKE_CONFIRMED);
robpercival214763f2016-07-01 23:27:011887 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_QUIC_PROTOCOL_ERROR));
zhongyica364fbb2015-12-12 03:39:121888 NetErrorDetails details;
1889 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1890
1891 trans->PopulateNetErrorDetails(&details);
zhongyif28b4a32016-04-25 21:35:211892 EXPECT_EQ(QUIC_INVALID_STREAM_ID, details.quic_connection_error);
zhongyica364fbb2015-12-12 03:39:121893}
1894
rchcd5f1c62016-06-23 02:43:481895TEST_P(QuicNetworkTransactionTest, RstSteamErrorHandling) {
1896 MockQuicData mock_quic_data;
1897 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1898 1, kClientDataStreamId1, true, true,
1899 GetRequestHeaders("GET", "https", "/")));
1900 // Read the response headers, then a RST_STREAM frame.
1901 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
1902 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1903 mock_quic_data.AddRead(ConstructServerRstPacket(
1904 2, false, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1905 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
1906 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
1907 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1908
1909 // The non-alternate protocol job needs to hang in order to guarantee that
1910 // the alternate-protocol job will "win".
1911 AddHangingNonAlternateProtocolSocketData();
1912
1913 // In order for a new QUIC session to be established via alternate-protocol
1914 // without racing an HTTP connection, we need the host resolution to happen
1915 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1916 // connection to the the server, in this test we require confirmation
1917 // before encrypting so the HTTP job will still start.
1918 host_resolver_.set_synchronous_mode(true);
1919 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1920 "");
1921 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1922 AddressList address;
maksim.sisov31452af2016-07-27 06:38:101923 std::unique_ptr<HostResolver::Request> request;
rchcd5f1c62016-06-23 02:43:481924 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
maksim.sisov31452af2016-07-27 06:38:101925 &request, net_log_.bound());
rchcd5f1c62016-06-23 02:43:481926
1927 CreateSession();
1928 session_->quic_stream_factory()->set_require_confirmation(true);
1929 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1930
1931 std::unique_ptr<HttpNetworkTransaction> trans(
1932 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1933 TestCompletionCallback callback;
1934 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
robpercival214763f2016-07-01 23:27:011935 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
rchcd5f1c62016-06-23 02:43:481936
1937 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1938 QuicSession::HANDSHAKE_CONFIRMED);
1939 // Read the headers.
robpercival214763f2016-07-01 23:27:011940 EXPECT_THAT(callback.WaitForResult(), IsOk());
rchcd5f1c62016-06-23 02:43:481941
1942 const HttpResponseInfo* response = trans->GetResponseInfo();
1943 ASSERT_TRUE(response != nullptr);
1944 ASSERT_TRUE(response->headers.get() != nullptr);
1945 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
1946 EXPECT_TRUE(response->was_fetched_via_spdy);
1947 EXPECT_TRUE(response->was_npn_negotiated);
1948 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
1949 response->connection_info);
1950
1951 std::string response_data;
1952 ASSERT_EQ(ERR_QUIC_PROTOCOL_ERROR,
1953 ReadTransaction(trans.get(), &response_data));
1954}
1955
1956TEST_P(QuicNetworkTransactionTest, RstSteamBeforeHeaders) {
1957 MockQuicData mock_quic_data;
1958 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1959 1, kClientDataStreamId1, true, true,
1960 GetRequestHeaders("GET", "https", "/")));
1961 mock_quic_data.AddRead(ConstructServerRstPacket(
1962 1, false, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1963 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
1964 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1965
1966 // The non-alternate protocol job needs to hang in order to guarantee that
1967 // the alternate-protocol job will "win".
1968 AddHangingNonAlternateProtocolSocketData();
1969
1970 // In order for a new QUIC session to be established via alternate-protocol
1971 // without racing an HTTP connection, we need the host resolution to happen
1972 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1973 // connection to the the server, in this test we require confirmation
1974 // before encrypting so the HTTP job will still start.
1975 host_resolver_.set_synchronous_mode(true);
1976 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1977 "");
1978 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1979 AddressList address;
maksim.sisov31452af2016-07-27 06:38:101980 std::unique_ptr<HostResolver::Request> request;
rchcd5f1c62016-06-23 02:43:481981 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
maksim.sisov31452af2016-07-27 06:38:101982 &request, net_log_.bound());
rchcd5f1c62016-06-23 02:43:481983
1984 CreateSession();
1985 session_->quic_stream_factory()->set_require_confirmation(true);
1986 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1987
1988 std::unique_ptr<HttpNetworkTransaction> trans(
1989 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1990 TestCompletionCallback callback;
1991 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
robpercival214763f2016-07-01 23:27:011992 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
rchcd5f1c62016-06-23 02:43:481993
1994 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1995 QuicSession::HANDSHAKE_CONFIRMED);
1996 // Read the headers.
robpercival214763f2016-07-01 23:27:011997 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_QUIC_PROTOCOL_ERROR));
rchcd5f1c62016-06-23 02:43:481998}
1999
[email protected]1e960032013-12-20 19:00:202000TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
[email protected]3316d422013-05-03 21:45:302001 // Alternate-protocol job
alyssar2adf3ac2016-05-03 17:12:582002 std::unique_ptr<QuicEncryptedPacket> close(
2003 ConstructServerConnectionClosePacket(1));
[email protected]3316d422013-05-03 21:45:302004 MockRead quic_reads[] = {
rchb27683c2015-07-29 23:53:502005 MockRead(ASYNC, close->data(), close->length()),
2006 MockRead(ASYNC, ERR_IO_PENDING), // No more data to read
2007 MockRead(ASYNC, OK), // EOF
[email protected]3316d422013-05-03 21:45:302008 };
rjshaded5ced072015-12-18 19:26:022009 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2010 0);
[email protected]3316d422013-05-03 21:45:302011 socket_factory_.AddSocketDataProvider(&quic_data);
2012
2013 // Main job which will succeed even though the alternate job fails.
2014 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022015 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2016 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2017 MockRead(ASYNC, OK)};
[email protected]3316d422013-05-03 21:45:302018
rjshaded5ced072015-12-18 19:26:022019 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2020 0);
[email protected]3316d422013-05-03 21:45:302021 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562022 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]3316d422013-05-03 21:45:302023
rch3f4b8452016-02-23 16:59:322024 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:192025 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2026 SendRequestAndExpectHttpResponse("hello from http");
2027 ExpectBrokenAlternateProtocolMapping();
[email protected]3316d422013-05-03 21:45:302028}
2029
[email protected]1e960032013-12-20 19:00:202030TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
[email protected]d03a66d2013-05-06 12:55:592031 // Alternate-protocol job
2032 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022033 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]d03a66d2013-05-06 12:55:592034 };
rjshaded5ced072015-12-18 19:26:022035 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2036 0);
[email protected]d03a66d2013-05-06 12:55:592037 socket_factory_.AddSocketDataProvider(&quic_data);
2038
2039 // Main job which will succeed even though the alternate job fails.
2040 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022041 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2042 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2043 MockRead(ASYNC, OK)};
[email protected]d03a66d2013-05-06 12:55:592044
rjshaded5ced072015-12-18 19:26:022045 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2046 0);
[email protected]d03a66d2013-05-06 12:55:592047 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562048 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]d03a66d2013-05-06 12:55:592049
rch3f4b8452016-02-23 16:59:322050 CreateSession();
[email protected]d03a66d2013-05-06 12:55:592051
[email protected]aa9b14d2013-05-10 23:45:192052 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2053 SendRequestAndExpectHttpResponse("hello from http");
2054 ExpectBrokenAlternateProtocolMapping();
[email protected]d03a66d2013-05-06 12:55:592055}
2056
[email protected]00c159f2014-05-21 22:38:162057TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) {
[email protected]eb71ab62014-05-23 07:57:532058 // Alternate-protocol job will fail when the session attempts to read.
[email protected]00c159f2014-05-21 22:38:162059 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022060 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162061 };
rjshaded5ced072015-12-18 19:26:022062 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2063 0);
[email protected]00c159f2014-05-21 22:38:162064 socket_factory_.AddSocketDataProvider(&quic_data);
2065
[email protected]eb71ab62014-05-23 07:57:532066 // Main job will also fail.
[email protected]00c159f2014-05-21 22:38:162067 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022068 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162069 };
2070
rjshaded5ced072015-12-18 19:26:022071 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2072 0);
[email protected]00c159f2014-05-21 22:38:162073 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED));
2074 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562075 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]00c159f2014-05-21 22:38:162076
rtennetib8e80fb2016-05-16 00:12:092077 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322078 CreateSession();
[email protected]00c159f2014-05-21 22:38:162079
2080 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
danakjad1777e2016-04-16 00:56:422081 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]00c159f2014-05-21 22:38:162082 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2083 TestCompletionCallback callback;
2084 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
robpercival214763f2016-07-01 23:27:012085 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2086 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_SOCKET_NOT_CONNECTED));
[email protected]00c159f2014-05-21 22:38:162087 ExpectQuicAlternateProtocolMapping();
2088}
2089
[email protected]1e960032013-12-20 19:00:202090TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
[email protected]77c6c162013-08-17 02:57:452091 // Alternate-protocol job
2092 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022093 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]77c6c162013-08-17 02:57:452094 };
rjshaded5ced072015-12-18 19:26:022095 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2096 0);
[email protected]77c6c162013-08-17 02:57:452097 socket_factory_.AddSocketDataProvider(&quic_data);
2098
[email protected]c92c1b52014-05-31 04:16:062099 // Second Alternate-protocol job which will race with the TCP job.
2100 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:422101 nullptr, 0);
[email protected]c92c1b52014-05-31 04:16:062102 socket_factory_.AddSocketDataProvider(&quic_data2);
2103
[email protected]4d283b32013-10-17 12:57:272104 // Final job that will proceed when the QUIC job fails.
2105 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022106 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2107 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2108 MockRead(ASYNC, OK)};
[email protected]4d283b32013-10-17 12:57:272109
rjshaded5ced072015-12-18 19:26:022110 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2111 0);
[email protected]4d283b32013-10-17 12:57:272112 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562113 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d283b32013-10-17 12:57:272114
rtennetiafccbc062016-05-16 18:21:142115 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322116 CreateSession();
[email protected]77c6c162013-08-17 02:57:452117
2118 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2119
[email protected]4d283b32013-10-17 12:57:272120 SendRequestAndExpectHttpResponse("hello from http");
[email protected]77c6c162013-08-17 02:57:452121
2122 ExpectBrokenAlternateProtocolMapping();
[email protected]4d283b32013-10-17 12:57:272123
rch37de576c2015-05-17 20:28:172124 EXPECT_TRUE(quic_data.AllReadDataConsumed());
2125 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
[email protected]77c6c162013-08-17 02:57:452126}
2127
[email protected]93b31772014-06-19 08:03:352128TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) {
[email protected]65768442014-06-06 23:37:032129 // Alternate-protocol job
2130 MockRead quic_reads[] = {
mmenkee24011922015-12-17 22:12:592131 MockRead(SYNCHRONOUS, ERR_IO_PENDING),
[email protected]65768442014-06-06 23:37:032132 };
rjshaded5ced072015-12-18 19:26:022133 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2134 0);
[email protected]65768442014-06-06 23:37:032135 socket_factory_.AddSocketDataProvider(&quic_data);
2136
2137 // Main job that will proceed when the QUIC job fails.
2138 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022139 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2140 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2141 MockRead(ASYNC, OK)};
[email protected]65768442014-06-06 23:37:032142
rjshaded5ced072015-12-18 19:26:022143 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2144 0);
[email protected]65768442014-06-06 23:37:032145 socket_factory_.AddSocketDataProvider(&http_data);
2146
rtennetib8e80fb2016-05-16 00:12:092147 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322148 CreateSession();
[email protected]65768442014-06-06 23:37:032149
2150 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2151
2152 SendRequestAndExpectHttpResponse("hello from http");
2153}
2154
[email protected]eb71ab62014-05-23 07:57:532155TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
[email protected]4d590c9c2014-05-02 05:14:332156 // Alternate-protocol job will fail before creating a QUIC session.
rtennetibe635732014-10-02 22:51:422157 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0);
rjshaded5ced072015-12-18 19:26:022158 quic_data.set_connect_data(
2159 MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED));
[email protected]4d590c9c2014-05-02 05:14:332160 socket_factory_.AddSocketDataProvider(&quic_data);
2161
2162 // Main job which will succeed even though the alternate job fails.
2163 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022164 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2165 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2166 MockRead(ASYNC, OK)};
[email protected]4d590c9c2014-05-02 05:14:332167
rjshaded5ced072015-12-18 19:26:022168 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2169 0);
[email protected]4d590c9c2014-05-02 05:14:332170 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562171 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d590c9c2014-05-02 05:14:332172
rch3f4b8452016-02-23 16:59:322173 CreateSession();
[email protected]4d590c9c2014-05-02 05:14:332174 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2175 SendRequestAndExpectHttpResponse("hello from http");
[email protected]eb71ab62014-05-23 07:57:532176
2177 ExpectBrokenAlternateProtocolMapping();
[email protected]4d590c9c2014-05-02 05:14:332178}
2179
[email protected]4fee9672014-01-08 14:47:152180TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
[email protected]4fee9672014-01-08 14:47:152181 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582182 mock_quic_data.AddSynchronousRead(ConstructServerConnectionClosePacket(1));
2183 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2184 1, kClientDataStreamId1, true, true,
2185 GetRequestHeaders("GET", "https", "/")));
2186 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rcha5399e02015-04-21 19:32:042187 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4fee9672014-01-08 14:47:152188
2189 // When the QUIC connection fails, we will try the request again over HTTP.
2190 MockRead http_reads[] = {
bnc1c196c6e2016-05-28 13:51:482191 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
rchf114d982015-10-21 01:34:562192 MockRead("hello world"),
2193 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2194 MockRead(ASYNC, OK)};
[email protected]4fee9672014-01-08 14:47:152195
rjshaded5ced072015-12-18 19:26:022196 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2197 0);
[email protected]4fee9672014-01-08 14:47:152198 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562199 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4fee9672014-01-08 14:47:152200
2201 // In order for a new QUIC session to be established via alternate-protocol
2202 // without racing an HTTP connection, we need the host resolution to happen
2203 // synchronously.
2204 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:292205 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:562206 "");
rch9ae5b3b2016-02-11 00:36:292207 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]4fee9672014-01-08 14:47:152208 AddressList address;
maksim.sisov31452af2016-07-27 06:38:102209 std::unique_ptr<HostResolver::Request> request;
rjshaded5ced072015-12-18 19:26:022210 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
maksim.sisov31452af2016-07-27 06:38:102211 &request, net_log_.bound());
[email protected]4fee9672014-01-08 14:47:152212
rch3f4b8452016-02-23 16:59:322213 CreateSession();
[email protected]4fee9672014-01-08 14:47:152214 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2215 SendRequestAndExpectHttpResponse("hello world");
2216}
2217
bnc508835902015-05-12 20:10:292218TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) {
alyssar2adf3ac2016-05-03 17:12:582219 client_maker_.set_hostname("www.example.org");
tbansal0f56a39a2016-04-07 22:03:382220 EXPECT_FALSE(
2221 test_socket_performance_watcher_factory_.rtt_notification_received());
bnc508835902015-05-12 20:10:292222 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582223 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2224 1, kClientDataStreamId1, true, true,
2225 GetRequestHeaders("GET", "https", "/")));
2226 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc508835902015-05-12 20:10:292227 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:582228 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
2229 false, true, 0, "hello!"));
2230 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:502231 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
bnc508835902015-05-12 20:10:292232 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2233
bncb07c05532015-05-14 19:07:202234 request_.url = GURL("https://www.example.org:443");
rtennetib8e80fb2016-05-16 00:12:092235 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322236 CreateSession();
bnc508835902015-05-12 20:10:292237 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
2238 SendRequestAndExpectQuicResponse("hello!");
tbansal0f56a39a2016-04-07 22:03:382239 EXPECT_TRUE(
2240 test_socket_performance_watcher_factory_.rtt_notification_received());
bnc508835902015-05-12 20:10:292241}
2242
rtenneti56977812016-01-15 19:26:562243TEST_P(QuicNetworkTransactionTest, QuicUpload) {
rtenneti8a2f4632016-03-21 20:26:572244 params_.origins_to_force_quic_on.insert(
2245 HostPortPair::FromString("mail.example.org:443"));
rtenneti56977812016-01-15 19:26:562246
2247 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2248 MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_FAILED, 1)};
2249 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2250 arraysize(writes));
2251 socket_factory_.AddSocketDataProvider(&socket_data);
2252
rtennetib8e80fb2016-05-16 00:12:092253 // The non-alternate protocol job needs to hang in order to guarantee that
2254 // the alternate-protocol job will "win".
2255 AddHangingNonAlternateProtocolSocketData();
2256
rtenneti56977812016-01-15 19:26:562257 CreateSession();
2258 request_.method = "POST";
2259 ChunkedUploadDataStream upload_data(0);
2260 upload_data.AppendData("1", 1, true);
2261
2262 request_.upload_data_stream = &upload_data;
2263
danakjad1777e2016-04-16 00:56:422264 std::unique_ptr<HttpNetworkTransaction> trans(
rtenneti56977812016-01-15 19:26:562265 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2266 TestCompletionCallback callback;
2267 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
robpercival214763f2016-07-01 23:27:012268 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
rtenneti56977812016-01-15 19:26:562269 EXPECT_NE(OK, callback.WaitForResult());
2270}
2271
ckrasic769733c2016-06-30 00:42:132272// Adds coverage to catch regression such as https://crbug.com/622043
2273TEST_P(QuicNetworkTransactionTest, QuicServerPush) {
2274 params_.origins_to_force_quic_on.insert(
2275 HostPortPair::FromString("mail.example.org:443"));
2276
2277 MockQuicData mock_quic_data;
2278 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2279 1, kClientDataStreamId1, true, true,
2280 GetRequestHeaders("GET", "https", "/")));
2281 QuicStreamOffset server_header_offset = 0;
2282 mock_quic_data.AddRead(ConstructServerPushPromisePacket(
2283 1, kClientDataStreamId1, kServerDataStreamId1, false,
2284 GetRequestHeaders("GET", "https", "/pushed.jpg"), &server_header_offset,
2285 &server_maker_));
2286 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2287 2, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
2288 &server_header_offset));
2289 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 2, 1, 1));
2290 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2291 3, kServerDataStreamId1, false, false, GetResponseHeaders("200 OK"),
2292 &server_header_offset));
2293 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId1,
2294 false, true, 0, "hello!"));
2295 mock_quic_data.AddWrite(ConstructClientAckPacket(3, 4, 3, 1));
2296 mock_quic_data.AddRead(ConstructServerDataPacket(
2297 5, kServerDataStreamId1, false, true, 0, "and hello!"));
2298 mock_quic_data.AddWrite(
2299 ConstructClientAckAndRstPacket(4, 4, QUIC_RST_ACKNOWLEDGEMENT, 5, 5, 1));
2300 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2301 mock_quic_data.AddRead(ASYNC, 0); // EOF
2302 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2303
2304 // The non-alternate protocol job needs to hang in order to guarantee that
2305 // the alternate-protocol job will "win".
2306 AddHangingNonAlternateProtocolSocketData();
2307
2308 CreateSession();
2309
2310 // PUSH_PROMISE handling in the http layer gets exercised here.
2311 SendRequestAndExpectQuicResponse("hello!");
2312
2313 request_.url = GURL("https://mail.example.org/pushed.jpg");
2314 SendRequestAndExpectQuicResponse("and hello!");
2315
2316 // Check that the NetLog was filled reasonably.
2317 TestNetLogEntry::List entries;
2318 net_log_.GetEntries(&entries);
2319 EXPECT_LT(0u, entries.size());
2320
2321 // Check that we logged a QUIC_HTTP_STREAM_ADOPTED_PUSH_STREAM
2322 int pos = ExpectLogContainsSomewhere(
2323 entries, 0, NetLog::TYPE_QUIC_HTTP_STREAM_ADOPTED_PUSH_STREAM,
2324 NetLog::PHASE_NONE);
2325 EXPECT_LT(0, pos);
2326}
2327
ckrasicda193a82016-07-09 00:39:362328TEST_P(QuicNetworkTransactionTest, QuicForceHolBlocking) {
2329 FLAGS_quic_enable_version_35 = true;
2330 FLAGS_quic_enable_version_36 = true;
2331 params_.quic_force_hol_blocking = true;
2332 params_.origins_to_force_quic_on.insert(
2333 HostPortPair::FromString("mail.example.org:443"));
2334
2335 MockQuicData mock_quic_data;
2336
2337 QuicStreamOffset offset = 0;
2338 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2339 1, kClientDataStreamId1, true, false,
2340 GetRequestHeaders("POST", "https", "/"), &offset));
2341
2342 std::unique_ptr<QuicEncryptedPacket> packet;
2343 if (GetParam() > QUIC_VERSION_35) {
2344 packet = ConstructClientForceHolDataPacket(2, kClientDataStreamId1, true,
2345 true, &offset, "1");
2346 } else {
2347 packet =
2348 ConstructClientDataPacket(2, kClientDataStreamId1, true, true, 0, "1");
2349 }
2350 mock_quic_data.AddWrite(std::move(packet));
2351
2352 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2353 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
2354
2355 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
2356 false, true, 0, "hello!"));
2357
2358 mock_quic_data.AddWrite(ConstructClientAckPacket(3, 2, 1, 1));
2359
2360 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2361 mock_quic_data.AddRead(ASYNC, 0); // EOF
2362 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2363
2364 // The non-alternate protocol job needs to hang in order to guarantee that
2365 // the alternate-protocol job will "win".
2366 AddHangingNonAlternateProtocolSocketData();
2367
2368 CreateSession();
2369 request_.method = "POST";
2370 ChunkedUploadDataStream upload_data(0);
2371 upload_data.AppendData("1", 1, true);
2372
2373 request_.upload_data_stream = &upload_data;
2374
2375 SendRequestAndExpectQuicResponse("hello!");
2376}
2377
bnc359ed2a2016-04-29 20:43:452378class QuicNetworkTransactionWithDestinationTest
2379 : public PlatformTest,
2380 public ::testing::WithParamInterface<PoolingTestParams> {
2381 protected:
2382 QuicNetworkTransactionWithDestinationTest()
2383 : clock_(new MockClock),
2384 version_(GetParam().version),
2385 destination_type_(GetParam().destination_type),
2386 cert_transparency_verifier_(new MultiLogCTVerifier()),
2387 ssl_config_service_(new SSLConfigServiceDefaults),
2388 proxy_service_(ProxyService::CreateDirect()),
2389 auth_handler_factory_(
2390 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
2391 random_generator_(0),
2392 ssl_data_(ASYNC, OK) {}
2393
2394 void SetUp() override {
2395 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:552396 base::RunLoop().RunUntilIdle();
bnc359ed2a2016-04-29 20:43:452397
2398 HttpNetworkSession::Params params;
2399
2400 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
2401 params.quic_clock = clock_;
2402
2403 crypto_client_stream_factory_.set_handshake_mode(
2404 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2405 params.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
2406
bnc359ed2a2016-04-29 20:43:452407 params.enable_quic = true;
2408 params.quic_random = &random_generator_;
2409 params.client_socket_factory = &socket_factory_;
2410 params.host_resolver = &host_resolver_;
2411 params.cert_verifier = &cert_verifier_;
2412 params.transport_security_state = &transport_security_state_;
2413 params.cert_transparency_verifier = cert_transparency_verifier_.get();
rsleevid6de8302016-06-21 01:33:202414 params.ct_policy_enforcer = &ct_policy_enforcer_;
bnc359ed2a2016-04-29 20:43:452415 params.socket_performance_watcher_factory =
2416 &test_socket_performance_watcher_factory_;
2417 params.ssl_config_service = ssl_config_service_.get();
2418 params.proxy_service = proxy_service_.get();
2419 params.http_auth_handler_factory = auth_handler_factory_.get();
bnc525e175a2016-06-20 12:36:402420 params.http_server_properties = &http_server_properties_;
bnc359ed2a2016-04-29 20:43:452421 params.quic_supported_versions = SupportedVersions(version_);
2422 params.quic_host_whitelist.insert("news.example.org");
2423 params.quic_host_whitelist.insert("mail.example.org");
2424 params.quic_host_whitelist.insert("mail.example.com");
2425
2426 session_.reset(new HttpNetworkSession(params));
2427 session_->quic_stream_factory()->set_require_confirmation(true);
2428 ASSERT_EQ(params.quic_socket_receive_buffer_size,
2429 session_->quic_stream_factory()->socket_receive_buffer_size());
2430 }
2431
2432 void TearDown() override {
2433 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
2434 // Empty the current queue.
fdoray92e35a72016-06-10 15:54:552435 base::RunLoop().RunUntilIdle();
bnc359ed2a2016-04-29 20:43:452436 PlatformTest::TearDown();
2437 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:552438 base::RunLoop().RunUntilIdle();
bnc525e175a2016-06-20 12:36:402439 session_.reset();
bnc359ed2a2016-04-29 20:43:452440 }
2441
2442 void SetAlternativeService(const std::string& origin) {
2443 HostPortPair destination;
2444 switch (destination_type_) {
2445 case SAME_AS_FIRST:
2446 destination = HostPortPair(origin1_, 443);
2447 break;
2448 case SAME_AS_SECOND:
2449 destination = HostPortPair(origin2_, 443);
2450 break;
2451 case DIFFERENT:
2452 destination = HostPortPair(kDifferentHostname, 443);
2453 break;
2454 }
2455 AlternativeService alternative_service(QUIC, destination);
2456 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
2457 http_server_properties_.SetAlternativeService(
2458 url::SchemeHostPort("https", origin, 443), alternative_service,
2459 expiration);
2460 }
2461
alyssar2adf3ac2016-05-03 17:12:582462 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452463 QuicPacketNumber packet_number,
2464 QuicStreamId stream_id,
2465 bool should_include_version,
2466 QuicStreamOffset* offset,
2467 QuicTestPacketMaker* maker) {
2468 SpdyPriority priority =
2469 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
2470 SpdyHeaderBlock headers(maker->GetRequestHeaders("GET", "https", "/"));
2471 return maker->MakeRequestHeadersPacketWithOffsetTracking(
2472 packet_number, stream_id, should_include_version, true, priority,
bnc086b39e12016-06-24 13:05:262473 std::move(headers), offset);
bnc359ed2a2016-04-29 20:43:452474 }
2475
alyssar2adf3ac2016-05-03 17:12:582476 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452477 QuicPacketNumber packet_number,
2478 QuicStreamId stream_id,
2479 bool should_include_version,
2480 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:582481 return ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452482 packet_number, stream_id, should_include_version, nullptr, maker);
2483 }
2484
alyssar2adf3ac2016-05-03 17:12:582485 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:452486 QuicPacketNumber packet_number,
2487 QuicStreamId stream_id,
2488 QuicStreamOffset* offset,
2489 QuicTestPacketMaker* maker) {
2490 SpdyHeaderBlock headers(maker->GetResponseHeaders("200 OK"));
2491 return maker->MakeResponseHeadersPacketWithOffsetTracking(
bnc086b39e12016-06-24 13:05:262492 packet_number, stream_id, false, false, std::move(headers), offset);
bnc359ed2a2016-04-29 20:43:452493 }
2494
alyssar2adf3ac2016-05-03 17:12:582495 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:452496 QuicPacketNumber packet_number,
2497 QuicStreamId stream_id,
2498 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:582499 return ConstructServerResponseHeadersPacket(packet_number, stream_id,
2500 nullptr, maker);
bnc359ed2a2016-04-29 20:43:452501 }
2502
alyssar2adf3ac2016-05-03 17:12:582503 std::unique_ptr<QuicEncryptedPacket> ConstructServerDataPacket(
bnc359ed2a2016-04-29 20:43:452504 QuicPacketNumber packet_number,
2505 QuicStreamId stream_id,
2506 QuicTestPacketMaker* maker) {
2507 return maker->MakeDataPacket(packet_number, stream_id, false, true, 0,
2508 "hello");
2509 }
2510
alyssar2adf3ac2016-05-03 17:12:582511 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
bnc359ed2a2016-04-29 20:43:452512 QuicPacketNumber packet_number,
2513 QuicPacketNumber largest_received,
2514 QuicPacketNumber ack_least_unacked,
2515 QuicPacketNumber stop_least_unacked,
2516 QuicTestPacketMaker* maker) {
2517 return maker->MakeAckPacket(packet_number, largest_received,
2518 ack_least_unacked, stop_least_unacked, true);
2519 }
2520
2521 void AddRefusedSocketData() {
2522 std::unique_ptr<StaticSocketDataProvider> refused_data(
2523 new StaticSocketDataProvider());
2524 MockConnect refused_connect(SYNCHRONOUS, ERR_CONNECTION_REFUSED);
2525 refused_data->set_connect_data(refused_connect);
2526 socket_factory_.AddSocketDataProvider(refused_data.get());
2527 static_socket_data_provider_vector_.push_back(std::move(refused_data));
2528 }
2529
2530 void AddHangingSocketData() {
2531 std::unique_ptr<StaticSocketDataProvider> hanging_data(
2532 new StaticSocketDataProvider());
2533 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
2534 hanging_data->set_connect_data(hanging_connect);
2535 socket_factory_.AddSocketDataProvider(hanging_data.get());
2536 static_socket_data_provider_vector_.push_back(std::move(hanging_data));
2537 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
2538 }
2539
2540 bool AllDataConsumed() {
2541 for (const auto& socket_data_ptr : static_socket_data_provider_vector_) {
2542 if (!socket_data_ptr->AllReadDataConsumed() ||
2543 !socket_data_ptr->AllWriteDataConsumed()) {
2544 return false;
2545 }
2546 }
2547 return true;
2548 }
2549
2550 void SendRequestAndExpectQuicResponse(const std::string& host) {
2551 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
2552 HttpRequestInfo request;
2553 std::string url("https://");
2554 url.append(host);
2555 request.url = GURL(url);
2556 request.load_flags = 0;
2557 request.method = "GET";
2558 TestCompletionCallback callback;
2559 int rv = trans.Start(&request, callback.callback(), net_log_.bound());
robpercival214763f2016-07-01 23:27:012560 EXPECT_THAT(callback.GetResult(rv), IsOk());
bnc359ed2a2016-04-29 20:43:452561
2562 std::string response_data;
robpercival214763f2016-07-01 23:27:012563 ASSERT_THAT(ReadTransaction(&trans, &response_data), IsOk());
bnc359ed2a2016-04-29 20:43:452564 EXPECT_EQ("hello", response_data);
2565
2566 const HttpResponseInfo* response = trans.GetResponseInfo();
2567 ASSERT_TRUE(response != nullptr);
2568 ASSERT_TRUE(response->headers.get() != nullptr);
2569 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
2570 EXPECT_TRUE(response->was_fetched_via_spdy);
2571 EXPECT_TRUE(response->was_npn_negotiated);
2572 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
2573 response->connection_info);
2574 EXPECT_EQ(443, response->socket_address.port());
2575 }
2576
2577 MockClock* clock_;
2578 QuicVersion version_;
2579 DestinationType destination_type_;
2580 std::string origin1_;
2581 std::string origin2_;
2582 std::unique_ptr<HttpNetworkSession> session_;
2583 MockClientSocketFactory socket_factory_;
2584 MockHostResolver host_resolver_;
2585 MockCertVerifier cert_verifier_;
2586 TransportSecurityState transport_security_state_;
2587 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
rsleevid6de8302016-06-21 01:33:202588 CTPolicyEnforcer ct_policy_enforcer_;
bnc359ed2a2016-04-29 20:43:452589 TestSocketPerformanceWatcherFactory test_socket_performance_watcher_factory_;
2590 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
2591 std::unique_ptr<ProxyService> proxy_service_;
2592 std::unique_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
2593 MockRandom random_generator_;
2594 HttpServerPropertiesImpl http_server_properties_;
2595 BoundTestNetLog net_log_;
2596 MockCryptoClientStreamFactory crypto_client_stream_factory_;
2597 std::vector<std::unique_ptr<StaticSocketDataProvider>>
2598 static_socket_data_provider_vector_;
2599 SSLSocketDataProvider ssl_data_;
2600};
2601
2602INSTANTIATE_TEST_CASE_P(Version,
2603 QuicNetworkTransactionWithDestinationTest,
2604 ::testing::ValuesIn(GetPoolingTestParams()));
2605
2606// A single QUIC request fails because the certificate does not match the origin
2607// hostname, regardless of whether it matches the alternative service hostname.
2608TEST_P(QuicNetworkTransactionWithDestinationTest, InvalidCertificate) {
2609 if (destination_type_ == DIFFERENT)
2610 return;
2611
2612 GURL url("https://mail.example.com/");
2613 origin1_ = url.host();
2614
2615 // Not used for requests, but this provides a test case where the certificate
2616 // is valid for the hostname of the alternative service.
2617 origin2_ = "mail.example.org";
2618
2619 SetAlternativeService(origin1_);
2620
2621 scoped_refptr<X509Certificate> cert(
2622 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2623 bool unused;
2624 ASSERT_FALSE(cert->VerifyNameMatch(origin1_, &unused));
2625 ASSERT_TRUE(cert->VerifyNameMatch(origin2_, &unused));
2626
2627 ProofVerifyDetailsChromium verify_details;
2628 verify_details.cert_verify_result.verified_cert = cert;
2629 verify_details.cert_verify_result.is_issued_by_known_root = true;
2630 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2631
2632 MockQuicData mock_quic_data;
2633 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);
2634 mock_quic_data.AddRead(ASYNC, 0);
2635
2636 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2637
2638 AddRefusedSocketData();
2639
2640 HttpRequestInfo request;
2641 request.url = url;
2642
2643 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
2644 TestCompletionCallback callback;
2645 int rv = trans.Start(&request, callback.callback(), net_log_.bound());
robpercival214763f2016-07-01 23:27:012646 EXPECT_THAT(callback.GetResult(rv), IsError(ERR_CONNECTION_REFUSED));
bnc359ed2a2016-04-29 20:43:452647
2648 EXPECT_TRUE(AllDataConsumed());
2649}
2650
2651// First request opens QUIC session to alternative service. Second request
2652// pools to it, because destination matches and certificate is valid, even
2653// though QuicServerId is different.
2654TEST_P(QuicNetworkTransactionWithDestinationTest, PoolIfCertificateValid) {
2655 origin1_ = "mail.example.org";
2656 origin2_ = "news.example.org";
2657
2658 SetAlternativeService(origin1_);
2659 SetAlternativeService(origin2_);
2660
2661 scoped_refptr<X509Certificate> cert(
2662 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2663 bool unused;
2664 ASSERT_TRUE(cert->VerifyNameMatch(origin1_, &unused));
2665 ASSERT_TRUE(cert->VerifyNameMatch(origin2_, &unused));
2666 ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname, &unused));
2667
2668 ProofVerifyDetailsChromium verify_details;
2669 verify_details.cert_verify_result.verified_cert = cert;
2670 verify_details.cert_verify_result.is_issued_by_known_root = true;
2671 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2672
alyssar2adf3ac2016-05-03 17:12:582673 QuicTestPacketMaker client_maker1(version_, 0, clock_, origin1_,
2674 Perspective::IS_CLIENT);
2675 QuicTestPacketMaker server_maker1(version_, 0, clock_, origin1_,
2676 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452677
2678 QuicStreamOffset request_header_offset(0);
2679 QuicStreamOffset response_header_offset(0);
2680
2681 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582682 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2683 1, kClientDataStreamId1, true, &request_header_offset, &client_maker1));
2684 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2685 1, kClientDataStreamId1, &response_header_offset, &server_maker1));
2686 mock_quic_data.AddRead(
2687 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker1));
2688 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 2, 1, 1, &client_maker1));
bnc359ed2a2016-04-29 20:43:452689
alyssar2adf3ac2016-05-03 17:12:582690 QuicTestPacketMaker client_maker2(version_, 0, clock_, origin2_,
2691 Perspective::IS_CLIENT);
2692 QuicTestPacketMaker server_maker2(version_, 0, clock_, origin2_,
2693 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452694
alyssar2adf3ac2016-05-03 17:12:582695 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2696 3, kClientDataStreamId2, false, &request_header_offset, &client_maker2));
2697 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2698 3, kClientDataStreamId2, &response_header_offset, &server_maker2));
2699 mock_quic_data.AddRead(
2700 ConstructServerDataPacket(4, kClientDataStreamId2, &server_maker2));
2701 mock_quic_data.AddWrite(ConstructClientAckPacket(4, 4, 3, 1, &client_maker2));
bnc359ed2a2016-04-29 20:43:452702 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2703 mock_quic_data.AddRead(ASYNC, 0); // EOF
2704
2705 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2706
2707 AddHangingSocketData();
2708 AddHangingSocketData();
2709
2710 SendRequestAndExpectQuicResponse(origin1_);
2711 SendRequestAndExpectQuicResponse(origin2_);
2712
2713 EXPECT_TRUE(AllDataConsumed());
2714}
2715
2716// First request opens QUIC session to alternative service. Second request does
2717// not pool to it, even though destination matches, because certificate is not
2718// valid. Instead, a new QUIC session is opened to the same destination with a
2719// different QuicServerId.
2720TEST_P(QuicNetworkTransactionWithDestinationTest,
2721 DoNotPoolIfCertificateInvalid) {
2722 origin1_ = "news.example.org";
2723 origin2_ = "mail.example.com";
2724
2725 SetAlternativeService(origin1_);
2726 SetAlternativeService(origin2_);
2727
2728 scoped_refptr<X509Certificate> cert1(
2729 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2730 bool unused;
2731 ASSERT_TRUE(cert1->VerifyNameMatch(origin1_, &unused));
2732 ASSERT_FALSE(cert1->VerifyNameMatch(origin2_, &unused));
2733 ASSERT_FALSE(cert1->VerifyNameMatch(kDifferentHostname, &unused));
2734
2735 scoped_refptr<X509Certificate> cert2(
2736 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
2737 ASSERT_TRUE(cert2->VerifyNameMatch(origin2_, &unused));
2738 ASSERT_FALSE(cert2->VerifyNameMatch(kDifferentHostname, &unused));
2739
2740 ProofVerifyDetailsChromium verify_details1;
2741 verify_details1.cert_verify_result.verified_cert = cert1;
2742 verify_details1.cert_verify_result.is_issued_by_known_root = true;
2743 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
2744
2745 ProofVerifyDetailsChromium verify_details2;
2746 verify_details2.cert_verify_result.verified_cert = cert2;
2747 verify_details2.cert_verify_result.is_issued_by_known_root = true;
2748 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
2749
alyssar2adf3ac2016-05-03 17:12:582750 QuicTestPacketMaker client_maker1(version_, 0, clock_, origin1_,
2751 Perspective::IS_CLIENT);
2752 QuicTestPacketMaker server_maker1(version_, 0, clock_, origin1_,
2753 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452754
2755 MockQuicData mock_quic_data1;
alyssar2adf3ac2016-05-03 17:12:582756 mock_quic_data1.AddWrite(ConstructClientRequestHeadersPacket(
2757 1, kClientDataStreamId1, true, &client_maker1));
2758 mock_quic_data1.AddRead(ConstructServerResponseHeadersPacket(
2759 1, kClientDataStreamId1, &server_maker1));
2760 mock_quic_data1.AddRead(
2761 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker1));
bnc359ed2a2016-04-29 20:43:452762 mock_quic_data1.AddWrite(
alyssar2adf3ac2016-05-03 17:12:582763 ConstructClientAckPacket(2, 2, 1, 1, &client_maker1));
bnc359ed2a2016-04-29 20:43:452764 mock_quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2765 mock_quic_data1.AddRead(ASYNC, 0); // EOF
2766
2767 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
2768
2769 AddHangingSocketData();
2770
alyssar2adf3ac2016-05-03 17:12:582771 QuicTestPacketMaker client_maker2(version_, 0, clock_, origin2_,
2772 Perspective::IS_CLIENT);
2773 QuicTestPacketMaker server_maker2(version_, 0, clock_, origin2_,
2774 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452775
2776 MockQuicData mock_quic_data2;
alyssar2adf3ac2016-05-03 17:12:582777 mock_quic_data2.AddWrite(ConstructClientRequestHeadersPacket(
2778 1, kClientDataStreamId1, true, &client_maker2));
2779 mock_quic_data2.AddRead(ConstructServerResponseHeadersPacket(
2780 1, kClientDataStreamId1, &server_maker2));
2781 mock_quic_data2.AddRead(
2782 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker2));
bnc359ed2a2016-04-29 20:43:452783 mock_quic_data2.AddWrite(
alyssar2adf3ac2016-05-03 17:12:582784 ConstructClientAckPacket(2, 2, 1, 1, &client_maker2));
bnc359ed2a2016-04-29 20:43:452785 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2786 mock_quic_data2.AddRead(ASYNC, 0); // EOF
2787
2788 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
2789
2790 AddHangingSocketData();
2791
2792 SendRequestAndExpectQuicResponse(origin1_);
2793 SendRequestAndExpectQuicResponse(origin2_);
2794
2795 EXPECT_TRUE(AllDataConsumed());
2796}
2797
[email protected]61a527782013-02-21 03:58:002798} // namespace test
2799} // namespace net