blob: bc9f397badefe464dc992b5eb53c7314c2ea3f97 [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"
[email protected]f2cb3cf2013-03-21 01:40:5317#include "net/dns/mock_host_resolver.h"
[email protected]61a527782013-02-21 03:58:0018#include "net/http/http_auth_handler_factory.h"
19#include "net/http/http_network_session.h"
20#include "net/http/http_network_transaction.h"
21#include "net/http/http_server_properties_impl.h"
22#include "net/http/http_stream.h"
23#include "net/http/http_stream_factory.h"
[email protected]c41737d2014-05-14 07:47:1924#include "net/http/http_transaction_test_util.h"
[email protected]b1c988b2013-06-13 06:48:1125#include "net/http/transport_security_state.h"
vishal.b62985ca92015-04-17 08:45:5126#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4627#include "net/log/test_net_log_entry.h"
28#include "net/log/test_net_log_util.h"
[email protected]61a527782013-02-21 03:58:0029#include "net/proxy/proxy_config_service_fixed.h"
30#include "net/proxy/proxy_resolver.h"
31#include "net/proxy/proxy_service.h"
bnc508835902015-05-12 20:10:2932#include "net/quic/crypto/proof_verifier_chromium.h"
[email protected]61a527782013-02-21 03:58:0033#include "net/quic/crypto/quic_decrypter.h"
34#include "net/quic/crypto/quic_encrypter.h"
35#include "net/quic/quic_framer.h"
[email protected]24e5bc52013-09-18 15:36:5836#include "net/quic/quic_http_utils.h"
[email protected]ed3fc15d2013-03-08 18:37:4437#include "net/quic/test_tools/crypto_test_utils.h"
[email protected]61a527782013-02-21 03:58:0038#include "net/quic/test_tools/mock_clock.h"
[email protected]e8ff26842013-03-22 21:02:0539#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
[email protected]61a527782013-02-21 03:58:0040#include "net/quic/test_tools/mock_random.h"
[email protected]1e960032013-12-20 19:00:2041#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]61a527782013-02-21 03:58:0042#include "net/quic/test_tools/quic_test_utils.h"
43#include "net/socket/client_socket_factory.h"
44#include "net/socket/mock_client_socket_pool_manager.h"
45#include "net/socket/socket_test_util.h"
46#include "net/socket/ssl_client_socket.h"
47#include "net/spdy/spdy_frame_builder.h"
48#include "net/spdy/spdy_framer.h"
[email protected]536fd0b2013-03-14 17:41:5749#include "net/ssl/ssl_config_service_defaults.h"
bnc508835902015-05-12 20:10:2950#include "net/test/cert_test_util.h"
[email protected]61a527782013-02-21 03:58:0051#include "testing/gtest/include/gtest/gtest.h"
52#include "testing/platform_test.h"
53
bnc508835902015-05-12 20:10:2954namespace net {
55namespace test {
[email protected]61a527782013-02-21 03:58:0056
57namespace {
58
rchf114d982015-10-21 01:34:5659static const char kQuicAlternateProtocolHeader[] =
[email protected]6d1b4ed2013-07-10 03:57:5460 "Alternate-Protocol: 443:quic\r\n\r\n";
rchf114d982015-10-21 01:34:5661static const char kQuicAlternateProtocol50pctHeader[] =
62 "Alternate-Protocol: 443:quic,p=.5\r\n\r\n";
63static const char kQuicAlternateProtocolDifferentPortHeader[] =
64 "Alternate-Protocol: 137:quic\r\n\r\n";
65static const char kQuicAlternativeServiceHeader[] =
bncc958faa2015-07-31 18:14:5266 "Alt-Svc: quic=\":443\"\r\n\r\n";
rchf114d982015-10-21 01:34:5667static const char kQuicAlternativeService50pctHeader[] =
68 "Alt-Svc: quic=\":443\";p=\".5\"\r\n\r\n";
69static const char kQuicAlternativeServiceDifferentPortHeader[] =
70 "Alt-Svc: quic=\":137\"\r\n\r\n";
[email protected]1e960032013-12-20 19:00:2071
rchf114d982015-10-21 01:34:5672const char kDefaultServerHostName[] = "mail.example.com";
bncb07c05532015-05-14 19:07:2073
[email protected]61a527782013-02-21 03:58:0074} // namespace
75
[email protected]1e960032013-12-20 19:00:2076// Helper class to encapsulate MockReads and MockWrites for QUIC.
77// Simplify ownership issues and the interaction with the MockSocketFactory.
78class MockQuicData {
79 public:
rtennetia004d332015-08-28 06:44:5780 MockQuicData() : packet_number_(0) {}
rcha5399e02015-04-21 19:32:0481
[email protected]1e960032013-12-20 19:00:2082 ~MockQuicData() {
83 STLDeleteElements(&packets_);
84 }
85
rcha5399e02015-04-21 19:32:0486 void AddSynchronousRead(scoped_ptr<QuicEncryptedPacket> packet) {
[email protected]1e960032013-12-20 19:00:2087 reads_.push_back(MockRead(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:5788 packet_number_++));
[email protected]1e960032013-12-20 19:00:2089 packets_.push_back(packet.release());
90 }
91
rcha5399e02015-04-21 19:32:0492 void AddRead(scoped_ptr<QuicEncryptedPacket> packet) {
93 reads_.push_back(
rtennetia004d332015-08-28 06:44:5794 MockRead(ASYNC, packet->data(), packet->length(), packet_number_++));
rcha5399e02015-04-21 19:32:0495 packets_.push_back(packet.release());
96 }
97
[email protected]1e960032013-12-20 19:00:2098 void AddRead(IoMode mode, int rv) {
rtennetia004d332015-08-28 06:44:5799 reads_.push_back(MockRead(mode, rv, packet_number_++));
[email protected]1e960032013-12-20 19:00:20100 }
101
102 void AddWrite(scoped_ptr<QuicEncryptedPacket> packet) {
103 writes_.push_back(MockWrite(SYNCHRONOUS, packet->data(), packet->length(),
rtennetia004d332015-08-28 06:44:57104 packet_number_++));
[email protected]1e960032013-12-20 19:00:20105 packets_.push_back(packet.release());
106 }
107
rcha5399e02015-04-21 19:32:04108 void AddSocketDataToFactory(MockClientSocketFactory* factory) {
rtennetibe635732014-10-02 22:51:42109 MockRead* reads = reads_.empty() ? nullptr : &reads_[0];
110 MockWrite* writes = writes_.empty() ? nullptr : &writes_[0];
rcha5399e02015-04-21 19:32:04111 socket_data_.reset(
112 new SequencedSocketData(reads, reads_.size(), writes, writes_.size()));
[email protected]1e960032013-12-20 19:00:20113 factory->AddSocketDataProvider(socket_data_.get());
114 }
115
rchb27683c2015-07-29 23:53:50116 void CompleteRead() { socket_data_->CompleteRead(); }
117
[email protected]1e960032013-12-20 19:00:20118 private:
119 std::vector<QuicEncryptedPacket*> packets_;
120 std::vector<MockWrite> writes_;
121 std::vector<MockRead> reads_;
rtennetia004d332015-08-28 06:44:57122 size_t packet_number_;
rchb27683c2015-07-29 23:53:50123 scoped_ptr<SequencedSocketData> socket_data_;
[email protected]1e960032013-12-20 19:00:20124};
125
tbansal7cec3812015-02-05 21:25:12126class ProxyHeadersHandler {
127 public:
128 ProxyHeadersHandler() : was_called_(false) {}
129
130 bool was_called() { return was_called_; }
131
132 void OnBeforeProxyHeadersSent(const ProxyInfo& proxy_info,
133 HttpRequestHeaders* request_headers) {
134 was_called_ = true;
135 }
136
137 private:
138 bool was_called_;
139};
140
tbansalfdf5665b2015-09-21 22:46:40141class TestSocketPerformanceWatcher : public SocketPerformanceWatcher {
142 public:
143 TestSocketPerformanceWatcher()
144 : received_updated_rtt_available_notification_(false) {}
145
146 ~TestSocketPerformanceWatcher() override {}
147
148 void OnUpdatedRTTAvailable(const base::TimeDelta& rtt) override {
149 received_updated_rtt_available_notification_ = true;
150 }
151
152 bool received_updated_rtt_available_notification() const {
153 return received_updated_rtt_available_notification_;
154 }
155
156 private:
157 bool received_updated_rtt_available_notification_;
158 DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcher);
159};
160
161class TestNetworkQualityEstimator : public NetworkQualityEstimator {
162 public:
163 TestNetworkQualityEstimator()
164 : NetworkQualityEstimator(scoped_ptr<net::ExternalEstimateProvider>(),
165 std::map<std::string, std::string>()) {}
166
167 ~TestNetworkQualityEstimator() override {}
168
169 scoped_ptr<SocketPerformanceWatcher> CreateUDPSocketPerformanceWatcher()
170 const override {
171 TestSocketPerformanceWatcher* watcher = new TestSocketPerformanceWatcher();
172 watchers_.push_back(watcher);
173 return scoped_ptr<TestSocketPerformanceWatcher>(watcher);
174 }
175
176 scoped_ptr<SocketPerformanceWatcher> CreateTCPSocketPerformanceWatcher()
177 const override {
178 NOTIMPLEMENTED();
179 return nullptr;
180 }
181
182 bool IsRTTAvailableNotificationReceived() const {
183 for (const auto& watcher : watchers_)
184 if (watcher->received_updated_rtt_available_notification())
185 return true;
186 return false;
187 }
188
189 size_t GetWatchersCreated() const { return watchers_.size(); }
190
191 private:
192 mutable std::vector<TestSocketPerformanceWatcher*> watchers_;
193 DISALLOW_COPY_AND_ASSIGN(TestNetworkQualityEstimator);
194};
195
[email protected]1e960032013-12-20 19:00:20196class QuicNetworkTransactionTest
197 : public PlatformTest,
[email protected]5d03bbd2014-03-07 16:19:16198 public ::testing::WithParamInterface<QuicVersion> {
[email protected]61a527782013-02-21 03:58:00199 protected:
[email protected]1c04f9522013-02-21 20:32:43200 QuicNetworkTransactionTest()
rtenneti4b06ae72014-08-26 03:43:43201 : clock_(new MockClock),
bncb07c05532015-05-14 19:07:20202 maker_(GetParam(), 0, clock_, kDefaultServerHostName),
tbansalfdf5665b2015-09-21 22:46:40203 test_network_quality_estimator_(new TestNetworkQualityEstimator()),
[email protected]1c04f9522013-02-21 20:32:43204 ssl_config_service_(new SSLConfigServiceDefaults),
205 proxy_service_(ProxyService::CreateDirect()),
206 auth_handler_factory_(
[email protected]dda75ab2013-06-22 22:43:30207 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
[email protected]457d6952013-12-13 09:24:58208 random_generator_(0),
rchf114d982015-10-21 01:34:56209 hanging_data_(nullptr, 0, nullptr, 0),
210 ssl_data_(ASYNC, OK) {
[email protected]aa9b14d2013-05-10 23:45:19211 request_.method = "GET";
rchf114d982015-10-21 01:34:56212 std::string url("https://");
bncb07c05532015-05-14 19:07:20213 url.append(kDefaultServerHostName);
214 request_.url = GURL(url);
[email protected]aa9b14d2013-05-10 23:45:19215 request_.load_flags = 0;
[email protected]98a9d1252014-04-04 00:43:59216 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
rchf114d982015-10-21 01:34:56217
218 scoped_refptr<X509Certificate> cert(
219 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
220 verify_details_.cert_verify_result.verified_cert = cert;
221 verify_details_.cert_verify_result.is_issued_by_known_root = true;
222 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
[email protected]1c04f9522013-02-21 20:32:43223 }
[email protected]61a527782013-02-21 03:58:00224
dcheng67be2b1f2014-10-27 21:47:29225 void SetUp() override {
[email protected]61a527782013-02-21 03:58:00226 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34227 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00228 }
229
dcheng67be2b1f2014-10-27 21:47:29230 void TearDown() override {
[email protected]61a527782013-02-21 03:58:00231 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
232 // Empty the current queue.
[email protected]2da659e2013-05-23 20:51:34233 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00234 PlatformTest::TearDown();
235 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
[email protected]2da659e2013-05-23 20:51:34236 base::MessageLoop::current()->RunUntilIdle();
[email protected]61a527782013-02-21 03:58:00237 }
238
[email protected]3316d422013-05-03 21:45:30239 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
rtennetia004d332015-08-28 06:44:57240 QuicPacketNumber num) {
[email protected]1e960032013-12-20 19:00:20241 return maker_.MakeConnectionClosePacket(num);
[email protected]3316d422013-05-03 21:45:30242 }
243
[email protected]61a527782013-02-21 03:58:00244 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket(
rtennetia004d332015-08-28 06:44:57245 QuicPacketNumber largest_received,
246 QuicPacketNumber least_unacked) {
[email protected]1e960032013-12-20 19:00:20247 return maker_.MakeAckPacket(2, largest_received, least_unacked, true);
248 }
[email protected]61a527782013-02-21 03:58:00249
[email protected]1e960032013-12-20 19:00:20250 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
251 const std::string& scheme,
252 const std::string& path) {
253 return maker_.GetRequestHeaders(method, scheme, path);
[email protected]61a527782013-02-21 03:58:00254 }
255
[email protected]1e960032013-12-20 19:00:20256 SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
257 return maker_.GetResponseHeaders(status);
[email protected]61a527782013-02-21 03:58:00258 }
259
[email protected]1e960032013-12-20 19:00:20260 scoped_ptr<QuicEncryptedPacket> ConstructDataPacket(
rtennetia004d332015-08-28 06:44:57261 QuicPacketNumber packet_number,
[email protected]98b20ce2013-05-10 05:55:26262 QuicStreamId stream_id,
[email protected]e8ff26842013-03-22 21:02:05263 bool should_include_version,
[email protected]61a527782013-02-21 03:58:00264 bool fin,
265 QuicStreamOffset offset,
266 base::StringPiece data) {
rtennetia004d332015-08-28 06:44:57267 return maker_.MakeDataPacket(packet_number, stream_id,
268 should_include_version, fin, offset, data);
[email protected]61a527782013-02-21 03:58:00269 }
270
[email protected]1e960032013-12-20 19:00:20271 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
rtennetia004d332015-08-28 06:44:57272 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20273 QuicStreamId stream_id,
274 bool should_include_version,
275 bool fin,
276 const SpdyHeaderBlock& headers) {
rtennetif4bdb542015-01-21 14:33:05277 QuicPriority priority =
278 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
rtennetia004d332015-08-28 06:44:57279 return maker_.MakeRequestHeadersPacket(packet_number, stream_id,
rtennetif4bdb542015-01-21 14:33:05280 should_include_version, fin,
281 priority, headers);
[email protected]61a527782013-02-21 03:58:00282 }
283
[email protected]1e960032013-12-20 19:00:20284 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
rtennetia004d332015-08-28 06:44:57285 QuicPacketNumber packet_number,
[email protected]1e960032013-12-20 19:00:20286 QuicStreamId stream_id,
287 bool should_include_version,
288 bool fin,
289 const SpdyHeaderBlock& headers) {
290 return maker_.MakeResponseHeadersPacket(
rtennetia004d332015-08-28 06:44:57291 packet_number, stream_id, should_include_version, fin, headers);
[email protected]61a527782013-02-21 03:58:00292 }
293
294 void CreateSession() {
[email protected]d7599122014-05-24 03:37:23295 CreateSessionWithFactory(&socket_factory_, false);
[email protected]dda75ab2013-06-22 22:43:30296 }
297
[email protected]d7599122014-05-24 03:37:23298 void CreateSessionWithNextProtos() {
299 CreateSessionWithFactory(&socket_factory_, true);
300 }
301
302 // If |use_next_protos| is true, enables SPDY and QUIC.
303 void CreateSessionWithFactory(ClientSocketFactory* socket_factory,
304 bool use_next_protos) {
[email protected]4dca587c2013-03-07 16:54:47305 params_.enable_quic = true;
306 params_.quic_clock = clock_;
307 params_.quic_random = &random_generator_;
[email protected]dda75ab2013-06-22 22:43:30308 params_.client_socket_factory = socket_factory;
[email protected]e8ff26842013-03-22 21:02:05309 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43310 params_.host_resolver = &host_resolver_;
311 params_.cert_verifier = &cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11312 params_.transport_security_state = &transport_security_state_;
tbansalfdf5665b2015-09-21 22:46:40313 params_.socket_performance_watcher_factory =
314 test_network_quality_estimator_.get();
[email protected]1c04f9522013-02-21 20:32:43315 params_.proxy_service = proxy_service_.get();
316 params_.ssl_config_service = ssl_config_service_.get();
317 params_.http_auth_handler_factory = auth_handler_factory_.get();
bnc6be245c12015-05-15 11:24:07318 params_.http_server_properties = http_server_properties_.GetWeakPtr();
[email protected]1e960032013-12-20 19:00:20319 params_.quic_supported_versions = SupportedVersions(GetParam());
[email protected]61a527782013-02-21 03:58:00320
[email protected]d7599122014-05-24 03:37:23321 if (use_next_protos) {
bnc55ff9da2015-08-19 18:42:35322 params_.use_alternative_services = true;
bnc3bb2c232014-11-07 20:26:39323 params_.next_protos = NextProtosWithSpdyAndQuic(true, true);
[email protected]d7599122014-05-24 03:37:23324 }
325
mmenkee65e7af2015-10-13 17:16:42326 session_.reset(new HttpNetworkSession(params_));
[email protected]11c05872013-08-20 02:04:12327 session_->quic_stream_factory()->set_require_confirmation(false);
rch185ebee2015-07-14 23:56:22328 ASSERT_EQ(params_.quic_socket_receive_buffer_size,
329 session_->quic_stream_factory()->socket_receive_buffer_size());
[email protected]61a527782013-02-21 03:58:00330 }
331
[email protected]aa9b14d2013-05-10 23:45:19332 void CheckWasQuicResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
333 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42334 ASSERT_TRUE(response != nullptr);
335 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19336 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
337 EXPECT_TRUE(response->was_fetched_via_spdy);
338 EXPECT_TRUE(response->was_npn_negotiated);
339 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3,
340 response->connection_info);
341 }
342
bnc62a44f022015-04-02 15:59:41343 void CheckResponsePort(const scoped_ptr<HttpNetworkTransaction>& trans,
344 uint16 port) {
345 const HttpResponseInfo* response = trans->GetResponseInfo();
346 ASSERT_TRUE(response != nullptr);
347 EXPECT_EQ(port, response->socket_address.port());
348 }
349
[email protected]aa9b14d2013-05-10 23:45:19350 void CheckWasHttpResponse(const scoped_ptr<HttpNetworkTransaction>& trans) {
351 const HttpResponseInfo* response = trans->GetResponseInfo();
rtennetibe635732014-10-02 22:51:42352 ASSERT_TRUE(response != nullptr);
353 ASSERT_TRUE(response->headers.get() != nullptr);
[email protected]aa9b14d2013-05-10 23:45:19354 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
355 EXPECT_FALSE(response->was_fetched_via_spdy);
356 EXPECT_FALSE(response->was_npn_negotiated);
357 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1,
358 response->connection_info);
359 }
360
bncffc2fdf2015-05-14 18:29:49361 void CheckResponseData(const scoped_ptr<HttpNetworkTransaction>& trans,
[email protected]aa9b14d2013-05-10 23:45:19362 const std::string& expected) {
363 std::string response_data;
bncffc2fdf2015-05-14 18:29:49364 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
[email protected]aa9b14d2013-05-10 23:45:19365 EXPECT_EQ(expected, response_data);
366 }
367
bncffc2fdf2015-05-14 18:29:49368 void RunTransaction(const scoped_ptr<HttpNetworkTransaction>& trans) {
[email protected]aa9b14d2013-05-10 23:45:19369 TestCompletionCallback callback;
370 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
371 EXPECT_EQ(ERR_IO_PENDING, rv);
372 EXPECT_EQ(OK, callback.WaitForResult());
373 }
374
375 void SendRequestAndExpectHttpResponse(const std::string& expected) {
376 scoped_ptr<HttpNetworkTransaction> trans(
[email protected]90499482013-06-01 00:39:50377 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
bncffc2fdf2015-05-14 18:29:49378 RunTransaction(trans);
[email protected]aa9b14d2013-05-10 23:45:19379 CheckWasHttpResponse(trans);
bncffc2fdf2015-05-14 18:29:49380 CheckResponseData(trans, expected);
[email protected]aa9b14d2013-05-10 23:45:19381 }
382
383 void SendRequestAndExpectQuicResponse(const std::string& expected) {
rchf114d982015-10-21 01:34:56384 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, 443);
tbansal7cec3812015-02-05 21:25:12385 }
386
bnc62a44f022015-04-02 15:59:41387 void SendRequestAndExpectQuicResponseOnPort(const std::string& expected,
388 uint16 port) {
389 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, port);
390 }
391
392 void SendRequestAndExpectQuicResponseFromProxyOnPort(
393 const std::string& expected,
394 uint16 port) {
395 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port);
[email protected]aa9b14d2013-05-10 23:45:19396 }
397
398 void AddQuicAlternateProtocolMapping(
399 MockCryptoClientStream::HandshakeMode handshake_mode) {
400 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
bnccacc0992015-03-20 20:22:22401 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url);
rchf114d982015-10-21 01:34:56402 AlternativeService alternative_service(QUIC, host_port_pair.host(), 443);
bnc7dc7e1b42015-07-28 14:43:12403 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
404 http_server_properties_.SetAlternativeService(
405 host_port_pair, alternative_service, 1.0, expiration);
[email protected]aa9b14d2013-05-10 23:45:19406 }
407
408 void ExpectBrokenAlternateProtocolMapping() {
bnc8445b3002015-03-13 01:57:09409 const HostPortPair origin = HostPortPair::FromURL(request_.url);
bncd9b132e2015-07-08 05:16:10410 const AlternativeServiceVector alternative_service_vector =
411 http_server_properties_.GetAlternativeServices(origin);
412 EXPECT_EQ(1u, alternative_service_vector.size());
bnc6be245c12015-05-15 11:24:07413 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken(
bncd9b132e2015-07-08 05:16:10414 alternative_service_vector[0]));
[email protected]aa9b14d2013-05-10 23:45:19415 }
416
[email protected]4d590c9c2014-05-02 05:14:33417 void ExpectQuicAlternateProtocolMapping() {
bncd9b132e2015-07-08 05:16:10418 const HostPortPair origin = HostPortPair::FromURL(request_.url);
419 const AlternativeServiceVector alternative_service_vector =
420 http_server_properties_.GetAlternativeServices(origin);
421 EXPECT_EQ(1u, alternative_service_vector.size());
422 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
[email protected]4d590c9c2014-05-02 05:14:33423 }
424
[email protected]aa9b14d2013-05-10 23:45:19425 void AddHangingNonAlternateProtocolSocketData() {
[email protected]dda75ab2013-06-22 22:43:30426 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
427 hanging_data_.set_connect_data(hanging_connect);
428 socket_factory_.AddSocketDataProvider(&hanging_data_);
rchf114d982015-10-21 01:34:56429 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]aa9b14d2013-05-10 23:45:19430 }
431
rtenneti4b06ae72014-08-26 03:43:43432 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
[email protected]1e960032013-12-20 19:00:20433 QuicTestPacketMaker maker_;
mmenkee65e7af2015-10-13 17:16:42434 scoped_ptr<HttpNetworkSession> session_;
[email protected]61a527782013-02-21 03:58:00435 MockClientSocketFactory socket_factory_;
rchf114d982015-10-21 01:34:56436 ProofVerifyDetailsChromium verify_details_;
[email protected]e8ff26842013-03-22 21:02:05437 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]1c04f9522013-02-21 20:32:43438 MockHostResolver host_resolver_;
439 MockCertVerifier cert_verifier_;
[email protected]b1c988b2013-06-13 06:48:11440 TransportSecurityState transport_security_state_;
tbansalfdf5665b2015-09-21 22:46:40441 scoped_ptr<TestNetworkQualityEstimator> test_network_quality_estimator_;
[email protected]1c04f9522013-02-21 20:32:43442 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
443 scoped_ptr<ProxyService> proxy_service_;
444 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
[email protected]61a527782013-02-21 03:58:00445 MockRandom random_generator_;
bnc6be245c12015-05-15 11:24:07446 HttpServerPropertiesImpl http_server_properties_;
[email protected]61a527782013-02-21 03:58:00447 HttpNetworkSession::Params params_;
[email protected]aa9b14d2013-05-10 23:45:19448 HttpRequestInfo request_;
vishal.b62985ca92015-04-17 08:45:51449 BoundTestNetLog net_log_;
[email protected]dda75ab2013-06-22 22:43:30450 StaticSocketDataProvider hanging_data_;
rchf114d982015-10-21 01:34:56451 SSLSocketDataProvider ssl_data_;
tbansal7cec3812015-02-05 21:25:12452
453 private:
454 void SendRequestAndExpectQuicResponseMaybeFromProxy(
455 const std::string& expected,
bnc62a44f022015-04-02 15:59:41456 bool used_proxy,
457 uint16 port) {
tbansal7cec3812015-02-05 21:25:12458 scoped_ptr<HttpNetworkTransaction> trans(
459 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
460 ProxyHeadersHandler proxy_headers_handler;
461 trans->SetBeforeProxyHeadersSentCallback(
462 base::Bind(&ProxyHeadersHandler::OnBeforeProxyHeadersSent,
463 base::Unretained(&proxy_headers_handler)));
bncffc2fdf2015-05-14 18:29:49464 RunTransaction(trans);
tbansal7cec3812015-02-05 21:25:12465 CheckWasQuicResponse(trans);
bnc62a44f022015-04-02 15:59:41466 CheckResponsePort(trans, port);
bncffc2fdf2015-05-14 18:29:49467 CheckResponseData(trans, expected);
tbansal7cec3812015-02-05 21:25:12468 EXPECT_EQ(used_proxy, proxy_headers_handler.was_called());
469 }
[email protected]61a527782013-02-21 03:58:00470};
471
[email protected]1e960032013-12-20 19:00:20472INSTANTIATE_TEST_CASE_P(Version, QuicNetworkTransactionTest,
473 ::testing::ValuesIn(QuicSupportedVersions()));
474
475TEST_P(QuicNetworkTransactionTest, ForceQuic) {
[email protected]49e85332013-06-04 04:18:03476 params_.origin_to_force_quic_on =
rchf114d982015-10-21 01:34:56477 HostPortPair::FromString("mail.example.com:443");
[email protected]4dca587c2013-03-07 16:54:47478
[email protected]1e960032013-12-20 19:00:20479 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03480 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05481 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56482 GetRequestHeaders("GET", "https", "/")));
[email protected]92bf17c2014-03-03 21:14:03483 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05484 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:03485 GetResponseHeaders("200 OK")));
486 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05487 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03488 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50489 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
[email protected]4dca587c2013-03-07 16:54:47490
rcha5399e02015-04-21 19:32:04491 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4dca587c2013-03-07 16:54:47492
[email protected]aa9b14d2013-05-10 23:45:19493 // The non-alternate protocol job needs to hang in order to guarantee that
494 // the alternate-protocol job will "win".
495 AddHangingNonAlternateProtocolSocketData();
[email protected]4dca587c2013-03-07 16:54:47496
497 CreateSession();
[email protected]4dca587c2013-03-07 16:54:47498
tbansalfdf5665b2015-09-21 22:46:40499 EXPECT_FALSE(
500 test_network_quality_estimator_->IsRTTAvailableNotificationReceived());
[email protected]aa9b14d2013-05-10 23:45:19501 SendRequestAndExpectQuicResponse("hello!");
tbansalfdf5665b2015-09-21 22:46:40502 EXPECT_TRUE(
503 test_network_quality_estimator_->IsRTTAvailableNotificationReceived());
[email protected]4dca587c2013-03-07 16:54:47504
[email protected]98b20ce2013-05-10 05:55:26505 // Check that the NetLog was filled reasonably.
mmenke43758e62015-05-04 21:09:46506 TestNetLogEntry::List entries;
[email protected]aa9b14d2013-05-10 23:45:19507 net_log_.GetEntries(&entries);
[email protected]98b20ce2013-05-10 05:55:26508 EXPECT_LT(0u, entries.size());
509
510 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29511 int pos = ExpectLogContainsSomewhere(
512 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
513 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26514 EXPECT_LT(0, pos);
515
rchfd527212015-08-25 00:41:26516 // ... and also a TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29517 pos = ExpectLogContainsSomewhere(
rchfd527212015-08-25 00:41:26518 entries, 0,
519 NetLog::TYPE_QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED,
ttuttle859dc7a2015-04-23 19:42:29520 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26521 EXPECT_LT(0, pos);
522
rtennetia004d332015-08-28 06:44:57523 std::string packet_number;
524 ASSERT_TRUE(entries[pos].GetStringValue("packet_number", &packet_number));
525 EXPECT_EQ("1", packet_number);
[email protected]98b20ce2013-05-10 05:55:26526
rchfd527212015-08-25 00:41:26527 // ... and also a TYPE_QUIC_SESSION_PACKET_AUTHENTICATED.
528 pos = ExpectLogContainsSomewhere(
529 entries, 0, NetLog::TYPE_QUIC_SESSION_PACKET_AUTHENTICATED,
530 NetLog::PHASE_NONE);
531 EXPECT_LT(0, pos);
532
[email protected]98b20ce2013-05-10 05:55:26533 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED.
ttuttle859dc7a2015-04-23 19:42:29534 pos = ExpectLogContainsSomewhere(
535 entries, 0, NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
536 NetLog::PHASE_NONE);
[email protected]98b20ce2013-05-10 05:55:26537 EXPECT_LT(0, pos);
538
539 int log_stream_id;
540 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
[email protected]1e960032013-12-20 19:00:20541 EXPECT_EQ(3, log_stream_id);
[email protected]4dca587c2013-03-07 16:54:47542}
543
[email protected]cf3e3cd62014-02-05 16:16:16544TEST_P(QuicNetworkTransactionTest, QuicProxy) {
tbansaled0aecc2015-02-20 03:44:18545 params_.enable_quic_for_proxies = true;
rchf114d982015-10-21 01:34:56546 proxy_service_ =
547 ProxyService::CreateFixedFromPacResult("QUIC mail.example.com:70");
[email protected]cf3e3cd62014-02-05 16:16:16548
[email protected]cf3e3cd62014-02-05 16:16:16549 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03550 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05551 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
[email protected]92bf17c2014-03-03 21:14:03552 GetRequestHeaders("GET", "http", "/")));
553 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05554 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:03555 GetResponseHeaders("200 OK")));
556 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05557 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03558 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50559 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
[email protected]cf3e3cd62014-02-05 16:16:16560 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
561
rcha5399e02015-04-21 19:32:04562 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]cf3e3cd62014-02-05 16:16:16563
tbansalfdf5665b2015-09-21 22:46:40564 EXPECT_FALSE(
565 test_network_quality_estimator_->IsRTTAvailableNotificationReceived());
[email protected]cf3e3cd62014-02-05 16:16:16566 // There is no need to set up an alternate protocol job, because
567 // no attempt will be made to speak to the proxy over TCP.
568
rchf114d982015-10-21 01:34:56569 request_.url = GURL("http://mail.example.com/");
[email protected]cf3e3cd62014-02-05 16:16:16570 CreateSession();
571
bnc62a44f022015-04-02 15:59:41572 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
tbansalfdf5665b2015-09-21 22:46:40573 EXPECT_TRUE(
574 test_network_quality_estimator_->IsRTTAvailableNotificationReceived());
[email protected]cf3e3cd62014-02-05 16:16:16575}
576
bnc313ba9c2015-06-11 15:42:31577// Regression test for https://crbug.com/492458. Test that for an HTTP
578// connection through a QUIC proxy, the certificate exhibited by the proxy is
579// checked against the proxy hostname, not the origin hostname.
580TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) {
581 const std::string origin_host = "news.example.com";
582 const std::string proxy_host = "www.example.org";
583
584 params_.enable_quic_for_proxies = true;
rdsmith82957ad2015-09-16 19:42:03585 proxy_service_ =
586 ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70");
bnc313ba9c2015-06-11 15:42:31587
588 maker_.set_hostname(origin_host);
589 MockQuicData mock_quic_data;
590 mock_quic_data.AddWrite(
591 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
592 GetRequestHeaders("GET", "http", "/")));
593 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
594 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
595 mock_quic_data.AddRead(
596 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
597 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50598 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
bnc313ba9c2015-06-11 15:42:31599 mock_quic_data.AddRead(SYNCHRONOUS, 0);
600 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
601
602 scoped_refptr<X509Certificate> cert(
603 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
604 ASSERT_TRUE(cert.get());
605 // This certificate is valid for the proxy, but not for the origin.
606 bool common_name_fallback_used;
607 EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used));
608 EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used));
609 ProofVerifyDetailsChromium verify_details;
610 verify_details.cert_verify_result.verified_cert = cert;
611 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rchf114d982015-10-21 01:34:56612 ProofVerifyDetailsChromium verify_details2;
613 verify_details2.cert_verify_result.verified_cert = cert;
614 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
bnc313ba9c2015-06-11 15:42:31615
616 request_.url = GURL("http://" + origin_host);
617 AddHangingNonAlternateProtocolSocketData();
618 CreateSessionWithNextProtos();
619 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
620 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70);
621}
622
[email protected]1e960032013-12-20 19:00:20623TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) {
[email protected]49e85332013-06-04 04:18:03624 params_.origin_to_force_quic_on =
rchf114d982015-10-21 01:34:56625 HostPortPair::FromString("mail.example.com:443");
[email protected]cebe3282013-05-22 23:49:30626
tbansalfdf5665b2015-09-21 22:46:40627 MockQuicData mock_quic_data1;
628 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
[email protected]1e960032013-12-20 19:00:20629
tbansalfdf5665b2015-09-21 22:46:40630 MockQuicData mock_quic_data2;
631 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED);
632
633 mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
634 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
[email protected]cebe3282013-05-22 23:49:30635
636 CreateSession();
637
tbansalfdf5665b2015-09-21 22:46:40638 EXPECT_EQ(0U, test_network_quality_estimator_->GetWatchersCreated());
639 for (size_t i = 0; i < 2; ++i) {
640 scoped_ptr<HttpNetworkTransaction> trans(
641 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
642 TestCompletionCallback callback;
643 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
644 EXPECT_EQ(ERR_IO_PENDING, rv);
645 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
646 EXPECT_EQ(1 + i, test_network_quality_estimator_->GetWatchersCreated());
647 }
[email protected]cebe3282013-05-22 23:49:30648}
649
bncc958faa2015-07-31 18:14:52650TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52651 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56652 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
653 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52654 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
655 MockRead(ASYNC, OK)};
656
657 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
658 0);
659 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56660 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52661
662 MockQuicData mock_quic_data;
663 mock_quic_data.AddWrite(
664 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56665 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52666 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
667 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
668 mock_quic_data.AddRead(
669 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
670 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
671 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
672 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
673
674 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
675
676 AddHangingNonAlternateProtocolSocketData();
677 CreateSessionWithNextProtos();
678
679 SendRequestAndExpectHttpResponse("hello world");
680 SendRequestAndExpectQuicResponse("hello!");
681}
682
bnc8be55ebb2015-10-30 14:12:07683TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) {
684 std::string altsvc_header = base::StringPrintf(
685 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam());
686 MockRead http_reads[] = {
687 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
688 MockRead("hello world"),
689 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
690 MockRead(ASYNC, OK)};
691
692 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
693 0);
694 socket_factory_.AddSocketDataProvider(&http_data);
695 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
696
697 MockQuicData mock_quic_data;
698 mock_quic_data.AddWrite(
699 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
700 GetRequestHeaders("GET", "https", "/")));
701 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
702 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
703 mock_quic_data.AddRead(
704 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
705 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
706 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
707 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
708
709 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
710
711 AddHangingNonAlternateProtocolSocketData();
712 CreateSessionWithNextProtos();
713
714 SendRequestAndExpectHttpResponse("hello world");
715 SendRequestAndExpectQuicResponse("hello!");
716}
717
718TEST_P(QuicNetworkTransactionTest,
719 DoNotUseAlternativeServiceQuicUnsupportedVersion) {
720 std::string altsvc_header = base::StringPrintf(
721 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam() - 1);
722 MockRead http_reads[] = {
723 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
724 MockRead("hello world"),
725 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
726 MockRead(ASYNC, OK)};
727
728 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
729 0);
730 socket_factory_.AddSocketDataProvider(&http_data);
731 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
732 socket_factory_.AddSocketDataProvider(&http_data);
733 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
734
735 CreateSessionWithNextProtos();
736
737 SendRequestAndExpectHttpResponse("hello world");
738 SendRequestAndExpectHttpResponse("hello world");
739}
740
bncc958faa2015-07-31 18:14:52741// When multiple alternative services are advertised,
742// HttpStreamFactoryImpl::RequestStreamInternal() only passes the first one to
743// Job. This is what the following test verifies.
744// TODO(bnc): Update this test when multiple alternative services are handled
745// properly.
746TEST_P(QuicNetworkTransactionTest, UseFirstAlternativeServiceForQuic) {
bncc958faa2015-07-31 18:14:52747 MockRead http_reads[] = {
748 MockRead("HTTP/1.1 200 OK\r\n"),
749 MockRead("Alt-Svc: quic=\":443\", quic=\":1234\"\r\n\r\n"),
750 MockRead("hello world"),
751 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
752 MockRead(ASYNC, OK)};
753
754 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
755 0);
756 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56757 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52758
759 MockQuicData mock_quic_data;
760 mock_quic_data.AddWrite(
761 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56762 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52763 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
764 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
765 mock_quic_data.AddRead(
766 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
767 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
768 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
769 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
770
771 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
772
773 AddHangingNonAlternateProtocolSocketData();
774 CreateSessionWithNextProtos();
775
776 SendRequestAndExpectHttpResponse("hello world");
777 SendRequestAndExpectQuicResponseOnPort("hello!", 443);
778}
779
780TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) {
bncc958faa2015-07-31 18:14:52781 MockRead http_reads[] = {
782 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:56783 MockRead(kQuicAlternativeServiceDifferentPortHeader),
bncc958faa2015-07-31 18:14:52784 MockRead("hello world"),
785 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
786 MockRead(ASYNC, OK)};
787
788 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
789 0);
790 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56791 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52792
793 MockQuicData mock_quic_data;
794 mock_quic_data.AddWrite(
795 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56796 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52797 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
798 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
799 mock_quic_data.AddRead(
800 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
801 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
802 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
803 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
804
805 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
806
807 AddHangingNonAlternateProtocolSocketData();
808 CreateSessionWithNextProtos();
809
810 SendRequestAndExpectHttpResponse("hello world");
811 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
812}
813
814TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) {
bncc958faa2015-07-31 18:14:52815 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56816 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
817 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52818 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
819 MockRead(ASYNC, OK)};
820
821 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
822 0);
823 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56824 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52825
826 MockQuicData mock_quic_data;
827 mock_quic_data.AddWrite(
828 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56829 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52830 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
831 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
832 mock_quic_data.AddRead(
833 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
834 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
835 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
836 mock_quic_data.AddRead(ASYNC, 0); // EOF
837 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
838
839 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
840
841 AddHangingNonAlternateProtocolSocketData();
842 CreateSessionWithNextProtos();
843
844 AlternativeService alternative_service(QUIC,
845 HostPortPair::FromURL(request_.url));
846 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
847 alternative_service);
848 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
849 alternative_service));
850
851 SendRequestAndExpectHttpResponse("hello world");
852 SendRequestAndExpectQuicResponse("hello!");
853
854 mock_quic_data.CompleteRead();
855
856 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
857 alternative_service));
858}
859
860TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceProbabilityForQuic) {
bncc958faa2015-07-31 18:14:52861 MockRead http_reads[] = {
862 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:56863 MockRead(kQuicAlternativeService50pctHeader), MockRead("hello world"),
bncc958faa2015-07-31 18:14:52864 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
865 MockRead(ASYNC, OK)};
866
867 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
868 0);
869 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56870 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52871
872 MockQuicData mock_quic_data;
873 mock_quic_data.AddWrite(
874 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56875 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52876 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
877 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
878 mock_quic_data.AddRead(
879 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
880 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
881 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
882 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
883
884 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
885
886 AddHangingNonAlternateProtocolSocketData();
887 params_.alternative_service_probability_threshold = 0.25;
888 CreateSessionWithNextProtos();
889
890 SendRequestAndExpectHttpResponse("hello world");
891 SendRequestAndExpectQuicResponse("hello!");
892}
893
894TEST_P(QuicNetworkTransactionTest,
895 DontUseAlternativeServiceProbabilityForQuic) {
bncc958faa2015-07-31 18:14:52896 MockRead http_reads[] = {
897 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:56898 MockRead(kQuicAlternativeService50pctHeader), MockRead("hello world"),
bncc958faa2015-07-31 18:14:52899 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
900 MockRead(ASYNC, OK)};
901
902 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
903 0);
904 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56905 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52906 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56907 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52908
909 params_.alternative_service_probability_threshold = 0.75;
910 CreateSessionWithNextProtos();
911
912 SendRequestAndExpectHttpResponse("hello world");
913 SendRequestAndExpectHttpResponse("hello world");
914}
915
bncc958faa2015-07-31 18:14:52916TEST_P(QuicNetworkTransactionTest,
917 DontUseAlternativeServiceWithBadProbabilityForQuic) {
bncc958faa2015-07-31 18:14:52918 MockRead http_reads[] = {
919 MockRead("HTTP/1.1 200 OK\r\n"),
920 MockRead("Alt-Svc: quic=\":443\";p=2\r\n\r\n"), MockRead("hello world"),
921 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
922 MockRead(ASYNC, OK)};
923
924 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
925 0);
926 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56927 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52928 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56929 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52930
931 params_.alternative_service_probability_threshold = 0.75;
932 CreateSessionWithNextProtos();
933
934 SendRequestAndExpectHttpResponse("hello world");
935 SendRequestAndExpectHttpResponse("hello world");
936}
937
938TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) {
bncc958faa2015-07-31 18:14:52939 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56940 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader),
941 MockRead("hello world"),
bncc958faa2015-07-31 18:14:52942 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
943 MockRead(ASYNC, OK)};
944
945 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
946 0);
947 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56948 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncc958faa2015-07-31 18:14:52949
950 MockQuicData mock_quic_data;
951 mock_quic_data.AddWrite(
952 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56953 GetRequestHeaders("GET", "https", "/")));
bncc958faa2015-07-31 18:14:52954 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
955 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
956 mock_quic_data.AddRead(
957 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
958 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
959 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
960
961 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
962
963 AddHangingNonAlternateProtocolSocketData();
964 CreateSessionWithNextProtos();
965
966 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
967 SendRequestAndExpectHttpResponse("hello world");
968}
969
[email protected]1e960032013-12-20 19:00:20970TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
[email protected]aa9b14d2013-05-10 23:45:19971 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:56972 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
973 MockRead("hello world"),
974 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
975 MockRead(ASYNC, OK)};
[email protected]61a527782013-02-21 03:58:00976
[email protected]aa9b14d2013-05-10 23:45:19977 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:42978 nullptr, 0);
[email protected]aa9b14d2013-05-10 23:45:19979 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:56980 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]61a527782013-02-21 03:58:00981
[email protected]1e960032013-12-20 19:00:20982 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:03983 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:05984 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:56985 GetRequestHeaders("GET", "https", "/")));
[email protected]92bf17c2014-03-03 21:14:03986 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05987 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:03988 GetResponseHeaders("200 OK")));
989 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:05990 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:03991 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:50992 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
[email protected]1e960032013-12-20 19:00:20993 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
[email protected]61a527782013-02-21 03:58:00994
rcha5399e02015-04-21 19:32:04995 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]61a527782013-02-21 03:58:00996
[email protected]aa9b14d2013-05-10 23:45:19997 // The non-alternate protocol job needs to hang in order to guarantee that
998 // the alternate-protocol job will "win".
999 AddHangingNonAlternateProtocolSocketData();
[email protected]61a527782013-02-21 03:58:001000
[email protected]d7599122014-05-24 03:37:231001 CreateSessionWithNextProtos();
[email protected]61a527782013-02-21 03:58:001002
[email protected]aa9b14d2013-05-10 23:45:191003 SendRequestAndExpectHttpResponse("hello world");
1004 SendRequestAndExpectQuicResponse("hello!");
[email protected]61a527782013-02-21 03:58:001005}
1006
bnc62a44f022015-04-02 15:59:411007TEST_P(QuicNetworkTransactionTest, AlternateProtocolDifferentPort) {
1008 MockRead http_reads[] = {
1009 MockRead("HTTP/1.1 200 OK\r\n"),
rchf114d982015-10-21 01:34:561010 MockRead(kQuicAlternateProtocolDifferentPortHeader),
bnc62a44f022015-04-02 15:59:411011 MockRead("hello world"),
1012 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1013 MockRead(ASYNC, OK)};
1014
1015 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1016 0);
1017 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561018 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bnc62a44f022015-04-02 15:59:411019
1020 MockQuicData mock_quic_data;
1021 mock_quic_data.AddWrite(
1022 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561023 GetRequestHeaders("GET", "https", "/")));
bnc62a44f022015-04-02 15:59:411024 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1025 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1026 mock_quic_data.AddRead(
1027 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1028 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501029 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
bnc62a44f022015-04-02 15:59:411030 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
1031
rcha5399e02015-04-21 19:32:041032 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bnc62a44f022015-04-02 15:59:411033
1034 // The non-alternate protocol job needs to hang in order to guarantee that
1035 // the alternate-protocol job will "win".
1036 AddHangingNonAlternateProtocolSocketData();
1037
1038 CreateSessionWithNextProtos();
1039
1040 SendRequestAndExpectHttpResponse("hello world");
1041 SendRequestAndExpectQuicResponseOnPort("hello!", 137);
1042}
1043
bncc958faa2015-07-31 18:14:521044TEST_P(QuicNetworkTransactionTest, ConfirmAlternateProtocol) {
bncae8db8402015-03-26 20:13:501045 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561046 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
bncae8db8402015-03-26 20:13:501047 MockRead("hello world"),
1048 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1049 MockRead(ASYNC, OK)};
1050
1051 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
1052 0);
1053 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561054 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
bncae8db8402015-03-26 20:13:501055
1056 MockQuicData mock_quic_data;
1057 mock_quic_data.AddWrite(
1058 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561059 GetRequestHeaders("GET", "https", "/")));
bncae8db8402015-03-26 20:13:501060 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1061 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1062 mock_quic_data.AddRead(
1063 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1064 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501065 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1066 mock_quic_data.AddRead(ASYNC, 0); // EOF
bncae8db8402015-03-26 20:13:501067 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
1068
rcha5399e02015-04-21 19:32:041069 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
bncae8db8402015-03-26 20:13:501070
1071 // The non-alternate protocol job needs to hang in order to guarantee that
1072 // the alternate-protocol job will "win".
1073 AddHangingNonAlternateProtocolSocketData();
1074
1075 CreateSessionWithNextProtos();
1076
1077 AlternativeService alternative_service(QUIC,
1078 HostPortPair::FromURL(request_.url));
bnc6be245c12015-05-15 11:24:071079 http_server_properties_.MarkAlternativeServiceRecentlyBroken(
bncae8db8402015-03-26 20:13:501080 alternative_service);
bnc6be245c12015-05-15 11:24:071081 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1082 alternative_service));
bncae8db8402015-03-26 20:13:501083
1084 SendRequestAndExpectHttpResponse("hello world");
1085 SendRequestAndExpectQuicResponse("hello!");
1086
rchb27683c2015-07-29 23:53:501087 mock_quic_data.CompleteRead();
1088
bnc6be245c12015-05-15 11:24:071089 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken(
1090 alternative_service));
bncae8db8402015-03-26 20:13:501091}
1092
[email protected]287d9412014-07-08 23:01:001093TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolProbabilityForQuic) {
1094 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561095 MockRead("HTTP/1.1 200 OK\r\n"),
1096 MockRead(kQuicAlternateProtocol50pctHeader), MockRead("hello world"),
1097 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1098 MockRead(ASYNC, OK)};
[email protected]287d9412014-07-08 23:01:001099
1100 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421101 nullptr, 0);
[email protected]287d9412014-07-08 23:01:001102 socket_factory_.AddSocketDataProvider(&http_data);
1103
1104 MockQuicData mock_quic_data;
1105 mock_quic_data.AddWrite(
1106 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561107 GetRequestHeaders("GET", "https", "/")));
[email protected]287d9412014-07-08 23:01:001108 mock_quic_data.AddRead(
1109 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
1110 GetResponseHeaders("200 OK")));
1111 mock_quic_data.AddRead(
1112 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1113 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501114 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
[email protected]287d9412014-07-08 23:01:001115 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
1116
rcha5399e02015-04-21 19:32:041117 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]287d9412014-07-08 23:01:001118
1119 // The non-alternate protocol job needs to hang in order to guarantee that
1120 // the alternate-protocol job will "win".
1121 AddHangingNonAlternateProtocolSocketData();
1122
bnc62891a52015-04-27 14:14:121123 params_.alternative_service_probability_threshold = .25;
[email protected]287d9412014-07-08 23:01:001124 CreateSessionWithNextProtos();
1125
1126 SendRequestAndExpectHttpResponse("hello world");
1127 SendRequestAndExpectQuicResponse("hello!");
1128}
1129
1130TEST_P(QuicNetworkTransactionTest, DontUseAlternateProtocolProbabilityForQuic) {
1131 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561132 MockRead("HTTP/1.1 200 OK\r\n"),
1133 MockRead(kQuicAlternateProtocol50pctHeader), MockRead("hello world"),
1134 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1135 MockRead(ASYNC, OK)};
[email protected]287d9412014-07-08 23:01:001136
1137 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421138 nullptr, 0);
[email protected]287d9412014-07-08 23:01:001139 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561140 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001141 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561142 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001143
bnc62891a52015-04-27 14:14:121144 params_.alternative_service_probability_threshold = .75;
[email protected]287d9412014-07-08 23:01:001145 CreateSessionWithNextProtos();
1146
1147 SendRequestAndExpectHttpResponse("hello world");
1148 SendRequestAndExpectHttpResponse("hello world");
1149}
1150
1151TEST_P(QuicNetworkTransactionTest,
1152 DontUseAlternateProtocolWithBadProbabilityForQuic) {
1153 MockRead http_reads[] = {
1154 MockRead("HTTP/1.1 200 OK\r\n"),
1155 MockRead("Alternate-Protocol: 443:quic,p=2\r\n\r\n"),
1156 MockRead("hello world"),
1157 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1158 MockRead(ASYNC, OK)
1159 };
1160
1161 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421162 nullptr, 0);
[email protected]287d9412014-07-08 23:01:001163 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561164 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001165 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561166 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]287d9412014-07-08 23:01:001167
bnc62891a52015-04-27 14:14:121168 params_.alternative_service_probability_threshold = .75;
[email protected]287d9412014-07-08 23:01:001169 CreateSessionWithNextProtos();
1170
1171 SendRequestAndExpectHttpResponse("hello world");
1172 SendRequestAndExpectHttpResponse("hello world");
1173}
1174
[email protected]1e960032013-12-20 19:00:201175TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) {
[email protected]6d1b4ed2013-07-10 03:57:541176 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561177 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1178 MockRead("hello world"),
1179 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1180 MockRead(ASYNC, OK)};
[email protected]6d1b4ed2013-07-10 03:57:541181
1182 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421183 nullptr, 0);
[email protected]6d1b4ed2013-07-10 03:57:541184 socket_factory_.AddSocketDataProvider(&http_data);
1185
[email protected]1e960032013-12-20 19:00:201186 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031187 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051188 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561189 GetRequestHeaders("GET", "https", "/")));
[email protected]92bf17c2014-03-03 21:14:031190 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051191 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:031192 GetResponseHeaders("200 OK")));
1193 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051194 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031195 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501196 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
[email protected]1e960032013-12-20 19:00:201197 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
[email protected]6d1b4ed2013-07-10 03:57:541198
rcha5399e02015-04-21 19:32:041199 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]6d1b4ed2013-07-10 03:57:541200
1201 // The non-alternate protocol job needs to hang in order to guarantee that
1202 // the alternate-protocol job will "win".
1203 AddHangingNonAlternateProtocolSocketData();
1204
[email protected]d7599122014-05-24 03:37:231205 CreateSessionWithNextProtos();
[email protected]6d1b4ed2013-07-10 03:57:541206
1207 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1208 SendRequestAndExpectHttpResponse("hello world");
1209}
1210
bnccb7ff3c2015-05-21 20:51:551211class QuicAltSvcCertificateVerificationTest
1212 : public QuicNetworkTransactionTest {
1213 public:
1214 void Run(bool valid) {
1215 HostPortPair origin(valid ? "mail.example.org" : "invalid.example.org",
1216 443);
1217 HostPortPair alternative("www.example.org", 443);
1218 std::string url("https://");
1219 url.append(origin.host());
1220 url.append(":443");
1221 request_.url = GURL(url);
1222
1223 maker_.set_hostname(origin.host());
1224 MockQuicData mock_quic_data;
1225 mock_quic_data.AddWrite(
1226 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1227 GetRequestHeaders("GET", "https", "/")));
1228 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1229 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1230 mock_quic_data.AddRead(
1231 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1232 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501233 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);
bnccb7ff3c2015-05-21 20:51:551234 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1235
1236 scoped_refptr<X509Certificate> cert(
1237 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
1238 ASSERT_TRUE(cert.get());
1239 bool common_name_fallback_used;
1240 EXPECT_EQ(valid,
1241 cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
1242 EXPECT_TRUE(
1243 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
1244 ProofVerifyDetailsChromium verify_details;
1245 verify_details.cert_verify_result.verified_cert = cert;
1246 verify_details.cert_verify_result.is_issued_by_known_root = true;
1247 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1248 crypto_client_stream_factory_.set_handshake_mode(
1249 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1250
1251 // Connection to |origin| fails, so that success of |request| depends on
1252 // connection to |alternate| only.
1253 MockConnect refused_connect(ASYNC, ERR_CONNECTION_REFUSED);
1254 StaticSocketDataProvider refused_data;
1255 refused_data.set_connect_data(refused_connect);
1256 socket_factory_.AddSocketDataProvider(&refused_data);
1257
1258 CreateSessionWithNextProtos();
1259 AlternativeService alternative_service(QUIC, alternative);
bnc7dc7e1b42015-07-28 14:43:121260 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
bnccb7ff3c2015-05-21 20:51:551261 session_->http_server_properties()->SetAlternativeService(
bnc7dc7e1b42015-07-28 14:43:121262 origin, alternative_service, 1.0, expiration);
bnccb7ff3c2015-05-21 20:51:551263 scoped_ptr<HttpNetworkTransaction> trans(
1264 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1265 TestCompletionCallback callback;
1266 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1267 EXPECT_EQ(ERR_IO_PENDING, rv);
1268 rv = callback.WaitForResult();
1269 if (valid) {
1270 EXPECT_EQ(OK, rv);
1271 CheckWasQuicResponse(trans);
1272 CheckResponsePort(trans, 443);
1273 CheckResponseData(trans, "hello!");
1274 } else {
1275 EXPECT_EQ(ERR_CONNECTION_REFUSED, rv);
1276 }
1277 }
1278};
1279
1280INSTANTIATE_TEST_CASE_P(Version,
1281 QuicAltSvcCertificateVerificationTest,
1282 ::testing::ValuesIn(QuicSupportedVersions()));
1283
1284TEST_P(QuicAltSvcCertificateVerificationTest,
1285 RequestSucceedsWithValidCertificate) {
1286 Run(true);
1287}
1288
1289TEST_P(QuicAltSvcCertificateVerificationTest,
1290 RequestFailsWithInvalidCertificate) {
1291 Run(false);
1292}
1293
[email protected]1e960032013-12-20 19:00:201294TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) {
[email protected]dda75ab2013-06-22 22:43:301295 crypto_client_stream_factory_.set_handshake_mode(
1296 MockCryptoClientStream::COLD_START);
1297
1298 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561299 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
1300 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.com\r\n"),
1301 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")};
[email protected]dda75ab2013-06-22 22:43:301302
1303 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561304 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1305 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1306 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]dda75ab2013-06-22 22:43:301307
1308 DeterministicMockClientSocketFactory socket_factory;
1309
1310 DeterministicSocketData http_data(http_reads, arraysize(http_reads),
1311 http_writes, arraysize(http_writes));
1312 socket_factory.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561313 socket_factory.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301314
1315 // The QUIC transaction will not be allowed to complete.
1316 MockWrite quic_writes[] = {
1317 MockWrite(ASYNC, ERR_IO_PENDING, 0)
1318 };
1319 MockRead quic_reads[] = {
1320 MockRead(ASYNC, ERR_IO_PENDING, 1),
1321 };
1322 DeterministicSocketData quic_data(quic_reads, arraysize(quic_reads),
1323 quic_writes, arraysize(quic_writes));
1324 socket_factory.AddSocketDataProvider(&quic_data);
1325
1326 // The HTTP transaction will complete.
1327 DeterministicSocketData http_data2(http_reads, arraysize(http_reads),
1328 http_writes, arraysize(http_writes));
1329 socket_factory.AddSocketDataProvider(&http_data2);
rchf114d982015-10-21 01:34:561330 socket_factory.AddSSLSocketDataProvider(&ssl_data_);
[email protected]dda75ab2013-06-22 22:43:301331
[email protected]d7599122014-05-24 03:37:231332 CreateSessionWithFactory(&socket_factory, true);
[email protected]dda75ab2013-06-22 22:43:301333
1334 // Run the first request.
1335 http_data.StopAfter(arraysize(http_reads) + arraysize(http_writes));
1336 SendRequestAndExpectHttpResponse("hello world");
rch37de576c2015-05-17 20:28:171337 ASSERT_TRUE(http_data.AllReadDataConsumed());
1338 ASSERT_TRUE(http_data.AllWriteDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301339
1340 // Now run the second request in which the QUIC socket hangs,
1341 // and verify the the transaction continues over HTTP.
1342 http_data2.StopAfter(arraysize(http_reads) + arraysize(http_writes));
1343 SendRequestAndExpectHttpResponse("hello world");
1344
rch37de576c2015-05-17 20:28:171345 ASSERT_TRUE(http_data2.AllReadDataConsumed());
1346 ASSERT_TRUE(http_data2.AllWriteDataConsumed());
1347 ASSERT_TRUE(!quic_data.AllReadDataConsumed());
1348 ASSERT_TRUE(!quic_data.AllWriteDataConsumed());
[email protected]dda75ab2013-06-22 22:43:301349}
1350
[email protected]1e960032013-12-20 19:00:201351TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
[email protected]1e960032013-12-20 19:00:201352 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031353 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051354 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561355 GetRequestHeaders("GET", "https", "/")));
[email protected]92bf17c2014-03-03 21:14:031356 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051357 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:031358 GetResponseHeaders("200 OK")));
1359 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051360 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031361 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501362 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
[email protected]1e960032013-12-20 19:00:201363 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
[email protected]8ba81212013-05-03 13:11:481364
rcha5399e02015-04-21 19:32:041365 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]8ba81212013-05-03 13:11:481366
[email protected]3a120a6b2013-06-25 01:08:271367 // The non-alternate protocol job needs to hang in order to guarantee that
1368 // the alternate-protocol job will "win".
[email protected]dda75ab2013-06-22 22:43:301369 AddHangingNonAlternateProtocolSocketData();
1370
[email protected]d7599122014-05-24 03:37:231371 CreateSessionWithNextProtos();
[email protected]aa9b14d2013-05-10 23:45:191372 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1373 SendRequestAndExpectQuicResponse("hello!");
[email protected]8ba81212013-05-03 13:11:481374}
1375
[email protected]1e960032013-12-20 19:00:201376TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
[email protected]1e960032013-12-20 19:00:201377 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031378 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051379 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561380 GetRequestHeaders("GET", "https", "/")));
[email protected]92bf17c2014-03-03 21:14:031381 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051382 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:031383 GetResponseHeaders("200 OK")));
1384 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051385 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031386 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501387 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
[email protected]1e960032013-12-20 19:00:201388 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
rcha5399e02015-04-21 19:32:041389 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]3a120a6b2013-06-25 01:08:271390
1391 // In order for a new QUIC session to be established via alternate-protocol
1392 // without racing an HTTP connection, we need the host resolution to happen
1393 // synchronously.
1394 host_resolver_.set_synchronous_mode(true);
rchf114d982015-10-21 01:34:561395 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1396 "");
1397 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
[email protected]3a120a6b2013-06-25 01:08:271398 AddressList address;
[email protected]5109c1952013-08-20 18:44:101399 host_resolver_.Resolve(info,
1400 DEFAULT_PRIORITY,
1401 &address,
1402 CompletionCallback(),
rtennetibe635732014-10-02 22:51:421403 nullptr,
[email protected]3a120a6b2013-06-25 01:08:271404 net_log_.bound());
1405
[email protected]d7599122014-05-24 03:37:231406 CreateSessionWithNextProtos();
[email protected]3a120a6b2013-06-25 01:08:271407 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1408 SendRequestAndExpectQuicResponse("hello!");
1409}
1410
[email protected]0fc924b2014-03-31 04:34:151411TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) {
rdsmith82957ad2015-09-16 19:42:031412 proxy_service_ = ProxyService::CreateFixedFromPacResult("PROXY myproxy:70");
[email protected]0fc924b2014-03-31 04:34:151413
1414 // Since we are using a proxy, the QUIC job will not succeed.
1415 MockWrite http_writes[] = {
rchf114d982015-10-21 01:34:561416 MockWrite(SYNCHRONOUS, 0, "GET http://mail.example.com/ HTTP/1.1\r\n"),
1417 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.com\r\n"),
1418 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")};
[email protected]0fc924b2014-03-31 04:34:151419
1420 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561421 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
1422 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader),
1423 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
[email protected]0fc924b2014-03-31 04:34:151424
1425 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
1426 http_writes, arraysize(http_writes));
1427 socket_factory_.AddSocketDataProvider(&http_data);
1428
1429 // In order for a new QUIC session to be established via alternate-protocol
1430 // without racing an HTTP connection, we need the host resolution to happen
1431 // synchronously.
1432 host_resolver_.set_synchronous_mode(true);
rchf114d982015-10-21 01:34:561433 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1434 "");
1435 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
[email protected]0fc924b2014-03-31 04:34:151436 AddressList address;
1437 host_resolver_.Resolve(info,
1438 DEFAULT_PRIORITY,
1439 &address,
1440 CompletionCallback(),
rtennetibe635732014-10-02 22:51:421441 nullptr,
[email protected]0fc924b2014-03-31 04:34:151442 net_log_.bound());
1443
rchf114d982015-10-21 01:34:561444 request_.url = GURL("http://mail.example.com/");
[email protected]d7599122014-05-24 03:37:231445 CreateSessionWithNextProtos();
[email protected]0fc924b2014-03-31 04:34:151446 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1447 SendRequestAndExpectHttpResponse("hello world");
1448}
1449
[email protected]1e960032013-12-20 19:00:201450TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
[email protected]1e960032013-12-20 19:00:201451 MockQuicData mock_quic_data;
[email protected]92bf17c2014-03-03 21:14:031452 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051453 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561454 GetRequestHeaders("GET", "https", "/")));
[email protected]92bf17c2014-03-03 21:14:031455 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051456 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false,
[email protected]92bf17c2014-03-03 21:14:031457 GetResponseHeaders("200 OK")));
1458 mock_quic_data.AddRead(
[email protected]66ae5962014-05-22 11:13:051459 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
[email protected]92bf17c2014-03-03 21:14:031460 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501461 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
rcha5399e02015-04-21 19:32:041462 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]11c05872013-08-20 02:04:121463
1464 // The non-alternate protocol job needs to hang in order to guarantee that
1465 // the alternate-protocol job will "win".
1466 AddHangingNonAlternateProtocolSocketData();
1467
1468 // In order for a new QUIC session to be established via alternate-protocol
1469 // without racing an HTTP connection, we need the host resolution to happen
1470 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
1471 // connection to the the server, in this test we require confirmation
1472 // before encrypting so the HTTP job will still start.
1473 host_resolver_.set_synchronous_mode(true);
rchf114d982015-10-21 01:34:561474 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1475 "");
1476 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
[email protected]11c05872013-08-20 02:04:121477 AddressList address;
[email protected]5109c1952013-08-20 18:44:101478 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address,
rtennetibe635732014-10-02 22:51:421479 CompletionCallback(), nullptr, net_log_.bound());
[email protected]11c05872013-08-20 02:04:121480
[email protected]d7599122014-05-24 03:37:231481 CreateSessionWithNextProtos();
[email protected]11c05872013-08-20 02:04:121482 session_->quic_stream_factory()->set_require_confirmation(true);
1483 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1484
1485 scoped_ptr<HttpNetworkTransaction> trans(
1486 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1487 TestCompletionCallback callback;
1488 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1489 EXPECT_EQ(ERR_IO_PENDING, rv);
1490
1491 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1492 QuicSession::HANDSHAKE_CONFIRMED);
1493 EXPECT_EQ(OK, callback.WaitForResult());
rchb27683c2015-07-29 23:53:501494
1495 CheckWasQuicResponse(trans);
1496 CheckResponseData(trans, "hello!");
[email protected]11c05872013-08-20 02:04:121497}
1498
[email protected]1e960032013-12-20 19:00:201499TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
[email protected]3316d422013-05-03 21:45:301500 // Alternate-protocol job
1501 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1));
1502 MockRead quic_reads[] = {
rchb27683c2015-07-29 23:53:501503 MockRead(ASYNC, close->data(), close->length()),
1504 MockRead(ASYNC, ERR_IO_PENDING), // No more data to read
1505 MockRead(ASYNC, OK), // EOF
[email protected]3316d422013-05-03 21:45:301506 };
1507 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421508 nullptr, 0);
[email protected]3316d422013-05-03 21:45:301509 socket_factory_.AddSocketDataProvider(&quic_data);
1510
1511 // Main job which will succeed even though the alternate job fails.
1512 MockRead http_reads[] = {
1513 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
1514 MockRead("hello from http"),
1515 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1516 MockRead(ASYNC, OK)
1517 };
1518
1519 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421520 nullptr, 0);
[email protected]3316d422013-05-03 21:45:301521 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561522 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]3316d422013-05-03 21:45:301523
[email protected]d7599122014-05-24 03:37:231524 CreateSessionWithNextProtos();
[email protected]aa9b14d2013-05-10 23:45:191525 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1526 SendRequestAndExpectHttpResponse("hello from http");
1527 ExpectBrokenAlternateProtocolMapping();
[email protected]3316d422013-05-03 21:45:301528}
1529
[email protected]1e960032013-12-20 19:00:201530TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
[email protected]d03a66d2013-05-06 12:55:591531 // Alternate-protocol job
1532 MockRead quic_reads[] = {
1533 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
1534 };
1535 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421536 nullptr, 0);
[email protected]d03a66d2013-05-06 12:55:591537 socket_factory_.AddSocketDataProvider(&quic_data);
1538
1539 // Main job which will succeed even though the alternate job fails.
1540 MockRead http_reads[] = {
1541 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
1542 MockRead("hello from http"),
1543 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1544 MockRead(ASYNC, OK)
1545 };
1546
1547 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421548 nullptr, 0);
[email protected]d03a66d2013-05-06 12:55:591549 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561550 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]d03a66d2013-05-06 12:55:591551
[email protected]d7599122014-05-24 03:37:231552 CreateSessionWithNextProtos();
[email protected]d03a66d2013-05-06 12:55:591553
[email protected]aa9b14d2013-05-10 23:45:191554 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1555 SendRequestAndExpectHttpResponse("hello from http");
1556 ExpectBrokenAlternateProtocolMapping();
[email protected]d03a66d2013-05-06 12:55:591557}
1558
[email protected]00c159f2014-05-21 22:38:161559TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) {
[email protected]eb71ab62014-05-23 07:57:531560 // Alternate-protocol job will fail when the session attempts to read.
[email protected]00c159f2014-05-21 22:38:161561 MockRead quic_reads[] = {
1562 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
1563 };
1564 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421565 nullptr, 0);
[email protected]00c159f2014-05-21 22:38:161566 socket_factory_.AddSocketDataProvider(&quic_data);
1567
[email protected]eb71ab62014-05-23 07:57:531568 // Main job will also fail.
[email protected]00c159f2014-05-21 22:38:161569 MockRead http_reads[] = {
1570 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
1571 };
1572
1573 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421574 nullptr, 0);
[email protected]00c159f2014-05-21 22:38:161575 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED));
1576 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561577 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]00c159f2014-05-21 22:38:161578
[email protected]d7599122014-05-24 03:37:231579 CreateSessionWithNextProtos();
[email protected]00c159f2014-05-21 22:38:161580
1581 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1582 scoped_ptr<HttpNetworkTransaction> trans(
1583 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1584 TestCompletionCallback callback;
1585 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1586 EXPECT_EQ(ERR_IO_PENDING, rv);
1587 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult());
1588 ExpectQuicAlternateProtocolMapping();
1589}
1590
[email protected]1e960032013-12-20 19:00:201591TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
[email protected]77c6c162013-08-17 02:57:451592 // Alternate-protocol job
1593 MockRead quic_reads[] = {
1594 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
1595 };
1596 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421597 nullptr, 0);
[email protected]77c6c162013-08-17 02:57:451598 socket_factory_.AddSocketDataProvider(&quic_data);
1599
1600 AddHangingNonAlternateProtocolSocketData();
1601
[email protected]c92c1b52014-05-31 04:16:061602 // Second Alternate-protocol job which will race with the TCP job.
1603 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421604 nullptr, 0);
[email protected]c92c1b52014-05-31 04:16:061605 socket_factory_.AddSocketDataProvider(&quic_data2);
1606
[email protected]4d283b32013-10-17 12:57:271607 // Final job that will proceed when the QUIC job fails.
1608 MockRead http_reads[] = {
1609 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
1610 MockRead("hello from http"),
1611 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1612 MockRead(ASYNC, OK)
1613 };
1614
1615 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421616 nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271617 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561618 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d283b32013-10-17 12:57:271619
[email protected]d7599122014-05-24 03:37:231620 CreateSessionWithNextProtos();
[email protected]77c6c162013-08-17 02:57:451621
1622 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1623
[email protected]4d283b32013-10-17 12:57:271624 SendRequestAndExpectHttpResponse("hello from http");
[email protected]77c6c162013-08-17 02:57:451625
1626 ExpectBrokenAlternateProtocolMapping();
[email protected]4d283b32013-10-17 12:57:271627
rch37de576c2015-05-17 20:28:171628 EXPECT_TRUE(quic_data.AllReadDataConsumed());
1629 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
[email protected]77c6c162013-08-17 02:57:451630}
1631
[email protected]93b31772014-06-19 08:03:351632TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) {
[email protected]65768442014-06-06 23:37:031633 // Alternate-protocol job
1634 MockRead quic_reads[] = {
1635 MockRead(ASYNC, ERR_IO_PENDING),
1636 };
1637 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads),
rtennetibe635732014-10-02 22:51:421638 nullptr, 0);
[email protected]65768442014-06-06 23:37:031639 socket_factory_.AddSocketDataProvider(&quic_data);
1640
1641 // Main job that will proceed when the QUIC job fails.
1642 MockRead http_reads[] = {
1643 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
1644 MockRead("hello from http"),
1645 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1646 MockRead(ASYNC, OK)
1647 };
1648
1649 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421650 nullptr, 0);
[email protected]65768442014-06-06 23:37:031651 socket_factory_.AddSocketDataProvider(&http_data);
1652
1653 CreateSessionWithNextProtos();
1654
1655 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1656
1657 SendRequestAndExpectHttpResponse("hello from http");
1658}
1659
[email protected]eb71ab62014-05-23 07:57:531660TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
[email protected]4d590c9c2014-05-02 05:14:331661 // Alternate-protocol job will fail before creating a QUIC session.
rtennetibe635732014-10-02 22:51:421662 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0);
[email protected]4d590c9c2014-05-02 05:14:331663 quic_data.set_connect_data(MockConnect(SYNCHRONOUS,
1664 ERR_INTERNET_DISCONNECTED));
1665 socket_factory_.AddSocketDataProvider(&quic_data);
1666
1667 // Main job which will succeed even though the alternate job fails.
1668 MockRead http_reads[] = {
1669 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
1670 MockRead("hello from http"),
1671 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1672 MockRead(ASYNC, OK)
1673 };
1674
1675 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421676 nullptr, 0);
[email protected]4d590c9c2014-05-02 05:14:331677 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561678 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4d590c9c2014-05-02 05:14:331679
[email protected]d7599122014-05-24 03:37:231680 CreateSessionWithNextProtos();
[email protected]4d590c9c2014-05-02 05:14:331681 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
1682 SendRequestAndExpectHttpResponse("hello from http");
[email protected]eb71ab62014-05-23 07:57:531683
1684 ExpectBrokenAlternateProtocolMapping();
[email protected]4d590c9c2014-05-02 05:14:331685}
1686
[email protected]4fee9672014-01-08 14:47:151687TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
[email protected]4fee9672014-01-08 14:47:151688 MockQuicData mock_quic_data;
rcha5399e02015-04-21 19:32:041689 mock_quic_data.AddSynchronousRead(ConstructConnectionClosePacket(1));
[email protected]92bf17c2014-03-03 21:14:031690 mock_quic_data.AddWrite(
[email protected]66ae5962014-05-22 11:13:051691 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
rchf114d982015-10-21 01:34:561692 GetRequestHeaders("GET", "https", "/")));
[email protected]92bf17c2014-03-03 21:14:031693 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rcha5399e02015-04-21 19:32:041694 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
[email protected]4fee9672014-01-08 14:47:151695
1696 // When the QUIC connection fails, we will try the request again over HTTP.
1697 MockRead http_reads[] = {
rchf114d982015-10-21 01:34:561698 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader),
1699 MockRead("hello world"),
1700 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
1701 MockRead(ASYNC, OK)};
[email protected]4fee9672014-01-08 14:47:151702
1703 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
rtennetibe635732014-10-02 22:51:421704 nullptr, 0);
[email protected]4fee9672014-01-08 14:47:151705 socket_factory_.AddSocketDataProvider(&http_data);
rchf114d982015-10-21 01:34:561706 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
[email protected]4fee9672014-01-08 14:47:151707
1708 // In order for a new QUIC session to be established via alternate-protocol
1709 // without racing an HTTP connection, we need the host resolution to happen
1710 // synchronously.
1711 host_resolver_.set_synchronous_mode(true);
rchf114d982015-10-21 01:34:561712 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1",
1713 "");
1714 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443));
[email protected]4fee9672014-01-08 14:47:151715 AddressList address;
1716 host_resolver_.Resolve(info,
1717 DEFAULT_PRIORITY,
1718 &address,
1719 CompletionCallback(),
rtennetibe635732014-10-02 22:51:421720 nullptr,
[email protected]4fee9672014-01-08 14:47:151721 net_log_.bound());
1722
[email protected]d7599122014-05-24 03:37:231723 CreateSessionWithNextProtos();
[email protected]4fee9672014-01-08 14:47:151724 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
1725 SendRequestAndExpectHttpResponse("hello world");
1726}
1727
bnc508835902015-05-12 20:10:291728TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) {
bncb07c05532015-05-14 19:07:201729 maker_.set_hostname("www.example.org");
tbansalfdf5665b2015-09-21 22:46:401730 EXPECT_FALSE(
1731 test_network_quality_estimator_->IsRTTAvailableNotificationReceived());
bnc508835902015-05-12 20:10:291732 MockQuicData mock_quic_data;
1733 mock_quic_data.AddWrite(
1734 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1735 GetRequestHeaders("GET", "https", "/")));
1736 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1737 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1738 mock_quic_data.AddRead(
1739 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1740 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
rchb27683c2015-07-29 23:53:501741 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
bnc508835902015-05-12 20:10:291742 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1743
bncb07c05532015-05-14 19:07:201744 request_.url = GURL("https://www.example.org:443");
bnc508835902015-05-12 20:10:291745 AddHangingNonAlternateProtocolSocketData();
1746 CreateSessionWithNextProtos();
1747 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
1748 SendRequestAndExpectQuicResponse("hello!");
tbansalfdf5665b2015-09-21 22:46:401749 EXPECT_TRUE(
1750 test_network_quality_estimator_->IsRTTAvailableNotificationReceived());
bnc508835902015-05-12 20:10:291751}
1752
[email protected]61a527782013-02-21 03:58:001753} // namespace test
1754} // namespace net