blob: 9da9915ad632996d88eb6c6af3eb8aa2651da61e [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"
rsleevid6de8302016-06-21 01:33:2019#include "net/cert/ct_policy_enforcer.h"
[email protected]6e7845ae2013-03-29 21:48:1120#include "net/cert/mock_cert_verifier.h"
rtenneti052774e2015-11-24 21:00:1221#include "net/cert/multi_log_ct_verifier.h"
[email protected]f2cb3cf2013-03-21 01:40:5322#include "net/dns/mock_host_resolver.h"
[email protected]61a527782013-02-21 03:58:0023#include "net/http/http_auth_handler_factory.h"
24#include "net/http/http_network_session.h"
25#include "net/http/http_network_transaction.h"
26#include "net/http/http_server_properties_impl.h"
27#include "net/http/http_stream.h"
28#include "net/http/http_stream_factory.h"
[email protected]c41737d2014-05-14 07:47:1929#include "net/http/http_transaction_test_util.h"
[email protected]b1c988b2013-06-13 06:48:1130#include "net/http/transport_security_state.h"
vishal.b62985ca92015-04-17 08:45:5131#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4632#include "net/log/test_net_log_entry.h"
33#include "net/log/test_net_log_util.h"
[email protected]61a527782013-02-21 03:58:0034#include "net/proxy/proxy_config_service_fixed.h"
35#include "net/proxy/proxy_resolver.h"
36#include "net/proxy/proxy_service.h"
bnc508835902015-05-12 20:10:2937#include "net/quic/crypto/proof_verifier_chromium.h"
[email protected]61a527782013-02-21 03:58:0038#include "net/quic/crypto/quic_decrypter.h"
39#include "net/quic/crypto/quic_encrypter.h"
40#include "net/quic/quic_framer.h"
[email protected]24e5bc52013-09-18 15:36:5841#include "net/quic/quic_http_utils.h"
[email protected]ed3fc15d2013-03-08 18:37:4442#include "net/quic/test_tools/crypto_test_utils.h"
[email protected]61a527782013-02-21 03:58:0043#include "net/quic/test_tools/mock_clock.h"
[email protected]e8ff26842013-03-22 21:02:0544#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
[email protected]61a527782013-02-21 03:58:0045#include "net/quic/test_tools/mock_random.h"
[email protected]1e960032013-12-20 19:00:2046#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]61a527782013-02-21 03:58:0047#include "net/quic/test_tools/quic_test_utils.h"
48#include "net/socket/client_socket_factory.h"
49#include "net/socket/mock_client_socket_pool_manager.h"
tbansalca83c002016-04-28 20:56:2850#include "net/socket/socket_performance_watcher.h"
51#include "net/socket/socket_performance_watcher_factory.h"
[email protected]61a527782013-02-21 03:58:0052#include "net/socket/socket_test_util.h"
53#include "net/socket/ssl_client_socket.h"
54#include "net/spdy/spdy_frame_builder.h"
55#include "net/spdy/spdy_framer.h"
[email protected]536fd0b2013-03-14 17:41:5756#include "net/ssl/ssl_config_service_defaults.h"
bnc508835902015-05-12 20:10:2957#include "net/test/cert_test_util.h"
[email protected]61a527782013-02-21 03:58:0058#include "testing/gtest/include/gtest/gtest.h"
59#include "testing/platform_test.h"
zhongyi3d4a55e72016-04-22 20:36:4660#include "url/gurl.h"
[email protected]61a527782013-02-21 03:58:0061
bnc508835902015-05-12 20:10:2962namespace net {
63namespace test {
[email protected]61a527782013-02-21 03:58:0064
65namespace {
66
bnc359ed2a2016-04-29 20:43:4567enum DestinationType {
68 // In pooling tests with two requests for different origins to the same
69 // destination, the destination should be
70 SAME_AS_FIRST, // the same as the first origin,
71 SAME_AS_SECOND, // the same as the second origin, or
72 DIFFERENT, // different from both.
73};
74
rchf114d982015-10-21 01:34:5675static const char kQuicAlternativeServiceHeader[] =
bncc958faa2015-07-31 18:14:5276 "Alt-Svc: quic=\":443\"\r\n\r\n";
rchf47265dc2016-03-21 21:33:1277static const char kQuicAlternativeServiceWithProbabilityHeader[] =
78 "Alt-Svc: quic=\":443\";p=\".5\"\r\n\r\n";
rchf114d982015-10-21 01:34:5679static const char kQuicAlternativeServiceDifferentPortHeader[] =
80 "Alt-Svc: quic=\":137\"\r\n\r\n";
[email protected]1e960032013-12-20 19:00:2081
rch9ae5b3b2016-02-11 00:36:2982const char kDefaultServerHostName[] = "mail.example.org";
bnc359ed2a2016-04-29 20:43:4583const char kDifferentHostname[] = "different.example.com";
84
85// Run QuicNetworkTransactionWithDestinationTest instances with all value
86// combinations of version and destination_type.
87struct PoolingTestParams {
88 friend std::ostream& operator<<(std::ostream& os,
89 const PoolingTestParams& p) {
90 os << "{ version: " << QuicVersionToString(p.version)
91 << ", destination_type: ";
92 switch (p.destination_type) {
93 case SAME_AS_FIRST:
94 os << "SAME_AS_FIRST";
95 break;
96 case SAME_AS_SECOND:
97 os << "SAME_AS_SECOND";
98 break;
99 case DIFFERENT:
100 os << "DIFFERENT";
101 break;
102 }
103 os << " }";
104 return os;
105 }
106
107 QuicVersion version;
108 DestinationType destination_type;
109};
110
111std::vector<PoolingTestParams> GetPoolingTestParams() {
112 std::vector<PoolingTestParams> params;
113 QuicVersionVector all_supported_versions = QuicSupportedVersions();
114 for (const QuicVersion version : all_supported_versions) {
115 params.push_back(PoolingTestParams{version, SAME_AS_FIRST});
116 params.push_back(PoolingTestParams{version, SAME_AS_SECOND});
117 params.push_back(PoolingTestParams{version, DIFFERENT});
118 }
119 return params;
120}
bncb07c05532015-05-14 19:07:20121
[email protected]61a527782013-02-21 03:58:00122} // namespace
123
[email protected]1e960032013-12-20 19:00:20124// Helper class to encapsulate MockReads and MockWrites for QUIC.
125// Simplify ownership issues and the interaction with the MockSocketFactory.
126class MockQuicData {
127 public:
rtennetia004d332015-08-28 06:44:57128 MockQuicData() : packet_number_(0) {}
rcha5399e02015-04-21 19:32:04129
rjshaded5ced072015-12-18 19:26:02130 ~MockQuicData() { STLDeleteElements(&packets_); }
[email protected]1e960032013-12-20 19:00:20131
danakjad1777e2016-04-16 00:56:42132 void AddSynchronousRead(std::unique_ptr<QuicEncryptedPacket> packet) {
[email protected]1e960032013-12-20 19:00:20133 reads_.push_back(MockRead(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:57134 packet_number_++));
[email protected]1e960032013-12-20 19:00:20135 packets_.push_back(packet.release());
136 }
137
danakjad1777e2016-04-16 00:56:42138 void AddRead(std::unique_ptr<QuicEncryptedPacket> packet) {
rcha5399e02015-04-21 19:32:04139 reads_.push_back(
rtennetia004d332015-08-28 06:44:57140 MockRead(ASYNC, packet->data(), packet->length(), packet_number_++));
rcha5399e02015-04-21 19:32:04141 packets_.push_back(packet.release());
142 }
143
[email protected]1e960032013-12-20 19:00:20144 void AddRead(IoMode mode, int rv) {
rtennetia004d332015-08-28 06:44:57145 reads_.push_back(MockRead(mode, rv, packet_number_++));
[email protected]1e960032013-12-20 19:00:20146 }
147
danakjad1777e2016-04-16 00:56:42148 void AddWrite(std::unique_ptr<QuicEncryptedPacket> packet) {
[email protected]1e960032013-12-20 19:00:20149 writes_.push_back(MockWrite(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:57150 packet_number_++));
[email protected]1e960032013-12-20 19:00:20151 packets_.push_back(packet.release());
152 }
153
rcha5399e02015-04-21 19:32:04154 void AddSocketDataToFactory(MockClientSocketFactory* factory) {
rjshaded5ced072015-12-18 19:26:02155 MockRead* reads = reads_.empty() ? nullptr : &reads_[0];
156 MockWrite* writes = writes_.empty() ? nullptr : &writes_[0];
rcha5399e02015-04-21 19:32:04157 socket_data_.reset(
158 new SequencedSocketData(reads, reads_.size(), writes, writes_.size()));
[email protected]1e960032013-12-20 19:00:20159 factory->AddSocketDataProvider(socket_data_.get());
160 }
161
mmenkee24011922015-12-17 22:12:59162 void Resume() { socket_data_->Resume(); }
rchb27683c2015-07-29 23:53:50163
[email protected]1e960032013-12-20 19:00:20164 private:
165 std::vector<QuicEncryptedPacket*> packets_;
166 std::vector<MockWrite> writes_;
167 std::vector<MockRead> reads_;
rtennetia004d332015-08-28 06:44:57168 size_t packet_number_;
danakjad1777e2016-04-16 00:56:42169 std::unique_ptr<SequencedSocketData> socket_data_;
[email protected]1e960032013-12-20 19:00:20170};
171
ryansturm49a8cb12016-06-15 16:51:09172class HeadersHandler {
tbansal7cec3812015-02-05 21:25:12173 public:
ryansturm49a8cb12016-06-15 16:51:09174 HeadersHandler() : was_proxied_(false) {}
tbansal7cec3812015-02-05 21:25:12175
ryansturm49a8cb12016-06-15 16:51:09176 bool was_proxied() { return was_proxied_; }
tbansal7cec3812015-02-05 21:25:12177
ryansturm49a8cb12016-06-15 16:51:09178 void OnBeforeHeadersSent(const ProxyInfo& proxy_info,
179 HttpRequestHeaders* request_headers) {
180 if (!proxy_info.is_http() && !proxy_info.is_https() &&
181 !proxy_info.is_quic()) {
182 return;
183 }
184 was_proxied_ = true;
tbansal7cec3812015-02-05 21:25:12185 }
186
187 private:
ryansturm49a8cb12016-06-15 16:51:09188 bool was_proxied_;
tbansal7cec3812015-02-05 21:25:12189};
190
tbansal0f56a39a2016-04-07 22:03:38191class TestSocketPerformanceWatcher : public SocketPerformanceWatcher {
tbansalfdf5665b2015-09-21 22:46:40192 public:
tbansal0f56a39a2016-04-07 22:03:38193 explicit TestSocketPerformanceWatcher(bool* rtt_notification_received)
194 : rtt_notification_received_(rtt_notification_received) {}
195 ~TestSocketPerformanceWatcher() override {}
tbansalfdf5665b2015-09-21 22:46:40196
tbansal0f56a39a2016-04-07 22:03:38197 bool ShouldNotifyUpdatedRTT() const override { return true; }
tbansalfdf5665b2015-09-21 22:46:40198
tbansal0f56a39a2016-04-07 22:03:38199 void OnUpdatedRTTAvailable(const base::TimeDelta& rtt) override {
200 *rtt_notification_received_ = true;
201 }
202
203 void OnConnectionChanged() override {}
204
205 private:
206 bool* rtt_notification_received_;
207
208 DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcher);
209};
210
211class TestSocketPerformanceWatcherFactory
212 : public SocketPerformanceWatcherFactory {
213 public:
214 TestSocketPerformanceWatcherFactory()
215 : watcher_count_(0u), rtt_notification_received_(false) {}
216 ~TestSocketPerformanceWatcherFactory() override {}
217
218 // SocketPerformanceWatcherFactory implementation:
danakjad1777e2016-04-16 00:56:42219 std::unique_ptr<SocketPerformanceWatcher> CreateSocketPerformanceWatcher(
tbansalc8a94ea2015-11-02 23:58:51220 const Protocol protocol) override {
221 if (protocol != PROTOCOL_QUIC) {
tbansal0f56a39a2016-04-07 22:03:38222 return nullptr;
tbansalc8a94ea2015-11-02 23:58:51223 }
224 ++watcher_count_;
danakjad1777e2016-04-16 00:56:42225 return std::unique_ptr<SocketPerformanceWatcher>(
tbansal0f56a39a2016-04-07 22:03:38226 new TestSocketPerformanceWatcher(&rtt_notification_received_));
tbansalfdf5665b2015-09-21 22:46:40227 }
228
tbansalc8a94ea2015-11-02 23:58:51229 size_t watcher_count() const { return watcher_count_; }
tbansalfdf5665b2015-09-21 22:46:40230
tbansalc8a94ea2015-11-02 23:58:51231 bool rtt_notification_received() const { return rtt_notification_received_; }
232
tbansalc8a94ea2015-11-02 23:58:51233 private:
tbansal0f56a39a2016-04-07 22:03:38234 size_t watcher_count_;
tbansalc8a94ea2015-11-02 23:58:51235 bool rtt_notification_received_;
tbansal0f56a39a2016-04-07 22:03:38236
237 DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcherFactory);
tbansalc8a94ea2015-11-02 23:58:51238};
239
[email protected]1e960032013-12-20 19:00:20240class QuicNetworkTransactionTest
241 : public PlatformTest,
[email protected]5d03bbd2014-03-07 16:19:16242 public ::testing::WithParamInterface<QuicVersion> {
[email protected]61a527782013-02-21 03:58:00243 protected:
[email protected]1c04f9522013-02-21 20:32:43244 QuicNetworkTransactionTest()
rtenneti4b06ae72014-08-26 03:43:43245 : clock_(new MockClock),
alyssar2adf3ac2016-05-03 17:12:58246 client_maker_(GetParam(),
247 0,
248 clock_,
249 kDefaultServerHostName,
250 Perspective::IS_CLIENT),
251 server_maker_(GetParam(),
252 0,
253 clock_,
254 kDefaultServerHostName,
255 Perspective::IS_SERVER),
rtenneti052774e2015-11-24 21:00:12256 cert_transparency_verifier_(new MultiLogCTVerifier()),
[email protected]1c04f9522013-02-21 20:32:43257 ssl_config_service_(new SSLConfigServiceDefaults),
258 proxy_service_(ProxyService::CreateDirect()),
259 auth_handler_factory_(
[email protected]dda75ab2013-06-22 22:43:30260 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
[email protected]457d6952013-12-13 09:24:58261 random_generator_(0),
rchf114d982015-10-21 01:34:56262 ssl_data_(ASYNC, OK) {
[email protected]aa9b14d2013-05-10 23:45:19263 request_.method = "GET";
rchf114d982015-10-21 01:34:56264 std::string url("https://");
bncb07c05532015-05-14 19:07:20265 url.append(kDefaultServerHostName);
266 request_.url = GURL(url);
[email protected]aa9b14d2013-05-10 23:45:19267 request_.load_flags = 0;
[email protected]98a9d1252014-04-04 00:43:59268 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
rchf114d982015-10-21 01:34:56269
rch3f4b8452016-02-23 16:59:32270 params_.enable_alternative_service_with_different_host = true;
bnce3dd56f2016-06-01 10:37:11271 params_.enable_alternative_service_for_insecure_origins = true;
rch3f4b8452016-02-23 16:59:32272
rchf114d982015-10-21 01:34:56273 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29274 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
rchf114d982015-10-21 01:34:56275 verify_details_.cert_verify_result.verified_cert = cert;
276 verify_details_.cert_verify_result.is_issued_by_known_root = true;
277 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
[email protected]1c04f9522013-02-21 20:32:43278 }
[email protected]61a527782013-02-21 03:58:00279
dcheng67be2b1f2014-10-27 21:47:29280 void SetUp() override {
[email protected]61a527782013-02-21 03:58:00281 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:55282 base::RunLoop().RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00283 }
284
dcheng67be2b1f2014-10-27 21:47:29285 void TearDown() override {
[email protected]61a527782013-02-21 03:58:00286 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
287 // Empty the current queue.
fdoray92e35a72016-06-10 15:54:55288 base::RunLoop().RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00289 PlatformTest::TearDown();
290 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:55291 base::RunLoop().RunUntilIdle();
bnc525e175a2016-06-20 12:36:40292 session_.reset();
[email protected]61a527782013-02-21 03:58:00293 }
294
alyssar2adf3ac2016-05-03 17:12:58295 std::unique_ptr<QuicEncryptedPacket> ConstructClientConnectionClosePacket(
rtennetia004d332015-08-28 06:44:57296 QuicPacketNumber num) {
alyssar2adf3ac2016-05-03 17:12:58297 return client_maker_.MakeConnectionClosePacket(num);
[email protected]3316d422013-05-03 21:45:30298 }
299
alyssar2adf3ac2016-05-03 17:12:58300 std::unique_ptr<QuicEncryptedPacket> ConstructServerConnectionClosePacket(
301 QuicPacketNumber num) {
302 return server_maker_.MakeConnectionClosePacket(num);
303 }
304
305 std::unique_ptr<QuicEncryptedPacket> ConstructServerGoAwayPacket(
zhongyi6b5a3892016-03-12 04:46:20306 QuicPacketNumber num,
307 QuicErrorCode error_code,
308 std::string reason_phrase) {
alyssar2adf3ac2016-05-03 17:12:58309 return server_maker_.MakeGoAwayPacket(num, error_code, reason_phrase);
zhongyi6b5a3892016-03-12 04:46:20310 }
311
alyssar2adf3ac2016-05-03 17:12:58312 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
rtennetia004d332015-08-28 06:44:57313 QuicPacketNumber largest_received,
314 QuicPacketNumber least_unacked) {
alyssar2adf3ac2016-05-03 17:12:58315 return client_maker_.MakeAckPacket(2, largest_received, least_unacked,
316 least_unacked, true);
zhongyi32569c62016-01-08 02:54:30317 }
318
alyssar2adf3ac2016-05-03 17:12:58319 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckAndRstPacket(
zhongyi6b5a3892016-03-12 04:46:20320 QuicPacketNumber num,
321 QuicStreamId stream_id,
322 QuicRstStreamErrorCode error_code,
323 QuicPacketNumber largest_received,
324 QuicPacketNumber ack_least_unacked,
325 QuicPacketNumber stop_least_unacked) {
alyssar2adf3ac2016-05-03 17:12:58326 return client_maker_.MakeAckAndRstPacket(
327 num, false, stream_id, error_code, largest_received, ack_least_unacked,
328 stop_least_unacked, true);
zhongyi6b5a3892016-03-12 04:46:20329 }
330
alyssar2adf3ac2016-05-03 17:12:58331 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
zhongyi32569c62016-01-08 02:54:30332 QuicPacketNumber largest_received,
333 QuicPacketNumber least_unacked,
334 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:58335 return client_maker_.MakeAckPacket(2, largest_received, least_unacked,
336 least_unacked, true);
zhongyi32569c62016-01-08 02:54:30337 }
338
alyssar2adf3ac2016-05-03 17:12:58339 std::unique_ptr<QuicEncryptedPacket>
340 ConstructClientAckAndConnectionClosePacket(
zhongyi32569c62016-01-08 02:54:30341 QuicPacketNumber packet_number,
342 QuicPacketNumber largest_received,
343 QuicPacketNumber ack_least_unacked,
344 QuicPacketNumber stop_least_unacked) {
alyssar2adf3ac2016-05-03 17:12:58345 return client_maker_.MakeAckPacket(packet_number, largest_received,
346 ack_least_unacked, stop_least_unacked,
347 true);
[email protected]1e960032013-12-20 19:00:20348 }
[email protected]61a527782013-02-21 03:58:00349
alyssar2adf3ac2016-05-03 17:12:58350 std::unique_ptr<QuicEncryptedPacket>
351 ConstructClientAckAndConnectionClosePacket(
zhongyica364fbb2015-12-12 03:39:12352 QuicPacketNumber num,
353 QuicTime::Delta delta_time_largest_observed,
354 QuicPacketNumber largest_received,
355 QuicPacketNumber least_unacked,
356 QuicErrorCode quic_error,
bnc912a04b2016-04-20 14:19:50357 const std::string& quic_error_details) {
alyssar2adf3ac2016-05-03 17:12:58358 return client_maker_.MakeAckAndConnectionClosePacket(
zhongyica364fbb2015-12-12 03:39:12359 num, false, delta_time_largest_observed, largest_received,
360 least_unacked, quic_error, quic_error_details);
361 }
362
alyssar2adf3ac2016-05-03 17:12:58363 std::unique_ptr<QuicEncryptedPacket> ConstructServerRstPacket(
zhongyica364fbb2015-12-12 03:39:12364 QuicPacketNumber num,
365 bool include_version,
366 QuicStreamId stream_id,
367 QuicRstStreamErrorCode error_code) {
alyssar2adf3ac2016-05-03 17:12:58368 return server_maker_.MakeRstPacket(num, include_version, stream_id,
369 error_code);
zhongyica364fbb2015-12-12 03:39:12370 }
371
zhongyi32569c62016-01-08 02:54:30372 // Uses default QuicTestPacketMaker.
[email protected]1e960032013-12-20 19:00:20373 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
374 const std::string& scheme,
375 const std::string& path) {
alyssar2adf3ac2016-05-03 17:12:58376 return GetRequestHeaders(method, scheme, path, &client_maker_);
zhongyi32569c62016-01-08 02:54:30377 }
378
379 // Uses customized QuicTestPacketMaker.
380 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
381 const std::string& scheme,
382 const std::string& path,
bnc912a04b2016-04-20 14:19:50383 QuicTestPacketMaker* maker) {
384 return maker->GetRequestHeaders(method, scheme, path);
[email protected]61a527782013-02-21 03:58:00385 }
386
[email protected]1e960032013-12-20 19:00:20387 SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
alyssar2adf3ac2016-05-03 17:12:58388 return server_maker_.GetResponseHeaders(status);
[email protected]61a527782013-02-21 03:58:00389 }
390
zhongyi32569c62016-01-08 02:54:30391 // Appends alt_svc headers in the response headers.
392 SpdyHeaderBlock GetResponseHeaders(const std::string& status,
393 const std::string& alt_svc) {
alyssar2adf3ac2016-05-03 17:12:58394 return server_maker_.GetResponseHeaders(status, alt_svc);
zhongyi32569c62016-01-08 02:54:30395 }
396
alyssar2adf3ac2016-05-03 17:12:58397 std::unique_ptr<QuicEncryptedPacket> ConstructServerDataPacket(
rtennetia004d332015-08-28 06:44:57398 QuicPacketNumber packet_number,
[email protected]98b20ce2013-05-10 05:55:26399 QuicStreamId stream_id,
[email protected]e8ff26842013-03-22 21:02:05400 bool should_include_version,
[email protected]61a527782013-02-21 03:58:00401 bool fin,
402 QuicStreamOffset offset,
403 base::StringPiece data) {
alyssar2adf3ac2016-05-03 17:12:58404 return server_maker_.MakeDataPacket(
405 packet_number, stream_id, should_include_version, fin, offset, data);
[email protected]61a527782013-02-21 03:58:00406 }
407
alyssar2adf3ac2016-05-03 17:12:58408 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
rtennetia004d332015-08-28 06:44:57409 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20410 QuicStreamId stream_id,
411 bool should_include_version,
412 bool fin,
zhongyi32569c62016-01-08 02:54:30413 const SpdyHeaderBlock& headers,
414 QuicStreamOffset* offset) {
ianswett0888cff2015-11-24 17:42:16415 SpdyPriority priority =
rtennetif4bdb542015-01-21 14:33:05416 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
alyssar2adf3ac2016-05-03 17:12:58417 return client_maker_.MakeRequestHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30418 packet_number, stream_id, should_include_version, fin, priority,
419 headers, offset);
420 }
421
alyssar2adf3ac2016-05-03 17:12:58422 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30423 QuicPacketNumber packet_number,
424 QuicStreamId stream_id,
425 bool should_include_version,
426 bool fin,
427 const SpdyHeaderBlock& headers,
428 QuicStreamOffset* offset,
429 QuicTestPacketMaker* maker) {
430 SpdyPriority priority =
431 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
alyssar2adf3ac2016-05-03 17:12:58432 return client_maker_.MakeRequestHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30433 packet_number, stream_id, should_include_version, fin, priority,
434 headers, offset);
435 }
436
alyssar2adf3ac2016-05-03 17:12:58437 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30438 QuicPacketNumber packet_number,
439 QuicStreamId stream_id,
440 bool should_include_version,
441 bool fin,
442 const SpdyHeaderBlock& headers) {
alyssar2adf3ac2016-05-03 17:12:58443 return ConstructClientRequestHeadersPacket(
444 packet_number, stream_id, should_include_version, fin, headers, nullptr,
445 &client_maker_);
zhongyi32569c62016-01-08 02:54:30446 }
alyssar2adf3ac2016-05-03 17:12:58447 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30448 QuicPacketNumber packet_number,
449 QuicStreamId stream_id,
450 bool should_include_version,
451 bool fin,
452 const SpdyHeaderBlock& headers,
453 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:58454 return ConstructClientRequestHeadersPacket(packet_number, stream_id,
455 should_include_version, fin,
456 headers, nullptr, maker);
[email protected]61a527782013-02-21 03:58:00457 }
458
alyssar2adf3ac2016-05-03 17:12:58459 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
rtennetia004d332015-08-28 06:44:57460 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20461 QuicStreamId stream_id,
462 bool should_include_version,
463 bool fin,
464 const SpdyHeaderBlock& headers) {
alyssar2adf3ac2016-05-03 17:12:58465 return ConstructServerResponseHeadersPacket(
466 packet_number, stream_id, should_include_version, fin, headers, nullptr,
467 &server_maker_);
zhongyi32569c62016-01-08 02:54:30468 }
469
alyssar2adf3ac2016-05-03 17:12:58470 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30471 QuicPacketNumber packet_number,
472 QuicStreamId stream_id,
473 bool should_include_version,
474 bool fin,
475 const SpdyHeaderBlock& headers,
476 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:58477 return ConstructServerResponseHeadersPacket(packet_number, stream_id,
478 should_include_version, fin,
479 headers, nullptr, maker);
zhongyi32569c62016-01-08 02:54:30480 }
481
alyssar2adf3ac2016-05-03 17:12:58482 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30483 QuicPacketNumber packet_number,
484 QuicStreamId stream_id,
485 bool should_include_version,
486 bool fin,
487 const SpdyHeaderBlock& headers,
488 QuicStreamOffset* offset) {
alyssar2adf3ac2016-05-03 17:12:58489 return server_maker_.MakeResponseHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30490 packet_number, stream_id, should_include_version, fin, headers, offset);
491 }
492
alyssar2adf3ac2016-05-03 17:12:58493 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30494 QuicPacketNumber packet_number,
495 QuicStreamId stream_id,
496 bool should_include_version,
497 bool fin,
498 const SpdyHeaderBlock& headers,
499 QuicStreamOffset* offset,
500 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:58501 return server_maker_.MakeResponseHeadersPacketWithOffsetTracking(
zhongyi32569c62016-01-08 02:54:30502 packet_number, stream_id, should_include_version, fin, headers, offset);
[email protected]61a527782013-02-21 03:58:00503 }
504
bnc912a04b2016-04-20 14:19:50505 void CreateSession() {
[email protected]4dca587c2013-03-07 16:54:47506 params_.enable_quic = true;
507 params_.quic_clock = clock_;
508 params_.quic_random = &random_generator_;
bnc912a04b2016-04-20 14:19:50509 params_.client_socket_factory = &socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05510 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43511 params_.host_resolver = &host_resolver_;
512 params_.cert_verifier = &cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11513 params_.transport_security_state = &transport_security_state_;
rtenneti052774e2015-11-24 21:00:12514 params_.cert_transparency_verifier = cert_transparency_verifier_.get();
rsleevid6de8302016-06-21 01:33:20515 params_.ct_policy_enforcer = &ct_policy_enforcer_;
tbansalfdf5665b2015-09-21 22:46:40516 params_.socket_performance_watcher_factory =
tbansal0f56a39a2016-04-07 22:03:38517 &test_socket_performance_watcher_factory_;
[email protected]1c04f9522013-02-21 20:32:43518 params_.proxy_service = proxy_service_.get();
519 params_.ssl_config_service = ssl_config_service_.get();
520 params_.http_auth_handler_factory = auth_handler_factory_.get();
bnc525e175a2016-06-20 12:36:40521 params_.http_server_properties = &http_server_properties_;
[email protected]1e960032013-12-20 19:00:20522 params_.quic_supported_versions = SupportedVersions(GetParam());
rch74da0e1a2016-01-14 02:49:32523 for (const char* host :
rch9ae5b3b2016-02-11 00:36:29524 {kDefaultServerHostName, "www.example.org", "news.example.org",
525 "bar.example.org", "foo.example.org", "invalid.example.org",
526 "mail.example.com"}) {
rch74da0e1a2016-01-14 02:49:32527 params_.quic_host_whitelist.insert(host);
528 }
[email protected]61a527782013-02-21 03:58:00529
mmenkee65e7af2015-10-13 17:16:42530 session_.reset(new HttpNetworkSession(params_));
[email protected]11c05872013-08-20 02:04:12531 session_->quic_stream_factory()->set_require_confirmation(false);
rch185ebee2015-07-14 23:56:22532 ASSERT_EQ(params_.quic_socket_receive_buffer_size,
533 session_->quic_stream_factory()->socket_receive_buffer_size());
[email protected]61a527782013-02-21 03:58:00534 }
535
danakjad1777e2016-04-16 00:56:42536 void CheckWasQuicResponse(
537 const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19538 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42539 ASSERT_TRUE(response != nullptr);
540 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19541 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
542 EXPECT_TRUE(response->was_fetched_via_spdy);
543 EXPECT_TRUE(response->was_npn_negotiated);
544 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
545 response->connection_info);
546 }
547
danakjad1777e2016-04-16 00:56:42548 void CheckResponsePort(const std::unique_ptr<HttpNetworkTransaction>& trans,
Avi Drissman13fc8932015-12-20 04:40:46549 uint16_t port) {
bnc62a44f022015-04-02 15:59:41550 const HttpResponseInfo* response = trans->GetResponseInfo();
551 ASSERT_TRUE(response != nullptr);
552 EXPECT_EQ(port, response->socket_address.port());
553 }
554
danakjad1777e2016-04-16 00:56:42555 void CheckWasHttpResponse(
556 const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19557 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42558 ASSERT_TRUE(response != nullptr);
559 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19560 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
561 EXPECT_FALSE(response->was_fetched_via_spdy);
562 EXPECT_FALSE(response->was_npn_negotiated);
563 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1,
564 response->connection_info);
565 }
566
danakjad1777e2016-04-16 00:56:42567 void CheckResponseData(const std::unique_ptr<HttpNetworkTransaction>& trans,
[email protected]aa9b14d2013-05-10 23:45:19568 const std::string& expected) {
569 std::string response_data;
bncffc2fdf2015-05-14 18:29:49570 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
[email protected]aa9b14d2013-05-10 23:45:19571 EXPECT_EQ(expected, response_data);
572 }
573
danakjad1777e2016-04-16 00:56:42574 void RunTransaction(const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19575 TestCompletionCallback callback;
576 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
577 EXPECT_EQ(ERR_IO_PENDING, rv);
578 EXPECT_EQ(OK, callback.WaitForResult());
579 }
580
581 void SendRequestAndExpectHttpResponse(const std::string& expected) {
danakjad1777e2016-04-16 00:56:42582 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50583 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
bncffc2fdf2015-05-14 18:29:49584 RunTransaction(trans);
[email protected]aa9b14d2013-05-10 23:45:19585 CheckWasHttpResponse(trans);
bncffc2fdf2015-05-14 18:29:49586 CheckResponseData(trans, expected);
[email protected]aa9b14d2013-05-10 23:45:19587 }
588
589 void SendRequestAndExpectQuicResponse(const std::string& expected) {
rchf114d982015-10-21 01:34:56590 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, 443);
tbansal7cec3812015-02-05 21:25:12591 }
592
bnc62a44f022015-04-02 15:59:41593 void SendRequestAndExpectQuicResponseFromProxyOnPort(
594 const std::string& expected,
Avi Drissman13fc8932015-12-20 04:40:46595 uint16_t port) {
bnc62a44f022015-04-02 15:59:41596 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port);
[email protected]aa9b14d2013-05-10 23:45:19597 }
598
599 void AddQuicAlternateProtocolMapping(
600 MockCryptoClientStream::HandshakeMode handshake_mode) {
601 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
zhongyi3d4a55e72016-04-22 20:36:46602 url::SchemeHostPort server(request_.url);
603 AlternativeService alternative_service(QUIC, server.host(), 443);
bnc7dc7e1b42015-07-28 14:43:12604 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
zhongyi3d4a55e72016-04-22 20:36:46605 http_server_properties_.SetAlternativeService(server, alternative_service,
606 expiration);
[email protected]aa9b14d2013-05-10 23:45:19607 }
608
rchbe69cb902016-02-11 01:10:48609 void AddQuicRemoteAlternativeServiceMapping(
610 MockCryptoClientStream::HandshakeMode handshake_mode,
611 const HostPortPair& alternative) {
612 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
zhongyi3d4a55e72016-04-22 20:36:46613 url::SchemeHostPort server(request_.url);
rchbe69cb902016-02-11 01:10:48614 AlternativeService alternative_service(QUIC, alternative.host(),
615 alternative.port());
616 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
zhongyi3d4a55e72016-04-22 20:36:46617 http_server_properties_.SetAlternativeService(server, alternative_service,
618 expiration);
rchbe69cb902016-02-11 01:10:48619 }
620
[email protected]aa9b14d2013-05-10 23:45:19621 void ExpectBrokenAlternateProtocolMapping() {
zhongyi3d4a55e72016-04-22 20:36:46622 const url::SchemeHostPort server(request_.url);
bncd9b132e2015-07-08 05:16:10623 const AlternativeServiceVector alternative_service_vector =
zhongyi3d4a55e72016-04-22 20:36:46624 http_server_properties_.GetAlternativeServices(server);
bncd9b132e2015-07-08 05:16:10625 EXPECT_EQ(1u, alternative_service_vector.size());
bnc6be245c12015-05-15 11:24:07626 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken(
bncd9b132e2015-07-08 05:16:10627 alternative_service_vector[0]));
[email protected]aa9b14d2013-05-10 23:45:19628 }
629
[email protected]4d590c9c2014-05-02 05:14:33630 void ExpectQuicAlternateProtocolMapping() {
zhongyi3d4a55e72016-04-22 20:36:46631 const url::SchemeHostPort server(request_.url);
bncd9b132e2015-07-08 05:16:10632 const AlternativeServiceVector alternative_service_vector =
zhongyi3d4a55e72016-04-22 20:36:46633 http_server_properties_.GetAlternativeServices(server);
bncd9b132e2015-07-08 05:16:10634 EXPECT_EQ(1u, alternative_service_vector.size());
635 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
[email protected]4d590c9c2014-05-02 05:14:33636 }
637
[email protected]aa9b14d2013-05-10 23:45:19638 void AddHangingNonAlternateProtocolSocketData() {
danakjad1777e2016-04-16 00:56:42639 std::unique_ptr<StaticSocketDataProvider> hanging_data;
zhongyi32569c62016-01-08 02:54:30640 hanging_data.reset(new StaticSocketDataProvider());
[email protected]dda75ab2013-06-22 22:43:30641 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
zhongyi32569c62016-01-08 02:54:30642 hanging_data->set_connect_data(hanging_connect);
643 hanging_data_.push_back(std::move(hanging_data));
644 socket_factory_.AddSocketDataProvider(hanging_data_.back().get());
rchf114d982015-10-21 01:34:56645 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]aa9b14d2013-05-10 23:45:19646 }
647
rtenneti4b06ae72014-08-26 03:43:43648 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
alyssar2adf3ac2016-05-03 17:12:58649 QuicTestPacketMaker client_maker_;
650 QuicTestPacketMaker server_maker_;
danakjad1777e2016-04-16 00:56:42651 std::unique_ptr<HttpNetworkSession> session_;
[email protected]61a527782013-02-21 03:58:00652 MockClientSocketFactory socket_factory_;
rchf114d982015-10-21 01:34:56653 ProofVerifyDetailsChromium verify_details_;
[email protected]e8ff26842013-03-22 21:02:05654 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43655 MockHostResolver host_resolver_;
656 MockCertVerifier cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11657 TransportSecurityState transport_security_state_;
danakjad1777e2016-04-16 00:56:42658 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
rsleevid6de8302016-06-21 01:33:20659 CTPolicyEnforcer ct_policy_enforcer_;
tbansal0f56a39a2016-04-07 22:03:38660 TestSocketPerformanceWatcherFactory test_socket_performance_watcher_factory_;
[email protected]1c04f9522013-02-21 20:32:43661 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
danakjad1777e2016-04-16 00:56:42662 std::unique_ptr<ProxyService> proxy_service_;
663 std::unique_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
[email protected]61a527782013-02-21 03:58:00664 MockRandom random_generator_;
bnc6be245c12015-05-15 11:24:07665 HttpServerPropertiesImpl http_server_properties_;
[email protected]61a527782013-02-21 03:58:00666 HttpNetworkSession::Params params_;
[email protected]aa9b14d2013-05-10 23:45:19667 HttpRequestInfo request_;
vishal.b62985ca92015-04-17 08:45:51668 BoundTestNetLog net_log_;
danakjad1777e2016-04-16 00:56:42669 std::vector<std::unique_ptr<StaticSocketDataProvider>> hanging_data_;
rchf114d982015-10-21 01:34:56670 SSLSocketDataProvider ssl_data_;
tbansal7cec3812015-02-05 21:25:12671
672 private:
673 void SendRequestAndExpectQuicResponseMaybeFromProxy(
674 const std::string& expected,
bnc62a44f022015-04-02 15:59:41675 bool used_proxy,
Avi Drissman13fc8932015-12-20 04:40:46676 uint16_t port) {
danakjad1777e2016-04-16 00:56:42677 std::unique_ptr<HttpNetworkTransaction> trans(
tbansal7cec3812015-02-05 21:25:12678 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
ryansturm49a8cb12016-06-15 16:51:09679 HeadersHandler headers_handler;
680 trans->SetBeforeHeadersSentCallback(
681 base::Bind(&HeadersHandler::OnBeforeHeadersSent,
682 base::Unretained(&headers_handler)));
bncffc2fdf2015-05-14 18:29:49683 RunTransaction(trans);
tbansal7cec3812015-02-05 21:25:12684 CheckWasQuicResponse(trans);
bnc62a44f022015-04-02 15:59:41685 CheckResponsePort(trans, port);
bncffc2fdf2015-05-14 18:29:49686 CheckResponseData(trans, expected);
ryansturm49a8cb12016-06-15 16:51:09687 EXPECT_EQ(used_proxy, headers_handler.was_proxied());
tbansal7cec3812015-02-05 21:25:12688 }
[email protected]61a527782013-02-21 03:58:00689};
690
rjshaded5ced072015-12-18 19:26:02691INSTANTIATE_TEST_CASE_P(Version,
692 QuicNetworkTransactionTest,
[email protected]1e960032013-12-20 19:00:20693 ::testing::ValuesIn(QuicSupportedVersions()));
694
695TEST_P(QuicNetworkTransactionTest, ForceQuic) {
rtenneti8a2f4632016-03-21 20:26:57696 params_.origins_to_force_quic_on.insert(
697 HostPortPair::FromString("mail.example.org:443"));
[email protected]4dca587c2013-03-07 16:54:47698
[email protected]1e960032013-12-20 19:00:20699 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58700 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
701 1, kClientDataStreamId1, true, true,
702 GetRequestHeaders("GET", "https", "/")));
703 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:02704 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58705 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
706 false, true, 0, "hello!"));
707 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:59708 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
[email protected]4dca587c2013-03-07 16:54:47709
rcha5399e02015-04-21 19:32:04710 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4dca587c2013-03-07 16:54:47711
rtennetib8e80fb2016-05-16 00:12:09712 // The non-alternate protocol job needs to hang in order to guarantee that
713 // the alternate-protocol job will "win".
714 AddHangingNonAlternateProtocolSocketData();
715
rch3f4b8452016-02-23 16:59:32716 params_.enable_alternative_service_with_different_host = false;
[email protected]4dca587c2013-03-07 16:54:47717 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47718
tbansal0f56a39a2016-04-07 22:03:38719 EXPECT_FALSE(
720 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]aa9b14d2013-05-10 23:45:19721 SendRequestAndExpectQuicResponse("hello!");
tbansal0f56a39a2016-04-07 22:03:38722 EXPECT_TRUE(
723 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]4dca587c2013-03-07 16:54:47724
[email protected]98b20ce2013-05-10 05:55:26725 // Check that the NetLog was filled reasonably.
mmenke43758e62015-05-04 21:09:46726 TestNetLogEntry::List entries;
[email protected]aa9b14d2013-05-10 23:45:19727 net_log_.GetEntries(&entries);
[email protected]98b20ce2013-05-10 05:55:26728 EXPECT_LT(0u, entries.size());
729
730 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29731 int pos = ExpectLogContainsSomewhere(
732 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
733 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26734 EXPECT_LT(0, pos);
735
rchfd527212015-08-25 00:41:26736 // ... and also a TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29737 pos = ExpectLogContainsSomewhere(
rchfd527212015-08-25 00:41:26738 entries, 0,
739 NetLog::TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED,
ttuttle859dc7a2015-04-23 19:42:29740 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26741 EXPECT_LT(0, pos);
742
rtennetia004d332015-08-28 06:44:57743 std::string packet_number;
744 ASSERT_TRUE(entries[pos].GetStringValue("packet_number", &packet_number));
745 EXPECT_EQ("1", packet_number);
[email protected]98b20ce2013-05-10 05:55:26746
rchfd527212015-08-25 00:41:26747 // ... and also a TYPE_QUIC_SESSION_PACKET_AUTHENTICATED.
748 pos = ExpectLogContainsSomewhere(
749 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_AUTHENTICATED,
750 NetLog::PHASE_NONE);
751 EXPECT_LT(0, pos);
752
[email protected]98b20ce2013-05-10 05:55:26753 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29754 pos = ExpectLogContainsSomewhere(
755 entries, 0, NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
756 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26757 EXPECT_LT(0, pos);
758
759 int log_stream_id;
760 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
[email protected]1e960032013-12-20 19:00:20761 EXPECT_EQ(3, log_stream_id);
[email protected]4dca587c2013-03-07 16:54:47762}
763
[email protected]cf3e3cd62014-02-05 16:16:16764TEST_P(QuicNetworkTransactionTest, QuicProxy) {
tbansal9bf26672016-05-11 18:32:45765 params_.enable_quic = true;
rchf114d982015-10-21 01:34:56766 proxy_service_ =
rch9ae5b3b2016-02-11 00:36:29767 ProxyService::CreateFixedFromPacResult("QUIC mail.example.org:70");
[email protected]cf3e3cd62014-02-05 16:16:16768
[email protected]cf3e3cd62014-02-05 16:16:16769 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58770 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
771 1, kClientDataStreamId1, true, true,
772 GetRequestHeaders("GET", "http", "/")));
773 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:02774 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58775 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
776 false, true, 0, "hello!"));
777 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50778 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59779 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]cf3e3cd62014-02-05 16:16:16780
rcha5399e02015-04-21 19:32:04781 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cf3e3cd62014-02-05 16:16:16782
tbansal0f56a39a2016-04-07 22:03:38783 EXPECT_FALSE(
784 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16785 // There is no need to set up an alternate protocol job, because
786 // no attempt will be made to speak to the proxy over TCP.
787
rch9ae5b3b2016-02-11 00:36:29788 request_.url = GURL("http://mail.example.org/");
rch3f4b8452016-02-23 16:59:32789 params_.enable_alternative_service_with_different_host = false;
[email protected]cf3e3cd62014-02-05 16:16:16790 CreateSession();
791
bnc62a44f022015-04-02 15:59:41792 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
tbansal0f56a39a2016-04-07 22:03:38793 EXPECT_TRUE(
794 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16795}
796
bnc313ba9c2015-06-11 15:42:31797// Regression test for https://crbug.com/492458. Test that for an HTTP
798// connection through a QUIC proxy, the certificate exhibited by the proxy is
799// checked against the proxy hostname, not the origin hostname.
800TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) {
rch9ae5b3b2016-02-11 00:36:29801 const std::string origin_host = "mail.example.com";
bnc313ba9c2015-06-11 15:42:31802 const std::string proxy_host = "www.example.org";
803
tbansal9bf26672016-05-11 18:32:45804 params_.enable_quic = true;
rdsmith82957ad2015-09-16 19:42:03805 proxy_service_ =
806 ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70");
bnc313ba9c2015-06-11 15:42:31807
alyssar2adf3ac2016-05-03 17:12:58808 client_maker_.set_hostname(origin_host);
bnc313ba9c2015-06-11 15:42:31809 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58810 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
811 1, kClientDataStreamId1, true, true,
812 GetRequestHeaders("GET", "http", "/")));
813 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc313ba9c2015-06-11 15:42:31814 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58815 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
816 false, true, 0, "hello!"));
817 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50818 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59819 mock_quic_data.AddRead(ASYNC, 0);
bnc313ba9c2015-06-11 15:42:31820 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
821
822 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29823 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bnc313ba9c2015-06-11 15:42:31824 ASSERT_TRUE(cert.get());
825 // This certificate is valid for the proxy, but not for the origin.
826 bool common_name_fallback_used;
827 EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used));
828 EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used));
829 ProofVerifyDetailsChromium verify_details;
830 verify_details.cert_verify_result.verified_cert = cert;
831 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rchf114d982015-10-21 01:34:56832 ProofVerifyDetailsChromium verify_details2;
833 verify_details2.cert_verify_result.verified_cert = cert;
834 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
bnc313ba9c2015-06-11 15:42:31835
836 request_.url = GURL("http://" + origin_host);
rtennetib8e80fb2016-05-16 00:12:09837 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32838 CreateSession();
bnc313ba9c2015-06-11 15:42:31839 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
840 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
841}
842
rchbe69cb902016-02-11 01:10:48843TEST_P(QuicNetworkTransactionTest, AlternativeServicesDifferentHost) {
844 params_.enable_alternative_service_with_different_host = true;
845 HostPortPair origin("www.example.org", 443);
846 HostPortPair alternative("mail.example.org", 443);
847
848 base::FilePath certs_dir = GetTestCertsDirectory();
849 scoped_refptr<X509Certificate> cert(
850 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
851 ASSERT_TRUE(cert.get());
852 // TODO(rch): the connection should be "to" the origin, so if the cert is
853 // valid for the origin but not the alternative, that should work too.
854 bool common_name_fallback_used;
855 EXPECT_TRUE(cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
856 EXPECT_TRUE(
857 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
858 ProofVerifyDetailsChromium verify_details;
859 verify_details.cert_verify_result.verified_cert = cert;
860 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
861
alyssar2adf3ac2016-05-03 17:12:58862 client_maker_.set_hostname(origin.host());
rchbe69cb902016-02-11 01:10:48863 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58864 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
865 1, kClientDataStreamId1, true, true,
866 GetRequestHeaders("GET", "https", "/")));
867 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rchbe69cb902016-02-11 01:10:48868 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58869 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
870 false, true, 0, "hello!"));
871 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchbe69cb902016-02-11 01:10:48872 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
873 mock_quic_data.AddRead(ASYNC, 0);
874 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
875
876 request_.url = GURL("https://" + origin.host());
877 AddQuicRemoteAlternativeServiceMapping(
878 MockCryptoClientStream::CONFIRM_HANDSHAKE, alternative);
rtennetib8e80fb2016-05-16 00:12:09879 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32880 CreateSession();
rchbe69cb902016-02-11 01:10:48881
882 SendRequestAndExpectQuicResponse("hello!");
883}
884
[email protected]1e960032013-12-20 19:00:20885TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
rtenneti8a2f4632016-03-21 20:26:57886 params_.origins_to_force_quic_on.insert(
887 HostPortPair::FromString("mail.example.org:443"));
[email protected]cebe3282013-05-22 23:49:30888
tbansalfdf5665b2015-09-21 22:46:40889 MockQuicData mock_quic_data1;
890 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
[email protected]1e960032013-12-20 19:00:20891
tbansalfdf5665b2015-09-21 22:46:40892 MockQuicData mock_quic_data2;
zhongyi32569c62016-01-08 02:54:30893 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40894 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
rch6faa4d42016-01-05 20:48:43895 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40896
897 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
898 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
[email protected]cebe3282013-05-22 23:49:30899
rch3f4b8452016-02-23 16:59:32900 params_.enable_alternative_service_with_different_host = false;
[email protected]cebe3282013-05-22 23:49:30901 CreateSession();
902
tbansal0f56a39a2016-04-07 22:03:38903 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40904 for (size_t i = 0; i < 2; ++i) {
danakjad1777e2016-04-16 00:56:42905 std::unique_ptr<HttpNetworkTransaction> trans(
tbansalfdf5665b2015-09-21 22:46:40906 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
907 TestCompletionCallback callback;
908 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
909 EXPECT_EQ(ERR_IO_PENDING, rv);
910 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
tbansal0f56a39a2016-04-07 22:03:38911 EXPECT_EQ(1 + i, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40912 }
[email protected]cebe3282013-05-22 23:49:30913}
914
tbansalc8a94ea2015-11-02 23:58:51915TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
916 // Attempt to "force" quic on 443, which will not be honored.
rtenneti8a2f4632016-03-21 20:26:57917 params_.origins_to_force_quic_on.insert(
918 HostPortPair::FromString("www.google.com:443"));
tbansalc8a94ea2015-11-02 23:58:51919
920 MockRead http_reads[] = {
921 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
922 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
923 MockRead(ASYNC, OK)};
924
925 StaticSocketDataProvider data(http_reads, arraysize(http_reads), nullptr, 0);
926 socket_factory_.AddSocketDataProvider(&data);
927 SSLSocketDataProvider ssl(ASYNC, OK);
928 socket_factory_.AddSSLSocketDataProvider(&ssl);
929
rch3f4b8452016-02-23 16:59:32930 params_.enable_alternative_service_with_different_host = false;
tbansalc8a94ea2015-11-02 23:58:51931 CreateSession();
932
933 SendRequestAndExpectHttpResponse("hello world");
tbansal0f56a39a2016-04-07 22:03:38934 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalc8a94ea2015-11-02 23:58:51935}
936
bncc958faa2015-07-31 18:14:52937TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52938 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56939 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
940 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52941 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
942 MockRead(ASYNC, OK)};
943
944 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
945 0);
946 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56947 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52948
949 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58950 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
951 1, kClientDataStreamId1, true, true,
952 GetRequestHeaders("GET", "https", "/")));
953 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:52954 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58955 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
956 false, true, 0, "hello!"));
957 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:52958 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59959 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52960
961 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
962
rtennetib8e80fb2016-05-16 00:12:09963 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32964 CreateSession();
bncc958faa2015-07-31 18:14:52965
966 SendRequestAndExpectHttpResponse("hello world");
967 SendRequestAndExpectQuicResponse("hello!");
968}
969
rchf47265dc2016-03-21 21:33:12970TEST_P(QuicNetworkTransactionTest,
971 UseAlternativeServiceWithProbabilityForQuic) {
972 MockRead http_reads[] = {
973 MockRead("HTTP/1.1 200 OK\r\n"),
974 MockRead(kQuicAlternativeServiceWithProbabilityHeader),
975 MockRead("hello world"),
976 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
977 MockRead(ASYNC, OK)};
978
979 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
980 0);
981 socket_factory_.AddSocketDataProvider(&http_data);
982 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
983
984 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:58985 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
986 1, kClientDataStreamId1, true, true,
987 GetRequestHeaders("GET", "https", "/")));
988 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rchf47265dc2016-03-21 21:33:12989 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:58990 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
991 false, true, 0, "hello!"));
992 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchf47265dc2016-03-21 21:33:12993 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
994 mock_quic_data.AddRead(ASYNC, 0); // EOF
995
996 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
997
rtennetib8e80fb2016-05-16 00:12:09998 AddHangingNonAlternateProtocolSocketData();
rchf47265dc2016-03-21 21:33:12999 CreateSession();
1000
1001 SendRequestAndExpectHttpResponse("hello world");
1002 SendRequestAndExpectQuicResponse("hello!");
1003}
1004
zhongyi3d4a55e72016-04-22 20:36:461005TEST_P(QuicNetworkTransactionTest, SetAlternativeServiceWithScheme) {
1006 MockRead http_reads[] = {
1007 MockRead("HTTP/1.1 200 OK\r\n"),
1008 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
1009 MockRead("hello world"),
1010 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1011 MockRead(ASYNC, OK)};
1012
1013 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1014 0);
1015
1016 socket_factory_.AddSocketDataProvider(&http_data);
1017 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1018
1019 CreateSession();
1020 // Send http request, ignore alternative service advertising if response
1021 // header advertises alternative service for mail.example.org.
1022 request_.url = GURL("http://mail.example.org:443");
1023 SendRequestAndExpectHttpResponse("hello world");
bnc525e175a2016-06-20 12:36:401024 HttpServerProperties* http_server_properties =
zhongyi3d4a55e72016-04-22 20:36:461025 session_->http_server_properties();
1026 url::SchemeHostPort http_server("http", "mail.example.org", 443);
1027 url::SchemeHostPort https_server("https", "mail.example.org", 443);
1028 // Check alternative service is set for the correct origin.
1029 EXPECT_EQ(2u,
1030 http_server_properties->GetAlternativeServices(http_server).size());
1031 EXPECT_EQ(
1032 0u, http_server_properties->GetAlternativeServices(https_server).size());
1033}
1034
1035TEST_P(QuicNetworkTransactionTest, DoNotGetAltSvcForDifferentOrigin) {
1036 MockRead http_reads[] = {
1037 MockRead("HTTP/1.1 200 OK\r\n"),
1038 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
1039 MockRead("hello world"),
1040 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1041 MockRead(ASYNC, OK)};
1042
1043 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1044 0);
1045
1046 socket_factory_.AddSocketDataProvider(&http_data);
1047 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1048 socket_factory_.AddSocketDataProvider(&http_data);
1049 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1050
1051 CreateSession();
1052
1053 // Send https request and set alternative services if response header
1054 // advertises alternative service for mail.example.org.
1055 SendRequestAndExpectHttpResponse("hello world");
bnc525e175a2016-06-20 12:36:401056 HttpServerProperties* http_server_properties =
zhongyi3d4a55e72016-04-22 20:36:461057 session_->http_server_properties();
1058
1059 const url::SchemeHostPort https_server(request_.url);
1060 // Check alternative service is set.
1061 AlternativeServiceVector alternative_service_vector =
1062 http_server_properties->GetAlternativeServices(https_server);
1063 EXPECT_EQ(2u, alternative_service_vector.size());
1064
1065 // Send http request to the same origin but with diffrent scheme, should not
1066 // use QUIC.
1067 request_.url = GURL("http://mail.example.org:443");
1068 SendRequestAndExpectHttpResponse("hello world");
1069}
1070
bnc8be55ebb2015-10-30 14:12:071071TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) {
1072 std::string altsvc_header = base::StringPrintf(
1073 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam());
1074 MockRead http_reads[] = {
1075 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1076 MockRead("hello world"),
1077 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1078 MockRead(ASYNC, OK)};
1079
1080 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1081 0);
1082 socket_factory_.AddSocketDataProvider(&http_data);
1083 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1084
1085 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581086 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1087 1, kClientDataStreamId1, true, true,
1088 GetRequestHeaders("GET", "https", "/")));
1089 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc8be55ebb2015-10-30 14:12:071090 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581091 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1092 false, true, 0, "hello!"));
1093 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bnc8be55ebb2015-10-30 14:12:071094 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591095 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc8be55ebb2015-10-30 14:12:071096
1097 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1098
rtennetib8e80fb2016-05-16 00:12:091099 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321100 CreateSession();
bnc8be55ebb2015-10-30 14:12:071101
1102 SendRequestAndExpectHttpResponse("hello world");
1103 SendRequestAndExpectQuicResponse("hello!");
1104}
1105
zhongyi6b5a3892016-03-12 04:46:201106TEST_P(QuicNetworkTransactionTest, GoAwayWithConnectionMigrationOnPortsOnly) {
1107 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581108 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1109 1, kClientDataStreamId1, true, true,
1110 GetRequestHeaders("GET", "https", "/")));
1111 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi6b5a3892016-03-12 04:46:201112 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1113 // Read a GoAway packet with
1114 // QuicErrorCode: QUIC_ERROR_MIGRATING_PORT from the peer.
alyssar2adf3ac2016-05-03 17:12:581115 mock_quic_data.AddRead(ConstructServerGoAwayPacket(
1116 2, QUIC_ERROR_MIGRATING_PORT,
1117 "connection migration with port change only"));
1118 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
1119 mock_quic_data.AddRead(ConstructServerDataPacket(3, kClientDataStreamId1,
1120 false, true, 0, "hello!"));
1121 mock_quic_data.AddWrite(ConstructClientAckAndRstPacket(
zhongyi6b5a3892016-03-12 04:46:201122 3, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 3, 3, 1));
1123 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1124 mock_quic_data.AddRead(ASYNC, 0); // EOF
1125
1126 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1127
1128 // The non-alternate protocol job needs to hang in order to guarantee that
1129 // the alternate-protocol job will "win".
1130 AddHangingNonAlternateProtocolSocketData();
1131
1132 // In order for a new QUIC session to be established via alternate-protocol
1133 // without racing an HTTP connection, we need the host resolution to happen
1134 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1135 // connection to the the server, in this test we require confirmation
1136 // before encrypting so the HTTP job will still start.
1137 host_resolver_.set_synchronous_mode(true);
1138 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1139 "");
1140 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1141 AddressList address;
1142 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1143 nullptr, net_log_.bound());
1144
1145 CreateSession();
1146 session_->quic_stream_factory()->set_require_confirmation(true);
1147 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1148
danakjad1777e2016-04-16 00:56:421149 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyi6b5a3892016-03-12 04:46:201150 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1151 TestCompletionCallback callback;
1152 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1153 EXPECT_EQ(ERR_IO_PENDING, rv);
1154
1155 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1156 QuicSession::HANDSHAKE_CONFIRMED);
1157 EXPECT_EQ(OK, callback.WaitForResult());
1158
1159 // Check whether this transaction is correctly marked as received a go-away
1160 // because of migrating port.
1161 NetErrorDetails details;
1162 EXPECT_FALSE(details.quic_port_migration_detected);
1163 trans->PopulateNetErrorDetails(&details);
1164 EXPECT_TRUE(details.quic_port_migration_detected);
1165}
1166
bnc8be55ebb2015-10-30 14:12:071167TEST_P(QuicNetworkTransactionTest,
1168 DoNotUseAlternativeServiceQuicUnsupportedVersion) {
1169 std::string altsvc_header = base::StringPrintf(
1170 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam() - 1);
1171 MockRead http_reads[] = {
1172 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1173 MockRead("hello world"),
1174 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1175 MockRead(ASYNC, OK)};
1176
1177 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1178 0);
1179 socket_factory_.AddSocketDataProvider(&http_data);
1180 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1181 socket_factory_.AddSocketDataProvider(&http_data);
1182 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1183
rch3f4b8452016-02-23 16:59:321184 CreateSession();
bnc8be55ebb2015-10-30 14:12:071185
1186 SendRequestAndExpectHttpResponse("hello world");
1187 SendRequestAndExpectHttpResponse("hello world");
1188}
1189
bncc958faa2015-07-31 18:14:521190// When multiple alternative services are advertised,
zhongyi32569c62016-01-08 02:54:301191// HttpStreamFactoryImpl::RequestStreamInternal() should select the alternative
1192// service which uses existing QUIC session if available. If no existing QUIC
1193// session can be used, use the first alternative service from the list.
1194TEST_P(QuicNetworkTransactionTest, UseExistingAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:521195 MockRead http_reads[] = {
1196 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291197 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
bncc958faa2015-07-31 18:14:521198 MockRead("hello world"),
1199 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1200 MockRead(ASYNC, OK)};
1201
1202 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1203 0);
1204 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561205 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521206
zhongyi32569c62016-01-08 02:54:301207 QuicStreamOffset request_header_offset = 0;
1208 QuicStreamOffset response_header_offset = 0;
1209 // First QUIC request data.
rch9ae5b3b2016-02-11 00:36:291210 // Open a session to foo.example.org:443 using the first entry of the
zhongyi32569c62016-01-08 02:54:301211 // alternative service list.
bncc958faa2015-07-31 18:14:521212 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581213 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301214 1, kClientDataStreamId1, true, true,
1215 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1216
1217 std::string alt_svc_list =
rch9ae5b3b2016-02-11 00:36:291218 "quic=\"mail.example.org:444\", quic=\"foo.example.org:443\", "
1219 "quic=\"bar.example.org:445\"";
alyssar2adf3ac2016-05-03 17:12:581220 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301221 1, kClientDataStreamId1, false, false,
1222 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581223 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1224 false, true, 0, "hello!"));
1225 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301226
1227 // Second QUIC request data.
1228 // Connection pooling, using existing session, no need to include version
1229 // as version negotiation has been completed.
alyssar2adf3ac2016-05-03 17:12:581230 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301231 3, kClientDataStreamId2, false, true,
1232 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581233 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301234 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1235 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581236 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1237 false, true, 0, "hello!"));
1238 mock_quic_data.AddWrite(
1239 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
bncc958faa2015-07-31 18:14:521240 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591241 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521242
1243 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1244
rtennetib8e80fb2016-05-16 00:12:091245 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321246 CreateSession();
bncc958faa2015-07-31 18:14:521247
1248 SendRequestAndExpectHttpResponse("hello world");
zhongyi32569c62016-01-08 02:54:301249
bnc359ed2a2016-04-29 20:43:451250 SendRequestAndExpectQuicResponse("hello!");
1251 SendRequestAndExpectQuicResponse("hello!");
zhongyi32569c62016-01-08 02:54:301252}
1253
bnc359ed2a2016-04-29 20:43:451254// Pool to existing session with matching QuicServerId
1255// even if alternative service destination is different.
1256TEST_P(QuicNetworkTransactionTest, PoolByOrigin) {
zhongyi32569c62016-01-08 02:54:301257 MockQuicData mock_quic_data;
bnc359ed2a2016-04-29 20:43:451258 QuicStreamOffset request_header_offset(0);
1259 QuicStreamOffset response_header_offset(0);
1260
1261 // First request.
alyssar2adf3ac2016-05-03 17:12:581262 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301263 1, kClientDataStreamId1, true, true,
1264 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581265 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451266 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1267 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581268 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1269 false, true, 0, "hello!"));
1270 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301271
bnc359ed2a2016-04-29 20:43:451272 // Second request.
alyssar2adf3ac2016-05-03 17:12:581273 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301274 3, kClientDataStreamId2, false, true,
1275 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581276 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301277 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1278 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581279 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1280 false, true, 0, "hello!"));
1281 mock_quic_data.AddWrite(
1282 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
zhongyi32569c62016-01-08 02:54:301283 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1284 mock_quic_data.AddRead(ASYNC, 0); // EOF
1285
1286 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bnc359ed2a2016-04-29 20:43:451287
1288 AddHangingNonAlternateProtocolSocketData();
1289 AddHangingNonAlternateProtocolSocketData();
zhongyi32569c62016-01-08 02:54:301290
rch3f4b8452016-02-23 16:59:321291 CreateSession();
zhongyi32569c62016-01-08 02:54:301292
bnc359ed2a2016-04-29 20:43:451293 const char destination1[] = "first.example.com";
1294 const char destination2[] = "second.example.com";
1295
1296 // Set up alternative service entry to destination1.
1297 url::SchemeHostPort server(request_.url);
1298 AlternativeService alternative_service(QUIC, destination1, 443);
1299 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1300 http_server_properties_.SetAlternativeService(server, alternative_service,
1301 expiration);
1302 // First request opens connection to |destination1|
1303 // with QuicServerId.host() == kDefaultServerHostName.
1304 SendRequestAndExpectQuicResponse("hello!");
1305
1306 // Set up alternative service entry to a different destination.
1307 alternative_service = AlternativeService(QUIC, destination2, 443);
1308 http_server_properties_.SetAlternativeService(server, alternative_service,
1309 expiration);
1310 // Second request pools to existing connection with same QuicServerId,
1311 // even though alternative service destination is different.
1312 SendRequestAndExpectQuicResponse("hello!");
1313}
1314
1315// Pool to existing session with matching destination and matching certificate
1316// even if origin is different, and even if the alternative service with
1317// matching destination is not the first one on the list.
1318TEST_P(QuicNetworkTransactionTest, PoolByDestination) {
1319 GURL origin1 = request_.url;
1320 GURL origin2("https://www.example.org/");
1321 ASSERT_NE(origin1.host(), origin2.host());
1322
1323 MockQuicData mock_quic_data;
1324 QuicStreamOffset request_header_offset(0);
1325 QuicStreamOffset response_header_offset(0);
1326
1327 // First request.
alyssar2adf3ac2016-05-03 17:12:581328 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:451329 1, kClientDataStreamId1, true, true,
1330 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
alyssar2adf3ac2016-05-03 17:12:581331 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451332 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1333 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581334 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1335 false, true, 0, "hello!"));
1336 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bnc359ed2a2016-04-29 20:43:451337
1338 // Second request.
alyssar2adf3ac2016-05-03 17:12:581339 QuicTestPacketMaker client_maker2(GetParam(), 0, clock_, origin2.host(),
1340 Perspective::IS_CLIENT);
1341 QuicTestPacketMaker server_maker2(GetParam(), 0, clock_, origin2.host(),
1342 Perspective::IS_SERVER);
1343 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:451344 3, kClientDataStreamId2, false, true,
alyssar2adf3ac2016-05-03 17:12:581345 GetRequestHeaders("GET", "https", "/", &client_maker2),
1346 &request_header_offset, &client_maker2));
1347 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:451348 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
alyssar2adf3ac2016-05-03 17:12:581349 &response_header_offset, &server_maker2));
1350 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
1351 false, true, 0, "hello!"));
1352 mock_quic_data.AddWrite(
1353 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
bnc359ed2a2016-04-29 20:43:451354 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1355 mock_quic_data.AddRead(ASYNC, 0); // EOF
1356
1357 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1358
1359 AddHangingNonAlternateProtocolSocketData();
1360 AddHangingNonAlternateProtocolSocketData();
1361
1362 CreateSession();
1363
1364 const char destination1[] = "first.example.com";
1365 const char destination2[] = "second.example.com";
1366
1367 // Set up alternative service for |origin1|.
1368 AlternativeService alternative_service1(QUIC, destination1, 443);
1369 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1370 http_server_properties_.SetAlternativeService(
1371 url::SchemeHostPort(origin1), alternative_service1, expiration);
1372
1373 // Set up multiple alternative service entries for |origin2|,
1374 // the first one with a different destination as for |origin1|,
1375 // the second one with the same. The second one should be used,
1376 // because the request can be pooled to that one.
1377 AlternativeService alternative_service2(QUIC, destination2, 443);
1378 AlternativeServiceInfoVector alternative_services;
1379 alternative_services.push_back(
1380 AlternativeServiceInfo(alternative_service2, expiration));
1381 alternative_services.push_back(
1382 AlternativeServiceInfo(alternative_service1, expiration));
1383 http_server_properties_.SetAlternativeServices(url::SchemeHostPort(origin2),
1384 alternative_services);
bnc359ed2a2016-04-29 20:43:451385 // First request opens connection to |destination1|
1386 // with QuicServerId.host() == origin1.host().
1387 SendRequestAndExpectQuicResponse("hello!");
1388
1389 // Second request pools to existing connection with same destination,
1390 // because certificate matches, even though QuicServerId is different.
1391 request_.url = origin2;
alyssar2adf3ac2016-05-03 17:12:581392
bnc359ed2a2016-04-29 20:43:451393 SendRequestAndExpectQuicResponse("hello!");
zhongyi32569c62016-01-08 02:54:301394}
1395
1396// Multiple origins have listed the same alternative services. When there's a
1397// existing QUIC session opened by a request to other origin,
1398// if the cert is valid, should select this QUIC session to make the request
1399// if this is also the first existing QUIC session.
1400TEST_P(QuicNetworkTransactionTest,
1401 UseSharedExistingAlternativeServiceForQuicWithValidCert) {
rch9ae5b3b2016-02-11 00:36:291402 // Default cert is valid for *.example.org
zhongyi32569c62016-01-08 02:54:301403
rch9ae5b3b2016-02-11 00:36:291404 // HTTP data for request to www.example.org.
zhongyi32569c62016-01-08 02:54:301405 MockRead http_reads[] = {
1406 MockRead("HTTP/1.1 200 OK\r\n"),
1407 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
rch9ae5b3b2016-02-11 00:36:291408 MockRead("hello world from www.example.org"),
zhongyi32569c62016-01-08 02:54:301409 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1410 MockRead(ASYNC, OK)};
1411
1412 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1413 0);
1414 socket_factory_.AddSocketDataProvider(&http_data);
1415 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1416
1417 // HTTP data for request to mail.example.org.
1418 MockRead http_reads2[] = {
1419 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291420 MockRead("Alt-Svc: quic=\":444\", quic=\"www.example.org:443\"\r\n\r\n"),
zhongyi32569c62016-01-08 02:54:301421 MockRead("hello world from mail.example.org"),
1422 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1423 MockRead(ASYNC, OK)};
1424
1425 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1426 nullptr, 0);
1427 socket_factory_.AddSocketDataProvider(&http_data2);
1428 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1429
1430 QuicStreamOffset request_header_offset = 0;
1431 QuicStreamOffset response_header_offset = 0;
1432
alyssar2adf3ac2016-05-03 17:12:581433 QuicTestPacketMaker client_maker(GetParam(), 0, clock_, "mail.example.org",
1434 Perspective::IS_CLIENT);
1435 server_maker_.set_hostname("www.example.org");
1436 client_maker_.set_hostname("www.example.org");
zhongyi32569c62016-01-08 02:54:301437 MockQuicData mock_quic_data;
1438
1439 // First QUIC request data.
alyssar2adf3ac2016-05-03 17:12:581440 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301441 1, kClientDataStreamId1, true, true,
1442 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1443
alyssar2adf3ac2016-05-03 17:12:581444 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301445 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1446 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581447 mock_quic_data.AddRead(ConstructServerDataPacket(
1448 2, kClientDataStreamId1, false, true, 0, "hello from mail QUIC!"));
1449 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301450 // Second QUIC request data.
alyssar2adf3ac2016-05-03 17:12:581451 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:301452 3, kClientDataStreamId2, false, true,
alyssar2adf3ac2016-05-03 17:12:581453 GetRequestHeaders("GET", "https", "/", &client_maker),
1454 &request_header_offset, &client_maker));
1455 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301456 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1457 &response_header_offset));
alyssar2adf3ac2016-05-03 17:12:581458 mock_quic_data.AddRead(ConstructServerDataPacket(
1459 4, kClientDataStreamId2, false, true, 0, "hello from mail QUIC!"));
1460 mock_quic_data.AddWrite(
1461 ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
zhongyi32569c62016-01-08 02:54:301462 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1463 mock_quic_data.AddRead(ASYNC, 0); // EOF
1464
1465 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
zhongyi32569c62016-01-08 02:54:301466
rtennetib8e80fb2016-05-16 00:12:091467 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321468 CreateSession();
zhongyi32569c62016-01-08 02:54:301469
1470 // Send two HTTP requests, responses set up alt-svc lists for the origins.
rch9ae5b3b2016-02-11 00:36:291471 request_.url = GURL("https://www.example.org/");
1472 SendRequestAndExpectHttpResponse("hello world from www.example.org");
zhongyi32569c62016-01-08 02:54:301473 request_.url = GURL("https://mail.example.org/");
1474 SendRequestAndExpectHttpResponse("hello world from mail.example.org");
1475
rch9ae5b3b2016-02-11 00:36:291476 // Open a QUIC session to mail.example.org:443 when making request
1477 // to mail.example.org.
1478 request_.url = GURL("https://www.example.org/");
bnc359ed2a2016-04-29 20:43:451479 SendRequestAndExpectQuicResponse("hello from mail QUIC!");
zhongyi32569c62016-01-08 02:54:301480
rch9ae5b3b2016-02-11 00:36:291481 // Uses the existing QUIC session when making request to www.example.org.
zhongyi32569c62016-01-08 02:54:301482 request_.url = GURL("https://mail.example.org/");
bnc359ed2a2016-04-29 20:43:451483 SendRequestAndExpectQuicResponse("hello from mail QUIC!");
bncc958faa2015-07-31 18:14:521484}
1485
1486TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) {
bncc958faa2015-07-31 18:14:521487 MockRead http_reads[] = {
1488 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561489 MockRead(kQuicAlternativeServiceDifferentPortHeader),
bncc958faa2015-07-31 18:14:521490 MockRead("hello world"),
1491 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1492 MockRead(ASYNC, OK)};
1493
1494 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1495 0);
1496 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561497 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521498
rtennetib8e80fb2016-05-16 00:12:091499 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321500 CreateSession();
bncc958faa2015-07-31 18:14:521501
1502 SendRequestAndExpectHttpResponse("hello world");
bnc359ed2a2016-04-29 20:43:451503
1504 url::SchemeHostPort http_server("https", kDefaultServerHostName, 443);
1505 AlternativeServiceVector alternative_service_vector =
1506 http_server_properties_.GetAlternativeServices(http_server);
1507 ASSERT_EQ(1u, alternative_service_vector.size());
1508 const AlternativeService alternative_service = alternative_service_vector[0];
1509 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
1510 EXPECT_EQ(kDefaultServerHostName, alternative_service_vector[0].host);
1511 EXPECT_EQ(137, alternative_service_vector[0].port);
bncc958faa2015-07-31 18:14:521512}
1513
1514TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) {
bncc958faa2015-07-31 18:14:521515 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561516 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1517 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521518 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1519 MockRead(ASYNC, OK)};
1520
1521 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1522 0);
1523 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561524 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521525
1526 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581527 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1528 1, kClientDataStreamId1, true, true,
1529 GetRequestHeaders("GET", "https", "/")));
1530 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:521531 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581532 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1533 false, true, 0, "hello!"));
1534 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:521535 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1536 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521537
1538 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1539
rtennetib8e80fb2016-05-16 00:12:091540 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321541 CreateSession();
bncc958faa2015-07-31 18:14:521542
1543 AlternativeService alternative_service(QUIC,
1544 HostPortPair::FromURL(request_.url));
1545 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
1546 alternative_service);
1547 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1548 alternative_service));
1549
1550 SendRequestAndExpectHttpResponse("hello world");
1551 SendRequestAndExpectQuicResponse("hello!");
1552
mmenkee24011922015-12-17 22:12:591553 mock_quic_data.Resume();
bncc958faa2015-07-31 18:14:521554
1555 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1556 alternative_service));
1557}
1558
bncc958faa2015-07-31 18:14:521559TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) {
bncc958faa2015-07-31 18:14:521560 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561561 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1562 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521563 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1564 MockRead(ASYNC, OK)};
1565
1566 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1567 0);
1568 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561569 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521570
1571 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581572 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1573 1, kClientDataStreamId1, true, true,
1574 GetRequestHeaders("GET", "https", "/")));
1575 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bncc958faa2015-07-31 18:14:521576 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581577 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1578 false, true, 0, "hello!"));
1579 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
bncc958faa2015-07-31 18:14:521580 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
1581
1582 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1583
1584 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321585 CreateSession();
bncc958faa2015-07-31 18:14:521586
1587 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1588 SendRequestAndExpectHttpResponse("hello world");
1589}
1590
bnc1c196c6e2016-05-28 13:51:481591TEST_P(QuicNetworkTransactionTest, HungAlternativeService) {
[email protected]dda75ab2013-06-22 22:43:301592 crypto_client_stream_factory_.set_handshake_mode(
1593 MockCryptoClientStream::COLD_START);
1594
1595 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561596 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
rch9ae5b3b2016-02-11 00:36:291597 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561598 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")};
[email protected]dda75ab2013-06-22 22:43:301599
1600 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561601 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
bnc1c196c6e2016-05-28 13:51:481602 MockRead(SYNCHRONOUS, 4, kQuicAlternativeServiceHeader),
rchf114d982015-10-21 01:34:561603 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]dda75ab2013-06-22 22:43:301604
mmenke651bae7f2015-12-18 21:26:451605 SequencedSocketData http_data(http_reads, arraysize(http_reads), http_writes,
1606 arraysize(http_writes));
bnc912a04b2016-04-20 14:19:501607 socket_factory_.AddSocketDataProvider(&http_data);
1608 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301609
1610 // The QUIC transaction will not be allowed to complete.
mmenke651bae7f2015-12-18 21:26:451611 MockWrite quic_writes[] = {MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 1)};
[email protected]dda75ab2013-06-22 22:43:301612 MockRead quic_reads[] = {
mmenke651bae7f2015-12-18 21:26:451613 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0),
[email protected]dda75ab2013-06-22 22:43:301614 };
mmenke651bae7f2015-12-18 21:26:451615 SequencedSocketData quic_data(quic_reads, arraysize(quic_reads), quic_writes,
1616 arraysize(quic_writes));
bnc912a04b2016-04-20 14:19:501617 socket_factory_.AddSocketDataProvider(&quic_data);
[email protected]dda75ab2013-06-22 22:43:301618
1619 // The HTTP transaction will complete.
mmenke651bae7f2015-12-18 21:26:451620 SequencedSocketData http_data2(http_reads, arraysize(http_reads), http_writes,
1621 arraysize(http_writes));
bnc912a04b2016-04-20 14:19:501622 socket_factory_.AddSocketDataProvider(&http_data2);
1623 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301624
bnc912a04b2016-04-20 14:19:501625 CreateSession();
[email protected]dda75ab2013-06-22 22:43:301626
1627 // Run the first request.
[email protected]dda75ab2013-06-22 22:43:301628 SendRequestAndExpectHttpResponse("hello world");
rch37de576c2015-05-17 20:28:171629 ASSERT_TRUE(http_data.AllReadDataConsumed());
1630 ASSERT_TRUE(http_data.AllWriteDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301631
1632 // Now run the second request in which the QUIC socket hangs,
1633 // and verify the the transaction continues over HTTP.
[email protected]dda75ab2013-06-22 22:43:301634 SendRequestAndExpectHttpResponse("hello world");
mmenke651bae7f2015-12-18 21:26:451635 base::RunLoop().RunUntilIdle();
[email protected]dda75ab2013-06-22 22:43:301636
rch37de576c2015-05-17 20:28:171637 ASSERT_TRUE(http_data2.AllReadDataConsumed());
1638 ASSERT_TRUE(http_data2.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:451639 ASSERT_TRUE(quic_data.AllReadDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301640}
1641
[email protected]1e960032013-12-20 19:00:201642TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
[email protected]1e960032013-12-20 19:00:201643 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581644 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1645 1, kClientDataStreamId1, true, true,
1646 GetRequestHeaders("GET", "https", "/")));
1647 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021648 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581649 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1650 false, true, 0, "hello!"));
1651 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501652 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591653 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]8ba81212013-05-03 13:11:481654
rcha5399e02015-04-21 19:32:041655 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]8ba81212013-05-03 13:11:481656
rtennetib8e80fb2016-05-16 00:12:091657 // The non-alternate protocol job needs to hang in order to guarantee that
1658 // the alternate-protocol job will "win".
1659 AddHangingNonAlternateProtocolSocketData();
1660
rch3f4b8452016-02-23 16:59:321661 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:191662 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1663 SendRequestAndExpectQuicResponse("hello!");
[email protected]8ba81212013-05-03 13:11:481664}
1665
[email protected]1e960032013-12-20 19:00:201666TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
[email protected]1e960032013-12-20 19:00:201667 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581668 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1669 1, kClientDataStreamId1, true, true,
1670 GetRequestHeaders("GET", "https", "/")));
1671 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021672 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581673 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1674 false, true, 0, "hello!"));
1675 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501676 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591677 mock_quic_data.AddRead(ASYNC, 0); // EOF
rcha5399e02015-04-21 19:32:041678 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]3a120a6b2013-06-25 01:08:271679
1680 // In order for a new QUIC session to be established via alternate-protocol
1681 // without racing an HTTP connection, we need the host resolution to happen
1682 // synchronously.
1683 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291684 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561685 "");
rch9ae5b3b2016-02-11 00:36:291686 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]3a120a6b2013-06-25 01:08:271687 AddressList address;
rjshaded5ced072015-12-18 19:26:021688 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1689 nullptr, net_log_.bound());
[email protected]3a120a6b2013-06-25 01:08:271690
rtennetib8e80fb2016-05-16 00:12:091691 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321692 CreateSession();
[email protected]3a120a6b2013-06-25 01:08:271693 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1694 SendRequestAndExpectQuicResponse("hello!");
1695}
1696
[email protected]0fc924b2014-03-31 04:34:151697TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) {
rdsmith82957ad2015-09-16 19:42:031698 proxy_service_ = ProxyService::CreateFixedFromPacResult("PROXY myproxy:70");
[email protected]0fc924b2014-03-31 04:34:151699
1700 // Since we are using a proxy, the QUIC job will not succeed.
1701 MockWrite http_writes[] = {
rch9ae5b3b2016-02-11 00:36:291702 MockWrite(SYNCHRONOUS, 0, "GET http://mail.example.org/ HTTP/1.1\r\n"),
1703 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561704 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")};
[email protected]0fc924b2014-03-31 04:34:151705
1706 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561707 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
bnc1c196c6e2016-05-28 13:51:481708 MockRead(SYNCHRONOUS, 4, kQuicAlternativeServiceHeader),
rchf114d982015-10-21 01:34:561709 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]0fc924b2014-03-31 04:34:151710
1711 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
1712 http_writes, arraysize(http_writes));
1713 socket_factory_.AddSocketDataProvider(&http_data);
1714
1715 // In order for a new QUIC session to be established via alternate-protocol
1716 // without racing an HTTP connection, we need the host resolution to happen
1717 // synchronously.
1718 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291719 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561720 "");
rch9ae5b3b2016-02-11 00:36:291721 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]0fc924b2014-03-31 04:34:151722 AddressList address;
rjshaded5ced072015-12-18 19:26:021723 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1724 nullptr, net_log_.bound());
[email protected]0fc924b2014-03-31 04:34:151725
rch9ae5b3b2016-02-11 00:36:291726 request_.url = GURL("http://mail.example.org/");
rch3f4b8452016-02-23 16:59:321727 CreateSession();
[email protected]0fc924b2014-03-31 04:34:151728 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1729 SendRequestAndExpectHttpResponse("hello world");
1730}
1731
[email protected]1e960032013-12-20 19:00:201732TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
[email protected]1e960032013-12-20 19:00:201733 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581734 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1735 1, kClientDataStreamId1, true, true,
1736 GetRequestHeaders("GET", "https", "/")));
1737 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
rjshaded5ced072015-12-18 19:26:021738 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:581739 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
1740 false, true, 0, "hello!"));
1741 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591742 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
rcha5399e02015-04-21 19:32:041743 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]11c05872013-08-20 02:04:121744
rtennetib8e80fb2016-05-16 00:12:091745 // The non-alternate protocol job needs to hang in order to guarantee that
1746 // the alternate-protocol job will "win".
1747 AddHangingNonAlternateProtocolSocketData();
1748
[email protected]11c05872013-08-20 02:04:121749 // In order for a new QUIC session to be established via alternate-protocol
1750 // without racing an HTTP connection, we need the host resolution to happen
1751 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1752 // connection to the the server, in this test we require confirmation
1753 // before encrypting so the HTTP job will still start.
1754 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291755 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561756 "");
rch9ae5b3b2016-02-11 00:36:291757 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]11c05872013-08-20 02:04:121758 AddressList address;
rjshaded5ced072015-12-18 19:26:021759 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1760 nullptr, net_log_.bound());
[email protected]11c05872013-08-20 02:04:121761
rch3f4b8452016-02-23 16:59:321762 CreateSession();
[email protected]11c05872013-08-20 02:04:121763 session_->quic_stream_factory()->set_require_confirmation(true);
1764 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1765
danakjad1777e2016-04-16 00:56:421766 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]11c05872013-08-20 02:04:121767 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1768 TestCompletionCallback callback;
1769 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1770 EXPECT_EQ(ERR_IO_PENDING, rv);
1771
1772 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1773 QuicSession::HANDSHAKE_CONFIRMED);
1774 EXPECT_EQ(OK, callback.WaitForResult());
rchb27683c2015-07-29 23:53:501775
1776 CheckWasQuicResponse(trans);
1777 CheckResponseData(trans, "hello!");
[email protected]11c05872013-08-20 02:04:121778}
1779
zhongyica364fbb2015-12-12 03:39:121780TEST_P(QuicNetworkTransactionTest,
1781 LogGranularQuicErrorCodeOnQuicProtocolErrorLocal) {
1782 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581783 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1784 1, kClientDataStreamId1, true, true,
1785 GetRequestHeaders("GET", "https", "/")));
zhongyica364fbb2015-12-12 03:39:121786 // Read a close connection packet with
1787 // QuicErrorCode: QUIC_CRYPTO_VERSION_NOT_SUPPORTED from the peer.
alyssar2adf3ac2016-05-03 17:12:581788 mock_quic_data.AddRead(ConstructServerConnectionClosePacket(1));
zhongyica364fbb2015-12-12 03:39:121789 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1790
1791 // The non-alternate protocol job needs to hang in order to guarantee that
1792 // the alternate-protocol job will "win".
1793 AddHangingNonAlternateProtocolSocketData();
1794
1795 // In order for a new QUIC session to be established via alternate-protocol
1796 // without racing an HTTP connection, we need the host resolution to happen
1797 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1798 // connection to the the server, in this test we require confirmation
1799 // before encrypting so the HTTP job will still start.
1800 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291801 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:121802 "");
rch9ae5b3b2016-02-11 00:36:291803 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:121804 AddressList address;
1805 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1806 nullptr, net_log_.bound());
1807
rch3f4b8452016-02-23 16:59:321808 CreateSession();
zhongyica364fbb2015-12-12 03:39:121809 session_->quic_stream_factory()->set_require_confirmation(true);
1810 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1811
danakjad1777e2016-04-16 00:56:421812 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyica364fbb2015-12-12 03:39:121813 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1814 TestCompletionCallback callback;
1815 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1816 EXPECT_EQ(ERR_IO_PENDING, rv);
1817
1818 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1819 QuicSession::HANDSHAKE_CONFIRMED);
1820 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
1821
1822 NetErrorDetails details;
1823 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1824
1825 trans->PopulateNetErrorDetails(&details);
1826 // Verify the error code logged is what sent by the peer.
1827 EXPECT_EQ(QUIC_CRYPTO_VERSION_NOT_SUPPORTED, details.quic_connection_error);
1828}
1829
1830TEST_P(QuicNetworkTransactionTest,
1831 LogGranularQuicErrorCodeOnQuicProtocolErrorRemote) {
1832 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:581833 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
1834 1, kClientDataStreamId1, true, true,
1835 GetRequestHeaders("GET", "https", "/")));
zhongyif28b4a32016-04-25 21:35:211836 // Peer sending data from an non-existing stream causes this end to raise
1837 // error and close connection.
1838 mock_quic_data.AddRead(
alyssar2adf3ac2016-05-03 17:12:581839 ConstructServerRstPacket(1, false, 99, QUIC_STREAM_LAST_ERROR));
zhongyif28b4a32016-04-25 21:35:211840 std::string quic_error_details = "Data for nonexistent stream";
alyssar2adf3ac2016-05-03 17:12:581841 mock_quic_data.AddWrite(ConstructClientAckAndConnectionClosePacket(
zhongyif28b4a32016-04-25 21:35:211842 2, QuicTime::Delta::Infinite(), 0, 1, QUIC_INVALID_STREAM_ID,
zhongyica364fbb2015-12-12 03:39:121843 quic_error_details));
1844 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1845
1846 // The non-alternate protocol job needs to hang in order to guarantee that
1847 // the alternate-protocol job will "win".
1848 AddHangingNonAlternateProtocolSocketData();
1849
1850 // In order for a new QUIC session to be established via alternate-protocol
1851 // without racing an HTTP connection, we need the host resolution to happen
1852 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1853 // connection to the the server, in this test we require confirmation
1854 // before encrypting so the HTTP job will still start.
1855 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291856 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:121857 "");
rch9ae5b3b2016-02-11 00:36:291858 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:121859 AddressList address;
1860 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1861 nullptr, net_log_.bound());
1862
rch3f4b8452016-02-23 16:59:321863 CreateSession();
zhongyica364fbb2015-12-12 03:39:121864 session_->quic_stream_factory()->set_require_confirmation(true);
1865 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1866
danakjad1777e2016-04-16 00:56:421867 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyica364fbb2015-12-12 03:39:121868 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1869 TestCompletionCallback callback;
1870 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1871 EXPECT_EQ(ERR_IO_PENDING, rv);
1872
1873 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1874 QuicSession::HANDSHAKE_CONFIRMED);
1875 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
1876 NetErrorDetails details;
1877 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1878
1879 trans->PopulateNetErrorDetails(&details);
zhongyif28b4a32016-04-25 21:35:211880 EXPECT_EQ(QUIC_INVALID_STREAM_ID, details.quic_connection_error);
zhongyica364fbb2015-12-12 03:39:121881}
1882
[email protected]1e960032013-12-20 19:00:201883TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
[email protected]3316d422013-05-03 21:45:301884 // Alternate-protocol job
alyssar2adf3ac2016-05-03 17:12:581885 std::unique_ptr<QuicEncryptedPacket> close(
1886 ConstructServerConnectionClosePacket(1));
[email protected]3316d422013-05-03 21:45:301887 MockRead quic_reads[] = {
rchb27683c2015-07-29 23:53:501888 MockRead(ASYNC, close->data(), close->length()),
1889 MockRead(ASYNC, ERR_IO_PENDING), // No more data to read
1890 MockRead(ASYNC, OK), // EOF
[email protected]3316d422013-05-03 21:45:301891 };
rjshaded5ced072015-12-18 19:26:021892 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
1893 0);
[email protected]3316d422013-05-03 21:45:301894 socket_factory_.AddSocketDataProvider(&quic_data);
1895
1896 // Main job which will succeed even though the alternate job fails.
1897 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021898 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
1899 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1900 MockRead(ASYNC, OK)};
[email protected]3316d422013-05-03 21:45:301901
rjshaded5ced072015-12-18 19:26:021902 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1903 0);
[email protected]3316d422013-05-03 21:45:301904 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561905 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]3316d422013-05-03 21:45:301906
rch3f4b8452016-02-23 16:59:321907 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:191908 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1909 SendRequestAndExpectHttpResponse("hello from http");
1910 ExpectBrokenAlternateProtocolMapping();
[email protected]3316d422013-05-03 21:45:301911}
1912
[email protected]1e960032013-12-20 19:00:201913TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
[email protected]d03a66d2013-05-06 12:55:591914 // Alternate-protocol job
1915 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:021916 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]d03a66d2013-05-06 12:55:591917 };
rjshaded5ced072015-12-18 19:26:021918 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
1919 0);
[email protected]d03a66d2013-05-06 12:55:591920 socket_factory_.AddSocketDataProvider(&quic_data);
1921
1922 // Main job which will succeed even though the alternate job fails.
1923 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021924 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
1925 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1926 MockRead(ASYNC, OK)};
[email protected]d03a66d2013-05-06 12:55:591927
rjshaded5ced072015-12-18 19:26:021928 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1929 0);
[email protected]d03a66d2013-05-06 12:55:591930 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561931 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]d03a66d2013-05-06 12:55:591932
rch3f4b8452016-02-23 16:59:321933 CreateSession();
[email protected]d03a66d2013-05-06 12:55:591934
[email protected]aa9b14d2013-05-10 23:45:191935 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1936 SendRequestAndExpectHttpResponse("hello from http");
1937 ExpectBrokenAlternateProtocolMapping();
[email protected]d03a66d2013-05-06 12:55:591938}
1939
[email protected]00c159f2014-05-21 22:38:161940TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) {
[email protected]eb71ab62014-05-23 07:57:531941 // Alternate-protocol job will fail when the session attempts to read.
[email protected]00c159f2014-05-21 22:38:161942 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:021943 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:161944 };
rjshaded5ced072015-12-18 19:26:021945 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
1946 0);
[email protected]00c159f2014-05-21 22:38:161947 socket_factory_.AddSocketDataProvider(&quic_data);
1948
[email protected]eb71ab62014-05-23 07:57:531949 // Main job will also fail.
[email protected]00c159f2014-05-21 22:38:161950 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021951 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:161952 };
1953
rjshaded5ced072015-12-18 19:26:021954 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1955 0);
[email protected]00c159f2014-05-21 22:38:161956 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED));
1957 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561958 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]00c159f2014-05-21 22:38:161959
rtennetib8e80fb2016-05-16 00:12:091960 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321961 CreateSession();
[email protected]00c159f2014-05-21 22:38:161962
1963 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
danakjad1777e2016-04-16 00:56:421964 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]00c159f2014-05-21 22:38:161965 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1966 TestCompletionCallback callback;
1967 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1968 EXPECT_EQ(ERR_IO_PENDING, rv);
1969 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult());
1970 ExpectQuicAlternateProtocolMapping();
1971}
1972
[email protected]1e960032013-12-20 19:00:201973TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
[email protected]77c6c162013-08-17 02:57:451974 // Alternate-protocol job
1975 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:021976 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]77c6c162013-08-17 02:57:451977 };
rjshaded5ced072015-12-18 19:26:021978 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
1979 0);
[email protected]77c6c162013-08-17 02:57:451980 socket_factory_.AddSocketDataProvider(&quic_data);
1981
[email protected]c92c1b52014-05-31 04:16:061982 // Second Alternate-protocol job which will race with the TCP job.
1983 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421984 nullptr, 0);
[email protected]c92c1b52014-05-31 04:16:061985 socket_factory_.AddSocketDataProvider(&quic_data2);
1986
[email protected]4d283b32013-10-17 12:57:271987 // Final job that will proceed when the QUIC job fails.
1988 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021989 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
1990 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1991 MockRead(ASYNC, OK)};
[email protected]4d283b32013-10-17 12:57:271992
rjshaded5ced072015-12-18 19:26:021993 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1994 0);
[email protected]4d283b32013-10-17 12:57:271995 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561996 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d283b32013-10-17 12:57:271997
rtennetiafccbc062016-05-16 18:21:141998 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321999 CreateSession();
[email protected]77c6c162013-08-17 02:57:452000
2001 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2002
[email protected]4d283b32013-10-17 12:57:272003 SendRequestAndExpectHttpResponse("hello from http");
[email protected]77c6c162013-08-17 02:57:452004
2005 ExpectBrokenAlternateProtocolMapping();
[email protected]4d283b32013-10-17 12:57:272006
rch37de576c2015-05-17 20:28:172007 EXPECT_TRUE(quic_data.AllReadDataConsumed());
2008 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
[email protected]77c6c162013-08-17 02:57:452009}
2010
[email protected]93b31772014-06-19 08:03:352011TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) {
[email protected]65768442014-06-06 23:37:032012 // Alternate-protocol job
2013 MockRead quic_reads[] = {
mmenkee24011922015-12-17 22:12:592014 MockRead(SYNCHRONOUS, ERR_IO_PENDING),
[email protected]65768442014-06-06 23:37:032015 };
rjshaded5ced072015-12-18 19:26:022016 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2017 0);
[email protected]65768442014-06-06 23:37:032018 socket_factory_.AddSocketDataProvider(&quic_data);
2019
2020 // Main job that will proceed when the QUIC job fails.
2021 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022022 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2023 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2024 MockRead(ASYNC, OK)};
[email protected]65768442014-06-06 23:37:032025
rjshaded5ced072015-12-18 19:26:022026 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2027 0);
[email protected]65768442014-06-06 23:37:032028 socket_factory_.AddSocketDataProvider(&http_data);
2029
rtennetib8e80fb2016-05-16 00:12:092030 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322031 CreateSession();
[email protected]65768442014-06-06 23:37:032032
2033 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2034
2035 SendRequestAndExpectHttpResponse("hello from http");
2036}
2037
[email protected]eb71ab62014-05-23 07:57:532038TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
[email protected]4d590c9c2014-05-02 05:14:332039 // Alternate-protocol job will fail before creating a QUIC session.
rtennetibe635732014-10-02 22:51:422040 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0);
rjshaded5ced072015-12-18 19:26:022041 quic_data.set_connect_data(
2042 MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED));
[email protected]4d590c9c2014-05-02 05:14:332043 socket_factory_.AddSocketDataProvider(&quic_data);
2044
2045 // Main job which will succeed even though the alternate job fails.
2046 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022047 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2048 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2049 MockRead(ASYNC, OK)};
[email protected]4d590c9c2014-05-02 05:14:332050
rjshaded5ced072015-12-18 19:26:022051 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2052 0);
[email protected]4d590c9c2014-05-02 05:14:332053 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562054 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d590c9c2014-05-02 05:14:332055
rch3f4b8452016-02-23 16:59:322056 CreateSession();
[email protected]4d590c9c2014-05-02 05:14:332057 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2058 SendRequestAndExpectHttpResponse("hello from http");
[email protected]eb71ab62014-05-23 07:57:532059
2060 ExpectBrokenAlternateProtocolMapping();
[email protected]4d590c9c2014-05-02 05:14:332061}
2062
[email protected]4fee9672014-01-08 14:47:152063TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
[email protected]4fee9672014-01-08 14:47:152064 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582065 mock_quic_data.AddSynchronousRead(ConstructServerConnectionClosePacket(1));
2066 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2067 1, kClientDataStreamId1, true, true,
2068 GetRequestHeaders("GET", "https", "/")));
2069 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rcha5399e02015-04-21 19:32:042070 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4fee9672014-01-08 14:47:152071
2072 // When the QUIC connection fails, we will try the request again over HTTP.
2073 MockRead http_reads[] = {
bnc1c196c6e2016-05-28 13:51:482074 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
rchf114d982015-10-21 01:34:562075 MockRead("hello world"),
2076 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2077 MockRead(ASYNC, OK)};
[email protected]4fee9672014-01-08 14:47:152078
rjshaded5ced072015-12-18 19:26:022079 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2080 0);
[email protected]4fee9672014-01-08 14:47:152081 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562082 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4fee9672014-01-08 14:47:152083
2084 // In order for a new QUIC session to be established via alternate-protocol
2085 // without racing an HTTP connection, we need the host resolution to happen
2086 // synchronously.
2087 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:292088 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:562089 "");
rch9ae5b3b2016-02-11 00:36:292090 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]4fee9672014-01-08 14:47:152091 AddressList address;
rjshaded5ced072015-12-18 19:26:022092 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2093 nullptr, net_log_.bound());
[email protected]4fee9672014-01-08 14:47:152094
rch3f4b8452016-02-23 16:59:322095 CreateSession();
[email protected]4fee9672014-01-08 14:47:152096 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2097 SendRequestAndExpectHttpResponse("hello world");
2098}
2099
bnc508835902015-05-12 20:10:292100TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) {
alyssar2adf3ac2016-05-03 17:12:582101 client_maker_.set_hostname("www.example.org");
tbansal0f56a39a2016-04-07 22:03:382102 EXPECT_FALSE(
2103 test_socket_performance_watcher_factory_.rtt_notification_received());
bnc508835902015-05-12 20:10:292104 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582105 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2106 1, kClientDataStreamId1, true, true,
2107 GetRequestHeaders("GET", "https", "/")));
2108 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
bnc508835902015-05-12 20:10:292109 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
alyssar2adf3ac2016-05-03 17:12:582110 mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
2111 false, true, 0, "hello!"));
2112 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
rchb27683c2015-07-29 23:53:502113 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
bnc508835902015-05-12 20:10:292114 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2115
bncb07c05532015-05-14 19:07:202116 request_.url = GURL("https://www.example.org:443");
rtennetib8e80fb2016-05-16 00:12:092117 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322118 CreateSession();
bnc508835902015-05-12 20:10:292119 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
2120 SendRequestAndExpectQuicResponse("hello!");
tbansal0f56a39a2016-04-07 22:03:382121 EXPECT_TRUE(
2122 test_socket_performance_watcher_factory_.rtt_notification_received());
bnc508835902015-05-12 20:10:292123}
2124
rtenneti56977812016-01-15 19:26:562125TEST_P(QuicNetworkTransactionTest, QuicUpload) {
rtenneti8a2f4632016-03-21 20:26:572126 params_.origins_to_force_quic_on.insert(
2127 HostPortPair::FromString("mail.example.org:443"));
rtenneti56977812016-01-15 19:26:562128
2129 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2130 MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_FAILED, 1)};
2131 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2132 arraysize(writes));
2133 socket_factory_.AddSocketDataProvider(&socket_data);
2134
rtennetib8e80fb2016-05-16 00:12:092135 // The non-alternate protocol job needs to hang in order to guarantee that
2136 // the alternate-protocol job will "win".
2137 AddHangingNonAlternateProtocolSocketData();
2138
rch3f4b8452016-02-23 16:59:322139 params_.enable_alternative_service_with_different_host = false;
rtenneti56977812016-01-15 19:26:562140 CreateSession();
2141 request_.method = "POST";
2142 ChunkedUploadDataStream upload_data(0);
2143 upload_data.AppendData("1", 1, true);
2144
2145 request_.upload_data_stream = &upload_data;
2146
danakjad1777e2016-04-16 00:56:422147 std::unique_ptr<HttpNetworkTransaction> trans(
rtenneti56977812016-01-15 19:26:562148 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2149 TestCompletionCallback callback;
2150 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2151 EXPECT_EQ(ERR_IO_PENDING, rv);
2152 EXPECT_NE(OK, callback.WaitForResult());
2153}
2154
bnc359ed2a2016-04-29 20:43:452155class QuicNetworkTransactionWithDestinationTest
2156 : public PlatformTest,
2157 public ::testing::WithParamInterface<PoolingTestParams> {
2158 protected:
2159 QuicNetworkTransactionWithDestinationTest()
2160 : clock_(new MockClock),
2161 version_(GetParam().version),
2162 destination_type_(GetParam().destination_type),
2163 cert_transparency_verifier_(new MultiLogCTVerifier()),
2164 ssl_config_service_(new SSLConfigServiceDefaults),
2165 proxy_service_(ProxyService::CreateDirect()),
2166 auth_handler_factory_(
2167 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
2168 random_generator_(0),
2169 ssl_data_(ASYNC, OK) {}
2170
2171 void SetUp() override {
2172 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:552173 base::RunLoop().RunUntilIdle();
bnc359ed2a2016-04-29 20:43:452174
2175 HttpNetworkSession::Params params;
2176
2177 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
2178 params.quic_clock = clock_;
2179
2180 crypto_client_stream_factory_.set_handshake_mode(
2181 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2182 params.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
2183
2184 params.enable_alternative_service_with_different_host = true;
2185 params.enable_quic = true;
2186 params.quic_random = &random_generator_;
2187 params.client_socket_factory = &socket_factory_;
2188 params.host_resolver = &host_resolver_;
2189 params.cert_verifier = &cert_verifier_;
2190 params.transport_security_state = &transport_security_state_;
2191 params.cert_transparency_verifier = cert_transparency_verifier_.get();
rsleevid6de8302016-06-21 01:33:202192 params.ct_policy_enforcer = &ct_policy_enforcer_;
bnc359ed2a2016-04-29 20:43:452193 params.socket_performance_watcher_factory =
2194 &test_socket_performance_watcher_factory_;
2195 params.ssl_config_service = ssl_config_service_.get();
2196 params.proxy_service = proxy_service_.get();
2197 params.http_auth_handler_factory = auth_handler_factory_.get();
bnc525e175a2016-06-20 12:36:402198 params.http_server_properties = &http_server_properties_;
bnc359ed2a2016-04-29 20:43:452199 params.quic_supported_versions = SupportedVersions(version_);
2200 params.quic_host_whitelist.insert("news.example.org");
2201 params.quic_host_whitelist.insert("mail.example.org");
2202 params.quic_host_whitelist.insert("mail.example.com");
2203
2204 session_.reset(new HttpNetworkSession(params));
2205 session_->quic_stream_factory()->set_require_confirmation(true);
2206 ASSERT_EQ(params.quic_socket_receive_buffer_size,
2207 session_->quic_stream_factory()->socket_receive_buffer_size());
2208 }
2209
2210 void TearDown() override {
2211 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
2212 // Empty the current queue.
fdoray92e35a72016-06-10 15:54:552213 base::RunLoop().RunUntilIdle();
bnc359ed2a2016-04-29 20:43:452214 PlatformTest::TearDown();
2215 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
fdoray92e35a72016-06-10 15:54:552216 base::RunLoop().RunUntilIdle();
bnc525e175a2016-06-20 12:36:402217 session_.reset();
bnc359ed2a2016-04-29 20:43:452218 }
2219
2220 void SetAlternativeService(const std::string& origin) {
2221 HostPortPair destination;
2222 switch (destination_type_) {
2223 case SAME_AS_FIRST:
2224 destination = HostPortPair(origin1_, 443);
2225 break;
2226 case SAME_AS_SECOND:
2227 destination = HostPortPair(origin2_, 443);
2228 break;
2229 case DIFFERENT:
2230 destination = HostPortPair(kDifferentHostname, 443);
2231 break;
2232 }
2233 AlternativeService alternative_service(QUIC, destination);
2234 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
2235 http_server_properties_.SetAlternativeService(
2236 url::SchemeHostPort("https", origin, 443), alternative_service,
2237 expiration);
2238 }
2239
alyssar2adf3ac2016-05-03 17:12:582240 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452241 QuicPacketNumber packet_number,
2242 QuicStreamId stream_id,
2243 bool should_include_version,
2244 QuicStreamOffset* offset,
2245 QuicTestPacketMaker* maker) {
2246 SpdyPriority priority =
2247 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
2248 SpdyHeaderBlock headers(maker->GetRequestHeaders("GET", "https", "/"));
2249 return maker->MakeRequestHeadersPacketWithOffsetTracking(
2250 packet_number, stream_id, should_include_version, true, priority,
2251 headers, offset);
2252 }
2253
alyssar2adf3ac2016-05-03 17:12:582254 std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452255 QuicPacketNumber packet_number,
2256 QuicStreamId stream_id,
2257 bool should_include_version,
2258 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:582259 return ConstructClientRequestHeadersPacket(
bnc359ed2a2016-04-29 20:43:452260 packet_number, stream_id, should_include_version, nullptr, maker);
2261 }
2262
alyssar2adf3ac2016-05-03 17:12:582263 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:452264 QuicPacketNumber packet_number,
2265 QuicStreamId stream_id,
2266 QuicStreamOffset* offset,
2267 QuicTestPacketMaker* maker) {
2268 SpdyHeaderBlock headers(maker->GetResponseHeaders("200 OK"));
2269 return maker->MakeResponseHeadersPacketWithOffsetTracking(
2270 packet_number, stream_id, false, false, headers, offset);
2271 }
2272
alyssar2adf3ac2016-05-03 17:12:582273 std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
bnc359ed2a2016-04-29 20:43:452274 QuicPacketNumber packet_number,
2275 QuicStreamId stream_id,
2276 QuicTestPacketMaker* maker) {
alyssar2adf3ac2016-05-03 17:12:582277 return ConstructServerResponseHeadersPacket(packet_number, stream_id,
2278 nullptr, maker);
bnc359ed2a2016-04-29 20:43:452279 }
2280
alyssar2adf3ac2016-05-03 17:12:582281 std::unique_ptr<QuicEncryptedPacket> ConstructServerDataPacket(
bnc359ed2a2016-04-29 20:43:452282 QuicPacketNumber packet_number,
2283 QuicStreamId stream_id,
2284 QuicTestPacketMaker* maker) {
2285 return maker->MakeDataPacket(packet_number, stream_id, false, true, 0,
2286 "hello");
2287 }
2288
alyssar2adf3ac2016-05-03 17:12:582289 std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
bnc359ed2a2016-04-29 20:43:452290 QuicPacketNumber packet_number,
2291 QuicPacketNumber largest_received,
2292 QuicPacketNumber ack_least_unacked,
2293 QuicPacketNumber stop_least_unacked,
2294 QuicTestPacketMaker* maker) {
2295 return maker->MakeAckPacket(packet_number, largest_received,
2296 ack_least_unacked, stop_least_unacked, true);
2297 }
2298
2299 void AddRefusedSocketData() {
2300 std::unique_ptr<StaticSocketDataProvider> refused_data(
2301 new StaticSocketDataProvider());
2302 MockConnect refused_connect(SYNCHRONOUS, ERR_CONNECTION_REFUSED);
2303 refused_data->set_connect_data(refused_connect);
2304 socket_factory_.AddSocketDataProvider(refused_data.get());
2305 static_socket_data_provider_vector_.push_back(std::move(refused_data));
2306 }
2307
2308 void AddHangingSocketData() {
2309 std::unique_ptr<StaticSocketDataProvider> hanging_data(
2310 new StaticSocketDataProvider());
2311 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
2312 hanging_data->set_connect_data(hanging_connect);
2313 socket_factory_.AddSocketDataProvider(hanging_data.get());
2314 static_socket_data_provider_vector_.push_back(std::move(hanging_data));
2315 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
2316 }
2317
2318 bool AllDataConsumed() {
2319 for (const auto& socket_data_ptr : static_socket_data_provider_vector_) {
2320 if (!socket_data_ptr->AllReadDataConsumed() ||
2321 !socket_data_ptr->AllWriteDataConsumed()) {
2322 return false;
2323 }
2324 }
2325 return true;
2326 }
2327
2328 void SendRequestAndExpectQuicResponse(const std::string& host) {
2329 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
2330 HttpRequestInfo request;
2331 std::string url("https://");
2332 url.append(host);
2333 request.url = GURL(url);
2334 request.load_flags = 0;
2335 request.method = "GET";
2336 TestCompletionCallback callback;
2337 int rv = trans.Start(&request, callback.callback(), net_log_.bound());
2338 EXPECT_EQ(OK, callback.GetResult(rv));
2339
2340 std::string response_data;
2341 ASSERT_EQ(OK, ReadTransaction(&trans, &response_data));
2342 EXPECT_EQ("hello", response_data);
2343
2344 const HttpResponseInfo* response = trans.GetResponseInfo();
2345 ASSERT_TRUE(response != nullptr);
2346 ASSERT_TRUE(response->headers.get() != nullptr);
2347 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
2348 EXPECT_TRUE(response->was_fetched_via_spdy);
2349 EXPECT_TRUE(response->was_npn_negotiated);
2350 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
2351 response->connection_info);
2352 EXPECT_EQ(443, response->socket_address.port());
2353 }
2354
2355 MockClock* clock_;
2356 QuicVersion version_;
2357 DestinationType destination_type_;
2358 std::string origin1_;
2359 std::string origin2_;
2360 std::unique_ptr<HttpNetworkSession> session_;
2361 MockClientSocketFactory socket_factory_;
2362 MockHostResolver host_resolver_;
2363 MockCertVerifier cert_verifier_;
2364 TransportSecurityState transport_security_state_;
2365 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
rsleevid6de8302016-06-21 01:33:202366 CTPolicyEnforcer ct_policy_enforcer_;
bnc359ed2a2016-04-29 20:43:452367 TestSocketPerformanceWatcherFactory test_socket_performance_watcher_factory_;
2368 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
2369 std::unique_ptr<ProxyService> proxy_service_;
2370 std::unique_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
2371 MockRandom random_generator_;
2372 HttpServerPropertiesImpl http_server_properties_;
2373 BoundTestNetLog net_log_;
2374 MockCryptoClientStreamFactory crypto_client_stream_factory_;
2375 std::vector<std::unique_ptr<StaticSocketDataProvider>>
2376 static_socket_data_provider_vector_;
2377 SSLSocketDataProvider ssl_data_;
2378};
2379
2380INSTANTIATE_TEST_CASE_P(Version,
2381 QuicNetworkTransactionWithDestinationTest,
2382 ::testing::ValuesIn(GetPoolingTestParams()));
2383
2384// A single QUIC request fails because the certificate does not match the origin
2385// hostname, regardless of whether it matches the alternative service hostname.
2386TEST_P(QuicNetworkTransactionWithDestinationTest, InvalidCertificate) {
2387 if (destination_type_ == DIFFERENT)
2388 return;
2389
2390 GURL url("https://mail.example.com/");
2391 origin1_ = url.host();
2392
2393 // Not used for requests, but this provides a test case where the certificate
2394 // is valid for the hostname of the alternative service.
2395 origin2_ = "mail.example.org";
2396
2397 SetAlternativeService(origin1_);
2398
2399 scoped_refptr<X509Certificate> cert(
2400 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2401 bool unused;
2402 ASSERT_FALSE(cert->VerifyNameMatch(origin1_, &unused));
2403 ASSERT_TRUE(cert->VerifyNameMatch(origin2_, &unused));
2404
2405 ProofVerifyDetailsChromium verify_details;
2406 verify_details.cert_verify_result.verified_cert = cert;
2407 verify_details.cert_verify_result.is_issued_by_known_root = true;
2408 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2409
2410 MockQuicData mock_quic_data;
2411 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);
2412 mock_quic_data.AddRead(ASYNC, 0);
2413
2414 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2415
2416 AddRefusedSocketData();
2417
2418 HttpRequestInfo request;
2419 request.url = url;
2420
2421 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
2422 TestCompletionCallback callback;
2423 int rv = trans.Start(&request, callback.callback(), net_log_.bound());
2424 EXPECT_EQ(ERR_CONNECTION_REFUSED, callback.GetResult(rv));
2425
2426 EXPECT_TRUE(AllDataConsumed());
2427}
2428
2429// First request opens QUIC session to alternative service. Second request
2430// pools to it, because destination matches and certificate is valid, even
2431// though QuicServerId is different.
2432TEST_P(QuicNetworkTransactionWithDestinationTest, PoolIfCertificateValid) {
2433 origin1_ = "mail.example.org";
2434 origin2_ = "news.example.org";
2435
2436 SetAlternativeService(origin1_);
2437 SetAlternativeService(origin2_);
2438
2439 scoped_refptr<X509Certificate> cert(
2440 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2441 bool unused;
2442 ASSERT_TRUE(cert->VerifyNameMatch(origin1_, &unused));
2443 ASSERT_TRUE(cert->VerifyNameMatch(origin2_, &unused));
2444 ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname, &unused));
2445
2446 ProofVerifyDetailsChromium verify_details;
2447 verify_details.cert_verify_result.verified_cert = cert;
2448 verify_details.cert_verify_result.is_issued_by_known_root = true;
2449 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2450
alyssar2adf3ac2016-05-03 17:12:582451 QuicTestPacketMaker client_maker1(version_, 0, clock_, origin1_,
2452 Perspective::IS_CLIENT);
2453 QuicTestPacketMaker server_maker1(version_, 0, clock_, origin1_,
2454 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452455
2456 QuicStreamOffset request_header_offset(0);
2457 QuicStreamOffset response_header_offset(0);
2458
2459 MockQuicData mock_quic_data;
alyssar2adf3ac2016-05-03 17:12:582460 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2461 1, kClientDataStreamId1, true, &request_header_offset, &client_maker1));
2462 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2463 1, kClientDataStreamId1, &response_header_offset, &server_maker1));
2464 mock_quic_data.AddRead(
2465 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker1));
2466 mock_quic_data.AddWrite(ConstructClientAckPacket(2, 2, 1, 1, &client_maker1));
bnc359ed2a2016-04-29 20:43:452467
alyssar2adf3ac2016-05-03 17:12:582468 QuicTestPacketMaker client_maker2(version_, 0, clock_, origin2_,
2469 Perspective::IS_CLIENT);
2470 QuicTestPacketMaker server_maker2(version_, 0, clock_, origin2_,
2471 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452472
alyssar2adf3ac2016-05-03 17:12:582473 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
2474 3, kClientDataStreamId2, false, &request_header_offset, &client_maker2));
2475 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
2476 3, kClientDataStreamId2, &response_header_offset, &server_maker2));
2477 mock_quic_data.AddRead(
2478 ConstructServerDataPacket(4, kClientDataStreamId2, &server_maker2));
2479 mock_quic_data.AddWrite(ConstructClientAckPacket(4, 4, 3, 1, &client_maker2));
bnc359ed2a2016-04-29 20:43:452480 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2481 mock_quic_data.AddRead(ASYNC, 0); // EOF
2482
2483 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2484
2485 AddHangingSocketData();
2486 AddHangingSocketData();
2487
2488 SendRequestAndExpectQuicResponse(origin1_);
2489 SendRequestAndExpectQuicResponse(origin2_);
2490
2491 EXPECT_TRUE(AllDataConsumed());
2492}
2493
2494// First request opens QUIC session to alternative service. Second request does
2495// not pool to it, even though destination matches, because certificate is not
2496// valid. Instead, a new QUIC session is opened to the same destination with a
2497// different QuicServerId.
2498TEST_P(QuicNetworkTransactionWithDestinationTest,
2499 DoNotPoolIfCertificateInvalid) {
2500 origin1_ = "news.example.org";
2501 origin2_ = "mail.example.com";
2502
2503 SetAlternativeService(origin1_);
2504 SetAlternativeService(origin2_);
2505
2506 scoped_refptr<X509Certificate> cert1(
2507 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
2508 bool unused;
2509 ASSERT_TRUE(cert1->VerifyNameMatch(origin1_, &unused));
2510 ASSERT_FALSE(cert1->VerifyNameMatch(origin2_, &unused));
2511 ASSERT_FALSE(cert1->VerifyNameMatch(kDifferentHostname, &unused));
2512
2513 scoped_refptr<X509Certificate> cert2(
2514 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
2515 ASSERT_TRUE(cert2->VerifyNameMatch(origin2_, &unused));
2516 ASSERT_FALSE(cert2->VerifyNameMatch(kDifferentHostname, &unused));
2517
2518 ProofVerifyDetailsChromium verify_details1;
2519 verify_details1.cert_verify_result.verified_cert = cert1;
2520 verify_details1.cert_verify_result.is_issued_by_known_root = true;
2521 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
2522
2523 ProofVerifyDetailsChromium verify_details2;
2524 verify_details2.cert_verify_result.verified_cert = cert2;
2525 verify_details2.cert_verify_result.is_issued_by_known_root = true;
2526 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
2527
alyssar2adf3ac2016-05-03 17:12:582528 QuicTestPacketMaker client_maker1(version_, 0, clock_, origin1_,
2529 Perspective::IS_CLIENT);
2530 QuicTestPacketMaker server_maker1(version_, 0, clock_, origin1_,
2531 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452532
2533 MockQuicData mock_quic_data1;
alyssar2adf3ac2016-05-03 17:12:582534 mock_quic_data1.AddWrite(ConstructClientRequestHeadersPacket(
2535 1, kClientDataStreamId1, true, &client_maker1));
2536 mock_quic_data1.AddRead(ConstructServerResponseHeadersPacket(
2537 1, kClientDataStreamId1, &server_maker1));
2538 mock_quic_data1.AddRead(
2539 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker1));
bnc359ed2a2016-04-29 20:43:452540 mock_quic_data1.AddWrite(
alyssar2adf3ac2016-05-03 17:12:582541 ConstructClientAckPacket(2, 2, 1, 1, &client_maker1));
bnc359ed2a2016-04-29 20:43:452542 mock_quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2543 mock_quic_data1.AddRead(ASYNC, 0); // EOF
2544
2545 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
2546
2547 AddHangingSocketData();
2548
alyssar2adf3ac2016-05-03 17:12:582549 QuicTestPacketMaker client_maker2(version_, 0, clock_, origin2_,
2550 Perspective::IS_CLIENT);
2551 QuicTestPacketMaker server_maker2(version_, 0, clock_, origin2_,
2552 Perspective::IS_SERVER);
bnc359ed2a2016-04-29 20:43:452553
2554 MockQuicData mock_quic_data2;
alyssar2adf3ac2016-05-03 17:12:582555 mock_quic_data2.AddWrite(ConstructClientRequestHeadersPacket(
2556 1, kClientDataStreamId1, true, &client_maker2));
2557 mock_quic_data2.AddRead(ConstructServerResponseHeadersPacket(
2558 1, kClientDataStreamId1, &server_maker2));
2559 mock_quic_data2.AddRead(
2560 ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker2));
bnc359ed2a2016-04-29 20:43:452561 mock_quic_data2.AddWrite(
alyssar2adf3ac2016-05-03 17:12:582562 ConstructClientAckPacket(2, 2, 1, 1, &client_maker2));
bnc359ed2a2016-04-29 20:43:452563 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
2564 mock_quic_data2.AddRead(ASYNC, 0); // EOF
2565
2566 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
2567
2568 AddHangingSocketData();
2569
2570 SendRequestAndExpectQuicResponse(origin1_);
2571 SendRequestAndExpectQuicResponse(origin2_);
2572
2573 EXPECT_TRUE(AllDataConsumed());
2574}
2575
[email protected]61a527782013-02-21 03:58:002576} // namespace test
2577} // namespace net