blob: 576fe7b64fd75b84e7e0116ac34c6189af76b607 [file] [log] [blame]
[email protected]61a527782013-02-21 03:58:001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]1e960032013-12-20 19:00:205#include <vector>
6
[email protected]61a527782013-02-21 03:58:007#include "base/basictypes.h"
8#include "base/compiler_specific.h"
9#include "base/memory/scoped_ptr.h"
[email protected]98b20ce2013-05-10 05:55:2610#include "base/stl_util.h"
bnc8be55ebb2015-10-30 14:12:0711#include "base/strings/stringprintf.h"
tbansalfdf5665b2015-09-21 22:46:4012#include "net/base/network_quality_estimator.h"
13#include "net/base/socket_performance_watcher.h"
[email protected]61a527782013-02-21 03:58:0014#include "net/base/test_completion_callback.h"
bnc508835902015-05-12 20:10:2915#include "net/base/test_data_directory.h"
[email protected]6e7845ae2013-03-29 21:48:1116#include "net/cert/mock_cert_verifier.h"
rtenneti052774e2015-11-24 21:00:1217#include "net/cert/multi_log_ct_verifier.h"
[email protected]f2cb3cf2013-03-21 01:40:5318#include "net/dns/mock_host_resolver.h"
[email protected]61a527782013-02-21 03:58:0019#include "net/http/http_auth_handler_factory.h"
20#include "net/http/http_network_session.h"
21#include "net/http/http_network_transaction.h"
22#include "net/http/http_server_properties_impl.h"
23#include "net/http/http_stream.h"
24#include "net/http/http_stream_factory.h"
[email protected]c41737d2014-05-14 07:47:1925#include "net/http/http_transaction_test_util.h"
[email protected]b1c988b2013-06-13 06:48:1126#include "net/http/transport_security_state.h"
vishal.b62985ca92015-04-17 08:45:5127#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4628#include "net/log/test_net_log_entry.h"
29#include "net/log/test_net_log_util.h"
[email protected]61a527782013-02-21 03:58:0030#include "net/proxy/proxy_config_service_fixed.h"
31#include "net/proxy/proxy_resolver.h"
32#include "net/proxy/proxy_service.h"
bnc508835902015-05-12 20:10:2933#include "net/quic/crypto/proof_verifier_chromium.h"
[email protected]61a527782013-02-21 03:58:0034#include "net/quic/crypto/quic_decrypter.h"
35#include "net/quic/crypto/quic_encrypter.h"
36#include "net/quic/quic_framer.h"
[email protected]24e5bc52013-09-18 15:36:5837#include "net/quic/quic_http_utils.h"
[email protected]ed3fc15d2013-03-08 18:37:4438#include "net/quic/test_tools/crypto_test_utils.h"
[email protected]61a527782013-02-21 03:58:0039#include "net/quic/test_tools/mock_clock.h"
[email protected]e8ff26842013-03-22 21:02:0540#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
[email protected]61a527782013-02-21 03:58:0041#include "net/quic/test_tools/mock_random.h"
[email protected]1e960032013-12-20 19:00:2042#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]61a527782013-02-21 03:58:0043#include "net/quic/test_tools/quic_test_utils.h"
44#include "net/socket/client_socket_factory.h"
45#include "net/socket/mock_client_socket_pool_manager.h"
46#include "net/socket/socket_test_util.h"
47#include "net/socket/ssl_client_socket.h"
48#include "net/spdy/spdy_frame_builder.h"
49#include "net/spdy/spdy_framer.h"
[email protected]536fd0b2013-03-14 17:41:5750#include "net/ssl/ssl_config_service_defaults.h"
bnc508835902015-05-12 20:10:2951#include "net/test/cert_test_util.h"
[email protected]61a527782013-02-21 03:58:0052#include "testing/gtest/include/gtest/gtest.h"
53#include "testing/platform_test.h"
54
bnc508835902015-05-12 20:10:2955namespace net {
56namespace test {
[email protected]61a527782013-02-21 03:58:0057
58namespace {
59
rchf114d982015-10-21 01:34:5660static const char kQuicAlternateProtocolHeader[] =
[email protected]6d1b4ed2013-07-10 03:57:5461 "Alternate-Protocol: 443:quic\r\n\r\n";
rchf114d982015-10-21 01:34:5662static const char kQuicAlternateProtocol50pctHeader[] =
63 "Alternate-Protocol: 443:quic,p=.5\r\n\r\n";
64static const char kQuicAlternateProtocolDifferentPortHeader[] =
65 "Alternate-Protocol: 137:quic\r\n\r\n";
66static const char kQuicAlternativeServiceHeader[] =
bncc958faa2015-07-31 18:14:5267 "Alt-Svc: quic=\":443\"\r\n\r\n";
rchf114d982015-10-21 01:34:5668static const char kQuicAlternativeService50pctHeader[] =
69 "Alt-Svc: quic=\":443\";p=\".5\"\r\n\r\n";
70static const char kQuicAlternativeServiceDifferentPortHeader[] =
71 "Alt-Svc: quic=\":137\"\r\n\r\n";
[email protected]1e960032013-12-20 19:00:2072
rchf114d982015-10-21 01:34:5673const char kDefaultServerHostName[] = "mail.example.com";
bncb07c05532015-05-14 19:07:2074
[email protected]61a527782013-02-21 03:58:0075} // namespace
76
[email protected]1e960032013-12-20 19:00:2077// Helper class to encapsulate MockReads and MockWrites for QUIC.
78// Simplify ownership issues and the interaction with the MockSocketFactory.
79class MockQuicData {
80 public:
rtennetia004d332015-08-28 06:44:5781 MockQuicData() : packet_number_(0) {}
rcha5399e02015-04-21 19:32:0482
[email protected]1e960032013-12-20 19:00:2083 ~MockQuicData() {
84 STLDeleteElements(&packets_);
85 }
86
rcha5399e02015-04-21 19:32:0487 void AddSynchronousRead(scoped_ptr<QuicEncryptedPacket> packet) {
[email protected]1e960032013-12-20 19:00:2088 reads_.push_back(MockRead(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:5789 packet_number_++));
[email protected]1e960032013-12-20 19:00:2090 packets_.push_back(packet.release());
91 }
92
rcha5399e02015-04-21 19:32:0493 void AddRead(scoped_ptr<QuicEncryptedPacket> packet) {
94 reads_.push_back(
rtennetia004d332015-08-28 06:44:5795 MockRead(ASYNC, packet->data(), packet->length(), packet_number_++));
rcha5399e02015-04-21 19:32:0496 packets_.push_back(packet.release());
97 }
98
[email protected]1e960032013-12-20 19:00:2099 void AddRead(IoMode mode, int rv) {
rtennetia004d332015-08-28 06:44:57100 reads_.push_back(MockRead(mode, rv, packet_number_++));
[email protected]1e960032013-12-20 19:00:20101 }
102
103 void AddWrite(scoped_ptr<QuicEncryptedPacket> packet) {
104 writes_.push_back(MockWrite(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:57105 packet_number_++));
[email protected]1e960032013-12-20 19:00:20106 packets_.push_back(packet.release());
107 }
108
rcha5399e02015-04-21 19:32:04109 void AddSocketDataToFactory(MockClientSocketFactory* factory) {
rtennetibe635732014-10-02 22:51:42110 MockRead* reads = reads_.empty() ? nullptr : &reads_[0];
111 MockWrite* writes = writes_.empty() ? nullptr : &writes_[0];
rcha5399e02015-04-21 19:32:04112 socket_data_.reset(
113 new SequencedSocketData(reads, reads_.size(), writes, writes_.size()));
[email protected]1e960032013-12-20 19:00:20114 factory->AddSocketDataProvider(socket_data_.get());
115 }
116
rchb27683c2015-07-29 23:53:50117 void CompleteRead() { socket_data_->CompleteRead(); }
118
[email protected]1e960032013-12-20 19:00:20119 private:
120 std::vector<QuicEncryptedPacket*> packets_;
121 std::vector<MockWrite> writes_;
122 std::vector<MockRead> reads_;
rtennetia004d332015-08-28 06:44:57123 size_t packet_number_;
rchb27683c2015-07-29 23:53:50124 scoped_ptr<SequencedSocketData> socket_data_;
[email protected]1e960032013-12-20 19:00:20125};
126
tbansal7cec3812015-02-05 21:25:12127class ProxyHeadersHandler {
128 public:
129 ProxyHeadersHandler() : was_called_(false) {}
130
131 bool was_called() { return was_called_; }
132
133 void OnBeforeProxyHeadersSent(const ProxyInfo& proxy_info,
134 HttpRequestHeaders* request_headers) {
135 was_called_ = true;
136 }
137
138 private:
139 bool was_called_;
140};
141
tbansalfdf5665b2015-09-21 22:46:40142class TestNetworkQualityEstimator : public NetworkQualityEstimator {
143 public:
144 TestNetworkQualityEstimator()
145 : NetworkQualityEstimator(scoped_ptr<net::ExternalEstimateProvider>(),
tbansalc8a94ea2015-11-02 23:58:51146 std::map<std::string, std::string>()),
147 watcher_count_(0) {}
tbansalfdf5665b2015-09-21 22:46:40148
149 ~TestNetworkQualityEstimator() override {}
150
tbansalc8a94ea2015-11-02 23:58:51151 scoped_ptr<SocketPerformanceWatcher> CreateSocketPerformanceWatcher(
152 const Protocol protocol) override {
153 if (protocol != PROTOCOL_QUIC) {
154 NOTIMPLEMENTED();
155 }
156 ++watcher_count_;
157 return NetworkQualityEstimator::CreateSocketPerformanceWatcher(protocol);
tbansalfdf5665b2015-09-21 22:46:40158 }
159
tbansalc8a94ea2015-11-02 23:58:51160 size_t watcher_count() const { return watcher_count_; }
tbansalfdf5665b2015-09-21 22:46:40161
162 private:
tbansalc8a94ea2015-11-02 23:58:51163 size_t watcher_count_;
tbansalfdf5665b2015-09-21 22:46:40164 DISALLOW_COPY_AND_ASSIGN(TestNetworkQualityEstimator);
165};
166
tbansalc8a94ea2015-11-02 23:58:51167class TestRTTObserver : public NetworkQualityEstimator::RTTObserver {
168 public:
169 TestRTTObserver() : rtt_notification_received_(false) {}
170
171 bool rtt_notification_received() const { return rtt_notification_received_; }
172
173 // NetworkQualityEstimator::RttObserver implementation:
174 void OnRTTObservation(
175 int32_t rtt_ms,
176 const base::TimeTicks& timestamp,
177 net::NetworkQualityEstimator::ObservationSource source) override {
178 rtt_notification_received_ = true;
179 }
180
181 private:
182 bool rtt_notification_received_;
183};
184
[email protected]1e960032013-12-20 19:00:20185class QuicNetworkTransactionTest
186 : public PlatformTest,
[email protected]5d03bbd2014-03-07 16:19:16187 public ::testing::WithParamInterface<QuicVersion> {
[email protected]61a527782013-02-21 03:58:00188 protected:
[email protected]1c04f9522013-02-21 20:32:43189 QuicNetworkTransactionTest()
rtenneti4b06ae72014-08-26 03:43:43190 : clock_(new MockClock),
bncb07c05532015-05-14 19:07:20191 maker_(GetParam(), 0, clock_, kDefaultServerHostName),
rtenneti052774e2015-11-24 21:00:12192 cert_transparency_verifier_(new MultiLogCTVerifier()),
tbansalfdf5665b2015-09-21 22:46:40193 test_network_quality_estimator_(new TestNetworkQualityEstimator()),
[email protected]1c04f9522013-02-21 20:32:43194 ssl_config_service_(new SSLConfigServiceDefaults),
195 proxy_service_(ProxyService::CreateDirect()),
196 auth_handler_factory_(
[email protected]dda75ab2013-06-22 22:43:30197 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
[email protected]457d6952013-12-13 09:24:58198 random_generator_(0),
rchf114d982015-10-21 01:34:56199 hanging_data_(nullptr, 0, nullptr, 0),
200 ssl_data_(ASYNC, OK) {
[email protected]aa9b14d2013-05-10 23:45:19201 request_.method = "GET";
rchf114d982015-10-21 01:34:56202 std::string url("https://");
bncb07c05532015-05-14 19:07:20203 url.append(kDefaultServerHostName);
204 request_.url = GURL(url);
[email protected]aa9b14d2013-05-10 23:45:19205 request_.load_flags = 0;
[email protected]98a9d1252014-04-04 00:43:59206 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
rchf114d982015-10-21 01:34:56207
208 scoped_refptr<X509Certificate> cert(
209 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
210 verify_details_.cert_verify_result.verified_cert = cert;
211 verify_details_.cert_verify_result.is_issued_by_known_root = true;
212 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
[email protected]1c04f9522013-02-21 20:32:43213 }
[email protected]61a527782013-02-21 03:58:00214
dcheng67be2b1f2014-10-27 21:47:29215 void SetUp() override {
[email protected]61a527782013-02-21 03:58:00216 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34217 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00218 }
219
dcheng67be2b1f2014-10-27 21:47:29220 void TearDown() override {
[email protected]61a527782013-02-21 03:58:00221 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
222 // Empty the current queue.
[email protected]2da659e2013-05-23 20:51:34223 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00224 PlatformTest::TearDown();
225 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34226 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00227 }
228
[email protected]3316d422013-05-03 21:45:30229 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
rtennetia004d332015-08-28 06:44:57230 QuicPacketNumber num) {
[email protected]1e960032013-12-20 19:00:20231 return maker_.MakeConnectionClosePacket(num);
[email protected]3316d422013-05-03 21:45:30232 }
233
[email protected]61a527782013-02-21 03:58:00234 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket(
rtennetia004d332015-08-28 06:44:57235 QuicPacketNumber largest_received,
236 QuicPacketNumber least_unacked) {
[email protected]1e960032013-12-20 19:00:20237 return maker_.MakeAckPacket(2, largest_received, least_unacked, true);
238 }
[email protected]61a527782013-02-21 03:58:00239
[email protected]1e960032013-12-20 19:00:20240 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
241 const std::string& scheme,
242 const std::string& path) {
243 return maker_.GetRequestHeaders(method, scheme, path);
[email protected]61a527782013-02-21 03:58:00244 }
245
[email protected]1e960032013-12-20 19:00:20246 SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
247 return maker_.GetResponseHeaders(status);
[email protected]61a527782013-02-21 03:58:00248 }
249
[email protected]1e960032013-12-20 19:00:20250 scoped_ptr<QuicEncryptedPacket> ConstructDataPacket(
rtennetia004d332015-08-28 06:44:57251 QuicPacketNumber packet_number,
[email protected]98b20ce2013-05-10 05:55:26252 QuicStreamId stream_id,
[email protected]e8ff26842013-03-22 21:02:05253 bool should_include_version,
[email protected]61a527782013-02-21 03:58:00254 bool fin,
255 QuicStreamOffset offset,
256 base::StringPiece data) {
rtennetia004d332015-08-28 06:44:57257 return maker_.MakeDataPacket(packet_number, stream_id,
258 should_include_version, fin, offset, data);
[email protected]61a527782013-02-21 03:58:00259 }
260
[email protected]1e960032013-12-20 19:00:20261 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
rtennetia004d332015-08-28 06:44:57262 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20263 QuicStreamId stream_id,
264 bool should_include_version,
265 bool fin,
266 const SpdyHeaderBlock& headers) {
ianswett0888cff2015-11-24 17:42:16267 SpdyPriority priority =
rtennetif4bdb542015-01-21 14:33:05268 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
rtennetia004d332015-08-28 06:44:57269 return maker_.MakeRequestHeadersPacket(packet_number, stream_id,
rtennetif4bdb542015-01-21 14:33:05270 should_include_version, fin,
271 priority, headers);
[email protected]61a527782013-02-21 03:58:00272 }
273
[email protected]1e960032013-12-20 19:00:20274 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
rtennetia004d332015-08-28 06:44:57275 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20276 QuicStreamId stream_id,
277 bool should_include_version,
278 bool fin,
279 const SpdyHeaderBlock& headers) {
280 return maker_.MakeResponseHeadersPacket(
rtennetia004d332015-08-28 06:44:57281 packet_number, stream_id, should_include_version, fin, headers);
[email protected]61a527782013-02-21 03:58:00282 }
283
284 void CreateSession() {
[email protected]d7599122014-05-24 03:37:23285 CreateSessionWithFactory(&socket_factory_, false);
[email protected]dda75ab2013-06-22 22:43:30286 }
287
[email protected]d7599122014-05-24 03:37:23288 void CreateSessionWithNextProtos() {
289 CreateSessionWithFactory(&socket_factory_, true);
290 }
291
292 // If |use_next_protos| is true, enables SPDY and QUIC.
293 void CreateSessionWithFactory(ClientSocketFactory* socket_factory,
294 bool use_next_protos) {
[email protected]4dca587c2013-03-07 16:54:47295 params_.enable_quic = true;
296 params_.quic_clock = clock_;
297 params_.quic_random = &random_generator_;
[email protected]dda75ab2013-06-22 22:43:30298 params_.client_socket_factory = socket_factory;
[email protected]e8ff26842013-03-22 21:02:05299 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43300 params_.host_resolver = &host_resolver_;
301 params_.cert_verifier = &cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11302 params_.transport_security_state = &transport_security_state_;
rtenneti052774e2015-11-24 21:00:12303 params_.cert_transparency_verifier = cert_transparency_verifier_.get();
tbansalfdf5665b2015-09-21 22:46:40304 params_.socket_performance_watcher_factory =
305 test_network_quality_estimator_.get();
[email protected]1c04f9522013-02-21 20:32:43306 params_.proxy_service = proxy_service_.get();
307 params_.ssl_config_service = ssl_config_service_.get();
308 params_.http_auth_handler_factory = auth_handler_factory_.get();
bnc6be245c12015-05-15 11:24:07309 params_.http_server_properties = http_server_properties_.GetWeakPtr();
[email protected]1e960032013-12-20 19:00:20310 params_.quic_supported_versions = SupportedVersions(GetParam());
[email protected]61a527782013-02-21 03:58:00311
tbansalc8a94ea2015-11-02 23:58:51312 test_network_quality_estimator_->AddRTTObserver(&rtt_observer_);
313
[email protected]d7599122014-05-24 03:37:23314 if (use_next_protos) {
bnc55ff9da2015-08-19 18:42:35315 params_.use_alternative_services = true;
bnc3bb2c232014-11-07 20:26:39316 params_.next_protos = NextProtosWithSpdyAndQuic(true, true);
[email protected]d7599122014-05-24 03:37:23317 }
318
mmenkee65e7af2015-10-13 17:16:42319 session_.reset(new HttpNetworkSession(params_));
[email protected]11c05872013-08-20 02:04:12320 session_->quic_stream_factory()->set_require_confirmation(false);
rch185ebee2015-07-14 23:56:22321 ASSERT_EQ(params_.quic_socket_receive_buffer_size,
322 session_->quic_stream_factory()->socket_receive_buffer_size());
[email protected]61a527782013-02-21 03:58:00323 }
324
[email protected]aa9b14d2013-05-10 23:45:19325 void CheckWasQuicResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
326 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42327 ASSERT_TRUE(response != nullptr);
328 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19329 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
330 EXPECT_TRUE(response->was_fetched_via_spdy);
331 EXPECT_TRUE(response->was_npn_negotiated);
332 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
333 response->connection_info);
334 }
335
bnc62a44f022015-04-02 15:59:41336 void CheckResponsePort(const scoped_ptr<HttpNetworkTransaction>& trans,
337 uint16 port) {
338 const HttpResponseInfo* response = trans->GetResponseInfo();
339 ASSERT_TRUE(response != nullptr);
340 EXPECT_EQ(port, response->socket_address.port());
341 }
342
[email protected]aa9b14d2013-05-10 23:45:19343 void CheckWasHttpResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
344 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42345 ASSERT_TRUE(response != nullptr);
346 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19347 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
348 EXPECT_FALSE(response->was_fetched_via_spdy);
349 EXPECT_FALSE(response->was_npn_negotiated);
350 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1,
351 response->connection_info);
352 }
353
bncffc2fdf2015-05-14 18:29:49354 void CheckResponseData(const scoped_ptr<HttpNetworkTransaction>& trans,
[email protected]aa9b14d2013-05-10 23:45:19355 const std::string& expected) {
356 std::string response_data;
bncffc2fdf2015-05-14 18:29:49357 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
[email protected]aa9b14d2013-05-10 23:45:19358 EXPECT_EQ(expected, response_data);
359 }
360
bncffc2fdf2015-05-14 18:29:49361 void RunTransaction(const scoped_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19362 TestCompletionCallback callback;
363 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
364 EXPECT_EQ(ERR_IO_PENDING, rv);
365 EXPECT_EQ(OK, callback.WaitForResult());
366 }
367
368 void SendRequestAndExpectHttpResponse(const std::string& expected) {
369 scoped_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50370 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
bncffc2fdf2015-05-14 18:29:49371 RunTransaction(trans);
[email protected]aa9b14d2013-05-10 23:45:19372 CheckWasHttpResponse(trans);
bncffc2fdf2015-05-14 18:29:49373 CheckResponseData(trans, expected);
[email protected]aa9b14d2013-05-10 23:45:19374 }
375
376 void SendRequestAndExpectQuicResponse(const std::string& expected) {
rchf114d982015-10-21 01:34:56377 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, 443);
tbansal7cec3812015-02-05 21:25:12378 }
379
bnc62a44f022015-04-02 15:59:41380 void SendRequestAndExpectQuicResponseOnPort(const std::string& expected,
381 uint16 port) {
382 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, port);
383 }
384
385 void SendRequestAndExpectQuicResponseFromProxyOnPort(
386 const std::string& expected,
387 uint16 port) {
388 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port);
[email protected]aa9b14d2013-05-10 23:45:19389 }
390
391 void AddQuicAlternateProtocolMapping(
392 MockCryptoClientStream::HandshakeMode handshake_mode) {
393 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
bnccacc0992015-03-20 20:22:22394 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url);
rchf114d982015-10-21 01:34:56395 AlternativeService alternative_service(QUIC, host_port_pair.host(), 443);
bnc7dc7e1b42015-07-28 14:43:12396 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
397 http_server_properties_.SetAlternativeService(
398 host_port_pair, alternative_service, 1.0, expiration);
[email protected]aa9b14d2013-05-10 23:45:19399 }
400
401 void ExpectBrokenAlternateProtocolMapping() {
bnc8445b3002015-03-13 01:57:09402 const HostPortPair origin = HostPortPair::FromURL(request_.url);
bncd9b132e2015-07-08 05:16:10403 const AlternativeServiceVector alternative_service_vector =
404 http_server_properties_.GetAlternativeServices(origin);
405 EXPECT_EQ(1u, alternative_service_vector.size());
bnc6be245c12015-05-15 11:24:07406 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken(
bncd9b132e2015-07-08 05:16:10407 alternative_service_vector[0]));
[email protected]aa9b14d2013-05-10 23:45:19408 }
409
[email protected]4d590c9c2014-05-02 05:14:33410 void ExpectQuicAlternateProtocolMapping() {
bncd9b132e2015-07-08 05:16:10411 const HostPortPair origin = HostPortPair::FromURL(request_.url);
412 const AlternativeServiceVector alternative_service_vector =
413 http_server_properties_.GetAlternativeServices(origin);
414 EXPECT_EQ(1u, alternative_service_vector.size());
415 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
[email protected]4d590c9c2014-05-02 05:14:33416 }
417
[email protected]aa9b14d2013-05-10 23:45:19418 void AddHangingNonAlternateProtocolSocketData() {
[email protected]dda75ab2013-06-22 22:43:30419 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
420 hanging_data_.set_connect_data(hanging_connect);
421 socket_factory_.AddSocketDataProvider(&hanging_data_);
rchf114d982015-10-21 01:34:56422 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]aa9b14d2013-05-10 23:45:19423 }
424
rtenneti4b06ae72014-08-26 03:43:43425 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
[email protected]1e960032013-12-20 19:00:20426 QuicTestPacketMaker maker_;
mmenkee65e7af2015-10-13 17:16:42427 scoped_ptr<HttpNetworkSession> session_;
[email protected]61a527782013-02-21 03:58:00428 MockClientSocketFactory socket_factory_;
rchf114d982015-10-21 01:34:56429 ProofVerifyDetailsChromium verify_details_;
[email protected]e8ff26842013-03-22 21:02:05430 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43431 MockHostResolver host_resolver_;
432 MockCertVerifier cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11433 TransportSecurityState transport_security_state_;
rtenneti052774e2015-11-24 21:00:12434 scoped_ptr<CTVerifier> cert_transparency_verifier_;
tbansalfdf5665b2015-09-21 22:46:40435 scoped_ptr<TestNetworkQualityEstimator> test_network_quality_estimator_;
tbansalc8a94ea2015-11-02 23:58:51436 TestRTTObserver rtt_observer_;
[email protected]1c04f9522013-02-21 20:32:43437 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
438 scoped_ptr<ProxyService> proxy_service_;
439 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
[email protected]61a527782013-02-21 03:58:00440 MockRandom random_generator_;
bnc6be245c12015-05-15 11:24:07441 HttpServerPropertiesImpl http_server_properties_;
[email protected]61a527782013-02-21 03:58:00442 HttpNetworkSession::Params params_;
[email protected]aa9b14d2013-05-10 23:45:19443 HttpRequestInfo request_;
vishal.b62985ca92015-04-17 08:45:51444 BoundTestNetLog net_log_;
[email protected]dda75ab2013-06-22 22:43:30445 StaticSocketDataProvider hanging_data_;
rchf114d982015-10-21 01:34:56446 SSLSocketDataProvider ssl_data_;
tbansal7cec3812015-02-05 21:25:12447
448 private:
449 void SendRequestAndExpectQuicResponseMaybeFromProxy(
450 const std::string& expected,
bnc62a44f022015-04-02 15:59:41451 bool used_proxy,
452 uint16 port) {
tbansal7cec3812015-02-05 21:25:12453 scoped_ptr<HttpNetworkTransaction> trans(
454 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
455 ProxyHeadersHandler proxy_headers_handler;
456 trans->SetBeforeProxyHeadersSentCallback(
457 base::Bind(&ProxyHeadersHandler::OnBeforeProxyHeadersSent,
458 base::Unretained(&proxy_headers_handler)));
bncffc2fdf2015-05-14 18:29:49459 RunTransaction(trans);
tbansal7cec3812015-02-05 21:25:12460 CheckWasQuicResponse(trans);
bnc62a44f022015-04-02 15:59:41461 CheckResponsePort(trans, port);
bncffc2fdf2015-05-14 18:29:49462 CheckResponseData(trans, expected);
tbansal7cec3812015-02-05 21:25:12463 EXPECT_EQ(used_proxy, proxy_headers_handler.was_called());
464 }
[email protected]61a527782013-02-21 03:58:00465};
466
[email protected]1e960032013-12-20 19:00:20467INSTANTIATE_TEST_CASE_P(Version, QuicNetworkTransactionTest,
468 ::testing::ValuesIn(QuicSupportedVersions()));
469
470TEST_P(QuicNetworkTransactionTest, ForceQuic) {
[email protected]49e85332013-06-04 04:18:03471 params_.origin_to_force_quic_on =
rchf114d982015-10-21 01:34:56472 HostPortPair::FromString("mail.example.com:443");
[email protected]4dca587c2013-03-07 16:54:47473
[email protected]1e960032013-12-20 19:00:20474 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03475 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05476 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56477 GetRequestHeaders("GET", "https", "/")));
[email protected]92bf17c2014-03-03 21:14:03478 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05479 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:03480 GetResponseHeaders("200 OK")));
481 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05482 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03483 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50484 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
[email protected]4dca587c2013-03-07 16:54:47485
rcha5399e02015-04-21 19:32:04486 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4dca587c2013-03-07 16:54:47487
[email protected]aa9b14d2013-05-10 23:45:19488 // The non-alternate protocol job needs to hang in order to guarantee that
489 // the alternate-protocol job will "win".
490 AddHangingNonAlternateProtocolSocketData();
[email protected]4dca587c2013-03-07 16:54:47491
492 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47493
tbansalc8a94ea2015-11-02 23:58:51494 EXPECT_FALSE(rtt_observer_.rtt_notification_received());
[email protected]aa9b14d2013-05-10 23:45:19495 SendRequestAndExpectQuicResponse("hello!");
tbansalc8a94ea2015-11-02 23:58:51496 EXPECT_TRUE(rtt_observer_.rtt_notification_received());
[email protected]4dca587c2013-03-07 16:54:47497
[email protected]98b20ce2013-05-10 05:55:26498 // Check that the NetLog was filled reasonably.
mmenke43758e62015-05-04 21:09:46499 TestNetLogEntry::List entries;
[email protected]aa9b14d2013-05-10 23:45:19500 net_log_.GetEntries(&entries);
[email protected]98b20ce2013-05-10 05:55:26501 EXPECT_LT(0u, entries.size());
502
503 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29504 int pos = ExpectLogContainsSomewhere(
505 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
506 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26507 EXPECT_LT(0, pos);
508
rchfd527212015-08-25 00:41:26509 // ... and also a TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29510 pos = ExpectLogContainsSomewhere(
rchfd527212015-08-25 00:41:26511 entries, 0,
512 NetLog::TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED,
ttuttle859dc7a2015-04-23 19:42:29513 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26514 EXPECT_LT(0, pos);
515
rtennetia004d332015-08-28 06:44:57516 std::string packet_number;
517 ASSERT_TRUE(entries[pos].GetStringValue("packet_number", &packet_number));
518 EXPECT_EQ("1", packet_number);
[email protected]98b20ce2013-05-10 05:55:26519
rchfd527212015-08-25 00:41:26520 // ... and also a TYPE_QUIC_SESSION_PACKET_AUTHENTICATED.
521 pos = ExpectLogContainsSomewhere(
522 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_AUTHENTICATED,
523 NetLog::PHASE_NONE);
524 EXPECT_LT(0, pos);
525
[email protected]98b20ce2013-05-10 05:55:26526 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29527 pos = ExpectLogContainsSomewhere(
528 entries, 0, NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
529 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26530 EXPECT_LT(0, pos);
531
532 int log_stream_id;
533 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
[email protected]1e960032013-12-20 19:00:20534 EXPECT_EQ(3, log_stream_id);
[email protected]4dca587c2013-03-07 16:54:47535}
536
[email protected]cf3e3cd62014-02-05 16:16:16537TEST_P(QuicNetworkTransactionTest, QuicProxy) {
tbansaled0aecc2015-02-20 03:44:18538 params_.enable_quic_for_proxies = true;
rchf114d982015-10-21 01:34:56539 proxy_service_ =
540 ProxyService::CreateFixedFromPacResult("QUIC mail.example.com:70");
[email protected]cf3e3cd62014-02-05 16:16:16541
[email protected]cf3e3cd62014-02-05 16:16:16542 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03543 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05544 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03545 GetRequestHeaders("GET", "http", "/")));
546 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05547 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:03548 GetResponseHeaders("200 OK")));
549 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05550 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03551 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50552 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
[email protected]cf3e3cd62014-02-05 16:16:16553 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
554
rcha5399e02015-04-21 19:32:04555 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cf3e3cd62014-02-05 16:16:16556
tbansalc8a94ea2015-11-02 23:58:51557 EXPECT_FALSE(rtt_observer_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16558 // There is no need to set up an alternate protocol job, because
559 // no attempt will be made to speak to the proxy over TCP.
560
rchf114d982015-10-21 01:34:56561 request_.url = GURL("http://mail.example.com/");
[email protected]cf3e3cd62014-02-05 16:16:16562 CreateSession();
563
bnc62a44f022015-04-02 15:59:41564 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
tbansalc8a94ea2015-11-02 23:58:51565 EXPECT_TRUE(rtt_observer_.rtt_notification_received());
[email protected]cf3e3cd62014-02-05 16:16:16566}
567
bnc313ba9c2015-06-11 15:42:31568// Regression test for https://crbug.com/492458. Test that for an HTTP
569// connection through a QUIC proxy, the certificate exhibited by the proxy is
570// checked against the proxy hostname, not the origin hostname.
571TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) {
572 const std::string origin_host = "news.example.com";
573 const std::string proxy_host = "www.example.org";
574
575 params_.enable_quic_for_proxies = true;
rdsmith82957ad2015-09-16 19:42:03576 proxy_service_ =
577 ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70");
bnc313ba9c2015-06-11 15:42:31578
579 maker_.set_hostname(origin_host);
580 MockQuicData mock_quic_data;
581 mock_quic_data.AddWrite(
582 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
583 GetRequestHeaders("GET", "http", "/")));
584 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
585 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
586 mock_quic_data.AddRead(
587 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
588 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50589 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
bnc313ba9c2015-06-11 15:42:31590 mock_quic_data.AddRead(SYNCHRONOUS, 0);
591 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
592
593 scoped_refptr<X509Certificate> cert(
594 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
595 ASSERT_TRUE(cert.get());
596 // This certificate is valid for the proxy, but not for the origin.
597 bool common_name_fallback_used;
598 EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used));
599 EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used));
600 ProofVerifyDetailsChromium verify_details;
601 verify_details.cert_verify_result.verified_cert = cert;
602 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rchf114d982015-10-21 01:34:56603 ProofVerifyDetailsChromium verify_details2;
604 verify_details2.cert_verify_result.verified_cert = cert;
605 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
bnc313ba9c2015-06-11 15:42:31606
607 request_.url = GURL("http://" + origin_host);
608 AddHangingNonAlternateProtocolSocketData();
609 CreateSessionWithNextProtos();
610 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
611 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
612}
613
[email protected]1e960032013-12-20 19:00:20614TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
[email protected]49e85332013-06-04 04:18:03615 params_.origin_to_force_quic_on =
rchf114d982015-10-21 01:34:56616 HostPortPair::FromString("mail.example.com:443");
[email protected]cebe3282013-05-22 23:49:30617
tbansalfdf5665b2015-09-21 22:46:40618 MockQuicData mock_quic_data1;
619 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
[email protected]1e960032013-12-20 19:00:20620
tbansalfdf5665b2015-09-21 22:46:40621 MockQuicData mock_quic_data2;
622 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
623
624 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
625 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
[email protected]cebe3282013-05-22 23:49:30626
627 CreateSession();
628
tbansalc8a94ea2015-11-02 23:58:51629 EXPECT_EQ(0U, test_network_quality_estimator_->watcher_count());
tbansalfdf5665b2015-09-21 22:46:40630 for (size_t i = 0; i < 2; ++i) {
631 scoped_ptr<HttpNetworkTransaction> trans(
632 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
633 TestCompletionCallback callback;
634 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
635 EXPECT_EQ(ERR_IO_PENDING, rv);
636 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
tbansalc8a94ea2015-11-02 23:58:51637 EXPECT_EQ(1 + i, test_network_quality_estimator_->watcher_count());
tbansalfdf5665b2015-09-21 22:46:40638 }
[email protected]cebe3282013-05-22 23:49:30639}
640
tbansalc8a94ea2015-11-02 23:58:51641TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
642 // Attempt to "force" quic on 443, which will not be honored.
643 params_.origin_to_force_quic_on =
644 HostPortPair::FromString("www.google.com:443");
645
646 MockRead http_reads[] = {
647 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
648 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
649 MockRead(ASYNC, OK)};
650
651 StaticSocketDataProvider data(http_reads, arraysize(http_reads), nullptr, 0);
652 socket_factory_.AddSocketDataProvider(&data);
653 SSLSocketDataProvider ssl(ASYNC, OK);
654 socket_factory_.AddSSLSocketDataProvider(&ssl);
655
656 CreateSession();
657
658 SendRequestAndExpectHttpResponse("hello world");
659 EXPECT_EQ(0U, test_network_quality_estimator_->watcher_count());
660}
661
bncc958faa2015-07-31 18:14:52662TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52663 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56664 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
665 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52666 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
667 MockRead(ASYNC, OK)};
668
669 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
670 0);
671 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56672 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52673
674 MockQuicData mock_quic_data;
675 mock_quic_data.AddWrite(
676 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56677 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52678 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
679 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
680 mock_quic_data.AddRead(
681 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
682 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
683 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
684 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
685
686 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
687
688 AddHangingNonAlternateProtocolSocketData();
689 CreateSessionWithNextProtos();
690
691 SendRequestAndExpectHttpResponse("hello world");
692 SendRequestAndExpectQuicResponse("hello!");
693}
694
bnc8be55ebb2015-10-30 14:12:07695TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) {
696 std::string altsvc_header = base::StringPrintf(
697 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam());
698 MockRead http_reads[] = {
699 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
700 MockRead("hello world"),
701 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
702 MockRead(ASYNC, OK)};
703
704 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
705 0);
706 socket_factory_.AddSocketDataProvider(&http_data);
707 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
708
709 MockQuicData mock_quic_data;
710 mock_quic_data.AddWrite(
711 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
712 GetRequestHeaders("GET", "https", "/")));
713 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
714 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
715 mock_quic_data.AddRead(
716 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
717 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
718 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
719 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
720
721 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
722
723 AddHangingNonAlternateProtocolSocketData();
724 CreateSessionWithNextProtos();
725
726 SendRequestAndExpectHttpResponse("hello world");
727 SendRequestAndExpectQuicResponse("hello!");
728}
729
730TEST_P(QuicNetworkTransactionTest,
731 DoNotUseAlternativeServiceQuicUnsupportedVersion) {
732 std::string altsvc_header = base::StringPrintf(
733 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam() - 1);
734 MockRead http_reads[] = {
735 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
736 MockRead("hello world"),
737 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
738 MockRead(ASYNC, OK)};
739
740 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
741 0);
742 socket_factory_.AddSocketDataProvider(&http_data);
743 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
744 socket_factory_.AddSocketDataProvider(&http_data);
745 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
746
747 CreateSessionWithNextProtos();
748
749 SendRequestAndExpectHttpResponse("hello world");
750 SendRequestAndExpectHttpResponse("hello world");
751}
752
bncc958faa2015-07-31 18:14:52753// When multiple alternative services are advertised,
754// HttpStreamFactoryImpl::RequestStreamInternal() only passes the first one to
755// Job. This is what the following test verifies.
756// TODO(bnc): Update this test when multiple alternative services are handled
757// properly.
758TEST_P(QuicNetworkTransactionTest, UseFirstAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52759 MockRead http_reads[] = {
760 MockRead("HTTP/1.1 200 OK\r\n"),
761 MockRead("Alt-Svc: quic=\":443\", quic=\":1234\"\r\n\r\n"),
762 MockRead("hello world"),
763 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
764 MockRead(ASYNC, OK)};
765
766 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
767 0);
768 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56769 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52770
771 MockQuicData mock_quic_data;
772 mock_quic_data.AddWrite(
773 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56774 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52775 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
776 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
777 mock_quic_data.AddRead(
778 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
779 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
780 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
781 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
782
783 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
784
785 AddHangingNonAlternateProtocolSocketData();
786 CreateSessionWithNextProtos();
787
788 SendRequestAndExpectHttpResponse("hello world");
789 SendRequestAndExpectQuicResponseOnPort("hello!", 443);
790}
791
792TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) {
bncc958faa2015-07-31 18:14:52793 MockRead http_reads[] = {
794 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:56795 MockRead(kQuicAlternativeServiceDifferentPortHeader),
bncc958faa2015-07-31 18:14:52796 MockRead("hello world"),
797 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
798 MockRead(ASYNC, OK)};
799
800 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
801 0);
802 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56803 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52804
805 MockQuicData mock_quic_data;
806 mock_quic_data.AddWrite(
807 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56808 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52809 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
810 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
811 mock_quic_data.AddRead(
812 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
813 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
814 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
815 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
816
817 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
818
819 AddHangingNonAlternateProtocolSocketData();
820 CreateSessionWithNextProtos();
821
822 SendRequestAndExpectHttpResponse("hello world");
823 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
824}
825
826TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) {
bncc958faa2015-07-31 18:14:52827 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56828 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
829 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52830 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
831 MockRead(ASYNC, OK)};
832
833 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
834 0);
835 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56836 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52837
838 MockQuicData mock_quic_data;
839 mock_quic_data.AddWrite(
840 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56841 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52842 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
843 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
844 mock_quic_data.AddRead(
845 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
846 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
847 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
848 mock_quic_data.AddRead(ASYNC, 0); // EOF
849 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
850
851 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
852
853 AddHangingNonAlternateProtocolSocketData();
854 CreateSessionWithNextProtos();
855
856 AlternativeService alternative_service(QUIC,
857 HostPortPair::FromURL(request_.url));
858 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
859 alternative_service);
860 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
861 alternative_service));
862
863 SendRequestAndExpectHttpResponse("hello world");
864 SendRequestAndExpectQuicResponse("hello!");
865
866 mock_quic_data.CompleteRead();
867
868 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
869 alternative_service));
870}
871
872TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceProbabilityForQuic) {
bncc958faa2015-07-31 18:14:52873 MockRead http_reads[] = {
874 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:56875 MockRead(kQuicAlternativeService50pctHeader), MockRead("hello world"),
bncc958faa2015-07-31 18:14:52876 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
877 MockRead(ASYNC, OK)};
878
879 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
880 0);
881 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56882 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52883
884 MockQuicData mock_quic_data;
885 mock_quic_data.AddWrite(
886 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56887 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52888 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
889 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
890 mock_quic_data.AddRead(
891 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
892 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
893 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
894 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
895
896 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
897
898 AddHangingNonAlternateProtocolSocketData();
899 params_.alternative_service_probability_threshold = 0.25;
900 CreateSessionWithNextProtos();
901
902 SendRequestAndExpectHttpResponse("hello world");
903 SendRequestAndExpectQuicResponse("hello!");
904}
905
906TEST_P(QuicNetworkTransactionTest,
907 DontUseAlternativeServiceProbabilityForQuic) {
bncc958faa2015-07-31 18:14:52908 MockRead http_reads[] = {
909 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:56910 MockRead(kQuicAlternativeService50pctHeader), MockRead("hello world"),
bncc958faa2015-07-31 18:14:52911 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
912 MockRead(ASYNC, OK)};
913
914 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
915 0);
916 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56917 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52918 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56919 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52920
921 params_.alternative_service_probability_threshold = 0.75;
922 CreateSessionWithNextProtos();
923
924 SendRequestAndExpectHttpResponse("hello world");
925 SendRequestAndExpectHttpResponse("hello world");
926}
927
bncc958faa2015-07-31 18:14:52928TEST_P(QuicNetworkTransactionTest,
929 DontUseAlternativeServiceWithBadProbabilityForQuic) {
bncc958faa2015-07-31 18:14:52930 MockRead http_reads[] = {
931 MockRead("HTTP/1.1 200 OK\r\n"),
932 MockRead("Alt-Svc: quic=\":443\";p=2\r\n\r\n"), MockRead("hello world"),
933 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
934 MockRead(ASYNC, OK)};
935
936 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
937 0);
938 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56939 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52940 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56941 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52942
943 params_.alternative_service_probability_threshold = 0.75;
944 CreateSessionWithNextProtos();
945
946 SendRequestAndExpectHttpResponse("hello world");
947 SendRequestAndExpectHttpResponse("hello world");
948}
949
950TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) {
bncc958faa2015-07-31 18:14:52951 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56952 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
953 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52954 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
955 MockRead(ASYNC, OK)};
956
957 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
958 0);
959 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56960 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52961
962 MockQuicData mock_quic_data;
963 mock_quic_data.AddWrite(
964 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56965 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52966 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
967 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
968 mock_quic_data.AddRead(
969 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
970 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
971 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
972
973 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
974
975 AddHangingNonAlternateProtocolSocketData();
976 CreateSessionWithNextProtos();
977
978 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
979 SendRequestAndExpectHttpResponse("hello world");
980}
981
[email protected]1e960032013-12-20 19:00:20982TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
[email protected]aa9b14d2013-05-10 23:45:19983 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56984 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
985 MockRead("hello world"),
986 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
987 MockRead(ASYNC, OK)};
[email protected]61a527782013-02-21 03:58:00988
[email protected]aa9b14d2013-05-10 23:45:19989 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:42990 nullptr, 0);
[email protected]aa9b14d2013-05-10 23:45:19991 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56992 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]61a527782013-02-21 03:58:00993
[email protected]1e960032013-12-20 19:00:20994 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03995 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05996 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56997 GetRequestHeaders("GET", "https", "/")));
[email protected]92bf17c2014-03-03 21:14:03998 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05999 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:031000 GetResponseHeaders("200 OK")));
1001 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051002 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031003 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501004 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
[email protected]1e960032013-12-20 19:00:201005 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
[email protected]61a527782013-02-21 03:58:001006
rcha5399e02015-04-21 19:32:041007 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]61a527782013-02-21 03:58:001008
[email protected]aa9b14d2013-05-10 23:45:191009 // The non-alternate protocol job needs to hang in order to guarantee that
1010 // the alternate-protocol job will "win".
1011 AddHangingNonAlternateProtocolSocketData();
[email protected]61a527782013-02-21 03:58:001012
[email protected]d7599122014-05-24 03:37:231013 CreateSessionWithNextProtos();
[email protected]61a527782013-02-21 03:58:001014
[email protected]aa9b14d2013-05-10 23:45:191015 SendRequestAndExpectHttpResponse("hello world");
1016 SendRequestAndExpectQuicResponse("hello!");
[email protected]61a527782013-02-21 03:58:001017}
1018
bnc62a44f022015-04-02 15:59:411019TEST_P(QuicNetworkTransactionTest, AlternateProtocolDifferentPort) {
1020 MockRead http_reads[] = {
1021 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561022 MockRead(kQuicAlternateProtocolDifferentPortHeader),
bnc62a44f022015-04-02 15:59:411023 MockRead("hello world"),
1024 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1025 MockRead(ASYNC, OK)};
1026
1027 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1028 0);
1029 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561030 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bnc62a44f022015-04-02 15:59:411031
1032 MockQuicData mock_quic_data;
1033 mock_quic_data.AddWrite(
1034 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561035 GetRequestHeaders("GET", "https", "/")));
bnc62a44f022015-04-02 15:59:411036 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1037 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1038 mock_quic_data.AddRead(
1039 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1040 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501041 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
bnc62a44f022015-04-02 15:59:411042 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
1043
rcha5399e02015-04-21 19:32:041044 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bnc62a44f022015-04-02 15:59:411045
1046 // The non-alternate protocol job needs to hang in order to guarantee that
1047 // the alternate-protocol job will "win".
1048 AddHangingNonAlternateProtocolSocketData();
1049
1050 CreateSessionWithNextProtos();
1051
1052 SendRequestAndExpectHttpResponse("hello world");
1053 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
1054}
1055
bncc958faa2015-07-31 18:14:521056TEST_P(QuicNetworkTransactionTest, ConfirmAlternateProtocol) {
bncae8db8402015-03-26 20:13:501057 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561058 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
bncae8db8402015-03-26 20:13:501059 MockRead("hello world"),
1060 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1061 MockRead(ASYNC, OK)};
1062
1063 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1064 0);
1065 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561066 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncae8db8402015-03-26 20:13:501067
1068 MockQuicData mock_quic_data;
1069 mock_quic_data.AddWrite(
1070 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561071 GetRequestHeaders("GET", "https", "/")));
bncae8db8402015-03-26 20:13:501072 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1073 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1074 mock_quic_data.AddRead(
1075 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1076 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501077 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1078 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncae8db8402015-03-26 20:13:501079 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
1080
rcha5399e02015-04-21 19:32:041081 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bncae8db8402015-03-26 20:13:501082
1083 // The non-alternate protocol job needs to hang in order to guarantee that
1084 // the alternate-protocol job will "win".
1085 AddHangingNonAlternateProtocolSocketData();
1086
1087 CreateSessionWithNextProtos();
1088
1089 AlternativeService alternative_service(QUIC,
1090 HostPortPair::FromURL(request_.url));
bnc6be245c12015-05-15 11:24:071091 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
bncae8db8402015-03-26 20:13:501092 alternative_service);
bnc6be245c12015-05-15 11:24:071093 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1094 alternative_service));
bncae8db8402015-03-26 20:13:501095
1096 SendRequestAndExpectHttpResponse("hello world");
1097 SendRequestAndExpectQuicResponse("hello!");
1098
rchb27683c2015-07-29 23:53:501099 mock_quic_data.CompleteRead();
1100
bnc6be245c12015-05-15 11:24:071101 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1102 alternative_service));
bncae8db8402015-03-26 20:13:501103}
1104
[email protected]287d9412014-07-08 23:01:001105TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolProbabilityForQuic) {
1106 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561107 MockRead("HTTP/1.1 200 OK\r\n"),
1108 MockRead(kQuicAlternateProtocol50pctHeader), MockRead("hello world"),
1109 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1110 MockRead(ASYNC, OK)};
[email protected]287d9412014-07-08 23:01:001111
1112 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421113 nullptr, 0);
[email protected]287d9412014-07-08 23:01:001114 socket_factory_.AddSocketDataProvider(&http_data);
1115
1116 MockQuicData mock_quic_data;
1117 mock_quic_data.AddWrite(
1118 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561119 GetRequestHeaders("GET", "https", "/")));
[email protected]287d9412014-07-08 23:01:001120 mock_quic_data.AddRead(
1121 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
1122 GetResponseHeaders("200 OK")));
1123 mock_quic_data.AddRead(
1124 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1125 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501126 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
[email protected]287d9412014-07-08 23:01:001127 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
1128
rcha5399e02015-04-21 19:32:041129 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]287d9412014-07-08 23:01:001130
1131 // The non-alternate protocol job needs to hang in order to guarantee that
1132 // the alternate-protocol job will "win".
1133 AddHangingNonAlternateProtocolSocketData();
1134
bnc62891a52015-04-27 14:14:121135 params_.alternative_service_probability_threshold = .25;
[email protected]287d9412014-07-08 23:01:001136 CreateSessionWithNextProtos();
1137
1138 SendRequestAndExpectHttpResponse("hello world");
1139 SendRequestAndExpectQuicResponse("hello!");
1140}
1141
1142TEST_P(QuicNetworkTransactionTest, DontUseAlternateProtocolProbabilityForQuic) {
1143 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561144 MockRead("HTTP/1.1 200 OK\r\n"),
1145 MockRead(kQuicAlternateProtocol50pctHeader), MockRead("hello world"),
1146 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1147 MockRead(ASYNC, OK)};
[email protected]287d9412014-07-08 23:01:001148
1149 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421150 nullptr, 0);
[email protected]287d9412014-07-08 23:01:001151 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561152 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001153 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561154 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001155
bnc62891a52015-04-27 14:14:121156 params_.alternative_service_probability_threshold = .75;
[email protected]287d9412014-07-08 23:01:001157 CreateSessionWithNextProtos();
1158
1159 SendRequestAndExpectHttpResponse("hello world");
1160 SendRequestAndExpectHttpResponse("hello world");
1161}
1162
1163TEST_P(QuicNetworkTransactionTest,
1164 DontUseAlternateProtocolWithBadProbabilityForQuic) {
1165 MockRead http_reads[] = {
1166 MockRead("HTTP/1.1 200 OK\r\n"),
1167 MockRead("Alternate-Protocol: 443:quic,p=2\r\n\r\n"),
1168 MockRead("hello world"),
1169 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1170 MockRead(ASYNC, OK)
1171 };
1172
1173 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421174 nullptr, 0);
[email protected]287d9412014-07-08 23:01:001175 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561176 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001177 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561178 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001179
bnc62891a52015-04-27 14:14:121180 params_.alternative_service_probability_threshold = .75;
[email protected]287d9412014-07-08 23:01:001181 CreateSessionWithNextProtos();
1182
1183 SendRequestAndExpectHttpResponse("hello world");
1184 SendRequestAndExpectHttpResponse("hello world");
1185}
1186
[email protected]1e960032013-12-20 19:00:201187TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) {
[email protected]6d1b4ed2013-07-10 03:57:541188 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561189 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1190 MockRead("hello world"),
1191 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1192 MockRead(ASYNC, OK)};
[email protected]6d1b4ed2013-07-10 03:57:541193
1194 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421195 nullptr, 0);
[email protected]6d1b4ed2013-07-10 03:57:541196 socket_factory_.AddSocketDataProvider(&http_data);
1197
[email protected]1e960032013-12-20 19:00:201198 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031199 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051200 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561201 GetRequestHeaders("GET", "https", "/")));
[email protected]92bf17c2014-03-03 21:14:031202 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051203 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:031204 GetResponseHeaders("200 OK")));
1205 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051206 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031207 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501208 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
[email protected]1e960032013-12-20 19:00:201209 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
[email protected]6d1b4ed2013-07-10 03:57:541210
rcha5399e02015-04-21 19:32:041211 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]6d1b4ed2013-07-10 03:57:541212
1213 // The non-alternate protocol job needs to hang in order to guarantee that
1214 // the alternate-protocol job will "win".
1215 AddHangingNonAlternateProtocolSocketData();
1216
[email protected]d7599122014-05-24 03:37:231217 CreateSessionWithNextProtos();
[email protected]6d1b4ed2013-07-10 03:57:541218
1219 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1220 SendRequestAndExpectHttpResponse("hello world");
1221}
1222
bnccb7ff3c2015-05-21 20:51:551223class QuicAltSvcCertificateVerificationTest
1224 : public QuicNetworkTransactionTest {
1225 public:
1226 void Run(bool valid) {
1227 HostPortPair origin(valid ? "mail.example.org" : "invalid.example.org",
1228 443);
1229 HostPortPair alternative("www.example.org", 443);
1230 std::string url("https://");
1231 url.append(origin.host());
1232 url.append(":443");
1233 request_.url = GURL(url);
1234
1235 maker_.set_hostname(origin.host());
1236 MockQuicData mock_quic_data;
1237 mock_quic_data.AddWrite(
1238 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1239 GetRequestHeaders("GET", "https", "/")));
1240 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1241 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1242 mock_quic_data.AddRead(
1243 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1244 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501245 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);
bnccb7ff3c2015-05-21 20:51:551246 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1247
1248 scoped_refptr<X509Certificate> cert(
1249 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
1250 ASSERT_TRUE(cert.get());
1251 bool common_name_fallback_used;
1252 EXPECT_EQ(valid,
1253 cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
1254 EXPECT_TRUE(
1255 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
1256 ProofVerifyDetailsChromium verify_details;
1257 verify_details.cert_verify_result.verified_cert = cert;
1258 verify_details.cert_verify_result.is_issued_by_known_root = true;
1259 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1260 crypto_client_stream_factory_.set_handshake_mode(
1261 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1262
1263 // Connection to |origin| fails, so that success of |request| depends on
1264 // connection to |alternate| only.
1265 MockConnect refused_connect(ASYNC, ERR_CONNECTION_REFUSED);
1266 StaticSocketDataProvider refused_data;
1267 refused_data.set_connect_data(refused_connect);
1268 socket_factory_.AddSocketDataProvider(&refused_data);
1269
1270 CreateSessionWithNextProtos();
1271 AlternativeService alternative_service(QUIC, alternative);
bnc7dc7e1b42015-07-28 14:43:121272 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
bnccb7ff3c2015-05-21 20:51:551273 session_->http_server_properties()->SetAlternativeService(
bnc7dc7e1b42015-07-28 14:43:121274 origin, alternative_service, 1.0, expiration);
bnccb7ff3c2015-05-21 20:51:551275 scoped_ptr<HttpNetworkTransaction> trans(
1276 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1277 TestCompletionCallback callback;
1278 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1279 EXPECT_EQ(ERR_IO_PENDING, rv);
1280 rv = callback.WaitForResult();
1281 if (valid) {
1282 EXPECT_EQ(OK, rv);
1283 CheckWasQuicResponse(trans);
1284 CheckResponsePort(trans, 443);
1285 CheckResponseData(trans, "hello!");
1286 } else {
1287 EXPECT_EQ(ERR_CONNECTION_REFUSED, rv);
1288 }
1289 }
1290};
1291
1292INSTANTIATE_TEST_CASE_P(Version,
1293 QuicAltSvcCertificateVerificationTest,
1294 ::testing::ValuesIn(QuicSupportedVersions()));
1295
1296TEST_P(QuicAltSvcCertificateVerificationTest,
1297 RequestSucceedsWithValidCertificate) {
1298 Run(true);
1299}
1300
1301TEST_P(QuicAltSvcCertificateVerificationTest,
1302 RequestFailsWithInvalidCertificate) {
1303 Run(false);
1304}
1305
[email protected]1e960032013-12-20 19:00:201306TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) {
[email protected]dda75ab2013-06-22 22:43:301307 crypto_client_stream_factory_.set_handshake_mode(
1308 MockCryptoClientStream::COLD_START);
1309
1310 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561311 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
1312 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.com\r\n"),
1313 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")};
[email protected]dda75ab2013-06-22 22:43:301314
1315 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561316 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1317 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1318 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]dda75ab2013-06-22 22:43:301319
1320 DeterministicMockClientSocketFactory socket_factory;
1321
1322 DeterministicSocketData http_data(http_reads, arraysize(http_reads),
1323 http_writes, arraysize(http_writes));
1324 socket_factory.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561325 socket_factory.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301326
1327 // The QUIC transaction will not be allowed to complete.
1328 MockWrite quic_writes[] = {
1329 MockWrite(ASYNC, ERR_IO_PENDING, 0)
1330 };
1331 MockRead quic_reads[] = {
1332 MockRead(ASYNC, ERR_IO_PENDING, 1),
1333 };
1334 DeterministicSocketData quic_data(quic_reads, arraysize(quic_reads),
1335 quic_writes, arraysize(quic_writes));
1336 socket_factory.AddSocketDataProvider(&quic_data);
1337
1338 // The HTTP transaction will complete.
1339 DeterministicSocketData http_data2(http_reads, arraysize(http_reads),
1340 http_writes, arraysize(http_writes));
1341 socket_factory.AddSocketDataProvider(&http_data2);
rchf114d982015-10-21 01:34:561342 socket_factory.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301343
[email protected]d7599122014-05-24 03:37:231344 CreateSessionWithFactory(&socket_factory, true);
[email protected]dda75ab2013-06-22 22:43:301345
1346 // Run the first request.
1347 http_data.StopAfter(arraysize(http_reads) + arraysize(http_writes));
1348 SendRequestAndExpectHttpResponse("hello world");
rch37de576c2015-05-17 20:28:171349 ASSERT_TRUE(http_data.AllReadDataConsumed());
1350 ASSERT_TRUE(http_data.AllWriteDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301351
1352 // Now run the second request in which the QUIC socket hangs,
1353 // and verify the the transaction continues over HTTP.
1354 http_data2.StopAfter(arraysize(http_reads) + arraysize(http_writes));
1355 SendRequestAndExpectHttpResponse("hello world");
1356
rch37de576c2015-05-17 20:28:171357 ASSERT_TRUE(http_data2.AllReadDataConsumed());
1358 ASSERT_TRUE(http_data2.AllWriteDataConsumed());
1359 ASSERT_TRUE(!quic_data.AllReadDataConsumed());
1360 ASSERT_TRUE(!quic_data.AllWriteDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301361}
1362
[email protected]1e960032013-12-20 19:00:201363TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
[email protected]1e960032013-12-20 19:00:201364 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031365 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051366 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561367 GetRequestHeaders("GET", "https", "/")));
[email protected]92bf17c2014-03-03 21:14:031368 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051369 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:031370 GetResponseHeaders("200 OK")));
1371 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051372 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031373 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501374 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
[email protected]1e960032013-12-20 19:00:201375 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
[email protected]8ba81212013-05-03 13:11:481376
rcha5399e02015-04-21 19:32:041377 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]8ba81212013-05-03 13:11:481378
[email protected]3a120a6b2013-06-25 01:08:271379 // The non-alternate protocol job needs to hang in order to guarantee that
1380 // the alternate-protocol job will "win".
[email protected]dda75ab2013-06-22 22:43:301381 AddHangingNonAlternateProtocolSocketData();
1382
[email protected]d7599122014-05-24 03:37:231383 CreateSessionWithNextProtos();
[email protected]aa9b14d2013-05-10 23:45:191384 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1385 SendRequestAndExpectQuicResponse("hello!");
[email protected]8ba81212013-05-03 13:11:481386}
1387
[email protected]1e960032013-12-20 19:00:201388TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
[email protected]1e960032013-12-20 19:00:201389 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031390 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051391 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561392 GetRequestHeaders("GET", "https", "/")));
[email protected]92bf17c2014-03-03 21:14:031393 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051394 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:031395 GetResponseHeaders("200 OK")));
1396 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051397 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031398 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501399 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
[email protected]1e960032013-12-20 19:00:201400 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
rcha5399e02015-04-21 19:32:041401 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]3a120a6b2013-06-25 01:08:271402
1403 // In order for a new QUIC session to be established via alternate-protocol
1404 // without racing an HTTP connection, we need the host resolution to happen
1405 // synchronously.
1406 host_resolver_.set_synchronous_mode(true);
rchf114d982015-10-21 01:34:561407 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1408 "");
1409 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
[email protected]3a120a6b2013-06-25 01:08:271410 AddressList address;
[email protected]5109c1952013-08-20 18:44:101411 host_resolver_.Resolve(info,
1412 DEFAULT_PRIORITY,
1413 &address,
1414 CompletionCallback(),
rtennetibe635732014-10-02 22:51:421415 nullptr,
[email protected]3a120a6b2013-06-25 01:08:271416 net_log_.bound());
1417
[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;
1449 host_resolver_.Resolve(info,
1450 DEFAULT_PRIORITY,
1451 &address,
1452 CompletionCallback(),
rtennetibe635732014-10-02 22:51:421453 nullptr,
[email protected]0fc924b2014-03-31 04:34:151454 net_log_.bound());
1455
rchf114d982015-10-21 01:34:561456 request_.url = GURL("http://mail.example.com/");
[email protected]d7599122014-05-24 03:37:231457 CreateSessionWithNextProtos();
[email protected]0fc924b2014-03-31 04:34:151458 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1459 SendRequestAndExpectHttpResponse("hello world");
1460}
1461
[email protected]1e960032013-12-20 19:00:201462TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
[email protected]1e960032013-12-20 19:00:201463 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031464 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051465 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561466 GetRequestHeaders("GET", "https", "/")));
[email protected]92bf17c2014-03-03 21:14:031467 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051468 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:031469 GetResponseHeaders("200 OK")));
1470 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051471 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031472 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501473 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
rcha5399e02015-04-21 19:32:041474 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]11c05872013-08-20 02:04:121475
1476 // The non-alternate protocol job needs to hang in order to guarantee that
1477 // the alternate-protocol job will "win".
1478 AddHangingNonAlternateProtocolSocketData();
1479
1480 // In order for a new QUIC session to be established via alternate-protocol
1481 // without racing an HTTP connection, we need the host resolution to happen
1482 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1483 // connection to the the server, in this test we require confirmation
1484 // before encrypting so the HTTP job will still start.
1485 host_resolver_.set_synchronous_mode(true);
rchf114d982015-10-21 01:34:561486 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1487 "");
1488 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
[email protected]11c05872013-08-20 02:04:121489 AddressList address;
[email protected]5109c1952013-08-20 18:44:101490 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address,
rtennetibe635732014-10-02 22:51:421491 CompletionCallback(), nullptr, net_log_.bound());
[email protected]11c05872013-08-20 02:04:121492
[email protected]d7599122014-05-24 03:37:231493 CreateSessionWithNextProtos();
[email protected]11c05872013-08-20 02:04:121494 session_->quic_stream_factory()->set_require_confirmation(true);
1495 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1496
1497 scoped_ptr<HttpNetworkTransaction> trans(
1498 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1499 TestCompletionCallback callback;
1500 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1501 EXPECT_EQ(ERR_IO_PENDING, rv);
1502
1503 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1504 QuicSession::HANDSHAKE_CONFIRMED);
1505 EXPECT_EQ(OK, callback.WaitForResult());
rchb27683c2015-07-29 23:53:501506
1507 CheckWasQuicResponse(trans);
1508 CheckResponseData(trans, "hello!");
[email protected]11c05872013-08-20 02:04:121509}
1510
[email protected]1e960032013-12-20 19:00:201511TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
[email protected]3316d422013-05-03 21:45:301512 // Alternate-protocol job
1513 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1));
1514 MockRead quic_reads[] = {
rchb27683c2015-07-29 23:53:501515 MockRead(ASYNC, close->data(), close->length()),
1516 MockRead(ASYNC, ERR_IO_PENDING), // No more data to read
1517 MockRead(ASYNC, OK), // EOF
[email protected]3316d422013-05-03 21:45:301518 };
1519 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421520 nullptr, 0);
[email protected]3316d422013-05-03 21:45:301521 socket_factory_.AddSocketDataProvider(&quic_data);
1522
1523 // Main job which will succeed even though the alternate job fails.
1524 MockRead http_reads[] = {
1525 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
1526 MockRead("hello from http"),
1527 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1528 MockRead(ASYNC, OK)
1529 };
1530
1531 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421532 nullptr, 0);
[email protected]3316d422013-05-03 21:45:301533 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561534 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]3316d422013-05-03 21:45:301535
[email protected]d7599122014-05-24 03:37:231536 CreateSessionWithNextProtos();
[email protected]aa9b14d2013-05-10 23:45:191537 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1538 SendRequestAndExpectHttpResponse("hello from http");
1539 ExpectBrokenAlternateProtocolMapping();
[email protected]3316d422013-05-03 21:45:301540}
1541
[email protected]1e960032013-12-20 19:00:201542TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
[email protected]d03a66d2013-05-06 12:55:591543 // Alternate-protocol job
1544 MockRead quic_reads[] = {
1545 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
1546 };
1547 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421548 nullptr, 0);
[email protected]d03a66d2013-05-06 12:55:591549 socket_factory_.AddSocketDataProvider(&quic_data);
1550
1551 // Main job which will succeed even though the alternate job fails.
1552 MockRead http_reads[] = {
1553 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
1554 MockRead("hello from http"),
1555 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1556 MockRead(ASYNC, OK)
1557 };
1558
1559 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421560 nullptr, 0);
[email protected]d03a66d2013-05-06 12:55:591561 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561562 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]d03a66d2013-05-06 12:55:591563
[email protected]d7599122014-05-24 03:37:231564 CreateSessionWithNextProtos();
[email protected]d03a66d2013-05-06 12:55:591565
[email protected]aa9b14d2013-05-10 23:45:191566 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1567 SendRequestAndExpectHttpResponse("hello from http");
1568 ExpectBrokenAlternateProtocolMapping();
[email protected]d03a66d2013-05-06 12:55:591569}
1570
[email protected]00c159f2014-05-21 22:38:161571TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) {
[email protected]eb71ab62014-05-23 07:57:531572 // Alternate-protocol job will fail when the session attempts to read.
[email protected]00c159f2014-05-21 22:38:161573 MockRead quic_reads[] = {
1574 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
1575 };
1576 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421577 nullptr, 0);
[email protected]00c159f2014-05-21 22:38:161578 socket_factory_.AddSocketDataProvider(&quic_data);
1579
[email protected]eb71ab62014-05-23 07:57:531580 // Main job will also fail.
[email protected]00c159f2014-05-21 22:38:161581 MockRead http_reads[] = {
1582 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
1583 };
1584
1585 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421586 nullptr, 0);
[email protected]00c159f2014-05-21 22:38:161587 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED));
1588 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561589 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]00c159f2014-05-21 22:38:161590
[email protected]d7599122014-05-24 03:37:231591 CreateSessionWithNextProtos();
[email protected]00c159f2014-05-21 22:38:161592
1593 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1594 scoped_ptr<HttpNetworkTransaction> trans(
1595 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1596 TestCompletionCallback callback;
1597 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1598 EXPECT_EQ(ERR_IO_PENDING, rv);
1599 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult());
1600 ExpectQuicAlternateProtocolMapping();
1601}
1602
[email protected]1e960032013-12-20 19:00:201603TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
[email protected]77c6c162013-08-17 02:57:451604 // Alternate-protocol job
1605 MockRead quic_reads[] = {
1606 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
1607 };
1608 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421609 nullptr, 0);
[email protected]77c6c162013-08-17 02:57:451610 socket_factory_.AddSocketDataProvider(&quic_data);
1611
1612 AddHangingNonAlternateProtocolSocketData();
1613
[email protected]c92c1b52014-05-31 04:16:061614 // Second Alternate-protocol job which will race with the TCP job.
1615 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421616 nullptr, 0);
[email protected]c92c1b52014-05-31 04:16:061617 socket_factory_.AddSocketDataProvider(&quic_data2);
1618
[email protected]4d283b32013-10-17 12:57:271619 // Final job that will proceed when the QUIC job fails.
1620 MockRead http_reads[] = {
1621 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
1622 MockRead("hello from http"),
1623 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1624 MockRead(ASYNC, OK)
1625 };
1626
1627 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421628 nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271629 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561630 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d283b32013-10-17 12:57:271631
[email protected]d7599122014-05-24 03:37:231632 CreateSessionWithNextProtos();
[email protected]77c6c162013-08-17 02:57:451633
1634 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1635
[email protected]4d283b32013-10-17 12:57:271636 SendRequestAndExpectHttpResponse("hello from http");
[email protected]77c6c162013-08-17 02:57:451637
1638 ExpectBrokenAlternateProtocolMapping();
[email protected]4d283b32013-10-17 12:57:271639
rch37de576c2015-05-17 20:28:171640 EXPECT_TRUE(quic_data.AllReadDataConsumed());
1641 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
[email protected]77c6c162013-08-17 02:57:451642}
1643
[email protected]93b31772014-06-19 08:03:351644TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) {
[email protected]65768442014-06-06 23:37:031645 // Alternate-protocol job
1646 MockRead quic_reads[] = {
1647 MockRead(ASYNC, ERR_IO_PENDING),
1648 };
1649 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421650 nullptr, 0);
[email protected]65768442014-06-06 23:37:031651 socket_factory_.AddSocketDataProvider(&quic_data);
1652
1653 // Main job that will proceed when the QUIC job fails.
1654 MockRead http_reads[] = {
1655 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
1656 MockRead("hello from http"),
1657 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1658 MockRead(ASYNC, OK)
1659 };
1660
1661 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421662 nullptr, 0);
[email protected]65768442014-06-06 23:37:031663 socket_factory_.AddSocketDataProvider(&http_data);
1664
1665 CreateSessionWithNextProtos();
1666
1667 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1668
1669 SendRequestAndExpectHttpResponse("hello from http");
1670}
1671
[email protected]eb71ab62014-05-23 07:57:531672TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
[email protected]4d590c9c2014-05-02 05:14:331673 // Alternate-protocol job will fail before creating a QUIC session.
rtennetibe635732014-10-02 22:51:421674 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0);
[email protected]4d590c9c2014-05-02 05:14:331675 quic_data.set_connect_data(MockConnect(SYNCHRONOUS,
1676 ERR_INTERNET_DISCONNECTED));
1677 socket_factory_.AddSocketDataProvider(&quic_data);
1678
1679 // Main job which will succeed even though the alternate job fails.
1680 MockRead http_reads[] = {
1681 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
1682 MockRead("hello from http"),
1683 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1684 MockRead(ASYNC, OK)
1685 };
1686
1687 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421688 nullptr, 0);
[email protected]4d590c9c2014-05-02 05:14:331689 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561690 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d590c9c2014-05-02 05:14:331691
[email protected]d7599122014-05-24 03:37:231692 CreateSessionWithNextProtos();
[email protected]4d590c9c2014-05-02 05:14:331693 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1694 SendRequestAndExpectHttpResponse("hello from http");
[email protected]eb71ab62014-05-23 07:57:531695
1696 ExpectBrokenAlternateProtocolMapping();
[email protected]4d590c9c2014-05-02 05:14:331697}
1698
[email protected]4fee9672014-01-08 14:47:151699TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
[email protected]4fee9672014-01-08 14:47:151700 MockQuicData mock_quic_data;
rcha5399e02015-04-21 19:32:041701 mock_quic_data.AddSynchronousRead(ConstructConnectionClosePacket(1));
[email protected]92bf17c2014-03-03 21:14:031702 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051703 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561704 GetRequestHeaders("GET", "https", "/")));
[email protected]92bf17c2014-03-03 21:14:031705 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rcha5399e02015-04-21 19:32:041706 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4fee9672014-01-08 14:47:151707
1708 // When the QUIC connection fails, we will try the request again over HTTP.
1709 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561710 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1711 MockRead("hello world"),
1712 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1713 MockRead(ASYNC, OK)};
[email protected]4fee9672014-01-08 14:47:151714
1715 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421716 nullptr, 0);
[email protected]4fee9672014-01-08 14:47:151717 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561718 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4fee9672014-01-08 14:47:151719
1720 // In order for a new QUIC session to be established via alternate-protocol
1721 // without racing an HTTP connection, we need the host resolution to happen
1722 // synchronously.
1723 host_resolver_.set_synchronous_mode(true);
rchf114d982015-10-21 01:34:561724 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1725 "");
1726 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
[email protected]4fee9672014-01-08 14:47:151727 AddressList address;
1728 host_resolver_.Resolve(info,
1729 DEFAULT_PRIORITY,
1730 &address,
1731 CompletionCallback(),
rtennetibe635732014-10-02 22:51:421732 nullptr,
[email protected]4fee9672014-01-08 14:47:151733 net_log_.bound());
1734
[email protected]d7599122014-05-24 03:37:231735 CreateSessionWithNextProtos();
[email protected]4fee9672014-01-08 14:47:151736 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1737 SendRequestAndExpectHttpResponse("hello world");
1738}
1739
bnc508835902015-05-12 20:10:291740TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) {
bncb07c05532015-05-14 19:07:201741 maker_.set_hostname("www.example.org");
tbansalc8a94ea2015-11-02 23:58:511742 EXPECT_FALSE(rtt_observer_.rtt_notification_received());
bnc508835902015-05-12 20:10:291743 MockQuicData mock_quic_data;
1744 mock_quic_data.AddWrite(
1745 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1746 GetRequestHeaders("GET", "https", "/")));
1747 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1748 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1749 mock_quic_data.AddRead(
1750 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1751 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501752 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
bnc508835902015-05-12 20:10:291753 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1754
bncb07c05532015-05-14 19:07:201755 request_.url = GURL("https://www.example.org:443");
bnc508835902015-05-12 20:10:291756 AddHangingNonAlternateProtocolSocketData();
1757 CreateSessionWithNextProtos();
1758 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
1759 SendRequestAndExpectQuicResponse("hello!");
tbansalc8a94ea2015-11-02 23:58:511760 EXPECT_TRUE(rtt_observer_.rtt_notification_received());
bnc508835902015-05-12 20:10:291761}
1762
[email protected]61a527782013-02-21 03:58:001763} // namespace test
1764} // namespace net