blob: effc7873932fa305f2fcc933c6cfdab2d82558f7 [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>
bnc912a04b2016-04-20 14:19:506#include <string>
7#include <utility>
[email protected]1e960032013-12-20 19:00:208#include <vector>
9
[email protected]61a527782013-02-21 03:58:0010#include "base/compiler_specific.h"
Avi Drissman13fc8932015-12-20 04:40:4611#include "base/macros.h"
mmenke651bae7f2015-12-18 21:26:4512#include "base/run_loop.h"
[email protected]98b20ce2013-05-10 05:55:2613#include "base/stl_util.h"
bnc8be55ebb2015-10-30 14:12:0714#include "base/strings/stringprintf.h"
rtenneti56977812016-01-15 19:26:5615#include "net/base/chunked_upload_data_stream.h"
tbansalfdf5665b2015-09-21 22:46:4016#include "net/base/socket_performance_watcher.h"
tbansal0f56a39a2016-04-07 22:03:3817#include "net/base/socket_performance_watcher_factory.h"
[email protected]61a527782013-02-21 03:58:0018#include "net/base/test_completion_callback.h"
bnc508835902015-05-12 20:10:2919#include "net/base/test_data_directory.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"
50#include "net/socket/socket_test_util.h"
51#include "net/socket/ssl_client_socket.h"
52#include "net/spdy/spdy_frame_builder.h"
53#include "net/spdy/spdy_framer.h"
[email protected]536fd0b2013-03-14 17:41:5754#include "net/ssl/ssl_config_service_defaults.h"
bnc508835902015-05-12 20:10:2955#include "net/test/cert_test_util.h"
[email protected]61a527782013-02-21 03:58:0056#include "testing/gtest/include/gtest/gtest.h"
57#include "testing/platform_test.h"
58
bnc508835902015-05-12 20:10:2959namespace net {
60namespace test {
[email protected]61a527782013-02-21 03:58:0061
62namespace {
63
rchf114d982015-10-21 01:34:5664static const char kQuicAlternateProtocolHeader[] =
[email protected]6d1b4ed2013-07-10 03:57:5465 "Alternate-Protocol: 443:quic\r\n\r\n";
rchf47265dc2016-03-21 21:33:1266static const char kQuicAlternateProtocolWithProbabilityHeader[] =
67 "Alternate-Protocol: 443:quic,p=.5\r\n\r\n";
rchf114d982015-10-21 01:34:5668static const char kQuicAlternateProtocolDifferentPortHeader[] =
69 "Alternate-Protocol: 137:quic\r\n\r\n";
70static const char kQuicAlternativeServiceHeader[] =
bncc958faa2015-07-31 18:14:5271 "Alt-Svc: quic=\":443\"\r\n\r\n";
rchf47265dc2016-03-21 21:33:1272static const char kQuicAlternativeServiceWithProbabilityHeader[] =
73 "Alt-Svc: quic=\":443\";p=\".5\"\r\n\r\n";
rchf114d982015-10-21 01:34:5674static const char kQuicAlternativeServiceDifferentPortHeader[] =
75 "Alt-Svc: quic=\":137\"\r\n\r\n";
[email protected]1e960032013-12-20 19:00:2076
rch9ae5b3b2016-02-11 00:36:2977const char kDefaultServerHostName[] = "mail.example.org";
bncb07c05532015-05-14 19:07:2078
[email protected]61a527782013-02-21 03:58:0079} // namespace
80
[email protected]1e960032013-12-20 19:00:2081// Helper class to encapsulate MockReads and MockWrites for QUIC.
82// Simplify ownership issues and the interaction with the MockSocketFactory.
83class MockQuicData {
84 public:
rtennetia004d332015-08-28 06:44:5785 MockQuicData() : packet_number_(0) {}
rcha5399e02015-04-21 19:32:0486
rjshaded5ced072015-12-18 19:26:0287 ~MockQuicData() { STLDeleteElements(&packets_); }
[email protected]1e960032013-12-20 19:00:2088
danakjad1777e2016-04-16 00:56:4289 void AddSynchronousRead(std::unique_ptr<QuicEncryptedPacket> packet) {
[email protected]1e960032013-12-20 19:00:2090 reads_.push_back(MockRead(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:5791 packet_number_++));
[email protected]1e960032013-12-20 19:00:2092 packets_.push_back(packet.release());
93 }
94
danakjad1777e2016-04-16 00:56:4295 void AddRead(std::unique_ptr<QuicEncryptedPacket> packet) {
rcha5399e02015-04-21 19:32:0496 reads_.push_back(
rtennetia004d332015-08-28 06:44:5797 MockRead(ASYNC, packet->data(), packet->length(), packet_number_++));
rcha5399e02015-04-21 19:32:0498 packets_.push_back(packet.release());
99 }
100
[email protected]1e960032013-12-20 19:00:20101 void AddRead(IoMode mode, int rv) {
rtennetia004d332015-08-28 06:44:57102 reads_.push_back(MockRead(mode, rv, packet_number_++));
[email protected]1e960032013-12-20 19:00:20103 }
104
danakjad1777e2016-04-16 00:56:42105 void AddWrite(std::unique_ptr<QuicEncryptedPacket> packet) {
[email protected]1e960032013-12-20 19:00:20106 writes_.push_back(MockWrite(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:57107 packet_number_++));
[email protected]1e960032013-12-20 19:00:20108 packets_.push_back(packet.release());
109 }
110
rcha5399e02015-04-21 19:32:04111 void AddSocketDataToFactory(MockClientSocketFactory* factory) {
rjshaded5ced072015-12-18 19:26:02112 MockRead* reads = reads_.empty() ? nullptr : &reads_[0];
113 MockWrite* writes = writes_.empty() ? nullptr : &writes_[0];
rcha5399e02015-04-21 19:32:04114 socket_data_.reset(
115 new SequencedSocketData(reads, reads_.size(), writes, writes_.size()));
[email protected]1e960032013-12-20 19:00:20116 factory->AddSocketDataProvider(socket_data_.get());
117 }
118
mmenkee24011922015-12-17 22:12:59119 void Resume() { socket_data_->Resume(); }
rchb27683c2015-07-29 23:53:50120
[email protected]1e960032013-12-20 19:00:20121 private:
122 std::vector<QuicEncryptedPacket*> packets_;
123 std::vector<MockWrite> writes_;
124 std::vector<MockRead> reads_;
rtennetia004d332015-08-28 06:44:57125 size_t packet_number_;
danakjad1777e2016-04-16 00:56:42126 std::unique_ptr<SequencedSocketData> socket_data_;
[email protected]1e960032013-12-20 19:00:20127};
128
tbansal7cec3812015-02-05 21:25:12129class ProxyHeadersHandler {
130 public:
131 ProxyHeadersHandler() : was_called_(false) {}
132
133 bool was_called() { return was_called_; }
134
135 void OnBeforeProxyHeadersSent(const ProxyInfo& proxy_info,
136 HttpRequestHeaders* request_headers) {
137 was_called_ = true;
138 }
139
140 private:
141 bool was_called_;
142};
143
tbansal0f56a39a2016-04-07 22:03:38144class TestSocketPerformanceWatcher : public SocketPerformanceWatcher {
tbansalfdf5665b2015-09-21 22:46:40145 public:
tbansal0f56a39a2016-04-07 22:03:38146 explicit TestSocketPerformanceWatcher(bool* rtt_notification_received)
147 : rtt_notification_received_(rtt_notification_received) {}
148 ~TestSocketPerformanceWatcher() override {}
tbansalfdf5665b2015-09-21 22:46:40149
tbansal0f56a39a2016-04-07 22:03:38150 bool ShouldNotifyUpdatedRTT() const override { return true; }
tbansalfdf5665b2015-09-21 22:46:40151
tbansal0f56a39a2016-04-07 22:03:38152 void OnUpdatedRTTAvailable(const base::TimeDelta& rtt) override {
153 *rtt_notification_received_ = true;
154 }
155
156 void OnConnectionChanged() override {}
157
158 private:
159 bool* rtt_notification_received_;
160
161 DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcher);
162};
163
164class TestSocketPerformanceWatcherFactory
165 : public SocketPerformanceWatcherFactory {
166 public:
167 TestSocketPerformanceWatcherFactory()
168 : watcher_count_(0u), rtt_notification_received_(false) {}
169 ~TestSocketPerformanceWatcherFactory() override {}
170
171 // SocketPerformanceWatcherFactory implementation:
danakjad1777e2016-04-16 00:56:42172 std::unique_ptr<SocketPerformanceWatcher> CreateSocketPerformanceWatcher(
tbansalc8a94ea2015-11-02 23:58:51173 const Protocol protocol) override {
174 if (protocol != PROTOCOL_QUIC) {
tbansal0f56a39a2016-04-07 22:03:38175 return nullptr;
tbansalc8a94ea2015-11-02 23:58:51176 }
177 ++watcher_count_;
danakjad1777e2016-04-16 00:56:42178 return std::unique_ptr<SocketPerformanceWatcher>(
tbansal0f56a39a2016-04-07 22:03:38179 new TestSocketPerformanceWatcher(&rtt_notification_received_));
tbansalfdf5665b2015-09-21 22:46:40180 }
181
tbansalc8a94ea2015-11-02 23:58:51182 size_t watcher_count() const { return watcher_count_; }
tbansalfdf5665b2015-09-21 22:46:40183
tbansalc8a94ea2015-11-02 23:58:51184 bool rtt_notification_received() const { return rtt_notification_received_; }
185
tbansalc8a94ea2015-11-02 23:58:51186 private:
tbansal0f56a39a2016-04-07 22:03:38187 size_t watcher_count_;
tbansalc8a94ea2015-11-02 23:58:51188 bool rtt_notification_received_;
tbansal0f56a39a2016-04-07 22:03:38189
190 DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcherFactory);
tbansalc8a94ea2015-11-02 23:58:51191};
192
[email protected]1e960032013-12-20 19:00:20193class QuicNetworkTransactionTest
194 : public PlatformTest,
[email protected]5d03bbd2014-03-07 16:19:16195 public ::testing::WithParamInterface<QuicVersion> {
[email protected]61a527782013-02-21 03:58:00196 protected:
[email protected]1c04f9522013-02-21 20:32:43197 QuicNetworkTransactionTest()
rtenneti4b06ae72014-08-26 03:43:43198 : clock_(new MockClock),
bncb07c05532015-05-14 19:07:20199 maker_(GetParam(), 0, clock_, kDefaultServerHostName),
rtenneti052774e2015-11-24 21:00:12200 cert_transparency_verifier_(new MultiLogCTVerifier()),
[email protected]1c04f9522013-02-21 20:32:43201 ssl_config_service_(new SSLConfigServiceDefaults),
202 proxy_service_(ProxyService::CreateDirect()),
203 auth_handler_factory_(
[email protected]dda75ab2013-06-22 22:43:30204 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
[email protected]457d6952013-12-13 09:24:58205 random_generator_(0),
rchf114d982015-10-21 01:34:56206 ssl_data_(ASYNC, OK) {
[email protected]aa9b14d2013-05-10 23:45:19207 request_.method = "GET";
rchf114d982015-10-21 01:34:56208 std::string url("https://");
bncb07c05532015-05-14 19:07:20209 url.append(kDefaultServerHostName);
210 request_.url = GURL(url);
[email protected]aa9b14d2013-05-10 23:45:19211 request_.load_flags = 0;
[email protected]98a9d1252014-04-04 00:43:59212 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
rchf114d982015-10-21 01:34:56213
rch3f4b8452016-02-23 16:59:32214 params_.parse_alternative_services = true;
215 params_.enable_alternative_service_with_different_host = true;
216
rchf114d982015-10-21 01:34:56217 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29218 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
rchf114d982015-10-21 01:34:56219 verify_details_.cert_verify_result.verified_cert = cert;
220 verify_details_.cert_verify_result.is_issued_by_known_root = true;
221 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
[email protected]1c04f9522013-02-21 20:32:43222 }
[email protected]61a527782013-02-21 03:58:00223
dcheng67be2b1f2014-10-27 21:47:29224 void SetUp() override {
[email protected]61a527782013-02-21 03:58:00225 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34226 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00227 }
228
dcheng67be2b1f2014-10-27 21:47:29229 void TearDown() override {
[email protected]61a527782013-02-21 03:58:00230 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
231 // Empty the current queue.
[email protected]2da659e2013-05-23 20:51:34232 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00233 PlatformTest::TearDown();
234 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34235 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00236 }
237
danakjad1777e2016-04-16 00:56:42238 std::unique_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
rtennetia004d332015-08-28 06:44:57239 QuicPacketNumber num) {
[email protected]1e960032013-12-20 19:00:20240 return maker_.MakeConnectionClosePacket(num);
[email protected]3316d422013-05-03 21:45:30241 }
242
danakjad1777e2016-04-16 00:56:42243 std::unique_ptr<QuicEncryptedPacket> ConstructGoAwayPacket(
zhongyi6b5a3892016-03-12 04:46:20244 QuicPacketNumber num,
245 QuicErrorCode error_code,
246 std::string reason_phrase) {
247 return maker_.MakeGoAwayPacket(num, error_code, reason_phrase);
248 }
249
danakjad1777e2016-04-16 00:56:42250 std::unique_ptr<QuicEncryptedPacket> ConstructAckPacket(
rtennetia004d332015-08-28 06:44:57251 QuicPacketNumber largest_received,
252 QuicPacketNumber least_unacked) {
zhongyi32569c62016-01-08 02:54:30253 return maker_.MakeAckPacket(2, largest_received, least_unacked,
254 least_unacked, true);
255 }
256
danakjad1777e2016-04-16 00:56:42257 std::unique_ptr<QuicEncryptedPacket> ConstructAckAndRstPacket(
zhongyi6b5a3892016-03-12 04:46:20258 QuicPacketNumber num,
259 QuicStreamId stream_id,
260 QuicRstStreamErrorCode error_code,
261 QuicPacketNumber largest_received,
262 QuicPacketNumber ack_least_unacked,
263 QuicPacketNumber stop_least_unacked) {
264 return maker_.MakeAckAndRstPacket(num, false, stream_id, error_code,
265 largest_received, ack_least_unacked,
266 stop_least_unacked, true);
267 }
268
danakjad1777e2016-04-16 00:56:42269 std::unique_ptr<QuicEncryptedPacket> ConstructAckPacket(
zhongyi32569c62016-01-08 02:54:30270 QuicPacketNumber largest_received,
271 QuicPacketNumber least_unacked,
272 QuicTestPacketMaker* maker) {
273 return maker->MakeAckPacket(2, largest_received, least_unacked,
274 least_unacked, true);
275 }
276
danakjad1777e2016-04-16 00:56:42277 std::unique_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket(
zhongyi32569c62016-01-08 02:54:30278 QuicPacketNumber packet_number,
279 QuicPacketNumber largest_received,
280 QuicPacketNumber ack_least_unacked,
281 QuicPacketNumber stop_least_unacked) {
282 return maker_.MakeAckPacket(packet_number, largest_received,
283 ack_least_unacked, stop_least_unacked, true);
[email protected]1e960032013-12-20 19:00:20284 }
[email protected]61a527782013-02-21 03:58:00285
danakjad1777e2016-04-16 00:56:42286 std::unique_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket(
zhongyica364fbb2015-12-12 03:39:12287 QuicPacketNumber num,
288 QuicTime::Delta delta_time_largest_observed,
289 QuicPacketNumber largest_received,
290 QuicPacketNumber least_unacked,
291 QuicErrorCode quic_error,
bnc912a04b2016-04-20 14:19:50292 const std::string& quic_error_details) {
zhongyica364fbb2015-12-12 03:39:12293 return maker_.MakeAckAndConnectionClosePacket(
294 num, false, delta_time_largest_observed, largest_received,
295 least_unacked, quic_error, quic_error_details);
296 }
297
danakjad1777e2016-04-16 00:56:42298 std::unique_ptr<QuicEncryptedPacket> ConstructRstPacket(
zhongyica364fbb2015-12-12 03:39:12299 QuicPacketNumber num,
300 bool include_version,
301 QuicStreamId stream_id,
302 QuicRstStreamErrorCode error_code) {
303 return maker_.MakeRstPacket(num, include_version, stream_id, error_code);
304 }
305
zhongyi32569c62016-01-08 02:54:30306 // Uses default QuicTestPacketMaker.
[email protected]1e960032013-12-20 19:00:20307 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
308 const std::string& scheme,
309 const std::string& path) {
bnc912a04b2016-04-20 14:19:50310 return GetRequestHeaders(method, scheme, path, &maker_);
zhongyi32569c62016-01-08 02:54:30311 }
312
313 // Uses customized QuicTestPacketMaker.
314 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
315 const std::string& scheme,
316 const std::string& path,
bnc912a04b2016-04-20 14:19:50317 QuicTestPacketMaker* maker) {
318 return maker->GetRequestHeaders(method, scheme, path);
[email protected]61a527782013-02-21 03:58:00319 }
320
[email protected]1e960032013-12-20 19:00:20321 SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
322 return maker_.GetResponseHeaders(status);
[email protected]61a527782013-02-21 03:58:00323 }
324
zhongyi32569c62016-01-08 02:54:30325 // Appends alt_svc headers in the response headers.
326 SpdyHeaderBlock GetResponseHeaders(const std::string& status,
327 const std::string& alt_svc) {
328 return maker_.GetResponseHeaders(status, alt_svc);
329 }
330
danakjad1777e2016-04-16 00:56:42331 std::unique_ptr<QuicEncryptedPacket> ConstructDataPacket(
rtennetia004d332015-08-28 06:44:57332 QuicPacketNumber packet_number,
[email protected]98b20ce2013-05-10 05:55:26333 QuicStreamId stream_id,
[email protected]e8ff26842013-03-22 21:02:05334 bool should_include_version,
[email protected]61a527782013-02-21 03:58:00335 bool fin,
336 QuicStreamOffset offset,
337 base::StringPiece data) {
rtennetia004d332015-08-28 06:44:57338 return maker_.MakeDataPacket(packet_number, stream_id,
339 should_include_version, fin, offset, data);
[email protected]61a527782013-02-21 03:58:00340 }
341
danakjad1777e2016-04-16 00:56:42342 std::unique_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
rtennetia004d332015-08-28 06:44:57343 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20344 QuicStreamId stream_id,
345 bool should_include_version,
346 bool fin,
zhongyi32569c62016-01-08 02:54:30347 const SpdyHeaderBlock& headers,
348 QuicStreamOffset* offset) {
ianswett0888cff2015-11-24 17:42:16349 SpdyPriority priority =
rtennetif4bdb542015-01-21 14:33:05350 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
zhongyi32569c62016-01-08 02:54:30351 return maker_.MakeRequestHeadersPacketWithOffsetTracking(
352 packet_number, stream_id, should_include_version, fin, priority,
353 headers, offset);
354 }
355
danakjad1777e2016-04-16 00:56:42356 std::unique_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30357 QuicPacketNumber packet_number,
358 QuicStreamId stream_id,
359 bool should_include_version,
360 bool fin,
361 const SpdyHeaderBlock& headers,
362 QuicStreamOffset* offset,
363 QuicTestPacketMaker* maker) {
364 SpdyPriority priority =
365 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
366 return maker->MakeRequestHeadersPacketWithOffsetTracking(
367 packet_number, stream_id, should_include_version, fin, priority,
368 headers, offset);
369 }
370
danakjad1777e2016-04-16 00:56:42371 std::unique_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30372 QuicPacketNumber packet_number,
373 QuicStreamId stream_id,
374 bool should_include_version,
375 bool fin,
376 const SpdyHeaderBlock& headers) {
377 return ConstructRequestHeadersPacket(packet_number, stream_id,
378 should_include_version, fin, headers,
379 nullptr, &maker_);
380 }
danakjad1777e2016-04-16 00:56:42381 std::unique_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
zhongyi32569c62016-01-08 02:54:30382 QuicPacketNumber packet_number,
383 QuicStreamId stream_id,
384 bool should_include_version,
385 bool fin,
386 const SpdyHeaderBlock& headers,
387 QuicTestPacketMaker* maker) {
388 return ConstructRequestHeadersPacket(packet_number, stream_id,
389 should_include_version, fin, headers,
390 nullptr, maker);
[email protected]61a527782013-02-21 03:58:00391 }
392
danakjad1777e2016-04-16 00:56:42393 std::unique_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
rtennetia004d332015-08-28 06:44:57394 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20395 QuicStreamId stream_id,
396 bool should_include_version,
397 bool fin,
398 const SpdyHeaderBlock& headers) {
zhongyi32569c62016-01-08 02:54:30399 return ConstructResponseHeadersPacket(packet_number, stream_id,
400 should_include_version, fin, headers,
401 nullptr, &maker_);
402 }
403
danakjad1777e2016-04-16 00:56:42404 std::unique_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30405 QuicPacketNumber packet_number,
406 QuicStreamId stream_id,
407 bool should_include_version,
408 bool fin,
409 const SpdyHeaderBlock& headers,
410 QuicTestPacketMaker* maker) {
411 return ConstructResponseHeadersPacket(packet_number, stream_id,
412 should_include_version, fin, headers,
413 nullptr, maker);
414 }
415
danakjad1777e2016-04-16 00:56:42416 std::unique_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30417 QuicPacketNumber packet_number,
418 QuicStreamId stream_id,
419 bool should_include_version,
420 bool fin,
421 const SpdyHeaderBlock& headers,
422 QuicStreamOffset* offset) {
423 return maker_.MakeResponseHeadersPacketWithOffsetTracking(
424 packet_number, stream_id, should_include_version, fin, headers, offset);
425 }
426
danakjad1777e2016-04-16 00:56:42427 std::unique_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:30428 QuicPacketNumber packet_number,
429 QuicStreamId stream_id,
430 bool should_include_version,
431 bool fin,
432 const SpdyHeaderBlock& headers,
433 QuicStreamOffset* offset,
434 QuicTestPacketMaker* maker) {
435 return maker->MakeResponseHeadersPacketWithOffsetTracking(
436 packet_number, stream_id, should_include_version, fin, headers, offset);
[email protected]61a527782013-02-21 03:58:00437 }
438
bnc912a04b2016-04-20 14:19:50439 void CreateSession() {
[email protected]4dca587c2013-03-07 16:54:47440 params_.enable_quic = true;
441 params_.quic_clock = clock_;
442 params_.quic_random = &random_generator_;
bnc912a04b2016-04-20 14:19:50443 params_.client_socket_factory = &socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05444 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43445 params_.host_resolver = &host_resolver_;
446 params_.cert_verifier = &cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11447 params_.transport_security_state = &transport_security_state_;
rtenneti052774e2015-11-24 21:00:12448 params_.cert_transparency_verifier = cert_transparency_verifier_.get();
tbansalfdf5665b2015-09-21 22:46:40449 params_.socket_performance_watcher_factory =
tbansal0f56a39a2016-04-07 22:03:38450 &test_socket_performance_watcher_factory_;
[email protected]1c04f9522013-02-21 20:32:43451 params_.proxy_service = proxy_service_.get();
452 params_.ssl_config_service = ssl_config_service_.get();
453 params_.http_auth_handler_factory = auth_handler_factory_.get();
bnc6be245c12015-05-15 11:24:07454 params_.http_server_properties = http_server_properties_.GetWeakPtr();
[email protected]1e960032013-12-20 19:00:20455 params_.quic_supported_versions = SupportedVersions(GetParam());
rch74da0e1a2016-01-14 02:49:32456 for (const char* host :
rch9ae5b3b2016-02-11 00:36:29457 {kDefaultServerHostName, "www.example.org", "news.example.org",
458 "bar.example.org", "foo.example.org", "invalid.example.org",
459 "mail.example.com"}) {
rch74da0e1a2016-01-14 02:49:32460 params_.quic_host_whitelist.insert(host);
461 }
[email protected]61a527782013-02-21 03:58:00462
mmenkee65e7af2015-10-13 17:16:42463 session_.reset(new HttpNetworkSession(params_));
[email protected]11c05872013-08-20 02:04:12464 session_->quic_stream_factory()->set_require_confirmation(false);
rch185ebee2015-07-14 23:56:22465 ASSERT_EQ(params_.quic_socket_receive_buffer_size,
466 session_->quic_stream_factory()->socket_receive_buffer_size());
[email protected]61a527782013-02-21 03:58:00467 }
468
danakjad1777e2016-04-16 00:56:42469 void CheckWasQuicResponse(
470 const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19471 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42472 ASSERT_TRUE(response != nullptr);
473 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19474 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
475 EXPECT_TRUE(response->was_fetched_via_spdy);
476 EXPECT_TRUE(response->was_npn_negotiated);
477 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
478 response->connection_info);
479 }
480
danakjad1777e2016-04-16 00:56:42481 void CheckResponsePort(const std::unique_ptr<HttpNetworkTransaction>& trans,
Avi Drissman13fc8932015-12-20 04:40:46482 uint16_t port) {
bnc62a44f022015-04-02 15:59:41483 const HttpResponseInfo* response = trans->GetResponseInfo();
484 ASSERT_TRUE(response != nullptr);
485 EXPECT_EQ(port, response->socket_address.port());
486 }
487
danakjad1777e2016-04-16 00:56:42488 void CheckWasHttpResponse(
489 const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19490 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42491 ASSERT_TRUE(response != nullptr);
492 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19493 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
494 EXPECT_FALSE(response->was_fetched_via_spdy);
495 EXPECT_FALSE(response->was_npn_negotiated);
496 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1,
497 response->connection_info);
498 }
499
danakjad1777e2016-04-16 00:56:42500 void CheckResponseData(const std::unique_ptr<HttpNetworkTransaction>& trans,
[email protected]aa9b14d2013-05-10 23:45:19501 const std::string& expected) {
502 std::string response_data;
bncffc2fdf2015-05-14 18:29:49503 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
[email protected]aa9b14d2013-05-10 23:45:19504 EXPECT_EQ(expected, response_data);
505 }
506
danakjad1777e2016-04-16 00:56:42507 void RunTransaction(const std::unique_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19508 TestCompletionCallback callback;
509 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
510 EXPECT_EQ(ERR_IO_PENDING, rv);
511 EXPECT_EQ(OK, callback.WaitForResult());
512 }
513
514 void SendRequestAndExpectHttpResponse(const std::string& expected) {
danakjad1777e2016-04-16 00:56:42515 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50516 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
bncffc2fdf2015-05-14 18:29:49517 RunTransaction(trans);
[email protected]aa9b14d2013-05-10 23:45:19518 CheckWasHttpResponse(trans);
bncffc2fdf2015-05-14 18:29:49519 CheckResponseData(trans, expected);
[email protected]aa9b14d2013-05-10 23:45:19520 }
521
522 void SendRequestAndExpectQuicResponse(const std::string& expected) {
rchf114d982015-10-21 01:34:56523 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, 443);
tbansal7cec3812015-02-05 21:25:12524 }
525
bnc62a44f022015-04-02 15:59:41526 void SendRequestAndExpectQuicResponseOnPort(const std::string& expected,
Avi Drissman13fc8932015-12-20 04:40:46527 uint16_t port) {
bnc62a44f022015-04-02 15:59:41528 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, port);
529 }
530
531 void SendRequestAndExpectQuicResponseFromProxyOnPort(
532 const std::string& expected,
Avi Drissman13fc8932015-12-20 04:40:46533 uint16_t port) {
bnc62a44f022015-04-02 15:59:41534 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port);
[email protected]aa9b14d2013-05-10 23:45:19535 }
536
537 void AddQuicAlternateProtocolMapping(
538 MockCryptoClientStream::HandshakeMode handshake_mode) {
539 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
bnccacc0992015-03-20 20:22:22540 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url);
rchf114d982015-10-21 01:34:56541 AlternativeService alternative_service(QUIC, host_port_pair.host(), 443);
bnc7dc7e1b42015-07-28 14:43:12542 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
543 http_server_properties_.SetAlternativeService(
rchdc7b9052016-03-17 20:51:50544 host_port_pair, alternative_service, expiration);
[email protected]aa9b14d2013-05-10 23:45:19545 }
546
rchbe69cb902016-02-11 01:10:48547 void AddQuicRemoteAlternativeServiceMapping(
548 MockCryptoClientStream::HandshakeMode handshake_mode,
549 const HostPortPair& alternative) {
550 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
551 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url);
552 AlternativeService alternative_service(QUIC, alternative.host(),
553 alternative.port());
554 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
555 http_server_properties_.SetAlternativeService(
rchdc7b9052016-03-17 20:51:50556 host_port_pair, alternative_service, expiration);
rchbe69cb902016-02-11 01:10:48557 }
558
[email protected]aa9b14d2013-05-10 23:45:19559 void ExpectBrokenAlternateProtocolMapping() {
bnc8445b3002015-03-13 01:57:09560 const HostPortPair origin = HostPortPair::FromURL(request_.url);
bncd9b132e2015-07-08 05:16:10561 const AlternativeServiceVector alternative_service_vector =
562 http_server_properties_.GetAlternativeServices(origin);
563 EXPECT_EQ(1u, alternative_service_vector.size());
bnc6be245c12015-05-15 11:24:07564 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken(
bncd9b132e2015-07-08 05:16:10565 alternative_service_vector[0]));
[email protected]aa9b14d2013-05-10 23:45:19566 }
567
[email protected]4d590c9c2014-05-02 05:14:33568 void ExpectQuicAlternateProtocolMapping() {
bncd9b132e2015-07-08 05:16:10569 const HostPortPair origin = HostPortPair::FromURL(request_.url);
570 const AlternativeServiceVector alternative_service_vector =
571 http_server_properties_.GetAlternativeServices(origin);
572 EXPECT_EQ(1u, alternative_service_vector.size());
573 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
[email protected]4d590c9c2014-05-02 05:14:33574 }
575
[email protected]aa9b14d2013-05-10 23:45:19576 void AddHangingNonAlternateProtocolSocketData() {
danakjad1777e2016-04-16 00:56:42577 std::unique_ptr<StaticSocketDataProvider> hanging_data;
zhongyi32569c62016-01-08 02:54:30578 hanging_data.reset(new StaticSocketDataProvider());
[email protected]dda75ab2013-06-22 22:43:30579 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
zhongyi32569c62016-01-08 02:54:30580 hanging_data->set_connect_data(hanging_connect);
581 hanging_data_.push_back(std::move(hanging_data));
582 socket_factory_.AddSocketDataProvider(hanging_data_.back().get());
rchf114d982015-10-21 01:34:56583 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]aa9b14d2013-05-10 23:45:19584 }
585
rtenneti4b06ae72014-08-26 03:43:43586 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
[email protected]1e960032013-12-20 19:00:20587 QuicTestPacketMaker maker_;
danakjad1777e2016-04-16 00:56:42588 std::unique_ptr<HttpNetworkSession> session_;
[email protected]61a527782013-02-21 03:58:00589 MockClientSocketFactory socket_factory_;
rchf114d982015-10-21 01:34:56590 ProofVerifyDetailsChromium verify_details_;
[email protected]e8ff26842013-03-22 21:02:05591 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43592 MockHostResolver host_resolver_;
593 MockCertVerifier cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11594 TransportSecurityState transport_security_state_;
danakjad1777e2016-04-16 00:56:42595 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
tbansal0f56a39a2016-04-07 22:03:38596 TestSocketPerformanceWatcherFactory test_socket_performance_watcher_factory_;
[email protected]1c04f9522013-02-21 20:32:43597 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
danakjad1777e2016-04-16 00:56:42598 std::unique_ptr<ProxyService> proxy_service_;
599 std::unique_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
[email protected]61a527782013-02-21 03:58:00600 MockRandom random_generator_;
bnc6be245c12015-05-15 11:24:07601 HttpServerPropertiesImpl http_server_properties_;
[email protected]61a527782013-02-21 03:58:00602 HttpNetworkSession::Params params_;
[email protected]aa9b14d2013-05-10 23:45:19603 HttpRequestInfo request_;
vishal.b62985ca92015-04-17 08:45:51604 BoundTestNetLog net_log_;
danakjad1777e2016-04-16 00:56:42605 std::vector<std::unique_ptr<StaticSocketDataProvider>> hanging_data_;
rchf114d982015-10-21 01:34:56606 SSLSocketDataProvider ssl_data_;
tbansal7cec3812015-02-05 21:25:12607
608 private:
609 void SendRequestAndExpectQuicResponseMaybeFromProxy(
610 const std::string& expected,
bnc62a44f022015-04-02 15:59:41611 bool used_proxy,
Avi Drissman13fc8932015-12-20 04:40:46612 uint16_t port) {
danakjad1777e2016-04-16 00:56:42613 std::unique_ptr<HttpNetworkTransaction> trans(
tbansal7cec3812015-02-05 21:25:12614 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
615 ProxyHeadersHandler proxy_headers_handler;
616 trans->SetBeforeProxyHeadersSentCallback(
617 base::Bind(&ProxyHeadersHandler::OnBeforeProxyHeadersSent,
618 base::Unretained(&proxy_headers_handler)));
bncffc2fdf2015-05-14 18:29:49619 RunTransaction(trans);
tbansal7cec3812015-02-05 21:25:12620 CheckWasQuicResponse(trans);
bnc62a44f022015-04-02 15:59:41621 CheckResponsePort(trans, port);
bncffc2fdf2015-05-14 18:29:49622 CheckResponseData(trans, expected);
tbansal7cec3812015-02-05 21:25:12623 EXPECT_EQ(used_proxy, proxy_headers_handler.was_called());
624 }
[email protected]61a527782013-02-21 03:58:00625};
626
rjshaded5ced072015-12-18 19:26:02627INSTANTIATE_TEST_CASE_P(Version,
628 QuicNetworkTransactionTest,
[email protected]1e960032013-12-20 19:00:20629 ::testing::ValuesIn(QuicSupportedVersions()));
630
631TEST_P(QuicNetworkTransactionTest, ForceQuic) {
rtenneti8a2f4632016-03-21 20:26:57632 params_.origins_to_force_quic_on.insert(
633 HostPortPair::FromString("mail.example.org:443"));
[email protected]4dca587c2013-03-07 16:54:47634
[email protected]1e960032013-12-20 19:00:20635 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03636 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05637 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56638 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:02639 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
640 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:03641 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05642 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03643 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:59644 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
[email protected]4dca587c2013-03-07 16:54:47645
rcha5399e02015-04-21 19:32:04646 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4dca587c2013-03-07 16:54:47647
[email protected]aa9b14d2013-05-10 23:45:19648 // The non-alternate protocol job needs to hang in order to guarantee that
649 // the alternate-protocol job will "win".
650 AddHangingNonAlternateProtocolSocketData();
[email protected]4dca587c2013-03-07 16:54:47651
rch3f4b8452016-02-23 16:59:32652 params_.parse_alternative_services = false;
653 params_.enable_alternative_service_with_different_host = false;
[email protected]4dca587c2013-03-07 16:54:47654 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47655
tbansal0f56a39a2016-04-07 22:03:38656 EXPECT_FALSE(
657 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]aa9b14d2013-05-10 23:45:19658 SendRequestAndExpectQuicResponse("hello!");
tbansal0f56a39a2016-04-07 22:03:38659 EXPECT_TRUE(
660 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]4dca587c2013-03-07 16:54:47661
[email protected]98b20ce2013-05-10 05:55:26662 // Check that the NetLog was filled reasonably.
mmenke43758e62015-05-04 21:09:46663 TestNetLogEntry::List entries;
[email protected]aa9b14d2013-05-10 23:45:19664 net_log_.GetEntries(&entries);
[email protected]98b20ce2013-05-10 05:55:26665 EXPECT_LT(0u, entries.size());
666
667 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29668 int pos = ExpectLogContainsSomewhere(
669 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
670 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26671 EXPECT_LT(0, pos);
672
rchfd527212015-08-25 00:41:26673 // ... and also a TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29674 pos = ExpectLogContainsSomewhere(
rchfd527212015-08-25 00:41:26675 entries, 0,
676 NetLog::TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED,
ttuttle859dc7a2015-04-23 19:42:29677 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26678 EXPECT_LT(0, pos);
679
rtennetia004d332015-08-28 06:44:57680 std::string packet_number;
681 ASSERT_TRUE(entries[pos].GetStringValue("packet_number", &packet_number));
682 EXPECT_EQ("1", packet_number);
[email protected]98b20ce2013-05-10 05:55:26683
rchfd527212015-08-25 00:41:26684 // ... and also a TYPE_QUIC_SESSION_PACKET_AUTHENTICATED.
685 pos = ExpectLogContainsSomewhere(
686 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_AUTHENTICATED,
687 NetLog::PHASE_NONE);
688 EXPECT_LT(0, pos);
689
[email protected]98b20ce2013-05-10 05:55:26690 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29691 pos = ExpectLogContainsSomewhere(
692 entries, 0, NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
693 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26694 EXPECT_LT(0, pos);
695
696 int log_stream_id;
697 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
[email protected]1e960032013-12-20 19:00:20698 EXPECT_EQ(3, log_stream_id);
[email protected]4dca587c2013-03-07 16:54:47699}
700
[email protected]cf3e3cd62014-02-05 16:16:16701TEST_P(QuicNetworkTransactionTest, QuicProxy) {
tbansaled0aecc2015-02-20 03:44:18702 params_.enable_quic_for_proxies = true;
rchf114d982015-10-21 01:34:56703 proxy_service_ =
rch9ae5b3b2016-02-11 00:36:29704 ProxyService::CreateFixedFromPacResult("QUIC mail.example.org:70");
[email protected]cf3e3cd62014-02-05 16:16:16705
[email protected]cf3e3cd62014-02-05 16:16:16706 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03707 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05708 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03709 GetRequestHeaders("GET", "http", "/")));
rjshaded5ced072015-12-18 19:26:02710 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
711 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:03712 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05713 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03714 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50715 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59716 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]cf3e3cd62014-02-05 16:16:16717
rcha5399e02015-04-21 19:32:04718 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cf3e3cd62014-02-05 16:16:16719
tbansal0f56a39a2016-04-07 22:03:38720 EXPECT_FALSE(
721 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16722 // There is no need to set up an alternate protocol job, because
723 // no attempt will be made to speak to the proxy over TCP.
724
rch9ae5b3b2016-02-11 00:36:29725 request_.url = GURL("http://mail.example.org/");
rch3f4b8452016-02-23 16:59:32726 params_.parse_alternative_services = false;
727 params_.enable_alternative_service_with_different_host = false;
[email protected]cf3e3cd62014-02-05 16:16:16728 CreateSession();
729
bnc62a44f022015-04-02 15:59:41730 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
tbansal0f56a39a2016-04-07 22:03:38731 EXPECT_TRUE(
732 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16733}
734
bnc313ba9c2015-06-11 15:42:31735// Regression test for https://crbug.com/492458. Test that for an HTTP
736// connection through a QUIC proxy, the certificate exhibited by the proxy is
737// checked against the proxy hostname, not the origin hostname.
738TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) {
rch9ae5b3b2016-02-11 00:36:29739 const std::string origin_host = "mail.example.com";
bnc313ba9c2015-06-11 15:42:31740 const std::string proxy_host = "www.example.org";
741
742 params_.enable_quic_for_proxies = true;
rdsmith82957ad2015-09-16 19:42:03743 proxy_service_ =
744 ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70");
bnc313ba9c2015-06-11 15:42:31745
746 maker_.set_hostname(origin_host);
747 MockQuicData mock_quic_data;
748 mock_quic_data.AddWrite(
749 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
750 GetRequestHeaders("GET", "http", "/")));
751 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
752 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
753 mock_quic_data.AddRead(
754 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
755 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50756 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59757 mock_quic_data.AddRead(ASYNC, 0);
bnc313ba9c2015-06-11 15:42:31758 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
759
760 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29761 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bnc313ba9c2015-06-11 15:42:31762 ASSERT_TRUE(cert.get());
763 // This certificate is valid for the proxy, but not for the origin.
764 bool common_name_fallback_used;
765 EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used));
766 EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used));
767 ProofVerifyDetailsChromium verify_details;
768 verify_details.cert_verify_result.verified_cert = cert;
769 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rchf114d982015-10-21 01:34:56770 ProofVerifyDetailsChromium verify_details2;
771 verify_details2.cert_verify_result.verified_cert = cert;
772 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
bnc313ba9c2015-06-11 15:42:31773
774 request_.url = GURL("http://" + origin_host);
775 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32776 CreateSession();
bnc313ba9c2015-06-11 15:42:31777 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
778 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
779}
780
rchbe69cb902016-02-11 01:10:48781TEST_P(QuicNetworkTransactionTest, AlternativeServicesDifferentHost) {
782 params_.enable_alternative_service_with_different_host = true;
783 HostPortPair origin("www.example.org", 443);
784 HostPortPair alternative("mail.example.org", 443);
785
786 base::FilePath certs_dir = GetTestCertsDirectory();
787 scoped_refptr<X509Certificate> cert(
788 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
789 ASSERT_TRUE(cert.get());
790 // TODO(rch): the connection should be "to" the origin, so if the cert is
791 // valid for the origin but not the alternative, that should work too.
792 bool common_name_fallback_used;
793 EXPECT_TRUE(cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
794 EXPECT_TRUE(
795 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
796 ProofVerifyDetailsChromium verify_details;
797 verify_details.cert_verify_result.verified_cert = cert;
798 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
799
800 maker_.set_hostname(origin.host());
801 MockQuicData mock_quic_data;
802 mock_quic_data.AddWrite(
803 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
804 GetRequestHeaders("GET", "https", "/")));
805 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
806 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
807 mock_quic_data.AddRead(
808 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
809 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
810 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
811 mock_quic_data.AddRead(ASYNC, 0);
812 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
813
814 request_.url = GURL("https://" + origin.host());
815 AddQuicRemoteAlternativeServiceMapping(
816 MockCryptoClientStream::CONFIRM_HANDSHAKE, alternative);
817 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32818 CreateSession();
rchbe69cb902016-02-11 01:10:48819
820 SendRequestAndExpectQuicResponse("hello!");
821}
822
[email protected]1e960032013-12-20 19:00:20823TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
rtenneti8a2f4632016-03-21 20:26:57824 params_.origins_to_force_quic_on.insert(
825 HostPortPair::FromString("mail.example.org:443"));
[email protected]cebe3282013-05-22 23:49:30826
tbansalfdf5665b2015-09-21 22:46:40827 MockQuicData mock_quic_data1;
828 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
[email protected]1e960032013-12-20 19:00:20829
tbansalfdf5665b2015-09-21 22:46:40830 MockQuicData mock_quic_data2;
zhongyi32569c62016-01-08 02:54:30831 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40832 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
rch6faa4d42016-01-05 20:48:43833 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40834
835 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
836 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
[email protected]cebe3282013-05-22 23:49:30837
rch3f4b8452016-02-23 16:59:32838 params_.parse_alternative_services = false;
839 params_.enable_alternative_service_with_different_host = false;
[email protected]cebe3282013-05-22 23:49:30840 CreateSession();
841
tbansal0f56a39a2016-04-07 22:03:38842 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40843 for (size_t i = 0; i < 2; ++i) {
danakjad1777e2016-04-16 00:56:42844 std::unique_ptr<HttpNetworkTransaction> trans(
tbansalfdf5665b2015-09-21 22:46:40845 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
846 TestCompletionCallback callback;
847 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
848 EXPECT_EQ(ERR_IO_PENDING, rv);
849 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
tbansal0f56a39a2016-04-07 22:03:38850 EXPECT_EQ(1 + i, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40851 }
[email protected]cebe3282013-05-22 23:49:30852}
853
tbansalc8a94ea2015-11-02 23:58:51854TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
855 // Attempt to "force" quic on 443, which will not be honored.
rtenneti8a2f4632016-03-21 20:26:57856 params_.origins_to_force_quic_on.insert(
857 HostPortPair::FromString("www.google.com:443"));
tbansalc8a94ea2015-11-02 23:58:51858
859 MockRead http_reads[] = {
860 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
861 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
862 MockRead(ASYNC, OK)};
863
864 StaticSocketDataProvider data(http_reads, arraysize(http_reads), nullptr, 0);
865 socket_factory_.AddSocketDataProvider(&data);
866 SSLSocketDataProvider ssl(ASYNC, OK);
867 socket_factory_.AddSSLSocketDataProvider(&ssl);
868
rch3f4b8452016-02-23 16:59:32869 params_.parse_alternative_services = false;
870 params_.enable_alternative_service_with_different_host = false;
tbansalc8a94ea2015-11-02 23:58:51871 CreateSession();
872
873 SendRequestAndExpectHttpResponse("hello world");
tbansal0f56a39a2016-04-07 22:03:38874 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalc8a94ea2015-11-02 23:58:51875}
876
bncc958faa2015-07-31 18:14:52877TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52878 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56879 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
880 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52881 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
882 MockRead(ASYNC, OK)};
883
884 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
885 0);
886 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56887 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52888
889 MockQuicData mock_quic_data;
890 mock_quic_data.AddWrite(
891 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56892 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52893 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
894 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
895 mock_quic_data.AddRead(
896 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
897 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
898 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59899 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52900
901 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
902
903 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32904 CreateSession();
bncc958faa2015-07-31 18:14:52905
906 SendRequestAndExpectHttpResponse("hello world");
907 SendRequestAndExpectQuicResponse("hello!");
908}
909
rchf47265dc2016-03-21 21:33:12910TEST_P(QuicNetworkTransactionTest,
911 UseAlternativeServiceWithProbabilityForQuic) {
912 MockRead http_reads[] = {
913 MockRead("HTTP/1.1 200 OK\r\n"),
914 MockRead(kQuicAlternativeServiceWithProbabilityHeader),
915 MockRead("hello world"),
916 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
917 MockRead(ASYNC, OK)};
918
919 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
920 0);
921 socket_factory_.AddSocketDataProvider(&http_data);
922 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
923
924 MockQuicData mock_quic_data;
925 mock_quic_data.AddWrite(
926 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
927 GetRequestHeaders("GET", "https", "/")));
928 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
929 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
930 mock_quic_data.AddRead(
931 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
932 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
933 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
934 mock_quic_data.AddRead(ASYNC, 0); // EOF
935
936 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
937
938 AddHangingNonAlternateProtocolSocketData();
939 CreateSession();
940
941 SendRequestAndExpectHttpResponse("hello world");
942 SendRequestAndExpectQuicResponse("hello!");
943}
944
bnc8be55ebb2015-10-30 14:12:07945TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) {
946 std::string altsvc_header = base::StringPrintf(
947 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam());
948 MockRead http_reads[] = {
949 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
950 MockRead("hello world"),
951 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
952 MockRead(ASYNC, OK)};
953
954 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
955 0);
956 socket_factory_.AddSocketDataProvider(&http_data);
957 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
958
959 MockQuicData mock_quic_data;
960 mock_quic_data.AddWrite(
961 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
962 GetRequestHeaders("GET", "https", "/")));
963 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
964 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
965 mock_quic_data.AddRead(
966 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
967 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
968 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59969 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc8be55ebb2015-10-30 14:12:07970
971 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
972
973 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32974 CreateSession();
bnc8be55ebb2015-10-30 14:12:07975
976 SendRequestAndExpectHttpResponse("hello world");
977 SendRequestAndExpectQuicResponse("hello!");
978}
979
zhongyi6b5a3892016-03-12 04:46:20980TEST_P(QuicNetworkTransactionTest, GoAwayWithConnectionMigrationOnPortsOnly) {
981 MockQuicData mock_quic_data;
982 mock_quic_data.AddWrite(
983 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
984 GetRequestHeaders("GET", "https", "/")));
985 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
986 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
987 // Read a GoAway packet with
988 // QuicErrorCode: QUIC_ERROR_MIGRATING_PORT from the peer.
989 mock_quic_data.AddRead(
990 ConstructGoAwayPacket(2, QUIC_ERROR_MIGRATING_PORT,
991 "connection migration with port change only"));
992 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
993 mock_quic_data.AddRead(
994 ConstructDataPacket(3, kClientDataStreamId1, false, true, 0, "hello!"));
995 mock_quic_data.AddWrite(ConstructAckAndRstPacket(
996 3, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 3, 3, 1));
997 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
998 mock_quic_data.AddRead(ASYNC, 0); // EOF
999
1000 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1001
1002 // The non-alternate protocol job needs to hang in order to guarantee that
1003 // the alternate-protocol job will "win".
1004 AddHangingNonAlternateProtocolSocketData();
1005
1006 // In order for a new QUIC session to be established via alternate-protocol
1007 // without racing an HTTP connection, we need the host resolution to happen
1008 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1009 // connection to the the server, in this test we require confirmation
1010 // before encrypting so the HTTP job will still start.
1011 host_resolver_.set_synchronous_mode(true);
1012 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1013 "");
1014 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1015 AddressList address;
1016 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1017 nullptr, net_log_.bound());
1018
1019 CreateSession();
1020 session_->quic_stream_factory()->set_require_confirmation(true);
1021 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1022
danakjad1777e2016-04-16 00:56:421023 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyi6b5a3892016-03-12 04:46:201024 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1025 TestCompletionCallback callback;
1026 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1027 EXPECT_EQ(ERR_IO_PENDING, rv);
1028
1029 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1030 QuicSession::HANDSHAKE_CONFIRMED);
1031 EXPECT_EQ(OK, callback.WaitForResult());
1032
1033 // Check whether this transaction is correctly marked as received a go-away
1034 // because of migrating port.
1035 NetErrorDetails details;
1036 EXPECT_FALSE(details.quic_port_migration_detected);
1037 trans->PopulateNetErrorDetails(&details);
1038 EXPECT_TRUE(details.quic_port_migration_detected);
1039}
1040
bnc8be55ebb2015-10-30 14:12:071041TEST_P(QuicNetworkTransactionTest,
1042 DoNotUseAlternativeServiceQuicUnsupportedVersion) {
1043 std::string altsvc_header = base::StringPrintf(
1044 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam() - 1);
1045 MockRead http_reads[] = {
1046 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1047 MockRead("hello world"),
1048 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1049 MockRead(ASYNC, OK)};
1050
1051 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1052 0);
1053 socket_factory_.AddSocketDataProvider(&http_data);
1054 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1055 socket_factory_.AddSocketDataProvider(&http_data);
1056 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1057
rch3f4b8452016-02-23 16:59:321058 CreateSession();
bnc8be55ebb2015-10-30 14:12:071059
1060 SendRequestAndExpectHttpResponse("hello world");
1061 SendRequestAndExpectHttpResponse("hello world");
1062}
1063
bncc958faa2015-07-31 18:14:521064// When multiple alternative services are advertised,
zhongyi32569c62016-01-08 02:54:301065// HttpStreamFactoryImpl::RequestStreamInternal() should select the alternative
1066// service which uses existing QUIC session if available. If no existing QUIC
1067// session can be used, use the first alternative service from the list.
1068TEST_P(QuicNetworkTransactionTest, UseExistingAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:521069 MockRead http_reads[] = {
1070 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291071 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
bncc958faa2015-07-31 18:14:521072 MockRead("hello world"),
1073 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1074 MockRead(ASYNC, OK)};
1075
1076 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1077 0);
1078 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561079 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521080
zhongyi32569c62016-01-08 02:54:301081 QuicStreamOffset request_header_offset = 0;
1082 QuicStreamOffset response_header_offset = 0;
1083 // First QUIC request data.
rch9ae5b3b2016-02-11 00:36:291084 // Open a session to foo.example.org:443 using the first entry of the
zhongyi32569c62016-01-08 02:54:301085 // alternative service list.
bncc958faa2015-07-31 18:14:521086 MockQuicData mock_quic_data;
zhongyi32569c62016-01-08 02:54:301087 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1088 1, kClientDataStreamId1, true, true,
1089 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1090
1091 std::string alt_svc_list =
rch9ae5b3b2016-02-11 00:36:291092 "quic=\"mail.example.org:444\", quic=\"foo.example.org:443\", "
1093 "quic=\"bar.example.org:445\"";
bncc958faa2015-07-31 18:14:521094 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301095 1, kClientDataStreamId1, false, false,
1096 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
bncc958faa2015-07-31 18:14:521097 mock_quic_data.AddRead(
1098 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1099 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301100
1101 // Second QUIC request data.
1102 // Connection pooling, using existing session, no need to include version
1103 // as version negotiation has been completed.
1104 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1105 3, kClientDataStreamId2, false, true,
1106 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1107 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1108 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1109 &response_header_offset));
1110 mock_quic_data.AddRead(
1111 ConstructDataPacket(4, kClientDataStreamId2, false, true, 0, "hello!"));
1112 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
bncc958faa2015-07-31 18:14:521113 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591114 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521115
1116 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1117
1118 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321119 CreateSession();
bncc958faa2015-07-31 18:14:521120
1121 SendRequestAndExpectHttpResponse("hello world");
zhongyi32569c62016-01-08 02:54:301122
bncc958faa2015-07-31 18:14:521123 SendRequestAndExpectQuicResponseOnPort("hello!", 443);
zhongyi32569c62016-01-08 02:54:301124 SendRequestAndExpectQuicResponseOnPort("hello!", 443);
1125}
1126
1127// When multiple alternative services that has existing QUIC session.
1128// HttpStreamFactoryImpl::RequestStreamInternal() should select the first
1129// alternative service which uses existing QUIC session.
1130TEST_P(QuicNetworkTransactionTest, UseFirstExistingAlternativeServiceForQuic) {
1131 MockRead http_reads[] = {
1132 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291133 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":446\"\r\n\r\n"),
zhongyi32569c62016-01-08 02:54:301134 MockRead("hello world"),
1135 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1136 MockRead(ASYNC, OK)};
1137
1138 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1139 0);
1140 socket_factory_.AddSocketDataProvider(&http_data);
1141 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1142
1143 QuicStreamOffset request_header_offset = 0;
1144 QuicStreamOffset response_header_offset = 0;
1145
1146 QuicTestPacketMaker maker(GetParam(), 0, clock_, kDefaultServerHostName);
1147
1148 MockQuicData mock_quic_data;
1149 MockQuicData mock_quic_data2;
1150 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
1151 // First QUIC request data.
rch9ae5b3b2016-02-11 00:36:291152 // Open a QUIC session to foo.example.org:443.
zhongyi32569c62016-01-08 02:54:301153 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1154 1, kClientDataStreamId1, true, true,
1155 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1156
1157 std::string alt_svc_list =
rch9ae5b3b2016-02-11 00:36:291158 "quic=\"bar.example.org:444\", quic=\"frog.example.org:445\", "
1159 "quic=\"mail.example.org:446\"";
zhongyi32569c62016-01-08 02:54:301160 // Response header from the server resets the alt_svc list for the origin.
1161 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1162 1, kClientDataStreamId1, false, false,
1163 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
1164 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1165 true, 0, "hello from foo!"));
1166 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1167
1168 // Second QUIC request data.
rch9ae5b3b2016-02-11 00:36:291169 // Existing QUIC session to foo.example.org is not viable from the updated
zhongyi32569c62016-01-08 02:54:301170 // alt_svc. Unable to pool the existing QUIC session.
rch9ae5b3b2016-02-11 00:36:291171 // Open a new QUIC session to bar.example.org:443.
zhongyi32569c62016-01-08 02:54:301172 mock_quic_data2.AddWrite(ConstructRequestHeadersPacket(
1173 1, kClientDataStreamId1, true, true,
1174 GetRequestHeaders("GET", "https", "/"), &maker));
1175 alt_svc_list =
rch9ae5b3b2016-02-11 00:36:291176 "quic=\"foo.example.org:443\", quic=\"mail.example.org:446\", "
1177 "quic=\"bar.example.org:444\"";
zhongyi32569c62016-01-08 02:54:301178 // Response header from the server resets the alt_svc list for the origin.
1179 mock_quic_data2.AddRead(ConstructResponseHeadersPacket(
1180 1, kClientDataStreamId1, false, false,
1181 GetResponseHeaders("200 OK", alt_svc_list), &maker));
1182 mock_quic_data2.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1183 true, 0, "hello from bar!"));
1184 mock_quic_data2.AddWrite(ConstructAckPacket(2, 1, &maker));
1185 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1186 mock_quic_data2.AddRead(ASYNC, 0); // EOF
1187
1188 // Third QUIC request data.
rch9ae5b3b2016-02-11 00:36:291189 // Connection pooling, using the first existing session to foo.example.org
zhongyi32569c62016-01-08 02:54:301190 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1191 3, kClientDataStreamId2, false, true,
1192 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1193 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1194 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1195 &response_header_offset));
1196 mock_quic_data.AddRead(ConstructDataPacket(4, kClientDataStreamId2, false,
1197 true, 0, "hello from foo!"));
1198 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
1199 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1200 mock_quic_data.AddRead(ASYNC, 0); // EOF
1201
1202 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1203 AddHangingNonAlternateProtocolSocketData();
1204
1205 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
1206
1207 AddHangingNonAlternateProtocolSocketData();
1208
rch3f4b8452016-02-23 16:59:321209 CreateSession();
zhongyi32569c62016-01-08 02:54:301210
1211 SendRequestAndExpectHttpResponse("hello world");
1212 SendRequestAndExpectQuicResponseOnPort("hello from foo!", 443);
1213 SendRequestAndExpectQuicResponseOnPort("hello from bar!", 444);
1214 SendRequestAndExpectQuicResponseOnPort("hello from foo!", 443);
1215}
1216
1217// Multiple origins have listed the same alternative services. When there's a
1218// existing QUIC session opened by a request to other origin,
1219// if the cert is valid, should select this QUIC session to make the request
1220// if this is also the first existing QUIC session.
1221TEST_P(QuicNetworkTransactionTest,
1222 UseSharedExistingAlternativeServiceForQuicWithValidCert) {
rch9ae5b3b2016-02-11 00:36:291223 // Default cert is valid for *.example.org
zhongyi32569c62016-01-08 02:54:301224
rch9ae5b3b2016-02-11 00:36:291225 // HTTP data for request to www.example.org.
zhongyi32569c62016-01-08 02:54:301226 MockRead http_reads[] = {
1227 MockRead("HTTP/1.1 200 OK\r\n"),
1228 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
rch9ae5b3b2016-02-11 00:36:291229 MockRead("hello world from www.example.org"),
zhongyi32569c62016-01-08 02:54:301230 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1231 MockRead(ASYNC, OK)};
1232
1233 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1234 0);
1235 socket_factory_.AddSocketDataProvider(&http_data);
1236 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1237
1238 // HTTP data for request to mail.example.org.
1239 MockRead http_reads2[] = {
1240 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291241 MockRead("Alt-Svc: quic=\":444\", quic=\"www.example.org:443\"\r\n\r\n"),
zhongyi32569c62016-01-08 02:54:301242 MockRead("hello world from mail.example.org"),
1243 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1244 MockRead(ASYNC, OK)};
1245
1246 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1247 nullptr, 0);
1248 socket_factory_.AddSocketDataProvider(&http_data2);
1249 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1250
1251 QuicStreamOffset request_header_offset = 0;
1252 QuicStreamOffset response_header_offset = 0;
1253
rch9ae5b3b2016-02-11 00:36:291254 QuicTestPacketMaker maker(GetParam(), 0, clock_, "mail.example.org");
1255 maker_.set_hostname("www.example.org");
zhongyi32569c62016-01-08 02:54:301256 MockQuicData mock_quic_data;
1257
1258 // First QUIC request data.
1259 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1260 1, kClientDataStreamId1, true, true,
1261 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1262
1263 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1264 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1265 &response_header_offset));
1266 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1267 true, 0, "hello from mail QUIC!"));
1268 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301269 // Second QUIC request data.
1270 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1271 3, kClientDataStreamId2, false, true,
bnc912a04b2016-04-20 14:19:501272 GetRequestHeaders("GET", "https", "/", &maker), &request_header_offset,
zhongyi32569c62016-01-08 02:54:301273 &maker));
1274 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1275 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1276 &response_header_offset));
1277 mock_quic_data.AddRead(ConstructDataPacket(4, kClientDataStreamId2, false,
1278 true, 0, "hello from mail QUIC!"));
1279 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
1280 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1281 mock_quic_data.AddRead(ASYNC, 0); // EOF
1282
1283 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1284 AddHangingNonAlternateProtocolSocketData();
1285
rch3f4b8452016-02-23 16:59:321286 CreateSession();
zhongyi32569c62016-01-08 02:54:301287
1288 // Send two HTTP requests, responses set up alt-svc lists for the origins.
rch9ae5b3b2016-02-11 00:36:291289 request_.url = GURL("https://www.example.org/");
1290 SendRequestAndExpectHttpResponse("hello world from www.example.org");
zhongyi32569c62016-01-08 02:54:301291 request_.url = GURL("https://mail.example.org/");
1292 SendRequestAndExpectHttpResponse("hello world from mail.example.org");
1293
rch9ae5b3b2016-02-11 00:36:291294 // Open a QUIC session to mail.example.org:443 when making request
1295 // to mail.example.org.
1296 request_.url = GURL("https://www.example.org/");
zhongyi32569c62016-01-08 02:54:301297 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443);
1298
rch9ae5b3b2016-02-11 00:36:291299 // Uses the existing QUIC session when making request to www.example.org.
zhongyi32569c62016-01-08 02:54:301300 request_.url = GURL("https://mail.example.org/");
1301 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443);
1302}
1303
1304// Multiple origins have listed the same alternative services. When there's a
1305// existing QUIC session opened by a request to other origin,
1306// if the cert is NOT valid, should ignore this QUIC session.
1307TEST_P(QuicNetworkTransactionTest,
1308 DoNotUseSharedExistingAlternativeServiceForQuicWithInvalidCert) {
rch9ae5b3b2016-02-11 00:36:291309 // Default cert is valid *.example.org
1310 // NOT valid for mail.example.com.
zhongyi32569c62016-01-08 02:54:301311
rch9ae5b3b2016-02-11 00:36:291312 // HTTP data for request to mail.example.org.
zhongyi32569c62016-01-08 02:54:301313 MockRead http_reads[] = {
1314 MockRead("HTTP/1.1 200 OK\r\n"),
1315 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
rch9ae5b3b2016-02-11 00:36:291316 MockRead("hello world from mail.example.org"),
zhongyi32569c62016-01-08 02:54:301317 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1318 MockRead(ASYNC, OK)};
1319
1320 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1321 0);
1322 socket_factory_.AddSocketDataProvider(&http_data);
1323 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1324
rch9ae5b3b2016-02-11 00:36:291325 // HTTP data for request to mail.example.com.
zhongyi32569c62016-01-08 02:54:301326 MockRead http_reads2[] = {
1327 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291328 MockRead("Alt-Svc: quic=\":444\", quic=\"mail.example.org:443\"\r\n\r\n"),
1329 MockRead("hello world from mail.example.com"),
zhongyi32569c62016-01-08 02:54:301330 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1331 MockRead(ASYNC, OK)};
1332
1333 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1334 nullptr, 0);
1335 socket_factory_.AddSocketDataProvider(&http_data2);
1336 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1337
rch9ae5b3b2016-02-11 00:36:291338 QuicTestPacketMaker maker(GetParam(), 0, clock_, "mail.example.org");
1339 maker.set_hostname("mail.example.com");
zhongyi32569c62016-01-08 02:54:301340 MockQuicData mock_quic_data;
1341 MockQuicData mock_quic_data2;
1342
1343 // Adding a valid cert for *.example.org but not mail.example.com.
1344 ProofVerifyDetailsChromium verify_details;
1345 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:291346 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
zhongyi32569c62016-01-08 02:54:301347 verify_details.cert_verify_result.verified_cert = cert;
1348 verify_details.cert_verify_result.is_issued_by_known_root = true;
1349 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1350
1351 // First QUIC request data.
1352 mock_quic_data.AddWrite(
1353 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1354 GetRequestHeaders("GET", "https", "/")));
1355 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1356 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1357 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1358 true, 0, "hello from mail QUIC!"));
1359 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1360 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1361 mock_quic_data.AddRead(ASYNC, 0); // EOF
1362
1363 // First QUIC request data.
1364 mock_quic_data2.AddWrite(ConstructRequestHeadersPacket(
1365 1, kClientDataStreamId1, true, true,
bnc912a04b2016-04-20 14:19:501366 GetRequestHeaders("GET", "https", "/", &maker), &maker));
zhongyi32569c62016-01-08 02:54:301367 mock_quic_data2.AddRead(
1368 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
1369 GetResponseHeaders("200 OK"), &maker));
1370 mock_quic_data2.AddRead(ConstructDataPacket(
1371 2, kClientDataStreamId1, false, true, 0, "hello from docs QUIC!"));
1372 mock_quic_data2.AddWrite(ConstructAckPacket(2, 1, &maker));
1373 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1374 mock_quic_data2.AddRead(ASYNC, 0); // EOF
1375
1376 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1377 AddHangingNonAlternateProtocolSocketData();
1378
1379 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
1380 AddHangingNonAlternateProtocolSocketData();
1381
rch3f4b8452016-02-23 16:59:321382 CreateSession();
zhongyi32569c62016-01-08 02:54:301383
1384 // Send HTTP requests, responses set up the alt-svc lists for the origins.
rch9ae5b3b2016-02-11 00:36:291385 SendRequestAndExpectHttpResponse("hello world from mail.example.org");
zhongyi32569c62016-01-08 02:54:301386 request_.url = GURL("https://mail.example.com/");
rch9ae5b3b2016-02-11 00:36:291387 SendRequestAndExpectHttpResponse("hello world from mail.example.com");
1388
1389 // Open a QUIC session to mail.example.org:443 when making request
1390 // to mail.example.org.
1391 request_.url = GURL("https://mail.example.org/");
zhongyi32569c62016-01-08 02:54:301392 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443);
1393
rch9ae5b3b2016-02-11 00:36:291394 // Open another new QUIC session to mail.example.com:444.
1395 request_.url = GURL("https://mail.example.com/");
zhongyi32569c62016-01-08 02:54:301396 SendRequestAndExpectQuicResponseOnPort("hello from docs QUIC!", 444);
bncc958faa2015-07-31 18:14:521397}
1398
1399TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) {
bncc958faa2015-07-31 18:14:521400 MockRead http_reads[] = {
1401 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561402 MockRead(kQuicAlternativeServiceDifferentPortHeader),
bncc958faa2015-07-31 18:14:521403 MockRead("hello world"),
1404 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1405 MockRead(ASYNC, OK)};
1406
1407 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1408 0);
1409 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561410 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521411
1412 MockQuicData mock_quic_data;
1413 mock_quic_data.AddWrite(
1414 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561415 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521416 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1417 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1418 mock_quic_data.AddRead(
1419 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1420 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1421 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591422 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521423
1424 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1425
1426 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321427 CreateSession();
bncc958faa2015-07-31 18:14:521428
1429 SendRequestAndExpectHttpResponse("hello world");
1430 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
1431}
1432
1433TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) {
bncc958faa2015-07-31 18:14:521434 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561435 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1436 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521437 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1438 MockRead(ASYNC, OK)};
1439
1440 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1441 0);
1442 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561443 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521444
1445 MockQuicData mock_quic_data;
1446 mock_quic_data.AddWrite(
1447 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561448 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521449 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1450 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1451 mock_quic_data.AddRead(
1452 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1453 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1454 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1455 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521456
1457 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1458
1459 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321460 CreateSession();
bncc958faa2015-07-31 18:14:521461
1462 AlternativeService alternative_service(QUIC,
1463 HostPortPair::FromURL(request_.url));
1464 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
1465 alternative_service);
1466 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1467 alternative_service));
1468
1469 SendRequestAndExpectHttpResponse("hello world");
1470 SendRequestAndExpectQuicResponse("hello!");
1471
mmenkee24011922015-12-17 22:12:591472 mock_quic_data.Resume();
bncc958faa2015-07-31 18:14:521473
1474 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1475 alternative_service));
1476}
1477
bncc958faa2015-07-31 18:14:521478TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) {
bncc958faa2015-07-31 18:14:521479 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561480 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1481 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521482 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1483 MockRead(ASYNC, OK)};
1484
1485 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1486 0);
1487 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561488 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521489
1490 MockQuicData mock_quic_data;
1491 mock_quic_data.AddWrite(
1492 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561493 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521494 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1495 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1496 mock_quic_data.AddRead(
1497 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1498 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1499 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
1500
1501 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1502
1503 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321504 CreateSession();
bncc958faa2015-07-31 18:14:521505
1506 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1507 SendRequestAndExpectHttpResponse("hello world");
1508}
1509
[email protected]1e960032013-12-20 19:00:201510TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
[email protected]aa9b14d2013-05-10 23:45:191511 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561512 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1513 MockRead("hello world"),
1514 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1515 MockRead(ASYNC, OK)};
[email protected]61a527782013-02-21 03:58:001516
rjshaded5ced072015-12-18 19:26:021517 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1518 0);
[email protected]aa9b14d2013-05-10 23:45:191519 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561520 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]61a527782013-02-21 03:58:001521
[email protected]1e960032013-12-20 19:00:201522 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031523 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051524 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561525 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021526 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1527 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031528 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051529 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031530 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501531 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591532 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]61a527782013-02-21 03:58:001533
rcha5399e02015-04-21 19:32:041534 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]61a527782013-02-21 03:58:001535
[email protected]aa9b14d2013-05-10 23:45:191536 // The non-alternate protocol job needs to hang in order to guarantee that
1537 // the alternate-protocol job will "win".
1538 AddHangingNonAlternateProtocolSocketData();
[email protected]61a527782013-02-21 03:58:001539
rch3f4b8452016-02-23 16:59:321540 params_.parse_alternative_services = false;
1541 params_.parse_alternative_services = false;
1542 CreateSession();
[email protected]61a527782013-02-21 03:58:001543
[email protected]aa9b14d2013-05-10 23:45:191544 SendRequestAndExpectHttpResponse("hello world");
1545 SendRequestAndExpectQuicResponse("hello!");
[email protected]61a527782013-02-21 03:58:001546}
1547
rchf47265dc2016-03-21 21:33:121548TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolWithProbabilityForQuic) {
1549 MockRead http_reads[] = {
1550 MockRead("HTTP/1.1 200 OK\r\n"),
1551 MockRead(kQuicAlternateProtocolWithProbabilityHeader),
1552 MockRead("hello world"),
1553 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1554 MockRead(ASYNC, OK)};
1555
1556 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1557 0);
1558 socket_factory_.AddSocketDataProvider(&http_data);
1559 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1560
1561 MockQuicData mock_quic_data;
1562 mock_quic_data.AddWrite(
1563 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1564 GetRequestHeaders("GET", "https", "/")));
1565 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1566 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1567 mock_quic_data.AddRead(
1568 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1569 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1570 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1571 mock_quic_data.AddRead(ASYNC, 0); // EOF
1572
1573 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1574
1575 // The non-alternate protocol job needs to hang in order to guarantee that
1576 // the alternate-protocol job will "win".
1577 AddHangingNonAlternateProtocolSocketData();
1578
1579 params_.parse_alternative_services = false;
1580 params_.parse_alternative_services = false;
1581 CreateSession();
1582
1583 SendRequestAndExpectHttpResponse("hello world");
1584 SendRequestAndExpectQuicResponse("hello!");
1585}
1586
bnc62a44f022015-04-02 15:59:411587TEST_P(QuicNetworkTransactionTest, AlternateProtocolDifferentPort) {
1588 MockRead http_reads[] = {
1589 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561590 MockRead(kQuicAlternateProtocolDifferentPortHeader),
bnc62a44f022015-04-02 15:59:411591 MockRead("hello world"),
1592 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1593 MockRead(ASYNC, OK)};
1594
1595 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1596 0);
1597 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561598 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bnc62a44f022015-04-02 15:59:411599
1600 MockQuicData mock_quic_data;
1601 mock_quic_data.AddWrite(
1602 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561603 GetRequestHeaders("GET", "https", "/")));
bnc62a44f022015-04-02 15:59:411604 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1605 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1606 mock_quic_data.AddRead(
1607 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1608 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501609 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591610 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc62a44f022015-04-02 15:59:411611
rcha5399e02015-04-21 19:32:041612 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bnc62a44f022015-04-02 15:59:411613
1614 // The non-alternate protocol job needs to hang in order to guarantee that
1615 // the alternate-protocol job will "win".
1616 AddHangingNonAlternateProtocolSocketData();
1617
rch3f4b8452016-02-23 16:59:321618 params_.parse_alternative_services = false;
1619 CreateSession();
bnc62a44f022015-04-02 15:59:411620
1621 SendRequestAndExpectHttpResponse("hello world");
1622 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
1623}
1624
bncc958faa2015-07-31 18:14:521625TEST_P(QuicNetworkTransactionTest, ConfirmAlternateProtocol) {
bncae8db8402015-03-26 20:13:501626 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561627 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
bncae8db8402015-03-26 20:13:501628 MockRead("hello world"),
1629 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1630 MockRead(ASYNC, OK)};
1631
1632 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1633 0);
1634 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561635 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncae8db8402015-03-26 20:13:501636
1637 MockQuicData mock_quic_data;
1638 mock_quic_data.AddWrite(
1639 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561640 GetRequestHeaders("GET", "https", "/")));
bncae8db8402015-03-26 20:13:501641 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1642 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1643 mock_quic_data.AddRead(
1644 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1645 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501646 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1647 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncae8db8402015-03-26 20:13:501648
rcha5399e02015-04-21 19:32:041649 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bncae8db8402015-03-26 20:13:501650
1651 // The non-alternate protocol job needs to hang in order to guarantee that
1652 // the alternate-protocol job will "win".
1653 AddHangingNonAlternateProtocolSocketData();
1654
rch3f4b8452016-02-23 16:59:321655 params_.parse_alternative_services = false;
1656 CreateSession();
bncae8db8402015-03-26 20:13:501657
1658 AlternativeService alternative_service(QUIC,
1659 HostPortPair::FromURL(request_.url));
bnc6be245c12015-05-15 11:24:071660 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
bncae8db8402015-03-26 20:13:501661 alternative_service);
bnc6be245c12015-05-15 11:24:071662 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1663 alternative_service));
bncae8db8402015-03-26 20:13:501664
1665 SendRequestAndExpectHttpResponse("hello world");
1666 SendRequestAndExpectQuicResponse("hello!");
1667
mmenkee24011922015-12-17 22:12:591668 mock_quic_data.Resume();
rchb27683c2015-07-29 23:53:501669
bnc6be245c12015-05-15 11:24:071670 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1671 alternative_service));
bncae8db8402015-03-26 20:13:501672}
1673
[email protected]1e960032013-12-20 19:00:201674TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) {
rch3f4b8452016-02-23 16:59:321675 params_.parse_alternative_services = false;
[email protected]6d1b4ed2013-07-10 03:57:541676 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561677 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1678 MockRead("hello world"),
1679 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1680 MockRead(ASYNC, OK)};
[email protected]6d1b4ed2013-07-10 03:57:541681
rjshaded5ced072015-12-18 19:26:021682 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1683 0);
[email protected]6d1b4ed2013-07-10 03:57:541684 socket_factory_.AddSocketDataProvider(&http_data);
1685
[email protected]1e960032013-12-20 19:00:201686 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031687 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051688 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561689 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021690 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1691 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031692 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051693 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031694 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501695 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591696 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]6d1b4ed2013-07-10 03:57:541697
rcha5399e02015-04-21 19:32:041698 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]6d1b4ed2013-07-10 03:57:541699
1700 // The non-alternate protocol job needs to hang in order to guarantee that
1701 // the alternate-protocol job will "win".
1702 AddHangingNonAlternateProtocolSocketData();
1703
rch3f4b8452016-02-23 16:59:321704 CreateSession();
[email protected]6d1b4ed2013-07-10 03:57:541705
1706 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1707 SendRequestAndExpectHttpResponse("hello world");
1708}
1709
bnccb7ff3c2015-05-21 20:51:551710class QuicAltSvcCertificateVerificationTest
1711 : public QuicNetworkTransactionTest {
1712 public:
1713 void Run(bool valid) {
rch9ae5b3b2016-02-11 00:36:291714 HostPortPair origin(valid ? "mail.example.org" : "mail.example.com", 443);
bnccb7ff3c2015-05-21 20:51:551715 HostPortPair alternative("www.example.org", 443);
1716 std::string url("https://");
1717 url.append(origin.host());
1718 url.append(":443");
1719 request_.url = GURL(url);
1720
1721 maker_.set_hostname(origin.host());
1722 MockQuicData mock_quic_data;
1723 mock_quic_data.AddWrite(
1724 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1725 GetRequestHeaders("GET", "https", "/")));
1726 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1727 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1728 mock_quic_data.AddRead(
1729 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1730 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591731 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
bnccb7ff3c2015-05-21 20:51:551732 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1733
1734 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:291735 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bnccb7ff3c2015-05-21 20:51:551736 ASSERT_TRUE(cert.get());
1737 bool common_name_fallback_used;
1738 EXPECT_EQ(valid,
1739 cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
1740 EXPECT_TRUE(
1741 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
1742 ProofVerifyDetailsChromium verify_details;
1743 verify_details.cert_verify_result.verified_cert = cert;
1744 verify_details.cert_verify_result.is_issued_by_known_root = true;
1745 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1746 crypto_client_stream_factory_.set_handshake_mode(
1747 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1748
1749 // Connection to |origin| fails, so that success of |request| depends on
1750 // connection to |alternate| only.
1751 MockConnect refused_connect(ASYNC, ERR_CONNECTION_REFUSED);
1752 StaticSocketDataProvider refused_data;
1753 refused_data.set_connect_data(refused_connect);
1754 socket_factory_.AddSocketDataProvider(&refused_data);
1755
rch3f4b8452016-02-23 16:59:321756 CreateSession();
bnccb7ff3c2015-05-21 20:51:551757 AlternativeService alternative_service(QUIC, alternative);
bnc7dc7e1b42015-07-28 14:43:121758 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
bnccb7ff3c2015-05-21 20:51:551759 session_->http_server_properties()->SetAlternativeService(
rchdc7b9052016-03-17 20:51:501760 origin, alternative_service, expiration);
danakjad1777e2016-04-16 00:56:421761 std::unique_ptr<HttpNetworkTransaction> trans(
bnccb7ff3c2015-05-21 20:51:551762 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1763 TestCompletionCallback callback;
1764 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1765 EXPECT_EQ(ERR_IO_PENDING, rv);
1766 rv = callback.WaitForResult();
1767 if (valid) {
1768 EXPECT_EQ(OK, rv);
1769 CheckWasQuicResponse(trans);
1770 CheckResponsePort(trans, 443);
1771 CheckResponseData(trans, "hello!");
1772 } else {
1773 EXPECT_EQ(ERR_CONNECTION_REFUSED, rv);
1774 }
1775 }
1776};
1777
1778INSTANTIATE_TEST_CASE_P(Version,
1779 QuicAltSvcCertificateVerificationTest,
1780 ::testing::ValuesIn(QuicSupportedVersions()));
1781
1782TEST_P(QuicAltSvcCertificateVerificationTest,
1783 RequestSucceedsWithValidCertificate) {
1784 Run(true);
1785}
1786
1787TEST_P(QuicAltSvcCertificateVerificationTest,
1788 RequestFailsWithInvalidCertificate) {
1789 Run(false);
1790}
1791
[email protected]1e960032013-12-20 19:00:201792TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) {
rch3f4b8452016-02-23 16:59:321793 params_.parse_alternative_services = false;
[email protected]dda75ab2013-06-22 22:43:301794 crypto_client_stream_factory_.set_handshake_mode(
1795 MockCryptoClientStream::COLD_START);
1796
1797 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561798 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
rch9ae5b3b2016-02-11 00:36:291799 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561800 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")};
[email protected]dda75ab2013-06-22 22:43:301801
1802 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561803 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1804 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1805 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]dda75ab2013-06-22 22:43:301806
mmenke651bae7f2015-12-18 21:26:451807 SequencedSocketData http_data(http_reads, arraysize(http_reads), http_writes,
1808 arraysize(http_writes));
bnc912a04b2016-04-20 14:19:501809 socket_factory_.AddSocketDataProvider(&http_data);
1810 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301811
1812 // The QUIC transaction will not be allowed to complete.
mmenke651bae7f2015-12-18 21:26:451813 MockWrite quic_writes[] = {MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 1)};
[email protected]dda75ab2013-06-22 22:43:301814 MockRead quic_reads[] = {
mmenke651bae7f2015-12-18 21:26:451815 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0),
[email protected]dda75ab2013-06-22 22:43:301816 };
mmenke651bae7f2015-12-18 21:26:451817 SequencedSocketData quic_data(quic_reads, arraysize(quic_reads), quic_writes,
1818 arraysize(quic_writes));
bnc912a04b2016-04-20 14:19:501819 socket_factory_.AddSocketDataProvider(&quic_data);
[email protected]dda75ab2013-06-22 22:43:301820
1821 // The HTTP transaction will complete.
mmenke651bae7f2015-12-18 21:26:451822 SequencedSocketData http_data2(http_reads, arraysize(http_reads), http_writes,
1823 arraysize(http_writes));
bnc912a04b2016-04-20 14:19:501824 socket_factory_.AddSocketDataProvider(&http_data2);
1825 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301826
bnc912a04b2016-04-20 14:19:501827 CreateSession();
[email protected]dda75ab2013-06-22 22:43:301828
1829 // Run the first request.
[email protected]dda75ab2013-06-22 22:43:301830 SendRequestAndExpectHttpResponse("hello world");
rch37de576c2015-05-17 20:28:171831 ASSERT_TRUE(http_data.AllReadDataConsumed());
1832 ASSERT_TRUE(http_data.AllWriteDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301833
1834 // Now run the second request in which the QUIC socket hangs,
1835 // and verify the the transaction continues over HTTP.
[email protected]dda75ab2013-06-22 22:43:301836 SendRequestAndExpectHttpResponse("hello world");
mmenke651bae7f2015-12-18 21:26:451837 base::RunLoop().RunUntilIdle();
[email protected]dda75ab2013-06-22 22:43:301838
rch37de576c2015-05-17 20:28:171839 ASSERT_TRUE(http_data2.AllReadDataConsumed());
1840 ASSERT_TRUE(http_data2.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:451841 ASSERT_TRUE(quic_data.AllReadDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301842}
1843
[email protected]1e960032013-12-20 19:00:201844TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
[email protected]1e960032013-12-20 19:00:201845 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031846 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051847 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561848 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021849 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1850 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031851 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051852 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031853 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501854 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591855 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]8ba81212013-05-03 13:11:481856
rcha5399e02015-04-21 19:32:041857 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]8ba81212013-05-03 13:11:481858
[email protected]3a120a6b2013-06-25 01:08:271859 // The non-alternate protocol job needs to hang in order to guarantee that
1860 // the alternate-protocol job will "win".
[email protected]dda75ab2013-06-22 22:43:301861 AddHangingNonAlternateProtocolSocketData();
1862
rch3f4b8452016-02-23 16:59:321863 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:191864 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1865 SendRequestAndExpectQuicResponse("hello!");
[email protected]8ba81212013-05-03 13:11:481866}
1867
[email protected]1e960032013-12-20 19:00:201868TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
[email protected]1e960032013-12-20 19:00:201869 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031870 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051871 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561872 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021873 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1874 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031875 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051876 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031877 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501878 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591879 mock_quic_data.AddRead(ASYNC, 0); // EOF
rcha5399e02015-04-21 19:32:041880 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]3a120a6b2013-06-25 01:08:271881
1882 // In order for a new QUIC session to be established via alternate-protocol
1883 // without racing an HTTP connection, we need the host resolution to happen
1884 // synchronously.
1885 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291886 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561887 "");
rch9ae5b3b2016-02-11 00:36:291888 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]3a120a6b2013-06-25 01:08:271889 AddressList address;
rjshaded5ced072015-12-18 19:26:021890 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1891 nullptr, net_log_.bound());
[email protected]3a120a6b2013-06-25 01:08:271892
rch3f4b8452016-02-23 16:59:321893 CreateSession();
[email protected]3a120a6b2013-06-25 01:08:271894 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1895 SendRequestAndExpectQuicResponse("hello!");
1896}
1897
[email protected]0fc924b2014-03-31 04:34:151898TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) {
rdsmith82957ad2015-09-16 19:42:031899 proxy_service_ = ProxyService::CreateFixedFromPacResult("PROXY myproxy:70");
[email protected]0fc924b2014-03-31 04:34:151900
1901 // Since we are using a proxy, the QUIC job will not succeed.
1902 MockWrite http_writes[] = {
rch9ae5b3b2016-02-11 00:36:291903 MockWrite(SYNCHRONOUS, 0, "GET http://mail.example.org/ HTTP/1.1\r\n"),
1904 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561905 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")};
[email protected]0fc924b2014-03-31 04:34:151906
1907 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561908 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1909 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1910 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]0fc924b2014-03-31 04:34:151911
1912 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
1913 http_writes, arraysize(http_writes));
1914 socket_factory_.AddSocketDataProvider(&http_data);
1915
1916 // In order for a new QUIC session to be established via alternate-protocol
1917 // without racing an HTTP connection, we need the host resolution to happen
1918 // synchronously.
1919 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291920 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561921 "");
rch9ae5b3b2016-02-11 00:36:291922 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]0fc924b2014-03-31 04:34:151923 AddressList address;
rjshaded5ced072015-12-18 19:26:021924 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1925 nullptr, net_log_.bound());
[email protected]0fc924b2014-03-31 04:34:151926
rch9ae5b3b2016-02-11 00:36:291927 request_.url = GURL("http://mail.example.org/");
rch3f4b8452016-02-23 16:59:321928 CreateSession();
[email protected]0fc924b2014-03-31 04:34:151929 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1930 SendRequestAndExpectHttpResponse("hello world");
1931}
1932
[email protected]1e960032013-12-20 19:00:201933TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
[email protected]1e960032013-12-20 19:00:201934 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031935 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051936 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561937 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021938 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1939 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031940 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051941 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031942 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591943 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
rcha5399e02015-04-21 19:32:041944 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]11c05872013-08-20 02:04:121945
1946 // The non-alternate protocol job needs to hang in order to guarantee that
1947 // the alternate-protocol job will "win".
1948 AddHangingNonAlternateProtocolSocketData();
1949
1950 // In order for a new QUIC session to be established via alternate-protocol
1951 // without racing an HTTP connection, we need the host resolution to happen
1952 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1953 // connection to the the server, in this test we require confirmation
1954 // before encrypting so the HTTP job will still start.
1955 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:291956 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:561957 "");
rch9ae5b3b2016-02-11 00:36:291958 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]11c05872013-08-20 02:04:121959 AddressList address;
rjshaded5ced072015-12-18 19:26:021960 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1961 nullptr, net_log_.bound());
[email protected]11c05872013-08-20 02:04:121962
rch3f4b8452016-02-23 16:59:321963 CreateSession();
[email protected]11c05872013-08-20 02:04:121964 session_->quic_stream_factory()->set_require_confirmation(true);
1965 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1966
danakjad1777e2016-04-16 00:56:421967 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]11c05872013-08-20 02:04:121968 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1969 TestCompletionCallback callback;
1970 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1971 EXPECT_EQ(ERR_IO_PENDING, rv);
1972
1973 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1974 QuicSession::HANDSHAKE_CONFIRMED);
1975 EXPECT_EQ(OK, callback.WaitForResult());
rchb27683c2015-07-29 23:53:501976
1977 CheckWasQuicResponse(trans);
1978 CheckResponseData(trans, "hello!");
[email protected]11c05872013-08-20 02:04:121979}
1980
zhongyica364fbb2015-12-12 03:39:121981TEST_P(QuicNetworkTransactionTest,
1982 LogGranularQuicErrorCodeOnQuicProtocolErrorLocal) {
1983 MockQuicData mock_quic_data;
1984 mock_quic_data.AddWrite(
1985 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1986 GetRequestHeaders("GET", "https", "/")));
1987 // Read a close connection packet with
1988 // QuicErrorCode: QUIC_CRYPTO_VERSION_NOT_SUPPORTED from the peer.
1989 mock_quic_data.AddRead(ConstructConnectionClosePacket(1));
1990 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1991
1992 // The non-alternate protocol job needs to hang in order to guarantee that
1993 // the alternate-protocol job will "win".
1994 AddHangingNonAlternateProtocolSocketData();
1995
1996 // In order for a new QUIC session to be established via alternate-protocol
1997 // without racing an HTTP connection, we need the host resolution to happen
1998 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1999 // connection to the the server, in this test we require confirmation
2000 // before encrypting so the HTTP job will still start.
2001 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:292002 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:122003 "");
rch9ae5b3b2016-02-11 00:36:292004 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:122005 AddressList address;
2006 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2007 nullptr, net_log_.bound());
2008
rch3f4b8452016-02-23 16:59:322009 CreateSession();
zhongyica364fbb2015-12-12 03:39:122010 session_->quic_stream_factory()->set_require_confirmation(true);
2011 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2012
danakjad1777e2016-04-16 00:56:422013 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyica364fbb2015-12-12 03:39:122014 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2015 TestCompletionCallback callback;
2016 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2017 EXPECT_EQ(ERR_IO_PENDING, rv);
2018
2019 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
2020 QuicSession::HANDSHAKE_CONFIRMED);
2021 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
2022
2023 NetErrorDetails details;
2024 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
2025
2026 trans->PopulateNetErrorDetails(&details);
2027 // Verify the error code logged is what sent by the peer.
2028 EXPECT_EQ(QUIC_CRYPTO_VERSION_NOT_SUPPORTED, details.quic_connection_error);
2029}
2030
2031TEST_P(QuicNetworkTransactionTest,
2032 LogGranularQuicErrorCodeOnQuicProtocolErrorRemote) {
2033 MockQuicData mock_quic_data;
2034 mock_quic_data.AddWrite(
2035 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
2036 GetRequestHeaders("GET", "https", "/")));
2037 // Peer sending an invalid stream frame with a invalid stream error causes
2038 // this end to raise error and close connection.
2039 mock_quic_data.AddRead(ConstructRstPacket(1, false, kClientDataStreamId1,
2040 QUIC_STREAM_LAST_ERROR));
2041 std::string quic_error_details = "Invalid rst stream error code.";
2042 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(
2043 2, QuicTime::Delta::Infinite(), 0, 1, QUIC_INVALID_RST_STREAM_DATA,
2044 quic_error_details));
2045 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2046
2047 // The non-alternate protocol job needs to hang in order to guarantee that
2048 // the alternate-protocol job will "win".
2049 AddHangingNonAlternateProtocolSocketData();
2050
2051 // In order for a new QUIC session to be established via alternate-protocol
2052 // without racing an HTTP connection, we need the host resolution to happen
2053 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
2054 // connection to the the server, in this test we require confirmation
2055 // before encrypting so the HTTP job will still start.
2056 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:292057 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
zhongyica364fbb2015-12-12 03:39:122058 "");
rch9ae5b3b2016-02-11 00:36:292059 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
zhongyica364fbb2015-12-12 03:39:122060 AddressList address;
2061 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2062 nullptr, net_log_.bound());
2063
rch3f4b8452016-02-23 16:59:322064 CreateSession();
zhongyica364fbb2015-12-12 03:39:122065 session_->quic_stream_factory()->set_require_confirmation(true);
2066 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2067
danakjad1777e2016-04-16 00:56:422068 std::unique_ptr<HttpNetworkTransaction> trans(
zhongyica364fbb2015-12-12 03:39:122069 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2070 TestCompletionCallback callback;
2071 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2072 EXPECT_EQ(ERR_IO_PENDING, rv);
2073
2074 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
2075 QuicSession::HANDSHAKE_CONFIRMED);
2076 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
2077 NetErrorDetails details;
2078 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
2079
2080 trans->PopulateNetErrorDetails(&details);
2081 EXPECT_EQ(QUIC_INVALID_RST_STREAM_DATA, details.quic_connection_error);
2082}
2083
[email protected]1e960032013-12-20 19:00:202084TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
[email protected]3316d422013-05-03 21:45:302085 // Alternate-protocol job
danakjad1777e2016-04-16 00:56:422086 std::unique_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1));
[email protected]3316d422013-05-03 21:45:302087 MockRead quic_reads[] = {
rchb27683c2015-07-29 23:53:502088 MockRead(ASYNC, close->data(), close->length()),
2089 MockRead(ASYNC, ERR_IO_PENDING), // No more data to read
2090 MockRead(ASYNC, OK), // EOF
[email protected]3316d422013-05-03 21:45:302091 };
rjshaded5ced072015-12-18 19:26:022092 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2093 0);
[email protected]3316d422013-05-03 21:45:302094 socket_factory_.AddSocketDataProvider(&quic_data);
2095
2096 // Main job which will succeed even though the alternate job fails.
2097 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022098 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2099 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2100 MockRead(ASYNC, OK)};
[email protected]3316d422013-05-03 21:45:302101
rjshaded5ced072015-12-18 19:26:022102 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2103 0);
[email protected]3316d422013-05-03 21:45:302104 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562105 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]3316d422013-05-03 21:45:302106
rch3f4b8452016-02-23 16:59:322107 CreateSession();
[email protected]aa9b14d2013-05-10 23:45:192108 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2109 SendRequestAndExpectHttpResponse("hello from http");
2110 ExpectBrokenAlternateProtocolMapping();
[email protected]3316d422013-05-03 21:45:302111}
2112
[email protected]1e960032013-12-20 19:00:202113TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
[email protected]d03a66d2013-05-06 12:55:592114 // Alternate-protocol job
2115 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022116 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]d03a66d2013-05-06 12:55:592117 };
rjshaded5ced072015-12-18 19:26:022118 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2119 0);
[email protected]d03a66d2013-05-06 12:55:592120 socket_factory_.AddSocketDataProvider(&quic_data);
2121
2122 // Main job which will succeed even though the alternate job fails.
2123 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022124 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2125 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2126 MockRead(ASYNC, OK)};
[email protected]d03a66d2013-05-06 12:55:592127
rjshaded5ced072015-12-18 19:26:022128 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2129 0);
[email protected]d03a66d2013-05-06 12:55:592130 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562131 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]d03a66d2013-05-06 12:55:592132
rch3f4b8452016-02-23 16:59:322133 CreateSession();
[email protected]d03a66d2013-05-06 12:55:592134
[email protected]aa9b14d2013-05-10 23:45:192135 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2136 SendRequestAndExpectHttpResponse("hello from http");
2137 ExpectBrokenAlternateProtocolMapping();
[email protected]d03a66d2013-05-06 12:55:592138}
2139
[email protected]00c159f2014-05-21 22:38:162140TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) {
[email protected]eb71ab62014-05-23 07:57:532141 // Alternate-protocol job will fail when the session attempts to read.
[email protected]00c159f2014-05-21 22:38:162142 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022143 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162144 };
rjshaded5ced072015-12-18 19:26:022145 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2146 0);
[email protected]00c159f2014-05-21 22:38:162147 socket_factory_.AddSocketDataProvider(&quic_data);
2148
[email protected]eb71ab62014-05-23 07:57:532149 // Main job will also fail.
[email protected]00c159f2014-05-21 22:38:162150 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022151 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:162152 };
2153
rjshaded5ced072015-12-18 19:26:022154 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2155 0);
[email protected]00c159f2014-05-21 22:38:162156 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED));
2157 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562158 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]00c159f2014-05-21 22:38:162159
rch3f4b8452016-02-23 16:59:322160 CreateSession();
[email protected]00c159f2014-05-21 22:38:162161
2162 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
danakjad1777e2016-04-16 00:56:422163 std::unique_ptr<HttpNetworkTransaction> trans(
[email protected]00c159f2014-05-21 22:38:162164 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2165 TestCompletionCallback callback;
2166 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2167 EXPECT_EQ(ERR_IO_PENDING, rv);
2168 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult());
2169 ExpectQuicAlternateProtocolMapping();
2170}
2171
[email protected]1e960032013-12-20 19:00:202172TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
[email protected]77c6c162013-08-17 02:57:452173 // Alternate-protocol job
2174 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:022175 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]77c6c162013-08-17 02:57:452176 };
rjshaded5ced072015-12-18 19:26:022177 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2178 0);
[email protected]77c6c162013-08-17 02:57:452179 socket_factory_.AddSocketDataProvider(&quic_data);
2180
2181 AddHangingNonAlternateProtocolSocketData();
2182
[email protected]c92c1b52014-05-31 04:16:062183 // Second Alternate-protocol job which will race with the TCP job.
2184 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:422185 nullptr, 0);
[email protected]c92c1b52014-05-31 04:16:062186 socket_factory_.AddSocketDataProvider(&quic_data2);
2187
[email protected]4d283b32013-10-17 12:57:272188 // Final job that will proceed when the QUIC job fails.
2189 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022190 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2191 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2192 MockRead(ASYNC, OK)};
[email protected]4d283b32013-10-17 12:57:272193
rjshaded5ced072015-12-18 19:26:022194 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2195 0);
[email protected]4d283b32013-10-17 12:57:272196 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562197 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d283b32013-10-17 12:57:272198
rch3f4b8452016-02-23 16:59:322199 CreateSession();
[email protected]77c6c162013-08-17 02:57:452200
2201 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2202
[email protected]4d283b32013-10-17 12:57:272203 SendRequestAndExpectHttpResponse("hello from http");
[email protected]77c6c162013-08-17 02:57:452204
2205 ExpectBrokenAlternateProtocolMapping();
[email protected]4d283b32013-10-17 12:57:272206
rch37de576c2015-05-17 20:28:172207 EXPECT_TRUE(quic_data.AllReadDataConsumed());
2208 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
[email protected]77c6c162013-08-17 02:57:452209}
2210
[email protected]93b31772014-06-19 08:03:352211TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) {
[email protected]65768442014-06-06 23:37:032212 // Alternate-protocol job
2213 MockRead quic_reads[] = {
mmenkee24011922015-12-17 22:12:592214 MockRead(SYNCHRONOUS, ERR_IO_PENDING),
[email protected]65768442014-06-06 23:37:032215 };
rjshaded5ced072015-12-18 19:26:022216 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
2217 0);
[email protected]65768442014-06-06 23:37:032218 socket_factory_.AddSocketDataProvider(&quic_data);
2219
2220 // Main job that will proceed when the QUIC job fails.
2221 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022222 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2223 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2224 MockRead(ASYNC, OK)};
[email protected]65768442014-06-06 23:37:032225
rjshaded5ced072015-12-18 19:26:022226 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2227 0);
[email protected]65768442014-06-06 23:37:032228 socket_factory_.AddSocketDataProvider(&http_data);
2229
rch3f4b8452016-02-23 16:59:322230 CreateSession();
[email protected]65768442014-06-06 23:37:032231
2232 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2233
2234 SendRequestAndExpectHttpResponse("hello from http");
2235}
2236
[email protected]eb71ab62014-05-23 07:57:532237TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
[email protected]4d590c9c2014-05-02 05:14:332238 // Alternate-protocol job will fail before creating a QUIC session.
rtennetibe635732014-10-02 22:51:422239 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0);
rjshaded5ced072015-12-18 19:26:022240 quic_data.set_connect_data(
2241 MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED));
[email protected]4d590c9c2014-05-02 05:14:332242 socket_factory_.AddSocketDataProvider(&quic_data);
2243
2244 // Main job which will succeed even though the alternate job fails.
2245 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:022246 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
2247 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2248 MockRead(ASYNC, OK)};
[email protected]4d590c9c2014-05-02 05:14:332249
rjshaded5ced072015-12-18 19:26:022250 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2251 0);
[email protected]4d590c9c2014-05-02 05:14:332252 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562253 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d590c9c2014-05-02 05:14:332254
rch3f4b8452016-02-23 16:59:322255 CreateSession();
[email protected]4d590c9c2014-05-02 05:14:332256 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
2257 SendRequestAndExpectHttpResponse("hello from http");
[email protected]eb71ab62014-05-23 07:57:532258
2259 ExpectBrokenAlternateProtocolMapping();
[email protected]4d590c9c2014-05-02 05:14:332260}
2261
[email protected]4fee9672014-01-08 14:47:152262TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
[email protected]4fee9672014-01-08 14:47:152263 MockQuicData mock_quic_data;
rcha5399e02015-04-21 19:32:042264 mock_quic_data.AddSynchronousRead(ConstructConnectionClosePacket(1));
[email protected]92bf17c2014-03-03 21:14:032265 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:052266 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:562267 GetRequestHeaders("GET", "https", "/")));
[email protected]92bf17c2014-03-03 21:14:032268 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rcha5399e02015-04-21 19:32:042269 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4fee9672014-01-08 14:47:152270
2271 // When the QUIC connection fails, we will try the request again over HTTP.
2272 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:562273 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
2274 MockRead("hello world"),
2275 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
2276 MockRead(ASYNC, OK)};
[email protected]4fee9672014-01-08 14:47:152277
rjshaded5ced072015-12-18 19:26:022278 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
2279 0);
[email protected]4fee9672014-01-08 14:47:152280 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:562281 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4fee9672014-01-08 14:47:152282
2283 // In order for a new QUIC session to be established via alternate-protocol
2284 // without racing an HTTP connection, we need the host resolution to happen
2285 // synchronously.
2286 host_resolver_.set_synchronous_mode(true);
rch9ae5b3b2016-02-11 00:36:292287 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
rchf114d982015-10-21 01:34:562288 "");
rch9ae5b3b2016-02-11 00:36:292289 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
[email protected]4fee9672014-01-08 14:47:152290 AddressList address;
rjshaded5ced072015-12-18 19:26:022291 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
2292 nullptr, net_log_.bound());
[email protected]4fee9672014-01-08 14:47:152293
rch3f4b8452016-02-23 16:59:322294 CreateSession();
[email protected]4fee9672014-01-08 14:47:152295 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
2296 SendRequestAndExpectHttpResponse("hello world");
2297}
2298
bnc508835902015-05-12 20:10:292299TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) {
bncb07c05532015-05-14 19:07:202300 maker_.set_hostname("www.example.org");
tbansal0f56a39a2016-04-07 22:03:382301 EXPECT_FALSE(
2302 test_socket_performance_watcher_factory_.rtt_notification_received());
bnc508835902015-05-12 20:10:292303 MockQuicData mock_quic_data;
2304 mock_quic_data.AddWrite(
2305 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
2306 GetRequestHeaders("GET", "https", "/")));
2307 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
2308 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
2309 mock_quic_data.AddRead(
2310 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
2311 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:502312 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
bnc508835902015-05-12 20:10:292313 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
2314
bncb07c05532015-05-14 19:07:202315 request_.url = GURL("https://www.example.org:443");
bnc508835902015-05-12 20:10:292316 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:322317 CreateSession();
bnc508835902015-05-12 20:10:292318 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
2319 SendRequestAndExpectQuicResponse("hello!");
tbansal0f56a39a2016-04-07 22:03:382320 EXPECT_TRUE(
2321 test_socket_performance_watcher_factory_.rtt_notification_received());
bnc508835902015-05-12 20:10:292322}
2323
rtenneti56977812016-01-15 19:26:562324TEST_P(QuicNetworkTransactionTest, QuicUpload) {
rtenneti8a2f4632016-03-21 20:26:572325 params_.origins_to_force_quic_on.insert(
2326 HostPortPair::FromString("mail.example.org:443"));
rtenneti56977812016-01-15 19:26:562327
2328 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2329 MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_FAILED, 1)};
2330 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2331 arraysize(writes));
2332 socket_factory_.AddSocketDataProvider(&socket_data);
2333
2334 // The non-alternate protocol job needs to hang in order to guarantee that
2335 // the alternate-protocol job will "win".
2336 AddHangingNonAlternateProtocolSocketData();
2337
rch3f4b8452016-02-23 16:59:322338 params_.parse_alternative_services = false;
2339 params_.enable_alternative_service_with_different_host = false;
rtenneti56977812016-01-15 19:26:562340 CreateSession();
2341 request_.method = "POST";
2342 ChunkedUploadDataStream upload_data(0);
2343 upload_data.AppendData("1", 1, true);
2344
2345 request_.upload_data_stream = &upload_data;
2346
danakjad1777e2016-04-16 00:56:422347 std::unique_ptr<HttpNetworkTransaction> trans(
rtenneti56977812016-01-15 19:26:562348 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2349 TestCompletionCallback callback;
2350 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2351 EXPECT_EQ(ERR_IO_PENDING, rv);
2352 EXPECT_NE(OK, callback.WaitForResult());
2353}
2354
[email protected]61a527782013-02-21 03:58:002355} // namespace test
2356} // namespace net