blob: 4774b5bf552045050367e6c8cf139872753078d4 [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
[email protected]1e960032013-12-20 19:00:205#include <vector>
6
[email protected]61a527782013-02-21 03:58:007#include "base/compiler_specific.h"
Avi Drissman13fc8932015-12-20 04:40:468#include "base/macros.h"
[email protected]61a527782013-02-21 03:58:009#include "base/memory/scoped_ptr.h"
mmenke651bae7f2015-12-18 21:26:4510#include "base/run_loop.h"
[email protected]98b20ce2013-05-10 05:55:2611#include "base/stl_util.h"
bnc8be55ebb2015-10-30 14:12:0712#include "base/strings/stringprintf.h"
rtenneti56977812016-01-15 19:26:5613#include "net/base/chunked_upload_data_stream.h"
tbansalfdf5665b2015-09-21 22:46:4014#include "net/base/socket_performance_watcher.h"
tbansal0f56a39a2016-04-07 22:03:3815#include "net/base/socket_performance_watcher_factory.h"
[email protected]61a527782013-02-21 03:58:0016#include "net/base/test_completion_callback.h"
bnc508835902015-05-12 20:10:2917#include "net/base/test_data_directory.h"
[email protected]6e7845ae2013-03-29 21:48:1118#include "net/cert/mock_cert_verifier.h"
rtenneti052774e2015-11-24 21:00:1219#include "net/cert/multi_log_ct_verifier.h"
[email protected]f2cb3cf2013-03-21 01:40:5320#include "net/dns/mock_host_resolver.h"
[email protected]61a527782013-02-21 03:58:0021#include "net/http/http_auth_handler_factory.h"
22#include "net/http/http_network_session.h"
23#include "net/http/http_network_transaction.h"
24#include "net/http/http_server_properties_impl.h"
25#include "net/http/http_stream.h"
26#include "net/http/http_stream_factory.h"
[email protected]c41737d2014-05-14 07:47:1927#include "net/http/http_transaction_test_util.h"
[email protected]b1c988b2013-06-13 06:48:1128#include "net/http/transport_security_state.h"
vishal.b62985ca92015-04-17 08:45:5129#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4630#include "net/log/test_net_log_entry.h"
31#include "net/log/test_net_log_util.h"
[email protected]61a527782013-02-21 03:58:0032#include "net/proxy/proxy_config_service_fixed.h"
33#include "net/proxy/proxy_resolver.h"
34#include "net/proxy/proxy_service.h"
bnc508835902015-05-12 20:10:2935#include "net/quic/crypto/proof_verifier_chromium.h"
[email protected]61a527782013-02-21 03:58:0036#include "net/quic/crypto/quic_decrypter.h"
37#include "net/quic/crypto/quic_encrypter.h"
38#include "net/quic/quic_framer.h"
[email protected]24e5bc52013-09-18 15:36:5839#include "net/quic/quic_http_utils.h"
[email protected]ed3fc15d2013-03-08 18:37:4440#include "net/quic/test_tools/crypto_test_utils.h"
[email protected]61a527782013-02-21 03:58:0041#include "net/quic/test_tools/mock_clock.h"
[email protected]e8ff26842013-03-22 21:02:0542#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
[email protected]61a527782013-02-21 03:58:0043#include "net/quic/test_tools/mock_random.h"
[email protected]1e960032013-12-20 19:00:2044#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]61a527782013-02-21 03:58:0045#include "net/quic/test_tools/quic_test_utils.h"
46#include "net/socket/client_socket_factory.h"
47#include "net/socket/mock_client_socket_pool_manager.h"
48#include "net/socket/socket_test_util.h"
49#include "net/socket/ssl_client_socket.h"
50#include "net/spdy/spdy_frame_builder.h"
51#include "net/spdy/spdy_framer.h"
[email protected]536fd0b2013-03-14 17:41:5752#include "net/ssl/ssl_config_service_defaults.h"
bnc508835902015-05-12 20:10:2953#include "net/test/cert_test_util.h"
[email protected]61a527782013-02-21 03:58:0054#include "testing/gtest/include/gtest/gtest.h"
55#include "testing/platform_test.h"
56
bnc508835902015-05-12 20:10:2957namespace net {
58namespace test {
[email protected]61a527782013-02-21 03:58:0059
60namespace {
61
rchf114d982015-10-21 01:34:5662static const char kQuicAlternateProtocolHeader[] =
[email protected]6d1b4ed2013-07-10 03:57:5463 "Alternate-Protocol: 443:quic\r\n\r\n";
rchf47265dc2016-03-21 21:33:1264static const char kQuicAlternateProtocolWithProbabilityHeader[] =
65 "Alternate-Protocol: 443:quic,p=.5\r\n\r\n";
rchf114d982015-10-21 01:34:5666static const char kQuicAlternateProtocolDifferentPortHeader[] =
67 "Alternate-Protocol: 137:quic\r\n\r\n";
68static const char kQuicAlternativeServiceHeader[] =
bncc958faa2015-07-31 18:14:5269 "Alt-Svc: quic=\":443\"\r\n\r\n";
rchf47265dc2016-03-21 21:33:1270static const char kQuicAlternativeServiceWithProbabilityHeader[] =
71 "Alt-Svc: quic=\":443\";p=\".5\"\r\n\r\n";
rchf114d982015-10-21 01:34:5672static const char kQuicAlternativeServiceDifferentPortHeader[] =
73 "Alt-Svc: quic=\":137\"\r\n\r\n";
[email protected]1e960032013-12-20 19:00:2074
rch9ae5b3b2016-02-11 00:36:2975const char kDefaultServerHostName[] = "mail.example.org";
bncb07c05532015-05-14 19:07:2076
[email protected]61a527782013-02-21 03:58:0077} // namespace
78
[email protected]1e960032013-12-20 19:00:2079// Helper class to encapsulate MockReads and MockWrites for QUIC.
80// Simplify ownership issues and the interaction with the MockSocketFactory.
81class MockQuicData {
82 public:
rtennetia004d332015-08-28 06:44:5783 MockQuicData() : packet_number_(0) {}
rcha5399e02015-04-21 19:32:0484
rjshaded5ced072015-12-18 19:26:0285 ~MockQuicData() { STLDeleteElements(&packets_); }
[email protected]1e960032013-12-20 19:00:2086
rcha5399e02015-04-21 19:32:0487 void AddSynchronousRead(scoped_ptr<QuicEncryptedPacket> packet) {
[email protected]1e960032013-12-20 19:00:2088 reads_.push_back(MockRead(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:5789 packet_number_++));
[email protected]1e960032013-12-20 19:00:2090 packets_.push_back(packet.release());
91 }
92
rcha5399e02015-04-21 19:32:0493 void AddRead(scoped_ptr<QuicEncryptedPacket> packet) {
94 reads_.push_back(
rtennetia004d332015-08-28 06:44:5795 MockRead(ASYNC, packet->data(), packet->length(), packet_number_++));
rcha5399e02015-04-21 19:32:0496 packets_.push_back(packet.release());
97 }
98
[email protected]1e960032013-12-20 19:00:2099 void AddRead(IoMode mode, int rv) {
rtennetia004d332015-08-28 06:44:57100 reads_.push_back(MockRead(mode, rv, packet_number_++));
[email protected]1e960032013-12-20 19:00:20101 }
102
103 void AddWrite(scoped_ptr<QuicEncryptedPacket> packet) {
104 writes_.push_back(MockWrite(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:57105 packet_number_++));
[email protected]1e960032013-12-20 19:00:20106 packets_.push_back(packet.release());
107 }
108
rcha5399e02015-04-21 19:32:04109 void AddSocketDataToFactory(MockClientSocketFactory* factory) {
rjshaded5ced072015-12-18 19:26:02110 MockRead* reads = reads_.empty() ? nullptr : &reads_[0];
111 MockWrite* writes = writes_.empty() ? nullptr : &writes_[0];
rcha5399e02015-04-21 19:32:04112 socket_data_.reset(
113 new SequencedSocketData(reads, reads_.size(), writes, writes_.size()));
[email protected]1e960032013-12-20 19:00:20114 factory->AddSocketDataProvider(socket_data_.get());
115 }
116
mmenkee24011922015-12-17 22:12:59117 void Resume() { socket_data_->Resume(); }
rchb27683c2015-07-29 23:53:50118
[email protected]1e960032013-12-20 19:00:20119 private:
120 std::vector<QuicEncryptedPacket*> packets_;
121 std::vector<MockWrite> writes_;
122 std::vector<MockRead> reads_;
rtennetia004d332015-08-28 06:44:57123 size_t packet_number_;
rchb27683c2015-07-29 23:53:50124 scoped_ptr<SequencedSocketData> socket_data_;
[email protected]1e960032013-12-20 19:00:20125};
126
tbansal7cec3812015-02-05 21:25:12127class ProxyHeadersHandler {
128 public:
129 ProxyHeadersHandler() : was_called_(false) {}
130
131 bool was_called() { return was_called_; }
132
133 void OnBeforeProxyHeadersSent(const ProxyInfo& proxy_info,
134 HttpRequestHeaders* request_headers) {
135 was_called_ = true;
136 }
137
138 private:
139 bool was_called_;
140};
141
tbansal0f56a39a2016-04-07 22:03:38142class TestSocketPerformanceWatcher : public SocketPerformanceWatcher {
tbansalfdf5665b2015-09-21 22:46:40143 public:
tbansal0f56a39a2016-04-07 22:03:38144 explicit TestSocketPerformanceWatcher(bool* rtt_notification_received)
145 : rtt_notification_received_(rtt_notification_received) {}
146 ~TestSocketPerformanceWatcher() override {}
tbansalfdf5665b2015-09-21 22:46:40147
tbansal0f56a39a2016-04-07 22:03:38148 bool ShouldNotifyUpdatedRTT() const override { return true; }
tbansalfdf5665b2015-09-21 22:46:40149
tbansal0f56a39a2016-04-07 22:03:38150 void OnUpdatedRTTAvailable(const base::TimeDelta& rtt) override {
151 *rtt_notification_received_ = true;
152 }
153
154 void OnConnectionChanged() override {}
155
156 private:
157 bool* rtt_notification_received_;
158
159 DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcher);
160};
161
162class TestSocketPerformanceWatcherFactory
163 : public SocketPerformanceWatcherFactory {
164 public:
165 TestSocketPerformanceWatcherFactory()
166 : watcher_count_(0u), rtt_notification_received_(false) {}
167 ~TestSocketPerformanceWatcherFactory() override {}
168
169 // SocketPerformanceWatcherFactory implementation:
tbansalc8a94ea2015-11-02 23:58:51170 scoped_ptr<SocketPerformanceWatcher> CreateSocketPerformanceWatcher(
171 const Protocol protocol) override {
172 if (protocol != PROTOCOL_QUIC) {
tbansal0f56a39a2016-04-07 22:03:38173 return nullptr;
tbansalc8a94ea2015-11-02 23:58:51174 }
175 ++watcher_count_;
tbansal0f56a39a2016-04-07 22:03:38176 return scoped_ptr<SocketPerformanceWatcher>(
177 new TestSocketPerformanceWatcher(&rtt_notification_received_));
tbansalfdf5665b2015-09-21 22:46:40178 }
179
tbansalc8a94ea2015-11-02 23:58:51180 size_t watcher_count() const { return watcher_count_; }
tbansalfdf5665b2015-09-21 22:46:40181
tbansalc8a94ea2015-11-02 23:58:51182 bool rtt_notification_received() const { return rtt_notification_received_; }
183
tbansalc8a94ea2015-11-02 23:58:51184 private:
tbansal0f56a39a2016-04-07 22:03:38185 size_t watcher_count_;
tbansalc8a94ea2015-11-02 23:58:51186 bool rtt_notification_received_;
tbansal0f56a39a2016-04-07 22:03:38187
188 DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcherFactory);
tbansalc8a94ea2015-11-02 23:58:51189};
190
[email protected]1e960032013-12-20 19:00:20191class QuicNetworkTransactionTest
192 : public PlatformTest,
[email protected]5d03bbd2014-03-07 16:19:16193 public ::testing::WithParamInterface<QuicVersion> {
[email protected]61a527782013-02-21 03:58:00194 protected:
[email protected]1c04f9522013-02-21 20:32:43195 QuicNetworkTransactionTest()
rtenneti4b06ae72014-08-26 03:43:43196 : clock_(new MockClock),
bncb07c05532015-05-14 19:07:20197 maker_(GetParam(), 0, clock_, kDefaultServerHostName),
rtenneti052774e2015-11-24 21:00:12198 cert_transparency_verifier_(new MultiLogCTVerifier()),
[email protected]1c04f9522013-02-21 20:32:43199 ssl_config_service_(new SSLConfigServiceDefaults),
200 proxy_service_(ProxyService::CreateDirect()),
201 auth_handler_factory_(
[email protected]dda75ab2013-06-22 22:43:30202 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
[email protected]457d6952013-12-13 09:24:58203 random_generator_(0),
rchf114d982015-10-21 01:34:56204 ssl_data_(ASYNC, OK) {
[email protected]aa9b14d2013-05-10 23:45:19205 request_.method = "GET";
rchf114d982015-10-21 01:34:56206 std::string url("https://");
bncb07c05532015-05-14 19:07:20207 url.append(kDefaultServerHostName);
208 request_.url = GURL(url);
[email protected]aa9b14d2013-05-10 23:45:19209 request_.load_flags = 0;
[email protected]98a9d1252014-04-04 00:43:59210 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
rchf114d982015-10-21 01:34:56211
rch3f4b8452016-02-23 16:59:32212 params_.parse_alternative_services = true;
213 params_.enable_alternative_service_with_different_host = true;
214
rchf114d982015-10-21 01:34:56215 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29216 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
rchf114d982015-10-21 01:34:56217 verify_details_.cert_verify_result.verified_cert = cert;
218 verify_details_.cert_verify_result.is_issued_by_known_root = true;
219 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
[email protected]1c04f9522013-02-21 20:32:43220 }
[email protected]61a527782013-02-21 03:58:00221
dcheng67be2b1f2014-10-27 21:47:29222 void SetUp() override {
[email protected]61a527782013-02-21 03:58:00223 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34224 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00225 }
226
dcheng67be2b1f2014-10-27 21:47:29227 void TearDown() override {
[email protected]61a527782013-02-21 03:58:00228 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
229 // Empty the current queue.
[email protected]2da659e2013-05-23 20:51:34230 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00231 PlatformTest::TearDown();
232 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34233 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00234 }
235
[email protected]3316d422013-05-03 21:45:30236 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
rtennetia004d332015-08-28 06:44:57237 QuicPacketNumber num) {
[email protected]1e960032013-12-20 19:00:20238 return maker_.MakeConnectionClosePacket(num);
[email protected]3316d422013-05-03 21:45:30239 }
240
zhongyi6b5a3892016-03-12 04:46:20241 scoped_ptr<QuicEncryptedPacket> ConstructGoAwayPacket(
242 QuicPacketNumber num,
243 QuicErrorCode error_code,
244 std::string reason_phrase) {
245 return maker_.MakeGoAwayPacket(num, error_code, reason_phrase);
246 }
247
[email protected]61a527782013-02-21 03:58:00248 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket(
rtennetia004d332015-08-28 06:44:57249 QuicPacketNumber largest_received,
250 QuicPacketNumber least_unacked) {
zhongyi32569c62016-01-08 02:54:30251 return maker_.MakeAckPacket(2, largest_received, least_unacked,
252 least_unacked, true);
253 }
254
zhongyi6b5a3892016-03-12 04:46:20255 scoped_ptr<QuicEncryptedPacket> ConstructAckAndRstPacket(
256 QuicPacketNumber num,
257 QuicStreamId stream_id,
258 QuicRstStreamErrorCode error_code,
259 QuicPacketNumber largest_received,
260 QuicPacketNumber ack_least_unacked,
261 QuicPacketNumber stop_least_unacked) {
262 return maker_.MakeAckAndRstPacket(num, false, stream_id, error_code,
263 largest_received, ack_least_unacked,
264 stop_least_unacked, true);
265 }
266
zhongyi32569c62016-01-08 02:54:30267 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket(
268 QuicPacketNumber largest_received,
269 QuicPacketNumber least_unacked,
270 QuicTestPacketMaker* maker) {
271 return maker->MakeAckPacket(2, largest_received, least_unacked,
272 least_unacked, true);
273 }
274
275 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket(
276 QuicPacketNumber packet_number,
277 QuicPacketNumber largest_received,
278 QuicPacketNumber ack_least_unacked,
279 QuicPacketNumber stop_least_unacked) {
280 return maker_.MakeAckPacket(packet_number, largest_received,
281 ack_least_unacked, stop_least_unacked, true);
[email protected]1e960032013-12-20 19:00:20282 }
[email protected]61a527782013-02-21 03:58:00283
zhongyica364fbb2015-12-12 03:39:12284 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket(
285 QuicPacketNumber num,
286 QuicTime::Delta delta_time_largest_observed,
287 QuicPacketNumber largest_received,
288 QuicPacketNumber least_unacked,
289 QuicErrorCode quic_error,
290 std::string& quic_error_details) {
291 return maker_.MakeAckAndConnectionClosePacket(
292 num, false, delta_time_largest_observed, largest_received,
293 least_unacked, quic_error, quic_error_details);
294 }
295
296 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket(
297 QuicPacketNumber num,
298 bool include_version,
299 QuicStreamId stream_id,
300 QuicRstStreamErrorCode error_code) {
301 return maker_.MakeRstPacket(num, include_version, stream_id, error_code);
302 }
303
zhongyi32569c62016-01-08 02:54:30304 // Uses default QuicTestPacketMaker.
[email protected]1e960032013-12-20 19:00:20305 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
306 const std::string& scheme,
307 const std::string& path) {
zhongyi32569c62016-01-08 02:54:30308 return GetRequestHeaders(method, scheme, path, maker_);
309 }
310
311 // Uses customized QuicTestPacketMaker.
312 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
313 const std::string& scheme,
314 const std::string& path,
315 QuicTestPacketMaker& maker) {
316 return maker.GetRequestHeaders(method, scheme, path);
[email protected]61a527782013-02-21 03:58:00317 }
318
[email protected]1e960032013-12-20 19:00:20319 SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
320 return maker_.GetResponseHeaders(status);
[email protected]61a527782013-02-21 03:58:00321 }
322
zhongyi32569c62016-01-08 02:54:30323 // Appends alt_svc headers in the response headers.
324 SpdyHeaderBlock GetResponseHeaders(const std::string& status,
325 const std::string& alt_svc) {
326 return maker_.GetResponseHeaders(status, alt_svc);
327 }
328
[email protected]1e960032013-12-20 19:00:20329 scoped_ptr<QuicEncryptedPacket> ConstructDataPacket(
rtennetia004d332015-08-28 06:44:57330 QuicPacketNumber packet_number,
[email protected]98b20ce2013-05-10 05:55:26331 QuicStreamId stream_id,
[email protected]e8ff26842013-03-22 21:02:05332 bool should_include_version,
[email protected]61a527782013-02-21 03:58:00333 bool fin,
334 QuicStreamOffset offset,
335 base::StringPiece data) {
rtennetia004d332015-08-28 06:44:57336 return maker_.MakeDataPacket(packet_number, stream_id,
337 should_include_version, fin, offset, data);
[email protected]61a527782013-02-21 03:58:00338 }
339
[email protected]1e960032013-12-20 19:00:20340 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
rtennetia004d332015-08-28 06:44:57341 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20342 QuicStreamId stream_id,
343 bool should_include_version,
344 bool fin,
zhongyi32569c62016-01-08 02:54:30345 const SpdyHeaderBlock& headers,
346 QuicStreamOffset* offset) {
ianswett0888cff2015-11-24 17:42:16347 SpdyPriority priority =
rtennetif4bdb542015-01-21 14:33:05348 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
zhongyi32569c62016-01-08 02:54:30349 return maker_.MakeRequestHeadersPacketWithOffsetTracking(
350 packet_number, stream_id, should_include_version, fin, priority,
351 headers, offset);
352 }
353
354 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
355 QuicPacketNumber packet_number,
356 QuicStreamId stream_id,
357 bool should_include_version,
358 bool fin,
359 const SpdyHeaderBlock& headers,
360 QuicStreamOffset* offset,
361 QuicTestPacketMaker* maker) {
362 SpdyPriority priority =
363 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
364 return maker->MakeRequestHeadersPacketWithOffsetTracking(
365 packet_number, stream_id, should_include_version, fin, priority,
366 headers, offset);
367 }
368
369 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
370 QuicPacketNumber packet_number,
371 QuicStreamId stream_id,
372 bool should_include_version,
373 bool fin,
374 const SpdyHeaderBlock& headers) {
375 return ConstructRequestHeadersPacket(packet_number, stream_id,
376 should_include_version, fin, headers,
377 nullptr, &maker_);
378 }
379 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
380 QuicPacketNumber packet_number,
381 QuicStreamId stream_id,
382 bool should_include_version,
383 bool fin,
384 const SpdyHeaderBlock& headers,
385 QuicTestPacketMaker* maker) {
386 return ConstructRequestHeadersPacket(packet_number, stream_id,
387 should_include_version, fin, headers,
388 nullptr, maker);
[email protected]61a527782013-02-21 03:58:00389 }
390
[email protected]1e960032013-12-20 19:00:20391 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
rtennetia004d332015-08-28 06:44:57392 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20393 QuicStreamId stream_id,
394 bool should_include_version,
395 bool fin,
396 const SpdyHeaderBlock& headers) {
zhongyi32569c62016-01-08 02:54:30397 return ConstructResponseHeadersPacket(packet_number, stream_id,
398 should_include_version, fin, headers,
399 nullptr, &maker_);
400 }
401
402 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
403 QuicPacketNumber packet_number,
404 QuicStreamId stream_id,
405 bool should_include_version,
406 bool fin,
407 const SpdyHeaderBlock& headers,
408 QuicTestPacketMaker* maker) {
409 return ConstructResponseHeadersPacket(packet_number, stream_id,
410 should_include_version, fin, headers,
411 nullptr, maker);
412 }
413
414 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
415 QuicPacketNumber packet_number,
416 QuicStreamId stream_id,
417 bool should_include_version,
418 bool fin,
419 const SpdyHeaderBlock& headers,
420 QuicStreamOffset* offset) {
421 return maker_.MakeResponseHeadersPacketWithOffsetTracking(
422 packet_number, stream_id, should_include_version, fin, headers, offset);
423 }
424
425 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
426 QuicPacketNumber packet_number,
427 QuicStreamId stream_id,
428 bool should_include_version,
429 bool fin,
430 const SpdyHeaderBlock& headers,
431 QuicStreamOffset* offset,
432 QuicTestPacketMaker* maker) {
433 return maker->MakeResponseHeadersPacketWithOffsetTracking(
434 packet_number, stream_id, should_include_version, fin, headers, offset);
[email protected]61a527782013-02-21 03:58:00435 }
436
rch3f4b8452016-02-23 16:59:32437 void CreateSession() { CreateSessionWithFactory(&socket_factory_); }
[email protected]dda75ab2013-06-22 22:43:30438
rch3f4b8452016-02-23 16:59:32439 void CreateSessionWithFactory(ClientSocketFactory* socket_factory) {
[email protected]4dca587c2013-03-07 16:54:47440 params_.enable_quic = true;
441 params_.quic_clock = clock_;
442 params_.quic_random = &random_generator_;
[email protected]dda75ab2013-06-22 22:43:30443 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
[email protected]aa9b14d2013-05-10 23:45:19469 void CheckWasQuicResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
470 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42471 ASSERT_TRUE(response != nullptr);
472 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19473 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
474 EXPECT_TRUE(response->was_fetched_via_spdy);
475 EXPECT_TRUE(response->was_npn_negotiated);
476 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
477 response->connection_info);
478 }
479
bnc62a44f022015-04-02 15:59:41480 void CheckResponsePort(const scoped_ptr<HttpNetworkTransaction>& trans,
Avi Drissman13fc8932015-12-20 04:40:46481 uint16_t port) {
bnc62a44f022015-04-02 15:59:41482 const HttpResponseInfo* response = trans->GetResponseInfo();
483 ASSERT_TRUE(response != nullptr);
484 EXPECT_EQ(port, response->socket_address.port());
485 }
486
[email protected]aa9b14d2013-05-10 23:45:19487 void CheckWasHttpResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
488 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42489 ASSERT_TRUE(response != nullptr);
490 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19491 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
492 EXPECT_FALSE(response->was_fetched_via_spdy);
493 EXPECT_FALSE(response->was_npn_negotiated);
494 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1,
495 response->connection_info);
496 }
497
bncffc2fdf2015-05-14 18:29:49498 void CheckResponseData(const scoped_ptr<HttpNetworkTransaction>& trans,
[email protected]aa9b14d2013-05-10 23:45:19499 const std::string& expected) {
500 std::string response_data;
bncffc2fdf2015-05-14 18:29:49501 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
[email protected]aa9b14d2013-05-10 23:45:19502 EXPECT_EQ(expected, response_data);
503 }
504
bncffc2fdf2015-05-14 18:29:49505 void RunTransaction(const scoped_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19506 TestCompletionCallback callback;
507 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
508 EXPECT_EQ(ERR_IO_PENDING, rv);
509 EXPECT_EQ(OK, callback.WaitForResult());
510 }
511
512 void SendRequestAndExpectHttpResponse(const std::string& expected) {
513 scoped_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50514 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
bncffc2fdf2015-05-14 18:29:49515 RunTransaction(trans);
[email protected]aa9b14d2013-05-10 23:45:19516 CheckWasHttpResponse(trans);
bncffc2fdf2015-05-14 18:29:49517 CheckResponseData(trans, expected);
[email protected]aa9b14d2013-05-10 23:45:19518 }
519
520 void SendRequestAndExpectQuicResponse(const std::string& expected) {
rchf114d982015-10-21 01:34:56521 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, 443);
tbansal7cec3812015-02-05 21:25:12522 }
523
bnc62a44f022015-04-02 15:59:41524 void SendRequestAndExpectQuicResponseOnPort(const std::string& expected,
Avi Drissman13fc8932015-12-20 04:40:46525 uint16_t port) {
bnc62a44f022015-04-02 15:59:41526 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, port);
527 }
528
529 void SendRequestAndExpectQuicResponseFromProxyOnPort(
530 const std::string& expected,
Avi Drissman13fc8932015-12-20 04:40:46531 uint16_t port) {
bnc62a44f022015-04-02 15:59:41532 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port);
[email protected]aa9b14d2013-05-10 23:45:19533 }
534
535 void AddQuicAlternateProtocolMapping(
536 MockCryptoClientStream::HandshakeMode handshake_mode) {
537 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
bnccacc0992015-03-20 20:22:22538 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url);
rchf114d982015-10-21 01:34:56539 AlternativeService alternative_service(QUIC, host_port_pair.host(), 443);
bnc7dc7e1b42015-07-28 14:43:12540 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
541 http_server_properties_.SetAlternativeService(
rchdc7b9052016-03-17 20:51:50542 host_port_pair, alternative_service, expiration);
[email protected]aa9b14d2013-05-10 23:45:19543 }
544
rchbe69cb902016-02-11 01:10:48545 void AddQuicRemoteAlternativeServiceMapping(
546 MockCryptoClientStream::HandshakeMode handshake_mode,
547 const HostPortPair& alternative) {
548 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
549 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url);
550 AlternativeService alternative_service(QUIC, alternative.host(),
551 alternative.port());
552 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
553 http_server_properties_.SetAlternativeService(
rchdc7b9052016-03-17 20:51:50554 host_port_pair, alternative_service, expiration);
rchbe69cb902016-02-11 01:10:48555 }
556
[email protected]aa9b14d2013-05-10 23:45:19557 void ExpectBrokenAlternateProtocolMapping() {
bnc8445b3002015-03-13 01:57:09558 const HostPortPair origin = HostPortPair::FromURL(request_.url);
bncd9b132e2015-07-08 05:16:10559 const AlternativeServiceVector alternative_service_vector =
560 http_server_properties_.GetAlternativeServices(origin);
561 EXPECT_EQ(1u, alternative_service_vector.size());
bnc6be245c12015-05-15 11:24:07562 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken(
bncd9b132e2015-07-08 05:16:10563 alternative_service_vector[0]));
[email protected]aa9b14d2013-05-10 23:45:19564 }
565
[email protected]4d590c9c2014-05-02 05:14:33566 void ExpectQuicAlternateProtocolMapping() {
bncd9b132e2015-07-08 05:16:10567 const HostPortPair origin = HostPortPair::FromURL(request_.url);
568 const AlternativeServiceVector alternative_service_vector =
569 http_server_properties_.GetAlternativeServices(origin);
570 EXPECT_EQ(1u, alternative_service_vector.size());
571 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
[email protected]4d590c9c2014-05-02 05:14:33572 }
573
[email protected]aa9b14d2013-05-10 23:45:19574 void AddHangingNonAlternateProtocolSocketData() {
zhongyi32569c62016-01-08 02:54:30575 scoped_ptr<StaticSocketDataProvider> hanging_data;
576 hanging_data.reset(new StaticSocketDataProvider());
[email protected]dda75ab2013-06-22 22:43:30577 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
zhongyi32569c62016-01-08 02:54:30578 hanging_data->set_connect_data(hanging_connect);
579 hanging_data_.push_back(std::move(hanging_data));
580 socket_factory_.AddSocketDataProvider(hanging_data_.back().get());
rchf114d982015-10-21 01:34:56581 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]aa9b14d2013-05-10 23:45:19582 }
583
rtenneti4b06ae72014-08-26 03:43:43584 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
[email protected]1e960032013-12-20 19:00:20585 QuicTestPacketMaker maker_;
mmenkee65e7af2015-10-13 17:16:42586 scoped_ptr<HttpNetworkSession> session_;
[email protected]61a527782013-02-21 03:58:00587 MockClientSocketFactory socket_factory_;
rchf114d982015-10-21 01:34:56588 ProofVerifyDetailsChromium verify_details_;
[email protected]e8ff26842013-03-22 21:02:05589 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43590 MockHostResolver host_resolver_;
591 MockCertVerifier cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11592 TransportSecurityState transport_security_state_;
rtenneti052774e2015-11-24 21:00:12593 scoped_ptr<CTVerifier> cert_transparency_verifier_;
tbansal0f56a39a2016-04-07 22:03:38594 TestSocketPerformanceWatcherFactory test_socket_performance_watcher_factory_;
[email protected]1c04f9522013-02-21 20:32:43595 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
596 scoped_ptr<ProxyService> proxy_service_;
597 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
[email protected]61a527782013-02-21 03:58:00598 MockRandom random_generator_;
bnc6be245c12015-05-15 11:24:07599 HttpServerPropertiesImpl http_server_properties_;
[email protected]61a527782013-02-21 03:58:00600 HttpNetworkSession::Params params_;
[email protected]aa9b14d2013-05-10 23:45:19601 HttpRequestInfo request_;
vishal.b62985ca92015-04-17 08:45:51602 BoundTestNetLog net_log_;
zhongyi32569c62016-01-08 02:54:30603 std::vector<scoped_ptr<StaticSocketDataProvider>> hanging_data_;
rchf114d982015-10-21 01:34:56604 SSLSocketDataProvider ssl_data_;
tbansal7cec3812015-02-05 21:25:12605
606 private:
607 void SendRequestAndExpectQuicResponseMaybeFromProxy(
608 const std::string& expected,
bnc62a44f022015-04-02 15:59:41609 bool used_proxy,
Avi Drissman13fc8932015-12-20 04:40:46610 uint16_t port) {
tbansal7cec3812015-02-05 21:25:12611 scoped_ptr<HttpNetworkTransaction> trans(
612 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
613 ProxyHeadersHandler proxy_headers_handler;
614 trans->SetBeforeProxyHeadersSentCallback(
615 base::Bind(&ProxyHeadersHandler::OnBeforeProxyHeadersSent,
616 base::Unretained(&proxy_headers_handler)));
bncffc2fdf2015-05-14 18:29:49617 RunTransaction(trans);
tbansal7cec3812015-02-05 21:25:12618 CheckWasQuicResponse(trans);
bnc62a44f022015-04-02 15:59:41619 CheckResponsePort(trans, port);
bncffc2fdf2015-05-14 18:29:49620 CheckResponseData(trans, expected);
tbansal7cec3812015-02-05 21:25:12621 EXPECT_EQ(used_proxy, proxy_headers_handler.was_called());
622 }
[email protected]61a527782013-02-21 03:58:00623};
624
rjshaded5ced072015-12-18 19:26:02625INSTANTIATE_TEST_CASE_P(Version,
626 QuicNetworkTransactionTest,
[email protected]1e960032013-12-20 19:00:20627 ::testing::ValuesIn(QuicSupportedVersions()));
628
629TEST_P(QuicNetworkTransactionTest, ForceQuic) {
rtenneti8a2f4632016-03-21 20:26:57630 params_.origins_to_force_quic_on.insert(
631 HostPortPair::FromString("mail.example.org:443"));
[email protected]4dca587c2013-03-07 16:54:47632
[email protected]1e960032013-12-20 19:00:20633 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03634 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05635 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56636 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:02637 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
638 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:03639 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05640 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03641 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:59642 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
[email protected]4dca587c2013-03-07 16:54:47643
rcha5399e02015-04-21 19:32:04644 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4dca587c2013-03-07 16:54:47645
[email protected]aa9b14d2013-05-10 23:45:19646 // The non-alternate protocol job needs to hang in order to guarantee that
647 // the alternate-protocol job will "win".
648 AddHangingNonAlternateProtocolSocketData();
[email protected]4dca587c2013-03-07 16:54:47649
rch3f4b8452016-02-23 16:59:32650 params_.parse_alternative_services = false;
651 params_.enable_alternative_service_with_different_host = false;
[email protected]4dca587c2013-03-07 16:54:47652 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47653
tbansal0f56a39a2016-04-07 22:03:38654 EXPECT_FALSE(
655 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]aa9b14d2013-05-10 23:45:19656 SendRequestAndExpectQuicResponse("hello!");
tbansal0f56a39a2016-04-07 22:03:38657 EXPECT_TRUE(
658 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]4dca587c2013-03-07 16:54:47659
[email protected]98b20ce2013-05-10 05:55:26660 // Check that the NetLog was filled reasonably.
mmenke43758e62015-05-04 21:09:46661 TestNetLogEntry::List entries;
[email protected]aa9b14d2013-05-10 23:45:19662 net_log_.GetEntries(&entries);
[email protected]98b20ce2013-05-10 05:55:26663 EXPECT_LT(0u, entries.size());
664
665 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29666 int pos = ExpectLogContainsSomewhere(
667 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
668 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26669 EXPECT_LT(0, pos);
670
rchfd527212015-08-25 00:41:26671 // ... and also a TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29672 pos = ExpectLogContainsSomewhere(
rchfd527212015-08-25 00:41:26673 entries, 0,
674 NetLog::TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED,
ttuttle859dc7a2015-04-23 19:42:29675 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26676 EXPECT_LT(0, pos);
677
rtennetia004d332015-08-28 06:44:57678 std::string packet_number;
679 ASSERT_TRUE(entries[pos].GetStringValue("packet_number", &packet_number));
680 EXPECT_EQ("1", packet_number);
[email protected]98b20ce2013-05-10 05:55:26681
rchfd527212015-08-25 00:41:26682 // ... and also a TYPE_QUIC_SESSION_PACKET_AUTHENTICATED.
683 pos = ExpectLogContainsSomewhere(
684 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_AUTHENTICATED,
685 NetLog::PHASE_NONE);
686 EXPECT_LT(0, pos);
687
[email protected]98b20ce2013-05-10 05:55:26688 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29689 pos = ExpectLogContainsSomewhere(
690 entries, 0, NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
691 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26692 EXPECT_LT(0, pos);
693
694 int log_stream_id;
695 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
[email protected]1e960032013-12-20 19:00:20696 EXPECT_EQ(3, log_stream_id);
[email protected]4dca587c2013-03-07 16:54:47697}
698
[email protected]cf3e3cd62014-02-05 16:16:16699TEST_P(QuicNetworkTransactionTest, QuicProxy) {
tbansaled0aecc2015-02-20 03:44:18700 params_.enable_quic_for_proxies = true;
rchf114d982015-10-21 01:34:56701 proxy_service_ =
rch9ae5b3b2016-02-11 00:36:29702 ProxyService::CreateFixedFromPacResult("QUIC mail.example.org:70");
[email protected]cf3e3cd62014-02-05 16:16:16703
[email protected]cf3e3cd62014-02-05 16:16:16704 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03705 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05706 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03707 GetRequestHeaders("GET", "http", "/")));
rjshaded5ced072015-12-18 19:26:02708 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
709 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:03710 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05711 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03712 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50713 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59714 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]cf3e3cd62014-02-05 16:16:16715
rcha5399e02015-04-21 19:32:04716 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cf3e3cd62014-02-05 16:16:16717
tbansal0f56a39a2016-04-07 22:03:38718 EXPECT_FALSE(
719 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16720 // There is no need to set up an alternate protocol job, because
721 // no attempt will be made to speak to the proxy over TCP.
722
rch9ae5b3b2016-02-11 00:36:29723 request_.url = GURL("http://mail.example.org/");
rch3f4b8452016-02-23 16:59:32724 params_.parse_alternative_services = false;
725 params_.enable_alternative_service_with_different_host = false;
[email protected]cf3e3cd62014-02-05 16:16:16726 CreateSession();
727
bnc62a44f022015-04-02 15:59:41728 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
tbansal0f56a39a2016-04-07 22:03:38729 EXPECT_TRUE(
730 test_socket_performance_watcher_factory_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16731}
732
bnc313ba9c2015-06-11 15:42:31733// Regression test for https://crbug.com/492458. Test that for an HTTP
734// connection through a QUIC proxy, the certificate exhibited by the proxy is
735// checked against the proxy hostname, not the origin hostname.
736TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) {
rch9ae5b3b2016-02-11 00:36:29737 const std::string origin_host = "mail.example.com";
bnc313ba9c2015-06-11 15:42:31738 const std::string proxy_host = "www.example.org";
739
740 params_.enable_quic_for_proxies = true;
rdsmith82957ad2015-09-16 19:42:03741 proxy_service_ =
742 ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70");
bnc313ba9c2015-06-11 15:42:31743
744 maker_.set_hostname(origin_host);
745 MockQuicData mock_quic_data;
746 mock_quic_data.AddWrite(
747 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
748 GetRequestHeaders("GET", "http", "/")));
749 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
750 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
751 mock_quic_data.AddRead(
752 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
753 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50754 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59755 mock_quic_data.AddRead(ASYNC, 0);
bnc313ba9c2015-06-11 15:42:31756 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
757
758 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:29759 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bnc313ba9c2015-06-11 15:42:31760 ASSERT_TRUE(cert.get());
761 // This certificate is valid for the proxy, but not for the origin.
762 bool common_name_fallback_used;
763 EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used));
764 EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used));
765 ProofVerifyDetailsChromium verify_details;
766 verify_details.cert_verify_result.verified_cert = cert;
767 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rchf114d982015-10-21 01:34:56768 ProofVerifyDetailsChromium verify_details2;
769 verify_details2.cert_verify_result.verified_cert = cert;
770 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
bnc313ba9c2015-06-11 15:42:31771
772 request_.url = GURL("http://" + origin_host);
773 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32774 CreateSession();
bnc313ba9c2015-06-11 15:42:31775 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
776 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
777}
778
rchbe69cb902016-02-11 01:10:48779TEST_P(QuicNetworkTransactionTest, AlternativeServicesDifferentHost) {
780 params_.enable_alternative_service_with_different_host = true;
781 HostPortPair origin("www.example.org", 443);
782 HostPortPair alternative("mail.example.org", 443);
783
784 base::FilePath certs_dir = GetTestCertsDirectory();
785 scoped_refptr<X509Certificate> cert(
786 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
787 ASSERT_TRUE(cert.get());
788 // TODO(rch): the connection should be "to" the origin, so if the cert is
789 // valid for the origin but not the alternative, that should work too.
790 bool common_name_fallback_used;
791 EXPECT_TRUE(cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
792 EXPECT_TRUE(
793 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
794 ProofVerifyDetailsChromium verify_details;
795 verify_details.cert_verify_result.verified_cert = cert;
796 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
797
798 maker_.set_hostname(origin.host());
799 MockQuicData mock_quic_data;
800 mock_quic_data.AddWrite(
801 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
802 GetRequestHeaders("GET", "https", "/")));
803 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
804 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
805 mock_quic_data.AddRead(
806 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
807 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
808 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
809 mock_quic_data.AddRead(ASYNC, 0);
810 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
811
812 request_.url = GURL("https://" + origin.host());
813 AddQuicRemoteAlternativeServiceMapping(
814 MockCryptoClientStream::CONFIRM_HANDSHAKE, alternative);
815 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32816 CreateSession();
rchbe69cb902016-02-11 01:10:48817
818 SendRequestAndExpectQuicResponse("hello!");
819}
820
[email protected]1e960032013-12-20 19:00:20821TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
rtenneti8a2f4632016-03-21 20:26:57822 params_.origins_to_force_quic_on.insert(
823 HostPortPair::FromString("mail.example.org:443"));
[email protected]cebe3282013-05-22 23:49:30824
tbansalfdf5665b2015-09-21 22:46:40825 MockQuicData mock_quic_data1;
826 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
[email protected]1e960032013-12-20 19:00:20827
tbansalfdf5665b2015-09-21 22:46:40828 MockQuicData mock_quic_data2;
zhongyi32569c62016-01-08 02:54:30829 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40830 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
rch6faa4d42016-01-05 20:48:43831 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
tbansalfdf5665b2015-09-21 22:46:40832
833 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
834 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
[email protected]cebe3282013-05-22 23:49:30835
rch3f4b8452016-02-23 16:59:32836 params_.parse_alternative_services = false;
837 params_.enable_alternative_service_with_different_host = false;
[email protected]cebe3282013-05-22 23:49:30838 CreateSession();
839
tbansal0f56a39a2016-04-07 22:03:38840 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40841 for (size_t i = 0; i < 2; ++i) {
842 scoped_ptr<HttpNetworkTransaction> trans(
843 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
844 TestCompletionCallback callback;
845 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
846 EXPECT_EQ(ERR_IO_PENDING, rv);
847 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
tbansal0f56a39a2016-04-07 22:03:38848 EXPECT_EQ(1 + i, test_socket_performance_watcher_factory_.watcher_count());
tbansalfdf5665b2015-09-21 22:46:40849 }
[email protected]cebe3282013-05-22 23:49:30850}
851
tbansalc8a94ea2015-11-02 23:58:51852TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
853 // Attempt to "force" quic on 443, which will not be honored.
rtenneti8a2f4632016-03-21 20:26:57854 params_.origins_to_force_quic_on.insert(
855 HostPortPair::FromString("www.google.com:443"));
tbansalc8a94ea2015-11-02 23:58:51856
857 MockRead http_reads[] = {
858 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
859 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
860 MockRead(ASYNC, OK)};
861
862 StaticSocketDataProvider data(http_reads, arraysize(http_reads), nullptr, 0);
863 socket_factory_.AddSocketDataProvider(&data);
864 SSLSocketDataProvider ssl(ASYNC, OK);
865 socket_factory_.AddSSLSocketDataProvider(&ssl);
866
rch3f4b8452016-02-23 16:59:32867 params_.parse_alternative_services = false;
868 params_.enable_alternative_service_with_different_host = false;
tbansalc8a94ea2015-11-02 23:58:51869 CreateSession();
870
871 SendRequestAndExpectHttpResponse("hello world");
tbansal0f56a39a2016-04-07 22:03:38872 EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count());
tbansalc8a94ea2015-11-02 23:58:51873}
874
bncc958faa2015-07-31 18:14:52875TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52876 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56877 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
878 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52879 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
880 MockRead(ASYNC, OK)};
881
882 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
883 0);
884 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56885 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52886
887 MockQuicData mock_quic_data;
888 mock_quic_data.AddWrite(
889 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56890 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52891 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
892 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
893 mock_quic_data.AddRead(
894 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
895 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
896 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59897 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52898
899 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
900
901 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32902 CreateSession();
bncc958faa2015-07-31 18:14:52903
904 SendRequestAndExpectHttpResponse("hello world");
905 SendRequestAndExpectQuicResponse("hello!");
906}
907
rchf47265dc2016-03-21 21:33:12908TEST_P(QuicNetworkTransactionTest,
909 UseAlternativeServiceWithProbabilityForQuic) {
910 MockRead http_reads[] = {
911 MockRead("HTTP/1.1 200 OK\r\n"),
912 MockRead(kQuicAlternativeServiceWithProbabilityHeader),
913 MockRead("hello world"),
914 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
915 MockRead(ASYNC, OK)};
916
917 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
918 0);
919 socket_factory_.AddSocketDataProvider(&http_data);
920 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
921
922 MockQuicData mock_quic_data;
923 mock_quic_data.AddWrite(
924 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
925 GetRequestHeaders("GET", "https", "/")));
926 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
927 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
928 mock_quic_data.AddRead(
929 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
930 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
931 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
932 mock_quic_data.AddRead(ASYNC, 0); // EOF
933
934 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
935
936 AddHangingNonAlternateProtocolSocketData();
937 CreateSession();
938
939 SendRequestAndExpectHttpResponse("hello world");
940 SendRequestAndExpectQuicResponse("hello!");
941}
942
bnc8be55ebb2015-10-30 14:12:07943TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) {
944 std::string altsvc_header = base::StringPrintf(
945 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam());
946 MockRead http_reads[] = {
947 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
948 MockRead("hello world"),
949 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
950 MockRead(ASYNC, OK)};
951
952 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
953 0);
954 socket_factory_.AddSocketDataProvider(&http_data);
955 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
956
957 MockQuicData mock_quic_data;
958 mock_quic_data.AddWrite(
959 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
960 GetRequestHeaders("GET", "https", "/")));
961 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
962 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
963 mock_quic_data.AddRead(
964 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
965 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
966 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59967 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc8be55ebb2015-10-30 14:12:07968
969 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
970
971 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:32972 CreateSession();
bnc8be55ebb2015-10-30 14:12:07973
974 SendRequestAndExpectHttpResponse("hello world");
975 SendRequestAndExpectQuicResponse("hello!");
976}
977
zhongyi6b5a3892016-03-12 04:46:20978TEST_P(QuicNetworkTransactionTest, GoAwayWithConnectionMigrationOnPortsOnly) {
979 MockQuicData mock_quic_data;
980 mock_quic_data.AddWrite(
981 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
982 GetRequestHeaders("GET", "https", "/")));
983 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
984 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
985 // Read a GoAway packet with
986 // QuicErrorCode: QUIC_ERROR_MIGRATING_PORT from the peer.
987 mock_quic_data.AddRead(
988 ConstructGoAwayPacket(2, QUIC_ERROR_MIGRATING_PORT,
989 "connection migration with port change only"));
990 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
991 mock_quic_data.AddRead(
992 ConstructDataPacket(3, kClientDataStreamId1, false, true, 0, "hello!"));
993 mock_quic_data.AddWrite(ConstructAckAndRstPacket(
994 3, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 3, 3, 1));
995 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
996 mock_quic_data.AddRead(ASYNC, 0); // EOF
997
998 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
999
1000 // The non-alternate protocol job needs to hang in order to guarantee that
1001 // the alternate-protocol job will "win".
1002 AddHangingNonAlternateProtocolSocketData();
1003
1004 // In order for a new QUIC session to be established via alternate-protocol
1005 // without racing an HTTP connection, we need the host resolution to happen
1006 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1007 // connection to the the server, in this test we require confirmation
1008 // before encrypting so the HTTP job will still start.
1009 host_resolver_.set_synchronous_mode(true);
1010 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1",
1011 "");
1012 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443));
1013 AddressList address;
1014 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1015 nullptr, net_log_.bound());
1016
1017 CreateSession();
1018 session_->quic_stream_factory()->set_require_confirmation(true);
1019 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1020
1021 scoped_ptr<HttpNetworkTransaction> trans(
1022 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1023 TestCompletionCallback callback;
1024 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1025 EXPECT_EQ(ERR_IO_PENDING, rv);
1026
1027 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1028 QuicSession::HANDSHAKE_CONFIRMED);
1029 EXPECT_EQ(OK, callback.WaitForResult());
1030
1031 // Check whether this transaction is correctly marked as received a go-away
1032 // because of migrating port.
1033 NetErrorDetails details;
1034 EXPECT_FALSE(details.quic_port_migration_detected);
1035 trans->PopulateNetErrorDetails(&details);
1036 EXPECT_TRUE(details.quic_port_migration_detected);
1037}
1038
bnc8be55ebb2015-10-30 14:12:071039TEST_P(QuicNetworkTransactionTest,
1040 DoNotUseAlternativeServiceQuicUnsupportedVersion) {
1041 std::string altsvc_header = base::StringPrintf(
1042 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam() - 1);
1043 MockRead http_reads[] = {
1044 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
1045 MockRead("hello world"),
1046 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1047 MockRead(ASYNC, OK)};
1048
1049 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1050 0);
1051 socket_factory_.AddSocketDataProvider(&http_data);
1052 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1053 socket_factory_.AddSocketDataProvider(&http_data);
1054 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1055
rch3f4b8452016-02-23 16:59:321056 CreateSession();
bnc8be55ebb2015-10-30 14:12:071057
1058 SendRequestAndExpectHttpResponse("hello world");
1059 SendRequestAndExpectHttpResponse("hello world");
1060}
1061
bncc958faa2015-07-31 18:14:521062// When multiple alternative services are advertised,
zhongyi32569c62016-01-08 02:54:301063// HttpStreamFactoryImpl::RequestStreamInternal() should select the alternative
1064// service which uses existing QUIC session if available. If no existing QUIC
1065// session can be used, use the first alternative service from the list.
1066TEST_P(QuicNetworkTransactionTest, UseExistingAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:521067 MockRead http_reads[] = {
1068 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291069 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
bncc958faa2015-07-31 18:14:521070 MockRead("hello world"),
1071 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1072 MockRead(ASYNC, OK)};
1073
1074 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1075 0);
1076 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561077 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521078
zhongyi32569c62016-01-08 02:54:301079 QuicStreamOffset request_header_offset = 0;
1080 QuicStreamOffset response_header_offset = 0;
1081 // First QUIC request data.
rch9ae5b3b2016-02-11 00:36:291082 // Open a session to foo.example.org:443 using the first entry of the
zhongyi32569c62016-01-08 02:54:301083 // alternative service list.
bncc958faa2015-07-31 18:14:521084 MockQuicData mock_quic_data;
zhongyi32569c62016-01-08 02:54:301085 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1086 1, kClientDataStreamId1, true, true,
1087 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1088
1089 std::string alt_svc_list =
rch9ae5b3b2016-02-11 00:36:291090 "quic=\"mail.example.org:444\", quic=\"foo.example.org:443\", "
1091 "quic=\"bar.example.org:445\"";
bncc958faa2015-07-31 18:14:521092 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
zhongyi32569c62016-01-08 02:54:301093 1, kClientDataStreamId1, false, false,
1094 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
bncc958faa2015-07-31 18:14:521095 mock_quic_data.AddRead(
1096 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1097 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301098
1099 // Second QUIC request data.
1100 // Connection pooling, using existing session, no need to include version
1101 // as version negotiation has been completed.
1102 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1103 3, kClientDataStreamId2, false, true,
1104 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1105 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1106 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1107 &response_header_offset));
1108 mock_quic_data.AddRead(
1109 ConstructDataPacket(4, kClientDataStreamId2, false, true, 0, "hello!"));
1110 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
bncc958faa2015-07-31 18:14:521111 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591112 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521113
1114 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1115
1116 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321117 CreateSession();
bncc958faa2015-07-31 18:14:521118
1119 SendRequestAndExpectHttpResponse("hello world");
zhongyi32569c62016-01-08 02:54:301120
bncc958faa2015-07-31 18:14:521121 SendRequestAndExpectQuicResponseOnPort("hello!", 443);
zhongyi32569c62016-01-08 02:54:301122 SendRequestAndExpectQuicResponseOnPort("hello!", 443);
1123}
1124
1125// When multiple alternative services that has existing QUIC session.
1126// HttpStreamFactoryImpl::RequestStreamInternal() should select the first
1127// alternative service which uses existing QUIC session.
1128TEST_P(QuicNetworkTransactionTest, UseFirstExistingAlternativeServiceForQuic) {
1129 MockRead http_reads[] = {
1130 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291131 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":446\"\r\n\r\n"),
zhongyi32569c62016-01-08 02:54:301132 MockRead("hello world"),
1133 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1134 MockRead(ASYNC, OK)};
1135
1136 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1137 0);
1138 socket_factory_.AddSocketDataProvider(&http_data);
1139 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1140
1141 QuicStreamOffset request_header_offset = 0;
1142 QuicStreamOffset response_header_offset = 0;
1143
1144 QuicTestPacketMaker maker(GetParam(), 0, clock_, kDefaultServerHostName);
1145
1146 MockQuicData mock_quic_data;
1147 MockQuicData mock_quic_data2;
1148 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
1149 // First QUIC request data.
rch9ae5b3b2016-02-11 00:36:291150 // Open a QUIC session to foo.example.org:443.
zhongyi32569c62016-01-08 02:54:301151 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1152 1, kClientDataStreamId1, true, true,
1153 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1154
1155 std::string alt_svc_list =
rch9ae5b3b2016-02-11 00:36:291156 "quic=\"bar.example.org:444\", quic=\"frog.example.org:445\", "
1157 "quic=\"mail.example.org:446\"";
zhongyi32569c62016-01-08 02:54:301158 // Response header from the server resets the alt_svc list for the origin.
1159 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1160 1, kClientDataStreamId1, false, false,
1161 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
1162 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1163 true, 0, "hello from foo!"));
1164 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1165
1166 // Second QUIC request data.
rch9ae5b3b2016-02-11 00:36:291167 // Existing QUIC session to foo.example.org is not viable from the updated
zhongyi32569c62016-01-08 02:54:301168 // alt_svc. Unable to pool the existing QUIC session.
rch9ae5b3b2016-02-11 00:36:291169 // Open a new QUIC session to bar.example.org:443.
zhongyi32569c62016-01-08 02:54:301170 mock_quic_data2.AddWrite(ConstructRequestHeadersPacket(
1171 1, kClientDataStreamId1, true, true,
1172 GetRequestHeaders("GET", "https", "/"), &maker));
1173 alt_svc_list =
rch9ae5b3b2016-02-11 00:36:291174 "quic=\"foo.example.org:443\", quic=\"mail.example.org:446\", "
1175 "quic=\"bar.example.org:444\"";
zhongyi32569c62016-01-08 02:54:301176 // Response header from the server resets the alt_svc list for the origin.
1177 mock_quic_data2.AddRead(ConstructResponseHeadersPacket(
1178 1, kClientDataStreamId1, false, false,
1179 GetResponseHeaders("200 OK", alt_svc_list), &maker));
1180 mock_quic_data2.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1181 true, 0, "hello from bar!"));
1182 mock_quic_data2.AddWrite(ConstructAckPacket(2, 1, &maker));
1183 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1184 mock_quic_data2.AddRead(ASYNC, 0); // EOF
1185
1186 // Third QUIC request data.
rch9ae5b3b2016-02-11 00:36:291187 // Connection pooling, using the first existing session to foo.example.org
zhongyi32569c62016-01-08 02:54:301188 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1189 3, kClientDataStreamId2, false, true,
1190 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1191 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1192 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1193 &response_header_offset));
1194 mock_quic_data.AddRead(ConstructDataPacket(4, kClientDataStreamId2, false,
1195 true, 0, "hello from foo!"));
1196 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
1197 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1198 mock_quic_data.AddRead(ASYNC, 0); // EOF
1199
1200 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1201 AddHangingNonAlternateProtocolSocketData();
1202
1203 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
1204
1205 AddHangingNonAlternateProtocolSocketData();
1206
rch3f4b8452016-02-23 16:59:321207 CreateSession();
zhongyi32569c62016-01-08 02:54:301208
1209 SendRequestAndExpectHttpResponse("hello world");
1210 SendRequestAndExpectQuicResponseOnPort("hello from foo!", 443);
1211 SendRequestAndExpectQuicResponseOnPort("hello from bar!", 444);
1212 SendRequestAndExpectQuicResponseOnPort("hello from foo!", 443);
1213}
1214
1215// Multiple origins have listed the same alternative services. When there's a
1216// existing QUIC session opened by a request to other origin,
1217// if the cert is valid, should select this QUIC session to make the request
1218// if this is also the first existing QUIC session.
1219TEST_P(QuicNetworkTransactionTest,
1220 UseSharedExistingAlternativeServiceForQuicWithValidCert) {
rch9ae5b3b2016-02-11 00:36:291221 // Default cert is valid for *.example.org
zhongyi32569c62016-01-08 02:54:301222
rch9ae5b3b2016-02-11 00:36:291223 // HTTP data for request to www.example.org.
zhongyi32569c62016-01-08 02:54:301224 MockRead http_reads[] = {
1225 MockRead("HTTP/1.1 200 OK\r\n"),
1226 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
rch9ae5b3b2016-02-11 00:36:291227 MockRead("hello world from www.example.org"),
zhongyi32569c62016-01-08 02:54:301228 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1229 MockRead(ASYNC, OK)};
1230
1231 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1232 0);
1233 socket_factory_.AddSocketDataProvider(&http_data);
1234 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1235
1236 // HTTP data for request to mail.example.org.
1237 MockRead http_reads2[] = {
1238 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291239 MockRead("Alt-Svc: quic=\":444\", quic=\"www.example.org:443\"\r\n\r\n"),
zhongyi32569c62016-01-08 02:54:301240 MockRead("hello world from mail.example.org"),
1241 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1242 MockRead(ASYNC, OK)};
1243
1244 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1245 nullptr, 0);
1246 socket_factory_.AddSocketDataProvider(&http_data2);
1247 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1248
1249 QuicStreamOffset request_header_offset = 0;
1250 QuicStreamOffset response_header_offset = 0;
1251
rch9ae5b3b2016-02-11 00:36:291252 QuicTestPacketMaker maker(GetParam(), 0, clock_, "mail.example.org");
1253 maker_.set_hostname("www.example.org");
zhongyi32569c62016-01-08 02:54:301254 MockQuicData mock_quic_data;
1255
1256 // First QUIC request data.
1257 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1258 1, kClientDataStreamId1, true, true,
1259 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1260
1261 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1262 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
1263 &response_header_offset));
1264 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1265 true, 0, "hello from mail QUIC!"));
1266 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
zhongyi32569c62016-01-08 02:54:301267 // Second QUIC request data.
1268 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1269 3, kClientDataStreamId2, false, true,
1270 GetRequestHeaders("GET", "https", "/", maker), &request_header_offset,
1271 &maker));
1272 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1273 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1274 &response_header_offset));
1275 mock_quic_data.AddRead(ConstructDataPacket(4, kClientDataStreamId2, false,
1276 true, 0, "hello from mail QUIC!"));
1277 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
1278 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1279 mock_quic_data.AddRead(ASYNC, 0); // EOF
1280
1281 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1282 AddHangingNonAlternateProtocolSocketData();
1283
rch3f4b8452016-02-23 16:59:321284 CreateSession();
zhongyi32569c62016-01-08 02:54:301285
1286 // Send two HTTP requests, responses set up alt-svc lists for the origins.
rch9ae5b3b2016-02-11 00:36:291287 request_.url = GURL("https://www.example.org/");
1288 SendRequestAndExpectHttpResponse("hello world from www.example.org");
zhongyi32569c62016-01-08 02:54:301289 request_.url = GURL("https://mail.example.org/");
1290 SendRequestAndExpectHttpResponse("hello world from mail.example.org");
1291
rch9ae5b3b2016-02-11 00:36:291292 // Open a QUIC session to mail.example.org:443 when making request
1293 // to mail.example.org.
1294 request_.url = GURL("https://www.example.org/");
zhongyi32569c62016-01-08 02:54:301295 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443);
1296
rch9ae5b3b2016-02-11 00:36:291297 // Uses the existing QUIC session when making request to www.example.org.
zhongyi32569c62016-01-08 02:54:301298 request_.url = GURL("https://mail.example.org/");
1299 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443);
1300}
1301
1302// Multiple origins have listed the same alternative services. When there's a
1303// existing QUIC session opened by a request to other origin,
1304// if the cert is NOT valid, should ignore this QUIC session.
1305TEST_P(QuicNetworkTransactionTest,
1306 DoNotUseSharedExistingAlternativeServiceForQuicWithInvalidCert) {
rch9ae5b3b2016-02-11 00:36:291307 // Default cert is valid *.example.org
1308 // NOT valid for mail.example.com.
zhongyi32569c62016-01-08 02:54:301309
rch9ae5b3b2016-02-11 00:36:291310 // HTTP data for request to mail.example.org.
zhongyi32569c62016-01-08 02:54:301311 MockRead http_reads[] = {
1312 MockRead("HTTP/1.1 200 OK\r\n"),
1313 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"),
rch9ae5b3b2016-02-11 00:36:291314 MockRead("hello world from mail.example.org"),
zhongyi32569c62016-01-08 02:54:301315 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1316 MockRead(ASYNC, OK)};
1317
1318 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1319 0);
1320 socket_factory_.AddSocketDataProvider(&http_data);
1321 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1322
rch9ae5b3b2016-02-11 00:36:291323 // HTTP data for request to mail.example.com.
zhongyi32569c62016-01-08 02:54:301324 MockRead http_reads2[] = {
1325 MockRead("HTTP/1.1 200 OK\r\n"),
rch9ae5b3b2016-02-11 00:36:291326 MockRead("Alt-Svc: quic=\":444\", quic=\"mail.example.org:443\"\r\n\r\n"),
1327 MockRead("hello world from mail.example.com"),
zhongyi32569c62016-01-08 02:54:301328 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1329 MockRead(ASYNC, OK)};
1330
1331 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2),
1332 nullptr, 0);
1333 socket_factory_.AddSocketDataProvider(&http_data2);
1334 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1335
rch9ae5b3b2016-02-11 00:36:291336 QuicTestPacketMaker maker(GetParam(), 0, clock_, "mail.example.org");
1337 maker.set_hostname("mail.example.com");
zhongyi32569c62016-01-08 02:54:301338 MockQuicData mock_quic_data;
1339 MockQuicData mock_quic_data2;
1340
1341 // Adding a valid cert for *.example.org but not mail.example.com.
1342 ProofVerifyDetailsChromium verify_details;
1343 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:291344 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
zhongyi32569c62016-01-08 02:54:301345 verify_details.cert_verify_result.verified_cert = cert;
1346 verify_details.cert_verify_result.is_issued_by_known_root = true;
1347 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1348
1349 // First QUIC request data.
1350 mock_quic_data.AddWrite(
1351 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1352 GetRequestHeaders("GET", "https", "/")));
1353 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1354 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1355 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
1356 true, 0, "hello from mail QUIC!"));
1357 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1358 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1359 mock_quic_data.AddRead(ASYNC, 0); // EOF
1360
1361 // First QUIC request data.
1362 mock_quic_data2.AddWrite(ConstructRequestHeadersPacket(
1363 1, kClientDataStreamId1, true, true,
1364 GetRequestHeaders("GET", "https", "/", maker), &maker));
1365 mock_quic_data2.AddRead(
1366 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
1367 GetResponseHeaders("200 OK"), &maker));
1368 mock_quic_data2.AddRead(ConstructDataPacket(
1369 2, kClientDataStreamId1, false, true, 0, "hello from docs QUIC!"));
1370 mock_quic_data2.AddWrite(ConstructAckPacket(2, 1, &maker));
1371 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1372 mock_quic_data2.AddRead(ASYNC, 0); // EOF
1373
1374 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1375 AddHangingNonAlternateProtocolSocketData();
1376
1377 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
1378 AddHangingNonAlternateProtocolSocketData();
1379
rch3f4b8452016-02-23 16:59:321380 CreateSession();
zhongyi32569c62016-01-08 02:54:301381
1382 // Send HTTP requests, responses set up the alt-svc lists for the origins.
rch9ae5b3b2016-02-11 00:36:291383 SendRequestAndExpectHttpResponse("hello world from mail.example.org");
zhongyi32569c62016-01-08 02:54:301384 request_.url = GURL("https://mail.example.com/");
rch9ae5b3b2016-02-11 00:36:291385 SendRequestAndExpectHttpResponse("hello world from mail.example.com");
1386
1387 // Open a QUIC session to mail.example.org:443 when making request
1388 // to mail.example.org.
1389 request_.url = GURL("https://mail.example.org/");
zhongyi32569c62016-01-08 02:54:301390 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443);
1391
rch9ae5b3b2016-02-11 00:36:291392 // Open another new QUIC session to mail.example.com:444.
1393 request_.url = GURL("https://mail.example.com/");
zhongyi32569c62016-01-08 02:54:301394 SendRequestAndExpectQuicResponseOnPort("hello from docs QUIC!", 444);
bncc958faa2015-07-31 18:14:521395}
1396
1397TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) {
bncc958faa2015-07-31 18:14:521398 MockRead http_reads[] = {
1399 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561400 MockRead(kQuicAlternativeServiceDifferentPortHeader),
bncc958faa2015-07-31 18:14:521401 MockRead("hello world"),
1402 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1403 MockRead(ASYNC, OK)};
1404
1405 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1406 0);
1407 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561408 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521409
1410 MockQuicData mock_quic_data;
1411 mock_quic_data.AddWrite(
1412 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561413 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521414 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1415 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1416 mock_quic_data.AddRead(
1417 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1418 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1419 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591420 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521421
1422 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1423
1424 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321425 CreateSession();
bncc958faa2015-07-31 18:14:521426
1427 SendRequestAndExpectHttpResponse("hello world");
1428 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
1429}
1430
1431TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) {
bncc958faa2015-07-31 18:14:521432 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561433 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1434 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521435 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1436 MockRead(ASYNC, OK)};
1437
1438 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1439 0);
1440 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561441 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521442
1443 MockQuicData mock_quic_data;
1444 mock_quic_data.AddWrite(
1445 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561446 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521447 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1448 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1449 mock_quic_data.AddRead(
1450 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1451 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1452 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1453 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:521454
1455 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1456
1457 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321458 CreateSession();
bncc958faa2015-07-31 18:14:521459
1460 AlternativeService alternative_service(QUIC,
1461 HostPortPair::FromURL(request_.url));
1462 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
1463 alternative_service);
1464 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1465 alternative_service));
1466
1467 SendRequestAndExpectHttpResponse("hello world");
1468 SendRequestAndExpectQuicResponse("hello!");
1469
mmenkee24011922015-12-17 22:12:591470 mock_quic_data.Resume();
bncc958faa2015-07-31 18:14:521471
1472 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1473 alternative_service));
1474}
1475
bncc958faa2015-07-31 18:14:521476TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) {
bncc958faa2015-07-31 18:14:521477 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561478 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
1479 MockRead("hello world"),
bncc958faa2015-07-31 18:14:521480 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1481 MockRead(ASYNC, OK)};
1482
1483 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1484 0);
1485 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561486 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:521487
1488 MockQuicData mock_quic_data;
1489 mock_quic_data.AddWrite(
1490 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561491 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:521492 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1493 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1494 mock_quic_data.AddRead(
1495 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1496 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1497 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
1498
1499 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1500
1501 AddHangingNonAlternateProtocolSocketData();
rch3f4b8452016-02-23 16:59:321502 CreateSession();
bncc958faa2015-07-31 18:14:521503
1504 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1505 SendRequestAndExpectHttpResponse("hello world");
1506}
1507
[email protected]1e960032013-12-20 19:00:201508TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
[email protected]aa9b14d2013-05-10 23:45:191509 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561510 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1511 MockRead("hello world"),
1512 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1513 MockRead(ASYNC, OK)};
[email protected]61a527782013-02-21 03:58:001514
rjshaded5ced072015-12-18 19:26:021515 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1516 0);
[email protected]aa9b14d2013-05-10 23:45:191517 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561518 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]61a527782013-02-21 03:58:001519
[email protected]1e960032013-12-20 19:00:201520 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031521 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051522 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561523 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021524 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1525 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031526 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051527 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031528 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501529 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591530 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]61a527782013-02-21 03:58:001531
rcha5399e02015-04-21 19:32:041532 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]61a527782013-02-21 03:58:001533
[email protected]aa9b14d2013-05-10 23:45:191534 // The non-alternate protocol job needs to hang in order to guarantee that
1535 // the alternate-protocol job will "win".
1536 AddHangingNonAlternateProtocolSocketData();
[email protected]61a527782013-02-21 03:58:001537
rch3f4b8452016-02-23 16:59:321538 params_.parse_alternative_services = false;
1539 params_.parse_alternative_services = false;
1540 CreateSession();
[email protected]61a527782013-02-21 03:58:001541
[email protected]aa9b14d2013-05-10 23:45:191542 SendRequestAndExpectHttpResponse("hello world");
1543 SendRequestAndExpectQuicResponse("hello!");
[email protected]61a527782013-02-21 03:58:001544}
1545
rchf47265dc2016-03-21 21:33:121546TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolWithProbabilityForQuic) {
1547 MockRead http_reads[] = {
1548 MockRead("HTTP/1.1 200 OK\r\n"),
1549 MockRead(kQuicAlternateProtocolWithProbabilityHeader),
1550 MockRead("hello world"),
1551 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1552 MockRead(ASYNC, OK)};
1553
1554 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1555 0);
1556 socket_factory_.AddSocketDataProvider(&http_data);
1557 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
1558
1559 MockQuicData mock_quic_data;
1560 mock_quic_data.AddWrite(
1561 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1562 GetRequestHeaders("GET", "https", "/")));
1563 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1564 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1565 mock_quic_data.AddRead(
1566 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1567 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1568 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1569 mock_quic_data.AddRead(ASYNC, 0); // EOF
1570
1571 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1572
1573 // The non-alternate protocol job needs to hang in order to guarantee that
1574 // the alternate-protocol job will "win".
1575 AddHangingNonAlternateProtocolSocketData();
1576
1577 params_.parse_alternative_services = false;
1578 params_.parse_alternative_services = false;
1579 CreateSession();
1580
1581 SendRequestAndExpectHttpResponse("hello world");
1582 SendRequestAndExpectQuicResponse("hello!");
1583}
1584
bnc62a44f022015-04-02 15:59:411585TEST_P(QuicNetworkTransactionTest, AlternateProtocolDifferentPort) {
1586 MockRead http_reads[] = {
1587 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561588 MockRead(kQuicAlternateProtocolDifferentPortHeader),
bnc62a44f022015-04-02 15:59:411589 MockRead("hello world"),
1590 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1591 MockRead(ASYNC, OK)};
1592
1593 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1594 0);
1595 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561596 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bnc62a44f022015-04-02 15:59:411597
1598 MockQuicData mock_quic_data;
1599 mock_quic_data.AddWrite(
1600 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561601 GetRequestHeaders("GET", "https", "/")));
bnc62a44f022015-04-02 15:59:411602 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1603 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1604 mock_quic_data.AddRead(
1605 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1606 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501607 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591608 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc62a44f022015-04-02 15:59:411609
rcha5399e02015-04-21 19:32:041610 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bnc62a44f022015-04-02 15:59:411611
1612 // The non-alternate protocol job needs to hang in order to guarantee that
1613 // the alternate-protocol job will "win".
1614 AddHangingNonAlternateProtocolSocketData();
1615
rch3f4b8452016-02-23 16:59:321616 params_.parse_alternative_services = false;
1617 CreateSession();
bnc62a44f022015-04-02 15:59:411618
1619 SendRequestAndExpectHttpResponse("hello world");
1620 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
1621}
1622
bncc958faa2015-07-31 18:14:521623TEST_P(QuicNetworkTransactionTest, ConfirmAlternateProtocol) {
bncae8db8402015-03-26 20:13:501624 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561625 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
bncae8db8402015-03-26 20:13:501626 MockRead("hello world"),
1627 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1628 MockRead(ASYNC, OK)};
1629
1630 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1631 0);
1632 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561633 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncae8db8402015-03-26 20:13:501634
1635 MockQuicData mock_quic_data;
1636 mock_quic_data.AddWrite(
1637 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561638 GetRequestHeaders("GET", "https", "/")));
bncae8db8402015-03-26 20:13:501639 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1640 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1641 mock_quic_data.AddRead(
1642 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1643 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501644 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1645 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncae8db8402015-03-26 20:13:501646
rcha5399e02015-04-21 19:32:041647 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bncae8db8402015-03-26 20:13:501648
1649 // The non-alternate protocol job needs to hang in order to guarantee that
1650 // the alternate-protocol job will "win".
1651 AddHangingNonAlternateProtocolSocketData();
1652
rch3f4b8452016-02-23 16:59:321653 params_.parse_alternative_services = false;
1654 CreateSession();
bncae8db8402015-03-26 20:13:501655
1656 AlternativeService alternative_service(QUIC,
1657 HostPortPair::FromURL(request_.url));
bnc6be245c12015-05-15 11:24:071658 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
bncae8db8402015-03-26 20:13:501659 alternative_service);
bnc6be245c12015-05-15 11:24:071660 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1661 alternative_service));
bncae8db8402015-03-26 20:13:501662
1663 SendRequestAndExpectHttpResponse("hello world");
1664 SendRequestAndExpectQuicResponse("hello!");
1665
mmenkee24011922015-12-17 22:12:591666 mock_quic_data.Resume();
rchb27683c2015-07-29 23:53:501667
bnc6be245c12015-05-15 11:24:071668 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1669 alternative_service));
bncae8db8402015-03-26 20:13:501670}
1671
[email protected]1e960032013-12-20 19:00:201672TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) {
rch3f4b8452016-02-23 16:59:321673 params_.parse_alternative_services = false;
[email protected]6d1b4ed2013-07-10 03:57:541674 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561675 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1676 MockRead("hello world"),
1677 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1678 MockRead(ASYNC, OK)};
[email protected]6d1b4ed2013-07-10 03:57:541679
rjshaded5ced072015-12-18 19:26:021680 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1681 0);
[email protected]6d1b4ed2013-07-10 03:57:541682 socket_factory_.AddSocketDataProvider(&http_data);
1683
[email protected]1e960032013-12-20 19:00:201684 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031685 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051686 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561687 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021688 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1689 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031690 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051691 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031692 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501693 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591694 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]6d1b4ed2013-07-10 03:57:541695
rcha5399e02015-04-21 19:32:041696 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]6d1b4ed2013-07-10 03:57:541697
1698 // The non-alternate protocol job needs to hang in order to guarantee that
1699 // the alternate-protocol job will "win".
1700 AddHangingNonAlternateProtocolSocketData();
1701
rch3f4b8452016-02-23 16:59:321702 CreateSession();
[email protected]6d1b4ed2013-07-10 03:57:541703
1704 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1705 SendRequestAndExpectHttpResponse("hello world");
1706}
1707
bnccb7ff3c2015-05-21 20:51:551708class QuicAltSvcCertificateVerificationTest
1709 : public QuicNetworkTransactionTest {
1710 public:
1711 void Run(bool valid) {
rch9ae5b3b2016-02-11 00:36:291712 HostPortPair origin(valid ? "mail.example.org" : "mail.example.com", 443);
bnccb7ff3c2015-05-21 20:51:551713 HostPortPair alternative("www.example.org", 443);
1714 std::string url("https://");
1715 url.append(origin.host());
1716 url.append(":443");
1717 request_.url = GURL(url);
1718
1719 maker_.set_hostname(origin.host());
1720 MockQuicData mock_quic_data;
1721 mock_quic_data.AddWrite(
1722 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1723 GetRequestHeaders("GET", "https", "/")));
1724 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1725 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1726 mock_quic_data.AddRead(
1727 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1728 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591729 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
bnccb7ff3c2015-05-21 20:51:551730 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1731
1732 scoped_refptr<X509Certificate> cert(
rch9ae5b3b2016-02-11 00:36:291733 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bnccb7ff3c2015-05-21 20:51:551734 ASSERT_TRUE(cert.get());
1735 bool common_name_fallback_used;
1736 EXPECT_EQ(valid,
1737 cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
1738 EXPECT_TRUE(
1739 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
1740 ProofVerifyDetailsChromium verify_details;
1741 verify_details.cert_verify_result.verified_cert = cert;
1742 verify_details.cert_verify_result.is_issued_by_known_root = true;
1743 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1744 crypto_client_stream_factory_.set_handshake_mode(
1745 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1746
1747 // Connection to |origin| fails, so that success of |request| depends on
1748 // connection to |alternate| only.
1749 MockConnect refused_connect(ASYNC, ERR_CONNECTION_REFUSED);
1750 StaticSocketDataProvider refused_data;
1751 refused_data.set_connect_data(refused_connect);
1752 socket_factory_.AddSocketDataProvider(&refused_data);
1753
rch3f4b8452016-02-23 16:59:321754 CreateSession();
bnccb7ff3c2015-05-21 20:51:551755 AlternativeService alternative_service(QUIC, alternative);
bnc7dc7e1b42015-07-28 14:43:121756 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
bnccb7ff3c2015-05-21 20:51:551757 session_->http_server_properties()->SetAlternativeService(
rchdc7b9052016-03-17 20:51:501758 origin, alternative_service, expiration);
bnccb7ff3c2015-05-21 20:51:551759 scoped_ptr<HttpNetworkTransaction> trans(
1760 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1761 TestCompletionCallback callback;
1762 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1763 EXPECT_EQ(ERR_IO_PENDING, rv);
1764 rv = callback.WaitForResult();
1765 if (valid) {
1766 EXPECT_EQ(OK, rv);
1767 CheckWasQuicResponse(trans);
1768 CheckResponsePort(trans, 443);
1769 CheckResponseData(trans, "hello!");
1770 } else {
1771 EXPECT_EQ(ERR_CONNECTION_REFUSED, rv);
1772 }
1773 }
1774};
1775
1776INSTANTIATE_TEST_CASE_P(Version,
1777 QuicAltSvcCertificateVerificationTest,
1778 ::testing::ValuesIn(QuicSupportedVersions()));
1779
1780TEST_P(QuicAltSvcCertificateVerificationTest,
1781 RequestSucceedsWithValidCertificate) {
1782 Run(true);
1783}
1784
1785TEST_P(QuicAltSvcCertificateVerificationTest,
1786 RequestFailsWithInvalidCertificate) {
1787 Run(false);
1788}
1789
[email protected]1e960032013-12-20 19:00:201790TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) {
rch3f4b8452016-02-23 16:59:321791 params_.parse_alternative_services = false;
[email protected]dda75ab2013-06-22 22:43:301792 crypto_client_stream_factory_.set_handshake_mode(
1793 MockCryptoClientStream::COLD_START);
1794
1795 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561796 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
rch9ae5b3b2016-02-11 00:36:291797 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"),
rchf114d982015-10-21 01:34:561798 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")};
[email protected]dda75ab2013-06-22 22:43:301799
1800 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561801 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1802 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1803 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]dda75ab2013-06-22 22:43:301804
mmenke651bae7f2015-12-18 21:26:451805 MockClientSocketFactory socket_factory;
[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));
[email protected]dda75ab2013-06-22 22:43:301809 socket_factory.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561810 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));
[email protected]dda75ab2013-06-22 22:43:301819 socket_factory.AddSocketDataProvider(&quic_data);
1820
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));
[email protected]dda75ab2013-06-22 22:43:301824 socket_factory.AddSocketDataProvider(&http_data2);
rchf114d982015-10-21 01:34:561825 socket_factory.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301826
rch3f4b8452016-02-23 16:59:321827 CreateSessionWithFactory(&socket_factory);
[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
1967 scoped_ptr<HttpNetworkTransaction> trans(
1968 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
2013 scoped_ptr<HttpNetworkTransaction> trans(
2014 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
2068 scoped_ptr<HttpNetworkTransaction> trans(
2069 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
2086 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1));
2087 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);
2163 scoped_ptr<HttpNetworkTransaction> trans(
2164 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
2347 scoped_ptr<HttpNetworkTransaction> trans(
2348 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