blob: 7be9d646915cd2cb9320b185ddac4e48328f17f3 [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();
bnc525e175a2016-06-20 12:36:40291 session_.reset();
[email protected]61a527782013-02-21 03:58:00292 }
293
alyssar2adf3ac2016-05-03 17:12:58294 std::unique_ptr<QuicEncryptedPacket> ConstructClientConnectionClosePacket(
rtennetia004d332015-08-28 06:44:57295 QuicPacketNumber num) {
alyssar2adf3ac2016-05-03 17:12:58296 return client_maker_.MakeConnectionClosePacket(num);
[email protected]3316d422013-05-03 21:45:30297 }
298
alyssar2adf3ac2016-05-03 17:12:58299 std::unique_ptr<QuicEncryptedPacket> ConstructServerConnectionClosePacket(
300 QuicPacketNumber num) {
301 return server_maker_.MakeConnectionClosePacket(num);
302 }
303
304 std::unique_ptr<QuicEncryptedPacket> ConstructServerGoAwayPacket(
zhongyi6b5a3892016-03-12 04:46:20305 QuicPacketNumber num,
306 QuicErrorCode error_code,
307 std::string reason_phrase) {
alyssar2adf3ac2016-05-03 17:12:58308 return server_maker_.MakeGoAwayPacket(num, error_code, reason_phrase);
zhongyi6b5a3892016-03-12 04:46:20309 }
310
alyssar2adf3ac2016-05-03 17:12:58311 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
rtennetia004d332015-08-28 06:44:57312 QuicPacketNumber largest_received,
313 QuicPacketNumber least_unacked) {
alyssar2adf3ac2016-05-03 17:12:58314 return client_maker_.MakeAckPacket(2, largest_received, least_unacked,
315 least_unacked, true);
zhongyi32569c62016-01-08 02:54:30316 }
317
alyssar2adf3ac2016-05-03 17:12:58318 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckAndRstPacket(
zhongyi6b5a3892016-03-12 04:46:20319 QuicPacketNumber num,
320 QuicStreamId stream_id,
321 QuicRstStreamErrorCode error_code,
322 QuicPacketNumber largest_received,
323 QuicPacketNumber ack_least_unacked,
324 QuicPacketNumber stop_least_unacked) {
alyssar2adf3ac2016-05-03 17:12:58325 return client_maker_.MakeAckAndRstPacket(
326 num, false, stream_id, error_code, largest_received, ack_least_unacked,
327 stop_least_unacked, true);
zhongyi6b5a3892016-03-12 04:46:20328 }
329
alyssar2adf3ac2016-05-03 17:12:58330 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
zhongyi32569c62016-01-08 02:54:30331 QuicPacketNumber largest_received,
332 QuicPacketNumber least_unacked,
333 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:58334 return client_maker_.MakeAckPacket(2, largest_received, least_unacked,
335 least_unacked, true);
zhongyi32569c62016-01-08 02:54:30336 }
337
alyssar2adf3ac2016-05-03 17:12:58338 std::unique_ptr<QuicEncryptedPacket>
339 ConstructClientAckAndConnectionClosePacket(
zhongyi32569c62016-01-08 02:54:30340 QuicPacketNumber packet_number,
341 QuicPacketNumber largest_received,
342 QuicPacketNumber ack_least_unacked,
343 QuicPacketNumber stop_least_unacked) {
alyssar2adf3ac2016-05-03 17:12:58344 return client_maker_.MakeAckPacket(packet_number, largest_received,
345 ack_least_unacked, stop_least_unacked,
346 true);
[email protected]1e960032013-12-20 19:00:20347 }
[email protected]61a527782013-02-21 03:58:00348
alyssar2adf3ac2016-05-03 17:12:58349 std::unique_ptr<QuicEncryptedPacket>
350 ConstructClientAckAndConnectionClosePacket(
zhongyica364fbb2015-12-12 03:39:12351 QuicPacketNumber num,
352 QuicTime::Delta delta_time_largest_observed,
353 QuicPacketNumber largest_received,
354 QuicPacketNumber least_unacked,
355 QuicErrorCode quic_error,
bnc912a04b2016-04-20 14:19:50356 const std::string& quic_error_details) {
alyssar2adf3ac2016-05-03 17:12:58357 return client_maker_.MakeAckAndConnectionClosePacket(
zhongyica364fbb2015-12-12 03:39:12358 num, false, delta_time_largest_observed, largest_received,
359 least_unacked, quic_error, quic_error_details);
360 }
361
alyssar2adf3ac2016-05-03 17:12:58362 std::unique_ptr<QuicEncryptedPacket> ConstructServerRstPacket(
zhongyica364fbb2015-12-12 03:39:12363 QuicPacketNumber num,
364 bool include_version,
365 QuicStreamId stream_id,
366 QuicRstStreamErrorCode error_code) {
alyssar2adf3ac2016-05-03 17:12:58367 return server_maker_.MakeRstPacket(num, include_version, stream_id,
368 error_code);
zhongyica364fbb2015-12-12 03:39:12369 }
370
zhongyi32569c62016-01-08 02:54:30371 // Uses default QuicTestPacketMaker.
[email protected]1e960032013-12-20 19:00:20372 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
373 const std::string& scheme,
374 const std::string& path) {
alyssar2adf3ac2016-05-03 17:12:58375 return GetRequestHeaders(method, scheme, path, &client_maker_);
zhongyi32569c62016-01-08 02:54:30376 }
377
378 // Uses customized QuicTestPacketMaker.
379 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
380 const std::string& scheme,
381 const std::string& path,
bnc912a04b2016-04-20 14:19:50382 QuicTestPacketMaker* maker) {
383 return maker->GetRequestHeaders(method, scheme, path);
[email protected]61a527782013-02-21 03:58:00384 }
385
[email protected]1e960032013-12-20 19:00:20386 SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
alyssar2adf3ac2016-05-03 17:12:58387 return server_maker_.GetResponseHeaders(status);
[email protected]61a527782013-02-21 03:58:00388 }
389
zhongyi32569c62016-01-08 02:54:30390 // Appends alt_svc headers in the response headers.
391 SpdyHeaderBlock GetResponseHeaders(const std::string& status,
392 const std::string& alt_svc) {
alyssar2adf3ac2016-05-03 17:12:58393 return server_maker_.GetResponseHeaders(status, alt_svc);
zhongyi32569c62016-01-08 02:54:30394 }
395
alyssar2adf3ac2016-05-03 17:12:58396 std::unique_ptr<QuicEncryptedPacket> ConstructServerDataPacket(
rtennetia004d332015-08-28 06:44:57397 QuicPacketNumber packet_number,
[email protected]98b20ce2013-05-10 05:55:26398 QuicStreamId stream_id,
[email protected]e8ff26842013-03-22 21:02:05399 bool should_include_version,
[email protected]61a527782013-02-21 03:58:00400 bool fin,
401 QuicStreamOffset offset,
402 base::StringPiece data) {
alyssar2adf3ac2016-05-03 17:12:58403 return server_maker_.MakeDataPacket(
404 packet_number, stream_id, should_include_version, fin, offset, data);
[email protected]61a527782013-02-21 03:58:00405 }
406
alyssar2adf3ac2016-05-03 17:12:58407 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
rtennetia004d332015-08-28 06:44:57408 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20409 QuicStreamId stream_id,
410 bool should_include_version,
411 bool fin,
zhongyi32569c62016-01-08 02:54:30412 const SpdyHeaderBlock& headers,
413 QuicStreamOffset* offset) {
ianswett0888cff2015-11-24 17:42:16414 SpdyPriority priority =
rtennetif4bdb542015-01-21 14:33:05415 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
alyssar2adf3ac2016-05-03 17:12:58416 return client_maker_.MakeRequestHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30417 packet_number, stream_id, should_include_version, fin, priority,
418 headers, offset);
419 }
420
alyssar2adf3ac2016-05-03 17:12:58421 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30422 QuicPacketNumber packet_number,
423 QuicStreamId stream_id,
424 bool should_include_version,
425 bool fin,
426 const SpdyHeaderBlock& headers,
427 QuicStreamOffset* offset,
428 QuicTestPacketMaker* maker) {
429 SpdyPriority priority =
430 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
alyssar2adf3ac2016-05-03 17:12:58431 return client_maker_.MakeRequestHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30432 packet_number, stream_id, should_include_version, fin, priority,
433 headers, offset);
434 }
435
alyssar2adf3ac2016-05-03 17:12:58436 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30437 QuicPacketNumber packet_number,
438 QuicStreamId stream_id,
439 bool should_include_version,
440 bool fin,
441 const SpdyHeaderBlock& headers) {
alyssar2adf3ac2016-05-03 17:12:58442 return ConstructClientRequestHeadersPacket(
443 packet_number, stream_id, should_include_version, fin, headers, nullptr,
444 &client_maker_);
zhongyi32569c62016-01-08 02:54:30445 }
alyssar2adf3ac2016-05-03 17:12:58446 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30447 QuicPacketNumber packet_number,
448 QuicStreamId stream_id,
449 bool should_include_version,
450 bool fin,
451 const SpdyHeaderBlock& headers,
452 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:58453 return ConstructClientRequestHeadersPacket(packet_number, stream_id,
454 should_include_version, fin,
455 headers, nullptr, maker);
[email protected]61a527782013-02-21 03:58:00456 }
457
alyssar2adf3ac2016-05-03 17:12:58458 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
rtennetia004d332015-08-28 06:44:57459 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20460 QuicStreamId stream_id,
461 bool should_include_version,
462 bool fin,
463 const SpdyHeaderBlock& headers) {
alyssar2adf3ac2016-05-03 17:12:58464 return ConstructServerResponseHeadersPacket(
465 packet_number, stream_id, should_include_version, fin, headers, nullptr,
466 &server_maker_);
zhongyi32569c62016-01-08 02:54:30467 }
468
alyssar2adf3ac2016-05-03 17:12:58469 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30470 QuicPacketNumber packet_number,
471 QuicStreamId stream_id,
472 bool should_include_version,
473 bool fin,
474 const SpdyHeaderBlock& headers,
475 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:58476 return ConstructServerResponseHeadersPacket(packet_number, stream_id,
477 should_include_version, fin,
478 headers, nullptr, maker);
zhongyi32569c62016-01-08 02:54:30479 }
480
alyssar2adf3ac2016-05-03 17:12:58481 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30482 QuicPacketNumber packet_number,
483 QuicStreamId stream_id,
484 bool should_include_version,
485 bool fin,
486 const SpdyHeaderBlock& headers,
487 QuicStreamOffset* offset) {
alyssar2adf3ac2016-05-03 17:12:58488 return server_maker_.MakeResponseHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30489 packet_number, stream_id, should_include_version, fin, headers, offset);
490 }
491
alyssar2adf3ac2016-05-03 17:12:58492 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30493 QuicPacketNumber packet_number,
494 QuicStreamId stream_id,
495 bool should_include_version,
496 bool fin,
497 const SpdyHeaderBlock& headers,
498 QuicStreamOffset* offset,
499 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:58500 return server_maker_.MakeResponseHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30501 packet_number, stream_id, should_include_version, fin, headers, offset);
[email protected]61a527782013-02-21 03:58:00502 }
503
bnc912a04b2016-04-20 14:19:50504 void CreateSession() {
[email protected]4dca587c2013-03-07 16:54:47505 params_.enable_quic = true;
506 params_.quic_clock = clock_;
507 params_.quic_random = &random_generator_;
bnc912a04b2016-04-20 14:19:50508 params_.client_socket_factory = &socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05509 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43510 params_.host_resolver = &host_resolver_;
511 params_.cert_verifier = &cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11512 params_.transport_security_state = &transport_security_state_;
rtenneti052774e2015-11-24 21:00:12513 params_.cert_transparency_verifier = cert_transparency_verifier_.get();
tbansalfdf5665b2015-09-21 22:46:40514 params_.socket_performance_watcher_factory =
tbansal0f56a39a2016-04-07 22:03:38515 &test_socket_performance_watcher_factory_;
[email protected]1c04f9522013-02-21 20:32:43516 params_.proxy_service = proxy_service_.get();
517 params_.ssl_config_service = ssl_config_service_.get();
518 params_.http_auth_handler_factory = auth_handler_factory_.get();
bnc525e175a2016-06-20 12:36:40519 params_.http_server_properties = &http_server_properties_;
[email protected]1e960032013-12-20 19:00:20520 params_.quic_supported_versions = SupportedVersions(GetParam());
rch74da0e1a2016-01-14 02:49:32521 for (const char* host :
rch9ae5b3b2016-02-11 00:36:29522 {kDefaultServerHostName, "www.example.org", "news.example.org",
523 "bar.example.org", "foo.example.org", "invalid.example.org",
524 "mail.example.com"}) {
rch74da0e1a2016-01-14 02:49:32525 params_.quic_host_whitelist.insert(host);
526 }
[email protected]61a527782013-02-21 03:58:00527
mmenkee65e7af2015-10-13 17:16:42528 session_.reset(new HttpNetworkSession(params_));
[email protected]11c05872013-08-20 02:04:12529 session_->quic_stream_factory()->set_require_confirmation(false);
rch185ebee2015-07-14 23:56:22530 ASSERT_EQ(params_.quic_socket_receive_buffer_size,
531 session_->quic_stream_factory()->socket_receive_buffer_size());
[email protected]61a527782013-02-21 03:58:00532 }
533
danakjad1777e2016-04-16 00:56:42534 void CheckWasQuicResponse(
535 const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19536 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42537 ASSERT_TRUE(response != nullptr);
538 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19539 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
540 EXPECT_TRUE(response->was_fetched_via_spdy);
541 EXPECT_TRUE(response->was_npn_negotiated);
542 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
543 response->connection_info);
544 }
545
danakjad1777e2016-04-16 00:56:42546 void CheckResponsePort(const std::unique_ptr<HttpNetworkTransaction>& trans,
Avi Drissman13fc8932015-12-20 04:40:46547 uint16_t port) {
bnc62a44f022015-04-02 15:59:41548 const HttpResponseInfo* response = trans->GetResponseInfo();
549 ASSERT_TRUE(response != nullptr);
550 EXPECT_EQ(port, response->socket_address.port());
551 }
552
danakjad1777e2016-04-16 00:56:42553 void CheckWasHttpResponse(
554 const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19555 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42556 ASSERT_TRUE(response != nullptr);
557 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19558 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
559 EXPECT_FALSE(response->was_fetched_via_spdy);
560 EXPECT_FALSE(response->was_npn_negotiated);
561 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1,
562 response->connection_info);
563 }
564
danakjad1777e2016-04-16 00:56:42565 void CheckResponseData(const std::unique_ptr<HttpNetworkTransaction>& trans,
[email protected]aa9b14d2013-05-10 23:45:19566 const std::string& expected) {
567 std::string response_data;
bncffc2fdf2015-05-14 18:29:49568 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
[email protected]aa9b14d2013-05-10 23:45:19569 EXPECT_EQ(expected, response_data);
570 }
571
danakjad1777e2016-04-16 00:56:42572 void RunTransaction(const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19573 TestCompletionCallback callback;
574 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
575 EXPECT_EQ(ERR_IO_PENDING, rv);
576 EXPECT_EQ(OK, callback.WaitForResult());
577 }
578
579 void SendRequestAndExpectHttpResponse(const std::string& expected) {
danakjad1777e2016-04-16 00:56:42580 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50581 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
bncffc2fdf2015-05-14 18:29:49582 RunTransaction(trans);
[email protected]aa9b14d2013-05-10 23:45:19583 CheckWasHttpResponse(trans);
bncffc2fdf2015-05-14 18:29:49584 CheckResponseData(trans, expected);
[email protected]aa9b14d2013-05-10 23:45:19585 }
586
587 void SendRequestAndExpectQuicResponse(const std::string& expected) {
rchf114d982015-10-21 01:34:56588 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, 443);
tbansal7cec3812015-02-05 21:25:12589 }
590
bnc62a44f022015-04-02 15:59:41591 void SendRequestAndExpectQuicResponseFromProxyOnPort(
592 const std::string& expected,
Avi Drissman13fc8932015-12-20 04:40:46593 uint16_t port) {
bnc62a44f022015-04-02 15:59:41594 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port);
[email protected]aa9b14d2013-05-10 23:45:19595 }
596
597 void AddQuicAlternateProtocolMapping(
598 MockCryptoClientStream::HandshakeMode handshake_mode) {
599 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
zhongyi3d4a55e72016-04-22 20:36:46600 url::SchemeHostPort server(request_.url);
601 AlternativeService alternative_service(QUIC, server.host(), 443);
bnc7dc7e1b42015-07-28 14:43:12602 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
zhongyi3d4a55e72016-04-22 20:36:46603 http_server_properties_.SetAlternativeService(server, alternative_service,
604 expiration);
[email protected]aa9b14d2013-05-10 23:45:19605 }
606
rchbe69cb902016-02-11 01:10:48607 void AddQuicRemoteAlternativeServiceMapping(
608 MockCryptoClientStream::HandshakeMode handshake_mode,
609 const HostPortPair& alternative) {
610 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
zhongyi3d4a55e72016-04-22 20:36:46611 url::SchemeHostPort server(request_.url);
rchbe69cb902016-02-11 01:10:48612 AlternativeService alternative_service(QUIC, alternative.host(),
613 alternative.port());
614 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
zhongyi3d4a55e72016-04-22 20:36:46615 http_server_properties_.SetAlternativeService(server, alternative_service,
616 expiration);
rchbe69cb902016-02-11 01:10:48617 }
618
[email protected]aa9b14d2013-05-10 23:45:19619 void ExpectBrokenAlternateProtocolMapping() {
zhongyi3d4a55e72016-04-22 20:36:46620 const url::SchemeHostPort server(request_.url);
bncd9b132e2015-07-08 05:16:10621 const AlternativeServiceVector alternative_service_vector =
zhongyi3d4a55e72016-04-22 20:36:46622 http_server_properties_.GetAlternativeServices(server);
bncd9b132e2015-07-08 05:16:10623 EXPECT_EQ(1u, alternative_service_vector.size());
bnc6be245c12015-05-15 11:24:07624 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken(
bncd9b132e2015-07-08 05:16:10625 alternative_service_vector[0]));
[email protected]aa9b14d2013-05-10 23:45:19626 }
627
[email protected]4d590c9c2014-05-02 05:14:33628 void ExpectQuicAlternateProtocolMapping() {
zhongyi3d4a55e72016-04-22 20:36:46629 const url::SchemeHostPort server(request_.url);
bncd9b132e2015-07-08 05:16:10630 const AlternativeServiceVector alternative_service_vector =
zhongyi3d4a55e72016-04-22 20:36:46631 http_server_properties_.GetAlternativeServices(server);
bncd9b132e2015-07-08 05:16:10632 EXPECT_EQ(1u, alternative_service_vector.size());
633 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
[email protected]4d590c9c2014-05-02 05:14:33634 }
635
[email protected]aa9b14d2013-05-10 23:45:19636 void AddHangingNonAlternateProtocolSocketData() {
danakjad1777e2016-04-16 00:56:42637 std::unique_ptr<StaticSocketDataProvider> hanging_data;
zhongyi32569c62016-01-08 02:54:30638 hanging_data.reset(new StaticSocketDataProvider());
[email protected]dda75ab2013-06-22 22:43:30639 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
zhongyi32569c62016-01-08 02:54:30640 hanging_data->set_connect_data(hanging_connect);
641 hanging_data_.push_back(std::move(hanging_data));
642 socket_factory_.AddSocketDataProvider(hanging_data_.back().get());
rchf114d982015-10-21 01:34:56643 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]aa9b14d2013-05-10 23:45:19644 }
645
rtenneti4b06ae72014-08-26 03:43:43646 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
alyssar2adf3ac2016-05-03 17:12:58647 QuicTestPacketMaker client_maker_;
648 QuicTestPacketMaker server_maker_;
danakjad1777e2016-04-16 00:56:42649 std::unique_ptr<HttpNetworkSession> session_;
[email protected]61a527782013-02-21 03:58:00650 MockClientSocketFactory socket_factory_;
rchf114d982015-10-21 01:34:56651 ProofVerifyDetailsChromium verify_details_;
[email protected]e8ff26842013-03-22 21:02:05652 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43653 MockHostResolver host_resolver_;
654 MockCertVerifier cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11655 TransportSecurityState transport_security_state_;
danakjad1777e2016-04-16 00:56:42656 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
tbansal0f56a39a2016-04-07 22:03:38657 TestSocketPerformanceWatcherFactory test_socket_performance_watcher_factory_;
[email protected]1c04f9522013-02-21 20:32:43658 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
danakjad1777e2016-04-16 00:56:42659 std::unique_ptr<ProxyService> proxy_service_;
660 std::unique_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
[email protected]61a527782013-02-21 03:58:00661 MockRandom random_generator_;
bnc6be245c12015-05-15 11:24:07662 HttpServerPropertiesImpl http_server_properties_;
[email protected]61a527782013-02-21 03:58:00663 HttpNetworkSession::Params params_;
[email protected]aa9b14d2013-05-10 23:45:19664 HttpRequestInfo request_;
vishal.b62985ca92015-04-17 08:45:51665 BoundTestNetLog net_log_;
danakjad1777e2016-04-16 00:56:42666 std::vector<std::unique_ptr<StaticSocketDataProvider>> hanging_data_;
rchf114d982015-10-21 01:34:56667 SSLSocketDataProvider ssl_data_;
tbansal7cec3812015-02-05 21:25:12668
669 private:
670 void SendRequestAndExpectQuicResponseMaybeFromProxy(
671 const std::string& expected,
bnc62a44f022015-04-02 15:59:41672 bool used_proxy,
Avi Drissman13fc8932015-12-20 04:40:46673 uint16_t port) {
danakjad1777e2016-04-16 00:56:42674 std::unique_ptr<HttpNetworkTransaction> trans(
tbansal7cec3812015-02-05 21:25:12675 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
ryansturm49a8cb12016-06-15 16:51:09676 HeadersHandler headers_handler;
677 trans->SetBeforeHeadersSentCallback(
678 base::Bind(&HeadersHandler::OnBeforeHeadersSent,
679 base::Unretained(&headers_handler)));
bncffc2fdf2015-05-14 18:29:49680 RunTransaction(trans);
tbansal7cec3812015-02-05 21:25:12681 CheckWasQuicResponse(trans);
bnc62a44f022015-04-02 15:59:41682 CheckResponsePort(trans, port);
bncffc2fdf2015-05-14 18:29:49683 CheckResponseData(trans, expected);
ryansturm49a8cb12016-06-15 16:51:09684 EXPECT_EQ(used_proxy, headers_handler.was_proxied());
tbansal7cec3812015-02-05 21:25:12685 }
[email protected]61a527782013-02-21 03:58:00686};
687
rjshaded5ced072015-12-18 19:26:02688INSTANTIATE_TEST_CASE_P(Version,
689 QuicNetworkTransactionTest,
[email protected]1e960032013-12-20 19:00:20690 ::testing::ValuesIn(QuicSupportedVersions()));
691
692TEST_P(QuicNetworkTransactionTest, ForceQuic) {
rtenneti8a2f4632016-03-21 20:26:57693 params_.origins_to_force_quic_on.insert(
694 HostPortPair::FromString("mail.example.org:443"));
[email protected]4dca587c2013-03-07 16:54:47695
[email protected]1e960032013-12-20 19:00:20696 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58697 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
698 1, kClientDataStreamId1, true, true,
699 GetRequestHeaders("GET", "https", "/")));
700 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:02701 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58702 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
703 false, true, 0, "hello!"));
704 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:59705 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
[email protected]4dca587c2013-03-07 16:54:47706
rcha5399e02015-04-21 19:32:04707 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4dca587c2013-03-07 16:54:47708
rtennetib8e80fb2016-05-16 00:12:09709 // The non-alternate protocol job needs to hang in order to guarantee that
710 // the alternate-protocol job will "win".
711 AddHangingNonAlternateProtocolSocketData();
712
rch3f4b8452016-02-23 16:59:32713 params_.enable_alternative_service_with_different_host = false;
[email protected]4dca587c2013-03-07 16:54:47714 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47715
tbansal0f56a39a2016-04-07 22:03:38716 EXPECT_FALSE(
717 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]aa9b14d2013-05-10 23:45:19718 SendRequestAndExpectQuicResponse("hello!");
tbansal0f56a39a2016-04-07 22:03:38719 EXPECT_TRUE(
720 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]4dca587c2013-03-07 16:54:47721
[email protected]98b20ce2013-05-10 05:55:26722 // Check that the NetLog was filled reasonably.
mmenke43758e62015-05-04 21:09:46723 TestNetLogEntry::List entries;
[email protected]aa9b14d2013-05-10 23:45:19724 net_log_.GetEntries(&entries);
[email protected]98b20ce2013-05-10 05:55:26725 EXPECT_LT(0u, entries.size());
726
727 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29728 int pos = ExpectLogContainsSomewhere(
729 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
730 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26731 EXPECT_LT(0, pos);
732
rchfd527212015-08-25 00:41:26733 // ... and also a TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29734 pos = ExpectLogContainsSomewhere(
rchfd527212015-08-25 00:41:26735 entries, 0,
736 NetLog::TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED,
ttuttle859dc7a2015-04-23 19:42:29737 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26738 EXPECT_LT(0, pos);
739
rtennetia004d332015-08-28 06:44:57740 std::string packet_number;
741 ASSERT_TRUE(entries[pos].GetStringValue("packet_number", &packet_number));
742 EXPECT_EQ("1", packet_number);
[email protected]98b20ce2013-05-10 05:55:26743
rchfd527212015-08-25 00:41:26744 // ... and also a TYPE_QUIC_SESSION_PACKET_AUTHENTICATED.
745 pos = ExpectLogContainsSomewhere(
746 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_AUTHENTICATED,
747 NetLog::PHASE_NONE);
748 EXPECT_LT(0, pos);
749
[email protected]98b20ce2013-05-10 05:55:26750 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29751 pos = ExpectLogContainsSomewhere(
752 entries, 0, NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
753 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26754 EXPECT_LT(0, pos);
755
756 int log_stream_id;
757 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
[email protected]1e960032013-12-20 19:00:20758 EXPECT_EQ(3, log_stream_id);
[email protected]4dca587c2013-03-07 16:54:47759}
760
[email protected]cf3e3cd62014-02-05 16:16:16761TEST_P(QuicNetworkTransactionTest, QuicProxy) {
tbansal9bf26672016-05-11 18:32:45762 params_.enable_quic = true;
rchf114d982015-10-21 01:34:56763 proxy_service_ =
rch9ae5b3b2016-02-11 00:36:29764 ProxyService::CreateFixedFromPacResult("QUIC mail.example.org:70");
[email protected]cf3e3cd62014-02-05 16:16:16765
[email protected]cf3e3cd62014-02-05 16:16:16766 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58767 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
768 1, kClientDataStreamId1, true, true,
769 GetRequestHeaders("GET", "http", "/")));
770 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:02771 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58772 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
773 false, true, 0, "hello!"));
774 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50775 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59776 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]cf3e3cd62014-02-05 16:16:16777
rcha5399e02015-04-21 19:32:04778 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cf3e3cd62014-02-05 16:16:16779
tbansal0f56a39a2016-04-07 22:03:38780 EXPECT_FALSE(
781 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16782 // There is no need to set up an alternate protocol job, because
783 // no attempt will be made to speak to the proxy over TCP.
784
rch9ae5b3b2016-02-11 00:36:29785 request_.url = GURL("http://mail.example.org/");
rch3f4b8452016-02-23 16:59:32786 params_.enable_alternative_service_with_different_host = false;
[email protected]cf3e3cd62014-02-05 16:16:16787 CreateSession();
788
bnc62a44f022015-04-02 15:59:41789 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
tbansal0f56a39a2016-04-07 22:03:38790 EXPECT_TRUE(
791 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16792}
793
bnc313ba9c2015-06-11 15:42:31794// Regression test for https://crbug.com/492458. Test that for an HTTP
795// connection through a QUIC proxy, the certificate exhibited by the proxy is
796// checked against the proxy hostname, not the origin hostname.
797TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) {
rch9ae5b3b2016-02-11 00:36:29798 const std::string origin_host = "mail.example.com";
bnc313ba9c2015-06-11 15:42:31799 const std::string proxy_host = "www.example.org";
800
tbansal9bf26672016-05-11 18:32:45801 params_.enable_quic = true;
rdsmith82957ad2015-09-16 19:42:03802 proxy_service_ =
803 ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70");
bnc313ba9c2015-06-11 15:42:31804
alyssar2adf3ac2016-05-03 17:12:58805 client_maker_.set_hostname(origin_host);
bnc313ba9c2015-06-11 15:42:31806 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58807 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
808 1, kClientDataStreamId1, true, true,
809 GetRequestHeaders("GET", "http", "/")));
810 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc313ba9c2015-06-11 15:42:31811 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58812 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
813 false, true, 0, "hello!"));
814 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50815 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59816 mock_quic_data.AddRead(ASYNC, 0);
bnc313ba9c2015-06-11 15:42:31817 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
818
819 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29820 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bnc313ba9c2015-06-11 15:42:31821 ASSERT_TRUE(cert.get());
822 // This certificate is valid for the proxy, but not for the origin.
823 bool common_name_fallback_used;
824 EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used));
825 EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used));
826 ProofVerifyDetailsChromium verify_details;
827 verify_details.cert_verify_result.verified_cert = cert;
828 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rchf114d982015-10-21 01:34:56829 ProofVerifyDetailsChromium verify_details2;
830 verify_details2.cert_verify_result.verified_cert = cert;
831 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
bnc313ba9c2015-06-11 15:42:31832
833 request_.url = GURL("http://" + origin_host);
rtennetib8e80fb2016-05-16 00:12:09834 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32835 CreateSession();
bnc313ba9c2015-06-11 15:42:31836 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
837 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
838}
839
rchbe69cb902016-02-11 01:10:48840TEST_P(QuicNetworkTransactionTest, AlternativeServicesDifferentHost) {
841 params_.enable_alternative_service_with_different_host = true;
842 HostPortPair origin("www.example.org", 443);
843 HostPortPair alternative("mail.example.org", 443);
844
845 base::FilePath certs_dir = GetTestCertsDirectory();
846 scoped_refptr<X509Certificate> cert(
847 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
848 ASSERT_TRUE(cert.get());
849 // TODO(rch): the connection should be "to" the origin, so if the cert is
850 // valid for the origin but not the alternative, that should work too.
851 bool common_name_fallback_used;
852 EXPECT_TRUE(cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
853 EXPECT_TRUE(
854 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
855 ProofVerifyDetailsChromium verify_details;
856 verify_details.cert_verify_result.verified_cert = cert;
857 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
858
alyssar2adf3ac2016-05-03 17:12:58859 client_maker_.set_hostname(origin.host());
rchbe69cb902016-02-11 01:10:48860 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58861 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
862 1, kClientDataStreamId1, true, true,
863 GetRequestHeaders("GET", "https", "/")));
864 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rchbe69cb902016-02-11 01:10:48865 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58866 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
867 false, true, 0, "hello!"));
868 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchbe69cb902016-02-11 01:10:48869 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
870 mock_quic_data.AddRead(ASYNC, 0);
871 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
872
873 request_.url = GURL("https://" + origin.host());
874 AddQuicRemoteAlternativeServiceMapping(
875 MockCryptoClientStream::CONFIRM_HANDSHAKE, alternative);
rtennetib8e80fb2016-05-16 00:12:09876 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32877 CreateSession();
rchbe69cb902016-02-11 01:10:48878
879 SendRequestAndExpectQuicResponse("hello!");
880}
881
[email protected]1e960032013-12-20 19:00:20882TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
rtenneti8a2f4632016-03-21 20:26:57883 params_.origins_to_force_quic_on.insert(
884 HostPortPair::FromString("mail.example.org:443"));
[email protected]cebe3282013-05-22 23:49:30885
tbansalfdf5665b2015-09-21 22:46:40886 MockQuicData mock_quic_data1;
887 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
[email protected]1e960032013-12-20 19:00:20888
tbansalfdf5665b2015-09-21 22:46:40889 MockQuicData mock_quic_data2;
zhongyi32569c62016-01-08 02:54:30890 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40891 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
rch6faa4d42016-01-05 20:48:43892 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40893
894 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
895 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
[email protected]cebe3282013-05-22 23:49:30896
rch3f4b8452016-02-23 16:59:32897 params_.enable_alternative_service_with_different_host = false;
[email protected]cebe3282013-05-22 23:49:30898 CreateSession();
899
tbansal0f56a39a2016-04-07 22:03:38900 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40901 for (size_t i = 0; i < 2; ++i) {
danakjad1777e2016-04-16 00:56:42902 std::unique_ptr<HttpNetworkTransaction> trans(
tbansalfdf5665b2015-09-21 22:46:40903 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
904 TestCompletionCallback callback;
905 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
906 EXPECT_EQ(ERR_IO_PENDING, rv);
907 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
tbansal0f56a39a2016-04-07 22:03:38908 EXPECT_EQ(1 + i, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40909 }
[email protected]cebe3282013-05-22 23:49:30910}
911
tbansalc8a94ea2015-11-02 23:58:51912TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
913 // Attempt to "force" quic on 443, which will not be honored.
rtenneti8a2f4632016-03-21 20:26:57914 params_.origins_to_force_quic_on.insert(
915 HostPortPair::FromString("www.google.com:443"));
tbansalc8a94ea2015-11-02 23:58:51916
917 MockRead http_reads[] = {
918 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
919 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
920 MockRead(ASYNC, OK)};
921
922 StaticSocketDataProvider data(http_reads, arraysize(http_reads), nullptr, 0);
923 socket_factory_.AddSocketDataProvider(&data);
924 SSLSocketDataProvider ssl(ASYNC, OK);
925 socket_factory_.AddSSLSocketDataProvider(&ssl);
926
rch3f4b8452016-02-23 16:59:32927 params_.enable_alternative_service_with_different_host = false;
tbansalc8a94ea2015-11-02 23:58:51928 CreateSession();
929
930 SendRequestAndExpectHttpResponse("hello world");
tbansal0f56a39a2016-04-07 22:03:38931 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalc8a94ea2015-11-02 23:58:51932}
933
bncc958faa2015-07-31 18:14:52934TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52935 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56936 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
937 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52938 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
939 MockRead(ASYNC, OK)};
940
941 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
942 0);
943 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56944 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52945
946 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58947 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
948 1, kClientDataStreamId1, true, true,
949 GetRequestHeaders("GET", "https", "/")));
950 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:52951 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58952 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
953 false, true, 0, "hello!"));
954 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:52955 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59956 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52957
958 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
959
rtennetib8e80fb2016-05-16 00:12:09960 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32961 CreateSession();
bncc958faa2015-07-31 18:14:52962
963 SendRequestAndExpectHttpResponse("hello world");
964 SendRequestAndExpectQuicResponse("hello!");
965}
966
rchf47265dc2016-03-21 21:33:12967TEST_P(QuicNetworkTransactionTest,
968 UseAlternativeServiceWithProbabilityForQuic) {
969 MockRead http_reads[] = {
970 MockRead("HTTP/1.1 200 OK\r\n"),
971 MockRead(kQuicAlternativeServiceWithProbabilityHeader),
972 MockRead("hello world"),
973 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
974 MockRead(ASYNC, OK)};
975
976 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
977 0);
978 socket_factory_.AddSocketDataProvider(&http_data);
979 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
980
981 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58982 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
983 1, kClientDataStreamId1, true, true,
984 GetRequestHeaders("GET", "https", "/")));
985 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rchf47265dc2016-03-21 21:33:12986 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58987 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
988 false, true, 0, "hello!"));
989 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchf47265dc2016-03-21 21:33:12990 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
991 mock_quic_data.AddRead(ASYNC, 0); // EOF
992
993 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
994
rtennetib8e80fb2016-05-16 00:12:09995 AddHangingNonAlternateProtocolSocketData();
rchf47265dc2016-03-21 21:33:12996 CreateSession();
997
998 SendRequestAndExpectHttpResponse("hello world");
999 SendRequestAndExpectQuicResponse("hello!");
1000}
1001
zhongyi3d4a55e72016-04-22 20:36:461002TEST_P(QuicNetworkTransactionTest, SetAlternativeServiceWithScheme) {
1003 MockRead http_reads[] = {
1004 MockRead("HTTP/1.1 200 OK\r\n"),
1005 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
1006 MockRead("hello world"),
1007 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1008 MockRead(ASYNC, OK)};
1009
1010 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1011 0);
1012
1013 socket_factory_.AddSocketDataProvider(&http_data);
1014 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1015
1016 CreateSession();
1017 // Send http request, ignore alternative service advertising if response
1018 // header advertises alternative service for mail.example.org.
1019 request_.url = GURL("http://mail.example.org:443");
1020 SendRequestAndExpectHttpResponse("hello world");
bnc525e175a2016-06-20 12:36:401021 HttpServerProperties* http_server_properties =
zhongyi3d4a55e72016-04-22 20:36:461022 session_->http_server_properties();
1023 url::SchemeHostPort http_server("http", "mail.example.org", 443);
1024 url::SchemeHostPort https_server("https", "mail.example.org", 443);
1025 // Check alternative service is set for the correct origin.
1026 EXPECT_EQ(2u,
1027 http_server_properties->GetAlternativeServices(http_server).size());
1028 EXPECT_EQ(
1029 0u, http_server_properties->GetAlternativeServices(https_server).size());
1030}
1031
1032TEST_P(QuicNetworkTransactionTest, DoNotGetAltSvcForDifferentOrigin) {
1033 MockRead http_reads[] = {
1034 MockRead("HTTP/1.1 200 OK\r\n"),
1035 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
1036 MockRead("hello world"),
1037 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1038 MockRead(ASYNC, OK)};
1039
1040 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1041 0);
1042
1043 socket_factory_.AddSocketDataProvider(&http_data);
1044 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1045 socket_factory_.AddSocketDataProvider(&http_data);
1046 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1047
1048 CreateSession();
1049
1050 // Send https request and set alternative services if response header
1051 // advertises alternative service for mail.example.org.
1052 SendRequestAndExpectHttpResponse("hello world");
bnc525e175a2016-06-20 12:36:401053 HttpServerProperties* http_server_properties =
zhongyi3d4a55e72016-04-22 20:36:461054 session_->http_server_properties();
1055
1056 const url::SchemeHostPort https_server(request_.url);
1057 // Check alternative service is set.
1058 AlternativeServiceVector alternative_service_vector =
1059 http_server_properties->GetAlternativeServices(https_server);
1060 EXPECT_EQ(2u, alternative_service_vector.size());
1061
1062 // Send http request to the same origin but with diffrent scheme, should not
1063 // use QUIC.
1064 request_.url = GURL("http://mail.example.org:443");
1065 SendRequestAndExpectHttpResponse("hello world");
1066}
1067
bnc8be55ebb2015-10-30 14:12:071068TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) {
1069 std::string altsvc_header = base::StringPrintf(
1070 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam());
1071 MockRead http_reads[] = {
1072 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1073 MockRead("hello world"),
1074 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1075 MockRead(ASYNC, OK)};
1076
1077 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1078 0);
1079 socket_factory_.AddSocketDataProvider(&http_data);
1080 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1081
1082 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581083 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1084 1, kClientDataStreamId1, true, true,
1085 GetRequestHeaders("GET", "https", "/")));
1086 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc8be55ebb2015-10-30 14:12:071087 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581088 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1089 false, true, 0, "hello!"));
1090 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bnc8be55ebb2015-10-30 14:12:071091 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591092 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc8be55ebb2015-10-30 14:12:071093
1094 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1095
rtennetib8e80fb2016-05-16 00:12:091096 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321097 CreateSession();
bnc8be55ebb2015-10-30 14:12:071098
1099 SendRequestAndExpectHttpResponse("hello world");
1100 SendRequestAndExpectQuicResponse("hello!");
1101}
1102
zhongyi6b5a3892016-03-12 04:46:201103TEST_P(QuicNetworkTransactionTest, GoAwayWithConnectionMigrationOnPortsOnly) {
1104 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581105 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1106 1, kClientDataStreamId1, true, true,
1107 GetRequestHeaders("GET", "https", "/")));
1108 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi6b5a3892016-03-12 04:46:201109 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1110 // Read a GoAway packet with
1111 // QuicErrorCode: QUIC_ERROR_MIGRATING_PORT from the peer.
alyssar2adf3ac2016-05-03 17:12:581112 mock_quic_data.AddRead(ConstructServerGoAwayPacket(
1113 2, QUIC_ERROR_MIGRATING_PORT,
1114 "connection migration with port change only"));
1115 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
1116 mock_quic_data.AddRead(ConstructServerDataPacket(3, kClientDataStreamId1,
1117 false, true, 0, "hello!"));
1118 mock_quic_data.AddWrite(ConstructClientAckAndRstPacket(
zhongyi6b5a3892016-03-12 04:46:201119 3, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 3, 3, 1));
1120 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1121 mock_quic_data.AddRead(ASYNC, 0); // EOF
1122
1123 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1124
1125 // The non-alternate protocol job needs to hang in order to guarantee that
1126 // the alternate-protocol job will "win".
1127 AddHangingNonAlternateProtocolSocketData();
1128
1129 // In order for a new QUIC session to be established via alternate-protocol
1130 // without racing an HTTP connection, we need the host resolution to happen
1131 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1132 // connection to the the server, in this test we require confirmation
1133 // before encrypting so the HTTP job will still start.
1134 host_resolver_.set_synchronous_mode(true);
1135 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1136 "");
1137 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1138 AddressList address;
1139 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1140 nullptr, net_log_.bound());
1141
1142 CreateSession();
1143 session_->quic_stream_factory()->set_require_confirmation(true);
1144 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1145
danakjad1777e2016-04-16 00:56:421146 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyi6b5a3892016-03-12 04:46:201147 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1148 TestCompletionCallback callback;
1149 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1150 EXPECT_EQ(ERR_IO_PENDING, rv);
1151
1152 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1153 QuicSession::HANDSHAKE_CONFIRMED);
1154 EXPECT_EQ(OK, callback.WaitForResult());
1155
1156 // Check whether this transaction is correctly marked as received a go-away
1157 // because of migrating port.
1158 NetErrorDetails details;
1159 EXPECT_FALSE(details.quic_port_migration_detected);
1160 trans->PopulateNetErrorDetails(&details);
1161 EXPECT_TRUE(details.quic_port_migration_detected);
1162}
1163
bnc8be55ebb2015-10-30 14:12:071164TEST_P(QuicNetworkTransactionTest,
1165 DoNotUseAlternativeServiceQuicUnsupportedVersion) {
1166 std::string altsvc_header = base::StringPrintf(
1167 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam() - 1);
1168 MockRead http_reads[] = {
1169 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1170 MockRead("hello world"),
1171 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1172 MockRead(ASYNC, OK)};
1173
1174 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1175 0);
1176 socket_factory_.AddSocketDataProvider(&http_data);
1177 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1178 socket_factory_.AddSocketDataProvider(&http_data);
1179 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1180
rch3f4b8452016-02-23 16:59:321181 CreateSession();
bnc8be55ebb2015-10-30 14:12:071182
1183 SendRequestAndExpectHttpResponse("hello world");
1184 SendRequestAndExpectHttpResponse("hello world");
1185}
1186
bncc958faa2015-07-31 18:14:521187// When multiple alternative services are advertised,
zhongyi32569c62016-01-08 02:54:301188// HttpStreamFactoryImpl::RequestStreamInternal() should select the alternative
1189// service which uses existing QUIC session if available. If no existing QUIC
1190// session can be used, use the first alternative service from the list.
1191TEST_P(QuicNetworkTransactionTest, UseExistingAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:521192 MockRead http_reads[] = {
1193 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291194 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
bncc958faa2015-07-31 18:14:521195 MockRead("hello world"),
1196 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1197 MockRead(ASYNC, OK)};
1198
1199 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1200 0);
1201 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561202 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521203
zhongyi32569c62016-01-08 02:54:301204 QuicStreamOffset request_header_offset = 0;
1205 QuicStreamOffset response_header_offset = 0;
1206 // First QUIC request data.
rch9ae5b3b2016-02-11 00:36:291207 // Open a session to foo.example.org:443 using the first entry of the
zhongyi32569c62016-01-08 02:54:301208 // alternative service list.
bncc958faa2015-07-31 18:14:521209 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581210 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301211 1, kClientDataStreamId1, true, true,
1212 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1213
1214 std::string alt_svc_list =
rch9ae5b3b2016-02-11 00:36:291215 "quic=\"mail.example.org:444\", quic=\"foo.example.org:443\", "
1216 "quic=\"bar.example.org:445\"";
alyssar2adf3ac2016-05-03 17:12:581217 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301218 1, kClientDataStreamId1, false, false,
1219 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581220 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1221 false, true, 0, "hello!"));
1222 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301223
1224 // Second QUIC request data.
1225 // Connection pooling, using existing session, no need to include version
1226 // as version negotiation has been completed.
alyssar2adf3ac2016-05-03 17:12:581227 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301228 3, kClientDataStreamId2, false, true,
1229 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581230 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301231 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1232 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581233 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1234 false, true, 0, "hello!"));
1235 mock_quic_data.AddWrite(
1236 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
bncc958faa2015-07-31 18:14:521237 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591238 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521239
1240 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1241
rtennetib8e80fb2016-05-16 00:12:091242 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321243 CreateSession();
bncc958faa2015-07-31 18:14:521244
1245 SendRequestAndExpectHttpResponse("hello world");
zhongyi32569c62016-01-08 02:54:301246
bnc359ed2a2016-04-29 20:43:451247 SendRequestAndExpectQuicResponse("hello!");
1248 SendRequestAndExpectQuicResponse("hello!");
zhongyi32569c62016-01-08 02:54:301249}
1250
bnc359ed2a2016-04-29 20:43:451251// Pool to existing session with matching QuicServerId
1252// even if alternative service destination is different.
1253TEST_P(QuicNetworkTransactionTest, PoolByOrigin) {
zhongyi32569c62016-01-08 02:54:301254 MockQuicData mock_quic_data;
bnc359ed2a2016-04-29 20:43:451255 QuicStreamOffset request_header_offset(0);
1256 QuicStreamOffset response_header_offset(0);
1257
1258 // First request.
alyssar2adf3ac2016-05-03 17:12:581259 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301260 1, kClientDataStreamId1, true, true,
1261 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581262 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451263 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1264 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581265 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1266 false, true, 0, "hello!"));
1267 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301268
bnc359ed2a2016-04-29 20:43:451269 // Second request.
alyssar2adf3ac2016-05-03 17:12:581270 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301271 3, kClientDataStreamId2, false, true,
1272 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581273 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301274 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1275 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581276 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1277 false, true, 0, "hello!"));
1278 mock_quic_data.AddWrite(
1279 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
zhongyi32569c62016-01-08 02:54:301280 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1281 mock_quic_data.AddRead(ASYNC, 0); // EOF
1282
1283 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bnc359ed2a2016-04-29 20:43:451284
1285 AddHangingNonAlternateProtocolSocketData();
1286 AddHangingNonAlternateProtocolSocketData();
zhongyi32569c62016-01-08 02:54:301287
rch3f4b8452016-02-23 16:59:321288 CreateSession();
zhongyi32569c62016-01-08 02:54:301289
bnc359ed2a2016-04-29 20:43:451290 const char destination1[] = "first.example.com";
1291 const char destination2[] = "second.example.com";
1292
1293 // Set up alternative service entry to destination1.
1294 url::SchemeHostPort server(request_.url);
1295 AlternativeService alternative_service(QUIC, destination1, 443);
1296 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1297 http_server_properties_.SetAlternativeService(server, alternative_service,
1298 expiration);
1299 // First request opens connection to |destination1|
1300 // with QuicServerId.host() == kDefaultServerHostName.
1301 SendRequestAndExpectQuicResponse("hello!");
1302
1303 // Set up alternative service entry to a different destination.
1304 alternative_service = AlternativeService(QUIC, destination2, 443);
1305 http_server_properties_.SetAlternativeService(server, alternative_service,
1306 expiration);
1307 // Second request pools to existing connection with same QuicServerId,
1308 // even though alternative service destination is different.
1309 SendRequestAndExpectQuicResponse("hello!");
1310}
1311
1312// Pool to existing session with matching destination and matching certificate
1313// even if origin is different, and even if the alternative service with
1314// matching destination is not the first one on the list.
1315TEST_P(QuicNetworkTransactionTest, PoolByDestination) {
1316 GURL origin1 = request_.url;
1317 GURL origin2("https://www.example.org/");
1318 ASSERT_NE(origin1.host(), origin2.host());
1319
1320 MockQuicData mock_quic_data;
1321 QuicStreamOffset request_header_offset(0);
1322 QuicStreamOffset response_header_offset(0);
1323
1324 // First request.
alyssar2adf3ac2016-05-03 17:12:581325 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:451326 1, kClientDataStreamId1, true, true,
1327 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581328 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451329 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1330 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581331 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1332 false, true, 0, "hello!"));
1333 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bnc359ed2a2016-04-29 20:43:451334
1335 // Second request.
alyssar2adf3ac2016-05-03 17:12:581336 QuicTestPacketMaker client_maker2(GetParam(), 0, clock_, origin2.host(),
1337 Perspective::IS_CLIENT);
1338 QuicTestPacketMaker server_maker2(GetParam(), 0, clock_, origin2.host(),
1339 Perspective::IS_SERVER);
1340 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:451341 3, kClientDataStreamId2, false, true,
alyssar2adf3ac2016-05-03 17:12:581342 GetRequestHeaders("GET", "https", "/", &client_maker2),
1343 &request_header_offset, &client_maker2));
1344 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451345 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
alyssar2adf3ac2016-05-03 17:12:581346 &response_header_offset, &server_maker2));
1347 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1348 false, true, 0, "hello!"));
1349 mock_quic_data.AddWrite(
1350 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
bnc359ed2a2016-04-29 20:43:451351 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1352 mock_quic_data.AddRead(ASYNC, 0); // EOF
1353
1354 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1355
1356 AddHangingNonAlternateProtocolSocketData();
1357 AddHangingNonAlternateProtocolSocketData();
1358
1359 CreateSession();
1360
1361 const char destination1[] = "first.example.com";
1362 const char destination2[] = "second.example.com";
1363
1364 // Set up alternative service for |origin1|.
1365 AlternativeService alternative_service1(QUIC, destination1, 443);
1366 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1367 http_server_properties_.SetAlternativeService(
1368 url::SchemeHostPort(origin1), alternative_service1, expiration);
1369
1370 // Set up multiple alternative service entries for |origin2|,
1371 // the first one with a different destination as for |origin1|,
1372 // the second one with the same. The second one should be used,
1373 // because the request can be pooled to that one.
1374 AlternativeService alternative_service2(QUIC, destination2, 443);
1375 AlternativeServiceInfoVector alternative_services;
1376 alternative_services.push_back(
1377 AlternativeServiceInfo(alternative_service2, expiration));
1378 alternative_services.push_back(
1379 AlternativeServiceInfo(alternative_service1, expiration));
1380 http_server_properties_.SetAlternativeServices(url::SchemeHostPort(origin2),
1381 alternative_services);
bnc359ed2a2016-04-29 20:43:451382 // First request opens connection to |destination1|
1383 // with QuicServerId.host() == origin1.host().
1384 SendRequestAndExpectQuicResponse("hello!");
1385
1386 // Second request pools to existing connection with same destination,
1387 // because certificate matches, even though QuicServerId is different.
1388 request_.url = origin2;
alyssar2adf3ac2016-05-03 17:12:581389
bnc359ed2a2016-04-29 20:43:451390 SendRequestAndExpectQuicResponse("hello!");
zhongyi32569c62016-01-08 02:54:301391}
1392
1393// Multiple origins have listed the same alternative services. When there's a
1394// existing QUIC session opened by a request to other origin,
1395// if the cert is valid, should select this QUIC session to make the request
1396// if this is also the first existing QUIC session.
1397TEST_P(QuicNetworkTransactionTest,
1398 UseSharedExistingAlternativeServiceForQuicWithValidCert) {
rch9ae5b3b2016-02-11 00:36:291399 // Default cert is valid for *.example.org
zhongyi32569c62016-01-08 02:54:301400
rch9ae5b3b2016-02-11 00:36:291401 // HTTP data for request to www.example.org.
zhongyi32569c62016-01-08 02:54:301402 MockRead http_reads[] = {
1403 MockRead("HTTP/1.1 200 OK\r\n"),
1404 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
rch9ae5b3b2016-02-11 00:36:291405 MockRead("hello world from www.example.org"),
zhongyi32569c62016-01-08 02:54:301406 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1407 MockRead(ASYNC, OK)};
1408
1409 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1410 0);
1411 socket_factory_.AddSocketDataProvider(&http_data);
1412 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1413
1414 // HTTP data for request to mail.example.org.
1415 MockRead http_reads2[] = {
1416 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291417 MockRead("Alt-Svc: quic=\":444\", quic=\"www.example.org:443\"\r\n\r\n"),
zhongyi32569c62016-01-08 02:54:301418 MockRead("hello world from mail.example.org"),
1419 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1420 MockRead(ASYNC, OK)};
1421
1422 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1423 nullptr, 0);
1424 socket_factory_.AddSocketDataProvider(&http_data2);
1425 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1426
1427 QuicStreamOffset request_header_offset = 0;
1428 QuicStreamOffset response_header_offset = 0;
1429
alyssar2adf3ac2016-05-03 17:12:581430 QuicTestPacketMaker client_maker(GetParam(), 0, clock_, "mail.example.org",
1431 Perspective::IS_CLIENT);
1432 server_maker_.set_hostname("www.example.org");
1433 client_maker_.set_hostname("www.example.org");
zhongyi32569c62016-01-08 02:54:301434 MockQuicData mock_quic_data;
1435
1436 // First QUIC request data.
alyssar2adf3ac2016-05-03 17:12:581437 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301438 1, kClientDataStreamId1, true, true,
1439 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1440
alyssar2adf3ac2016-05-03 17:12:581441 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301442 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1443 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581444 mock_quic_data.AddRead(ConstructServerDataPacket(
1445 2, kClientDataStreamId1, false, true, 0, "hello from mail QUIC!"));
1446 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301447 // Second QUIC request data.
alyssar2adf3ac2016-05-03 17:12:581448 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301449 3, kClientDataStreamId2, false, true,
alyssar2adf3ac2016-05-03 17:12:581450 GetRequestHeaders("GET", "https", "/", &client_maker),
1451 &request_header_offset, &client_maker));
1452 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301453 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1454 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581455 mock_quic_data.AddRead(ConstructServerDataPacket(
1456 4, kClientDataStreamId2, false, true, 0, "hello from mail QUIC!"));
1457 mock_quic_data.AddWrite(
1458 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
zhongyi32569c62016-01-08 02:54:301459 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1460 mock_quic_data.AddRead(ASYNC, 0); // EOF
1461
1462 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
zhongyi32569c62016-01-08 02:54:301463
rtennetib8e80fb2016-05-16 00:12:091464 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321465 CreateSession();
zhongyi32569c62016-01-08 02:54:301466
1467 // Send two HTTP requests, responses set up alt-svc lists for the origins.
rch9ae5b3b2016-02-11 00:36:291468 request_.url = GURL("https://www.example.org/");
1469 SendRequestAndExpectHttpResponse("hello world from www.example.org");
zhongyi32569c62016-01-08 02:54:301470 request_.url = GURL("https://mail.example.org/");
1471 SendRequestAndExpectHttpResponse("hello world from mail.example.org");
1472
rch9ae5b3b2016-02-11 00:36:291473 // Open a QUIC session to mail.example.org:443 when making request
1474 // to mail.example.org.
1475 request_.url = GURL("https://www.example.org/");
bnc359ed2a2016-04-29 20:43:451476 SendRequestAndExpectQuicResponse("hello from mail QUIC!");
zhongyi32569c62016-01-08 02:54:301477
rch9ae5b3b2016-02-11 00:36:291478 // Uses the existing QUIC session when making request to www.example.org.
zhongyi32569c62016-01-08 02:54:301479 request_.url = GURL("https://mail.example.org/");
bnc359ed2a2016-04-29 20:43:451480 SendRequestAndExpectQuicResponse("hello from mail QUIC!");
bncc958faa2015-07-31 18:14:521481}
1482
1483TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) {
bncc958faa2015-07-31 18:14:521484 MockRead http_reads[] = {
1485 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561486 MockRead(kQuicAlternativeServiceDifferentPortHeader),
bncc958faa2015-07-31 18:14:521487 MockRead("hello world"),
1488 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1489 MockRead(ASYNC, OK)};
1490
1491 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1492 0);
1493 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561494 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521495
rtennetib8e80fb2016-05-16 00:12:091496 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321497 CreateSession();
bncc958faa2015-07-31 18:14:521498
1499 SendRequestAndExpectHttpResponse("hello world");
bnc359ed2a2016-04-29 20:43:451500
1501 url::SchemeHostPort http_server("https", kDefaultServerHostName, 443);
1502 AlternativeServiceVector alternative_service_vector =
1503 http_server_properties_.GetAlternativeServices(http_server);
1504 ASSERT_EQ(1u, alternative_service_vector.size());
1505 const AlternativeService alternative_service = alternative_service_vector[0];
1506 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
1507 EXPECT_EQ(kDefaultServerHostName, alternative_service_vector[0].host);
1508 EXPECT_EQ(137, alternative_service_vector[0].port);
bncc958faa2015-07-31 18:14:521509}
1510
1511TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) {
bncc958faa2015-07-31 18:14:521512 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561513 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1514 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521515 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1516 MockRead(ASYNC, OK)};
1517
1518 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1519 0);
1520 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561521 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521522
1523 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581524 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1525 1, kClientDataStreamId1, true, true,
1526 GetRequestHeaders("GET", "https", "/")));
1527 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:521528 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581529 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1530 false, true, 0, "hello!"));
1531 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:521532 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1533 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521534
1535 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1536
rtennetib8e80fb2016-05-16 00:12:091537 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321538 CreateSession();
bncc958faa2015-07-31 18:14:521539
1540 AlternativeService alternative_service(QUIC,
1541 HostPortPair::FromURL(request_.url));
1542 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
1543 alternative_service);
1544 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1545 alternative_service));
1546
1547 SendRequestAndExpectHttpResponse("hello world");
1548 SendRequestAndExpectQuicResponse("hello!");
1549
mmenkee24011922015-12-17 22:12:591550 mock_quic_data.Resume();
bncc958faa2015-07-31 18:14:521551
1552 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1553 alternative_service));
1554}
1555
bncc958faa2015-07-31 18:14:521556TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) {
bncc958faa2015-07-31 18:14:521557 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561558 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1559 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521560 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1561 MockRead(ASYNC, OK)};
1562
1563 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1564 0);
1565 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561566 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521567
1568 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581569 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1570 1, kClientDataStreamId1, true, true,
1571 GetRequestHeaders("GET", "https", "/")));
1572 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:521573 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581574 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1575 false, true, 0, "hello!"));
1576 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:521577 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
1578
1579 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1580
1581 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321582 CreateSession();
bncc958faa2015-07-31 18:14:521583
1584 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1585 SendRequestAndExpectHttpResponse("hello world");
1586}
1587
bnc1c196c6e2016-05-28 13:51:481588TEST_P(QuicNetworkTransactionTest, HungAlternativeService) {
[email protected]dda75ab2013-06-22 22:43:301589 crypto_client_stream_factory_.set_handshake_mode(
1590 MockCryptoClientStream::COLD_START);
1591
1592 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561593 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
rch9ae5b3b2016-02-11 00:36:291594 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561595 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")};
[email protected]dda75ab2013-06-22 22:43:301596
1597 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561598 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
bnc1c196c6e2016-05-28 13:51:481599 MockRead(SYNCHRONOUS, 4, kQuicAlternativeServiceHeader),
rchf114d982015-10-21 01:34:561600 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]dda75ab2013-06-22 22:43:301601
mmenke651bae7f2015-12-18 21:26:451602 SequencedSocketData http_data(http_reads, arraysize(http_reads), http_writes,
1603 arraysize(http_writes));
bnc912a04b2016-04-20 14:19:501604 socket_factory_.AddSocketDataProvider(&http_data);
1605 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301606
1607 // The QUIC transaction will not be allowed to complete.
mmenke651bae7f2015-12-18 21:26:451608 MockWrite quic_writes[] = {MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 1)};
[email protected]dda75ab2013-06-22 22:43:301609 MockRead quic_reads[] = {
mmenke651bae7f2015-12-18 21:26:451610 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0),
[email protected]dda75ab2013-06-22 22:43:301611 };
mmenke651bae7f2015-12-18 21:26:451612 SequencedSocketData quic_data(quic_reads, arraysize(quic_reads), quic_writes,
1613 arraysize(quic_writes));
bnc912a04b2016-04-20 14:19:501614 socket_factory_.AddSocketDataProvider(&quic_data);
[email protected]dda75ab2013-06-22 22:43:301615
1616 // The HTTP transaction will complete.
mmenke651bae7f2015-12-18 21:26:451617 SequencedSocketData http_data2(http_reads, arraysize(http_reads), http_writes,
1618 arraysize(http_writes));
bnc912a04b2016-04-20 14:19:501619 socket_factory_.AddSocketDataProvider(&http_data2);
1620 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301621
bnc912a04b2016-04-20 14:19:501622 CreateSession();
[email protected]dda75ab2013-06-22 22:43:301623
1624 // Run the first request.
[email protected]dda75ab2013-06-22 22:43:301625 SendRequestAndExpectHttpResponse("hello world");
rch37de576c2015-05-17 20:28:171626 ASSERT_TRUE(http_data.AllReadDataConsumed());
1627 ASSERT_TRUE(http_data.AllWriteDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301628
1629 // Now run the second request in which the QUIC socket hangs,
1630 // and verify the the transaction continues over HTTP.
[email protected]dda75ab2013-06-22 22:43:301631 SendRequestAndExpectHttpResponse("hello world");
mmenke651bae7f2015-12-18 21:26:451632 base::RunLoop().RunUntilIdle();
[email protected]dda75ab2013-06-22 22:43:301633
rch37de576c2015-05-17 20:28:171634 ASSERT_TRUE(http_data2.AllReadDataConsumed());
1635 ASSERT_TRUE(http_data2.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:451636 ASSERT_TRUE(quic_data.AllReadDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301637}
1638
[email protected]1e960032013-12-20 19:00:201639TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
[email protected]1e960032013-12-20 19:00:201640 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581641 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1642 1, kClientDataStreamId1, true, true,
1643 GetRequestHeaders("GET", "https", "/")));
1644 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021645 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581646 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1647 false, true, 0, "hello!"));
1648 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501649 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591650 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]8ba81212013-05-03 13:11:481651
rcha5399e02015-04-21 19:32:041652 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]8ba81212013-05-03 13:11:481653
rtennetib8e80fb2016-05-16 00:12:091654 // The non-alternate protocol job needs to hang in order to guarantee that
1655 // the alternate-protocol job will "win".
1656 AddHangingNonAlternateProtocolSocketData();
1657
rch3f4b8452016-02-23 16:59:321658 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:191659 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1660 SendRequestAndExpectQuicResponse("hello!");
[email protected]8ba81212013-05-03 13:11:481661}
1662
[email protected]1e960032013-12-20 19:00:201663TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
[email protected]1e960032013-12-20 19:00:201664 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581665 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1666 1, kClientDataStreamId1, true, true,
1667 GetRequestHeaders("GET", "https", "/")));
1668 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021669 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581670 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1671 false, true, 0, "hello!"));
1672 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501673 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591674 mock_quic_data.AddRead(ASYNC, 0); // EOF
rcha5399e02015-04-21 19:32:041675 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]3a120a6b2013-06-25 01:08:271676
1677 // In order for a new QUIC session to be established via alternate-protocol
1678 // without racing an HTTP connection, we need the host resolution to happen
1679 // synchronously.
1680 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291681 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561682 "");
rch9ae5b3b2016-02-11 00:36:291683 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]3a120a6b2013-06-25 01:08:271684 AddressList address;
rjshaded5ced072015-12-18 19:26:021685 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1686 nullptr, net_log_.bound());
[email protected]3a120a6b2013-06-25 01:08:271687
rtennetib8e80fb2016-05-16 00:12:091688 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321689 CreateSession();
[email protected]3a120a6b2013-06-25 01:08:271690 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1691 SendRequestAndExpectQuicResponse("hello!");
1692}
1693
[email protected]0fc924b2014-03-31 04:34:151694TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) {
rdsmith82957ad2015-09-16 19:42:031695 proxy_service_ = ProxyService::CreateFixedFromPacResult("PROXY myproxy:70");
[email protected]0fc924b2014-03-31 04:34:151696
1697 // Since we are using a proxy, the QUIC job will not succeed.
1698 MockWrite http_writes[] = {
rch9ae5b3b2016-02-11 00:36:291699 MockWrite(SYNCHRONOUS, 0, "GET http://mail.example.org/ HTTP/1.1\r\n"),
1700 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561701 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")};
[email protected]0fc924b2014-03-31 04:34:151702
1703 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561704 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
bnc1c196c6e2016-05-28 13:51:481705 MockRead(SYNCHRONOUS, 4, kQuicAlternativeServiceHeader),
rchf114d982015-10-21 01:34:561706 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]0fc924b2014-03-31 04:34:151707
1708 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
1709 http_writes, arraysize(http_writes));
1710 socket_factory_.AddSocketDataProvider(&http_data);
1711
1712 // In order for a new QUIC session to be established via alternate-protocol
1713 // without racing an HTTP connection, we need the host resolution to happen
1714 // synchronously.
1715 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291716 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561717 "");
rch9ae5b3b2016-02-11 00:36:291718 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]0fc924b2014-03-31 04:34:151719 AddressList address;
rjshaded5ced072015-12-18 19:26:021720 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1721 nullptr, net_log_.bound());
[email protected]0fc924b2014-03-31 04:34:151722
rch9ae5b3b2016-02-11 00:36:291723 request_.url = GURL("http://mail.example.org/");
rch3f4b8452016-02-23 16:59:321724 CreateSession();
[email protected]0fc924b2014-03-31 04:34:151725 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1726 SendRequestAndExpectHttpResponse("hello world");
1727}
1728
[email protected]1e960032013-12-20 19:00:201729TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
[email protected]1e960032013-12-20 19:00:201730 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581731 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1732 1, kClientDataStreamId1, true, true,
1733 GetRequestHeaders("GET", "https", "/")));
1734 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021735 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581736 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1737 false, true, 0, "hello!"));
1738 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591739 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
rcha5399e02015-04-21 19:32:041740 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]11c05872013-08-20 02:04:121741
rtennetib8e80fb2016-05-16 00:12:091742 // The non-alternate protocol job needs to hang in order to guarantee that
1743 // the alternate-protocol job will "win".
1744 AddHangingNonAlternateProtocolSocketData();
1745
[email protected]11c05872013-08-20 02:04:121746 // In order for a new QUIC session to be established via alternate-protocol
1747 // without racing an HTTP connection, we need the host resolution to happen
1748 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1749 // connection to the the server, in this test we require confirmation
1750 // before encrypting so the HTTP job will still start.
1751 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291752 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561753 "");
rch9ae5b3b2016-02-11 00:36:291754 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]11c05872013-08-20 02:04:121755 AddressList address;
rjshaded5ced072015-12-18 19:26:021756 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1757 nullptr, net_log_.bound());
[email protected]11c05872013-08-20 02:04:121758
rch3f4b8452016-02-23 16:59:321759 CreateSession();
[email protected]11c05872013-08-20 02:04:121760 session_->quic_stream_factory()->set_require_confirmation(true);
1761 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1762
danakjad1777e2016-04-16 00:56:421763 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]11c05872013-08-20 02:04:121764 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1765 TestCompletionCallback callback;
1766 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1767 EXPECT_EQ(ERR_IO_PENDING, rv);
1768
1769 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1770 QuicSession::HANDSHAKE_CONFIRMED);
1771 EXPECT_EQ(OK, callback.WaitForResult());
rchb27683c2015-07-29 23:53:501772
1773 CheckWasQuicResponse(trans);
1774 CheckResponseData(trans, "hello!");
[email protected]11c05872013-08-20 02:04:121775}
1776
zhongyica364fbb2015-12-12 03:39:121777TEST_P(QuicNetworkTransactionTest,
1778 LogGranularQuicErrorCodeOnQuicProtocolErrorLocal) {
1779 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581780 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1781 1, kClientDataStreamId1, true, true,
1782 GetRequestHeaders("GET", "https", "/")));
zhongyica364fbb2015-12-12 03:39:121783 // Read a close connection packet with
1784 // QuicErrorCode: QUIC_CRYPTO_VERSION_NOT_SUPPORTED from the peer.
alyssar2adf3ac2016-05-03 17:12:581785 mock_quic_data.AddRead(ConstructServerConnectionClosePacket(1));
zhongyica364fbb2015-12-12 03:39:121786 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1787
1788 // The non-alternate protocol job needs to hang in order to guarantee that
1789 // the alternate-protocol job will "win".
1790 AddHangingNonAlternateProtocolSocketData();
1791
1792 // In order for a new QUIC session to be established via alternate-protocol
1793 // without racing an HTTP connection, we need the host resolution to happen
1794 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1795 // connection to the the server, in this test we require confirmation
1796 // before encrypting so the HTTP job will still start.
1797 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291798 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:121799 "");
rch9ae5b3b2016-02-11 00:36:291800 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:121801 AddressList address;
1802 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1803 nullptr, net_log_.bound());
1804
rch3f4b8452016-02-23 16:59:321805 CreateSession();
zhongyica364fbb2015-12-12 03:39:121806 session_->quic_stream_factory()->set_require_confirmation(true);
1807 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1808
danakjad1777e2016-04-16 00:56:421809 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyica364fbb2015-12-12 03:39:121810 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1811 TestCompletionCallback callback;
1812 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1813 EXPECT_EQ(ERR_IO_PENDING, rv);
1814
1815 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1816 QuicSession::HANDSHAKE_CONFIRMED);
1817 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
1818
1819 NetErrorDetails details;
1820 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1821
1822 trans->PopulateNetErrorDetails(&details);
1823 // Verify the error code logged is what sent by the peer.
1824 EXPECT_EQ(QUIC_CRYPTO_VERSION_NOT_SUPPORTED, details.quic_connection_error);
1825}
1826
1827TEST_P(QuicNetworkTransactionTest,
1828 LogGranularQuicErrorCodeOnQuicProtocolErrorRemote) {
1829 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581830 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1831 1, kClientDataStreamId1, true, true,
1832 GetRequestHeaders("GET", "https", "/")));
zhongyif28b4a32016-04-25 21:35:211833 // Peer sending data from an non-existing stream causes this end to raise
1834 // error and close connection.
1835 mock_quic_data.AddRead(
alyssar2adf3ac2016-05-03 17:12:581836 ConstructServerRstPacket(1, false, 99, QUIC_STREAM_LAST_ERROR));
zhongyif28b4a32016-04-25 21:35:211837 std::string quic_error_details = "Data for nonexistent stream";
alyssar2adf3ac2016-05-03 17:12:581838 mock_quic_data.AddWrite(ConstructClientAckAndConnectionClosePacket(
zhongyif28b4a32016-04-25 21:35:211839 2, QuicTime::Delta::Infinite(), 0, 1, QUIC_INVALID_STREAM_ID,
zhongyica364fbb2015-12-12 03:39:121840 quic_error_details));
1841 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1842
1843 // The non-alternate protocol job needs to hang in order to guarantee that
1844 // the alternate-protocol job will "win".
1845 AddHangingNonAlternateProtocolSocketData();
1846
1847 // In order for a new QUIC session to be established via alternate-protocol
1848 // without racing an HTTP connection, we need the host resolution to happen
1849 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1850 // connection to the the server, in this test we require confirmation
1851 // before encrypting so the HTTP job will still start.
1852 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291853 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:121854 "");
rch9ae5b3b2016-02-11 00:36:291855 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:121856 AddressList address;
1857 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1858 nullptr, net_log_.bound());
1859
rch3f4b8452016-02-23 16:59:321860 CreateSession();
zhongyica364fbb2015-12-12 03:39:121861 session_->quic_stream_factory()->set_require_confirmation(true);
1862 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1863
danakjad1777e2016-04-16 00:56:421864 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyica364fbb2015-12-12 03:39:121865 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1866 TestCompletionCallback callback;
1867 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1868 EXPECT_EQ(ERR_IO_PENDING, rv);
1869
1870 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1871 QuicSession::HANDSHAKE_CONFIRMED);
1872 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
1873 NetErrorDetails details;
1874 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1875
1876 trans->PopulateNetErrorDetails(&details);
zhongyif28b4a32016-04-25 21:35:211877 EXPECT_EQ(QUIC_INVALID_STREAM_ID, details.quic_connection_error);
zhongyica364fbb2015-12-12 03:39:121878}
1879
[email protected]1e960032013-12-20 19:00:201880TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
[email protected]3316d422013-05-03 21:45:301881 // Alternate-protocol job
alyssar2adf3ac2016-05-03 17:12:581882 std::unique_ptr<QuicEncryptedPacket> close(
1883 ConstructServerConnectionClosePacket(1));
[email protected]3316d422013-05-03 21:45:301884 MockRead quic_reads[] = {
rchb27683c2015-07-29 23:53:501885 MockRead(ASYNC, close->data(), close->length()),
1886 MockRead(ASYNC, ERR_IO_PENDING), // No more data to read
1887 MockRead(ASYNC, OK), // EOF
[email protected]3316d422013-05-03 21:45:301888 };
rjshaded5ced072015-12-18 19:26:021889 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
1890 0);
[email protected]3316d422013-05-03 21:45:301891 socket_factory_.AddSocketDataProvider(&quic_data);
1892
1893 // Main job which will succeed even though the alternate job fails.
1894 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021895 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
1896 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1897 MockRead(ASYNC, OK)};
[email protected]3316d422013-05-03 21:45:301898
rjshaded5ced072015-12-18 19:26:021899 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1900 0);
[email protected]3316d422013-05-03 21:45:301901 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561902 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]3316d422013-05-03 21:45:301903
rch3f4b8452016-02-23 16:59:321904 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:191905 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1906 SendRequestAndExpectHttpResponse("hello from http");
1907 ExpectBrokenAlternateProtocolMapping();
[email protected]3316d422013-05-03 21:45:301908}
1909
[email protected]1e960032013-12-20 19:00:201910TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
[email protected]d03a66d2013-05-06 12:55:591911 // Alternate-protocol job
1912 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:021913 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]d03a66d2013-05-06 12:55:591914 };
rjshaded5ced072015-12-18 19:26:021915 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
1916 0);
[email protected]d03a66d2013-05-06 12:55:591917 socket_factory_.AddSocketDataProvider(&quic_data);
1918
1919 // Main job which will succeed even though the alternate job fails.
1920 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021921 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
1922 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1923 MockRead(ASYNC, OK)};
[email protected]d03a66d2013-05-06 12:55:591924
rjshaded5ced072015-12-18 19:26:021925 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1926 0);
[email protected]d03a66d2013-05-06 12:55:591927 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561928 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]d03a66d2013-05-06 12:55:591929
rch3f4b8452016-02-23 16:59:321930 CreateSession();
[email protected]d03a66d2013-05-06 12:55:591931
[email protected]aa9b14d2013-05-10 23:45:191932 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1933 SendRequestAndExpectHttpResponse("hello from http");
1934 ExpectBrokenAlternateProtocolMapping();
[email protected]d03a66d2013-05-06 12:55:591935}
1936
[email protected]00c159f2014-05-21 22:38:161937TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) {
[email protected]eb71ab62014-05-23 07:57:531938 // Alternate-protocol job will fail when the session attempts to read.
[email protected]00c159f2014-05-21 22:38:161939 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:021940 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:161941 };
rjshaded5ced072015-12-18 19:26:021942 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
1943 0);
[email protected]00c159f2014-05-21 22:38:161944 socket_factory_.AddSocketDataProvider(&quic_data);
1945
[email protected]eb71ab62014-05-23 07:57:531946 // Main job will also fail.
[email protected]00c159f2014-05-21 22:38:161947 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021948 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:161949 };
1950
rjshaded5ced072015-12-18 19:26:021951 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1952 0);
[email protected]00c159f2014-05-21 22:38:161953 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED));
1954 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561955 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]00c159f2014-05-21 22:38:161956
rtennetib8e80fb2016-05-16 00:12:091957 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321958 CreateSession();
[email protected]00c159f2014-05-21 22:38:161959
1960 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
danakjad1777e2016-04-16 00:56:421961 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]00c159f2014-05-21 22:38:161962 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1963 TestCompletionCallback callback;
1964 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1965 EXPECT_EQ(ERR_IO_PENDING, rv);
1966 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult());
1967 ExpectQuicAlternateProtocolMapping();
1968}
1969
[email protected]1e960032013-12-20 19:00:201970TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
[email protected]77c6c162013-08-17 02:57:451971 // Alternate-protocol job
1972 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:021973 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]77c6c162013-08-17 02:57:451974 };
rjshaded5ced072015-12-18 19:26:021975 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
1976 0);
[email protected]77c6c162013-08-17 02:57:451977 socket_factory_.AddSocketDataProvider(&quic_data);
1978
[email protected]c92c1b52014-05-31 04:16:061979 // Second Alternate-protocol job which will race with the TCP job.
1980 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421981 nullptr, 0);
[email protected]c92c1b52014-05-31 04:16:061982 socket_factory_.AddSocketDataProvider(&quic_data2);
1983
[email protected]4d283b32013-10-17 12:57:271984 // Final job that will proceed when the QUIC job fails.
1985 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021986 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
1987 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1988 MockRead(ASYNC, OK)};
[email protected]4d283b32013-10-17 12:57:271989
rjshaded5ced072015-12-18 19:26:021990 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1991 0);
[email protected]4d283b32013-10-17 12:57:271992 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561993 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d283b32013-10-17 12:57:271994
rtennetiafccbc062016-05-16 18:21:141995 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321996 CreateSession();
[email protected]77c6c162013-08-17 02:57:451997
1998 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1999
[email protected]4d283b32013-10-17 12:57:272000 SendRequestAndExpectHttpResponse("hello from http");
[email protected]77c6c162013-08-17 02:57:452001
2002 ExpectBrokenAlternateProtocolMapping();
[email protected]4d283b32013-10-17 12:57:272003
rch37de576c2015-05-17 20:28:172004 EXPECT_TRUE(quic_data.AllReadDataConsumed());
2005 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
[email protected]77c6c162013-08-17 02:57:452006}
2007
[email protected]93b31772014-06-19 08:03:352008TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) {
[email protected]65768442014-06-06 23:37:032009 // Alternate-protocol job
2010 MockRead quic_reads[] = {
mmenkee24011922015-12-17 22:12:592011 MockRead(SYNCHRONOUS, ERR_IO_PENDING),
[email protected]65768442014-06-06 23:37:032012 };
rjshaded5ced072015-12-18 19:26:022013 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2014 0);
[email protected]65768442014-06-06 23:37:032015 socket_factory_.AddSocketDataProvider(&quic_data);
2016
2017 // Main job that will proceed when the QUIC job fails.
2018 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022019 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2020 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2021 MockRead(ASYNC, OK)};
[email protected]65768442014-06-06 23:37:032022
rjshaded5ced072015-12-18 19:26:022023 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2024 0);
[email protected]65768442014-06-06 23:37:032025 socket_factory_.AddSocketDataProvider(&http_data);
2026
rtennetib8e80fb2016-05-16 00:12:092027 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322028 CreateSession();
[email protected]65768442014-06-06 23:37:032029
2030 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2031
2032 SendRequestAndExpectHttpResponse("hello from http");
2033}
2034
[email protected]eb71ab62014-05-23 07:57:532035TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
[email protected]4d590c9c2014-05-02 05:14:332036 // Alternate-protocol job will fail before creating a QUIC session.
rtennetibe635732014-10-02 22:51:422037 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0);
rjshaded5ced072015-12-18 19:26:022038 quic_data.set_connect_data(
2039 MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED));
[email protected]4d590c9c2014-05-02 05:14:332040 socket_factory_.AddSocketDataProvider(&quic_data);
2041
2042 // Main job which will succeed even though the alternate job fails.
2043 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022044 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2045 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2046 MockRead(ASYNC, OK)};
[email protected]4d590c9c2014-05-02 05:14:332047
rjshaded5ced072015-12-18 19:26:022048 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2049 0);
[email protected]4d590c9c2014-05-02 05:14:332050 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562051 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d590c9c2014-05-02 05:14:332052
rch3f4b8452016-02-23 16:59:322053 CreateSession();
[email protected]4d590c9c2014-05-02 05:14:332054 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2055 SendRequestAndExpectHttpResponse("hello from http");
[email protected]eb71ab62014-05-23 07:57:532056
2057 ExpectBrokenAlternateProtocolMapping();
[email protected]4d590c9c2014-05-02 05:14:332058}
2059
[email protected]4fee9672014-01-08 14:47:152060TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
[email protected]4fee9672014-01-08 14:47:152061 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582062 mock_quic_data.AddSynchronousRead(ConstructServerConnectionClosePacket(1));
2063 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2064 1, kClientDataStreamId1, true, true,
2065 GetRequestHeaders("GET", "https", "/")));
2066 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rcha5399e02015-04-21 19:32:042067 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4fee9672014-01-08 14:47:152068
2069 // When the QUIC connection fails, we will try the request again over HTTP.
2070 MockRead http_reads[] = {
bnc1c196c6e2016-05-28 13:51:482071 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
rchf114d982015-10-21 01:34:562072 MockRead("hello world"),
2073 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2074 MockRead(ASYNC, OK)};
[email protected]4fee9672014-01-08 14:47:152075
rjshaded5ced072015-12-18 19:26:022076 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2077 0);
[email protected]4fee9672014-01-08 14:47:152078 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562079 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4fee9672014-01-08 14:47:152080
2081 // In order for a new QUIC session to be established via alternate-protocol
2082 // without racing an HTTP connection, we need the host resolution to happen
2083 // synchronously.
2084 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:292085 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:562086 "");
rch9ae5b3b2016-02-11 00:36:292087 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]4fee9672014-01-08 14:47:152088 AddressList address;
rjshaded5ced072015-12-18 19:26:022089 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2090 nullptr, net_log_.bound());
[email protected]4fee9672014-01-08 14:47:152091
rch3f4b8452016-02-23 16:59:322092 CreateSession();
[email protected]4fee9672014-01-08 14:47:152093 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2094 SendRequestAndExpectHttpResponse("hello world");
2095}
2096
bnc508835902015-05-12 20:10:292097TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) {
alyssar2adf3ac2016-05-03 17:12:582098 client_maker_.set_hostname("www.example.org");
tbansal0f56a39a2016-04-07 22:03:382099 EXPECT_FALSE(
2100 test_socket_performance_watcher_factory_.rtt_notification_received());
bnc508835902015-05-12 20:10:292101 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582102 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2103 1, kClientDataStreamId1, true, true,
2104 GetRequestHeaders("GET", "https", "/")));
2105 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc508835902015-05-12 20:10:292106 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:582107 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
2108 false, true, 0, "hello!"));
2109 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:502110 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
bnc508835902015-05-12 20:10:292111 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2112
bncb07c05532015-05-14 19:07:202113 request_.url = GURL("https://www.example.org:443");
rtennetib8e80fb2016-05-16 00:12:092114 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322115 CreateSession();
bnc508835902015-05-12 20:10:292116 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
2117 SendRequestAndExpectQuicResponse("hello!");
tbansal0f56a39a2016-04-07 22:03:382118 EXPECT_TRUE(
2119 test_socket_performance_watcher_factory_.rtt_notification_received());
bnc508835902015-05-12 20:10:292120}
2121
rtenneti56977812016-01-15 19:26:562122TEST_P(QuicNetworkTransactionTest, QuicUpload) {
rtenneti8a2f4632016-03-21 20:26:572123 params_.origins_to_force_quic_on.insert(
2124 HostPortPair::FromString("mail.example.org:443"));
rtenneti56977812016-01-15 19:26:562125
2126 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2127 MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_FAILED, 1)};
2128 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2129 arraysize(writes));
2130 socket_factory_.AddSocketDataProvider(&socket_data);
2131
rtennetib8e80fb2016-05-16 00:12:092132 // The non-alternate protocol job needs to hang in order to guarantee that
2133 // the alternate-protocol job will "win".
2134 AddHangingNonAlternateProtocolSocketData();
2135
rch3f4b8452016-02-23 16:59:322136 params_.enable_alternative_service_with_different_host = false;
rtenneti56977812016-01-15 19:26:562137 CreateSession();
2138 request_.method = "POST";
2139 ChunkedUploadDataStream upload_data(0);
2140 upload_data.AppendData("1", 1, true);
2141
2142 request_.upload_data_stream = &upload_data;
2143
danakjad1777e2016-04-16 00:56:422144 std::unique_ptr<HttpNetworkTransaction> trans(
rtenneti56977812016-01-15 19:26:562145 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2146 TestCompletionCallback callback;
2147 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2148 EXPECT_EQ(ERR_IO_PENDING, rv);
2149 EXPECT_NE(OK, callback.WaitForResult());
2150}
2151
bnc359ed2a2016-04-29 20:43:452152class QuicNetworkTransactionWithDestinationTest
2153 : public PlatformTest,
2154 public ::testing::WithParamInterface<PoolingTestParams> {
2155 protected:
2156 QuicNetworkTransactionWithDestinationTest()
2157 : clock_(new MockClock),
2158 version_(GetParam().version),
2159 destination_type_(GetParam().destination_type),
2160 cert_transparency_verifier_(new MultiLogCTVerifier()),
2161 ssl_config_service_(new SSLConfigServiceDefaults),
2162 proxy_service_(ProxyService::CreateDirect()),
2163 auth_handler_factory_(
2164 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
2165 random_generator_(0),
2166 ssl_data_(ASYNC, OK) {}
2167
2168 void SetUp() override {
2169 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:552170 base::RunLoop().RunUntilIdle();
bnc359ed2a2016-04-29 20:43:452171
2172 HttpNetworkSession::Params params;
2173
2174 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
2175 params.quic_clock = clock_;
2176
2177 crypto_client_stream_factory_.set_handshake_mode(
2178 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2179 params.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
2180
2181 params.enable_alternative_service_with_different_host = true;
2182 params.enable_quic = true;
2183 params.quic_random = &random_generator_;
2184 params.client_socket_factory = &socket_factory_;
2185 params.host_resolver = &host_resolver_;
2186 params.cert_verifier = &cert_verifier_;
2187 params.transport_security_state = &transport_security_state_;
2188 params.cert_transparency_verifier = cert_transparency_verifier_.get();
2189 params.socket_performance_watcher_factory =
2190 &test_socket_performance_watcher_factory_;
2191 params.ssl_config_service = ssl_config_service_.get();
2192 params.proxy_service = proxy_service_.get();
2193 params.http_auth_handler_factory = auth_handler_factory_.get();
bnc525e175a2016-06-20 12:36:402194 params.http_server_properties = &http_server_properties_;
bnc359ed2a2016-04-29 20:43:452195 params.quic_supported_versions = SupportedVersions(version_);
2196 params.quic_host_whitelist.insert("news.example.org");
2197 params.quic_host_whitelist.insert("mail.example.org");
2198 params.quic_host_whitelist.insert("mail.example.com");
2199
2200 session_.reset(new HttpNetworkSession(params));
2201 session_->quic_stream_factory()->set_require_confirmation(true);
2202 ASSERT_EQ(params.quic_socket_receive_buffer_size,
2203 session_->quic_stream_factory()->socket_receive_buffer_size());
2204 }
2205
2206 void TearDown() override {
2207 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
2208 // Empty the current queue.
fdoray92e35a72016-06-10 15:54:552209 base::RunLoop().RunUntilIdle();
bnc359ed2a2016-04-29 20:43:452210 PlatformTest::TearDown();
2211 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:552212 base::RunLoop().RunUntilIdle();
bnc525e175a2016-06-20 12:36:402213 session_.reset();
bnc359ed2a2016-04-29 20:43:452214 }
2215
2216 void SetAlternativeService(const std::string& origin) {
2217 HostPortPair destination;
2218 switch (destination_type_) {
2219 case SAME_AS_FIRST:
2220 destination = HostPortPair(origin1_, 443);
2221 break;
2222 case SAME_AS_SECOND:
2223 destination = HostPortPair(origin2_, 443);
2224 break;
2225 case DIFFERENT:
2226 destination = HostPortPair(kDifferentHostname, 443);
2227 break;
2228 }
2229 AlternativeService alternative_service(QUIC, destination);
2230 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
2231 http_server_properties_.SetAlternativeService(
2232 url::SchemeHostPort("https", origin, 443), alternative_service,
2233 expiration);
2234 }
2235
alyssar2adf3ac2016-05-03 17:12:582236 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452237 QuicPacketNumber packet_number,
2238 QuicStreamId stream_id,
2239 bool should_include_version,
2240 QuicStreamOffset* offset,
2241 QuicTestPacketMaker* maker) {
2242 SpdyPriority priority =
2243 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
2244 SpdyHeaderBlock headers(maker->GetRequestHeaders("GET", "https", "/"));
2245 return maker->MakeRequestHeadersPacketWithOffsetTracking(
2246 packet_number, stream_id, should_include_version, true, priority,
2247 headers, offset);
2248 }
2249
alyssar2adf3ac2016-05-03 17:12:582250 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452251 QuicPacketNumber packet_number,
2252 QuicStreamId stream_id,
2253 bool should_include_version,
2254 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:582255 return ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452256 packet_number, stream_id, should_include_version, nullptr, maker);
2257 }
2258
alyssar2adf3ac2016-05-03 17:12:582259 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:452260 QuicPacketNumber packet_number,
2261 QuicStreamId stream_id,
2262 QuicStreamOffset* offset,
2263 QuicTestPacketMaker* maker) {
2264 SpdyHeaderBlock headers(maker->GetResponseHeaders("200 OK"));
2265 return maker->MakeResponseHeadersPacketWithOffsetTracking(
2266 packet_number, stream_id, false, false, headers, offset);
2267 }
2268
alyssar2adf3ac2016-05-03 17:12:582269 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:452270 QuicPacketNumber packet_number,
2271 QuicStreamId stream_id,
2272 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:582273 return ConstructServerResponseHeadersPacket(packet_number, stream_id,
2274 nullptr, maker);
bnc359ed2a2016-04-29 20:43:452275 }
2276
alyssar2adf3ac2016-05-03 17:12:582277 std::unique_ptr<QuicEncryptedPacket> ConstructServerDataPacket(
bnc359ed2a2016-04-29 20:43:452278 QuicPacketNumber packet_number,
2279 QuicStreamId stream_id,
2280 QuicTestPacketMaker* maker) {
2281 return maker->MakeDataPacket(packet_number, stream_id, false, true, 0,
2282 "hello");
2283 }
2284
alyssar2adf3ac2016-05-03 17:12:582285 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
bnc359ed2a2016-04-29 20:43:452286 QuicPacketNumber packet_number,
2287 QuicPacketNumber largest_received,
2288 QuicPacketNumber ack_least_unacked,
2289 QuicPacketNumber stop_least_unacked,
2290 QuicTestPacketMaker* maker) {
2291 return maker->MakeAckPacket(packet_number, largest_received,
2292 ack_least_unacked, stop_least_unacked, true);
2293 }
2294
2295 void AddRefusedSocketData() {
2296 std::unique_ptr<StaticSocketDataProvider> refused_data(
2297 new StaticSocketDataProvider());
2298 MockConnect refused_connect(SYNCHRONOUS, ERR_CONNECTION_REFUSED);
2299 refused_data->set_connect_data(refused_connect);
2300 socket_factory_.AddSocketDataProvider(refused_data.get());
2301 static_socket_data_provider_vector_.push_back(std::move(refused_data));
2302 }
2303
2304 void AddHangingSocketData() {
2305 std::unique_ptr<StaticSocketDataProvider> hanging_data(
2306 new StaticSocketDataProvider());
2307 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
2308 hanging_data->set_connect_data(hanging_connect);
2309 socket_factory_.AddSocketDataProvider(hanging_data.get());
2310 static_socket_data_provider_vector_.push_back(std::move(hanging_data));
2311 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
2312 }
2313
2314 bool AllDataConsumed() {
2315 for (const auto& socket_data_ptr : static_socket_data_provider_vector_) {
2316 if (!socket_data_ptr->AllReadDataConsumed() ||
2317 !socket_data_ptr->AllWriteDataConsumed()) {
2318 return false;
2319 }
2320 }
2321 return true;
2322 }
2323
2324 void SendRequestAndExpectQuicResponse(const std::string& host) {
2325 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
2326 HttpRequestInfo request;
2327 std::string url("https://");
2328 url.append(host);
2329 request.url = GURL(url);
2330 request.load_flags = 0;
2331 request.method = "GET";
2332 TestCompletionCallback callback;
2333 int rv = trans.Start(&request, callback.callback(), net_log_.bound());
2334 EXPECT_EQ(OK, callback.GetResult(rv));
2335
2336 std::string response_data;
2337 ASSERT_EQ(OK, ReadTransaction(&trans, &response_data));
2338 EXPECT_EQ("hello", response_data);
2339
2340 const HttpResponseInfo* response = trans.GetResponseInfo();
2341 ASSERT_TRUE(response != nullptr);
2342 ASSERT_TRUE(response->headers.get() != nullptr);
2343 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
2344 EXPECT_TRUE(response->was_fetched_via_spdy);
2345 EXPECT_TRUE(response->was_npn_negotiated);
2346 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
2347 response->connection_info);
2348 EXPECT_EQ(443, response->socket_address.port());
2349 }
2350
2351 MockClock* clock_;
2352 QuicVersion version_;
2353 DestinationType destination_type_;
2354 std::string origin1_;
2355 std::string origin2_;
2356 std::unique_ptr<HttpNetworkSession> session_;
2357 MockClientSocketFactory socket_factory_;
2358 MockHostResolver host_resolver_;
2359 MockCertVerifier cert_verifier_;
2360 TransportSecurityState transport_security_state_;
2361 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
2362 TestSocketPerformanceWatcherFactory test_socket_performance_watcher_factory_;
2363 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
2364 std::unique_ptr<ProxyService> proxy_service_;
2365 std::unique_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
2366 MockRandom random_generator_;
2367 HttpServerPropertiesImpl http_server_properties_;
2368 BoundTestNetLog net_log_;
2369 MockCryptoClientStreamFactory crypto_client_stream_factory_;
2370 std::vector<std::unique_ptr<StaticSocketDataProvider>>
2371 static_socket_data_provider_vector_;
2372 SSLSocketDataProvider ssl_data_;
2373};
2374
2375INSTANTIATE_TEST_CASE_P(Version,
2376 QuicNetworkTransactionWithDestinationTest,
2377 ::testing::ValuesIn(GetPoolingTestParams()));
2378
2379// A single QUIC request fails because the certificate does not match the origin
2380// hostname, regardless of whether it matches the alternative service hostname.
2381TEST_P(QuicNetworkTransactionWithDestinationTest, InvalidCertificate) {
2382 if (destination_type_ == DIFFERENT)
2383 return;
2384
2385 GURL url("https://mail.example.com/");
2386 origin1_ = url.host();
2387
2388 // Not used for requests, but this provides a test case where the certificate
2389 // is valid for the hostname of the alternative service.
2390 origin2_ = "mail.example.org";
2391
2392 SetAlternativeService(origin1_);
2393
2394 scoped_refptr<X509Certificate> cert(
2395 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2396 bool unused;
2397 ASSERT_FALSE(cert->VerifyNameMatch(origin1_, &unused));
2398 ASSERT_TRUE(cert->VerifyNameMatch(origin2_, &unused));
2399
2400 ProofVerifyDetailsChromium verify_details;
2401 verify_details.cert_verify_result.verified_cert = cert;
2402 verify_details.cert_verify_result.is_issued_by_known_root = true;
2403 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2404
2405 MockQuicData mock_quic_data;
2406 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);
2407 mock_quic_data.AddRead(ASYNC, 0);
2408
2409 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2410
2411 AddRefusedSocketData();
2412
2413 HttpRequestInfo request;
2414 request.url = url;
2415
2416 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
2417 TestCompletionCallback callback;
2418 int rv = trans.Start(&request, callback.callback(), net_log_.bound());
2419 EXPECT_EQ(ERR_CONNECTION_REFUSED, callback.GetResult(rv));
2420
2421 EXPECT_TRUE(AllDataConsumed());
2422}
2423
2424// First request opens QUIC session to alternative service. Second request
2425// pools to it, because destination matches and certificate is valid, even
2426// though QuicServerId is different.
2427TEST_P(QuicNetworkTransactionWithDestinationTest, PoolIfCertificateValid) {
2428 origin1_ = "mail.example.org";
2429 origin2_ = "news.example.org";
2430
2431 SetAlternativeService(origin1_);
2432 SetAlternativeService(origin2_);
2433
2434 scoped_refptr<X509Certificate> cert(
2435 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2436 bool unused;
2437 ASSERT_TRUE(cert->VerifyNameMatch(origin1_, &unused));
2438 ASSERT_TRUE(cert->VerifyNameMatch(origin2_, &unused));
2439 ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname, &unused));
2440
2441 ProofVerifyDetailsChromium verify_details;
2442 verify_details.cert_verify_result.verified_cert = cert;
2443 verify_details.cert_verify_result.is_issued_by_known_root = true;
2444 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2445
alyssar2adf3ac2016-05-03 17:12:582446 QuicTestPacketMaker client_maker1(version_, 0, clock_, origin1_,
2447 Perspective::IS_CLIENT);
2448 QuicTestPacketMaker server_maker1(version_, 0, clock_, origin1_,
2449 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452450
2451 QuicStreamOffset request_header_offset(0);
2452 QuicStreamOffset response_header_offset(0);
2453
2454 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582455 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2456 1, kClientDataStreamId1, true, &request_header_offset, &client_maker1));
2457 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2458 1, kClientDataStreamId1, &response_header_offset, &server_maker1));
2459 mock_quic_data.AddRead(
2460 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker1));
2461 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 2, 1, 1, &client_maker1));
bnc359ed2a2016-04-29 20:43:452462
alyssar2adf3ac2016-05-03 17:12:582463 QuicTestPacketMaker client_maker2(version_, 0, clock_, origin2_,
2464 Perspective::IS_CLIENT);
2465 QuicTestPacketMaker server_maker2(version_, 0, clock_, origin2_,
2466 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452467
alyssar2adf3ac2016-05-03 17:12:582468 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2469 3, kClientDataStreamId2, false, &request_header_offset, &client_maker2));
2470 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2471 3, kClientDataStreamId2, &response_header_offset, &server_maker2));
2472 mock_quic_data.AddRead(
2473 ConstructServerDataPacket(4, kClientDataStreamId2, &server_maker2));
2474 mock_quic_data.AddWrite(ConstructClientAckPacket(4, 4, 3, 1, &client_maker2));
bnc359ed2a2016-04-29 20:43:452475 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2476 mock_quic_data.AddRead(ASYNC, 0); // EOF
2477
2478 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2479
2480 AddHangingSocketData();
2481 AddHangingSocketData();
2482
2483 SendRequestAndExpectQuicResponse(origin1_);
2484 SendRequestAndExpectQuicResponse(origin2_);
2485
2486 EXPECT_TRUE(AllDataConsumed());
2487}
2488
2489// First request opens QUIC session to alternative service. Second request does
2490// not pool to it, even though destination matches, because certificate is not
2491// valid. Instead, a new QUIC session is opened to the same destination with a
2492// different QuicServerId.
2493TEST_P(QuicNetworkTransactionWithDestinationTest,
2494 DoNotPoolIfCertificateInvalid) {
2495 origin1_ = "news.example.org";
2496 origin2_ = "mail.example.com";
2497
2498 SetAlternativeService(origin1_);
2499 SetAlternativeService(origin2_);
2500
2501 scoped_refptr<X509Certificate> cert1(
2502 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2503 bool unused;
2504 ASSERT_TRUE(cert1->VerifyNameMatch(origin1_, &unused));
2505 ASSERT_FALSE(cert1->VerifyNameMatch(origin2_, &unused));
2506 ASSERT_FALSE(cert1->VerifyNameMatch(kDifferentHostname, &unused));
2507
2508 scoped_refptr<X509Certificate> cert2(
2509 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
2510 ASSERT_TRUE(cert2->VerifyNameMatch(origin2_, &unused));
2511 ASSERT_FALSE(cert2->VerifyNameMatch(kDifferentHostname, &unused));
2512
2513 ProofVerifyDetailsChromium verify_details1;
2514 verify_details1.cert_verify_result.verified_cert = cert1;
2515 verify_details1.cert_verify_result.is_issued_by_known_root = true;
2516 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
2517
2518 ProofVerifyDetailsChromium verify_details2;
2519 verify_details2.cert_verify_result.verified_cert = cert2;
2520 verify_details2.cert_verify_result.is_issued_by_known_root = true;
2521 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
2522
alyssar2adf3ac2016-05-03 17:12:582523 QuicTestPacketMaker client_maker1(version_, 0, clock_, origin1_,
2524 Perspective::IS_CLIENT);
2525 QuicTestPacketMaker server_maker1(version_, 0, clock_, origin1_,
2526 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452527
2528 MockQuicData mock_quic_data1;
alyssar2adf3ac2016-05-03 17:12:582529 mock_quic_data1.AddWrite(ConstructClientRequestHeadersPacket(
2530 1, kClientDataStreamId1, true, &client_maker1));
2531 mock_quic_data1.AddRead(ConstructServerResponseHeadersPacket(
2532 1, kClientDataStreamId1, &server_maker1));
2533 mock_quic_data1.AddRead(
2534 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker1));
bnc359ed2a2016-04-29 20:43:452535 mock_quic_data1.AddWrite(
alyssar2adf3ac2016-05-03 17:12:582536 ConstructClientAckPacket(2, 2, 1, 1, &client_maker1));
bnc359ed2a2016-04-29 20:43:452537 mock_quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2538 mock_quic_data1.AddRead(ASYNC, 0); // EOF
2539
2540 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
2541
2542 AddHangingSocketData();
2543
alyssar2adf3ac2016-05-03 17:12:582544 QuicTestPacketMaker client_maker2(version_, 0, clock_, origin2_,
2545 Perspective::IS_CLIENT);
2546 QuicTestPacketMaker server_maker2(version_, 0, clock_, origin2_,
2547 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452548
2549 MockQuicData mock_quic_data2;
alyssar2adf3ac2016-05-03 17:12:582550 mock_quic_data2.AddWrite(ConstructClientRequestHeadersPacket(
2551 1, kClientDataStreamId1, true, &client_maker2));
2552 mock_quic_data2.AddRead(ConstructServerResponseHeadersPacket(
2553 1, kClientDataStreamId1, &server_maker2));
2554 mock_quic_data2.AddRead(
2555 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker2));
bnc359ed2a2016-04-29 20:43:452556 mock_quic_data2.AddWrite(
alyssar2adf3ac2016-05-03 17:12:582557 ConstructClientAckPacket(2, 2, 1, 1, &client_maker2));
bnc359ed2a2016-04-29 20:43:452558 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2559 mock_quic_data2.AddRead(ASYNC, 0); // EOF
2560
2561 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
2562
2563 AddHangingSocketData();
2564
2565 SendRequestAndExpectQuicResponse(origin1_);
2566 SendRequestAndExpectQuicResponse(origin2_);
2567
2568 EXPECT_TRUE(AllDataConsumed());
2569}
2570
[email protected]61a527782013-02-21 03:58:002571} // namespace test
2572} // namespace net