blob: 1d0128c317873326863b20819131180578979bc0 [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"
bnc508835902015-05-12 20:10:2918#include "net/base/test_data_directory.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"
[email protected]61a527782013-02-21 03:58:0057#include "testing/gtest/include/gtest/gtest.h"
58#include "testing/platform_test.h"
zhongyi3d4a55e72016-04-22 20:36:4659#include "url/gurl.h"
[email protected]61a527782013-02-21 03:58:0060
bnc508835902015-05-12 20:10:2961namespace net {
62namespace test {
[email protected]61a527782013-02-21 03:58:0063
64namespace {
65
bnc359ed2a2016-04-29 20:43:4566enum DestinationType {
67 // In pooling tests with two requests for different origins to the same
68 // destination, the destination should be
69 SAME_AS_FIRST, // the same as the first origin,
70 SAME_AS_SECOND, // the same as the second origin, or
71 DIFFERENT, // different from both.
72};
73
rchf114d982015-10-21 01:34:5674static const char kQuicAlternativeServiceHeader[] =
bncc958faa2015-07-31 18:14:5275 "Alt-Svc: quic=\":443\"\r\n\r\n";
rchf47265dc2016-03-21 21:33:1276static const char kQuicAlternativeServiceWithProbabilityHeader[] =
77 "Alt-Svc: quic=\":443\";p=\".5\"\r\n\r\n";
rchf114d982015-10-21 01:34:5678static const char kQuicAlternativeServiceDifferentPortHeader[] =
79 "Alt-Svc: quic=\":137\"\r\n\r\n";
[email protected]1e960032013-12-20 19:00:2080
rch9ae5b3b2016-02-11 00:36:2981const char kDefaultServerHostName[] = "mail.example.org";
bnc359ed2a2016-04-29 20:43:4582const char kDifferentHostname[] = "different.example.com";
83
84// Run QuicNetworkTransactionWithDestinationTest instances with all value
85// combinations of version and destination_type.
86struct PoolingTestParams {
87 friend std::ostream& operator<<(std::ostream& os,
88 const PoolingTestParams& p) {
89 os << "{ version: " << QuicVersionToString(p.version)
90 << ", destination_type: ";
91 switch (p.destination_type) {
92 case SAME_AS_FIRST:
93 os << "SAME_AS_FIRST";
94 break;
95 case SAME_AS_SECOND:
96 os << "SAME_AS_SECOND";
97 break;
98 case DIFFERENT:
99 os << "DIFFERENT";
100 break;
101 }
102 os << " }";
103 return os;
104 }
105
106 QuicVersion version;
107 DestinationType destination_type;
108};
109
110std::vector<PoolingTestParams> GetPoolingTestParams() {
111 std::vector<PoolingTestParams> params;
112 QuicVersionVector all_supported_versions = QuicSupportedVersions();
113 for (const QuicVersion version : all_supported_versions) {
114 params.push_back(PoolingTestParams{version, SAME_AS_FIRST});
115 params.push_back(PoolingTestParams{version, SAME_AS_SECOND});
116 params.push_back(PoolingTestParams{version, DIFFERENT});
117 }
118 return params;
119}
bncb07c05532015-05-14 19:07:20120
[email protected]61a527782013-02-21 03:58:00121} // namespace
122
[email protected]1e960032013-12-20 19:00:20123// Helper class to encapsulate MockReads and MockWrites for QUIC.
124// Simplify ownership issues and the interaction with the MockSocketFactory.
125class MockQuicData {
126 public:
rtennetia004d332015-08-28 06:44:57127 MockQuicData() : packet_number_(0) {}
rcha5399e02015-04-21 19:32:04128
rjshaded5ced072015-12-18 19:26:02129 ~MockQuicData() { STLDeleteElements(&packets_); }
[email protected]1e960032013-12-20 19:00:20130
danakjad1777e2016-04-16 00:56:42131 void AddSynchronousRead(std::unique_ptr<QuicEncryptedPacket> packet) {
[email protected]1e960032013-12-20 19:00:20132 reads_.push_back(MockRead(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:57133 packet_number_++));
[email protected]1e960032013-12-20 19:00:20134 packets_.push_back(packet.release());
135 }
136
danakjad1777e2016-04-16 00:56:42137 void AddRead(std::unique_ptr<QuicEncryptedPacket> packet) {
rcha5399e02015-04-21 19:32:04138 reads_.push_back(
rtennetia004d332015-08-28 06:44:57139 MockRead(ASYNC, packet->data(), packet->length(), packet_number_++));
rcha5399e02015-04-21 19:32:04140 packets_.push_back(packet.release());
141 }
142
[email protected]1e960032013-12-20 19:00:20143 void AddRead(IoMode mode, int rv) {
rtennetia004d332015-08-28 06:44:57144 reads_.push_back(MockRead(mode, rv, packet_number_++));
[email protected]1e960032013-12-20 19:00:20145 }
146
danakjad1777e2016-04-16 00:56:42147 void AddWrite(std::unique_ptr<QuicEncryptedPacket> packet) {
[email protected]1e960032013-12-20 19:00:20148 writes_.push_back(MockWrite(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:57149 packet_number_++));
[email protected]1e960032013-12-20 19:00:20150 packets_.push_back(packet.release());
151 }
152
rcha5399e02015-04-21 19:32:04153 void AddSocketDataToFactory(MockClientSocketFactory* factory) {
rjshaded5ced072015-12-18 19:26:02154 MockRead* reads = reads_.empty() ? nullptr : &reads_[0];
155 MockWrite* writes = writes_.empty() ? nullptr : &writes_[0];
rcha5399e02015-04-21 19:32:04156 socket_data_.reset(
157 new SequencedSocketData(reads, reads_.size(), writes, writes_.size()));
[email protected]1e960032013-12-20 19:00:20158 factory->AddSocketDataProvider(socket_data_.get());
159 }
160
mmenkee24011922015-12-17 22:12:59161 void Resume() { socket_data_->Resume(); }
rchb27683c2015-07-29 23:53:50162
[email protected]1e960032013-12-20 19:00:20163 private:
164 std::vector<QuicEncryptedPacket*> packets_;
165 std::vector<MockWrite> writes_;
166 std::vector<MockRead> reads_;
rtennetia004d332015-08-28 06:44:57167 size_t packet_number_;
danakjad1777e2016-04-16 00:56:42168 std::unique_ptr<SequencedSocketData> socket_data_;
[email protected]1e960032013-12-20 19:00:20169};
170
ryansturm49a8cb12016-06-15 16:51:09171class HeadersHandler {
tbansal7cec3812015-02-05 21:25:12172 public:
ryansturm49a8cb12016-06-15 16:51:09173 HeadersHandler() : was_proxied_(false) {}
tbansal7cec3812015-02-05 21:25:12174
ryansturm49a8cb12016-06-15 16:51:09175 bool was_proxied() { return was_proxied_; }
tbansal7cec3812015-02-05 21:25:12176
ryansturm49a8cb12016-06-15 16:51:09177 void OnBeforeHeadersSent(const ProxyInfo& proxy_info,
178 HttpRequestHeaders* request_headers) {
179 if (!proxy_info.is_http() && !proxy_info.is_https() &&
180 !proxy_info.is_quic()) {
181 return;
182 }
183 was_proxied_ = true;
tbansal7cec3812015-02-05 21:25:12184 }
185
186 private:
ryansturm49a8cb12016-06-15 16:51:09187 bool was_proxied_;
tbansal7cec3812015-02-05 21:25:12188};
189
tbansal0f56a39a2016-04-07 22:03:38190class TestSocketPerformanceWatcher : public SocketPerformanceWatcher {
tbansalfdf5665b2015-09-21 22:46:40191 public:
tbansal0f56a39a2016-04-07 22:03:38192 explicit TestSocketPerformanceWatcher(bool* rtt_notification_received)
193 : rtt_notification_received_(rtt_notification_received) {}
194 ~TestSocketPerformanceWatcher() override {}
tbansalfdf5665b2015-09-21 22:46:40195
tbansal0f56a39a2016-04-07 22:03:38196 bool ShouldNotifyUpdatedRTT() const override { return true; }
tbansalfdf5665b2015-09-21 22:46:40197
tbansal0f56a39a2016-04-07 22:03:38198 void OnUpdatedRTTAvailable(const base::TimeDelta& rtt) override {
199 *rtt_notification_received_ = true;
200 }
201
202 void OnConnectionChanged() override {}
203
204 private:
205 bool* rtt_notification_received_;
206
207 DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcher);
208};
209
210class TestSocketPerformanceWatcherFactory
211 : public SocketPerformanceWatcherFactory {
212 public:
213 TestSocketPerformanceWatcherFactory()
214 : watcher_count_(0u), rtt_notification_received_(false) {}
215 ~TestSocketPerformanceWatcherFactory() override {}
216
217 // SocketPerformanceWatcherFactory implementation:
danakjad1777e2016-04-16 00:56:42218 std::unique_ptr<SocketPerformanceWatcher> CreateSocketPerformanceWatcher(
tbansalc8a94ea2015-11-02 23:58:51219 const Protocol protocol) override {
220 if (protocol != PROTOCOL_QUIC) {
tbansal0f56a39a2016-04-07 22:03:38221 return nullptr;
tbansalc8a94ea2015-11-02 23:58:51222 }
223 ++watcher_count_;
danakjad1777e2016-04-16 00:56:42224 return std::unique_ptr<SocketPerformanceWatcher>(
tbansal0f56a39a2016-04-07 22:03:38225 new TestSocketPerformanceWatcher(&rtt_notification_received_));
tbansalfdf5665b2015-09-21 22:46:40226 }
227
tbansalc8a94ea2015-11-02 23:58:51228 size_t watcher_count() const { return watcher_count_; }
tbansalfdf5665b2015-09-21 22:46:40229
tbansalc8a94ea2015-11-02 23:58:51230 bool rtt_notification_received() const { return rtt_notification_received_; }
231
tbansalc8a94ea2015-11-02 23:58:51232 private:
tbansal0f56a39a2016-04-07 22:03:38233 size_t watcher_count_;
tbansalc8a94ea2015-11-02 23:58:51234 bool rtt_notification_received_;
tbansal0f56a39a2016-04-07 22:03:38235
236 DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcherFactory);
tbansalc8a94ea2015-11-02 23:58:51237};
238
[email protected]1e960032013-12-20 19:00:20239class QuicNetworkTransactionTest
240 : public PlatformTest,
[email protected]5d03bbd2014-03-07 16:19:16241 public ::testing::WithParamInterface<QuicVersion> {
[email protected]61a527782013-02-21 03:58:00242 protected:
[email protected]1c04f9522013-02-21 20:32:43243 QuicNetworkTransactionTest()
rtenneti4b06ae72014-08-26 03:43:43244 : clock_(new MockClock),
alyssar2adf3ac2016-05-03 17:12:58245 client_maker_(GetParam(),
246 0,
247 clock_,
248 kDefaultServerHostName,
249 Perspective::IS_CLIENT),
250 server_maker_(GetParam(),
251 0,
252 clock_,
253 kDefaultServerHostName,
254 Perspective::IS_SERVER),
rtenneti052774e2015-11-24 21:00:12255 cert_transparency_verifier_(new MultiLogCTVerifier()),
[email protected]1c04f9522013-02-21 20:32:43256 ssl_config_service_(new SSLConfigServiceDefaults),
257 proxy_service_(ProxyService::CreateDirect()),
258 auth_handler_factory_(
[email protected]dda75ab2013-06-22 22:43:30259 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
[email protected]457d6952013-12-13 09:24:58260 random_generator_(0),
rchf114d982015-10-21 01:34:56261 ssl_data_(ASYNC, OK) {
[email protected]aa9b14d2013-05-10 23:45:19262 request_.method = "GET";
rchf114d982015-10-21 01:34:56263 std::string url("https://");
bncb07c05532015-05-14 19:07:20264 url.append(kDefaultServerHostName);
265 request_.url = GURL(url);
[email protected]aa9b14d2013-05-10 23:45:19266 request_.load_flags = 0;
[email protected]98a9d1252014-04-04 00:43:59267 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
rchf114d982015-10-21 01:34:56268
rch3f4b8452016-02-23 16:59:32269 params_.enable_alternative_service_with_different_host = true;
bnce3dd56f2016-06-01 10:37:11270 params_.enable_alternative_service_for_insecure_origins = true;
rch3f4b8452016-02-23 16:59:32271
rchf114d982015-10-21 01:34:56272 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29273 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
rchf114d982015-10-21 01:34:56274 verify_details_.cert_verify_result.verified_cert = cert;
275 verify_details_.cert_verify_result.is_issued_by_known_root = true;
276 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
[email protected]1c04f9522013-02-21 20:32:43277 }
[email protected]61a527782013-02-21 03:58:00278
dcheng67be2b1f2014-10-27 21:47:29279 void SetUp() override {
[email protected]61a527782013-02-21 03:58:00280 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:55281 base::RunLoop().RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00282 }
283
dcheng67be2b1f2014-10-27 21:47:29284 void TearDown() override {
[email protected]61a527782013-02-21 03:58:00285 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
286 // Empty the current queue.
fdoray92e35a72016-06-10 15:54:55287 base::RunLoop().RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00288 PlatformTest::TearDown();
289 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:55290 base::RunLoop().RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00291 }
292
alyssar2adf3ac2016-05-03 17:12:58293 std::unique_ptr<QuicEncryptedPacket> ConstructClientConnectionClosePacket(
rtennetia004d332015-08-28 06:44:57294 QuicPacketNumber num) {
alyssar2adf3ac2016-05-03 17:12:58295 return client_maker_.MakeConnectionClosePacket(num);
[email protected]3316d422013-05-03 21:45:30296 }
297
alyssar2adf3ac2016-05-03 17:12:58298 std::unique_ptr<QuicEncryptedPacket> ConstructServerConnectionClosePacket(
299 QuicPacketNumber num) {
300 return server_maker_.MakeConnectionClosePacket(num);
301 }
302
303 std::unique_ptr<QuicEncryptedPacket> ConstructServerGoAwayPacket(
zhongyi6b5a3892016-03-12 04:46:20304 QuicPacketNumber num,
305 QuicErrorCode error_code,
306 std::string reason_phrase) {
alyssar2adf3ac2016-05-03 17:12:58307 return server_maker_.MakeGoAwayPacket(num, error_code, reason_phrase);
zhongyi6b5a3892016-03-12 04:46:20308 }
309
alyssar2adf3ac2016-05-03 17:12:58310 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
rtennetia004d332015-08-28 06:44:57311 QuicPacketNumber largest_received,
312 QuicPacketNumber least_unacked) {
alyssar2adf3ac2016-05-03 17:12:58313 return client_maker_.MakeAckPacket(2, largest_received, least_unacked,
314 least_unacked, true);
zhongyi32569c62016-01-08 02:54:30315 }
316
alyssar2adf3ac2016-05-03 17:12:58317 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckAndRstPacket(
zhongyi6b5a3892016-03-12 04:46:20318 QuicPacketNumber num,
319 QuicStreamId stream_id,
320 QuicRstStreamErrorCode error_code,
321 QuicPacketNumber largest_received,
322 QuicPacketNumber ack_least_unacked,
323 QuicPacketNumber stop_least_unacked) {
alyssar2adf3ac2016-05-03 17:12:58324 return client_maker_.MakeAckAndRstPacket(
325 num, false, stream_id, error_code, largest_received, ack_least_unacked,
326 stop_least_unacked, true);
zhongyi6b5a3892016-03-12 04:46:20327 }
328
alyssar2adf3ac2016-05-03 17:12:58329 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
zhongyi32569c62016-01-08 02:54:30330 QuicPacketNumber largest_received,
331 QuicPacketNumber least_unacked,
332 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:58333 return client_maker_.MakeAckPacket(2, largest_received, least_unacked,
334 least_unacked, true);
zhongyi32569c62016-01-08 02:54:30335 }
336
alyssar2adf3ac2016-05-03 17:12:58337 std::unique_ptr<QuicEncryptedPacket>
338 ConstructClientAckAndConnectionClosePacket(
zhongyi32569c62016-01-08 02:54:30339 QuicPacketNumber packet_number,
340 QuicPacketNumber largest_received,
341 QuicPacketNumber ack_least_unacked,
342 QuicPacketNumber stop_least_unacked) {
alyssar2adf3ac2016-05-03 17:12:58343 return client_maker_.MakeAckPacket(packet_number, largest_received,
344 ack_least_unacked, stop_least_unacked,
345 true);
[email protected]1e960032013-12-20 19:00:20346 }
[email protected]61a527782013-02-21 03:58:00347
alyssar2adf3ac2016-05-03 17:12:58348 std::unique_ptr<QuicEncryptedPacket>
349 ConstructClientAckAndConnectionClosePacket(
zhongyica364fbb2015-12-12 03:39:12350 QuicPacketNumber num,
351 QuicTime::Delta delta_time_largest_observed,
352 QuicPacketNumber largest_received,
353 QuicPacketNumber least_unacked,
354 QuicErrorCode quic_error,
bnc912a04b2016-04-20 14:19:50355 const std::string& quic_error_details) {
alyssar2adf3ac2016-05-03 17:12:58356 return client_maker_.MakeAckAndConnectionClosePacket(
zhongyica364fbb2015-12-12 03:39:12357 num, false, delta_time_largest_observed, largest_received,
358 least_unacked, quic_error, quic_error_details);
359 }
360
alyssar2adf3ac2016-05-03 17:12:58361 std::unique_ptr<QuicEncryptedPacket> ConstructServerRstPacket(
zhongyica364fbb2015-12-12 03:39:12362 QuicPacketNumber num,
363 bool include_version,
364 QuicStreamId stream_id,
365 QuicRstStreamErrorCode error_code) {
alyssar2adf3ac2016-05-03 17:12:58366 return server_maker_.MakeRstPacket(num, include_version, stream_id,
367 error_code);
zhongyica364fbb2015-12-12 03:39:12368 }
369
zhongyi32569c62016-01-08 02:54:30370 // Uses default QuicTestPacketMaker.
[email protected]1e960032013-12-20 19:00:20371 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
372 const std::string& scheme,
373 const std::string& path) {
alyssar2adf3ac2016-05-03 17:12:58374 return GetRequestHeaders(method, scheme, path, &client_maker_);
zhongyi32569c62016-01-08 02:54:30375 }
376
377 // Uses customized QuicTestPacketMaker.
378 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
379 const std::string& scheme,
380 const std::string& path,
bnc912a04b2016-04-20 14:19:50381 QuicTestPacketMaker* maker) {
382 return maker->GetRequestHeaders(method, scheme, path);
[email protected]61a527782013-02-21 03:58:00383 }
384
[email protected]1e960032013-12-20 19:00:20385 SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
alyssar2adf3ac2016-05-03 17:12:58386 return server_maker_.GetResponseHeaders(status);
[email protected]61a527782013-02-21 03:58:00387 }
388
zhongyi32569c62016-01-08 02:54:30389 // Appends alt_svc headers in the response headers.
390 SpdyHeaderBlock GetResponseHeaders(const std::string& status,
391 const std::string& alt_svc) {
alyssar2adf3ac2016-05-03 17:12:58392 return server_maker_.GetResponseHeaders(status, alt_svc);
zhongyi32569c62016-01-08 02:54:30393 }
394
alyssar2adf3ac2016-05-03 17:12:58395 std::unique_ptr<QuicEncryptedPacket> ConstructServerDataPacket(
rtennetia004d332015-08-28 06:44:57396 QuicPacketNumber packet_number,
[email protected]98b20ce2013-05-10 05:55:26397 QuicStreamId stream_id,
[email protected]e8ff26842013-03-22 21:02:05398 bool should_include_version,
[email protected]61a527782013-02-21 03:58:00399 bool fin,
400 QuicStreamOffset offset,
401 base::StringPiece data) {
alyssar2adf3ac2016-05-03 17:12:58402 return server_maker_.MakeDataPacket(
403 packet_number, stream_id, should_include_version, fin, offset, data);
[email protected]61a527782013-02-21 03:58:00404 }
405
alyssar2adf3ac2016-05-03 17:12:58406 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
rtennetia004d332015-08-28 06:44:57407 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20408 QuicStreamId stream_id,
409 bool should_include_version,
410 bool fin,
zhongyi32569c62016-01-08 02:54:30411 const SpdyHeaderBlock& headers,
412 QuicStreamOffset* offset) {
ianswett0888cff2015-11-24 17:42:16413 SpdyPriority priority =
rtennetif4bdb542015-01-21 14:33:05414 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
alyssar2adf3ac2016-05-03 17:12:58415 return client_maker_.MakeRequestHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30416 packet_number, stream_id, should_include_version, fin, priority,
417 headers, offset);
418 }
419
alyssar2adf3ac2016-05-03 17:12:58420 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30421 QuicPacketNumber packet_number,
422 QuicStreamId stream_id,
423 bool should_include_version,
424 bool fin,
425 const SpdyHeaderBlock& headers,
426 QuicStreamOffset* offset,
427 QuicTestPacketMaker* maker) {
428 SpdyPriority priority =
429 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
alyssar2adf3ac2016-05-03 17:12:58430 return client_maker_.MakeRequestHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30431 packet_number, stream_id, should_include_version, fin, priority,
432 headers, offset);
433 }
434
alyssar2adf3ac2016-05-03 17:12:58435 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30436 QuicPacketNumber packet_number,
437 QuicStreamId stream_id,
438 bool should_include_version,
439 bool fin,
440 const SpdyHeaderBlock& headers) {
alyssar2adf3ac2016-05-03 17:12:58441 return ConstructClientRequestHeadersPacket(
442 packet_number, stream_id, should_include_version, fin, headers, nullptr,
443 &client_maker_);
zhongyi32569c62016-01-08 02:54:30444 }
alyssar2adf3ac2016-05-03 17:12:58445 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30446 QuicPacketNumber packet_number,
447 QuicStreamId stream_id,
448 bool should_include_version,
449 bool fin,
450 const SpdyHeaderBlock& headers,
451 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:58452 return ConstructClientRequestHeadersPacket(packet_number, stream_id,
453 should_include_version, fin,
454 headers, nullptr, maker);
[email protected]61a527782013-02-21 03:58:00455 }
456
alyssar2adf3ac2016-05-03 17:12:58457 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
rtennetia004d332015-08-28 06:44:57458 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20459 QuicStreamId stream_id,
460 bool should_include_version,
461 bool fin,
462 const SpdyHeaderBlock& headers) {
alyssar2adf3ac2016-05-03 17:12:58463 return ConstructServerResponseHeadersPacket(
464 packet_number, stream_id, should_include_version, fin, headers, nullptr,
465 &server_maker_);
zhongyi32569c62016-01-08 02:54:30466 }
467
alyssar2adf3ac2016-05-03 17:12:58468 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30469 QuicPacketNumber packet_number,
470 QuicStreamId stream_id,
471 bool should_include_version,
472 bool fin,
473 const SpdyHeaderBlock& headers,
474 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:58475 return ConstructServerResponseHeadersPacket(packet_number, stream_id,
476 should_include_version, fin,
477 headers, nullptr, maker);
zhongyi32569c62016-01-08 02:54:30478 }
479
alyssar2adf3ac2016-05-03 17:12:58480 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30481 QuicPacketNumber packet_number,
482 QuicStreamId stream_id,
483 bool should_include_version,
484 bool fin,
485 const SpdyHeaderBlock& headers,
486 QuicStreamOffset* offset) {
alyssar2adf3ac2016-05-03 17:12:58487 return server_maker_.MakeResponseHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30488 packet_number, stream_id, should_include_version, fin, headers, offset);
489 }
490
alyssar2adf3ac2016-05-03 17:12:58491 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30492 QuicPacketNumber packet_number,
493 QuicStreamId stream_id,
494 bool should_include_version,
495 bool fin,
496 const SpdyHeaderBlock& headers,
497 QuicStreamOffset* offset,
498 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:58499 return server_maker_.MakeResponseHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30500 packet_number, stream_id, should_include_version, fin, headers, offset);
[email protected]61a527782013-02-21 03:58:00501 }
502
bnc912a04b2016-04-20 14:19:50503 void CreateSession() {
[email protected]4dca587c2013-03-07 16:54:47504 params_.enable_quic = true;
505 params_.quic_clock = clock_;
506 params_.quic_random = &random_generator_;
bnc912a04b2016-04-20 14:19:50507 params_.client_socket_factory = &socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05508 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43509 params_.host_resolver = &host_resolver_;
510 params_.cert_verifier = &cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11511 params_.transport_security_state = &transport_security_state_;
rtenneti052774e2015-11-24 21:00:12512 params_.cert_transparency_verifier = cert_transparency_verifier_.get();
tbansalfdf5665b2015-09-21 22:46:40513 params_.socket_performance_watcher_factory =
tbansal0f56a39a2016-04-07 22:03:38514 &test_socket_performance_watcher_factory_;
[email protected]1c04f9522013-02-21 20:32:43515 params_.proxy_service = proxy_service_.get();
516 params_.ssl_config_service = ssl_config_service_.get();
517 params_.http_auth_handler_factory = auth_handler_factory_.get();
bnc6be245c12015-05-15 11:24:07518 params_.http_server_properties = http_server_properties_.GetWeakPtr();
[email protected]1e960032013-12-20 19:00:20519 params_.quic_supported_versions = SupportedVersions(GetParam());
rch74da0e1a2016-01-14 02:49:32520 for (const char* host :
rch9ae5b3b2016-02-11 00:36:29521 {kDefaultServerHostName, "www.example.org", "news.example.org",
522 "bar.example.org", "foo.example.org", "invalid.example.org",
523 "mail.example.com"}) {
rch74da0e1a2016-01-14 02:49:32524 params_.quic_host_whitelist.insert(host);
525 }
[email protected]61a527782013-02-21 03:58:00526
mmenkee65e7af2015-10-13 17:16:42527 session_.reset(new HttpNetworkSession(params_));
[email protected]11c05872013-08-20 02:04:12528 session_->quic_stream_factory()->set_require_confirmation(false);
rch185ebee2015-07-14 23:56:22529 ASSERT_EQ(params_.quic_socket_receive_buffer_size,
530 session_->quic_stream_factory()->socket_receive_buffer_size());
[email protected]61a527782013-02-21 03:58:00531 }
532
danakjad1777e2016-04-16 00:56:42533 void CheckWasQuicResponse(
534 const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19535 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42536 ASSERT_TRUE(response != nullptr);
537 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19538 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
539 EXPECT_TRUE(response->was_fetched_via_spdy);
540 EXPECT_TRUE(response->was_npn_negotiated);
541 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
542 response->connection_info);
543 }
544
danakjad1777e2016-04-16 00:56:42545 void CheckResponsePort(const std::unique_ptr<HttpNetworkTransaction>& trans,
Avi Drissman13fc8932015-12-20 04:40:46546 uint16_t port) {
bnc62a44f022015-04-02 15:59:41547 const HttpResponseInfo* response = trans->GetResponseInfo();
548 ASSERT_TRUE(response != nullptr);
549 EXPECT_EQ(port, response->socket_address.port());
550 }
551
danakjad1777e2016-04-16 00:56:42552 void CheckWasHttpResponse(
553 const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19554 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42555 ASSERT_TRUE(response != nullptr);
556 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19557 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
558 EXPECT_FALSE(response->was_fetched_via_spdy);
559 EXPECT_FALSE(response->was_npn_negotiated);
560 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1,
561 response->connection_info);
562 }
563
danakjad1777e2016-04-16 00:56:42564 void CheckResponseData(const std::unique_ptr<HttpNetworkTransaction>& trans,
[email protected]aa9b14d2013-05-10 23:45:19565 const std::string& expected) {
566 std::string response_data;
bncffc2fdf2015-05-14 18:29:49567 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
[email protected]aa9b14d2013-05-10 23:45:19568 EXPECT_EQ(expected, response_data);
569 }
570
danakjad1777e2016-04-16 00:56:42571 void RunTransaction(const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19572 TestCompletionCallback callback;
573 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
574 EXPECT_EQ(ERR_IO_PENDING, rv);
575 EXPECT_EQ(OK, callback.WaitForResult());
576 }
577
578 void SendRequestAndExpectHttpResponse(const std::string& expected) {
danakjad1777e2016-04-16 00:56:42579 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50580 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
bncffc2fdf2015-05-14 18:29:49581 RunTransaction(trans);
[email protected]aa9b14d2013-05-10 23:45:19582 CheckWasHttpResponse(trans);
bncffc2fdf2015-05-14 18:29:49583 CheckResponseData(trans, expected);
[email protected]aa9b14d2013-05-10 23:45:19584 }
585
586 void SendRequestAndExpectQuicResponse(const std::string& expected) {
rchf114d982015-10-21 01:34:56587 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, 443);
tbansal7cec3812015-02-05 21:25:12588 }
589
bnc62a44f022015-04-02 15:59:41590 void SendRequestAndExpectQuicResponseFromProxyOnPort(
591 const std::string& expected,
Avi Drissman13fc8932015-12-20 04:40:46592 uint16_t port) {
bnc62a44f022015-04-02 15:59:41593 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port);
[email protected]aa9b14d2013-05-10 23:45:19594 }
595
596 void AddQuicAlternateProtocolMapping(
597 MockCryptoClientStream::HandshakeMode handshake_mode) {
598 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
zhongyi3d4a55e72016-04-22 20:36:46599 url::SchemeHostPort server(request_.url);
600 AlternativeService alternative_service(QUIC, server.host(), 443);
bnc7dc7e1b42015-07-28 14:43:12601 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
zhongyi3d4a55e72016-04-22 20:36:46602 http_server_properties_.SetAlternativeService(server, alternative_service,
603 expiration);
[email protected]aa9b14d2013-05-10 23:45:19604 }
605
rchbe69cb902016-02-11 01:10:48606 void AddQuicRemoteAlternativeServiceMapping(
607 MockCryptoClientStream::HandshakeMode handshake_mode,
608 const HostPortPair& alternative) {
609 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
zhongyi3d4a55e72016-04-22 20:36:46610 url::SchemeHostPort server(request_.url);
rchbe69cb902016-02-11 01:10:48611 AlternativeService alternative_service(QUIC, alternative.host(),
612 alternative.port());
613 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
zhongyi3d4a55e72016-04-22 20:36:46614 http_server_properties_.SetAlternativeService(server, alternative_service,
615 expiration);
rchbe69cb902016-02-11 01:10:48616 }
617
[email protected]aa9b14d2013-05-10 23:45:19618 void ExpectBrokenAlternateProtocolMapping() {
zhongyi3d4a55e72016-04-22 20:36:46619 const url::SchemeHostPort server(request_.url);
bncd9b132e2015-07-08 05:16:10620 const AlternativeServiceVector alternative_service_vector =
zhongyi3d4a55e72016-04-22 20:36:46621 http_server_properties_.GetAlternativeServices(server);
bncd9b132e2015-07-08 05:16:10622 EXPECT_EQ(1u, alternative_service_vector.size());
bnc6be245c12015-05-15 11:24:07623 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken(
bncd9b132e2015-07-08 05:16:10624 alternative_service_vector[0]));
[email protected]aa9b14d2013-05-10 23:45:19625 }
626
[email protected]4d590c9c2014-05-02 05:14:33627 void ExpectQuicAlternateProtocolMapping() {
zhongyi3d4a55e72016-04-22 20:36:46628 const url::SchemeHostPort server(request_.url);
bncd9b132e2015-07-08 05:16:10629 const AlternativeServiceVector alternative_service_vector =
zhongyi3d4a55e72016-04-22 20:36:46630 http_server_properties_.GetAlternativeServices(server);
bncd9b132e2015-07-08 05:16:10631 EXPECT_EQ(1u, alternative_service_vector.size());
632 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
[email protected]4d590c9c2014-05-02 05:14:33633 }
634
[email protected]aa9b14d2013-05-10 23:45:19635 void AddHangingNonAlternateProtocolSocketData() {
danakjad1777e2016-04-16 00:56:42636 std::unique_ptr<StaticSocketDataProvider> hanging_data;
zhongyi32569c62016-01-08 02:54:30637 hanging_data.reset(new StaticSocketDataProvider());
[email protected]dda75ab2013-06-22 22:43:30638 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
zhongyi32569c62016-01-08 02:54:30639 hanging_data->set_connect_data(hanging_connect);
640 hanging_data_.push_back(std::move(hanging_data));
641 socket_factory_.AddSocketDataProvider(hanging_data_.back().get());
rchf114d982015-10-21 01:34:56642 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]aa9b14d2013-05-10 23:45:19643 }
644
rtenneti4b06ae72014-08-26 03:43:43645 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
alyssar2adf3ac2016-05-03 17:12:58646 QuicTestPacketMaker client_maker_;
647 QuicTestPacketMaker server_maker_;
danakjad1777e2016-04-16 00:56:42648 std::unique_ptr<HttpNetworkSession> session_;
[email protected]61a527782013-02-21 03:58:00649 MockClientSocketFactory socket_factory_;
rchf114d982015-10-21 01:34:56650 ProofVerifyDetailsChromium verify_details_;
[email protected]e8ff26842013-03-22 21:02:05651 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43652 MockHostResolver host_resolver_;
653 MockCertVerifier cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11654 TransportSecurityState transport_security_state_;
danakjad1777e2016-04-16 00:56:42655 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
tbansal0f56a39a2016-04-07 22:03:38656 TestSocketPerformanceWatcherFactory test_socket_performance_watcher_factory_;
[email protected]1c04f9522013-02-21 20:32:43657 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
danakjad1777e2016-04-16 00:56:42658 std::unique_ptr<ProxyService> proxy_service_;
659 std::unique_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
[email protected]61a527782013-02-21 03:58:00660 MockRandom random_generator_;
bnc6be245c12015-05-15 11:24:07661 HttpServerPropertiesImpl http_server_properties_;
[email protected]61a527782013-02-21 03:58:00662 HttpNetworkSession::Params params_;
[email protected]aa9b14d2013-05-10 23:45:19663 HttpRequestInfo request_;
vishal.b62985ca92015-04-17 08:45:51664 BoundTestNetLog net_log_;
danakjad1777e2016-04-16 00:56:42665 std::vector<std::unique_ptr<StaticSocketDataProvider>> hanging_data_;
rchf114d982015-10-21 01:34:56666 SSLSocketDataProvider ssl_data_;
tbansal7cec3812015-02-05 21:25:12667
668 private:
669 void SendRequestAndExpectQuicResponseMaybeFromProxy(
670 const std::string& expected,
bnc62a44f022015-04-02 15:59:41671 bool used_proxy,
Avi Drissman13fc8932015-12-20 04:40:46672 uint16_t port) {
danakjad1777e2016-04-16 00:56:42673 std::unique_ptr<HttpNetworkTransaction> trans(
tbansal7cec3812015-02-05 21:25:12674 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
ryansturm49a8cb12016-06-15 16:51:09675 HeadersHandler headers_handler;
676 trans->SetBeforeHeadersSentCallback(
677 base::Bind(&HeadersHandler::OnBeforeHeadersSent,
678 base::Unretained(&headers_handler)));
bncffc2fdf2015-05-14 18:29:49679 RunTransaction(trans);
tbansal7cec3812015-02-05 21:25:12680 CheckWasQuicResponse(trans);
bnc62a44f022015-04-02 15:59:41681 CheckResponsePort(trans, port);
bncffc2fdf2015-05-14 18:29:49682 CheckResponseData(trans, expected);
ryansturm49a8cb12016-06-15 16:51:09683 EXPECT_EQ(used_proxy, headers_handler.was_proxied());
tbansal7cec3812015-02-05 21:25:12684 }
[email protected]61a527782013-02-21 03:58:00685};
686
rjshaded5ced072015-12-18 19:26:02687INSTANTIATE_TEST_CASE_P(Version,
688 QuicNetworkTransactionTest,
[email protected]1e960032013-12-20 19:00:20689 ::testing::ValuesIn(QuicSupportedVersions()));
690
691TEST_P(QuicNetworkTransactionTest, ForceQuic) {
rtenneti8a2f4632016-03-21 20:26:57692 params_.origins_to_force_quic_on.insert(
693 HostPortPair::FromString("mail.example.org:443"));
[email protected]4dca587c2013-03-07 16:54:47694
[email protected]1e960032013-12-20 19:00:20695 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58696 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
697 1, kClientDataStreamId1, true, true,
698 GetRequestHeaders("GET", "https", "/")));
699 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:02700 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58701 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
702 false, true, 0, "hello!"));
703 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:59704 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
[email protected]4dca587c2013-03-07 16:54:47705
rcha5399e02015-04-21 19:32:04706 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4dca587c2013-03-07 16:54:47707
rtennetib8e80fb2016-05-16 00:12:09708 // The non-alternate protocol job needs to hang in order to guarantee that
709 // the alternate-protocol job will "win".
710 AddHangingNonAlternateProtocolSocketData();
711
rch3f4b8452016-02-23 16:59:32712 params_.enable_alternative_service_with_different_host = false;
[email protected]4dca587c2013-03-07 16:54:47713 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47714
tbansal0f56a39a2016-04-07 22:03:38715 EXPECT_FALSE(
716 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]aa9b14d2013-05-10 23:45:19717 SendRequestAndExpectQuicResponse("hello!");
tbansal0f56a39a2016-04-07 22:03:38718 EXPECT_TRUE(
719 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]4dca587c2013-03-07 16:54:47720
[email protected]98b20ce2013-05-10 05:55:26721 // Check that the NetLog was filled reasonably.
mmenke43758e62015-05-04 21:09:46722 TestNetLogEntry::List entries;
[email protected]aa9b14d2013-05-10 23:45:19723 net_log_.GetEntries(&entries);
[email protected]98b20ce2013-05-10 05:55:26724 EXPECT_LT(0u, entries.size());
725
726 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29727 int pos = ExpectLogContainsSomewhere(
728 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
729 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26730 EXPECT_LT(0, pos);
731
rchfd527212015-08-25 00:41:26732 // ... and also a TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29733 pos = ExpectLogContainsSomewhere(
rchfd527212015-08-25 00:41:26734 entries, 0,
735 NetLog::TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED,
ttuttle859dc7a2015-04-23 19:42:29736 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26737 EXPECT_LT(0, pos);
738
rtennetia004d332015-08-28 06:44:57739 std::string packet_number;
740 ASSERT_TRUE(entries[pos].GetStringValue("packet_number", &packet_number));
741 EXPECT_EQ("1", packet_number);
[email protected]98b20ce2013-05-10 05:55:26742
rchfd527212015-08-25 00:41:26743 // ... and also a TYPE_QUIC_SESSION_PACKET_AUTHENTICATED.
744 pos = ExpectLogContainsSomewhere(
745 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_AUTHENTICATED,
746 NetLog::PHASE_NONE);
747 EXPECT_LT(0, pos);
748
[email protected]98b20ce2013-05-10 05:55:26749 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29750 pos = ExpectLogContainsSomewhere(
751 entries, 0, NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
752 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26753 EXPECT_LT(0, pos);
754
755 int log_stream_id;
756 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
[email protected]1e960032013-12-20 19:00:20757 EXPECT_EQ(3, log_stream_id);
[email protected]4dca587c2013-03-07 16:54:47758}
759
[email protected]cf3e3cd62014-02-05 16:16:16760TEST_P(QuicNetworkTransactionTest, QuicProxy) {
tbansal9bf26672016-05-11 18:32:45761 params_.enable_quic = true;
rchf114d982015-10-21 01:34:56762 proxy_service_ =
rch9ae5b3b2016-02-11 00:36:29763 ProxyService::CreateFixedFromPacResult("QUIC mail.example.org:70");
[email protected]cf3e3cd62014-02-05 16:16:16764
[email protected]cf3e3cd62014-02-05 16:16:16765 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58766 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
767 1, kClientDataStreamId1, true, true,
768 GetRequestHeaders("GET", "http", "/")));
769 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:02770 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58771 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
772 false, true, 0, "hello!"));
773 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50774 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59775 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]cf3e3cd62014-02-05 16:16:16776
rcha5399e02015-04-21 19:32:04777 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cf3e3cd62014-02-05 16:16:16778
tbansal0f56a39a2016-04-07 22:03:38779 EXPECT_FALSE(
780 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16781 // There is no need to set up an alternate protocol job, because
782 // no attempt will be made to speak to the proxy over TCP.
783
rch9ae5b3b2016-02-11 00:36:29784 request_.url = GURL("http://mail.example.org/");
rch3f4b8452016-02-23 16:59:32785 params_.enable_alternative_service_with_different_host = false;
[email protected]cf3e3cd62014-02-05 16:16:16786 CreateSession();
787
bnc62a44f022015-04-02 15:59:41788 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
tbansal0f56a39a2016-04-07 22:03:38789 EXPECT_TRUE(
790 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16791}
792
bnc313ba9c2015-06-11 15:42:31793// Regression test for https://crbug.com/492458. Test that for an HTTP
794// connection through a QUIC proxy, the certificate exhibited by the proxy is
795// checked against the proxy hostname, not the origin hostname.
796TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) {
rch9ae5b3b2016-02-11 00:36:29797 const std::string origin_host = "mail.example.com";
bnc313ba9c2015-06-11 15:42:31798 const std::string proxy_host = "www.example.org";
799
tbansal9bf26672016-05-11 18:32:45800 params_.enable_quic = true;
rdsmith82957ad2015-09-16 19:42:03801 proxy_service_ =
802 ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70");
bnc313ba9c2015-06-11 15:42:31803
alyssar2adf3ac2016-05-03 17:12:58804 client_maker_.set_hostname(origin_host);
bnc313ba9c2015-06-11 15:42:31805 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58806 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
807 1, kClientDataStreamId1, true, true,
808 GetRequestHeaders("GET", "http", "/")));
809 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc313ba9c2015-06-11 15:42:31810 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58811 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
812 false, true, 0, "hello!"));
813 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50814 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59815 mock_quic_data.AddRead(ASYNC, 0);
bnc313ba9c2015-06-11 15:42:31816 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
817
818 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29819 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bnc313ba9c2015-06-11 15:42:31820 ASSERT_TRUE(cert.get());
821 // This certificate is valid for the proxy, but not for the origin.
822 bool common_name_fallback_used;
823 EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used));
824 EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used));
825 ProofVerifyDetailsChromium verify_details;
826 verify_details.cert_verify_result.verified_cert = cert;
827 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rchf114d982015-10-21 01:34:56828 ProofVerifyDetailsChromium verify_details2;
829 verify_details2.cert_verify_result.verified_cert = cert;
830 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
bnc313ba9c2015-06-11 15:42:31831
832 request_.url = GURL("http://" + origin_host);
rtennetib8e80fb2016-05-16 00:12:09833 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32834 CreateSession();
bnc313ba9c2015-06-11 15:42:31835 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
836 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
837}
838
rchbe69cb902016-02-11 01:10:48839TEST_P(QuicNetworkTransactionTest, AlternativeServicesDifferentHost) {
840 params_.enable_alternative_service_with_different_host = true;
841 HostPortPair origin("www.example.org", 443);
842 HostPortPair alternative("mail.example.org", 443);
843
844 base::FilePath certs_dir = GetTestCertsDirectory();
845 scoped_refptr<X509Certificate> cert(
846 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
847 ASSERT_TRUE(cert.get());
848 // TODO(rch): the connection should be "to" the origin, so if the cert is
849 // valid for the origin but not the alternative, that should work too.
850 bool common_name_fallback_used;
851 EXPECT_TRUE(cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
852 EXPECT_TRUE(
853 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
854 ProofVerifyDetailsChromium verify_details;
855 verify_details.cert_verify_result.verified_cert = cert;
856 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
857
alyssar2adf3ac2016-05-03 17:12:58858 client_maker_.set_hostname(origin.host());
rchbe69cb902016-02-11 01:10:48859 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58860 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
861 1, kClientDataStreamId1, true, true,
862 GetRequestHeaders("GET", "https", "/")));
863 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rchbe69cb902016-02-11 01:10:48864 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58865 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
866 false, true, 0, "hello!"));
867 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchbe69cb902016-02-11 01:10:48868 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
869 mock_quic_data.AddRead(ASYNC, 0);
870 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
871
872 request_.url = GURL("https://" + origin.host());
873 AddQuicRemoteAlternativeServiceMapping(
874 MockCryptoClientStream::CONFIRM_HANDSHAKE, alternative);
rtennetib8e80fb2016-05-16 00:12:09875 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32876 CreateSession();
rchbe69cb902016-02-11 01:10:48877
878 SendRequestAndExpectQuicResponse("hello!");
879}
880
[email protected]1e960032013-12-20 19:00:20881TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
rtenneti8a2f4632016-03-21 20:26:57882 params_.origins_to_force_quic_on.insert(
883 HostPortPair::FromString("mail.example.org:443"));
[email protected]cebe3282013-05-22 23:49:30884
tbansalfdf5665b2015-09-21 22:46:40885 MockQuicData mock_quic_data1;
886 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
[email protected]1e960032013-12-20 19:00:20887
tbansalfdf5665b2015-09-21 22:46:40888 MockQuicData mock_quic_data2;
zhongyi32569c62016-01-08 02:54:30889 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40890 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
rch6faa4d42016-01-05 20:48:43891 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40892
893 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
894 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
[email protected]cebe3282013-05-22 23:49:30895
rch3f4b8452016-02-23 16:59:32896 params_.enable_alternative_service_with_different_host = false;
[email protected]cebe3282013-05-22 23:49:30897 CreateSession();
898
tbansal0f56a39a2016-04-07 22:03:38899 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40900 for (size_t i = 0; i < 2; ++i) {
danakjad1777e2016-04-16 00:56:42901 std::unique_ptr<HttpNetworkTransaction> trans(
tbansalfdf5665b2015-09-21 22:46:40902 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
903 TestCompletionCallback callback;
904 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
905 EXPECT_EQ(ERR_IO_PENDING, rv);
906 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
tbansal0f56a39a2016-04-07 22:03:38907 EXPECT_EQ(1 + i, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40908 }
[email protected]cebe3282013-05-22 23:49:30909}
910
tbansalc8a94ea2015-11-02 23:58:51911TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
912 // Attempt to "force" quic on 443, which will not be honored.
rtenneti8a2f4632016-03-21 20:26:57913 params_.origins_to_force_quic_on.insert(
914 HostPortPair::FromString("www.google.com:443"));
tbansalc8a94ea2015-11-02 23:58:51915
916 MockRead http_reads[] = {
917 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
918 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
919 MockRead(ASYNC, OK)};
920
921 StaticSocketDataProvider data(http_reads, arraysize(http_reads), nullptr, 0);
922 socket_factory_.AddSocketDataProvider(&data);
923 SSLSocketDataProvider ssl(ASYNC, OK);
924 socket_factory_.AddSSLSocketDataProvider(&ssl);
925
rch3f4b8452016-02-23 16:59:32926 params_.enable_alternative_service_with_different_host = false;
tbansalc8a94ea2015-11-02 23:58:51927 CreateSession();
928
929 SendRequestAndExpectHttpResponse("hello world");
tbansal0f56a39a2016-04-07 22:03:38930 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalc8a94ea2015-11-02 23:58:51931}
932
bncc958faa2015-07-31 18:14:52933TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52934 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56935 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
936 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52937 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
938 MockRead(ASYNC, OK)};
939
940 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
941 0);
942 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56943 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52944
945 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58946 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
947 1, kClientDataStreamId1, true, true,
948 GetRequestHeaders("GET", "https", "/")));
949 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:52950 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58951 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
952 false, true, 0, "hello!"));
953 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:52954 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59955 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52956
957 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
958
rtennetib8e80fb2016-05-16 00:12:09959 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32960 CreateSession();
bncc958faa2015-07-31 18:14:52961
962 SendRequestAndExpectHttpResponse("hello world");
963 SendRequestAndExpectQuicResponse("hello!");
964}
965
rchf47265dc2016-03-21 21:33:12966TEST_P(QuicNetworkTransactionTest,
967 UseAlternativeServiceWithProbabilityForQuic) {
968 MockRead http_reads[] = {
969 MockRead("HTTP/1.1 200 OK\r\n"),
970 MockRead(kQuicAlternativeServiceWithProbabilityHeader),
971 MockRead("hello world"),
972 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
973 MockRead(ASYNC, OK)};
974
975 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
976 0);
977 socket_factory_.AddSocketDataProvider(&http_data);
978 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
979
980 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58981 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
982 1, kClientDataStreamId1, true, true,
983 GetRequestHeaders("GET", "https", "/")));
984 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rchf47265dc2016-03-21 21:33:12985 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58986 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
987 false, true, 0, "hello!"));
988 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchf47265dc2016-03-21 21:33:12989 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
990 mock_quic_data.AddRead(ASYNC, 0); // EOF
991
992 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
993
rtennetib8e80fb2016-05-16 00:12:09994 AddHangingNonAlternateProtocolSocketData();
rchf47265dc2016-03-21 21:33:12995 CreateSession();
996
997 SendRequestAndExpectHttpResponse("hello world");
998 SendRequestAndExpectQuicResponse("hello!");
999}
1000
zhongyi3d4a55e72016-04-22 20:36:461001TEST_P(QuicNetworkTransactionTest, SetAlternativeServiceWithScheme) {
1002 MockRead http_reads[] = {
1003 MockRead("HTTP/1.1 200 OK\r\n"),
1004 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
1005 MockRead("hello world"),
1006 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1007 MockRead(ASYNC, OK)};
1008
1009 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1010 0);
1011
1012 socket_factory_.AddSocketDataProvider(&http_data);
1013 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1014
1015 CreateSession();
1016 // Send http request, ignore alternative service advertising if response
1017 // header advertises alternative service for mail.example.org.
1018 request_.url = GURL("http://mail.example.org:443");
1019 SendRequestAndExpectHttpResponse("hello world");
1020 base::WeakPtr<HttpServerProperties> http_server_properties =
1021 session_->http_server_properties();
1022 url::SchemeHostPort http_server("http", "mail.example.org", 443);
1023 url::SchemeHostPort https_server("https", "mail.example.org", 443);
1024 // Check alternative service is set for the correct origin.
1025 EXPECT_EQ(2u,
1026 http_server_properties->GetAlternativeServices(http_server).size());
1027 EXPECT_EQ(
1028 0u, http_server_properties->GetAlternativeServices(https_server).size());
1029}
1030
1031TEST_P(QuicNetworkTransactionTest, DoNotGetAltSvcForDifferentOrigin) {
1032 MockRead http_reads[] = {
1033 MockRead("HTTP/1.1 200 OK\r\n"),
1034 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
1035 MockRead("hello world"),
1036 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1037 MockRead(ASYNC, OK)};
1038
1039 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1040 0);
1041
1042 socket_factory_.AddSocketDataProvider(&http_data);
1043 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1044 socket_factory_.AddSocketDataProvider(&http_data);
1045 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1046
1047 CreateSession();
1048
1049 // Send https request and set alternative services if response header
1050 // advertises alternative service for mail.example.org.
1051 SendRequestAndExpectHttpResponse("hello world");
1052 base::WeakPtr<HttpServerProperties> http_server_properties =
1053 session_->http_server_properties();
1054
1055 const url::SchemeHostPort https_server(request_.url);
1056 // Check alternative service is set.
1057 AlternativeServiceVector alternative_service_vector =
1058 http_server_properties->GetAlternativeServices(https_server);
1059 EXPECT_EQ(2u, alternative_service_vector.size());
1060
1061 // Send http request to the same origin but with diffrent scheme, should not
1062 // use QUIC.
1063 request_.url = GURL("http://mail.example.org:443");
1064 SendRequestAndExpectHttpResponse("hello world");
1065}
1066
bnc8be55ebb2015-10-30 14:12:071067TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) {
1068 std::string altsvc_header = base::StringPrintf(
1069 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam());
1070 MockRead http_reads[] = {
1071 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1072 MockRead("hello world"),
1073 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1074 MockRead(ASYNC, OK)};
1075
1076 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1077 0);
1078 socket_factory_.AddSocketDataProvider(&http_data);
1079 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1080
1081 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581082 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1083 1, kClientDataStreamId1, true, true,
1084 GetRequestHeaders("GET", "https", "/")));
1085 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc8be55ebb2015-10-30 14:12:071086 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581087 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1088 false, true, 0, "hello!"));
1089 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bnc8be55ebb2015-10-30 14:12:071090 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591091 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc8be55ebb2015-10-30 14:12:071092
1093 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1094
rtennetib8e80fb2016-05-16 00:12:091095 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321096 CreateSession();
bnc8be55ebb2015-10-30 14:12:071097
1098 SendRequestAndExpectHttpResponse("hello world");
1099 SendRequestAndExpectQuicResponse("hello!");
1100}
1101
zhongyi6b5a3892016-03-12 04:46:201102TEST_P(QuicNetworkTransactionTest, GoAwayWithConnectionMigrationOnPortsOnly) {
1103 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581104 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1105 1, kClientDataStreamId1, true, true,
1106 GetRequestHeaders("GET", "https", "/")));
1107 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi6b5a3892016-03-12 04:46:201108 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1109 // Read a GoAway packet with
1110 // QuicErrorCode: QUIC_ERROR_MIGRATING_PORT from the peer.
alyssar2adf3ac2016-05-03 17:12:581111 mock_quic_data.AddRead(ConstructServerGoAwayPacket(
1112 2, QUIC_ERROR_MIGRATING_PORT,
1113 "connection migration with port change only"));
1114 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
1115 mock_quic_data.AddRead(ConstructServerDataPacket(3, kClientDataStreamId1,
1116 false, true, 0, "hello!"));
1117 mock_quic_data.AddWrite(ConstructClientAckAndRstPacket(
zhongyi6b5a3892016-03-12 04:46:201118 3, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 3, 3, 1));
1119 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1120 mock_quic_data.AddRead(ASYNC, 0); // EOF
1121
1122 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1123
1124 // The non-alternate protocol job needs to hang in order to guarantee that
1125 // the alternate-protocol job will "win".
1126 AddHangingNonAlternateProtocolSocketData();
1127
1128 // In order for a new QUIC session to be established via alternate-protocol
1129 // without racing an HTTP connection, we need the host resolution to happen
1130 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1131 // connection to the the server, in this test we require confirmation
1132 // before encrypting so the HTTP job will still start.
1133 host_resolver_.set_synchronous_mode(true);
1134 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1135 "");
1136 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1137 AddressList address;
1138 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1139 nullptr, net_log_.bound());
1140
1141 CreateSession();
1142 session_->quic_stream_factory()->set_require_confirmation(true);
1143 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1144
danakjad1777e2016-04-16 00:56:421145 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyi6b5a3892016-03-12 04:46:201146 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1147 TestCompletionCallback callback;
1148 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1149 EXPECT_EQ(ERR_IO_PENDING, rv);
1150
1151 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1152 QuicSession::HANDSHAKE_CONFIRMED);
1153 EXPECT_EQ(OK, callback.WaitForResult());
1154
1155 // Check whether this transaction is correctly marked as received a go-away
1156 // because of migrating port.
1157 NetErrorDetails details;
1158 EXPECT_FALSE(details.quic_port_migration_detected);
1159 trans->PopulateNetErrorDetails(&details);
1160 EXPECT_TRUE(details.quic_port_migration_detected);
1161}
1162
bnc8be55ebb2015-10-30 14:12:071163TEST_P(QuicNetworkTransactionTest,
1164 DoNotUseAlternativeServiceQuicUnsupportedVersion) {
1165 std::string altsvc_header = base::StringPrintf(
1166 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam() - 1);
1167 MockRead http_reads[] = {
1168 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1169 MockRead("hello world"),
1170 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1171 MockRead(ASYNC, OK)};
1172
1173 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1174 0);
1175 socket_factory_.AddSocketDataProvider(&http_data);
1176 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1177 socket_factory_.AddSocketDataProvider(&http_data);
1178 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1179
rch3f4b8452016-02-23 16:59:321180 CreateSession();
bnc8be55ebb2015-10-30 14:12:071181
1182 SendRequestAndExpectHttpResponse("hello world");
1183 SendRequestAndExpectHttpResponse("hello world");
1184}
1185
bncc958faa2015-07-31 18:14:521186// When multiple alternative services are advertised,
zhongyi32569c62016-01-08 02:54:301187// HttpStreamFactoryImpl::RequestStreamInternal() should select the alternative
1188// service which uses existing QUIC session if available. If no existing QUIC
1189// session can be used, use the first alternative service from the list.
1190TEST_P(QuicNetworkTransactionTest, UseExistingAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:521191 MockRead http_reads[] = {
1192 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291193 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
bncc958faa2015-07-31 18:14:521194 MockRead("hello world"),
1195 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1196 MockRead(ASYNC, OK)};
1197
1198 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1199 0);
1200 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561201 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521202
zhongyi32569c62016-01-08 02:54:301203 QuicStreamOffset request_header_offset = 0;
1204 QuicStreamOffset response_header_offset = 0;
1205 // First QUIC request data.
rch9ae5b3b2016-02-11 00:36:291206 // Open a session to foo.example.org:443 using the first entry of the
zhongyi32569c62016-01-08 02:54:301207 // alternative service list.
bncc958faa2015-07-31 18:14:521208 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581209 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301210 1, kClientDataStreamId1, true, true,
1211 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1212
1213 std::string alt_svc_list =
rch9ae5b3b2016-02-11 00:36:291214 "quic=\"mail.example.org:444\", quic=\"foo.example.org:443\", "
1215 "quic=\"bar.example.org:445\"";
alyssar2adf3ac2016-05-03 17:12:581216 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301217 1, kClientDataStreamId1, false, false,
1218 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581219 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1220 false, true, 0, "hello!"));
1221 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301222
1223 // Second QUIC request data.
1224 // Connection pooling, using existing session, no need to include version
1225 // as version negotiation has been completed.
alyssar2adf3ac2016-05-03 17:12:581226 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301227 3, kClientDataStreamId2, false, true,
1228 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581229 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301230 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1231 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581232 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1233 false, true, 0, "hello!"));
1234 mock_quic_data.AddWrite(
1235 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
bncc958faa2015-07-31 18:14:521236 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591237 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521238
1239 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1240
rtennetib8e80fb2016-05-16 00:12:091241 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321242 CreateSession();
bncc958faa2015-07-31 18:14:521243
1244 SendRequestAndExpectHttpResponse("hello world");
zhongyi32569c62016-01-08 02:54:301245
bnc359ed2a2016-04-29 20:43:451246 SendRequestAndExpectQuicResponse("hello!");
1247 SendRequestAndExpectQuicResponse("hello!");
zhongyi32569c62016-01-08 02:54:301248}
1249
bnc359ed2a2016-04-29 20:43:451250// Pool to existing session with matching QuicServerId
1251// even if alternative service destination is different.
1252TEST_P(QuicNetworkTransactionTest, PoolByOrigin) {
zhongyi32569c62016-01-08 02:54:301253 MockQuicData mock_quic_data;
bnc359ed2a2016-04-29 20:43:451254 QuicStreamOffset request_header_offset(0);
1255 QuicStreamOffset response_header_offset(0);
1256
1257 // First request.
alyssar2adf3ac2016-05-03 17:12:581258 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301259 1, kClientDataStreamId1, true, true,
1260 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581261 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451262 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1263 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581264 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1265 false, true, 0, "hello!"));
1266 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301267
bnc359ed2a2016-04-29 20:43:451268 // Second request.
alyssar2adf3ac2016-05-03 17:12:581269 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301270 3, kClientDataStreamId2, false, true,
1271 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581272 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301273 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1274 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581275 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1276 false, true, 0, "hello!"));
1277 mock_quic_data.AddWrite(
1278 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
zhongyi32569c62016-01-08 02:54:301279 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1280 mock_quic_data.AddRead(ASYNC, 0); // EOF
1281
1282 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bnc359ed2a2016-04-29 20:43:451283
1284 AddHangingNonAlternateProtocolSocketData();
1285 AddHangingNonAlternateProtocolSocketData();
zhongyi32569c62016-01-08 02:54:301286
rch3f4b8452016-02-23 16:59:321287 CreateSession();
zhongyi32569c62016-01-08 02:54:301288
bnc359ed2a2016-04-29 20:43:451289 const char destination1[] = "first.example.com";
1290 const char destination2[] = "second.example.com";
1291
1292 // Set up alternative service entry to destination1.
1293 url::SchemeHostPort server(request_.url);
1294 AlternativeService alternative_service(QUIC, destination1, 443);
1295 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1296 http_server_properties_.SetAlternativeService(server, alternative_service,
1297 expiration);
1298 // First request opens connection to |destination1|
1299 // with QuicServerId.host() == kDefaultServerHostName.
1300 SendRequestAndExpectQuicResponse("hello!");
1301
1302 // Set up alternative service entry to a different destination.
1303 alternative_service = AlternativeService(QUIC, destination2, 443);
1304 http_server_properties_.SetAlternativeService(server, alternative_service,
1305 expiration);
1306 // Second request pools to existing connection with same QuicServerId,
1307 // even though alternative service destination is different.
1308 SendRequestAndExpectQuicResponse("hello!");
1309}
1310
1311// Pool to existing session with matching destination and matching certificate
1312// even if origin is different, and even if the alternative service with
1313// matching destination is not the first one on the list.
1314TEST_P(QuicNetworkTransactionTest, PoolByDestination) {
1315 GURL origin1 = request_.url;
1316 GURL origin2("https://www.example.org/");
1317 ASSERT_NE(origin1.host(), origin2.host());
1318
1319 MockQuicData mock_quic_data;
1320 QuicStreamOffset request_header_offset(0);
1321 QuicStreamOffset response_header_offset(0);
1322
1323 // First request.
alyssar2adf3ac2016-05-03 17:12:581324 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:451325 1, kClientDataStreamId1, true, true,
1326 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581327 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451328 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1329 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581330 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1331 false, true, 0, "hello!"));
1332 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bnc359ed2a2016-04-29 20:43:451333
1334 // Second request.
alyssar2adf3ac2016-05-03 17:12:581335 QuicTestPacketMaker client_maker2(GetParam(), 0, clock_, origin2.host(),
1336 Perspective::IS_CLIENT);
1337 QuicTestPacketMaker server_maker2(GetParam(), 0, clock_, origin2.host(),
1338 Perspective::IS_SERVER);
1339 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:451340 3, kClientDataStreamId2, false, true,
alyssar2adf3ac2016-05-03 17:12:581341 GetRequestHeaders("GET", "https", "/", &client_maker2),
1342 &request_header_offset, &client_maker2));
1343 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451344 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
alyssar2adf3ac2016-05-03 17:12:581345 &response_header_offset, &server_maker2));
1346 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1347 false, true, 0, "hello!"));
1348 mock_quic_data.AddWrite(
1349 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
bnc359ed2a2016-04-29 20:43:451350 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1351 mock_quic_data.AddRead(ASYNC, 0); // EOF
1352
1353 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1354
1355 AddHangingNonAlternateProtocolSocketData();
1356 AddHangingNonAlternateProtocolSocketData();
1357
1358 CreateSession();
1359
1360 const char destination1[] = "first.example.com";
1361 const char destination2[] = "second.example.com";
1362
1363 // Set up alternative service for |origin1|.
1364 AlternativeService alternative_service1(QUIC, destination1, 443);
1365 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1366 http_server_properties_.SetAlternativeService(
1367 url::SchemeHostPort(origin1), alternative_service1, expiration);
1368
1369 // Set up multiple alternative service entries for |origin2|,
1370 // the first one with a different destination as for |origin1|,
1371 // the second one with the same. The second one should be used,
1372 // because the request can be pooled to that one.
1373 AlternativeService alternative_service2(QUIC, destination2, 443);
1374 AlternativeServiceInfoVector alternative_services;
1375 alternative_services.push_back(
1376 AlternativeServiceInfo(alternative_service2, expiration));
1377 alternative_services.push_back(
1378 AlternativeServiceInfo(alternative_service1, expiration));
1379 http_server_properties_.SetAlternativeServices(url::SchemeHostPort(origin2),
1380 alternative_services);
bnc359ed2a2016-04-29 20:43:451381 // First request opens connection to |destination1|
1382 // with QuicServerId.host() == origin1.host().
1383 SendRequestAndExpectQuicResponse("hello!");
1384
1385 // Second request pools to existing connection with same destination,
1386 // because certificate matches, even though QuicServerId is different.
1387 request_.url = origin2;
alyssar2adf3ac2016-05-03 17:12:581388
bnc359ed2a2016-04-29 20:43:451389 SendRequestAndExpectQuicResponse("hello!");
zhongyi32569c62016-01-08 02:54:301390}
1391
1392// Multiple origins have listed the same alternative services. When there's a
1393// existing QUIC session opened by a request to other origin,
1394// if the cert is valid, should select this QUIC session to make the request
1395// if this is also the first existing QUIC session.
1396TEST_P(QuicNetworkTransactionTest,
1397 UseSharedExistingAlternativeServiceForQuicWithValidCert) {
rch9ae5b3b2016-02-11 00:36:291398 // Default cert is valid for *.example.org
zhongyi32569c62016-01-08 02:54:301399
rch9ae5b3b2016-02-11 00:36:291400 // HTTP data for request to www.example.org.
zhongyi32569c62016-01-08 02:54:301401 MockRead http_reads[] = {
1402 MockRead("HTTP/1.1 200 OK\r\n"),
1403 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
rch9ae5b3b2016-02-11 00:36:291404 MockRead("hello world from www.example.org"),
zhongyi32569c62016-01-08 02:54:301405 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1406 MockRead(ASYNC, OK)};
1407
1408 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1409 0);
1410 socket_factory_.AddSocketDataProvider(&http_data);
1411 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1412
1413 // HTTP data for request to mail.example.org.
1414 MockRead http_reads2[] = {
1415 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291416 MockRead("Alt-Svc: quic=\":444\", quic=\"www.example.org:443\"\r\n\r\n"),
zhongyi32569c62016-01-08 02:54:301417 MockRead("hello world from mail.example.org"),
1418 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1419 MockRead(ASYNC, OK)};
1420
1421 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1422 nullptr, 0);
1423 socket_factory_.AddSocketDataProvider(&http_data2);
1424 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1425
1426 QuicStreamOffset request_header_offset = 0;
1427 QuicStreamOffset response_header_offset = 0;
1428
alyssar2adf3ac2016-05-03 17:12:581429 QuicTestPacketMaker client_maker(GetParam(), 0, clock_, "mail.example.org",
1430 Perspective::IS_CLIENT);
1431 server_maker_.set_hostname("www.example.org");
1432 client_maker_.set_hostname("www.example.org");
zhongyi32569c62016-01-08 02:54:301433 MockQuicData mock_quic_data;
1434
1435 // First QUIC request data.
alyssar2adf3ac2016-05-03 17:12:581436 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301437 1, kClientDataStreamId1, true, true,
1438 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1439
alyssar2adf3ac2016-05-03 17:12:581440 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301441 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1442 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581443 mock_quic_data.AddRead(ConstructServerDataPacket(
1444 2, kClientDataStreamId1, false, true, 0, "hello from mail QUIC!"));
1445 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301446 // Second QUIC request data.
alyssar2adf3ac2016-05-03 17:12:581447 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301448 3, kClientDataStreamId2, false, true,
alyssar2adf3ac2016-05-03 17:12:581449 GetRequestHeaders("GET", "https", "/", &client_maker),
1450 &request_header_offset, &client_maker));
1451 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301452 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1453 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581454 mock_quic_data.AddRead(ConstructServerDataPacket(
1455 4, kClientDataStreamId2, false, true, 0, "hello from mail QUIC!"));
1456 mock_quic_data.AddWrite(
1457 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
zhongyi32569c62016-01-08 02:54:301458 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1459 mock_quic_data.AddRead(ASYNC, 0); // EOF
1460
1461 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
zhongyi32569c62016-01-08 02:54:301462
rtennetib8e80fb2016-05-16 00:12:091463 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321464 CreateSession();
zhongyi32569c62016-01-08 02:54:301465
1466 // Send two HTTP requests, responses set up alt-svc lists for the origins.
rch9ae5b3b2016-02-11 00:36:291467 request_.url = GURL("https://www.example.org/");
1468 SendRequestAndExpectHttpResponse("hello world from www.example.org");
zhongyi32569c62016-01-08 02:54:301469 request_.url = GURL("https://mail.example.org/");
1470 SendRequestAndExpectHttpResponse("hello world from mail.example.org");
1471
rch9ae5b3b2016-02-11 00:36:291472 // Open a QUIC session to mail.example.org:443 when making request
1473 // to mail.example.org.
1474 request_.url = GURL("https://www.example.org/");
bnc359ed2a2016-04-29 20:43:451475 SendRequestAndExpectQuicResponse("hello from mail QUIC!");
zhongyi32569c62016-01-08 02:54:301476
rch9ae5b3b2016-02-11 00:36:291477 // Uses the existing QUIC session when making request to www.example.org.
zhongyi32569c62016-01-08 02:54:301478 request_.url = GURL("https://mail.example.org/");
bnc359ed2a2016-04-29 20:43:451479 SendRequestAndExpectQuicResponse("hello from mail QUIC!");
bncc958faa2015-07-31 18:14:521480}
1481
1482TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) {
bncc958faa2015-07-31 18:14:521483 MockRead http_reads[] = {
1484 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561485 MockRead(kQuicAlternativeServiceDifferentPortHeader),
bncc958faa2015-07-31 18:14:521486 MockRead("hello world"),
1487 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1488 MockRead(ASYNC, OK)};
1489
1490 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1491 0);
1492 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561493 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521494
rtennetib8e80fb2016-05-16 00:12:091495 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321496 CreateSession();
bncc958faa2015-07-31 18:14:521497
1498 SendRequestAndExpectHttpResponse("hello world");
bnc359ed2a2016-04-29 20:43:451499
1500 url::SchemeHostPort http_server("https", kDefaultServerHostName, 443);
1501 AlternativeServiceVector alternative_service_vector =
1502 http_server_properties_.GetAlternativeServices(http_server);
1503 ASSERT_EQ(1u, alternative_service_vector.size());
1504 const AlternativeService alternative_service = alternative_service_vector[0];
1505 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
1506 EXPECT_EQ(kDefaultServerHostName, alternative_service_vector[0].host);
1507 EXPECT_EQ(137, alternative_service_vector[0].port);
bncc958faa2015-07-31 18:14:521508}
1509
1510TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) {
bncc958faa2015-07-31 18:14:521511 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561512 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1513 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521514 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1515 MockRead(ASYNC, OK)};
1516
1517 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1518 0);
1519 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561520 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521521
1522 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581523 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1524 1, kClientDataStreamId1, true, true,
1525 GetRequestHeaders("GET", "https", "/")));
1526 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:521527 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581528 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1529 false, true, 0, "hello!"));
1530 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:521531 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1532 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521533
1534 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1535
rtennetib8e80fb2016-05-16 00:12:091536 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321537 CreateSession();
bncc958faa2015-07-31 18:14:521538
1539 AlternativeService alternative_service(QUIC,
1540 HostPortPair::FromURL(request_.url));
1541 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
1542 alternative_service);
1543 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1544 alternative_service));
1545
1546 SendRequestAndExpectHttpResponse("hello world");
1547 SendRequestAndExpectQuicResponse("hello!");
1548
mmenkee24011922015-12-17 22:12:591549 mock_quic_data.Resume();
bncc958faa2015-07-31 18:14:521550
1551 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1552 alternative_service));
1553}
1554
bncc958faa2015-07-31 18:14:521555TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) {
bncc958faa2015-07-31 18:14:521556 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561557 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1558 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521559 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1560 MockRead(ASYNC, OK)};
1561
1562 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1563 0);
1564 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561565 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521566
1567 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581568 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1569 1, kClientDataStreamId1, true, true,
1570 GetRequestHeaders("GET", "https", "/")));
1571 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:521572 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581573 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1574 false, true, 0, "hello!"));
1575 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:521576 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
1577
1578 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1579
1580 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321581 CreateSession();
bncc958faa2015-07-31 18:14:521582
1583 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1584 SendRequestAndExpectHttpResponse("hello world");
1585}
1586
bnc1c196c6e2016-05-28 13:51:481587TEST_P(QuicNetworkTransactionTest, HungAlternativeService) {
[email protected]dda75ab2013-06-22 22:43:301588 crypto_client_stream_factory_.set_handshake_mode(
1589 MockCryptoClientStream::COLD_START);
1590
1591 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561592 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
rch9ae5b3b2016-02-11 00:36:291593 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561594 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")};
[email protected]dda75ab2013-06-22 22:43:301595
1596 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561597 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
bnc1c196c6e2016-05-28 13:51:481598 MockRead(SYNCHRONOUS, 4, kQuicAlternativeServiceHeader),
rchf114d982015-10-21 01:34:561599 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]dda75ab2013-06-22 22:43:301600
mmenke651bae7f2015-12-18 21:26:451601 SequencedSocketData http_data(http_reads, arraysize(http_reads), http_writes,
1602 arraysize(http_writes));
bnc912a04b2016-04-20 14:19:501603 socket_factory_.AddSocketDataProvider(&http_data);
1604 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301605
1606 // The QUIC transaction will not be allowed to complete.
mmenke651bae7f2015-12-18 21:26:451607 MockWrite quic_writes[] = {MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 1)};
[email protected]dda75ab2013-06-22 22:43:301608 MockRead quic_reads[] = {
mmenke651bae7f2015-12-18 21:26:451609 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0),
[email protected]dda75ab2013-06-22 22:43:301610 };
mmenke651bae7f2015-12-18 21:26:451611 SequencedSocketData quic_data(quic_reads, arraysize(quic_reads), quic_writes,
1612 arraysize(quic_writes));
bnc912a04b2016-04-20 14:19:501613 socket_factory_.AddSocketDataProvider(&quic_data);
[email protected]dda75ab2013-06-22 22:43:301614
1615 // The HTTP transaction will complete.
mmenke651bae7f2015-12-18 21:26:451616 SequencedSocketData http_data2(http_reads, arraysize(http_reads), http_writes,
1617 arraysize(http_writes));
bnc912a04b2016-04-20 14:19:501618 socket_factory_.AddSocketDataProvider(&http_data2);
1619 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301620
bnc912a04b2016-04-20 14:19:501621 CreateSession();
[email protected]dda75ab2013-06-22 22:43:301622
1623 // Run the first request.
[email protected]dda75ab2013-06-22 22:43:301624 SendRequestAndExpectHttpResponse("hello world");
rch37de576c2015-05-17 20:28:171625 ASSERT_TRUE(http_data.AllReadDataConsumed());
1626 ASSERT_TRUE(http_data.AllWriteDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301627
1628 // Now run the second request in which the QUIC socket hangs,
1629 // and verify the the transaction continues over HTTP.
[email protected]dda75ab2013-06-22 22:43:301630 SendRequestAndExpectHttpResponse("hello world");
mmenke651bae7f2015-12-18 21:26:451631 base::RunLoop().RunUntilIdle();
[email protected]dda75ab2013-06-22 22:43:301632
rch37de576c2015-05-17 20:28:171633 ASSERT_TRUE(http_data2.AllReadDataConsumed());
1634 ASSERT_TRUE(http_data2.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:451635 ASSERT_TRUE(quic_data.AllReadDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301636}
1637
[email protected]1e960032013-12-20 19:00:201638TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
[email protected]1e960032013-12-20 19:00:201639 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581640 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1641 1, kClientDataStreamId1, true, true,
1642 GetRequestHeaders("GET", "https", "/")));
1643 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021644 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581645 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1646 false, true, 0, "hello!"));
1647 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501648 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591649 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]8ba81212013-05-03 13:11:481650
rcha5399e02015-04-21 19:32:041651 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]8ba81212013-05-03 13:11:481652
rtennetib8e80fb2016-05-16 00:12:091653 // The non-alternate protocol job needs to hang in order to guarantee that
1654 // the alternate-protocol job will "win".
1655 AddHangingNonAlternateProtocolSocketData();
1656
rch3f4b8452016-02-23 16:59:321657 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:191658 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1659 SendRequestAndExpectQuicResponse("hello!");
[email protected]8ba81212013-05-03 13:11:481660}
1661
[email protected]1e960032013-12-20 19:00:201662TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
[email protected]1e960032013-12-20 19:00:201663 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581664 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1665 1, kClientDataStreamId1, true, true,
1666 GetRequestHeaders("GET", "https", "/")));
1667 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021668 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581669 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1670 false, true, 0, "hello!"));
1671 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501672 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591673 mock_quic_data.AddRead(ASYNC, 0); // EOF
rcha5399e02015-04-21 19:32:041674 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]3a120a6b2013-06-25 01:08:271675
1676 // In order for a new QUIC session to be established via alternate-protocol
1677 // without racing an HTTP connection, we need the host resolution to happen
1678 // synchronously.
1679 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291680 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561681 "");
rch9ae5b3b2016-02-11 00:36:291682 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]3a120a6b2013-06-25 01:08:271683 AddressList address;
rjshaded5ced072015-12-18 19:26:021684 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1685 nullptr, net_log_.bound());
[email protected]3a120a6b2013-06-25 01:08:271686
rtennetib8e80fb2016-05-16 00:12:091687 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321688 CreateSession();
[email protected]3a120a6b2013-06-25 01:08:271689 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1690 SendRequestAndExpectQuicResponse("hello!");
1691}
1692
[email protected]0fc924b2014-03-31 04:34:151693TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) {
rdsmith82957ad2015-09-16 19:42:031694 proxy_service_ = ProxyService::CreateFixedFromPacResult("PROXY myproxy:70");
[email protected]0fc924b2014-03-31 04:34:151695
1696 // Since we are using a proxy, the QUIC job will not succeed.
1697 MockWrite http_writes[] = {
rch9ae5b3b2016-02-11 00:36:291698 MockWrite(SYNCHRONOUS, 0, "GET http://mail.example.org/ HTTP/1.1\r\n"),
1699 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561700 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")};
[email protected]0fc924b2014-03-31 04:34:151701
1702 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561703 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
bnc1c196c6e2016-05-28 13:51:481704 MockRead(SYNCHRONOUS, 4, kQuicAlternativeServiceHeader),
rchf114d982015-10-21 01:34:561705 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]0fc924b2014-03-31 04:34:151706
1707 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
1708 http_writes, arraysize(http_writes));
1709 socket_factory_.AddSocketDataProvider(&http_data);
1710
1711 // In order for a new QUIC session to be established via alternate-protocol
1712 // without racing an HTTP connection, we need the host resolution to happen
1713 // synchronously.
1714 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291715 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561716 "");
rch9ae5b3b2016-02-11 00:36:291717 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]0fc924b2014-03-31 04:34:151718 AddressList address;
rjshaded5ced072015-12-18 19:26:021719 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1720 nullptr, net_log_.bound());
[email protected]0fc924b2014-03-31 04:34:151721
rch9ae5b3b2016-02-11 00:36:291722 request_.url = GURL("http://mail.example.org/");
rch3f4b8452016-02-23 16:59:321723 CreateSession();
[email protected]0fc924b2014-03-31 04:34:151724 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1725 SendRequestAndExpectHttpResponse("hello world");
1726}
1727
[email protected]1e960032013-12-20 19:00:201728TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
[email protected]1e960032013-12-20 19:00:201729 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581730 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1731 1, kClientDataStreamId1, true, true,
1732 GetRequestHeaders("GET", "https", "/")));
1733 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021734 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581735 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1736 false, true, 0, "hello!"));
1737 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591738 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
rcha5399e02015-04-21 19:32:041739 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]11c05872013-08-20 02:04:121740
rtennetib8e80fb2016-05-16 00:12:091741 // The non-alternate protocol job needs to hang in order to guarantee that
1742 // the alternate-protocol job will "win".
1743 AddHangingNonAlternateProtocolSocketData();
1744
[email protected]11c05872013-08-20 02:04:121745 // In order for a new QUIC session to be established via alternate-protocol
1746 // without racing an HTTP connection, we need the host resolution to happen
1747 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1748 // connection to the the server, in this test we require confirmation
1749 // before encrypting so the HTTP job will still start.
1750 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291751 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561752 "");
rch9ae5b3b2016-02-11 00:36:291753 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]11c05872013-08-20 02:04:121754 AddressList address;
rjshaded5ced072015-12-18 19:26:021755 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1756 nullptr, net_log_.bound());
[email protected]11c05872013-08-20 02:04:121757
rch3f4b8452016-02-23 16:59:321758 CreateSession();
[email protected]11c05872013-08-20 02:04:121759 session_->quic_stream_factory()->set_require_confirmation(true);
1760 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1761
danakjad1777e2016-04-16 00:56:421762 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]11c05872013-08-20 02:04:121763 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1764 TestCompletionCallback callback;
1765 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1766 EXPECT_EQ(ERR_IO_PENDING, rv);
1767
1768 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1769 QuicSession::HANDSHAKE_CONFIRMED);
1770 EXPECT_EQ(OK, callback.WaitForResult());
rchb27683c2015-07-29 23:53:501771
1772 CheckWasQuicResponse(trans);
1773 CheckResponseData(trans, "hello!");
[email protected]11c05872013-08-20 02:04:121774}
1775
zhongyica364fbb2015-12-12 03:39:121776TEST_P(QuicNetworkTransactionTest,
1777 LogGranularQuicErrorCodeOnQuicProtocolErrorLocal) {
1778 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581779 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1780 1, kClientDataStreamId1, true, true,
1781 GetRequestHeaders("GET", "https", "/")));
zhongyica364fbb2015-12-12 03:39:121782 // Read a close connection packet with
1783 // QuicErrorCode: QUIC_CRYPTO_VERSION_NOT_SUPPORTED from the peer.
alyssar2adf3ac2016-05-03 17:12:581784 mock_quic_data.AddRead(ConstructServerConnectionClosePacket(1));
zhongyica364fbb2015-12-12 03:39:121785 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1786
1787 // The non-alternate protocol job needs to hang in order to guarantee that
1788 // the alternate-protocol job will "win".
1789 AddHangingNonAlternateProtocolSocketData();
1790
1791 // In order for a new QUIC session to be established via alternate-protocol
1792 // without racing an HTTP connection, we need the host resolution to happen
1793 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1794 // connection to the the server, in this test we require confirmation
1795 // before encrypting so the HTTP job will still start.
1796 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291797 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:121798 "");
rch9ae5b3b2016-02-11 00:36:291799 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:121800 AddressList address;
1801 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1802 nullptr, net_log_.bound());
1803
rch3f4b8452016-02-23 16:59:321804 CreateSession();
zhongyica364fbb2015-12-12 03:39:121805 session_->quic_stream_factory()->set_require_confirmation(true);
1806 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1807
danakjad1777e2016-04-16 00:56:421808 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyica364fbb2015-12-12 03:39:121809 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1810 TestCompletionCallback callback;
1811 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1812 EXPECT_EQ(ERR_IO_PENDING, rv);
1813
1814 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1815 QuicSession::HANDSHAKE_CONFIRMED);
1816 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
1817
1818 NetErrorDetails details;
1819 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1820
1821 trans->PopulateNetErrorDetails(&details);
1822 // Verify the error code logged is what sent by the peer.
1823 EXPECT_EQ(QUIC_CRYPTO_VERSION_NOT_SUPPORTED, details.quic_connection_error);
1824}
1825
1826TEST_P(QuicNetworkTransactionTest,
1827 LogGranularQuicErrorCodeOnQuicProtocolErrorRemote) {
1828 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581829 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1830 1, kClientDataStreamId1, true, true,
1831 GetRequestHeaders("GET", "https", "/")));
zhongyif28b4a32016-04-25 21:35:211832 // Peer sending data from an non-existing stream causes this end to raise
1833 // error and close connection.
1834 mock_quic_data.AddRead(
alyssar2adf3ac2016-05-03 17:12:581835 ConstructServerRstPacket(1, false, 99, QUIC_STREAM_LAST_ERROR));
zhongyif28b4a32016-04-25 21:35:211836 std::string quic_error_details = "Data for nonexistent stream";
alyssar2adf3ac2016-05-03 17:12:581837 mock_quic_data.AddWrite(ConstructClientAckAndConnectionClosePacket(
zhongyif28b4a32016-04-25 21:35:211838 2, QuicTime::Delta::Infinite(), 0, 1, QUIC_INVALID_STREAM_ID,
zhongyica364fbb2015-12-12 03:39:121839 quic_error_details));
1840 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1841
1842 // The non-alternate protocol job needs to hang in order to guarantee that
1843 // the alternate-protocol job will "win".
1844 AddHangingNonAlternateProtocolSocketData();
1845
1846 // In order for a new QUIC session to be established via alternate-protocol
1847 // without racing an HTTP connection, we need the host resolution to happen
1848 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1849 // connection to the the server, in this test we require confirmation
1850 // before encrypting so the HTTP job will still start.
1851 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291852 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:121853 "");
rch9ae5b3b2016-02-11 00:36:291854 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:121855 AddressList address;
1856 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1857 nullptr, net_log_.bound());
1858
rch3f4b8452016-02-23 16:59:321859 CreateSession();
zhongyica364fbb2015-12-12 03:39:121860 session_->quic_stream_factory()->set_require_confirmation(true);
1861 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1862
danakjad1777e2016-04-16 00:56:421863 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyica364fbb2015-12-12 03:39:121864 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1865 TestCompletionCallback callback;
1866 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1867 EXPECT_EQ(ERR_IO_PENDING, rv);
1868
1869 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1870 QuicSession::HANDSHAKE_CONFIRMED);
1871 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
1872 NetErrorDetails details;
1873 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1874
1875 trans->PopulateNetErrorDetails(&details);
zhongyif28b4a32016-04-25 21:35:211876 EXPECT_EQ(QUIC_INVALID_STREAM_ID, details.quic_connection_error);
zhongyica364fbb2015-12-12 03:39:121877}
1878
[email protected]1e960032013-12-20 19:00:201879TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
[email protected]3316d422013-05-03 21:45:301880 // Alternate-protocol job
alyssar2adf3ac2016-05-03 17:12:581881 std::unique_ptr<QuicEncryptedPacket> close(
1882 ConstructServerConnectionClosePacket(1));
[email protected]3316d422013-05-03 21:45:301883 MockRead quic_reads[] = {
rchb27683c2015-07-29 23:53:501884 MockRead(ASYNC, close->data(), close->length()),
1885 MockRead(ASYNC, ERR_IO_PENDING), // No more data to read
1886 MockRead(ASYNC, OK), // EOF
[email protected]3316d422013-05-03 21:45:301887 };
rjshaded5ced072015-12-18 19:26:021888 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
1889 0);
[email protected]3316d422013-05-03 21:45:301890 socket_factory_.AddSocketDataProvider(&quic_data);
1891
1892 // Main job which will succeed even though the alternate job fails.
1893 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021894 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
1895 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1896 MockRead(ASYNC, OK)};
[email protected]3316d422013-05-03 21:45:301897
rjshaded5ced072015-12-18 19:26:021898 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1899 0);
[email protected]3316d422013-05-03 21:45:301900 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561901 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]3316d422013-05-03 21:45:301902
rch3f4b8452016-02-23 16:59:321903 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:191904 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1905 SendRequestAndExpectHttpResponse("hello from http");
1906 ExpectBrokenAlternateProtocolMapping();
[email protected]3316d422013-05-03 21:45:301907}
1908
[email protected]1e960032013-12-20 19:00:201909TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
[email protected]d03a66d2013-05-06 12:55:591910 // Alternate-protocol job
1911 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:021912 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]d03a66d2013-05-06 12:55:591913 };
rjshaded5ced072015-12-18 19:26:021914 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
1915 0);
[email protected]d03a66d2013-05-06 12:55:591916 socket_factory_.AddSocketDataProvider(&quic_data);
1917
1918 // Main job which will succeed even though the alternate job fails.
1919 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021920 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
1921 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1922 MockRead(ASYNC, OK)};
[email protected]d03a66d2013-05-06 12:55:591923
rjshaded5ced072015-12-18 19:26:021924 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1925 0);
[email protected]d03a66d2013-05-06 12:55:591926 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561927 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]d03a66d2013-05-06 12:55:591928
rch3f4b8452016-02-23 16:59:321929 CreateSession();
[email protected]d03a66d2013-05-06 12:55:591930
[email protected]aa9b14d2013-05-10 23:45:191931 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1932 SendRequestAndExpectHttpResponse("hello from http");
1933 ExpectBrokenAlternateProtocolMapping();
[email protected]d03a66d2013-05-06 12:55:591934}
1935
[email protected]00c159f2014-05-21 22:38:161936TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) {
[email protected]eb71ab62014-05-23 07:57:531937 // Alternate-protocol job will fail when the session attempts to read.
[email protected]00c159f2014-05-21 22:38:161938 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:021939 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:161940 };
rjshaded5ced072015-12-18 19:26:021941 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
1942 0);
[email protected]00c159f2014-05-21 22:38:161943 socket_factory_.AddSocketDataProvider(&quic_data);
1944
[email protected]eb71ab62014-05-23 07:57:531945 // Main job will also fail.
[email protected]00c159f2014-05-21 22:38:161946 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021947 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:161948 };
1949
rjshaded5ced072015-12-18 19:26:021950 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1951 0);
[email protected]00c159f2014-05-21 22:38:161952 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED));
1953 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561954 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]00c159f2014-05-21 22:38:161955
rtennetib8e80fb2016-05-16 00:12:091956 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321957 CreateSession();
[email protected]00c159f2014-05-21 22:38:161958
1959 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
danakjad1777e2016-04-16 00:56:421960 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]00c159f2014-05-21 22:38:161961 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1962 TestCompletionCallback callback;
1963 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1964 EXPECT_EQ(ERR_IO_PENDING, rv);
1965 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult());
1966 ExpectQuicAlternateProtocolMapping();
1967}
1968
[email protected]1e960032013-12-20 19:00:201969TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
[email protected]77c6c162013-08-17 02:57:451970 // Alternate-protocol job
1971 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:021972 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]77c6c162013-08-17 02:57:451973 };
rjshaded5ced072015-12-18 19:26:021974 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
1975 0);
[email protected]77c6c162013-08-17 02:57:451976 socket_factory_.AddSocketDataProvider(&quic_data);
1977
[email protected]c92c1b52014-05-31 04:16:061978 // Second Alternate-protocol job which will race with the TCP job.
1979 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421980 nullptr, 0);
[email protected]c92c1b52014-05-31 04:16:061981 socket_factory_.AddSocketDataProvider(&quic_data2);
1982
[email protected]4d283b32013-10-17 12:57:271983 // Final job that will proceed when the QUIC job fails.
1984 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021985 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
1986 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1987 MockRead(ASYNC, OK)};
[email protected]4d283b32013-10-17 12:57:271988
rjshaded5ced072015-12-18 19:26:021989 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1990 0);
[email protected]4d283b32013-10-17 12:57:271991 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561992 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d283b32013-10-17 12:57:271993
rtennetiafccbc062016-05-16 18:21:141994 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321995 CreateSession();
[email protected]77c6c162013-08-17 02:57:451996
1997 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1998
[email protected]4d283b32013-10-17 12:57:271999 SendRequestAndExpectHttpResponse("hello from http");
[email protected]77c6c162013-08-17 02:57:452000
2001 ExpectBrokenAlternateProtocolMapping();
[email protected]4d283b32013-10-17 12:57:272002
rch37de576c2015-05-17 20:28:172003 EXPECT_TRUE(quic_data.AllReadDataConsumed());
2004 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
[email protected]77c6c162013-08-17 02:57:452005}
2006
[email protected]93b31772014-06-19 08:03:352007TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) {
[email protected]65768442014-06-06 23:37:032008 // Alternate-protocol job
2009 MockRead quic_reads[] = {
mmenkee24011922015-12-17 22:12:592010 MockRead(SYNCHRONOUS, ERR_IO_PENDING),
[email protected]65768442014-06-06 23:37:032011 };
rjshaded5ced072015-12-18 19:26:022012 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2013 0);
[email protected]65768442014-06-06 23:37:032014 socket_factory_.AddSocketDataProvider(&quic_data);
2015
2016 // Main job that will proceed when the QUIC job fails.
2017 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022018 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2019 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2020 MockRead(ASYNC, OK)};
[email protected]65768442014-06-06 23:37:032021
rjshaded5ced072015-12-18 19:26:022022 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2023 0);
[email protected]65768442014-06-06 23:37:032024 socket_factory_.AddSocketDataProvider(&http_data);
2025
rtennetib8e80fb2016-05-16 00:12:092026 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322027 CreateSession();
[email protected]65768442014-06-06 23:37:032028
2029 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2030
2031 SendRequestAndExpectHttpResponse("hello from http");
2032}
2033
[email protected]eb71ab62014-05-23 07:57:532034TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
[email protected]4d590c9c2014-05-02 05:14:332035 // Alternate-protocol job will fail before creating a QUIC session.
rtennetibe635732014-10-02 22:51:422036 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0);
rjshaded5ced072015-12-18 19:26:022037 quic_data.set_connect_data(
2038 MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED));
[email protected]4d590c9c2014-05-02 05:14:332039 socket_factory_.AddSocketDataProvider(&quic_data);
2040
2041 // Main job which will succeed even though the alternate job fails.
2042 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022043 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2044 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2045 MockRead(ASYNC, OK)};
[email protected]4d590c9c2014-05-02 05:14:332046
rjshaded5ced072015-12-18 19:26:022047 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2048 0);
[email protected]4d590c9c2014-05-02 05:14:332049 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562050 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d590c9c2014-05-02 05:14:332051
rch3f4b8452016-02-23 16:59:322052 CreateSession();
[email protected]4d590c9c2014-05-02 05:14:332053 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2054 SendRequestAndExpectHttpResponse("hello from http");
[email protected]eb71ab62014-05-23 07:57:532055
2056 ExpectBrokenAlternateProtocolMapping();
[email protected]4d590c9c2014-05-02 05:14:332057}
2058
[email protected]4fee9672014-01-08 14:47:152059TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
[email protected]4fee9672014-01-08 14:47:152060 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582061 mock_quic_data.AddSynchronousRead(ConstructServerConnectionClosePacket(1));
2062 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2063 1, kClientDataStreamId1, true, true,
2064 GetRequestHeaders("GET", "https", "/")));
2065 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rcha5399e02015-04-21 19:32:042066 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4fee9672014-01-08 14:47:152067
2068 // When the QUIC connection fails, we will try the request again over HTTP.
2069 MockRead http_reads[] = {
bnc1c196c6e2016-05-28 13:51:482070 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
rchf114d982015-10-21 01:34:562071 MockRead("hello world"),
2072 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2073 MockRead(ASYNC, OK)};
[email protected]4fee9672014-01-08 14:47:152074
rjshaded5ced072015-12-18 19:26:022075 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2076 0);
[email protected]4fee9672014-01-08 14:47:152077 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562078 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4fee9672014-01-08 14:47:152079
2080 // In order for a new QUIC session to be established via alternate-protocol
2081 // without racing an HTTP connection, we need the host resolution to happen
2082 // synchronously.
2083 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:292084 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:562085 "");
rch9ae5b3b2016-02-11 00:36:292086 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]4fee9672014-01-08 14:47:152087 AddressList address;
rjshaded5ced072015-12-18 19:26:022088 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2089 nullptr, net_log_.bound());
[email protected]4fee9672014-01-08 14:47:152090
rch3f4b8452016-02-23 16:59:322091 CreateSession();
[email protected]4fee9672014-01-08 14:47:152092 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2093 SendRequestAndExpectHttpResponse("hello world");
2094}
2095
bnc508835902015-05-12 20:10:292096TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) {
alyssar2adf3ac2016-05-03 17:12:582097 client_maker_.set_hostname("www.example.org");
tbansal0f56a39a2016-04-07 22:03:382098 EXPECT_FALSE(
2099 test_socket_performance_watcher_factory_.rtt_notification_received());
bnc508835902015-05-12 20:10:292100 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582101 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2102 1, kClientDataStreamId1, true, true,
2103 GetRequestHeaders("GET", "https", "/")));
2104 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc508835902015-05-12 20:10:292105 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:582106 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
2107 false, true, 0, "hello!"));
2108 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:502109 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
bnc508835902015-05-12 20:10:292110 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2111
bncb07c05532015-05-14 19:07:202112 request_.url = GURL("https://www.example.org:443");
rtennetib8e80fb2016-05-16 00:12:092113 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322114 CreateSession();
bnc508835902015-05-12 20:10:292115 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
2116 SendRequestAndExpectQuicResponse("hello!");
tbansal0f56a39a2016-04-07 22:03:382117 EXPECT_TRUE(
2118 test_socket_performance_watcher_factory_.rtt_notification_received());
bnc508835902015-05-12 20:10:292119}
2120
rtenneti56977812016-01-15 19:26:562121TEST_P(QuicNetworkTransactionTest, QuicUpload) {
rtenneti8a2f4632016-03-21 20:26:572122 params_.origins_to_force_quic_on.insert(
2123 HostPortPair::FromString("mail.example.org:443"));
rtenneti56977812016-01-15 19:26:562124
2125 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2126 MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_FAILED, 1)};
2127 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2128 arraysize(writes));
2129 socket_factory_.AddSocketDataProvider(&socket_data);
2130
rtennetib8e80fb2016-05-16 00:12:092131 // The non-alternate protocol job needs to hang in order to guarantee that
2132 // the alternate-protocol job will "win".
2133 AddHangingNonAlternateProtocolSocketData();
2134
rch3f4b8452016-02-23 16:59:322135 params_.enable_alternative_service_with_different_host = false;
rtenneti56977812016-01-15 19:26:562136 CreateSession();
2137 request_.method = "POST";
2138 ChunkedUploadDataStream upload_data(0);
2139 upload_data.AppendData("1", 1, true);
2140
2141 request_.upload_data_stream = &upload_data;
2142
danakjad1777e2016-04-16 00:56:422143 std::unique_ptr<HttpNetworkTransaction> trans(
rtenneti56977812016-01-15 19:26:562144 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2145 TestCompletionCallback callback;
2146 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2147 EXPECT_EQ(ERR_IO_PENDING, rv);
2148 EXPECT_NE(OK, callback.WaitForResult());
2149}
2150
bnc359ed2a2016-04-29 20:43:452151class QuicNetworkTransactionWithDestinationTest
2152 : public PlatformTest,
2153 public ::testing::WithParamInterface<PoolingTestParams> {
2154 protected:
2155 QuicNetworkTransactionWithDestinationTest()
2156 : clock_(new MockClock),
2157 version_(GetParam().version),
2158 destination_type_(GetParam().destination_type),
2159 cert_transparency_verifier_(new MultiLogCTVerifier()),
2160 ssl_config_service_(new SSLConfigServiceDefaults),
2161 proxy_service_(ProxyService::CreateDirect()),
2162 auth_handler_factory_(
2163 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
2164 random_generator_(0),
2165 ssl_data_(ASYNC, OK) {}
2166
2167 void SetUp() override {
2168 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:552169 base::RunLoop().RunUntilIdle();
bnc359ed2a2016-04-29 20:43:452170
2171 HttpNetworkSession::Params params;
2172
2173 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
2174 params.quic_clock = clock_;
2175
2176 crypto_client_stream_factory_.set_handshake_mode(
2177 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2178 params.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
2179
2180 params.enable_alternative_service_with_different_host = true;
2181 params.enable_quic = true;
2182 params.quic_random = &random_generator_;
2183 params.client_socket_factory = &socket_factory_;
2184 params.host_resolver = &host_resolver_;
2185 params.cert_verifier = &cert_verifier_;
2186 params.transport_security_state = &transport_security_state_;
2187 params.cert_transparency_verifier = cert_transparency_verifier_.get();
2188 params.socket_performance_watcher_factory =
2189 &test_socket_performance_watcher_factory_;
2190 params.ssl_config_service = ssl_config_service_.get();
2191 params.proxy_service = proxy_service_.get();
2192 params.http_auth_handler_factory = auth_handler_factory_.get();
2193 params.http_server_properties = http_server_properties_.GetWeakPtr();
2194 params.quic_supported_versions = SupportedVersions(version_);
2195 params.quic_host_whitelist.insert("news.example.org");
2196 params.quic_host_whitelist.insert("mail.example.org");
2197 params.quic_host_whitelist.insert("mail.example.com");
2198
2199 session_.reset(new HttpNetworkSession(params));
2200 session_->quic_stream_factory()->set_require_confirmation(true);
2201 ASSERT_EQ(params.quic_socket_receive_buffer_size,
2202 session_->quic_stream_factory()->socket_receive_buffer_size());
2203 }
2204
2205 void TearDown() override {
2206 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
2207 // Empty the current queue.
fdoray92e35a72016-06-10 15:54:552208 base::RunLoop().RunUntilIdle();
bnc359ed2a2016-04-29 20:43:452209 PlatformTest::TearDown();
2210 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:552211 base::RunLoop().RunUntilIdle();
bnc359ed2a2016-04-29 20:43:452212 }
2213
2214 void SetAlternativeService(const std::string& origin) {
2215 HostPortPair destination;
2216 switch (destination_type_) {
2217 case SAME_AS_FIRST:
2218 destination = HostPortPair(origin1_, 443);
2219 break;
2220 case SAME_AS_SECOND:
2221 destination = HostPortPair(origin2_, 443);
2222 break;
2223 case DIFFERENT:
2224 destination = HostPortPair(kDifferentHostname, 443);
2225 break;
2226 }
2227 AlternativeService alternative_service(QUIC, destination);
2228 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
2229 http_server_properties_.SetAlternativeService(
2230 url::SchemeHostPort("https", origin, 443), alternative_service,
2231 expiration);
2232 }
2233
alyssar2adf3ac2016-05-03 17:12:582234 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452235 QuicPacketNumber packet_number,
2236 QuicStreamId stream_id,
2237 bool should_include_version,
2238 QuicStreamOffset* offset,
2239 QuicTestPacketMaker* maker) {
2240 SpdyPriority priority =
2241 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
2242 SpdyHeaderBlock headers(maker->GetRequestHeaders("GET", "https", "/"));
2243 return maker->MakeRequestHeadersPacketWithOffsetTracking(
2244 packet_number, stream_id, should_include_version, true, priority,
2245 headers, offset);
2246 }
2247
alyssar2adf3ac2016-05-03 17:12:582248 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452249 QuicPacketNumber packet_number,
2250 QuicStreamId stream_id,
2251 bool should_include_version,
2252 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:582253 return ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452254 packet_number, stream_id, should_include_version, nullptr, maker);
2255 }
2256
alyssar2adf3ac2016-05-03 17:12:582257 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:452258 QuicPacketNumber packet_number,
2259 QuicStreamId stream_id,
2260 QuicStreamOffset* offset,
2261 QuicTestPacketMaker* maker) {
2262 SpdyHeaderBlock headers(maker->GetResponseHeaders("200 OK"));
2263 return maker->MakeResponseHeadersPacketWithOffsetTracking(
2264 packet_number, stream_id, false, false, headers, offset);
2265 }
2266
alyssar2adf3ac2016-05-03 17:12:582267 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:452268 QuicPacketNumber packet_number,
2269 QuicStreamId stream_id,
2270 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:582271 return ConstructServerResponseHeadersPacket(packet_number, stream_id,
2272 nullptr, maker);
bnc359ed2a2016-04-29 20:43:452273 }
2274
alyssar2adf3ac2016-05-03 17:12:582275 std::unique_ptr<QuicEncryptedPacket> ConstructServerDataPacket(
bnc359ed2a2016-04-29 20:43:452276 QuicPacketNumber packet_number,
2277 QuicStreamId stream_id,
2278 QuicTestPacketMaker* maker) {
2279 return maker->MakeDataPacket(packet_number, stream_id, false, true, 0,
2280 "hello");
2281 }
2282
alyssar2adf3ac2016-05-03 17:12:582283 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
bnc359ed2a2016-04-29 20:43:452284 QuicPacketNumber packet_number,
2285 QuicPacketNumber largest_received,
2286 QuicPacketNumber ack_least_unacked,
2287 QuicPacketNumber stop_least_unacked,
2288 QuicTestPacketMaker* maker) {
2289 return maker->MakeAckPacket(packet_number, largest_received,
2290 ack_least_unacked, stop_least_unacked, true);
2291 }
2292
2293 void AddRefusedSocketData() {
2294 std::unique_ptr<StaticSocketDataProvider> refused_data(
2295 new StaticSocketDataProvider());
2296 MockConnect refused_connect(SYNCHRONOUS, ERR_CONNECTION_REFUSED);
2297 refused_data->set_connect_data(refused_connect);
2298 socket_factory_.AddSocketDataProvider(refused_data.get());
2299 static_socket_data_provider_vector_.push_back(std::move(refused_data));
2300 }
2301
2302 void AddHangingSocketData() {
2303 std::unique_ptr<StaticSocketDataProvider> hanging_data(
2304 new StaticSocketDataProvider());
2305 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
2306 hanging_data->set_connect_data(hanging_connect);
2307 socket_factory_.AddSocketDataProvider(hanging_data.get());
2308 static_socket_data_provider_vector_.push_back(std::move(hanging_data));
2309 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
2310 }
2311
2312 bool AllDataConsumed() {
2313 for (const auto& socket_data_ptr : static_socket_data_provider_vector_) {
2314 if (!socket_data_ptr->AllReadDataConsumed() ||
2315 !socket_data_ptr->AllWriteDataConsumed()) {
2316 return false;
2317 }
2318 }
2319 return true;
2320 }
2321
2322 void SendRequestAndExpectQuicResponse(const std::string& host) {
2323 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
2324 HttpRequestInfo request;
2325 std::string url("https://");
2326 url.append(host);
2327 request.url = GURL(url);
2328 request.load_flags = 0;
2329 request.method = "GET";
2330 TestCompletionCallback callback;
2331 int rv = trans.Start(&request, callback.callback(), net_log_.bound());
2332 EXPECT_EQ(OK, callback.GetResult(rv));
2333
2334 std::string response_data;
2335 ASSERT_EQ(OK, ReadTransaction(&trans, &response_data));
2336 EXPECT_EQ("hello", response_data);
2337
2338 const HttpResponseInfo* response = trans.GetResponseInfo();
2339 ASSERT_TRUE(response != nullptr);
2340 ASSERT_TRUE(response->headers.get() != nullptr);
2341 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
2342 EXPECT_TRUE(response->was_fetched_via_spdy);
2343 EXPECT_TRUE(response->was_npn_negotiated);
2344 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
2345 response->connection_info);
2346 EXPECT_EQ(443, response->socket_address.port());
2347 }
2348
2349 MockClock* clock_;
2350 QuicVersion version_;
2351 DestinationType destination_type_;
2352 std::string origin1_;
2353 std::string origin2_;
2354 std::unique_ptr<HttpNetworkSession> session_;
2355 MockClientSocketFactory socket_factory_;
2356 MockHostResolver host_resolver_;
2357 MockCertVerifier cert_verifier_;
2358 TransportSecurityState transport_security_state_;
2359 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
2360 TestSocketPerformanceWatcherFactory test_socket_performance_watcher_factory_;
2361 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
2362 std::unique_ptr<ProxyService> proxy_service_;
2363 std::unique_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
2364 MockRandom random_generator_;
2365 HttpServerPropertiesImpl http_server_properties_;
2366 BoundTestNetLog net_log_;
2367 MockCryptoClientStreamFactory crypto_client_stream_factory_;
2368 std::vector<std::unique_ptr<StaticSocketDataProvider>>
2369 static_socket_data_provider_vector_;
2370 SSLSocketDataProvider ssl_data_;
2371};
2372
2373INSTANTIATE_TEST_CASE_P(Version,
2374 QuicNetworkTransactionWithDestinationTest,
2375 ::testing::ValuesIn(GetPoolingTestParams()));
2376
2377// A single QUIC request fails because the certificate does not match the origin
2378// hostname, regardless of whether it matches the alternative service hostname.
2379TEST_P(QuicNetworkTransactionWithDestinationTest, InvalidCertificate) {
2380 if (destination_type_ == DIFFERENT)
2381 return;
2382
2383 GURL url("https://mail.example.com/");
2384 origin1_ = url.host();
2385
2386 // Not used for requests, but this provides a test case where the certificate
2387 // is valid for the hostname of the alternative service.
2388 origin2_ = "mail.example.org";
2389
2390 SetAlternativeService(origin1_);
2391
2392 scoped_refptr<X509Certificate> cert(
2393 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2394 bool unused;
2395 ASSERT_FALSE(cert->VerifyNameMatch(origin1_, &unused));
2396 ASSERT_TRUE(cert->VerifyNameMatch(origin2_, &unused));
2397
2398 ProofVerifyDetailsChromium verify_details;
2399 verify_details.cert_verify_result.verified_cert = cert;
2400 verify_details.cert_verify_result.is_issued_by_known_root = true;
2401 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2402
2403 MockQuicData mock_quic_data;
2404 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);
2405 mock_quic_data.AddRead(ASYNC, 0);
2406
2407 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2408
2409 AddRefusedSocketData();
2410
2411 HttpRequestInfo request;
2412 request.url = url;
2413
2414 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
2415 TestCompletionCallback callback;
2416 int rv = trans.Start(&request, callback.callback(), net_log_.bound());
2417 EXPECT_EQ(ERR_CONNECTION_REFUSED, callback.GetResult(rv));
2418
2419 EXPECT_TRUE(AllDataConsumed());
2420}
2421
2422// First request opens QUIC session to alternative service. Second request
2423// pools to it, because destination matches and certificate is valid, even
2424// though QuicServerId is different.
2425TEST_P(QuicNetworkTransactionWithDestinationTest, PoolIfCertificateValid) {
2426 origin1_ = "mail.example.org";
2427 origin2_ = "news.example.org";
2428
2429 SetAlternativeService(origin1_);
2430 SetAlternativeService(origin2_);
2431
2432 scoped_refptr<X509Certificate> cert(
2433 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2434 bool unused;
2435 ASSERT_TRUE(cert->VerifyNameMatch(origin1_, &unused));
2436 ASSERT_TRUE(cert->VerifyNameMatch(origin2_, &unused));
2437 ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname, &unused));
2438
2439 ProofVerifyDetailsChromium verify_details;
2440 verify_details.cert_verify_result.verified_cert = cert;
2441 verify_details.cert_verify_result.is_issued_by_known_root = true;
2442 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2443
alyssar2adf3ac2016-05-03 17:12:582444 QuicTestPacketMaker client_maker1(version_, 0, clock_, origin1_,
2445 Perspective::IS_CLIENT);
2446 QuicTestPacketMaker server_maker1(version_, 0, clock_, origin1_,
2447 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452448
2449 QuicStreamOffset request_header_offset(0);
2450 QuicStreamOffset response_header_offset(0);
2451
2452 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582453 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2454 1, kClientDataStreamId1, true, &request_header_offset, &client_maker1));
2455 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2456 1, kClientDataStreamId1, &response_header_offset, &server_maker1));
2457 mock_quic_data.AddRead(
2458 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker1));
2459 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 2, 1, 1, &client_maker1));
bnc359ed2a2016-04-29 20:43:452460
alyssar2adf3ac2016-05-03 17:12:582461 QuicTestPacketMaker client_maker2(version_, 0, clock_, origin2_,
2462 Perspective::IS_CLIENT);
2463 QuicTestPacketMaker server_maker2(version_, 0, clock_, origin2_,
2464 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452465
alyssar2adf3ac2016-05-03 17:12:582466 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2467 3, kClientDataStreamId2, false, &request_header_offset, &client_maker2));
2468 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2469 3, kClientDataStreamId2, &response_header_offset, &server_maker2));
2470 mock_quic_data.AddRead(
2471 ConstructServerDataPacket(4, kClientDataStreamId2, &server_maker2));
2472 mock_quic_data.AddWrite(ConstructClientAckPacket(4, 4, 3, 1, &client_maker2));
bnc359ed2a2016-04-29 20:43:452473 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2474 mock_quic_data.AddRead(ASYNC, 0); // EOF
2475
2476 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2477
2478 AddHangingSocketData();
2479 AddHangingSocketData();
2480
2481 SendRequestAndExpectQuicResponse(origin1_);
2482 SendRequestAndExpectQuicResponse(origin2_);
2483
2484 EXPECT_TRUE(AllDataConsumed());
2485}
2486
2487// First request opens QUIC session to alternative service. Second request does
2488// not pool to it, even though destination matches, because certificate is not
2489// valid. Instead, a new QUIC session is opened to the same destination with a
2490// different QuicServerId.
2491TEST_P(QuicNetworkTransactionWithDestinationTest,
2492 DoNotPoolIfCertificateInvalid) {
2493 origin1_ = "news.example.org";
2494 origin2_ = "mail.example.com";
2495
2496 SetAlternativeService(origin1_);
2497 SetAlternativeService(origin2_);
2498
2499 scoped_refptr<X509Certificate> cert1(
2500 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2501 bool unused;
2502 ASSERT_TRUE(cert1->VerifyNameMatch(origin1_, &unused));
2503 ASSERT_FALSE(cert1->VerifyNameMatch(origin2_, &unused));
2504 ASSERT_FALSE(cert1->VerifyNameMatch(kDifferentHostname, &unused));
2505
2506 scoped_refptr<X509Certificate> cert2(
2507 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
2508 ASSERT_TRUE(cert2->VerifyNameMatch(origin2_, &unused));
2509 ASSERT_FALSE(cert2->VerifyNameMatch(kDifferentHostname, &unused));
2510
2511 ProofVerifyDetailsChromium verify_details1;
2512 verify_details1.cert_verify_result.verified_cert = cert1;
2513 verify_details1.cert_verify_result.is_issued_by_known_root = true;
2514 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
2515
2516 ProofVerifyDetailsChromium verify_details2;
2517 verify_details2.cert_verify_result.verified_cert = cert2;
2518 verify_details2.cert_verify_result.is_issued_by_known_root = true;
2519 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
2520
alyssar2adf3ac2016-05-03 17:12:582521 QuicTestPacketMaker client_maker1(version_, 0, clock_, origin1_,
2522 Perspective::IS_CLIENT);
2523 QuicTestPacketMaker server_maker1(version_, 0, clock_, origin1_,
2524 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452525
2526 MockQuicData mock_quic_data1;
alyssar2adf3ac2016-05-03 17:12:582527 mock_quic_data1.AddWrite(ConstructClientRequestHeadersPacket(
2528 1, kClientDataStreamId1, true, &client_maker1));
2529 mock_quic_data1.AddRead(ConstructServerResponseHeadersPacket(
2530 1, kClientDataStreamId1, &server_maker1));
2531 mock_quic_data1.AddRead(
2532 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker1));
bnc359ed2a2016-04-29 20:43:452533 mock_quic_data1.AddWrite(
alyssar2adf3ac2016-05-03 17:12:582534 ConstructClientAckPacket(2, 2, 1, 1, &client_maker1));
bnc359ed2a2016-04-29 20:43:452535 mock_quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2536 mock_quic_data1.AddRead(ASYNC, 0); // EOF
2537
2538 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
2539
2540 AddHangingSocketData();
2541
alyssar2adf3ac2016-05-03 17:12:582542 QuicTestPacketMaker client_maker2(version_, 0, clock_, origin2_,
2543 Perspective::IS_CLIENT);
2544 QuicTestPacketMaker server_maker2(version_, 0, clock_, origin2_,
2545 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452546
2547 MockQuicData mock_quic_data2;
alyssar2adf3ac2016-05-03 17:12:582548 mock_quic_data2.AddWrite(ConstructClientRequestHeadersPacket(
2549 1, kClientDataStreamId1, true, &client_maker2));
2550 mock_quic_data2.AddRead(ConstructServerResponseHeadersPacket(
2551 1, kClientDataStreamId1, &server_maker2));
2552 mock_quic_data2.AddRead(
2553 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker2));
bnc359ed2a2016-04-29 20:43:452554 mock_quic_data2.AddWrite(
alyssar2adf3ac2016-05-03 17:12:582555 ConstructClientAckPacket(2, 2, 1, 1, &client_maker2));
bnc359ed2a2016-04-29 20:43:452556 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2557 mock_quic_data2.AddRead(ASYNC, 0); // EOF
2558
2559 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
2560
2561 AddHangingSocketData();
2562
2563 SendRequestAndExpectQuicResponse(origin1_);
2564 SendRequestAndExpectQuicResponse(origin2_);
2565
2566 EXPECT_TRUE(AllDataConsumed());
2567}
2568
[email protected]61a527782013-02-21 03:58:002569} // namespace test
2570} // namespace net