blob: 22ad48ccbbc3389d2b3ff8d069bf4118c9766906 [file] [log] [blame]
[email protected]61a527782013-02-21 03:58:001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]1e960032013-12-20 19:00:205#include <vector>
6
[email protected]61a527782013-02-21 03:58:007#include "base/compiler_specific.h"
Avi Drissman13fc8932015-12-20 04:40:468#include "base/macros.h"
[email protected]61a527782013-02-21 03:58:009#include "base/memory/scoped_ptr.h"
mmenke651bae7f2015-12-18 21:26:4510#include "base/run_loop.h"
[email protected]98b20ce2013-05-10 05:55:2611#include "base/stl_util.h"
bnc8be55ebb2015-10-30 14:12:0712#include "base/strings/stringprintf.h"
tbansalfdf5665b2015-09-21 22:46:4013#include "net/base/network_quality_estimator.h"
14#include "net/base/socket_performance_watcher.h"
[email protected]61a527782013-02-21 03:58:0015#include "net/base/test_completion_callback.h"
bnc508835902015-05-12 20:10:2916#include "net/base/test_data_directory.h"
[email protected]6e7845ae2013-03-29 21:48:1117#include "net/cert/mock_cert_verifier.h"
rtenneti052774e2015-11-24 21:00:1218#include "net/cert/multi_log_ct_verifier.h"
[email protected]f2cb3cf2013-03-21 01:40:5319#include "net/dns/mock_host_resolver.h"
[email protected]61a527782013-02-21 03:58:0020#include "net/http/http_auth_handler_factory.h"
21#include "net/http/http_network_session.h"
22#include "net/http/http_network_transaction.h"
23#include "net/http/http_server_properties_impl.h"
24#include "net/http/http_stream.h"
25#include "net/http/http_stream_factory.h"
[email protected]c41737d2014-05-14 07:47:1926#include "net/http/http_transaction_test_util.h"
[email protected]b1c988b2013-06-13 06:48:1127#include "net/http/transport_security_state.h"
vishal.b62985ca92015-04-17 08:45:5128#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4629#include "net/log/test_net_log_entry.h"
30#include "net/log/test_net_log_util.h"
[email protected]61a527782013-02-21 03:58:0031#include "net/proxy/proxy_config_service_fixed.h"
32#include "net/proxy/proxy_resolver.h"
33#include "net/proxy/proxy_service.h"
bnc508835902015-05-12 20:10:2934#include "net/quic/crypto/proof_verifier_chromium.h"
[email protected]61a527782013-02-21 03:58:0035#include "net/quic/crypto/quic_decrypter.h"
36#include "net/quic/crypto/quic_encrypter.h"
37#include "net/quic/quic_framer.h"
[email protected]24e5bc52013-09-18 15:36:5838#include "net/quic/quic_http_utils.h"
[email protected]ed3fc15d2013-03-08 18:37:4439#include "net/quic/test_tools/crypto_test_utils.h"
[email protected]61a527782013-02-21 03:58:0040#include "net/quic/test_tools/mock_clock.h"
[email protected]e8ff26842013-03-22 21:02:0541#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
[email protected]61a527782013-02-21 03:58:0042#include "net/quic/test_tools/mock_random.h"
[email protected]1e960032013-12-20 19:00:2043#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]61a527782013-02-21 03:58:0044#include "net/quic/test_tools/quic_test_utils.h"
45#include "net/socket/client_socket_factory.h"
46#include "net/socket/mock_client_socket_pool_manager.h"
47#include "net/socket/socket_test_util.h"
48#include "net/socket/ssl_client_socket.h"
49#include "net/spdy/spdy_frame_builder.h"
50#include "net/spdy/spdy_framer.h"
[email protected]536fd0b2013-03-14 17:41:5751#include "net/ssl/ssl_config_service_defaults.h"
bnc508835902015-05-12 20:10:2952#include "net/test/cert_test_util.h"
[email protected]61a527782013-02-21 03:58:0053#include "testing/gtest/include/gtest/gtest.h"
54#include "testing/platform_test.h"
55
bnc508835902015-05-12 20:10:2956namespace net {
57namespace test {
[email protected]61a527782013-02-21 03:58:0058
59namespace {
60
rchf114d982015-10-21 01:34:5661static const char kQuicAlternateProtocolHeader[] =
[email protected]6d1b4ed2013-07-10 03:57:5462 "Alternate-Protocol: 443:quic\r\n\r\n";
rchf114d982015-10-21 01:34:5663static const char kQuicAlternateProtocol50pctHeader[] =
64 "Alternate-Protocol: 443:quic,p=.5\r\n\r\n";
65static const char kQuicAlternateProtocolDifferentPortHeader[] =
66 "Alternate-Protocol: 137:quic\r\n\r\n";
67static const char kQuicAlternativeServiceHeader[] =
bncc958faa2015-07-31 18:14:5268 "Alt-Svc: quic=\":443\"\r\n\r\n";
rchf114d982015-10-21 01:34:5669static const char kQuicAlternativeService50pctHeader[] =
70 "Alt-Svc: quic=\":443\";p=\".5\"\r\n\r\n";
71static const char kQuicAlternativeServiceDifferentPortHeader[] =
72 "Alt-Svc: quic=\":137\"\r\n\r\n";
[email protected]1e960032013-12-20 19:00:2073
rchf114d982015-10-21 01:34:5674const char kDefaultServerHostName[] = "mail.example.com";
bncb07c05532015-05-14 19:07:2075
[email protected]61a527782013-02-21 03:58:0076} // namespace
77
[email protected]1e960032013-12-20 19:00:2078// Helper class to encapsulate MockReads and MockWrites for QUIC.
79// Simplify ownership issues and the interaction with the MockSocketFactory.
80class MockQuicData {
81 public:
rtennetia004d332015-08-28 06:44:5782 MockQuicData() : packet_number_(0) {}
rcha5399e02015-04-21 19:32:0483
rjshaded5ced072015-12-18 19:26:0284 ~MockQuicData() { STLDeleteElements(&packets_); }
[email protected]1e960032013-12-20 19:00:2085
rcha5399e02015-04-21 19:32:0486 void AddSynchronousRead(scoped_ptr<QuicEncryptedPacket> packet) {
[email protected]1e960032013-12-20 19:00:2087 reads_.push_back(MockRead(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:5788 packet_number_++));
[email protected]1e960032013-12-20 19:00:2089 packets_.push_back(packet.release());
90 }
91
rcha5399e02015-04-21 19:32:0492 void AddRead(scoped_ptr<QuicEncryptedPacket> packet) {
93 reads_.push_back(
rtennetia004d332015-08-28 06:44:5794 MockRead(ASYNC, packet->data(), packet->length(), packet_number_++));
rcha5399e02015-04-21 19:32:0495 packets_.push_back(packet.release());
96 }
97
[email protected]1e960032013-12-20 19:00:2098 void AddRead(IoMode mode, int rv) {
rtennetia004d332015-08-28 06:44:5799 reads_.push_back(MockRead(mode, rv, packet_number_++));
[email protected]1e960032013-12-20 19:00:20100 }
101
102 void AddWrite(scoped_ptr<QuicEncryptedPacket> packet) {
103 writes_.push_back(MockWrite(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:57104 packet_number_++));
[email protected]1e960032013-12-20 19:00:20105 packets_.push_back(packet.release());
106 }
107
rcha5399e02015-04-21 19:32:04108 void AddSocketDataToFactory(MockClientSocketFactory* factory) {
rjshaded5ced072015-12-18 19:26:02109 MockRead* reads = reads_.empty() ? nullptr : &reads_[0];
110 MockWrite* writes = writes_.empty() ? nullptr : &writes_[0];
rcha5399e02015-04-21 19:32:04111 socket_data_.reset(
112 new SequencedSocketData(reads, reads_.size(), writes, writes_.size()));
[email protected]1e960032013-12-20 19:00:20113 factory->AddSocketDataProvider(socket_data_.get());
114 }
115
mmenkee24011922015-12-17 22:12:59116 void Resume() { socket_data_->Resume(); }
rchb27683c2015-07-29 23:53:50117
[email protected]1e960032013-12-20 19:00:20118 private:
119 std::vector<QuicEncryptedPacket*> packets_;
120 std::vector<MockWrite> writes_;
121 std::vector<MockRead> reads_;
rtennetia004d332015-08-28 06:44:57122 size_t packet_number_;
rchb27683c2015-07-29 23:53:50123 scoped_ptr<SequencedSocketData> socket_data_;
[email protected]1e960032013-12-20 19:00:20124};
125
tbansal7cec3812015-02-05 21:25:12126class ProxyHeadersHandler {
127 public:
128 ProxyHeadersHandler() : was_called_(false) {}
129
130 bool was_called() { return was_called_; }
131
132 void OnBeforeProxyHeadersSent(const ProxyInfo& proxy_info,
133 HttpRequestHeaders* request_headers) {
134 was_called_ = true;
135 }
136
137 private:
138 bool was_called_;
139};
140
tbansalfdf5665b2015-09-21 22:46:40141class TestNetworkQualityEstimator : public NetworkQualityEstimator {
142 public:
143 TestNetworkQualityEstimator()
144 : NetworkQualityEstimator(scoped_ptr<net::ExternalEstimateProvider>(),
tbansalc8a94ea2015-11-02 23:58:51145 std::map<std::string, std::string>()),
146 watcher_count_(0) {}
tbansalfdf5665b2015-09-21 22:46:40147
148 ~TestNetworkQualityEstimator() override {}
149
tbansalc8a94ea2015-11-02 23:58:51150 scoped_ptr<SocketPerformanceWatcher> CreateSocketPerformanceWatcher(
151 const Protocol protocol) override {
152 if (protocol != PROTOCOL_QUIC) {
153 NOTIMPLEMENTED();
154 }
155 ++watcher_count_;
156 return NetworkQualityEstimator::CreateSocketPerformanceWatcher(protocol);
tbansalfdf5665b2015-09-21 22:46:40157 }
158
tbansalc8a94ea2015-11-02 23:58:51159 size_t watcher_count() const { return watcher_count_; }
tbansalfdf5665b2015-09-21 22:46:40160
161 private:
tbansalc8a94ea2015-11-02 23:58:51162 size_t watcher_count_;
tbansalfdf5665b2015-09-21 22:46:40163 DISALLOW_COPY_AND_ASSIGN(TestNetworkQualityEstimator);
164};
165
tbansalc8a94ea2015-11-02 23:58:51166class TestRTTObserver : public NetworkQualityEstimator::RTTObserver {
167 public:
168 TestRTTObserver() : rtt_notification_received_(false) {}
169
170 bool rtt_notification_received() const { return rtt_notification_received_; }
171
172 // NetworkQualityEstimator::RttObserver implementation:
173 void OnRTTObservation(
174 int32_t rtt_ms,
175 const base::TimeTicks& timestamp,
176 net::NetworkQualityEstimator::ObservationSource source) override {
177 rtt_notification_received_ = true;
178 }
179
180 private:
181 bool rtt_notification_received_;
182};
183
[email protected]1e960032013-12-20 19:00:20184class QuicNetworkTransactionTest
185 : public PlatformTest,
[email protected]5d03bbd2014-03-07 16:19:16186 public ::testing::WithParamInterface<QuicVersion> {
[email protected]61a527782013-02-21 03:58:00187 protected:
[email protected]1c04f9522013-02-21 20:32:43188 QuicNetworkTransactionTest()
rtenneti4b06ae72014-08-26 03:43:43189 : clock_(new MockClock),
bncb07c05532015-05-14 19:07:20190 maker_(GetParam(), 0, clock_, kDefaultServerHostName),
rtenneti052774e2015-11-24 21:00:12191 cert_transparency_verifier_(new MultiLogCTVerifier()),
tbansalfdf5665b2015-09-21 22:46:40192 test_network_quality_estimator_(new TestNetworkQualityEstimator()),
[email protected]1c04f9522013-02-21 20:32:43193 ssl_config_service_(new SSLConfigServiceDefaults),
194 proxy_service_(ProxyService::CreateDirect()),
195 auth_handler_factory_(
[email protected]dda75ab2013-06-22 22:43:30196 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
[email protected]457d6952013-12-13 09:24:58197 random_generator_(0),
rchf114d982015-10-21 01:34:56198 hanging_data_(nullptr, 0, nullptr, 0),
199 ssl_data_(ASYNC, OK) {
[email protected]aa9b14d2013-05-10 23:45:19200 request_.method = "GET";
rchf114d982015-10-21 01:34:56201 std::string url("https://");
bncb07c05532015-05-14 19:07:20202 url.append(kDefaultServerHostName);
203 request_.url = GURL(url);
[email protected]aa9b14d2013-05-10 23:45:19204 request_.load_flags = 0;
[email protected]98a9d1252014-04-04 00:43:59205 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
rchf114d982015-10-21 01:34:56206
207 scoped_refptr<X509Certificate> cert(
208 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
209 verify_details_.cert_verify_result.verified_cert = cert;
210 verify_details_.cert_verify_result.is_issued_by_known_root = true;
211 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
[email protected]1c04f9522013-02-21 20:32:43212 }
[email protected]61a527782013-02-21 03:58:00213
dcheng67be2b1f2014-10-27 21:47:29214 void SetUp() override {
[email protected]61a527782013-02-21 03:58:00215 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34216 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00217 }
218
dcheng67be2b1f2014-10-27 21:47:29219 void TearDown() override {
[email protected]61a527782013-02-21 03:58:00220 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
221 // Empty the current queue.
[email protected]2da659e2013-05-23 20:51:34222 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00223 PlatformTest::TearDown();
224 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34225 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00226 }
227
[email protected]3316d422013-05-03 21:45:30228 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
rtennetia004d332015-08-28 06:44:57229 QuicPacketNumber num) {
[email protected]1e960032013-12-20 19:00:20230 return maker_.MakeConnectionClosePacket(num);
[email protected]3316d422013-05-03 21:45:30231 }
232
[email protected]61a527782013-02-21 03:58:00233 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket(
rtennetia004d332015-08-28 06:44:57234 QuicPacketNumber largest_received,
235 QuicPacketNumber least_unacked) {
[email protected]1e960032013-12-20 19:00:20236 return maker_.MakeAckPacket(2, largest_received, least_unacked, true);
237 }
[email protected]61a527782013-02-21 03:58:00238
zhongyica364fbb2015-12-12 03:39:12239 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket(
240 QuicPacketNumber num,
241 QuicTime::Delta delta_time_largest_observed,
242 QuicPacketNumber largest_received,
243 QuicPacketNumber least_unacked,
244 QuicErrorCode quic_error,
245 std::string& quic_error_details) {
246 return maker_.MakeAckAndConnectionClosePacket(
247 num, false, delta_time_largest_observed, largest_received,
248 least_unacked, quic_error, quic_error_details);
249 }
250
251 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket(
252 QuicPacketNumber num,
253 bool include_version,
254 QuicStreamId stream_id,
255 QuicRstStreamErrorCode error_code) {
256 return maker_.MakeRstPacket(num, include_version, stream_id, error_code);
257 }
258
[email protected]1e960032013-12-20 19:00:20259 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
260 const std::string& scheme,
261 const std::string& path) {
262 return maker_.GetRequestHeaders(method, scheme, path);
[email protected]61a527782013-02-21 03:58:00263 }
264
[email protected]1e960032013-12-20 19:00:20265 SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
266 return maker_.GetResponseHeaders(status);
[email protected]61a527782013-02-21 03:58:00267 }
268
[email protected]1e960032013-12-20 19:00:20269 scoped_ptr<QuicEncryptedPacket> ConstructDataPacket(
rtennetia004d332015-08-28 06:44:57270 QuicPacketNumber packet_number,
[email protected]98b20ce2013-05-10 05:55:26271 QuicStreamId stream_id,
[email protected]e8ff26842013-03-22 21:02:05272 bool should_include_version,
[email protected]61a527782013-02-21 03:58:00273 bool fin,
274 QuicStreamOffset offset,
275 base::StringPiece data) {
rtennetia004d332015-08-28 06:44:57276 return maker_.MakeDataPacket(packet_number, stream_id,
277 should_include_version, fin, offset, data);
[email protected]61a527782013-02-21 03:58:00278 }
279
[email protected]1e960032013-12-20 19:00:20280 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
rtennetia004d332015-08-28 06:44:57281 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20282 QuicStreamId stream_id,
283 bool should_include_version,
284 bool fin,
285 const SpdyHeaderBlock& headers) {
ianswett0888cff2015-11-24 17:42:16286 SpdyPriority priority =
rtennetif4bdb542015-01-21 14:33:05287 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
rtennetia004d332015-08-28 06:44:57288 return maker_.MakeRequestHeadersPacket(packet_number, stream_id,
rtennetif4bdb542015-01-21 14:33:05289 should_include_version, fin,
290 priority, headers);
[email protected]61a527782013-02-21 03:58:00291 }
292
[email protected]1e960032013-12-20 19:00:20293 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
rtennetia004d332015-08-28 06:44:57294 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20295 QuicStreamId stream_id,
296 bool should_include_version,
297 bool fin,
298 const SpdyHeaderBlock& headers) {
299 return maker_.MakeResponseHeadersPacket(
rtennetia004d332015-08-28 06:44:57300 packet_number, stream_id, should_include_version, fin, headers);
[email protected]61a527782013-02-21 03:58:00301 }
302
rjshaded5ced072015-12-18 19:26:02303 void CreateSession() { CreateSessionWithFactory(&socket_factory_, false); }
[email protected]dda75ab2013-06-22 22:43:30304
[email protected]d7599122014-05-24 03:37:23305 void CreateSessionWithNextProtos() {
306 CreateSessionWithFactory(&socket_factory_, true);
307 }
308
309 // If |use_next_protos| is true, enables SPDY and QUIC.
310 void CreateSessionWithFactory(ClientSocketFactory* socket_factory,
311 bool use_next_protos) {
[email protected]4dca587c2013-03-07 16:54:47312 params_.enable_quic = true;
313 params_.quic_clock = clock_;
314 params_.quic_random = &random_generator_;
[email protected]dda75ab2013-06-22 22:43:30315 params_.client_socket_factory = socket_factory;
[email protected]e8ff26842013-03-22 21:02:05316 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43317 params_.host_resolver = &host_resolver_;
318 params_.cert_verifier = &cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11319 params_.transport_security_state = &transport_security_state_;
rtenneti052774e2015-11-24 21:00:12320 params_.cert_transparency_verifier = cert_transparency_verifier_.get();
tbansalfdf5665b2015-09-21 22:46:40321 params_.socket_performance_watcher_factory =
322 test_network_quality_estimator_.get();
[email protected]1c04f9522013-02-21 20:32:43323 params_.proxy_service = proxy_service_.get();
324 params_.ssl_config_service = ssl_config_service_.get();
325 params_.http_auth_handler_factory = auth_handler_factory_.get();
bnc6be245c12015-05-15 11:24:07326 params_.http_server_properties = http_server_properties_.GetWeakPtr();
[email protected]1e960032013-12-20 19:00:20327 params_.quic_supported_versions = SupportedVersions(GetParam());
[email protected]61a527782013-02-21 03:58:00328
tbansalc8a94ea2015-11-02 23:58:51329 test_network_quality_estimator_->AddRTTObserver(&rtt_observer_);
330
[email protected]d7599122014-05-24 03:37:23331 if (use_next_protos) {
bnc55ff9da2015-08-19 18:42:35332 params_.use_alternative_services = true;
bnc3bb2c232014-11-07 20:26:39333 params_.next_protos = NextProtosWithSpdyAndQuic(true, true);
[email protected]d7599122014-05-24 03:37:23334 }
335
mmenkee65e7af2015-10-13 17:16:42336 session_.reset(new HttpNetworkSession(params_));
[email protected]11c05872013-08-20 02:04:12337 session_->quic_stream_factory()->set_require_confirmation(false);
rch185ebee2015-07-14 23:56:22338 ASSERT_EQ(params_.quic_socket_receive_buffer_size,
339 session_->quic_stream_factory()->socket_receive_buffer_size());
[email protected]61a527782013-02-21 03:58:00340 }
341
[email protected]aa9b14d2013-05-10 23:45:19342 void CheckWasQuicResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
343 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42344 ASSERT_TRUE(response != nullptr);
345 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19346 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
347 EXPECT_TRUE(response->was_fetched_via_spdy);
348 EXPECT_TRUE(response->was_npn_negotiated);
349 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
350 response->connection_info);
351 }
352
bnc62a44f022015-04-02 15:59:41353 void CheckResponsePort(const scoped_ptr<HttpNetworkTransaction>& trans,
Avi Drissman13fc8932015-12-20 04:40:46354 uint16_t port) {
bnc62a44f022015-04-02 15:59:41355 const HttpResponseInfo* response = trans->GetResponseInfo();
356 ASSERT_TRUE(response != nullptr);
357 EXPECT_EQ(port, response->socket_address.port());
358 }
359
[email protected]aa9b14d2013-05-10 23:45:19360 void CheckWasHttpResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
361 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42362 ASSERT_TRUE(response != nullptr);
363 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19364 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
365 EXPECT_FALSE(response->was_fetched_via_spdy);
366 EXPECT_FALSE(response->was_npn_negotiated);
367 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1,
368 response->connection_info);
369 }
370
bncffc2fdf2015-05-14 18:29:49371 void CheckResponseData(const scoped_ptr<HttpNetworkTransaction>& trans,
[email protected]aa9b14d2013-05-10 23:45:19372 const std::string& expected) {
373 std::string response_data;
bncffc2fdf2015-05-14 18:29:49374 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
[email protected]aa9b14d2013-05-10 23:45:19375 EXPECT_EQ(expected, response_data);
376 }
377
bncffc2fdf2015-05-14 18:29:49378 void RunTransaction(const scoped_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19379 TestCompletionCallback callback;
380 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
381 EXPECT_EQ(ERR_IO_PENDING, rv);
382 EXPECT_EQ(OK, callback.WaitForResult());
383 }
384
385 void SendRequestAndExpectHttpResponse(const std::string& expected) {
386 scoped_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50387 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
bncffc2fdf2015-05-14 18:29:49388 RunTransaction(trans);
[email protected]aa9b14d2013-05-10 23:45:19389 CheckWasHttpResponse(trans);
bncffc2fdf2015-05-14 18:29:49390 CheckResponseData(trans, expected);
[email protected]aa9b14d2013-05-10 23:45:19391 }
392
393 void SendRequestAndExpectQuicResponse(const std::string& expected) {
rchf114d982015-10-21 01:34:56394 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, 443);
tbansal7cec3812015-02-05 21:25:12395 }
396
bnc62a44f022015-04-02 15:59:41397 void SendRequestAndExpectQuicResponseOnPort(const std::string& expected,
Avi Drissman13fc8932015-12-20 04:40:46398 uint16_t port) {
bnc62a44f022015-04-02 15:59:41399 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, port);
400 }
401
402 void SendRequestAndExpectQuicResponseFromProxyOnPort(
403 const std::string& expected,
Avi Drissman13fc8932015-12-20 04:40:46404 uint16_t port) {
bnc62a44f022015-04-02 15:59:41405 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port);
[email protected]aa9b14d2013-05-10 23:45:19406 }
407
408 void AddQuicAlternateProtocolMapping(
409 MockCryptoClientStream::HandshakeMode handshake_mode) {
410 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
bnccacc0992015-03-20 20:22:22411 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url);
rchf114d982015-10-21 01:34:56412 AlternativeService alternative_service(QUIC, host_port_pair.host(), 443);
bnc7dc7e1b42015-07-28 14:43:12413 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
414 http_server_properties_.SetAlternativeService(
415 host_port_pair, alternative_service, 1.0, expiration);
[email protected]aa9b14d2013-05-10 23:45:19416 }
417
418 void ExpectBrokenAlternateProtocolMapping() {
bnc8445b3002015-03-13 01:57:09419 const HostPortPair origin = HostPortPair::FromURL(request_.url);
bncd9b132e2015-07-08 05:16:10420 const AlternativeServiceVector alternative_service_vector =
421 http_server_properties_.GetAlternativeServices(origin);
422 EXPECT_EQ(1u, alternative_service_vector.size());
bnc6be245c12015-05-15 11:24:07423 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken(
bncd9b132e2015-07-08 05:16:10424 alternative_service_vector[0]));
[email protected]aa9b14d2013-05-10 23:45:19425 }
426
[email protected]4d590c9c2014-05-02 05:14:33427 void ExpectQuicAlternateProtocolMapping() {
bncd9b132e2015-07-08 05:16:10428 const HostPortPair origin = HostPortPair::FromURL(request_.url);
429 const AlternativeServiceVector alternative_service_vector =
430 http_server_properties_.GetAlternativeServices(origin);
431 EXPECT_EQ(1u, alternative_service_vector.size());
432 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
[email protected]4d590c9c2014-05-02 05:14:33433 }
434
[email protected]aa9b14d2013-05-10 23:45:19435 void AddHangingNonAlternateProtocolSocketData() {
[email protected]dda75ab2013-06-22 22:43:30436 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
437 hanging_data_.set_connect_data(hanging_connect);
438 socket_factory_.AddSocketDataProvider(&hanging_data_);
rchf114d982015-10-21 01:34:56439 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]aa9b14d2013-05-10 23:45:19440 }
441
rtenneti4b06ae72014-08-26 03:43:43442 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
[email protected]1e960032013-12-20 19:00:20443 QuicTestPacketMaker maker_;
mmenkee65e7af2015-10-13 17:16:42444 scoped_ptr<HttpNetworkSession> session_;
[email protected]61a527782013-02-21 03:58:00445 MockClientSocketFactory socket_factory_;
rchf114d982015-10-21 01:34:56446 ProofVerifyDetailsChromium verify_details_;
[email protected]e8ff26842013-03-22 21:02:05447 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43448 MockHostResolver host_resolver_;
449 MockCertVerifier cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11450 TransportSecurityState transport_security_state_;
rtenneti052774e2015-11-24 21:00:12451 scoped_ptr<CTVerifier> cert_transparency_verifier_;
tbansalfdf5665b2015-09-21 22:46:40452 scoped_ptr<TestNetworkQualityEstimator> test_network_quality_estimator_;
tbansalc8a94ea2015-11-02 23:58:51453 TestRTTObserver rtt_observer_;
[email protected]1c04f9522013-02-21 20:32:43454 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
455 scoped_ptr<ProxyService> proxy_service_;
456 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
[email protected]61a527782013-02-21 03:58:00457 MockRandom random_generator_;
bnc6be245c12015-05-15 11:24:07458 HttpServerPropertiesImpl http_server_properties_;
[email protected]61a527782013-02-21 03:58:00459 HttpNetworkSession::Params params_;
[email protected]aa9b14d2013-05-10 23:45:19460 HttpRequestInfo request_;
vishal.b62985ca92015-04-17 08:45:51461 BoundTestNetLog net_log_;
[email protected]dda75ab2013-06-22 22:43:30462 StaticSocketDataProvider hanging_data_;
rchf114d982015-10-21 01:34:56463 SSLSocketDataProvider ssl_data_;
tbansal7cec3812015-02-05 21:25:12464
465 private:
466 void SendRequestAndExpectQuicResponseMaybeFromProxy(
467 const std::string& expected,
bnc62a44f022015-04-02 15:59:41468 bool used_proxy,
Avi Drissman13fc8932015-12-20 04:40:46469 uint16_t port) {
tbansal7cec3812015-02-05 21:25:12470 scoped_ptr<HttpNetworkTransaction> trans(
471 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
472 ProxyHeadersHandler proxy_headers_handler;
473 trans->SetBeforeProxyHeadersSentCallback(
474 base::Bind(&ProxyHeadersHandler::OnBeforeProxyHeadersSent,
475 base::Unretained(&proxy_headers_handler)));
bncffc2fdf2015-05-14 18:29:49476 RunTransaction(trans);
tbansal7cec3812015-02-05 21:25:12477 CheckWasQuicResponse(trans);
bnc62a44f022015-04-02 15:59:41478 CheckResponsePort(trans, port);
bncffc2fdf2015-05-14 18:29:49479 CheckResponseData(trans, expected);
tbansal7cec3812015-02-05 21:25:12480 EXPECT_EQ(used_proxy, proxy_headers_handler.was_called());
481 }
[email protected]61a527782013-02-21 03:58:00482};
483
rjshaded5ced072015-12-18 19:26:02484INSTANTIATE_TEST_CASE_P(Version,
485 QuicNetworkTransactionTest,
[email protected]1e960032013-12-20 19:00:20486 ::testing::ValuesIn(QuicSupportedVersions()));
487
488TEST_P(QuicNetworkTransactionTest, ForceQuic) {
[email protected]49e85332013-06-04 04:18:03489 params_.origin_to_force_quic_on =
rchf114d982015-10-21 01:34:56490 HostPortPair::FromString("mail.example.com:443");
[email protected]4dca587c2013-03-07 16:54:47491
[email protected]1e960032013-12-20 19:00:20492 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03493 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05494 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56495 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:02496 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
497 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:03498 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05499 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03500 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:59501 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
[email protected]4dca587c2013-03-07 16:54:47502
rcha5399e02015-04-21 19:32:04503 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4dca587c2013-03-07 16:54:47504
[email protected]aa9b14d2013-05-10 23:45:19505 // The non-alternate protocol job needs to hang in order to guarantee that
506 // the alternate-protocol job will "win".
507 AddHangingNonAlternateProtocolSocketData();
[email protected]4dca587c2013-03-07 16:54:47508
509 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47510
tbansalc8a94ea2015-11-02 23:58:51511 EXPECT_FALSE(rtt_observer_.rtt_notification_received());
[email protected]aa9b14d2013-05-10 23:45:19512 SendRequestAndExpectQuicResponse("hello!");
tbansalc8a94ea2015-11-02 23:58:51513 EXPECT_TRUE(rtt_observer_.rtt_notification_received());
[email protected]4dca587c2013-03-07 16:54:47514
[email protected]98b20ce2013-05-10 05:55:26515 // Check that the NetLog was filled reasonably.
mmenke43758e62015-05-04 21:09:46516 TestNetLogEntry::List entries;
[email protected]aa9b14d2013-05-10 23:45:19517 net_log_.GetEntries(&entries);
[email protected]98b20ce2013-05-10 05:55:26518 EXPECT_LT(0u, entries.size());
519
520 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29521 int pos = ExpectLogContainsSomewhere(
522 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
523 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26524 EXPECT_LT(0, pos);
525
rchfd527212015-08-25 00:41:26526 // ... and also a TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29527 pos = ExpectLogContainsSomewhere(
rchfd527212015-08-25 00:41:26528 entries, 0,
529 NetLog::TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED,
ttuttle859dc7a2015-04-23 19:42:29530 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26531 EXPECT_LT(0, pos);
532
rtennetia004d332015-08-28 06:44:57533 std::string packet_number;
534 ASSERT_TRUE(entries[pos].GetStringValue("packet_number", &packet_number));
535 EXPECT_EQ("1", packet_number);
[email protected]98b20ce2013-05-10 05:55:26536
rchfd527212015-08-25 00:41:26537 // ... and also a TYPE_QUIC_SESSION_PACKET_AUTHENTICATED.
538 pos = ExpectLogContainsSomewhere(
539 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_AUTHENTICATED,
540 NetLog::PHASE_NONE);
541 EXPECT_LT(0, pos);
542
[email protected]98b20ce2013-05-10 05:55:26543 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29544 pos = ExpectLogContainsSomewhere(
545 entries, 0, NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
546 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26547 EXPECT_LT(0, pos);
548
549 int log_stream_id;
550 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
[email protected]1e960032013-12-20 19:00:20551 EXPECT_EQ(3, log_stream_id);
[email protected]4dca587c2013-03-07 16:54:47552}
553
[email protected]cf3e3cd62014-02-05 16:16:16554TEST_P(QuicNetworkTransactionTest, QuicProxy) {
tbansaled0aecc2015-02-20 03:44:18555 params_.enable_quic_for_proxies = true;
rchf114d982015-10-21 01:34:56556 proxy_service_ =
557 ProxyService::CreateFixedFromPacResult("QUIC mail.example.com:70");
[email protected]cf3e3cd62014-02-05 16:16:16558
[email protected]cf3e3cd62014-02-05 16:16:16559 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03560 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05561 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03562 GetRequestHeaders("GET", "http", "/")));
rjshaded5ced072015-12-18 19:26:02563 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
564 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:03565 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05566 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03567 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50568 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59569 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]cf3e3cd62014-02-05 16:16:16570
rcha5399e02015-04-21 19:32:04571 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cf3e3cd62014-02-05 16:16:16572
tbansalc8a94ea2015-11-02 23:58:51573 EXPECT_FALSE(rtt_observer_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16574 // There is no need to set up an alternate protocol job, because
575 // no attempt will be made to speak to the proxy over TCP.
576
rchf114d982015-10-21 01:34:56577 request_.url = GURL("http://mail.example.com/");
[email protected]cf3e3cd62014-02-05 16:16:16578 CreateSession();
579
bnc62a44f022015-04-02 15:59:41580 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
tbansalc8a94ea2015-11-02 23:58:51581 EXPECT_TRUE(rtt_observer_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16582}
583
bnc313ba9c2015-06-11 15:42:31584// Regression test for https://crbug.com/492458. Test that for an HTTP
585// connection through a QUIC proxy, the certificate exhibited by the proxy is
586// checked against the proxy hostname, not the origin hostname.
587TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) {
588 const std::string origin_host = "news.example.com";
589 const std::string proxy_host = "www.example.org";
590
591 params_.enable_quic_for_proxies = true;
rdsmith82957ad2015-09-16 19:42:03592 proxy_service_ =
593 ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70");
bnc313ba9c2015-06-11 15:42:31594
595 maker_.set_hostname(origin_host);
596 MockQuicData mock_quic_data;
597 mock_quic_data.AddWrite(
598 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
599 GetRequestHeaders("GET", "http", "/")));
600 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
601 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
602 mock_quic_data.AddRead(
603 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
604 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50605 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59606 mock_quic_data.AddRead(ASYNC, 0);
bnc313ba9c2015-06-11 15:42:31607 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
608
609 scoped_refptr<X509Certificate> cert(
610 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
611 ASSERT_TRUE(cert.get());
612 // This certificate is valid for the proxy, but not for the origin.
613 bool common_name_fallback_used;
614 EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used));
615 EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used));
616 ProofVerifyDetailsChromium verify_details;
617 verify_details.cert_verify_result.verified_cert = cert;
618 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rchf114d982015-10-21 01:34:56619 ProofVerifyDetailsChromium verify_details2;
620 verify_details2.cert_verify_result.verified_cert = cert;
621 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
bnc313ba9c2015-06-11 15:42:31622
623 request_.url = GURL("http://" + origin_host);
624 AddHangingNonAlternateProtocolSocketData();
625 CreateSessionWithNextProtos();
626 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
627 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
628}
629
[email protected]1e960032013-12-20 19:00:20630TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
[email protected]49e85332013-06-04 04:18:03631 params_.origin_to_force_quic_on =
rchf114d982015-10-21 01:34:56632 HostPortPair::FromString("mail.example.com:443");
[email protected]cebe3282013-05-22 23:49:30633
tbansalfdf5665b2015-09-21 22:46:40634 MockQuicData mock_quic_data1;
635 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
[email protected]1e960032013-12-20 19:00:20636
tbansalfdf5665b2015-09-21 22:46:40637 MockQuicData mock_quic_data2;
638 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
639
640 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
641 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
[email protected]cebe3282013-05-22 23:49:30642
643 CreateSession();
644
tbansalc8a94ea2015-11-02 23:58:51645 EXPECT_EQ(0U, test_network_quality_estimator_->watcher_count());
tbansalfdf5665b2015-09-21 22:46:40646 for (size_t i = 0; i < 2; ++i) {
647 scoped_ptr<HttpNetworkTransaction> trans(
648 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
649 TestCompletionCallback callback;
650 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
651 EXPECT_EQ(ERR_IO_PENDING, rv);
652 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
tbansalc8a94ea2015-11-02 23:58:51653 EXPECT_EQ(1 + i, test_network_quality_estimator_->watcher_count());
tbansalfdf5665b2015-09-21 22:46:40654 }
[email protected]cebe3282013-05-22 23:49:30655}
656
tbansalc8a94ea2015-11-02 23:58:51657TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
658 // Attempt to "force" quic on 443, which will not be honored.
659 params_.origin_to_force_quic_on =
660 HostPortPair::FromString("www.google.com:443");
661
662 MockRead http_reads[] = {
663 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
664 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
665 MockRead(ASYNC, OK)};
666
667 StaticSocketDataProvider data(http_reads, arraysize(http_reads), nullptr, 0);
668 socket_factory_.AddSocketDataProvider(&data);
669 SSLSocketDataProvider ssl(ASYNC, OK);
670 socket_factory_.AddSSLSocketDataProvider(&ssl);
671
672 CreateSession();
673
674 SendRequestAndExpectHttpResponse("hello world");
675 EXPECT_EQ(0U, test_network_quality_estimator_->watcher_count());
676}
677
bncc958faa2015-07-31 18:14:52678TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52679 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56680 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
681 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52682 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
683 MockRead(ASYNC, OK)};
684
685 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
686 0);
687 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56688 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52689
690 MockQuicData mock_quic_data;
691 mock_quic_data.AddWrite(
692 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56693 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52694 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
695 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
696 mock_quic_data.AddRead(
697 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
698 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
699 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59700 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52701
702 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
703
704 AddHangingNonAlternateProtocolSocketData();
705 CreateSessionWithNextProtos();
706
707 SendRequestAndExpectHttpResponse("hello world");
708 SendRequestAndExpectQuicResponse("hello!");
709}
710
bnc8be55ebb2015-10-30 14:12:07711TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) {
712 std::string altsvc_header = base::StringPrintf(
713 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam());
714 MockRead http_reads[] = {
715 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
716 MockRead("hello world"),
717 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
718 MockRead(ASYNC, OK)};
719
720 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
721 0);
722 socket_factory_.AddSocketDataProvider(&http_data);
723 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
724
725 MockQuicData mock_quic_data;
726 mock_quic_data.AddWrite(
727 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
728 GetRequestHeaders("GET", "https", "/")));
729 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
730 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
731 mock_quic_data.AddRead(
732 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
733 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
734 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59735 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc8be55ebb2015-10-30 14:12:07736
737 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
738
739 AddHangingNonAlternateProtocolSocketData();
740 CreateSessionWithNextProtos();
741
742 SendRequestAndExpectHttpResponse("hello world");
743 SendRequestAndExpectQuicResponse("hello!");
744}
745
746TEST_P(QuicNetworkTransactionTest,
747 DoNotUseAlternativeServiceQuicUnsupportedVersion) {
748 std::string altsvc_header = base::StringPrintf(
749 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam() - 1);
750 MockRead http_reads[] = {
751 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
752 MockRead("hello world"),
753 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
754 MockRead(ASYNC, OK)};
755
756 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
757 0);
758 socket_factory_.AddSocketDataProvider(&http_data);
759 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
760 socket_factory_.AddSocketDataProvider(&http_data);
761 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
762
763 CreateSessionWithNextProtos();
764
765 SendRequestAndExpectHttpResponse("hello world");
766 SendRequestAndExpectHttpResponse("hello world");
767}
768
bncc958faa2015-07-31 18:14:52769// When multiple alternative services are advertised,
770// HttpStreamFactoryImpl::RequestStreamInternal() only passes the first one to
771// Job. This is what the following test verifies.
772// TODO(bnc): Update this test when multiple alternative services are handled
773// properly.
774TEST_P(QuicNetworkTransactionTest, UseFirstAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52775 MockRead http_reads[] = {
776 MockRead("HTTP/1.1 200 OK\r\n"),
777 MockRead("Alt-Svc: quic=\":443\", quic=\":1234\"\r\n\r\n"),
778 MockRead("hello world"),
779 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
780 MockRead(ASYNC, OK)};
781
782 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
783 0);
784 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56785 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52786
787 MockQuicData mock_quic_data;
788 mock_quic_data.AddWrite(
789 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56790 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52791 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
792 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
793 mock_quic_data.AddRead(
794 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
795 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
796 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59797 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52798
799 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
800
801 AddHangingNonAlternateProtocolSocketData();
802 CreateSessionWithNextProtos();
803
804 SendRequestAndExpectHttpResponse("hello world");
805 SendRequestAndExpectQuicResponseOnPort("hello!", 443);
806}
807
808TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) {
bncc958faa2015-07-31 18:14:52809 MockRead http_reads[] = {
810 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:56811 MockRead(kQuicAlternativeServiceDifferentPortHeader),
bncc958faa2015-07-31 18:14:52812 MockRead("hello world"),
813 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
814 MockRead(ASYNC, OK)};
815
816 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
817 0);
818 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56819 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52820
821 MockQuicData mock_quic_data;
822 mock_quic_data.AddWrite(
823 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56824 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52825 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
826 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
827 mock_quic_data.AddRead(
828 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
829 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
830 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59831 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52832
833 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
834
835 AddHangingNonAlternateProtocolSocketData();
836 CreateSessionWithNextProtos();
837
838 SendRequestAndExpectHttpResponse("hello world");
839 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
840}
841
842TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) {
bncc958faa2015-07-31 18:14:52843 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56844 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
845 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52846 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
847 MockRead(ASYNC, OK)};
848
849 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
850 0);
851 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56852 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52853
854 MockQuicData mock_quic_data;
855 mock_quic_data.AddWrite(
856 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56857 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52858 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
859 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
860 mock_quic_data.AddRead(
861 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
862 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
863 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
864 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52865
866 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
867
868 AddHangingNonAlternateProtocolSocketData();
869 CreateSessionWithNextProtos();
870
871 AlternativeService alternative_service(QUIC,
872 HostPortPair::FromURL(request_.url));
873 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
874 alternative_service);
875 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
876 alternative_service));
877
878 SendRequestAndExpectHttpResponse("hello world");
879 SendRequestAndExpectQuicResponse("hello!");
880
mmenkee24011922015-12-17 22:12:59881 mock_quic_data.Resume();
bncc958faa2015-07-31 18:14:52882
883 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
884 alternative_service));
885}
886
887TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceProbabilityForQuic) {
bncc958faa2015-07-31 18:14:52888 MockRead http_reads[] = {
889 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:56890 MockRead(kQuicAlternativeService50pctHeader), MockRead("hello world"),
bncc958faa2015-07-31 18:14:52891 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
892 MockRead(ASYNC, OK)};
893
894 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
895 0);
896 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56897 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52898
899 MockQuicData mock_quic_data;
900 mock_quic_data.AddWrite(
901 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56902 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52903 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
904 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
905 mock_quic_data.AddRead(
906 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
907 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
908 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:59909 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncc958faa2015-07-31 18:14:52910
911 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
912
913 AddHangingNonAlternateProtocolSocketData();
914 params_.alternative_service_probability_threshold = 0.25;
915 CreateSessionWithNextProtos();
916
917 SendRequestAndExpectHttpResponse("hello world");
918 SendRequestAndExpectQuicResponse("hello!");
919}
920
921TEST_P(QuicNetworkTransactionTest,
922 DontUseAlternativeServiceProbabilityForQuic) {
bncc958faa2015-07-31 18:14:52923 MockRead http_reads[] = {
924 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:56925 MockRead(kQuicAlternativeService50pctHeader), MockRead("hello world"),
bncc958faa2015-07-31 18:14:52926 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
927 MockRead(ASYNC, OK)};
928
929 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
930 0);
931 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56932 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52933 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56934 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52935
936 params_.alternative_service_probability_threshold = 0.75;
937 CreateSessionWithNextProtos();
938
939 SendRequestAndExpectHttpResponse("hello world");
940 SendRequestAndExpectHttpResponse("hello world");
941}
942
bncc958faa2015-07-31 18:14:52943TEST_P(QuicNetworkTransactionTest,
944 DontUseAlternativeServiceWithBadProbabilityForQuic) {
bncc958faa2015-07-31 18:14:52945 MockRead http_reads[] = {
946 MockRead("HTTP/1.1 200 OK\r\n"),
947 MockRead("Alt-Svc: quic=\":443\";p=2\r\n\r\n"), MockRead("hello world"),
948 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
949 MockRead(ASYNC, OK)};
950
951 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
952 0);
953 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56954 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52955 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56956 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52957
958 params_.alternative_service_probability_threshold = 0.75;
959 CreateSessionWithNextProtos();
960
961 SendRequestAndExpectHttpResponse("hello world");
962 SendRequestAndExpectHttpResponse("hello world");
963}
964
965TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) {
bncc958faa2015-07-31 18:14:52966 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56967 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
968 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52969 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
970 MockRead(ASYNC, OK)};
971
972 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
973 0);
974 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56975 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52976
977 MockQuicData mock_quic_data;
978 mock_quic_data.AddWrite(
979 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56980 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52981 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
982 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
983 mock_quic_data.AddRead(
984 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
985 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
986 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
987
988 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
989
990 AddHangingNonAlternateProtocolSocketData();
991 CreateSessionWithNextProtos();
992
993 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
994 SendRequestAndExpectHttpResponse("hello world");
995}
996
[email protected]1e960032013-12-20 19:00:20997TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
[email protected]aa9b14d2013-05-10 23:45:19998 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56999 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1000 MockRead("hello world"),
1001 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1002 MockRead(ASYNC, OK)};
[email protected]61a527782013-02-21 03:58:001003
rjshaded5ced072015-12-18 19:26:021004 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1005 0);
[email protected]aa9b14d2013-05-10 23:45:191006 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561007 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]61a527782013-02-21 03:58:001008
[email protected]1e960032013-12-20 19:00:201009 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031010 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051011 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561012 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021013 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1014 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031015 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051016 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031017 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501018 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591019 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]61a527782013-02-21 03:58:001020
rcha5399e02015-04-21 19:32:041021 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]61a527782013-02-21 03:58:001022
[email protected]aa9b14d2013-05-10 23:45:191023 // The non-alternate protocol job needs to hang in order to guarantee that
1024 // the alternate-protocol job will "win".
1025 AddHangingNonAlternateProtocolSocketData();
[email protected]61a527782013-02-21 03:58:001026
[email protected]d7599122014-05-24 03:37:231027 CreateSessionWithNextProtos();
[email protected]61a527782013-02-21 03:58:001028
[email protected]aa9b14d2013-05-10 23:45:191029 SendRequestAndExpectHttpResponse("hello world");
1030 SendRequestAndExpectQuicResponse("hello!");
[email protected]61a527782013-02-21 03:58:001031}
1032
bnc62a44f022015-04-02 15:59:411033TEST_P(QuicNetworkTransactionTest, AlternateProtocolDifferentPort) {
1034 MockRead http_reads[] = {
1035 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561036 MockRead(kQuicAlternateProtocolDifferentPortHeader),
bnc62a44f022015-04-02 15:59:411037 MockRead("hello world"),
1038 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1039 MockRead(ASYNC, OK)};
1040
1041 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1042 0);
1043 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561044 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bnc62a44f022015-04-02 15:59:411045
1046 MockQuicData mock_quic_data;
1047 mock_quic_data.AddWrite(
1048 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561049 GetRequestHeaders("GET", "https", "/")));
bnc62a44f022015-04-02 15:59:411050 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1051 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1052 mock_quic_data.AddRead(
1053 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1054 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501055 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591056 mock_quic_data.AddRead(ASYNC, 0); // EOF
bnc62a44f022015-04-02 15:59:411057
rcha5399e02015-04-21 19:32:041058 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bnc62a44f022015-04-02 15:59:411059
1060 // The non-alternate protocol job needs to hang in order to guarantee that
1061 // the alternate-protocol job will "win".
1062 AddHangingNonAlternateProtocolSocketData();
1063
1064 CreateSessionWithNextProtos();
1065
1066 SendRequestAndExpectHttpResponse("hello world");
1067 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
1068}
1069
bncc958faa2015-07-31 18:14:521070TEST_P(QuicNetworkTransactionTest, ConfirmAlternateProtocol) {
bncae8db8402015-03-26 20:13:501071 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561072 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
bncae8db8402015-03-26 20:13:501073 MockRead("hello world"),
1074 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1075 MockRead(ASYNC, OK)};
1076
1077 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1078 0);
1079 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561080 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncae8db8402015-03-26 20:13:501081
1082 MockQuicData mock_quic_data;
1083 mock_quic_data.AddWrite(
1084 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561085 GetRequestHeaders("GET", "https", "/")));
bncae8db8402015-03-26 20:13:501086 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1087 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1088 mock_quic_data.AddRead(
1089 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1090 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501091 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1092 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncae8db8402015-03-26 20:13:501093
rcha5399e02015-04-21 19:32:041094 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bncae8db8402015-03-26 20:13:501095
1096 // The non-alternate protocol job needs to hang in order to guarantee that
1097 // the alternate-protocol job will "win".
1098 AddHangingNonAlternateProtocolSocketData();
1099
1100 CreateSessionWithNextProtos();
1101
1102 AlternativeService alternative_service(QUIC,
1103 HostPortPair::FromURL(request_.url));
bnc6be245c12015-05-15 11:24:071104 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
bncae8db8402015-03-26 20:13:501105 alternative_service);
bnc6be245c12015-05-15 11:24:071106 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1107 alternative_service));
bncae8db8402015-03-26 20:13:501108
1109 SendRequestAndExpectHttpResponse("hello world");
1110 SendRequestAndExpectQuicResponse("hello!");
1111
mmenkee24011922015-12-17 22:12:591112 mock_quic_data.Resume();
rchb27683c2015-07-29 23:53:501113
bnc6be245c12015-05-15 11:24:071114 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1115 alternative_service));
bncae8db8402015-03-26 20:13:501116}
1117
[email protected]287d9412014-07-08 23:01:001118TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolProbabilityForQuic) {
1119 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561120 MockRead("HTTP/1.1 200 OK\r\n"),
1121 MockRead(kQuicAlternateProtocol50pctHeader), MockRead("hello world"),
1122 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1123 MockRead(ASYNC, OK)};
[email protected]287d9412014-07-08 23:01:001124
rjshaded5ced072015-12-18 19:26:021125 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1126 0);
[email protected]287d9412014-07-08 23:01:001127 socket_factory_.AddSocketDataProvider(&http_data);
1128
1129 MockQuicData mock_quic_data;
1130 mock_quic_data.AddWrite(
1131 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561132 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021133 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1134 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]287d9412014-07-08 23:01:001135 mock_quic_data.AddRead(
1136 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1137 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501138 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591139 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]287d9412014-07-08 23:01:001140
rcha5399e02015-04-21 19:32:041141 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]287d9412014-07-08 23:01:001142
1143 // The non-alternate protocol job needs to hang in order to guarantee that
1144 // the alternate-protocol job will "win".
1145 AddHangingNonAlternateProtocolSocketData();
1146
bnc62891a52015-04-27 14:14:121147 params_.alternative_service_probability_threshold = .25;
[email protected]287d9412014-07-08 23:01:001148 CreateSessionWithNextProtos();
1149
1150 SendRequestAndExpectHttpResponse("hello world");
1151 SendRequestAndExpectQuicResponse("hello!");
1152}
1153
1154TEST_P(QuicNetworkTransactionTest, DontUseAlternateProtocolProbabilityForQuic) {
1155 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561156 MockRead("HTTP/1.1 200 OK\r\n"),
1157 MockRead(kQuicAlternateProtocol50pctHeader), MockRead("hello world"),
1158 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1159 MockRead(ASYNC, OK)};
[email protected]287d9412014-07-08 23:01:001160
rjshaded5ced072015-12-18 19:26:021161 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1162 0);
[email protected]287d9412014-07-08 23:01:001163 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561164 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001165 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561166 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001167
bnc62891a52015-04-27 14:14:121168 params_.alternative_service_probability_threshold = .75;
[email protected]287d9412014-07-08 23:01:001169 CreateSessionWithNextProtos();
1170
1171 SendRequestAndExpectHttpResponse("hello world");
1172 SendRequestAndExpectHttpResponse("hello world");
1173}
1174
1175TEST_P(QuicNetworkTransactionTest,
1176 DontUseAlternateProtocolWithBadProbabilityForQuic) {
1177 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021178 MockRead("HTTP/1.1 200 OK\r\n"),
1179 MockRead("Alternate-Protocol: 443:quic,p=2\r\n\r\n"),
1180 MockRead("hello world"),
1181 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1182 MockRead(ASYNC, OK)};
[email protected]287d9412014-07-08 23:01:001183
rjshaded5ced072015-12-18 19:26:021184 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1185 0);
[email protected]287d9412014-07-08 23:01:001186 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561187 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001188 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561189 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001190
bnc62891a52015-04-27 14:14:121191 params_.alternative_service_probability_threshold = .75;
[email protected]287d9412014-07-08 23:01:001192 CreateSessionWithNextProtos();
1193
1194 SendRequestAndExpectHttpResponse("hello world");
1195 SendRequestAndExpectHttpResponse("hello world");
1196}
1197
[email protected]1e960032013-12-20 19:00:201198TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) {
[email protected]6d1b4ed2013-07-10 03:57:541199 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561200 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1201 MockRead("hello world"),
1202 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1203 MockRead(ASYNC, OK)};
[email protected]6d1b4ed2013-07-10 03:57:541204
rjshaded5ced072015-12-18 19:26:021205 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1206 0);
[email protected]6d1b4ed2013-07-10 03:57:541207 socket_factory_.AddSocketDataProvider(&http_data);
1208
[email protected]1e960032013-12-20 19:00:201209 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031210 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051211 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561212 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021213 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1214 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031215 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051216 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031217 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501218 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591219 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]6d1b4ed2013-07-10 03:57:541220
rcha5399e02015-04-21 19:32:041221 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]6d1b4ed2013-07-10 03:57:541222
1223 // The non-alternate protocol job needs to hang in order to guarantee that
1224 // the alternate-protocol job will "win".
1225 AddHangingNonAlternateProtocolSocketData();
1226
[email protected]d7599122014-05-24 03:37:231227 CreateSessionWithNextProtos();
[email protected]6d1b4ed2013-07-10 03:57:541228
1229 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1230 SendRequestAndExpectHttpResponse("hello world");
1231}
1232
bnccb7ff3c2015-05-21 20:51:551233class QuicAltSvcCertificateVerificationTest
1234 : public QuicNetworkTransactionTest {
1235 public:
1236 void Run(bool valid) {
1237 HostPortPair origin(valid ? "mail.example.org" : "invalid.example.org",
1238 443);
1239 HostPortPair alternative("www.example.org", 443);
1240 std::string url("https://");
1241 url.append(origin.host());
1242 url.append(":443");
1243 request_.url = GURL(url);
1244
1245 maker_.set_hostname(origin.host());
1246 MockQuicData mock_quic_data;
1247 mock_quic_data.AddWrite(
1248 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1249 GetRequestHeaders("GET", "https", "/")));
1250 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1251 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1252 mock_quic_data.AddRead(
1253 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1254 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591255 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
bnccb7ff3c2015-05-21 20:51:551256 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1257
1258 scoped_refptr<X509Certificate> cert(
1259 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
1260 ASSERT_TRUE(cert.get());
1261 bool common_name_fallback_used;
1262 EXPECT_EQ(valid,
1263 cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
1264 EXPECT_TRUE(
1265 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
1266 ProofVerifyDetailsChromium verify_details;
1267 verify_details.cert_verify_result.verified_cert = cert;
1268 verify_details.cert_verify_result.is_issued_by_known_root = true;
1269 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1270 crypto_client_stream_factory_.set_handshake_mode(
1271 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1272
1273 // Connection to |origin| fails, so that success of |request| depends on
1274 // connection to |alternate| only.
1275 MockConnect refused_connect(ASYNC, ERR_CONNECTION_REFUSED);
1276 StaticSocketDataProvider refused_data;
1277 refused_data.set_connect_data(refused_connect);
1278 socket_factory_.AddSocketDataProvider(&refused_data);
1279
1280 CreateSessionWithNextProtos();
1281 AlternativeService alternative_service(QUIC, alternative);
bnc7dc7e1b42015-07-28 14:43:121282 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
bnccb7ff3c2015-05-21 20:51:551283 session_->http_server_properties()->SetAlternativeService(
bnc7dc7e1b42015-07-28 14:43:121284 origin, alternative_service, 1.0, expiration);
bnccb7ff3c2015-05-21 20:51:551285 scoped_ptr<HttpNetworkTransaction> trans(
1286 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1287 TestCompletionCallback callback;
1288 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1289 EXPECT_EQ(ERR_IO_PENDING, rv);
1290 rv = callback.WaitForResult();
1291 if (valid) {
1292 EXPECT_EQ(OK, rv);
1293 CheckWasQuicResponse(trans);
1294 CheckResponsePort(trans, 443);
1295 CheckResponseData(trans, "hello!");
1296 } else {
1297 EXPECT_EQ(ERR_CONNECTION_REFUSED, rv);
1298 }
1299 }
1300};
1301
1302INSTANTIATE_TEST_CASE_P(Version,
1303 QuicAltSvcCertificateVerificationTest,
1304 ::testing::ValuesIn(QuicSupportedVersions()));
1305
1306TEST_P(QuicAltSvcCertificateVerificationTest,
1307 RequestSucceedsWithValidCertificate) {
1308 Run(true);
1309}
1310
1311TEST_P(QuicAltSvcCertificateVerificationTest,
1312 RequestFailsWithInvalidCertificate) {
1313 Run(false);
1314}
1315
[email protected]1e960032013-12-20 19:00:201316TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) {
[email protected]dda75ab2013-06-22 22:43:301317 crypto_client_stream_factory_.set_handshake_mode(
1318 MockCryptoClientStream::COLD_START);
1319
1320 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561321 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
1322 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.com\r\n"),
1323 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")};
[email protected]dda75ab2013-06-22 22:43:301324
1325 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561326 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1327 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1328 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]dda75ab2013-06-22 22:43:301329
mmenke651bae7f2015-12-18 21:26:451330 MockClientSocketFactory socket_factory;
[email protected]dda75ab2013-06-22 22:43:301331
mmenke651bae7f2015-12-18 21:26:451332 SequencedSocketData http_data(http_reads, arraysize(http_reads), http_writes,
1333 arraysize(http_writes));
[email protected]dda75ab2013-06-22 22:43:301334 socket_factory.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561335 socket_factory.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301336
1337 // The QUIC transaction will not be allowed to complete.
mmenke651bae7f2015-12-18 21:26:451338 MockWrite quic_writes[] = {MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 1)};
[email protected]dda75ab2013-06-22 22:43:301339 MockRead quic_reads[] = {
mmenke651bae7f2015-12-18 21:26:451340 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0),
[email protected]dda75ab2013-06-22 22:43:301341 };
mmenke651bae7f2015-12-18 21:26:451342 SequencedSocketData quic_data(quic_reads, arraysize(quic_reads), quic_writes,
1343 arraysize(quic_writes));
[email protected]dda75ab2013-06-22 22:43:301344 socket_factory.AddSocketDataProvider(&quic_data);
1345
1346 // The HTTP transaction will complete.
mmenke651bae7f2015-12-18 21:26:451347 SequencedSocketData http_data2(http_reads, arraysize(http_reads), http_writes,
1348 arraysize(http_writes));
[email protected]dda75ab2013-06-22 22:43:301349 socket_factory.AddSocketDataProvider(&http_data2);
rchf114d982015-10-21 01:34:561350 socket_factory.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301351
[email protected]d7599122014-05-24 03:37:231352 CreateSessionWithFactory(&socket_factory, true);
[email protected]dda75ab2013-06-22 22:43:301353
1354 // Run the first request.
[email protected]dda75ab2013-06-22 22:43:301355 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.
[email protected]dda75ab2013-06-22 22:43:301361 SendRequestAndExpectHttpResponse("hello world");
mmenke651bae7f2015-12-18 21:26:451362 base::RunLoop().RunUntilIdle();
[email protected]dda75ab2013-06-22 22:43:301363
rch37de576c2015-05-17 20:28:171364 ASSERT_TRUE(http_data2.AllReadDataConsumed());
1365 ASSERT_TRUE(http_data2.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:451366 ASSERT_TRUE(quic_data.AllReadDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301367}
1368
[email protected]1e960032013-12-20 19:00:201369TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
[email protected]1e960032013-12-20 19:00:201370 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031371 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051372 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561373 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021374 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1375 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031376 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051377 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031378 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501379 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591380 mock_quic_data.AddRead(ASYNC, 0); // EOF
[email protected]8ba81212013-05-03 13:11:481381
rcha5399e02015-04-21 19:32:041382 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]8ba81212013-05-03 13:11:481383
[email protected]3a120a6b2013-06-25 01:08:271384 // The non-alternate protocol job needs to hang in order to guarantee that
1385 // the alternate-protocol job will "win".
[email protected]dda75ab2013-06-22 22:43:301386 AddHangingNonAlternateProtocolSocketData();
1387
[email protected]d7599122014-05-24 03:37:231388 CreateSessionWithNextProtos();
[email protected]aa9b14d2013-05-10 23:45:191389 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1390 SendRequestAndExpectQuicResponse("hello!");
[email protected]8ba81212013-05-03 13:11:481391}
1392
[email protected]1e960032013-12-20 19:00:201393TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
[email protected]1e960032013-12-20 19:00:201394 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031395 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051396 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561397 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021398 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1399 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031400 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051401 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031402 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501403 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mmenkee24011922015-12-17 22:12:591404 mock_quic_data.AddRead(ASYNC, 0); // EOF
rcha5399e02015-04-21 19:32:041405 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]3a120a6b2013-06-25 01:08:271406
1407 // In order for a new QUIC session to be established via alternate-protocol
1408 // without racing an HTTP connection, we need the host resolution to happen
1409 // synchronously.
1410 host_resolver_.set_synchronous_mode(true);
rchf114d982015-10-21 01:34:561411 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1412 "");
1413 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
[email protected]3a120a6b2013-06-25 01:08:271414 AddressList address;
rjshaded5ced072015-12-18 19:26:021415 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1416 nullptr, net_log_.bound());
[email protected]3a120a6b2013-06-25 01:08:271417
[email protected]d7599122014-05-24 03:37:231418 CreateSessionWithNextProtos();
[email protected]3a120a6b2013-06-25 01:08:271419 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1420 SendRequestAndExpectQuicResponse("hello!");
1421}
1422
[email protected]0fc924b2014-03-31 04:34:151423TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) {
rdsmith82957ad2015-09-16 19:42:031424 proxy_service_ = ProxyService::CreateFixedFromPacResult("PROXY myproxy:70");
[email protected]0fc924b2014-03-31 04:34:151425
1426 // Since we are using a proxy, the QUIC job will not succeed.
1427 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561428 MockWrite(SYNCHRONOUS, 0, "GET http://mail.example.com/ HTTP/1.1\r\n"),
1429 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.com\r\n"),
1430 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")};
[email protected]0fc924b2014-03-31 04:34:151431
1432 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561433 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1434 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1435 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]0fc924b2014-03-31 04:34:151436
1437 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
1438 http_writes, arraysize(http_writes));
1439 socket_factory_.AddSocketDataProvider(&http_data);
1440
1441 // In order for a new QUIC session to be established via alternate-protocol
1442 // without racing an HTTP connection, we need the host resolution to happen
1443 // synchronously.
1444 host_resolver_.set_synchronous_mode(true);
rchf114d982015-10-21 01:34:561445 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1446 "");
1447 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
[email protected]0fc924b2014-03-31 04:34:151448 AddressList address;
rjshaded5ced072015-12-18 19:26:021449 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1450 nullptr, net_log_.bound());
[email protected]0fc924b2014-03-31 04:34:151451
rchf114d982015-10-21 01:34:561452 request_.url = GURL("http://mail.example.com/");
[email protected]d7599122014-05-24 03:37:231453 CreateSessionWithNextProtos();
[email protected]0fc924b2014-03-31 04:34:151454 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1455 SendRequestAndExpectHttpResponse("hello world");
1456}
1457
[email protected]1e960032013-12-20 19:00:201458TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
[email protected]1e960032013-12-20 19:00:201459 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031460 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051461 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561462 GetRequestHeaders("GET", "https", "/")));
rjshaded5ced072015-12-18 19:26:021463 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1464 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
[email protected]92bf17c2014-03-03 21:14:031465 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051466 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031467 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
mmenkee24011922015-12-17 22:12:591468 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
rcha5399e02015-04-21 19:32:041469 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]11c05872013-08-20 02:04:121470
1471 // The non-alternate protocol job needs to hang in order to guarantee that
1472 // the alternate-protocol job will "win".
1473 AddHangingNonAlternateProtocolSocketData();
1474
1475 // In order for a new QUIC session to be established via alternate-protocol
1476 // without racing an HTTP connection, we need the host resolution to happen
1477 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1478 // connection to the the server, in this test we require confirmation
1479 // before encrypting so the HTTP job will still start.
1480 host_resolver_.set_synchronous_mode(true);
rchf114d982015-10-21 01:34:561481 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1482 "");
1483 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
[email protected]11c05872013-08-20 02:04:121484 AddressList address;
rjshaded5ced072015-12-18 19:26:021485 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1486 nullptr, net_log_.bound());
[email protected]11c05872013-08-20 02:04:121487
[email protected]d7599122014-05-24 03:37:231488 CreateSessionWithNextProtos();
[email protected]11c05872013-08-20 02:04:121489 session_->quic_stream_factory()->set_require_confirmation(true);
1490 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1491
1492 scoped_ptr<HttpNetworkTransaction> trans(
1493 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1494 TestCompletionCallback callback;
1495 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1496 EXPECT_EQ(ERR_IO_PENDING, rv);
1497
1498 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1499 QuicSession::HANDSHAKE_CONFIRMED);
1500 EXPECT_EQ(OK, callback.WaitForResult());
rchb27683c2015-07-29 23:53:501501
1502 CheckWasQuicResponse(trans);
1503 CheckResponseData(trans, "hello!");
[email protected]11c05872013-08-20 02:04:121504}
1505
zhongyica364fbb2015-12-12 03:39:121506TEST_P(QuicNetworkTransactionTest,
1507 LogGranularQuicErrorCodeOnQuicProtocolErrorLocal) {
1508 MockQuicData mock_quic_data;
1509 mock_quic_data.AddWrite(
1510 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1511 GetRequestHeaders("GET", "https", "/")));
1512 // Read a close connection packet with
1513 // QuicErrorCode: QUIC_CRYPTO_VERSION_NOT_SUPPORTED from the peer.
1514 mock_quic_data.AddRead(ConstructConnectionClosePacket(1));
1515 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1516
1517 // The non-alternate protocol job needs to hang in order to guarantee that
1518 // the alternate-protocol job will "win".
1519 AddHangingNonAlternateProtocolSocketData();
1520
1521 // In order for a new QUIC session to be established via alternate-protocol
1522 // without racing an HTTP connection, we need the host resolution to happen
1523 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1524 // connection to the the server, in this test we require confirmation
1525 // before encrypting so the HTTP job will still start.
1526 host_resolver_.set_synchronous_mode(true);
1527 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1528 "");
1529 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
1530 AddressList address;
1531 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1532 nullptr, net_log_.bound());
1533
1534 CreateSessionWithNextProtos();
1535 session_->quic_stream_factory()->set_require_confirmation(true);
1536 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1537
1538 scoped_ptr<HttpNetworkTransaction> trans(
1539 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1540 TestCompletionCallback callback;
1541 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1542 EXPECT_EQ(ERR_IO_PENDING, rv);
1543
1544 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1545 QuicSession::HANDSHAKE_CONFIRMED);
1546 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
1547
1548 NetErrorDetails details;
1549 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1550
1551 trans->PopulateNetErrorDetails(&details);
1552 // Verify the error code logged is what sent by the peer.
1553 EXPECT_EQ(QUIC_CRYPTO_VERSION_NOT_SUPPORTED, details.quic_connection_error);
1554}
1555
1556TEST_P(QuicNetworkTransactionTest,
1557 LogGranularQuicErrorCodeOnQuicProtocolErrorRemote) {
1558 MockQuicData mock_quic_data;
1559 mock_quic_data.AddWrite(
1560 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1561 GetRequestHeaders("GET", "https", "/")));
1562 // Peer sending an invalid stream frame with a invalid stream error causes
1563 // this end to raise error and close connection.
1564 mock_quic_data.AddRead(ConstructRstPacket(1, false, kClientDataStreamId1,
1565 QUIC_STREAM_LAST_ERROR));
1566 std::string quic_error_details = "Invalid rst stream error code.";
1567 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(
1568 2, QuicTime::Delta::Infinite(), 0, 1, QUIC_INVALID_RST_STREAM_DATA,
1569 quic_error_details));
1570 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1571
1572 // The non-alternate protocol job needs to hang in order to guarantee that
1573 // the alternate-protocol job will "win".
1574 AddHangingNonAlternateProtocolSocketData();
1575
1576 // In order for a new QUIC session to be established via alternate-protocol
1577 // without racing an HTTP connection, we need the host resolution to happen
1578 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1579 // connection to the the server, in this test we require confirmation
1580 // before encrypting so the HTTP job will still start.
1581 host_resolver_.set_synchronous_mode(true);
1582 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1583 "");
1584 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
1585 AddressList address;
1586 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1587 nullptr, net_log_.bound());
1588
1589 CreateSessionWithNextProtos();
1590 session_->quic_stream_factory()->set_require_confirmation(true);
1591 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1592
1593 scoped_ptr<HttpNetworkTransaction> trans(
1594 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1595 TestCompletionCallback callback;
1596 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1597 EXPECT_EQ(ERR_IO_PENDING, rv);
1598
1599 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1600 QuicSession::HANDSHAKE_CONFIRMED);
1601 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback.WaitForResult());
1602 NetErrorDetails details;
1603 EXPECT_EQ(QUIC_NO_ERROR, details.quic_connection_error);
1604
1605 trans->PopulateNetErrorDetails(&details);
1606 EXPECT_EQ(QUIC_INVALID_RST_STREAM_DATA, details.quic_connection_error);
1607}
1608
[email protected]1e960032013-12-20 19:00:201609TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
[email protected]3316d422013-05-03 21:45:301610 // Alternate-protocol job
1611 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1));
1612 MockRead quic_reads[] = {
rchb27683c2015-07-29 23:53:501613 MockRead(ASYNC, close->data(), close->length()),
1614 MockRead(ASYNC, ERR_IO_PENDING), // No more data to read
1615 MockRead(ASYNC, OK), // EOF
[email protected]3316d422013-05-03 21:45:301616 };
rjshaded5ced072015-12-18 19:26:021617 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
1618 0);
[email protected]3316d422013-05-03 21:45:301619 socket_factory_.AddSocketDataProvider(&quic_data);
1620
1621 // Main job which will succeed even though the alternate job fails.
1622 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021623 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
1624 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1625 MockRead(ASYNC, OK)};
[email protected]3316d422013-05-03 21:45:301626
rjshaded5ced072015-12-18 19:26:021627 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1628 0);
[email protected]3316d422013-05-03 21:45:301629 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561630 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]3316d422013-05-03 21:45:301631
[email protected]d7599122014-05-24 03:37:231632 CreateSessionWithNextProtos();
[email protected]aa9b14d2013-05-10 23:45:191633 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1634 SendRequestAndExpectHttpResponse("hello from http");
1635 ExpectBrokenAlternateProtocolMapping();
[email protected]3316d422013-05-03 21:45:301636}
1637
[email protected]1e960032013-12-20 19:00:201638TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
[email protected]d03a66d2013-05-06 12:55:591639 // Alternate-protocol job
1640 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:021641 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]d03a66d2013-05-06 12:55:591642 };
rjshaded5ced072015-12-18 19:26:021643 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
1644 0);
[email protected]d03a66d2013-05-06 12:55:591645 socket_factory_.AddSocketDataProvider(&quic_data);
1646
1647 // Main job which will succeed even though the alternate job fails.
1648 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021649 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
1650 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1651 MockRead(ASYNC, OK)};
[email protected]d03a66d2013-05-06 12:55:591652
rjshaded5ced072015-12-18 19:26:021653 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1654 0);
[email protected]d03a66d2013-05-06 12:55:591655 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561656 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]d03a66d2013-05-06 12:55:591657
[email protected]d7599122014-05-24 03:37:231658 CreateSessionWithNextProtos();
[email protected]d03a66d2013-05-06 12:55:591659
[email protected]aa9b14d2013-05-10 23:45:191660 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1661 SendRequestAndExpectHttpResponse("hello from http");
1662 ExpectBrokenAlternateProtocolMapping();
[email protected]d03a66d2013-05-06 12:55:591663}
1664
[email protected]00c159f2014-05-21 22:38:161665TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) {
[email protected]eb71ab62014-05-23 07:57:531666 // Alternate-protocol job will fail when the session attempts to read.
[email protected]00c159f2014-05-21 22:38:161667 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:021668 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:161669 };
rjshaded5ced072015-12-18 19:26:021670 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
1671 0);
[email protected]00c159f2014-05-21 22:38:161672 socket_factory_.AddSocketDataProvider(&quic_data);
1673
[email protected]eb71ab62014-05-23 07:57:531674 // Main job will also fail.
[email protected]00c159f2014-05-21 22:38:161675 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021676 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]00c159f2014-05-21 22:38:161677 };
1678
rjshaded5ced072015-12-18 19:26:021679 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1680 0);
[email protected]00c159f2014-05-21 22:38:161681 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED));
1682 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561683 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]00c159f2014-05-21 22:38:161684
[email protected]d7599122014-05-24 03:37:231685 CreateSessionWithNextProtos();
[email protected]00c159f2014-05-21 22:38:161686
1687 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1688 scoped_ptr<HttpNetworkTransaction> trans(
1689 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1690 TestCompletionCallback callback;
1691 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1692 EXPECT_EQ(ERR_IO_PENDING, rv);
1693 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult());
1694 ExpectQuicAlternateProtocolMapping();
1695}
1696
[email protected]1e960032013-12-20 19:00:201697TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
[email protected]77c6c162013-08-17 02:57:451698 // Alternate-protocol job
1699 MockRead quic_reads[] = {
rjshaded5ced072015-12-18 19:26:021700 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
[email protected]77c6c162013-08-17 02:57:451701 };
rjshaded5ced072015-12-18 19:26:021702 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
1703 0);
[email protected]77c6c162013-08-17 02:57:451704 socket_factory_.AddSocketDataProvider(&quic_data);
1705
1706 AddHangingNonAlternateProtocolSocketData();
1707
[email protected]c92c1b52014-05-31 04:16:061708 // Second Alternate-protocol job which will race with the TCP job.
1709 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421710 nullptr, 0);
[email protected]c92c1b52014-05-31 04:16:061711 socket_factory_.AddSocketDataProvider(&quic_data2);
1712
[email protected]4d283b32013-10-17 12:57:271713 // Final job that will proceed when the QUIC job fails.
1714 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021715 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
1716 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1717 MockRead(ASYNC, OK)};
[email protected]4d283b32013-10-17 12:57:271718
rjshaded5ced072015-12-18 19:26:021719 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1720 0);
[email protected]4d283b32013-10-17 12:57:271721 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561722 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d283b32013-10-17 12:57:271723
[email protected]d7599122014-05-24 03:37:231724 CreateSessionWithNextProtos();
[email protected]77c6c162013-08-17 02:57:451725
1726 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1727
[email protected]4d283b32013-10-17 12:57:271728 SendRequestAndExpectHttpResponse("hello from http");
[email protected]77c6c162013-08-17 02:57:451729
1730 ExpectBrokenAlternateProtocolMapping();
[email protected]4d283b32013-10-17 12:57:271731
rch37de576c2015-05-17 20:28:171732 EXPECT_TRUE(quic_data.AllReadDataConsumed());
1733 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
[email protected]77c6c162013-08-17 02:57:451734}
1735
[email protected]93b31772014-06-19 08:03:351736TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) {
[email protected]65768442014-06-06 23:37:031737 // Alternate-protocol job
1738 MockRead quic_reads[] = {
mmenkee24011922015-12-17 22:12:591739 MockRead(SYNCHRONOUS, ERR_IO_PENDING),
[email protected]65768442014-06-06 23:37:031740 };
rjshaded5ced072015-12-18 19:26:021741 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), nullptr,
1742 0);
[email protected]65768442014-06-06 23:37:031743 socket_factory_.AddSocketDataProvider(&quic_data);
1744
1745 // Main job that will proceed when the QUIC job fails.
1746 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021747 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
1748 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1749 MockRead(ASYNC, OK)};
[email protected]65768442014-06-06 23:37:031750
rjshaded5ced072015-12-18 19:26:021751 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1752 0);
[email protected]65768442014-06-06 23:37:031753 socket_factory_.AddSocketDataProvider(&http_data);
1754
1755 CreateSessionWithNextProtos();
1756
1757 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1758
1759 SendRequestAndExpectHttpResponse("hello from http");
1760}
1761
[email protected]eb71ab62014-05-23 07:57:531762TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
[email protected]4d590c9c2014-05-02 05:14:331763 // Alternate-protocol job will fail before creating a QUIC session.
rtennetibe635732014-10-02 22:51:421764 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0);
rjshaded5ced072015-12-18 19:26:021765 quic_data.set_connect_data(
1766 MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED));
[email protected]4d590c9c2014-05-02 05:14:331767 socket_factory_.AddSocketDataProvider(&quic_data);
1768
1769 // Main job which will succeed even though the alternate job fails.
1770 MockRead http_reads[] = {
rjshaded5ced072015-12-18 19:26:021771 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
1772 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1773 MockRead(ASYNC, OK)};
[email protected]4d590c9c2014-05-02 05:14:331774
rjshaded5ced072015-12-18 19:26:021775 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1776 0);
[email protected]4d590c9c2014-05-02 05:14:331777 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561778 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d590c9c2014-05-02 05:14:331779
[email protected]d7599122014-05-24 03:37:231780 CreateSessionWithNextProtos();
[email protected]4d590c9c2014-05-02 05:14:331781 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1782 SendRequestAndExpectHttpResponse("hello from http");
[email protected]eb71ab62014-05-23 07:57:531783
1784 ExpectBrokenAlternateProtocolMapping();
[email protected]4d590c9c2014-05-02 05:14:331785}
1786
[email protected]4fee9672014-01-08 14:47:151787TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
[email protected]4fee9672014-01-08 14:47:151788 MockQuicData mock_quic_data;
rcha5399e02015-04-21 19:32:041789 mock_quic_data.AddSynchronousRead(ConstructConnectionClosePacket(1));
[email protected]92bf17c2014-03-03 21:14:031790 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051791 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561792 GetRequestHeaders("GET", "https", "/")));
[email protected]92bf17c2014-03-03 21:14:031793 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rcha5399e02015-04-21 19:32:041794 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4fee9672014-01-08 14:47:151795
1796 // When the QUIC connection fails, we will try the request again over HTTP.
1797 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561798 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1799 MockRead("hello world"),
1800 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1801 MockRead(ASYNC, OK)};
[email protected]4fee9672014-01-08 14:47:151802
rjshaded5ced072015-12-18 19:26:021803 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1804 0);
[email protected]4fee9672014-01-08 14:47:151805 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561806 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4fee9672014-01-08 14:47:151807
1808 // In order for a new QUIC session to be established via alternate-protocol
1809 // without racing an HTTP connection, we need the host resolution to happen
1810 // synchronously.
1811 host_resolver_.set_synchronous_mode(true);
rchf114d982015-10-21 01:34:561812 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1813 "");
1814 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
[email protected]4fee9672014-01-08 14:47:151815 AddressList address;
rjshaded5ced072015-12-18 19:26:021816 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(),
1817 nullptr, net_log_.bound());
[email protected]4fee9672014-01-08 14:47:151818
[email protected]d7599122014-05-24 03:37:231819 CreateSessionWithNextProtos();
[email protected]4fee9672014-01-08 14:47:151820 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1821 SendRequestAndExpectHttpResponse("hello world");
1822}
1823
bnc508835902015-05-12 20:10:291824TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) {
bncb07c05532015-05-14 19:07:201825 maker_.set_hostname("www.example.org");
tbansalc8a94ea2015-11-02 23:58:511826 EXPECT_FALSE(rtt_observer_.rtt_notification_received());
bnc508835902015-05-12 20:10:291827 MockQuicData mock_quic_data;
1828 mock_quic_data.AddWrite(
1829 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1830 GetRequestHeaders("GET", "https", "/")));
1831 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1832 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1833 mock_quic_data.AddRead(
1834 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1835 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501836 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
bnc508835902015-05-12 20:10:291837 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1838
bncb07c05532015-05-14 19:07:201839 request_.url = GURL("https://www.example.org:443");
bnc508835902015-05-12 20:10:291840 AddHangingNonAlternateProtocolSocketData();
1841 CreateSessionWithNextProtos();
1842 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
1843 SendRequestAndExpectQuicResponse("hello!");
tbansalc8a94ea2015-11-02 23:58:511844 EXPECT_TRUE(rtt_observer_.rtt_notification_received());
bnc508835902015-05-12 20:10:291845}
1846
[email protected]61a527782013-02-21 03:58:001847} // namespace test
1848} // namespace net