blob: fb5d3b72ef2d2871cfe980ed2caa195f46349d87 [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/basictypes.h"
8#include "base/compiler_specific.h"
9#include "base/memory/scoped_ptr.h"
[email protected]98b20ce2013-05-10 05:55:2610#include "base/stl_util.h"
bnc8be55ebb2015-10-30 14:12:0711#include "base/strings/stringprintf.h"
tbansalfdf5665b2015-09-21 22:46:4012#include "net/base/network_quality_estimator.h"
13#include "net/base/socket_performance_watcher.h"
[email protected]61a527782013-02-21 03:58:0014#include "net/base/test_completion_callback.h"
bnc508835902015-05-12 20:10:2915#include "net/base/test_data_directory.h"
[email protected]6e7845ae2013-03-29 21:48:1116#include "net/cert/mock_cert_verifier.h"
rtenneti052774e2015-11-24 21:00:1217#include "net/cert/multi_log_ct_verifier.h"
[email protected]f2cb3cf2013-03-21 01:40:5318#include "net/dns/mock_host_resolver.h"
[email protected]61a527782013-02-21 03:58:0019#include "net/http/http_auth_handler_factory.h"
20#include "net/http/http_network_session.h"
21#include "net/http/http_network_transaction.h"
22#include "net/http/http_server_properties_impl.h"
23#include "net/http/http_stream.h"
24#include "net/http/http_stream_factory.h"
[email protected]c41737d2014-05-14 07:47:1925#include "net/http/http_transaction_test_util.h"
[email protected]b1c988b2013-06-13 06:48:1126#include "net/http/transport_security_state.h"
vishal.b62985ca92015-04-17 08:45:5127#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4628#include "net/log/test_net_log_entry.h"
29#include "net/log/test_net_log_util.h"
[email protected]61a527782013-02-21 03:58:0030#include "net/proxy/proxy_config_service_fixed.h"
31#include "net/proxy/proxy_resolver.h"
32#include "net/proxy/proxy_service.h"
bnc508835902015-05-12 20:10:2933#include "net/quic/crypto/proof_verifier_chromium.h"
[email protected]61a527782013-02-21 03:58:0034#include "net/quic/crypto/quic_decrypter.h"
35#include "net/quic/crypto/quic_encrypter.h"
36#include "net/quic/quic_framer.h"
[email protected]24e5bc52013-09-18 15:36:5837#include "net/quic/quic_http_utils.h"
[email protected]ed3fc15d2013-03-08 18:37:4438#include "net/quic/test_tools/crypto_test_utils.h"
[email protected]61a527782013-02-21 03:58:0039#include "net/quic/test_tools/mock_clock.h"
[email protected]e8ff26842013-03-22 21:02:0540#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
[email protected]61a527782013-02-21 03:58:0041#include "net/quic/test_tools/mock_random.h"
[email protected]1e960032013-12-20 19:00:2042#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]61a527782013-02-21 03:58:0043#include "net/quic/test_tools/quic_test_utils.h"
44#include "net/socket/client_socket_factory.h"
45#include "net/socket/mock_client_socket_pool_manager.h"
46#include "net/socket/socket_test_util.h"
47#include "net/socket/ssl_client_socket.h"
48#include "net/spdy/spdy_frame_builder.h"
49#include "net/spdy/spdy_framer.h"
[email protected]536fd0b2013-03-14 17:41:5750#include "net/ssl/ssl_config_service_defaults.h"
bnc508835902015-05-12 20:10:2951#include "net/test/cert_test_util.h"
[email protected]61a527782013-02-21 03:58:0052#include "testing/gtest/include/gtest/gtest.h"
53#include "testing/platform_test.h"
54
bnc508835902015-05-12 20:10:2955namespace net {
56namespace test {
[email protected]61a527782013-02-21 03:58:0057
58namespace {
59
rchf114d982015-10-21 01:34:5660static const char kQuicAlternateProtocolHeader[] =
[email protected]6d1b4ed2013-07-10 03:57:5461 "Alternate-Protocol: 443:quic\r\n\r\n";
rchf114d982015-10-21 01:34:5662static const char kQuicAlternateProtocol50pctHeader[] =
63 "Alternate-Protocol: 443:quic,p=.5\r\n\r\n";
64static const char kQuicAlternateProtocolDifferentPortHeader[] =
65 "Alternate-Protocol: 137:quic\r\n\r\n";
66static const char kQuicAlternativeServiceHeader[] =
bncc958faa2015-07-31 18:14:5267 "Alt-Svc: quic=\":443\"\r\n\r\n";
rchf114d982015-10-21 01:34:5668static const char kQuicAlternativeService50pctHeader[] =
69 "Alt-Svc: quic=\":443\";p=\".5\"\r\n\r\n";
70static const char kQuicAlternativeServiceDifferentPortHeader[] =
71 "Alt-Svc: quic=\":137\"\r\n\r\n";
[email protected]1e960032013-12-20 19:00:2072
rchf114d982015-10-21 01:34:5673const char kDefaultServerHostName[] = "mail.example.com";
bncb07c05532015-05-14 19:07:2074
[email protected]61a527782013-02-21 03:58:0075} // namespace
76
[email protected]1e960032013-12-20 19:00:2077// Helper class to encapsulate MockReads and MockWrites for QUIC.
78// Simplify ownership issues and the interaction with the MockSocketFactory.
79class MockQuicData {
80 public:
rtennetia004d332015-08-28 06:44:5781 MockQuicData() : packet_number_(0) {}
rcha5399e02015-04-21 19:32:0482
rjshaded5ced072015-12-18 19:26:0283 ~MockQuicData() { STLDeleteElements(&packets_); }
[email protected]1e960032013-12-20 19:00:2084
rcha5399e02015-04-21 19:32:0485 void AddSynchronousRead(scoped_ptr<QuicEncryptedPacket> packet) {
[email protected]1e960032013-12-20 19:00:2086 reads_.push_back(MockRead(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:5787 packet_number_++));
[email protected]1e960032013-12-20 19:00:2088 packets_.push_back(packet.release());
89 }
90
rcha5399e02015-04-21 19:32:0491 void AddRead(scoped_ptr<QuicEncryptedPacket> packet) {
92 reads_.push_back(
rtennetia004d332015-08-28 06:44:5793 MockRead(ASYNC, packet->data(), packet->length(), packet_number_++));
rcha5399e02015-04-21 19:32:0494 packets_.push_back(packet.release());
95 }
96
[email protected]1e960032013-12-20 19:00:2097 void AddRead(IoMode mode, int rv) {
rtennetia004d332015-08-28 06:44:5798 reads_.push_back(MockRead(mode, rv, packet_number_++));
[email protected]1e960032013-12-20 19:00:2099 }
100
101 void AddWrite(scoped_ptr<QuicEncryptedPacket> packet) {
102 writes_.push_back(MockWrite(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:57103 packet_number_++));
[email protected]1e960032013-12-20 19:00:20104 packets_.push_back(packet.release());
105 }
106
rcha5399e02015-04-21 19:32:04107 void AddSocketDataToFactory(MockClientSocketFactory* factory) {
rjshaded5ced072015-12-18 19:26:02108 MockRead* reads = reads_.empty() ? nullptr : &reads_[0];
109 MockWrite* writes = writes_.empty() ? nullptr : &writes_[0];
rcha5399e02015-04-21 19:32:04110 socket_data_.reset(
111 new SequencedSocketData(reads, reads_.size(), writes, writes_.size()));
[email protected]1e960032013-12-20 19:00:20112 factory->AddSocketDataProvider(socket_data_.get());
113 }
114
mmenkee24011922015-12-17 22:12:59115 void Resume() { socket_data_->Resume(); }
rchb27683c2015-07-29 23:53:50116
[email protected]1e960032013-12-20 19:00:20117 private:
118 std::vector<QuicEncryptedPacket*> packets_;
119 std::vector<MockWrite> writes_;
120 std::vector<MockRead> reads_;
rtennetia004d332015-08-28 06:44:57121 size_t packet_number_;
rchb27683c2015-07-29 23:53:50122 scoped_ptr<SequencedSocketData> socket_data_;
[email protected]1e960032013-12-20 19:00:20123};
124
tbansal7cec3812015-02-05 21:25:12125class ProxyHeadersHandler {
126 public:
127 ProxyHeadersHandler() : was_called_(false) {}
128
129 bool was_called() { return was_called_; }
130
131 void OnBeforeProxyHeadersSent(const ProxyInfo& proxy_info,
132 HttpRequestHeaders* request_headers) {
133 was_called_ = true;
134 }
135
136 private:
137 bool was_called_;
138};
139
tbansalfdf5665b2015-09-21 22:46:40140class TestNetworkQualityEstimator : public NetworkQualityEstimator {
141 public:
142 TestNetworkQualityEstimator()
143 : NetworkQualityEstimator(scoped_ptr<net::ExternalEstimateProvider>(),
tbansalc8a94ea2015-11-02 23:58:51144 std::map<std::string, std::string>()),
145 watcher_count_(0) {}
tbansalfdf5665b2015-09-21 22:46:40146
147 ~TestNetworkQualityEstimator() override {}
148
tbansalc8a94ea2015-11-02 23:58:51149 scoped_ptr<SocketPerformanceWatcher> CreateSocketPerformanceWatcher(
150 const Protocol protocol) override {
151 if (protocol != PROTOCOL_QUIC) {
152 NOTIMPLEMENTED();
153 }
154 ++watcher_count_;
155 return NetworkQualityEstimator::CreateSocketPerformanceWatcher(protocol);
tbansalfdf5665b2015-09-21 22:46:40156 }
157
tbansalc8a94ea2015-11-02 23:58:51158 size_t watcher_count() const { return watcher_count_; }
tbansalfdf5665b2015-09-21 22:46:40159
160 private:
tbansalc8a94ea2015-11-02 23:58:51161 size_t watcher_count_;
tbansalfdf5665b2015-09-21 22:46:40162 DISALLOW_COPY_AND_ASSIGN(TestNetworkQualityEstimator);
163};
164
tbansalc8a94ea2015-11-02 23:58:51165class TestRTTObserver : public NetworkQualityEstimator::RTTObserver {
166 public:
167 TestRTTObserver() : rtt_notification_received_(false) {}
168
169 bool rtt_notification_received() const { return rtt_notification_received_; }
170
171 // NetworkQualityEstimator::RttObserver implementation:
172 void OnRTTObservation(
173 int32_t rtt_ms,
174 const base::TimeTicks& timestamp,
175 net::NetworkQualityEstimator::ObservationSource source) override {
176 rtt_notification_received_ = true;
177 }
178
179 private:
180 bool rtt_notification_received_;
181};
182
[email protected]1e960032013-12-20 19:00:20183class QuicNetworkTransactionTest
184 : public PlatformTest,
[email protected]5d03bbd2014-03-07 16:19:16185 public ::testing::WithParamInterface<QuicVersion> {
[email protected]61a527782013-02-21 03:58:00186 protected:
[email protected]1c04f9522013-02-21 20:32:43187 QuicNetworkTransactionTest()
rtenneti4b06ae72014-08-26 03:43:43188 : clock_(new MockClock),
bncb07c05532015-05-14 19:07:20189 maker_(GetParam(), 0, clock_, kDefaultServerHostName),
rtenneti052774e2015-11-24 21:00:12190 cert_transparency_verifier_(new MultiLogCTVerifier()),
tbansalfdf5665b2015-09-21 22:46:40191 test_network_quality_estimator_(new TestNetworkQualityEstimator()),
[email protected]1c04f9522013-02-21 20:32:43192 ssl_config_service_(new SSLConfigServiceDefaults),
193 proxy_service_(ProxyService::CreateDirect()),
194 auth_handler_factory_(
[email protected]dda75ab2013-06-22 22:43:30195 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
[email protected]457d6952013-12-13 09:24:58196 random_generator_(0),
rchf114d982015-10-21 01:34:56197 hanging_data_(nullptr, 0, nullptr, 0),
198 ssl_data_(ASYNC, OK) {
[email protected]aa9b14d2013-05-10 23:45:19199 request_.method = "GET";
rchf114d982015-10-21 01:34:56200 std::string url("https://");
bncb07c05532015-05-14 19:07:20201 url.append(kDefaultServerHostName);
202 request_.url = GURL(url);
[email protected]aa9b14d2013-05-10 23:45:19203 request_.load_flags = 0;
[email protected]98a9d1252014-04-04 00:43:59204 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
rchf114d982015-10-21 01:34:56205
206 scoped_refptr<X509Certificate> cert(
207 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
208 verify_details_.cert_verify_result.verified_cert = cert;
209 verify_details_.cert_verify_result.is_issued_by_known_root = true;
210 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
[email protected]1c04f9522013-02-21 20:32:43211 }
[email protected]61a527782013-02-21 03:58:00212
dcheng67be2b1f2014-10-27 21:47:29213 void SetUp() override {
[email protected]61a527782013-02-21 03:58:00214 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34215 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00216 }
217
dcheng67be2b1f2014-10-27 21:47:29218 void TearDown() override {
[email protected]61a527782013-02-21 03:58:00219 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
220 // Empty the current queue.
[email protected]2da659e2013-05-23 20:51:34221 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00222 PlatformTest::TearDown();
223 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34224 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00225 }
226
[email protected]3316d422013-05-03 21:45:30227 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
rtennetia004d332015-08-28 06:44:57228 QuicPacketNumber num) {
[email protected]1e960032013-12-20 19:00:20229 return maker_.MakeConnectionClosePacket(num);
[email protected]3316d422013-05-03 21:45:30230 }
231
[email protected]61a527782013-02-21 03:58:00232 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket(
rtennetia004d332015-08-28 06:44:57233 QuicPacketNumber largest_received,
234 QuicPacketNumber least_unacked) {
[email protected]1e960032013-12-20 19:00:20235 return maker_.MakeAckPacket(2, largest_received, least_unacked, true);
236 }
[email protected]61a527782013-02-21 03:58:00237
zhongyica364fbb2015-12-12 03:39:12238 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket(
239 QuicPacketNumber num,
240 QuicTime::Delta delta_time_largest_observed,
241 QuicPacketNumber largest_received,
242 QuicPacketNumber least_unacked,
243 QuicErrorCode quic_error,
244 std::string& quic_error_details) {
245 return maker_.MakeAckAndConnectionClosePacket(
246 num, false, delta_time_largest_observed, largest_received,
247 least_unacked, quic_error, quic_error_details);
248 }
249
250 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket(
251 QuicPacketNumber num,
252 bool include_version,
253 QuicStreamId stream_id,
254 QuicRstStreamErrorCode error_code) {
255 return maker_.MakeRstPacket(num, include_version, stream_id, error_code);
256 }
257
[email protected]1e960032013-12-20 19:00:20258 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
259 const std::string& scheme,
260 const std::string& path) {
261 return maker_.GetRequestHeaders(method, scheme, path);
[email protected]61a527782013-02-21 03:58:00262 }
263
[email protected]1e960032013-12-20 19:00:20264 SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
265 return maker_.GetResponseHeaders(status);
[email protected]61a527782013-02-21 03:58:00266 }
267
[email protected]1e960032013-12-20 19:00:20268 scoped_ptr<QuicEncryptedPacket> ConstructDataPacket(
rtennetia004d332015-08-28 06:44:57269 QuicPacketNumber packet_number,
[email protected]98b20ce2013-05-10 05:55:26270 QuicStreamId stream_id,
[email protected]e8ff26842013-03-22 21:02:05271 bool should_include_version,
[email protected]61a527782013-02-21 03:58:00272 bool fin,
273 QuicStreamOffset offset,
274 base::StringPiece data) {
rtennetia004d332015-08-28 06:44:57275 return maker_.MakeDataPacket(packet_number, stream_id,
276 should_include_version, fin, offset, data);
[email protected]61a527782013-02-21 03:58:00277 }
278
[email protected]1e960032013-12-20 19:00:20279 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
rtennetia004d332015-08-28 06:44:57280 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20281 QuicStreamId stream_id,
282 bool should_include_version,
283 bool fin,
284 const SpdyHeaderBlock& headers) {
ianswett0888cff2015-11-24 17:42:16285 SpdyPriority priority =
rtennetif4bdb542015-01-21 14:33:05286 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
rtennetia004d332015-08-28 06:44:57287 return maker_.MakeRequestHeadersPacket(packet_number, stream_id,
rtennetif4bdb542015-01-21 14:33:05288 should_include_version, fin,
289 priority, headers);
[email protected]61a527782013-02-21 03:58:00290 }
291
[email protected]1e960032013-12-20 19:00:20292 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
rtennetia004d332015-08-28 06:44:57293 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20294 QuicStreamId stream_id,
295 bool should_include_version,
296 bool fin,
297 const SpdyHeaderBlock& headers) {
298 return maker_.MakeResponseHeadersPacket(
rtennetia004d332015-08-28 06:44:57299 packet_number, stream_id, should_include_version, fin, headers);
[email protected]61a527782013-02-21 03:58:00300 }
301
rjshaded5ced072015-12-18 19:26:02302 void CreateSession() { CreateSessionWithFactory(&socket_factory_, false); }
[email protected]dda75ab2013-06-22 22:43:30303
[email protected]d7599122014-05-24 03:37:23304 void CreateSessionWithNextProtos() {
305 CreateSessionWithFactory(&socket_factory_, true);
306 }
307
308 // If |use_next_protos| is true, enables SPDY and QUIC.
309 void CreateSessionWithFactory(ClientSocketFactory* socket_factory,
310 bool use_next_protos) {
[email protected]4dca587c2013-03-07 16:54:47311 params_.enable_quic = true;
312 params_.quic_clock = clock_;
313 params_.quic_random = &random_generator_;
[email protected]dda75ab2013-06-22 22:43:30314 params_.client_socket_factory = socket_factory;
[email protected]e8ff26842013-03-22 21:02:05315 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43316 params_.host_resolver = &host_resolver_;
317 params_.cert_verifier = &cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11318 params_.transport_security_state = &transport_security_state_;
rtenneti052774e2015-11-24 21:00:12319 params_.cert_transparency_verifier = cert_transparency_verifier_.get();
tbansalfdf5665b2015-09-21 22:46:40320 params_.socket_performance_watcher_factory =
321 test_network_quality_estimator_.get();
[email protected]1c04f9522013-02-21 20:32:43322 params_.proxy_service = proxy_service_.get();
323 params_.ssl_config_service = ssl_config_service_.get();
324 params_.http_auth_handler_factory = auth_handler_factory_.get();
bnc6be245c12015-05-15 11:24:07325 params_.http_server_properties = http_server_properties_.GetWeakPtr();
[email protected]1e960032013-12-20 19:00:20326 params_.quic_supported_versions = SupportedVersions(GetParam());
[email protected]61a527782013-02-21 03:58:00327
tbansalc8a94ea2015-11-02 23:58:51328 test_network_quality_estimator_->AddRTTObserver(&rtt_observer_);
329
[email protected]d7599122014-05-24 03:37:23330 if (use_next_protos) {
bnc55ff9da2015-08-19 18:42:35331 params_.use_alternative_services = true;
bnc3bb2c232014-11-07 20:26:39332 params_.next_protos = NextProtosWithSpdyAndQuic(true, true);
[email protected]d7599122014-05-24 03:37:23333 }
334
mmenkee65e7af2015-10-13 17:16:42335 session_.reset(new HttpNetworkSession(params_));
[email protected]11c05872013-08-20 02:04:12336 session_->quic_stream_factory()->set_require_confirmation(false);
rch185ebee2015-07-14 23:56:22337 ASSERT_EQ(params_.quic_socket_receive_buffer_size,
338 session_->quic_stream_factory()->socket_receive_buffer_size());
[email protected]61a527782013-02-21 03:58:00339 }
340
[email protected]aa9b14d2013-05-10 23:45:19341 void CheckWasQuicResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
342 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42343 ASSERT_TRUE(response != nullptr);
344 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19345 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
346 EXPECT_TRUE(response->was_fetched_via_spdy);
347 EXPECT_TRUE(response->was_npn_negotiated);
348 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
349 response->connection_info);
350 }
351
bnc62a44f022015-04-02 15:59:41352 void CheckResponsePort(const scoped_ptr<HttpNetworkTransaction>& trans,
353 uint16 port) {
354 const HttpResponseInfo* response = trans->GetResponseInfo();
355 ASSERT_TRUE(response != nullptr);
356 EXPECT_EQ(port, response->socket_address.port());
357 }
358
[email protected]aa9b14d2013-05-10 23:45:19359 void CheckWasHttpResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
360 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42361 ASSERT_TRUE(response != nullptr);
362 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19363 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
364 EXPECT_FALSE(response->was_fetched_via_spdy);
365 EXPECT_FALSE(response->was_npn_negotiated);
366 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1,
367 response->connection_info);
368 }
369
bncffc2fdf2015-05-14 18:29:49370 void CheckResponseData(const scoped_ptr<HttpNetworkTransaction>& trans,
[email protected]aa9b14d2013-05-10 23:45:19371 const std::string& expected) {
372 std::string response_data;
bncffc2fdf2015-05-14 18:29:49373 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
[email protected]aa9b14d2013-05-10 23:45:19374 EXPECT_EQ(expected, response_data);
375 }
376
bncffc2fdf2015-05-14 18:29:49377 void RunTransaction(const scoped_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19378 TestCompletionCallback callback;
379 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
380 EXPECT_EQ(ERR_IO_PENDING, rv);
381 EXPECT_EQ(OK, callback.WaitForResult());
382 }
383
384 void SendRequestAndExpectHttpResponse(const std::string& expected) {
385 scoped_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50386 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
bncffc2fdf2015-05-14 18:29:49387 RunTransaction(trans);
[email protected]aa9b14d2013-05-10 23:45:19388 CheckWasHttpResponse(trans);
bncffc2fdf2015-05-14 18:29:49389 CheckResponseData(trans, expected);
[email protected]aa9b14d2013-05-10 23:45:19390 }
391
392 void SendRequestAndExpectQuicResponse(const std::string& expected) {
rchf114d982015-10-21 01:34:56393 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, 443);
tbansal7cec3812015-02-05 21:25:12394 }
395
bnc62a44f022015-04-02 15:59:41396 void SendRequestAndExpectQuicResponseOnPort(const std::string& expected,
397 uint16 port) {
398 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, port);
399 }
400
401 void SendRequestAndExpectQuicResponseFromProxyOnPort(
402 const std::string& expected,
403 uint16 port) {
404 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port);
[email protected]aa9b14d2013-05-10 23:45:19405 }
406
407 void AddQuicAlternateProtocolMapping(
408 MockCryptoClientStream::HandshakeMode handshake_mode) {
409 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
bnccacc0992015-03-20 20:22:22410 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url);
rchf114d982015-10-21 01:34:56411 AlternativeService alternative_service(QUIC, host_port_pair.host(), 443);
bnc7dc7e1b42015-07-28 14:43:12412 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
413 http_server_properties_.SetAlternativeService(
414 host_port_pair, alternative_service, 1.0, expiration);
[email protected]aa9b14d2013-05-10 23:45:19415 }
416
417 void ExpectBrokenAlternateProtocolMapping() {
bnc8445b3002015-03-13 01:57:09418 const HostPortPair origin = HostPortPair::FromURL(request_.url);
bncd9b132e2015-07-08 05:16:10419 const AlternativeServiceVector alternative_service_vector =
420 http_server_properties_.GetAlternativeServices(origin);
421 EXPECT_EQ(1u, alternative_service_vector.size());
bnc6be245c12015-05-15 11:24:07422 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken(
bncd9b132e2015-07-08 05:16:10423 alternative_service_vector[0]));
[email protected]aa9b14d2013-05-10 23:45:19424 }
425
[email protected]4d590c9c2014-05-02 05:14:33426 void ExpectQuicAlternateProtocolMapping() {
bncd9b132e2015-07-08 05:16:10427 const HostPortPair origin = HostPortPair::FromURL(request_.url);
428 const AlternativeServiceVector alternative_service_vector =
429 http_server_properties_.GetAlternativeServices(origin);
430 EXPECT_EQ(1u, alternative_service_vector.size());
431 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
[email protected]4d590c9c2014-05-02 05:14:33432 }
433
[email protected]aa9b14d2013-05-10 23:45:19434 void AddHangingNonAlternateProtocolSocketData() {
[email protected]dda75ab2013-06-22 22:43:30435 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
436 hanging_data_.set_connect_data(hanging_connect);
437 socket_factory_.AddSocketDataProvider(&hanging_data_);
rchf114d982015-10-21 01:34:56438 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]aa9b14d2013-05-10 23:45:19439 }
440
rtenneti4b06ae72014-08-26 03:43:43441 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
[email protected]1e960032013-12-20 19:00:20442 QuicTestPacketMaker maker_;
mmenkee65e7af2015-10-13 17:16:42443 scoped_ptr<HttpNetworkSession> session_;
[email protected]61a527782013-02-21 03:58:00444 MockClientSocketFactory socket_factory_;
rchf114d982015-10-21 01:34:56445 ProofVerifyDetailsChromium verify_details_;
[email protected]e8ff26842013-03-22 21:02:05446 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43447 MockHostResolver host_resolver_;
448 MockCertVerifier cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11449 TransportSecurityState transport_security_state_;
rtenneti052774e2015-11-24 21:00:12450 scoped_ptr<CTVerifier> cert_transparency_verifier_;
tbansalfdf5665b2015-09-21 22:46:40451 scoped_ptr<TestNetworkQualityEstimator> test_network_quality_estimator_;
tbansalc8a94ea2015-11-02 23:58:51452 TestRTTObserver rtt_observer_;
[email protected]1c04f9522013-02-21 20:32:43453 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
454 scoped_ptr<ProxyService> proxy_service_;
455 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
[email protected]61a527782013-02-21 03:58:00456 MockRandom random_generator_;
bnc6be245c12015-05-15 11:24:07457 HttpServerPropertiesImpl http_server_properties_;
[email protected]61a527782013-02-21 03:58:00458 HttpNetworkSession::Params params_;
[email protected]aa9b14d2013-05-10 23:45:19459 HttpRequestInfo request_;
vishal.b62985ca92015-04-17 08:45:51460 BoundTestNetLog net_log_;
[email protected]dda75ab2013-06-22 22:43:30461 StaticSocketDataProvider hanging_data_;
rchf114d982015-10-21 01:34:56462 SSLSocketDataProvider ssl_data_;
tbansal7cec3812015-02-05 21:25:12463
464 private:
465 void SendRequestAndExpectQuicResponseMaybeFromProxy(
466 const std::string& expected,
bnc62a44f022015-04-02 15:59:41467 bool used_proxy,
468 uint16 port) {
tbansal7cec3812015-02-05 21:25:12469 scoped_ptr<HttpNetworkTransaction> trans(
470 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
471 ProxyHeadersHandler proxy_headers_handler;
472 trans->SetBeforeProxyHeadersSentCallback(
473 base::Bind(&ProxyHeadersHandler::OnBeforeProxyHeadersSent,
474 base::Unretained(&proxy_headers_handler)));
bncffc2fdf2015-05-14 18:29:49475 RunTransaction(trans);
tbansal7cec3812015-02-05 21:25:12476 CheckWasQuicResponse(trans);
bnc62a44f022015-04-02 15:59:41477 CheckResponsePort(trans, port);
bncffc2fdf2015-05-14 18:29:49478 CheckResponseData(trans, expected);
tbansal7cec3812015-02-05 21:25:12479 EXPECT_EQ(used_proxy, proxy_headers_handler.was_called());
480 }
[email protected]61a527782013-02-21 03:58:00481};
482
rjshaded5ced072015-12-18 19:26:02483INSTANTIATE_TEST_CASE_P(Version,
484 QuicNetworkTransactionTest,
[email protected]1e960032013-12-20 19:00:20485 ::testing::ValuesIn(QuicSupportedVersions()));
486
487TEST_P(QuicNetworkTransactionTest, ForceQuic) {
[email protected]49e85332013-06-04 04:18:03488 params_.origin_to_force_quic_on =
rchf114d982015-10-21 01:34:56489 HostPortPair::FromString("mail.example.com:443");
[email protected]4dca587c2013-03-07 16:54:47490
[email protected]1e960032013-12-20 19:00:20491 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03492 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05493 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56494 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:02495 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
496 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:03497 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05498 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03499 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:59500 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
[email protected]4dca587c2013-03-07 16:54:47501
rcha5399e02015-04-21 19:32:04502 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4dca587c2013-03-07 16:54:47503
[email protected]aa9b14d2013-05-10 23:45:19504 // The non-alternate protocol job needs to hang in order to guarantee that
505 // the alternate-protocol job will "win".
506 AddHangingNonAlternateProtocolSocketData();
[email protected]4dca587c2013-03-07 16:54:47507
508 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47509
tbansalc8a94ea2015-11-02 23:58:51510 EXPECT_FALSE(rtt_observer_.rtt_notification_received());
[email protected]aa9b14d2013-05-10 23:45:19511 SendRequestAndExpectQuicResponse("hello!");
tbansalc8a94ea2015-11-02 23:58:51512 EXPECT_TRUE(rtt_observer_.rtt_notification_received());
[email protected]4dca587c2013-03-07 16:54:47513
[email protected]98b20ce2013-05-10 05:55:26514 // Check that the NetLog was filled reasonably.
mmenke43758e62015-05-04 21:09:46515 TestNetLogEntry::List entries;
[email protected]aa9b14d2013-05-10 23:45:19516 net_log_.GetEntries(&entries);
[email protected]98b20ce2013-05-10 05:55:26517 EXPECT_LT(0u, entries.size());
518
519 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29520 int pos = ExpectLogContainsSomewhere(
521 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
522 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26523 EXPECT_LT(0, pos);
524
rchfd527212015-08-25 00:41:26525 // ... and also a TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29526 pos = ExpectLogContainsSomewhere(
rchfd527212015-08-25 00:41:26527 entries, 0,
528 NetLog::TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED,
ttuttle859dc7a2015-04-23 19:42:29529 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26530 EXPECT_LT(0, pos);
531
rtennetia004d332015-08-28 06:44:57532 std::string packet_number;
533 ASSERT_TRUE(entries[pos].GetStringValue("packet_number", &packet_number));
534 EXPECT_EQ("1", packet_number);
[email protected]98b20ce2013-05-10 05:55:26535
rchfd527212015-08-25 00:41:26536 // ... and also a TYPE_QUIC_SESSION_PACKET_AUTHENTICATED.
537 pos = ExpectLogContainsSomewhere(
538 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_AUTHENTICATED,
539 NetLog::PHASE_NONE);
540 EXPECT_LT(0, pos);
541
[email protected]98b20ce2013-05-10 05:55:26542 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29543 pos = ExpectLogContainsSomewhere(
544 entries, 0, NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
545 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26546 EXPECT_LT(0, pos);
547
548 int log_stream_id;
549 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
[email protected]1e960032013-12-20 19:00:20550 EXPECT_EQ(3, log_stream_id);
[email protected]4dca587c2013-03-07 16:54:47551}
552
[email protected]cf3e3cd62014-02-05 16:16:16553TEST_P(QuicNetworkTransactionTest, QuicProxy) {
tbansaled0aecc2015-02-20 03:44:18554 params_.enable_quic_for_proxies = true;
rchf114d982015-10-21 01:34:56555 proxy_service_ =
556 ProxyService::CreateFixedFromPacResult("QUIC mail.example.com:70");
[email protected]cf3e3cd62014-02-05 16:16:16557
[email protected]cf3e3cd62014-02-05 16:16:16558 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03559 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05560 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03561 GetRequestHeaders("GET", "http", "/")));
rjshaded5ced072015-12-18 19:26:02562 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
563 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:03564 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05565 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03566 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50567 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59568 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]cf3e3cd62014-02-05 16:16:16569
rcha5399e02015-04-21 19:32:04570 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cf3e3cd62014-02-05 16:16:16571
tbansalc8a94ea2015-11-02 23:58:51572 EXPECT_FALSE(rtt_observer_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16573 // There is no need to set up an alternate protocol job, because
574 // no attempt will be made to speak to the proxy over TCP.
575
rchf114d982015-10-21 01:34:56576 request_.url = GURL("http://mail.example.com/");
[email protected]cf3e3cd62014-02-05 16:16:16577 CreateSession();
578
bnc62a44f022015-04-02 15:59:41579 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
tbansalc8a94ea2015-11-02 23:58:51580 EXPECT_TRUE(rtt_observer_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16581}
582
bnc313ba9c2015-06-11 15:42:31583// Regression test for https://crbug.com/492458. Test that for an HTTP
584// connection through a QUIC proxy, the certificate exhibited by the proxy is
585// checked against the proxy hostname, not the origin hostname.
586TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) {
587 const std::string origin_host = "news.example.com";
588 const std::string proxy_host = "www.example.org";
589
590 params_.enable_quic_for_proxies = true;
rdsmith82957ad2015-09-16 19:42:03591 proxy_service_ =
592 ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70");
bnc313ba9c2015-06-11 15:42:31593
594 maker_.set_hostname(origin_host);
595 MockQuicData mock_quic_data;
596 mock_quic_data.AddWrite(
597 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
598 GetRequestHeaders("GET", "http", "/")));
599 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
600 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
601 mock_quic_data.AddRead(
602 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
603 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50604 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59605 mock_quic_data.AddRead(ASYNC, 0);
bnc313ba9c2015-06-11 15:42:31606 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
607
608 scoped_refptr<X509Certificate> cert(
609 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
610 ASSERT_TRUE(cert.get());
611 // This certificate is valid for the proxy, but not for the origin.
612 bool common_name_fallback_used;
613 EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used));
614 EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used));
615 ProofVerifyDetailsChromium verify_details;
616 verify_details.cert_verify_result.verified_cert = cert;
617 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rchf114d982015-10-21 01:34:56618 ProofVerifyDetailsChromium verify_details2;
619 verify_details2.cert_verify_result.verified_cert = cert;
620 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
bnc313ba9c2015-06-11 15:42:31621
622 request_.url = GURL("http://" + origin_host);
623 AddHangingNonAlternateProtocolSocketData();
624 CreateSessionWithNextProtos();
625 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
626 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
627}
628
[email protected]1e960032013-12-20 19:00:20629TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
[email protected]49e85332013-06-04 04:18:03630 params_.origin_to_force_quic_on =
rchf114d982015-10-21 01:34:56631 HostPortPair::FromString("mail.example.com:443");
[email protected]cebe3282013-05-22 23:49:30632
tbansalfdf5665b2015-09-21 22:46:40633 MockQuicData mock_quic_data1;
634 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
[email protected]1e960032013-12-20 19:00:20635
tbansalfdf5665b2015-09-21 22:46:40636 MockQuicData mock_quic_data2;
637 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
638
639 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
640 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
[email protected]cebe3282013-05-22 23:49:30641
642 CreateSession();
643
tbansalc8a94ea2015-11-02 23:58:51644 EXPECT_EQ(0U, test_network_quality_estimator_->watcher_count());
tbansalfdf5665b2015-09-21 22:46:40645 for (size_t i = 0; i < 2; ++i) {
646 scoped_ptr<HttpNetworkTransaction> trans(
647 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
648 TestCompletionCallback callback;
649 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
650 EXPECT_EQ(ERR_IO_PENDING, rv);
651 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
tbansalc8a94ea2015-11-02 23:58:51652 EXPECT_EQ(1 + i, test_network_quality_estimator_->watcher_count());
tbansalfdf5665b2015-09-21 22:46:40653 }
[email protected]cebe3282013-05-22 23:49:30654}
655
tbansalc8a94ea2015-11-02 23:58:51656TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
657 // Attempt to "force" quic on 443, which will not be honored.
658 params_.origin_to_force_quic_on =
659 HostPortPair::FromString("www.google.com:443");
660
661 MockRead http_reads[] = {
662 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
663 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
664 MockRead(ASYNC, OK)};
665
666 StaticSocketDataProvider data(http_reads, arraysize(http_reads), nullptr, 0);
667 socket_factory_.AddSocketDataProvider(&data);
668 SSLSocketDataProvider ssl(ASYNC, OK);
669 socket_factory_.AddSSLSocketDataProvider(&ssl);
670
671 CreateSession();
672
673 SendRequestAndExpectHttpResponse("hello world");
674 EXPECT_EQ(0U, test_network_quality_estimator_->watcher_count());
675}
676
bncc958faa2015-07-31 18:14:52677TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52678 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56679 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
680 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52681 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
682 MockRead(ASYNC, OK)};
683
684 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
685 0);
686 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56687 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52688
689 MockQuicData mock_quic_data;
690 mock_quic_data.AddWrite(
691 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56692 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52693 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
694 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
695 mock_quic_data.AddRead(
696 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
697 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
698 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59699 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52700
701 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
702
703 AddHangingNonAlternateProtocolSocketData();
704 CreateSessionWithNextProtos();
705
706 SendRequestAndExpectHttpResponse("hello world");
707 SendRequestAndExpectQuicResponse("hello!");
708}
709
bnc8be55ebb2015-10-30 14:12:07710TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) {
711 std::string altsvc_header = base::StringPrintf(
712 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam());
713 MockRead http_reads[] = {
714 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
715 MockRead("hello world"),
716 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
717 MockRead(ASYNC, OK)};
718
719 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
720 0);
721 socket_factory_.AddSocketDataProvider(&http_data);
722 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
723
724 MockQuicData mock_quic_data;
725 mock_quic_data.AddWrite(
726 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
727 GetRequestHeaders("GET", "https", "/")));
728 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
729 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
730 mock_quic_data.AddRead(
731 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
732 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
733 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59734 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc8be55ebb2015-10-30 14:12:07735
736 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
737
738 AddHangingNonAlternateProtocolSocketData();
739 CreateSessionWithNextProtos();
740
741 SendRequestAndExpectHttpResponse("hello world");
742 SendRequestAndExpectQuicResponse("hello!");
743}
744
745TEST_P(QuicNetworkTransactionTest,
746 DoNotUseAlternativeServiceQuicUnsupportedVersion) {
747 std::string altsvc_header = base::StringPrintf(
748 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam() - 1);
749 MockRead http_reads[] = {
750 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
751 MockRead("hello world"),
752 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
753 MockRead(ASYNC, OK)};
754
755 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
756 0);
757 socket_factory_.AddSocketDataProvider(&http_data);
758 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
759 socket_factory_.AddSocketDataProvider(&http_data);
760 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
761
762 CreateSessionWithNextProtos();
763
764 SendRequestAndExpectHttpResponse("hello world");
765 SendRequestAndExpectHttpResponse("hello world");
766}
767
bncc958faa2015-07-31 18:14:52768// When multiple alternative services are advertised,
769// HttpStreamFactoryImpl::RequestStreamInternal() only passes the first one to
770// Job. This is what the following test verifies.
771// TODO(bnc): Update this test when multiple alternative services are handled
772// properly.
773TEST_P(QuicNetworkTransactionTest, UseFirstAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52774 MockRead http_reads[] = {
775 MockRead("HTTP/1.1 200 OK\r\n"),
776 MockRead("Alt-Svc: quic=\":443\", quic=\":1234\"\r\n\r\n"),
777 MockRead("hello world"),
778 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
779 MockRead(ASYNC, OK)};
780
781 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
782 0);
783 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56784 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52785
786 MockQuicData mock_quic_data;
787 mock_quic_data.AddWrite(
788 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56789 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52790 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
791 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
792 mock_quic_data.AddRead(
793 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
794 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
795 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59796 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52797
798 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
799
800 AddHangingNonAlternateProtocolSocketData();
801 CreateSessionWithNextProtos();
802
803 SendRequestAndExpectHttpResponse("hello world");
804 SendRequestAndExpectQuicResponseOnPort("hello!", 443);
805}
806
807TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) {
bncc958faa2015-07-31 18:14:52808 MockRead http_reads[] = {
809 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:56810 MockRead(kQuicAlternativeServiceDifferentPortHeader),
bncc958faa2015-07-31 18:14:52811 MockRead("hello world"),
812 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
813 MockRead(ASYNC, OK)};
814
815 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
816 0);
817 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56818 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52819
820 MockQuicData mock_quic_data;
821 mock_quic_data.AddWrite(
822 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56823 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52824 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
825 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
826 mock_quic_data.AddRead(
827 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
828 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
829 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59830 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52831
832 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
833
834 AddHangingNonAlternateProtocolSocketData();
835 CreateSessionWithNextProtos();
836
837 SendRequestAndExpectHttpResponse("hello world");
838 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
839}
840
841TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) {
bncc958faa2015-07-31 18:14:52842 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56843 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
844 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52845 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
846 MockRead(ASYNC, OK)};
847
848 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
849 0);
850 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56851 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52852
853 MockQuicData mock_quic_data;
854 mock_quic_data.AddWrite(
855 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56856 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52857 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
858 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
859 mock_quic_data.AddRead(
860 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
861 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
862 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
863 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52864
865 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
866
867 AddHangingNonAlternateProtocolSocketData();
868 CreateSessionWithNextProtos();
869
870 AlternativeService alternative_service(QUIC,
871 HostPortPair::FromURL(request_.url));
872 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
873 alternative_service);
874 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
875 alternative_service));
876
877 SendRequestAndExpectHttpResponse("hello world");
878 SendRequestAndExpectQuicResponse("hello!");
879
mmenkee24011922015-12-17 22:12:59880 mock_quic_data.Resume();
bncc958faa2015-07-31 18:14:52881
882 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
883 alternative_service));
884}
885
886TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceProbabilityForQuic) {
bncc958faa2015-07-31 18:14:52887 MockRead http_reads[] = {
888 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:56889 MockRead(kQuicAlternativeService50pctHeader), MockRead("hello world"),
bncc958faa2015-07-31 18:14:52890 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
891 MockRead(ASYNC, OK)};
892
893 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
894 0);
895 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56896 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52897
898 MockQuicData mock_quic_data;
899 mock_quic_data.AddWrite(
900 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56901 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52902 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
903 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
904 mock_quic_data.AddRead(
905 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
906 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
907 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59908 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52909
910 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
911
912 AddHangingNonAlternateProtocolSocketData();
913 params_.alternative_service_probability_threshold = 0.25;
914 CreateSessionWithNextProtos();
915
916 SendRequestAndExpectHttpResponse("hello world");
917 SendRequestAndExpectQuicResponse("hello!");
918}
919
920TEST_P(QuicNetworkTransactionTest,
921 DontUseAlternativeServiceProbabilityForQuic) {
bncc958faa2015-07-31 18:14:52922 MockRead http_reads[] = {
923 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:56924 MockRead(kQuicAlternativeService50pctHeader), MockRead("hello world"),
bncc958faa2015-07-31 18:14:52925 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
926 MockRead(ASYNC, OK)};
927
928 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
929 0);
930 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56931 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52932 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56933 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52934
935 params_.alternative_service_probability_threshold = 0.75;
936 CreateSessionWithNextProtos();
937
938 SendRequestAndExpectHttpResponse("hello world");
939 SendRequestAndExpectHttpResponse("hello world");
940}
941
bncc958faa2015-07-31 18:14:52942TEST_P(QuicNetworkTransactionTest,
943 DontUseAlternativeServiceWithBadProbabilityForQuic) {
bncc958faa2015-07-31 18:14:52944 MockRead http_reads[] = {
945 MockRead("HTTP/1.1 200 OK\r\n"),
946 MockRead("Alt-Svc: quic=\":443\";p=2\r\n\r\n"), MockRead("hello world"),
947 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
948 MockRead(ASYNC, OK)};
949
950 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
951 0);
952 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56953 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52954 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56955 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52956
957 params_.alternative_service_probability_threshold = 0.75;
958 CreateSessionWithNextProtos();
959
960 SendRequestAndExpectHttpResponse("hello world");
961 SendRequestAndExpectHttpResponse("hello world");
962}
963
964TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) {
bncc958faa2015-07-31 18:14:52965 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56966 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
967 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52968 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
969 MockRead(ASYNC, OK)};
970
971 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
972 0);
973 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56974 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52975
976 MockQuicData mock_quic_data;
977 mock_quic_data.AddWrite(
978 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56979 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52980 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
981 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
982 mock_quic_data.AddRead(
983 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
984 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
985 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
986
987 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
988
989 AddHangingNonAlternateProtocolSocketData();
990 CreateSessionWithNextProtos();
991
992 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
993 SendRequestAndExpectHttpResponse("hello world");
994}
995
[email protected]1e960032013-12-20 19:00:20996TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
[email protected]aa9b14d2013-05-10 23:45:19997 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56998 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
999 MockRead("hello world"),
1000 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1001 MockRead(ASYNC, OK)};
[email protected]61a527782013-02-21 03:58:001002
rjshaded5ced072015-12-18 19:26:021003 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1004 0);
[email protected]aa9b14d2013-05-10 23:45:191005 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561006 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]61a527782013-02-21 03:58:001007
[email protected]1e960032013-12-20 19:00:201008 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031009 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051010 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561011 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021012 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1013 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031014 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051015 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031016 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501017 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591018 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]61a527782013-02-21 03:58:001019
rcha5399e02015-04-21 19:32:041020 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]61a527782013-02-21 03:58:001021
[email protected]aa9b14d2013-05-10 23:45:191022 // The non-alternate protocol job needs to hang in order to guarantee that
1023 // the alternate-protocol job will "win".
1024 AddHangingNonAlternateProtocolSocketData();
[email protected]61a527782013-02-21 03:58:001025
[email protected]d7599122014-05-24 03:37:231026 CreateSessionWithNextProtos();
[email protected]61a527782013-02-21 03:58:001027
[email protected]aa9b14d2013-05-10 23:45:191028 SendRequestAndExpectHttpResponse("hello world");
1029 SendRequestAndExpectQuicResponse("hello!");
[email protected]61a527782013-02-21 03:58:001030}
1031
bnc62a44f022015-04-02 15:59:411032TEST_P(QuicNetworkTransactionTest, AlternateProtocolDifferentPort) {
1033 MockRead http_reads[] = {
1034 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561035 MockRead(kQuicAlternateProtocolDifferentPortHeader),
bnc62a44f022015-04-02 15:59:411036 MockRead("hello world"),
1037 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1038 MockRead(ASYNC, OK)};
1039
1040 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1041 0);
1042 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561043 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bnc62a44f022015-04-02 15:59:411044
1045 MockQuicData mock_quic_data;
1046 mock_quic_data.AddWrite(
1047 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561048 GetRequestHeaders("GET", "https", "/")));
bnc62a44f022015-04-02 15:59:411049 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1050 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1051 mock_quic_data.AddRead(
1052 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1053 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501054 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591055 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc62a44f022015-04-02 15:59:411056
rcha5399e02015-04-21 19:32:041057 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bnc62a44f022015-04-02 15:59:411058
1059 // The non-alternate protocol job needs to hang in order to guarantee that
1060 // the alternate-protocol job will "win".
1061 AddHangingNonAlternateProtocolSocketData();
1062
1063 CreateSessionWithNextProtos();
1064
1065 SendRequestAndExpectHttpResponse("hello world");
1066 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
1067}
1068
bncc958faa2015-07-31 18:14:521069TEST_P(QuicNetworkTransactionTest, ConfirmAlternateProtocol) {
bncae8db8402015-03-26 20:13:501070 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561071 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
bncae8db8402015-03-26 20:13:501072 MockRead("hello world"),
1073 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1074 MockRead(ASYNC, OK)};
1075
1076 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1077 0);
1078 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561079 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncae8db8402015-03-26 20:13:501080
1081 MockQuicData mock_quic_data;
1082 mock_quic_data.AddWrite(
1083 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561084 GetRequestHeaders("GET", "https", "/")));
bncae8db8402015-03-26 20:13:501085 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1086 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1087 mock_quic_data.AddRead(
1088 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1089 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501090 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1091 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncae8db8402015-03-26 20:13:501092
rcha5399e02015-04-21 19:32:041093 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bncae8db8402015-03-26 20:13:501094
1095 // The non-alternate protocol job needs to hang in order to guarantee that
1096 // the alternate-protocol job will "win".
1097 AddHangingNonAlternateProtocolSocketData();
1098
1099 CreateSessionWithNextProtos();
1100
1101 AlternativeService alternative_service(QUIC,
1102 HostPortPair::FromURL(request_.url));
bnc6be245c12015-05-15 11:24:071103 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
bncae8db8402015-03-26 20:13:501104 alternative_service);
bnc6be245c12015-05-15 11:24:071105 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1106 alternative_service));
bncae8db8402015-03-26 20:13:501107
1108 SendRequestAndExpectHttpResponse("hello world");
1109 SendRequestAndExpectQuicResponse("hello!");
1110
mmenkee24011922015-12-17 22:12:591111 mock_quic_data.Resume();
rchb27683c2015-07-29 23:53:501112
bnc6be245c12015-05-15 11:24:071113 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1114 alternative_service));
bncae8db8402015-03-26 20:13:501115}
1116
[email protected]287d9412014-07-08 23:01:001117TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolProbabilityForQuic) {
1118 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561119 MockRead("HTTP/1.1 200 OK\r\n"),
1120 MockRead(kQuicAlternateProtocol50pctHeader), MockRead("hello world"),
1121 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1122 MockRead(ASYNC, OK)};
[email protected]287d9412014-07-08 23:01:001123
rjshaded5ced072015-12-18 19:26:021124 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1125 0);
[email protected]287d9412014-07-08 23:01:001126 socket_factory_.AddSocketDataProvider(&http_data);
1127
1128 MockQuicData mock_quic_data;
1129 mock_quic_data.AddWrite(
1130 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561131 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021132 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1133 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]287d9412014-07-08 23:01:001134 mock_quic_data.AddRead(
1135 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1136 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501137 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591138 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]287d9412014-07-08 23:01:001139
rcha5399e02015-04-21 19:32:041140 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]287d9412014-07-08 23:01:001141
1142 // The non-alternate protocol job needs to hang in order to guarantee that
1143 // the alternate-protocol job will "win".
1144 AddHangingNonAlternateProtocolSocketData();
1145
bnc62891a52015-04-27 14:14:121146 params_.alternative_service_probability_threshold = .25;
[email protected]287d9412014-07-08 23:01:001147 CreateSessionWithNextProtos();
1148
1149 SendRequestAndExpectHttpResponse("hello world");
1150 SendRequestAndExpectQuicResponse("hello!");
1151}
1152
1153TEST_P(QuicNetworkTransactionTest, DontUseAlternateProtocolProbabilityForQuic) {
1154 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561155 MockRead("HTTP/1.1 200 OK\r\n"),
1156 MockRead(kQuicAlternateProtocol50pctHeader), MockRead("hello world"),
1157 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1158 MockRead(ASYNC, OK)};
[email protected]287d9412014-07-08 23:01:001159
rjshaded5ced072015-12-18 19:26:021160 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1161 0);
[email protected]287d9412014-07-08 23:01:001162 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561163 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001164 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561165 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001166
bnc62891a52015-04-27 14:14:121167 params_.alternative_service_probability_threshold = .75;
[email protected]287d9412014-07-08 23:01:001168 CreateSessionWithNextProtos();
1169
1170 SendRequestAndExpectHttpResponse("hello world");
1171 SendRequestAndExpectHttpResponse("hello world");
1172}
1173
1174TEST_P(QuicNetworkTransactionTest,
1175 DontUseAlternateProtocolWithBadProbabilityForQuic) {
1176 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021177 MockRead("HTTP/1.1 200 OK\r\n"),
1178 MockRead("Alternate-Protocol: 443:quic,p=2\r\n\r\n"),
1179 MockRead("hello world"),
1180 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1181 MockRead(ASYNC, OK)};
[email protected]287d9412014-07-08 23:01:001182
rjshaded5ced072015-12-18 19:26:021183 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1184 0);
[email protected]287d9412014-07-08 23:01:001185 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561186 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001187 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561188 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001189
bnc62891a52015-04-27 14:14:121190 params_.alternative_service_probability_threshold = .75;
[email protected]287d9412014-07-08 23:01:001191 CreateSessionWithNextProtos();
1192
1193 SendRequestAndExpectHttpResponse("hello world");
1194 SendRequestAndExpectHttpResponse("hello world");
1195}
1196
[email protected]1e960032013-12-20 19:00:201197TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) {
[email protected]6d1b4ed2013-07-10 03:57:541198 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561199 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1200 MockRead("hello world"),
1201 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1202 MockRead(ASYNC, OK)};
[email protected]6d1b4ed2013-07-10 03:57:541203
rjshaded5ced072015-12-18 19:26:021204 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1205 0);
[email protected]6d1b4ed2013-07-10 03:57:541206 socket_factory_.AddSocketDataProvider(&http_data);
1207
[email protected]1e960032013-12-20 19:00:201208 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031209 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051210 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561211 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021212 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1213 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031214 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051215 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031216 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501217 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591218 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]6d1b4ed2013-07-10 03:57:541219
rcha5399e02015-04-21 19:32:041220 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]6d1b4ed2013-07-10 03:57:541221
1222 // The non-alternate protocol job needs to hang in order to guarantee that
1223 // the alternate-protocol job will "win".
1224 AddHangingNonAlternateProtocolSocketData();
1225
[email protected]d7599122014-05-24 03:37:231226 CreateSessionWithNextProtos();
[email protected]6d1b4ed2013-07-10 03:57:541227
1228 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1229 SendRequestAndExpectHttpResponse("hello world");
1230}
1231
bnccb7ff3c2015-05-21 20:51:551232class QuicAltSvcCertificateVerificationTest
1233 : public QuicNetworkTransactionTest {
1234 public:
1235 void Run(bool valid) {
1236 HostPortPair origin(valid ? "mail.example.org" : "invalid.example.org",
1237 443);
1238 HostPortPair alternative("www.example.org", 443);
1239 std::string url("https://");
1240 url.append(origin.host());
1241 url.append(":443");
1242 request_.url = GURL(url);
1243
1244 maker_.set_hostname(origin.host());
1245 MockQuicData mock_quic_data;
1246 mock_quic_data.AddWrite(
1247 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1248 GetRequestHeaders("GET", "https", "/")));
1249 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1250 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1251 mock_quic_data.AddRead(
1252 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1253 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591254 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
bnccb7ff3c2015-05-21 20:51:551255 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1256
1257 scoped_refptr<X509Certificate> cert(
1258 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
1259 ASSERT_TRUE(cert.get());
1260 bool common_name_fallback_used;
1261 EXPECT_EQ(valid,
1262 cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
1263 EXPECT_TRUE(
1264 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
1265 ProofVerifyDetailsChromium verify_details;
1266 verify_details.cert_verify_result.verified_cert = cert;
1267 verify_details.cert_verify_result.is_issued_by_known_root = true;
1268 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1269 crypto_client_stream_factory_.set_handshake_mode(
1270 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1271
1272 // Connection to |origin| fails, so that success of |request| depends on
1273 // connection to |alternate| only.
1274 MockConnect refused_connect(ASYNC, ERR_CONNECTION_REFUSED);
1275 StaticSocketDataProvider refused_data;
1276 refused_data.set_connect_data(refused_connect);
1277 socket_factory_.AddSocketDataProvider(&refused_data);
1278
1279 CreateSessionWithNextProtos();
1280 AlternativeService alternative_service(QUIC, alternative);
bnc7dc7e1b42015-07-28 14:43:121281 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
bnccb7ff3c2015-05-21 20:51:551282 session_->http_server_properties()->SetAlternativeService(
bnc7dc7e1b42015-07-28 14:43:121283 origin, alternative_service, 1.0, expiration);
bnccb7ff3c2015-05-21 20:51:551284 scoped_ptr<HttpNetworkTransaction> trans(
1285 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1286 TestCompletionCallback callback;
1287 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1288 EXPECT_EQ(ERR_IO_PENDING, rv);
1289 rv = callback.WaitForResult();
1290 if (valid) {
1291 EXPECT_EQ(OK, rv);
1292 CheckWasQuicResponse(trans);
1293 CheckResponsePort(trans, 443);
1294 CheckResponseData(trans, "hello!");
1295 } else {
1296 EXPECT_EQ(ERR_CONNECTION_REFUSED, rv);
1297 }
1298 }
1299};
1300
1301INSTANTIATE_TEST_CASE_P(Version,
1302 QuicAltSvcCertificateVerificationTest,
1303 ::testing::ValuesIn(QuicSupportedVersions()));
1304
1305TEST_P(QuicAltSvcCertificateVerificationTest,
1306 RequestSucceedsWithValidCertificate) {
1307 Run(true);
1308}
1309
1310TEST_P(QuicAltSvcCertificateVerificationTest,
1311 RequestFailsWithInvalidCertificate) {
1312 Run(false);
1313}
1314
[email protected]1e960032013-12-20 19:00:201315TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) {
[email protected]dda75ab2013-06-22 22:43:301316 crypto_client_stream_factory_.set_handshake_mode(
1317 MockCryptoClientStream::COLD_START);
1318
1319 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561320 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
1321 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.com\r\n"),
1322 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")};
[email protected]dda75ab2013-06-22 22:43:301323
1324 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561325 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1326 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1327 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]dda75ab2013-06-22 22:43:301328
1329 DeterministicMockClientSocketFactory socket_factory;
1330
1331 DeterministicSocketData http_data(http_reads, arraysize(http_reads),
1332 http_writes, arraysize(http_writes));
1333 socket_factory.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561334 socket_factory.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301335
1336 // The QUIC transaction will not be allowed to complete.
mmenkee24011922015-12-17 22:12:591337 MockWrite quic_writes[] = {MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 0)};
[email protected]dda75ab2013-06-22 22:43:301338 MockRead quic_reads[] = {
mmenkee24011922015-12-17 22:12:591339 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 1),
[email protected]dda75ab2013-06-22 22:43:301340 };
1341 DeterministicSocketData quic_data(quic_reads, arraysize(quic_reads),
1342 quic_writes, arraysize(quic_writes));
1343 socket_factory.AddSocketDataProvider(&quic_data);
1344
1345 // The HTTP transaction will complete.
1346 DeterministicSocketData http_data2(http_reads, arraysize(http_reads),
1347 http_writes, arraysize(http_writes));
1348 socket_factory.AddSocketDataProvider(&http_data2);
rchf114d982015-10-21 01:34:561349 socket_factory.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301350
[email protected]d7599122014-05-24 03:37:231351 CreateSessionWithFactory(&socket_factory, true);
[email protected]dda75ab2013-06-22 22:43:301352
1353 // Run the first request.
1354 http_data.StopAfter(arraysize(http_reads) + arraysize(http_writes));
1355 SendRequestAndExpectHttpResponse("hello world");
rch37de576c2015-05-17 20:28:171356 ASSERT_TRUE(http_data.AllReadDataConsumed());
1357 ASSERT_TRUE(http_data.AllWriteDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301358
1359 // Now run the second request in which the QUIC socket hangs,
1360 // and verify the the transaction continues over HTTP.
1361 http_data2.StopAfter(arraysize(http_reads) + arraysize(http_writes));
1362 SendRequestAndExpectHttpResponse("hello world");
1363
rch37de576c2015-05-17 20:28:171364 ASSERT_TRUE(http_data2.AllReadDataConsumed());
1365 ASSERT_TRUE(http_data2.AllWriteDataConsumed());
1366 ASSERT_TRUE(!quic_data.AllReadDataConsumed());
1367 ASSERT_TRUE(!quic_data.AllWriteDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301368}
1369
[email protected]1e960032013-12-20 19:00:201370TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
[email protected]1e960032013-12-20 19:00:201371 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031372 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051373 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561374 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021375 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1376 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031377 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051378 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031379 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501380 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591381 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]8ba81212013-05-03 13:11:481382
rcha5399e02015-04-21 19:32:041383 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]8ba81212013-05-03 13:11:481384
[email protected]3a120a6b2013-06-25 01:08:271385 // The non-alternate protocol job needs to hang in order to guarantee that
1386 // the alternate-protocol job will "win".
[email protected]dda75ab2013-06-22 22:43:301387 AddHangingNonAlternateProtocolSocketData();
1388
[email protected]d7599122014-05-24 03:37:231389 CreateSessionWithNextProtos();
[email protected]aa9b14d2013-05-10 23:45:191390 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1391 SendRequestAndExpectQuicResponse("hello!");
[email protected]8ba81212013-05-03 13:11:481392}
1393
[email protected]1e960032013-12-20 19:00:201394TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
[email protected]1e960032013-12-20 19:00:201395 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031396 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051397 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561398 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021399 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1400 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031401 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051402 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031403 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501404 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591405 mock_quic_data.AddRead(ASYNC, 0); // EOF
rcha5399e02015-04-21 19:32:041406 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]3a120a6b2013-06-25 01:08:271407
1408 // In order for a new QUIC session to be established via alternate-protocol
1409 // without racing an HTTP connection, we need the host resolution to happen
1410 // synchronously.
1411 host_resolver_.set_synchronous_mode(true);
rchf114d982015-10-21 01:34:561412 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1413 "");
1414 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
[email protected]3a120a6b2013-06-25 01:08:271415 AddressList address;
rjshaded5ced072015-12-18 19:26:021416 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1417 nullptr, net_log_.bound());
[email protected]3a120a6b2013-06-25 01:08:271418
[email protected]d7599122014-05-24 03:37:231419 CreateSessionWithNextProtos();
[email protected]3a120a6b2013-06-25 01:08:271420 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1421 SendRequestAndExpectQuicResponse("hello!");
1422}
1423
[email protected]0fc924b2014-03-31 04:34:151424TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) {
rdsmith82957ad2015-09-16 19:42:031425 proxy_service_ = ProxyService::CreateFixedFromPacResult("PROXY myproxy:70");
[email protected]0fc924b2014-03-31 04:34:151426
1427 // Since we are using a proxy, the QUIC job will not succeed.
1428 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561429 MockWrite(SYNCHRONOUS, 0, "GET http://mail.example.com/ HTTP/1.1\r\n"),
1430 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.com\r\n"),
1431 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")};
[email protected]0fc924b2014-03-31 04:34:151432
1433 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561434 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1435 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1436 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]0fc924b2014-03-31 04:34:151437
1438 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
1439 http_writes, arraysize(http_writes));
1440 socket_factory_.AddSocketDataProvider(&http_data);
1441
1442 // In order for a new QUIC session to be established via alternate-protocol
1443 // without racing an HTTP connection, we need the host resolution to happen
1444 // synchronously.
1445 host_resolver_.set_synchronous_mode(true);
rchf114d982015-10-21 01:34:561446 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1447 "");
1448 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
[email protected]0fc924b2014-03-31 04:34:151449 AddressList address;
rjshaded5ced072015-12-18 19:26:021450 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1451 nullptr, net_log_.bound());
[email protected]0fc924b2014-03-31 04:34:151452
rchf114d982015-10-21 01:34:561453 request_.url = GURL("http://mail.example.com/");
[email protected]d7599122014-05-24 03:37:231454 CreateSessionWithNextProtos();
[email protected]0fc924b2014-03-31 04:34:151455 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1456 SendRequestAndExpectHttpResponse("hello world");
1457}
1458
[email protected]1e960032013-12-20 19:00:201459TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
[email protected]1e960032013-12-20 19:00:201460 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031461 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051462 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561463 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021464 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1465 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031466 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051467 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031468 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591469 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
rcha5399e02015-04-21 19:32:041470 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]11c05872013-08-20 02:04:121471
1472 // The non-alternate protocol job needs to hang in order to guarantee that
1473 // the alternate-protocol job will "win".
1474 AddHangingNonAlternateProtocolSocketData();
1475
1476 // In order for a new QUIC session to be established via alternate-protocol
1477 // without racing an HTTP connection, we need the host resolution to happen
1478 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1479 // connection to the the server, in this test we require confirmation
1480 // before encrypting so the HTTP job will still start.
1481 host_resolver_.set_synchronous_mode(true);
rchf114d982015-10-21 01:34:561482 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1483 "");
1484 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
[email protected]11c05872013-08-20 02:04:121485 AddressList address;
rjshaded5ced072015-12-18 19:26:021486 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1487 nullptr, net_log_.bound());
[email protected]11c05872013-08-20 02:04:121488
[email protected]d7599122014-05-24 03:37:231489 CreateSessionWithNextProtos();
[email protected]11c05872013-08-20 02:04:121490 session_->quic_stream_factory()->set_require_confirmation(true);
1491 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1492
1493 scoped_ptr<HttpNetworkTransaction> trans(
1494 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1495 TestCompletionCallback callback;
1496 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1497 EXPECT_EQ(ERR_IO_PENDING, rv);
1498
1499 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1500 QuicSession::HANDSHAKE_CONFIRMED);
1501 EXPECT_EQ(OK, callback.WaitForResult());
rchb27683c2015-07-29 23:53:501502
1503 CheckWasQuicResponse(trans);
1504 CheckResponseData(trans, "hello!");
[email protected]11c05872013-08-20 02:04:121505}
1506
zhongyica364fbb2015-12-12 03:39:121507TEST_P(QuicNetworkTransactionTest,
1508 LogGranularQuicErrorCodeOnQuicProtocolErrorLocal) {
1509 MockQuicData mock_quic_data;
1510 mock_quic_data.AddWrite(
1511 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1512 GetRequestHeaders("GET", "https", "/")));
1513 // Read a close connection packet with
1514 // QuicErrorCode: QUIC_CRYPTO_VERSION_NOT_SUPPORTED from the peer.
1515 mock_quic_data.AddRead(ConstructConnectionClosePacket(1));
1516 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1517
1518 // The non-alternate protocol job needs to hang in order to guarantee that
1519 // the alternate-protocol job will "win".
1520 AddHangingNonAlternateProtocolSocketData();
1521
1522 // In order for a new QUIC session to be established via alternate-protocol
1523 // without racing an HTTP connection, we need the host resolution to happen
1524 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1525 // connection to the the server, in this test we require confirmation
1526 // before encrypting so the HTTP job will still start.
1527 host_resolver_.set_synchronous_mode(true);
1528 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1529 "");
1530 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
1531 AddressList address;
1532 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1533 nullptr, net_log_.bound());
1534
1535 CreateSessionWithNextProtos();
1536 session_->quic_stream_factory()->set_require_confirmation(true);
1537 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1538
1539 scoped_ptr<HttpNetworkTransaction> trans(
1540 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1541 TestCompletionCallback callback;
1542 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1543 EXPECT_EQ(ERR_IO_PENDING, rv);
1544
1545 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1546 QuicSession::HANDSHAKE_CONFIRMED);
1547 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
1548
1549 NetErrorDetails details;
1550 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1551
1552 trans->PopulateNetErrorDetails(&details);
1553 // Verify the error code logged is what sent by the peer.
1554 EXPECT_EQ(QUIC_CRYPTO_VERSION_NOT_SUPPORTED, details.quic_connection_error);
1555}
1556
1557TEST_P(QuicNetworkTransactionTest,
1558 LogGranularQuicErrorCodeOnQuicProtocolErrorRemote) {
1559 MockQuicData mock_quic_data;
1560 mock_quic_data.AddWrite(
1561 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1562 GetRequestHeaders("GET", "https", "/")));
1563 // Peer sending an invalid stream frame with a invalid stream error causes
1564 // this end to raise error and close connection.
1565 mock_quic_data.AddRead(ConstructRstPacket(1, false, kClientDataStreamId1,
1566 QUIC_STREAM_LAST_ERROR));
1567 std::string quic_error_details = "Invalid rst stream error code.";
1568 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(
1569 2, QuicTime::Delta::Infinite(), 0, 1, QUIC_INVALID_RST_STREAM_DATA,
1570 quic_error_details));
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 // In order for a new QUIC session to be established via alternate-protocol
1578 // without racing an HTTP connection, we need the host resolution to happen
1579 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1580 // connection to the the server, in this test we require confirmation
1581 // before encrypting so the HTTP job will still start.
1582 host_resolver_.set_synchronous_mode(true);
1583 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1584 "");
1585 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
1586 AddressList address;
1587 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1588 nullptr, net_log_.bound());
1589
1590 CreateSessionWithNextProtos();
1591 session_->quic_stream_factory()->set_require_confirmation(true);
1592 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1593
1594 scoped_ptr<HttpNetworkTransaction> trans(
1595 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1596 TestCompletionCallback callback;
1597 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1598 EXPECT_EQ(ERR_IO_PENDING, rv);
1599
1600 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1601 QuicSession::HANDSHAKE_CONFIRMED);
1602 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
1603 NetErrorDetails details;
1604 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1605
1606 trans->PopulateNetErrorDetails(&details);
1607 EXPECT_EQ(QUIC_INVALID_RST_STREAM_DATA, details.quic_connection_error);
1608}
1609
[email protected]1e960032013-12-20 19:00:201610TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
[email protected]3316d422013-05-03 21:45:301611 // Alternate-protocol job
1612 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1));
1613 MockRead quic_reads[] = {
rchb27683c2015-07-29 23:53:501614 MockRead(ASYNC, close->data(), close->length()),
1615 MockRead(ASYNC, ERR_IO_PENDING), // No more data to read
1616 MockRead(ASYNC, OK), // EOF
[email protected]3316d422013-05-03 21:45:301617 };
rjshaded5ced072015-12-18 19:26:021618 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
1619 0);
[email protected]3316d422013-05-03 21:45:301620 socket_factory_.AddSocketDataProvider(&quic_data);
1621
1622 // Main job which will succeed even though the alternate job fails.
1623 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021624 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
1625 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1626 MockRead(ASYNC, OK)};
[email protected]3316d422013-05-03 21:45:301627
rjshaded5ced072015-12-18 19:26:021628 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1629 0);
[email protected]3316d422013-05-03 21:45:301630 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561631 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]3316d422013-05-03 21:45:301632
[email protected]d7599122014-05-24 03:37:231633 CreateSessionWithNextProtos();
[email protected]aa9b14d2013-05-10 23:45:191634 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1635 SendRequestAndExpectHttpResponse("hello from http");
1636 ExpectBrokenAlternateProtocolMapping();
[email protected]3316d422013-05-03 21:45:301637}
1638
[email protected]1e960032013-12-20 19:00:201639TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
[email protected]d03a66d2013-05-06 12:55:591640 // Alternate-protocol job
1641 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:021642 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]d03a66d2013-05-06 12:55:591643 };
rjshaded5ced072015-12-18 19:26:021644 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
1645 0);
[email protected]d03a66d2013-05-06 12:55:591646 socket_factory_.AddSocketDataProvider(&quic_data);
1647
1648 // Main job which will succeed even though the alternate job fails.
1649 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021650 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
1651 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1652 MockRead(ASYNC, OK)};
[email protected]d03a66d2013-05-06 12:55:591653
rjshaded5ced072015-12-18 19:26:021654 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1655 0);
[email protected]d03a66d2013-05-06 12:55:591656 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561657 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]d03a66d2013-05-06 12:55:591658
[email protected]d7599122014-05-24 03:37:231659 CreateSessionWithNextProtos();
[email protected]d03a66d2013-05-06 12:55:591660
[email protected]aa9b14d2013-05-10 23:45:191661 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1662 SendRequestAndExpectHttpResponse("hello from http");
1663 ExpectBrokenAlternateProtocolMapping();
[email protected]d03a66d2013-05-06 12:55:591664}
1665
[email protected]00c159f2014-05-21 22:38:161666TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) {
[email protected]eb71ab62014-05-23 07:57:531667 // Alternate-protocol job will fail when the session attempts to read.
[email protected]00c159f2014-05-21 22:38:161668 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:021669 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:161670 };
rjshaded5ced072015-12-18 19:26:021671 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
1672 0);
[email protected]00c159f2014-05-21 22:38:161673 socket_factory_.AddSocketDataProvider(&quic_data);
1674
[email protected]eb71ab62014-05-23 07:57:531675 // Main job will also fail.
[email protected]00c159f2014-05-21 22:38:161676 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021677 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:161678 };
1679
rjshaded5ced072015-12-18 19:26:021680 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1681 0);
[email protected]00c159f2014-05-21 22:38:161682 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED));
1683 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561684 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]00c159f2014-05-21 22:38:161685
[email protected]d7599122014-05-24 03:37:231686 CreateSessionWithNextProtos();
[email protected]00c159f2014-05-21 22:38:161687
1688 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1689 scoped_ptr<HttpNetworkTransaction> trans(
1690 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1691 TestCompletionCallback callback;
1692 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1693 EXPECT_EQ(ERR_IO_PENDING, rv);
1694 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult());
1695 ExpectQuicAlternateProtocolMapping();
1696}
1697
[email protected]1e960032013-12-20 19:00:201698TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
[email protected]77c6c162013-08-17 02:57:451699 // Alternate-protocol job
1700 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:021701 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]77c6c162013-08-17 02:57:451702 };
rjshaded5ced072015-12-18 19:26:021703 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
1704 0);
[email protected]77c6c162013-08-17 02:57:451705 socket_factory_.AddSocketDataProvider(&quic_data);
1706
1707 AddHangingNonAlternateProtocolSocketData();
1708
[email protected]c92c1b52014-05-31 04:16:061709 // Second Alternate-protocol job which will race with the TCP job.
1710 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421711 nullptr, 0);
[email protected]c92c1b52014-05-31 04:16:061712 socket_factory_.AddSocketDataProvider(&quic_data2);
1713
[email protected]4d283b32013-10-17 12:57:271714 // Final job that will proceed when the QUIC job fails.
1715 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021716 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
1717 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1718 MockRead(ASYNC, OK)};
[email protected]4d283b32013-10-17 12:57:271719
rjshaded5ced072015-12-18 19:26:021720 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1721 0);
[email protected]4d283b32013-10-17 12:57:271722 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561723 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d283b32013-10-17 12:57:271724
[email protected]d7599122014-05-24 03:37:231725 CreateSessionWithNextProtos();
[email protected]77c6c162013-08-17 02:57:451726
1727 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1728
[email protected]4d283b32013-10-17 12:57:271729 SendRequestAndExpectHttpResponse("hello from http");
[email protected]77c6c162013-08-17 02:57:451730
1731 ExpectBrokenAlternateProtocolMapping();
[email protected]4d283b32013-10-17 12:57:271732
rch37de576c2015-05-17 20:28:171733 EXPECT_TRUE(quic_data.AllReadDataConsumed());
1734 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
[email protected]77c6c162013-08-17 02:57:451735}
1736
[email protected]93b31772014-06-19 08:03:351737TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) {
[email protected]65768442014-06-06 23:37:031738 // Alternate-protocol job
1739 MockRead quic_reads[] = {
mmenkee24011922015-12-17 22:12:591740 MockRead(SYNCHRONOUS, ERR_IO_PENDING),
[email protected]65768442014-06-06 23:37:031741 };
rjshaded5ced072015-12-18 19:26:021742 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
1743 0);
[email protected]65768442014-06-06 23:37:031744 socket_factory_.AddSocketDataProvider(&quic_data);
1745
1746 // Main job that will proceed when the QUIC job fails.
1747 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021748 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
1749 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1750 MockRead(ASYNC, OK)};
[email protected]65768442014-06-06 23:37:031751
rjshaded5ced072015-12-18 19:26:021752 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1753 0);
[email protected]65768442014-06-06 23:37:031754 socket_factory_.AddSocketDataProvider(&http_data);
1755
1756 CreateSessionWithNextProtos();
1757
1758 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1759
1760 SendRequestAndExpectHttpResponse("hello from http");
1761}
1762
[email protected]eb71ab62014-05-23 07:57:531763TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
[email protected]4d590c9c2014-05-02 05:14:331764 // Alternate-protocol job will fail before creating a QUIC session.
rtennetibe635732014-10-02 22:51:421765 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0);
rjshaded5ced072015-12-18 19:26:021766 quic_data.set_connect_data(
1767 MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED));
[email protected]4d590c9c2014-05-02 05:14:331768 socket_factory_.AddSocketDataProvider(&quic_data);
1769
1770 // Main job which will succeed even though the alternate job fails.
1771 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021772 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
1773 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1774 MockRead(ASYNC, OK)};
[email protected]4d590c9c2014-05-02 05:14:331775
rjshaded5ced072015-12-18 19:26:021776 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1777 0);
[email protected]4d590c9c2014-05-02 05:14:331778 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561779 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d590c9c2014-05-02 05:14:331780
[email protected]d7599122014-05-24 03:37:231781 CreateSessionWithNextProtos();
[email protected]4d590c9c2014-05-02 05:14:331782 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1783 SendRequestAndExpectHttpResponse("hello from http");
[email protected]eb71ab62014-05-23 07:57:531784
1785 ExpectBrokenAlternateProtocolMapping();
[email protected]4d590c9c2014-05-02 05:14:331786}
1787
[email protected]4fee9672014-01-08 14:47:151788TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
[email protected]4fee9672014-01-08 14:47:151789 MockQuicData mock_quic_data;
rcha5399e02015-04-21 19:32:041790 mock_quic_data.AddSynchronousRead(ConstructConnectionClosePacket(1));
[email protected]92bf17c2014-03-03 21:14:031791 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051792 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561793 GetRequestHeaders("GET", "https", "/")));
[email protected]92bf17c2014-03-03 21:14:031794 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rcha5399e02015-04-21 19:32:041795 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4fee9672014-01-08 14:47:151796
1797 // When the QUIC connection fails, we will try the request again over HTTP.
1798 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561799 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1800 MockRead("hello world"),
1801 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1802 MockRead(ASYNC, OK)};
[email protected]4fee9672014-01-08 14:47:151803
rjshaded5ced072015-12-18 19:26:021804 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1805 0);
[email protected]4fee9672014-01-08 14:47:151806 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561807 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4fee9672014-01-08 14:47:151808
1809 // In order for a new QUIC session to be established via alternate-protocol
1810 // without racing an HTTP connection, we need the host resolution to happen
1811 // synchronously.
1812 host_resolver_.set_synchronous_mode(true);
rchf114d982015-10-21 01:34:561813 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1814 "");
1815 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
[email protected]4fee9672014-01-08 14:47:151816 AddressList address;
rjshaded5ced072015-12-18 19:26:021817 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1818 nullptr, net_log_.bound());
[email protected]4fee9672014-01-08 14:47:151819
[email protected]d7599122014-05-24 03:37:231820 CreateSessionWithNextProtos();
[email protected]4fee9672014-01-08 14:47:151821 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1822 SendRequestAndExpectHttpResponse("hello world");
1823}
1824
bnc508835902015-05-12 20:10:291825TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) {
bncb07c05532015-05-14 19:07:201826 maker_.set_hostname("www.example.org");
tbansalc8a94ea2015-11-02 23:58:511827 EXPECT_FALSE(rtt_observer_.rtt_notification_received());
bnc508835902015-05-12 20:10:291828 MockQuicData mock_quic_data;
1829 mock_quic_data.AddWrite(
1830 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1831 GetRequestHeaders("GET", "https", "/")));
1832 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1833 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1834 mock_quic_data.AddRead(
1835 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1836 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501837 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
bnc508835902015-05-12 20:10:291838 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1839
bncb07c05532015-05-14 19:07:201840 request_.url = GURL("https://www.example.org:443");
bnc508835902015-05-12 20:10:291841 AddHangingNonAlternateProtocolSocketData();
1842 CreateSessionWithNextProtos();
1843 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
1844 SendRequestAndExpectQuicResponse("hello!");
tbansalc8a94ea2015-11-02 23:58:511845 EXPECT_TRUE(rtt_observer_.rtt_notification_received());
bnc508835902015-05-12 20:10:291846}
1847
[email protected]61a527782013-02-21 03:58:001848} // namespace test
1849} // namespace net