blob: b2a2d0933cad2a712db7473b510ad45ac37b666b [file] [log] [blame]
[email protected]e13201d82012-12-12 05:00:321// 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
5#include "net/quic/quic_stream_factory.h"
6
[email protected]e13201d82012-12-12 05:00:327#include "base/run_loop.h"
[email protected]fc9be5802013-06-11 10:56:518#include "base/strings/string_util.h"
skyostil4891b25b2015-06-11 11:43:459#include "base/thread_task_runner_handle.h"
[email protected]eed749f92013-12-23 18:57:3810#include "net/base/test_data_directory.h"
[email protected]6d1b4ed2013-07-10 03:57:5411#include "net/cert/cert_verifier.h"
rtenneti052774e2015-11-24 21:00:1212#include "net/cert/multi_log_ct_verifier.h"
[email protected]f2cb3cf2013-03-21 01:40:5313#include "net/dns/mock_host_resolver.h"
[email protected]e13201d82012-12-12 05:00:3214#include "net/http/http_response_headers.h"
15#include "net/http/http_response_info.h"
rtenneti8332ba52015-09-17 19:33:4116#include "net/http/http_server_properties_impl.h"
[email protected]e13201d82012-12-12 05:00:3217#include "net/http/http_util.h"
[email protected]080b77932014-08-04 01:22:4618#include "net/http/transport_security_state.h"
[email protected]c49ff182013-09-28 08:33:2619#include "net/quic/crypto/crypto_handshake.h"
[email protected]b694e48c2014-03-18 17:10:1320#include "net/quic/crypto/proof_verifier_chromium.h"
rtenneticd2aaa15b2015-10-10 20:29:3321#include "net/quic/crypto/properties_based_quic_server_info.h"
22#include "net/quic/crypto/quic_crypto_client_config.h"
[email protected]4df69842013-02-27 06:32:1623#include "net/quic/crypto/quic_decrypter.h"
24#include "net/quic/crypto/quic_encrypter.h"
rtenneti38f5cd52014-10-28 20:28:2825#include "net/quic/crypto/quic_server_info.h"
[email protected]e13201d82012-12-12 05:00:3226#include "net/quic/quic_http_stream.h"
[email protected]257f24f2014-04-01 09:15:3727#include "net/quic/quic_server_id.h"
[email protected]e13201d82012-12-12 05:00:3228#include "net/quic/test_tools/mock_clock.h"
[email protected]e8ff26842013-03-22 21:02:0529#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
[email protected]9558c5d32012-12-22 00:08:1430#include "net/quic/test_tools/mock_random.h"
[email protected]1e960032013-12-20 19:00:2031#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]e13201d82012-12-12 05:00:3232#include "net/quic/test_tools/quic_test_utils.h"
rtenneti38f5cd52014-10-28 20:28:2833#include "net/quic/test_tools/test_task_runner.h"
[email protected]e13201d82012-12-12 05:00:3234#include "net/socket/socket_test_util.h"
rtenneti1cd3b162015-09-29 02:58:2835#include "net/spdy/spdy_session_test_util.h"
[email protected]5db452202014-08-19 05:22:1536#include "net/spdy/spdy_test_utils.h"
[email protected]6b8a3c742014-07-25 00:25:3537#include "net/ssl/channel_id_service.h"
38#include "net/ssl/default_channel_id_store.h"
[email protected]eed749f92013-12-23 18:57:3839#include "net/test/cert_test_util.h"
[email protected]e13201d82012-12-12 05:00:3240#include "testing/gtest/include/gtest/gtest.h"
41
[email protected]6e12d702013-11-13 00:17:1742using base::StringPiece;
rtenneti14abd312015-02-06 21:56:0143using std::ostream;
[email protected]6e12d702013-11-13 00:17:1744using std::string;
45using std::vector;
46
[email protected]e13201d82012-12-12 05:00:3247namespace net {
[email protected]e13201d82012-12-12 05:00:3248namespace test {
49
[email protected]3c772402013-12-18 21:38:1150namespace {
51const char kDefaultServerHostName[] = "www.google.com";
52const int kDefaultServerPort = 443;
rtenneti14abd312015-02-06 21:56:0153
54// Run all tests with all the combinations of versions and
55// enable_connection_racing.
56struct TestParams {
57 TestParams(const QuicVersion version, bool enable_connection_racing)
58 : version(version), enable_connection_racing(enable_connection_racing) {}
59
60 friend ostream& operator<<(ostream& os, const TestParams& p) {
61 os << "{ version: " << QuicVersionToString(p.version);
62 os << " enable_connection_racing: " << p.enable_connection_racing << " }";
63 return os;
64 }
65
66 QuicVersion version;
67 bool enable_connection_racing;
68};
69
70// Constructs various test permutations.
71vector<TestParams> GetTestParams() {
72 vector<TestParams> params;
73 QuicVersionVector all_supported_versions = QuicSupportedVersions();
74 for (const QuicVersion version : all_supported_versions) {
75 params.push_back(TestParams(version, false));
76 params.push_back(TestParams(version, true));
77 }
78 return params;
79}
80
[email protected]3c772402013-12-18 21:38:1181} // namespace anonymous
82
[email protected]c49ff182013-09-28 08:33:2683class QuicStreamFactoryPeer {
84 public:
[email protected]59c0bbd2014-03-22 04:08:1285 static QuicCryptoClientConfig* GetCryptoConfig(QuicStreamFactory* factory) {
86 return &factory->crypto_config_;
[email protected]c49ff182013-09-28 08:33:2687 }
[email protected]4d283b32013-10-17 12:57:2788
89 static bool HasActiveSession(QuicStreamFactory* factory,
rchf114d982015-10-21 01:34:5690 const HostPortPair& host_port_pair) {
rch1fe2eeb2015-10-26 14:45:5791 QuicServerId server_id(host_port_pair, PRIVACY_MODE_DISABLED);
[email protected]257f24f2014-04-01 09:15:3792 return factory->HasActiveSession(server_id);
[email protected]4d283b32013-10-17 12:57:2793 }
94
ckrasic4f9d88d2015-07-22 22:23:1695 static QuicChromiumClientSession* GetActiveSession(
[email protected]4d283b32013-10-17 12:57:2796 QuicStreamFactory* factory,
rchf114d982015-10-21 01:34:5697 const HostPortPair& host_port_pair) {
rch1fe2eeb2015-10-26 14:45:5798 QuicServerId server_id(host_port_pair, PRIVACY_MODE_DISABLED);
[email protected]257f24f2014-04-01 09:15:3799 DCHECK(factory->HasActiveSession(server_id));
100 return factory->active_sessions_[server_id];
[email protected]df157d9d2014-03-10 07:27:27101 }
102
bnccb7ff3c2015-05-21 20:51:55103 static scoped_ptr<QuicHttpStream> CreateFromSession(
[email protected]df157d9d2014-03-10 07:27:27104 QuicStreamFactory* factory,
ckrasic4f9d88d2015-07-22 22:23:16105 QuicChromiumClientSession* session) {
bnccb7ff3c2015-05-21 20:51:55106 return factory->CreateFromSession(session);
[email protected]4d283b32013-10-17 12:57:27107 }
108
109 static bool IsLiveSession(QuicStreamFactory* factory,
ckrasic4f9d88d2015-07-22 22:23:16110 QuicChromiumClientSession* session) {
[email protected]4d590c9c2014-05-02 05:14:33111 for (QuicStreamFactory::SessionIdMap::iterator it =
[email protected]4d283b32013-10-17 12:57:27112 factory->all_sessions_.begin();
113 it != factory->all_sessions_.end(); ++it) {
[email protected]4d590c9c2014-05-02 05:14:33114 if (it->first == session)
[email protected]4d283b32013-10-17 12:57:27115 return true;
116 }
117 return false;
118 }
jri584002d12014-09-09 00:51:28119
rtenneti38f5cd52014-10-28 20:28:28120 static void SetTaskRunner(QuicStreamFactory* factory,
121 base::TaskRunner* task_runner) {
122 factory->task_runner_ = task_runner;
123 }
124
rtenneti85dcfac22015-03-27 20:22:19125 static int GetNumberOfLossyConnections(QuicStreamFactory* factory,
126 uint16 port) {
127 return factory->number_of_lossy_connections_[port];
128 }
129
130 static bool IsQuicDisabled(QuicStreamFactory* factory, uint16 port) {
131 return factory->IsQuicDisabled(port);
132 }
133
rtenneti8332ba52015-09-17 19:33:41134 static bool GetDelayTcpRace(QuicStreamFactory* factory) {
135 return factory->delay_tcp_race_;
136 }
137
138 static void SetDelayTcpRace(QuicStreamFactory* factory, bool delay_tcp_race) {
139 factory->delay_tcp_race_ = delay_tcp_race;
140 }
141
rtenneti1cd3b162015-09-29 02:58:28142 static void SetYieldAfterPackets(QuicStreamFactory* factory,
143 int yield_after_packets) {
144 factory->yield_after_packets_ = yield_after_packets;
145 }
146
147 static void SetYieldAfterDuration(QuicStreamFactory* factory,
148 QuicTime::Delta yield_after_duration) {
149 factory->yield_after_duration_ = yield_after_duration;
150 }
151
rtenneti14abd312015-02-06 21:56:01152 static size_t GetNumberOfActiveJobs(QuicStreamFactory* factory,
153 const QuicServerId& server_id) {
154 return (factory->active_jobs_[server_id]).size();
155 }
ckrasic1e53b642015-07-08 22:39:35156
ckrasic1e53b642015-07-08 22:39:35157 static int GetNumTimeoutsWithOpenStreams(QuicStreamFactory* factory) {
158 return factory->num_timeouts_with_open_streams_;
159 }
160
ckrasic1e53b642015-07-08 22:39:35161 static int GetNumPublicResetsPostHandshake(QuicStreamFactory* factory) {
162 return factory->num_public_resets_post_handshake_;
163 }
rtenneti8a80a6dc2015-09-21 19:51:13164
rtenneticd2aaa15b2015-10-10 20:29:33165 static void MaybeInitialize(QuicStreamFactory* factory) {
166 factory->MaybeInitialize();
rtenneti8a80a6dc2015-09-21 19:51:13167 }
168
rtenneticd2aaa15b2015-10-10 20:29:33169 static bool HasInitializedData(QuicStreamFactory* factory) {
170 return factory->has_initialized_data_;
rtenneti8a80a6dc2015-09-21 19:51:13171 }
172
173 static bool SupportsQuicAtStartUp(QuicStreamFactory* factory,
174 HostPortPair host_port_pair) {
175 return ContainsKey(factory->quic_supported_servers_at_startup_,
176 host_port_pair);
177 }
rtenneticd2aaa15b2015-10-10 20:29:33178
179 static bool CryptoConfigCacheIsEmpty(QuicStreamFactory* factory,
180 QuicServerId& quic_server_id) {
181 return factory->CryptoConfigCacheIsEmpty(quic_server_id);
182 }
[email protected]c49ff182013-09-28 08:33:26183};
184
rtenneti38f5cd52014-10-28 20:28:28185class MockQuicServerInfo : public QuicServerInfo {
186 public:
187 MockQuicServerInfo(const QuicServerId& server_id)
188 : QuicServerInfo(server_id) {}
dcheng2339883c2014-12-23 00:23:05189 ~MockQuicServerInfo() override {}
rtenneti38f5cd52014-10-28 20:28:28190
dcheng2339883c2014-12-23 00:23:05191 void Start() override {}
rtenneti38f5cd52014-10-28 20:28:28192
dcheng2339883c2014-12-23 00:23:05193 int WaitForDataReady(const CompletionCallback& callback) override {
rtenneti38f5cd52014-10-28 20:28:28194 return ERR_IO_PENDING;
195 }
196
rtenneti170f36a2015-02-10 19:13:45197 void ResetWaitForDataReadyCallback() override {}
198
dcheng2339883c2014-12-23 00:23:05199 void CancelWaitForDataReadyCallback() override {}
rtenneti38f5cd52014-10-28 20:28:28200
dcheng2339883c2014-12-23 00:23:05201 bool IsDataReady() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28202
dcheng2339883c2014-12-23 00:23:05203 bool IsReadyToPersist() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28204
dcheng2339883c2014-12-23 00:23:05205 void Persist() override {}
rtennetif0b832b2014-11-07 02:32:30206
dcheng2339883c2014-12-23 00:23:05207 void OnExternalCacheHit() override {}
rtenneti38f5cd52014-10-28 20:28:28208};
209
210class MockQuicServerInfoFactory : public QuicServerInfoFactory {
211 public:
212 MockQuicServerInfoFactory() {}
dcheng2339883c2014-12-23 00:23:05213 ~MockQuicServerInfoFactory() override {}
rtenneti38f5cd52014-10-28 20:28:28214
dcheng2339883c2014-12-23 00:23:05215 QuicServerInfo* GetForServer(const QuicServerId& server_id) override {
rtenneti38f5cd52014-10-28 20:28:28216 return new MockQuicServerInfo(server_id);
217 }
218};
219
rtenneti14abd312015-02-06 21:56:01220class QuicStreamFactoryTest : public ::testing::TestWithParam<TestParams> {
[email protected]e13201d82012-12-12 05:00:32221 protected:
222 QuicStreamFactoryTest()
[email protected]457d6952013-12-13 09:24:58223 : random_generator_(0),
224 clock_(new MockClock()),
rtenneti38f5cd52014-10-28 20:28:28225 runner_(new TestTaskRunner(clock_)),
bncb07c05532015-05-14 19:07:20226 maker_(GetParam().version, 0, clock_, kDefaultServerHostName),
[email protected]59c0bbd2014-03-22 04:08:12227 cert_verifier_(CertVerifier::CreateDefault()),
jri2b966f22014-09-02 22:25:36228 channel_id_service_(
rtennetibe635732014-10-02 22:51:42229 new ChannelIDService(new DefaultChannelIDStore(nullptr),
skyostil4891b25b2015-06-11 11:43:45230 base::ThreadTaskRunnerHandle::Get())),
rtenneti052774e2015-11-24 21:00:12231 cert_transparency_verifier_(new MultiLogCTVerifier()),
jri7046038f2015-10-22 00:29:26232 factory_(nullptr),
[email protected]bf4ea2f2014-03-10 22:57:53233 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
jri7046038f2015-10-22 00:29:26234 privacy_mode_(PRIVACY_MODE_DISABLED),
235 enable_port_selection_(true),
236 always_require_handshake_confirmation_(false),
237 disable_connection_pooling_(false),
238 load_server_info_timeout_srtt_multiplier_(0.0f),
239 enable_connection_racing_(true),
240 enable_non_blocking_io_(true),
241 disable_disk_cache_(false),
242 prefer_aes_(false),
243 max_number_of_lossy_connections_(0),
244 packet_loss_threshold_(1.0f),
245 max_disabled_reasons_(3),
246 threshold_timeouts_with_open_streams_(2),
247 threshold_public_resets_post_handshake_(2),
248 receive_buffer_size_(0),
249 delay_tcp_race_(false),
jri8c44d692015-10-23 23:53:41250 store_server_configs_in_properties_(false),
251 close_sessions_on_ip_change_(false) {
[email protected]ca4e0d92014-08-22 16:33:22252 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
jri7046038f2015-10-22 00:29:26253 }
254
255 void Initialize() {
256 factory_.reset(new QuicStreamFactory(
257 &host_resolver_, &socket_factory_, http_server_properties_.GetWeakPtr(),
258 cert_verifier_.get(), nullptr, channel_id_service_.get(),
rtenneti052774e2015-11-24 21:00:12259 &transport_security_state_, cert_transparency_verifier_.get(),
jri7046038f2015-10-22 00:29:26260 /*SocketPerformanceWatcherFactory*/ nullptr,
261 &crypto_client_stream_factory_, &random_generator_, clock_,
262 kDefaultMaxPacketSize, std::string(),
263 SupportedVersions(GetParam().version), enable_port_selection_,
264 always_require_handshake_confirmation_, disable_connection_pooling_,
265 load_server_info_timeout_srtt_multiplier_, enable_connection_racing_,
266 enable_non_blocking_io_, disable_disk_cache_, prefer_aes_,
267 max_number_of_lossy_connections_, packet_loss_threshold_,
268 max_disabled_reasons_, threshold_timeouts_with_open_streams_,
269 threshold_public_resets_post_handshake_, receive_buffer_size_,
jri8c44d692015-10-23 23:53:41270 delay_tcp_race_, store_server_configs_in_properties_,
271 close_sessions_on_ip_change_, QuicTagVector()));
jri7046038f2015-10-22 00:29:26272 factory_->set_require_confirmation(false);
273 factory_->set_quic_server_info_factory(new MockQuicServerInfoFactory());
[email protected]e13201d82012-12-12 05:00:32274 }
275
bnccb7ff3c2015-05-21 20:51:55276 bool HasActiveSession(const HostPortPair& host_port_pair) {
jri7046038f2015-10-22 00:29:26277 return QuicStreamFactoryPeer::HasActiveSession(factory_.get(),
278 host_port_pair);
bnccb7ff3c2015-05-21 20:51:55279 }
280
281 scoped_ptr<QuicHttpStream> CreateFromSession(
282 const HostPortPair& host_port_pair) {
ckrasic4f9d88d2015-07-22 22:23:16283 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:26284 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair);
285 return QuicStreamFactoryPeer::CreateFromSession(factory_.get(), session);
[email protected]df157d9d2014-03-10 07:27:27286 }
[email protected]e13201d82012-12-12 05:00:32287
[email protected]bf4ea2f2014-03-10 22:57:53288 int GetSourcePortForNewSession(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10289 return GetSourcePortForNewSessionInner(destination, false);
290 }
291
292 int GetSourcePortForNewSessionAndGoAway(
[email protected]bf4ea2f2014-03-10 22:57:53293 const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10294 return GetSourcePortForNewSessionInner(destination, true);
295 }
296
[email protected]bf4ea2f2014-03-10 22:57:53297 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
[email protected]d8e2abf82014-03-06 10:30:10298 bool goaway_received) {
[email protected]3c772402013-12-18 21:38:11299 // Should only be called if there is no active session for this destination.
bnccb7ff3c2015-05-21 20:51:55300 EXPECT_FALSE(HasActiveSession(destination));
[email protected]3c772402013-12-18 21:38:11301 size_t socket_count = socket_factory_.udp_client_sockets().size();
302
303 MockRead reads[] = {
304 MockRead(ASYNC, OK, 0) // EOF
305 };
rtennetibe635732014-10-02 22:51:42306 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]3c772402013-12-18 21:38:11307 socket_data.StopAfter(1);
308 socket_factory_.AddSocketDataProvider(&socket_data);
309
jri7046038f2015-10-22 00:29:26310 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:59311 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56312 request.Request(destination, privacy_mode_,
rtennetia75df622015-06-21 23:59:50313 /*cert_verify_flags=*/0, destination.host(),
314 "GET", net_log_, callback_.callback()));
[email protected]3c772402013-12-18 21:38:11315
316 EXPECT_EQ(OK, callback_.WaitForResult());
317 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
318 EXPECT_TRUE(stream.get());
319 stream.reset();
320
ckrasic4f9d88d2015-07-22 22:23:16321 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:26322 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), destination);
[email protected]3c772402013-12-18 21:38:11323
324 if (socket_count + 1 != socket_factory_.udp_client_sockets().size()) {
325 EXPECT_TRUE(false);
326 return 0;
327 }
328
329 IPEndPoint endpoint;
330 socket_factory_.
331 udp_client_sockets()[socket_count]->GetLocalAddress(&endpoint);
332 int port = endpoint.port();
[email protected]d8e2abf82014-03-06 10:30:10333 if (goaway_received) {
334 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, "");
rtenneti9bd5d4b2015-08-21 05:44:52335 session->connection()->OnGoAwayFrame(goaway);
[email protected]d8e2abf82014-03-06 10:30:10336 }
[email protected]3c772402013-12-18 21:38:11337
jri7046038f2015-10-22 00:29:26338 factory_->OnSessionClosed(session);
bnccb7ff3c2015-05-21 20:51:55339 EXPECT_FALSE(HasActiveSession(destination));
rch37de576c2015-05-17 20:28:17340 EXPECT_TRUE(socket_data.AllReadDataConsumed());
341 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:11342 return port;
343 }
344
rtenneti1cd3b162015-09-29 02:58:28345 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
346 QuicPacketNumber num) {
347 return maker_.MakeConnectionClosePacket(num);
348 }
349
[email protected]459a7402014-02-10 12:58:52350 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() {
[email protected]66ae5962014-05-22 11:13:05351 QuicStreamId stream_id = kClientDataStreamId1;
[email protected]51cc1342014-04-18 23:44:37352 return maker_.MakeRstPacket(
353 1, true, stream_id,
rtenneti14abd312015-02-06 21:56:01354 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam().version));
[email protected]459a7402014-02-10 12:58:52355 }
356
bncf8bf0722015-05-19 20:04:13357 static ProofVerifyDetailsChromium DefaultProofVerifyDetails() {
358 // Load a certificate that is valid for www.example.org, mail.example.org,
359 // and mail.example.com.
360 scoped_refptr<X509Certificate> test_cert(
361 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
362 EXPECT_TRUE(test_cert.get());
363 ProofVerifyDetailsChromium verify_details;
364 verify_details.cert_verify_result.verified_cert = test_cert;
365 verify_details.cert_verify_result.is_issued_by_known_root = true;
366 return verify_details;
367 }
368
jri8c44d692015-10-23 23:53:41369 void NotifyIPAddressChanged() {
370 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
371 // For thread safety, the NCN queues tasks to do the actual notifications,
372 // so we need to spin the message loop so the notification is delivered.
373 base::MessageLoop::current()->RunUntilIdle();
374 }
375
[email protected]e13201d82012-12-12 05:00:32376 MockHostResolver host_resolver_;
[email protected]0edce6a2013-05-08 18:02:40377 DeterministicMockClientSocketFactory socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05378 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]9558c5d32012-12-22 00:08:14379 MockRandom random_generator_;
[email protected]872edd9e2013-01-16 08:51:15380 MockClock* clock_; // Owned by factory_.
rtenneti38f5cd52014-10-28 20:28:28381 scoped_refptr<TestTaskRunner> runner_;
rtenneti4b06ae72014-08-26 03:43:43382 QuicTestPacketMaker maker_;
rtenneticcab42b2015-10-09 06:38:16383 HttpServerPropertiesImpl http_server_properties_;
[email protected]59c0bbd2014-03-22 04:08:12384 scoped_ptr<CertVerifier> cert_verifier_;
[email protected]6b8a3c742014-07-25 00:25:35385 scoped_ptr<ChannelIDService> channel_id_service_;
[email protected]080b77932014-08-04 01:22:46386 TransportSecurityState transport_security_state_;
rtenneti052774e2015-11-24 21:00:12387 scoped_ptr<CTVerifier> cert_transparency_verifier_;
jri7046038f2015-10-22 00:29:26388 scoped_ptr<QuicStreamFactory> factory_;
[email protected]bf4ea2f2014-03-10 22:57:53389 HostPortPair host_port_pair_;
[email protected]9dd3ff0f2014-03-26 09:51:28390 PrivacyMode privacy_mode_;
[email protected]e13201d82012-12-12 05:00:32391 BoundNetLog net_log_;
392 TestCompletionCallback callback_;
jri7046038f2015-10-22 00:29:26393
394 // Variables to configure QuicStreamFactory.
395 bool enable_port_selection_;
396 bool always_require_handshake_confirmation_;
397 bool disable_connection_pooling_;
398 double load_server_info_timeout_srtt_multiplier_;
399 bool enable_connection_racing_;
400 bool enable_non_blocking_io_;
401 bool disable_disk_cache_;
402 bool prefer_aes_;
403 int max_number_of_lossy_connections_;
404 double packet_loss_threshold_;
405 int max_disabled_reasons_;
406 int threshold_timeouts_with_open_streams_;
407 int threshold_public_resets_post_handshake_;
408 int receive_buffer_size_;
409 bool delay_tcp_race_;
410 bool store_server_configs_in_properties_;
jri8c44d692015-10-23 23:53:41411 bool close_sessions_on_ip_change_;
[email protected]e13201d82012-12-12 05:00:32412};
413
rtenneti14abd312015-02-06 21:56:01414INSTANTIATE_TEST_CASE_P(Version,
415 QuicStreamFactoryTest,
416 ::testing::ValuesIn(GetTestParams()));
[email protected]1e960032013-12-20 19:00:20417
[email protected]1e960032013-12-20 19:00:20418TEST_P(QuicStreamFactoryTest, Create) {
jri7046038f2015-10-22 00:29:26419 Initialize();
420
[email protected]69dfd1b2013-06-04 22:20:12421 MockRead reads[] = {
[email protected]25c31dc2013-06-05 17:56:04422 MockRead(ASYNC, OK, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:12423 };
rtennetibe635732014-10-02 22:51:42424 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:32425 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]25c31dc2013-06-05 17:56:04426 socket_data.StopAfter(1);
[email protected]e13201d82012-12-12 05:00:32427
jri7046038f2015-10-22 00:29:26428 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:59429 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56430 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50431 /*cert_verify_flags=*/0, host_port_pair_.host(),
432 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32433
434 EXPECT_EQ(OK, callback_.WaitForResult());
435 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0edce6a2013-05-08 18:02:40436 EXPECT_TRUE(stream.get());
[email protected]e13201d82012-12-12 05:00:32437
438 // Will reset stream 3.
bnccb7ff3c2015-05-21 20:51:55439 stream = CreateFromSession(host_port_pair_);
[email protected]e13201d82012-12-12 05:00:32440 EXPECT_TRUE(stream.get());
441
[email protected]6d1b4ed2013-07-10 03:57:54442 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
443 // in streams on different sessions.
jri7046038f2015-10-22 00:29:26444 QuicStreamRequest request2(factory_.get());
rtennetia75df622015-06-21 23:59:50445 EXPECT_EQ(OK,
rchf114d982015-10-21 01:34:56446 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50447 /*cert_verify_flags=*/0, host_port_pair_.host(),
448 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32449 stream = request2.ReleaseStream(); // Will reset stream 5.
450 stream.reset(); // Will reset stream 7.
451
rch37de576c2015-05-17 20:28:17452 EXPECT_TRUE(socket_data.AllReadDataConsumed());
453 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:32454}
455
[email protected]8bd2b812014-03-26 04:01:17456TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
jri7046038f2015-10-22 00:29:26457 Initialize();
458
[email protected]8bd2b812014-03-26 04:01:17459 MockRead reads[] = {
460 MockRead(ASYNC, OK, 0) // EOF
461 };
rtennetibe635732014-10-02 22:51:42462 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17463 socket_factory_.AddSocketDataProvider(&socket_data);
464 socket_data.StopAfter(1);
465
466 crypto_client_stream_factory_.set_handshake_mode(
467 MockCryptoClientStream::ZERO_RTT);
468 host_resolver_.set_synchronous_mode(true);
469 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
470 "192.168.0.1", "");
471
jri7046038f2015-10-22 00:29:26472 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56473 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50474 /*cert_verify_flags=*/0, host_port_pair_.host(),
475 "GET", net_log_, callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17476
477 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
478 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17479 EXPECT_TRUE(socket_data.AllReadDataConsumed());
480 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17481}
482
483TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
jri7046038f2015-10-22 00:29:26484 Initialize();
485
[email protected]8bd2b812014-03-26 04:01:17486 MockRead reads[] = {
487 MockRead(ASYNC, OK, 0) // EOF
488 };
rtennetibe635732014-10-02 22:51:42489 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17490 socket_factory_.AddSocketDataProvider(&socket_data);
491 socket_data.StopAfter(1);
492
493 crypto_client_stream_factory_.set_handshake_mode(
494 MockCryptoClientStream::ZERO_RTT);
495 host_resolver_.set_synchronous_mode(true);
496 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
497 "192.168.0.1", "");
498
jri7046038f2015-10-22 00:29:26499 QuicStreamRequest request(factory_.get());
[email protected]8bd2b812014-03-26 04:01:17500 // Posts require handshake confirmation, so this will return asynchronously.
501 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56502 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50503 /*cert_verify_flags=*/0, host_port_pair_.host(),
504 "POST", net_log_, callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17505
506 // Confirm the handshake and verify that the stream is created.
507 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
508 QuicSession::HANDSHAKE_CONFIRMED);
509
510 EXPECT_EQ(OK, callback_.WaitForResult());
511 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
512 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17513 EXPECT_TRUE(socket_data.AllReadDataConsumed());
514 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17515}
516
bnc68d401dd2015-05-18 20:31:48517TEST_P(QuicStreamFactoryTest, NoZeroRttForDifferentHost) {
jri7046038f2015-10-22 00:29:26518 Initialize();
519
bnc68d401dd2015-05-18 20:31:48520 MockRead reads[] = {
521 MockRead(ASYNC, OK, 0),
522 };
523 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
524 socket_factory_.AddSocketDataProvider(&socket_data);
525 socket_data.StopAfter(1);
526
527 crypto_client_stream_factory_.set_handshake_mode(
528 MockCryptoClientStream::ZERO_RTT);
529 host_resolver_.set_synchronous_mode(true);
530 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
531 "192.168.0.1", "");
532
jri7046038f2015-10-22 00:29:26533 QuicStreamRequest request(factory_.get());
rtennetia75df622015-06-21 23:59:50534 int rv = request.Request(
rchf114d982015-10-21 01:34:56535 host_port_pair_, privacy_mode_, /*cert_verify_flags=*/0,
rtennetia75df622015-06-21 23:59:50536 "different.host.example.com", "GET", net_log_, callback_.callback());
bnc68d401dd2015-05-18 20:31:48537 // If server and origin have different hostnames, then handshake confirmation
538 // should be required, so Request will return asynchronously.
539 EXPECT_EQ(ERR_IO_PENDING, rv);
540 // Confirm handshake.
541 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
542 QuicSession::HANDSHAKE_CONFIRMED);
543 EXPECT_EQ(OK, callback_.WaitForResult());
544
545 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
546 EXPECT_TRUE(stream.get());
547 EXPECT_TRUE(socket_data.AllReadDataConsumed());
548 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
549}
550
rch68955482015-09-24 00:14:39551TEST_P(QuicStreamFactoryTest, GoAway) {
jri7046038f2015-10-22 00:29:26552 Initialize();
553
rch68955482015-09-24 00:14:39554 MockRead reads[] = {
555 MockRead(ASYNC, OK, 0) // EOF
556 };
557 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
558 socket_factory_.AddSocketDataProvider(&socket_data);
559 socket_data.StopAfter(1);
560
jri7046038f2015-10-22 00:29:26561 QuicStreamRequest request(factory_.get());
rch68955482015-09-24 00:14:39562 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56563 request.Request(host_port_pair_, privacy_mode_,
rch68955482015-09-24 00:14:39564 /*cert_verify_flags=*/0, host_port_pair_.host(),
565 "GET", net_log_, callback_.callback()));
566
567 EXPECT_EQ(OK, callback_.WaitForResult());
568 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
569 EXPECT_TRUE(stream.get());
570
rchf114d982015-10-21 01:34:56571 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:26572 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
rch68955482015-09-24 00:14:39573
574 session->OnGoAway(QuicGoAwayFrame());
575
rchf114d982015-10-21 01:34:56576 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:26577 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
rch68955482015-09-24 00:14:39578
579 EXPECT_TRUE(socket_data.AllReadDataConsumed());
580 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
581}
582
[email protected]5db452202014-08-19 05:22:15583TEST_P(QuicStreamFactoryTest, Pooling) {
jri7046038f2015-10-22 00:29:26584 Initialize();
585
[email protected]eed749f92013-12-23 18:57:38586 MockRead reads[] = {
587 MockRead(ASYNC, OK, 0) // EOF
588 };
rtennetibe635732014-10-02 22:51:42589 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38590 socket_factory_.AddSocketDataProvider(&socket_data);
591 socket_data.StopAfter(1);
592
[email protected]bf4ea2f2014-03-10 22:57:53593 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38594 host_resolver_.set_synchronous_mode(true);
595 host_resolver_.rules()->AddIPLiteralRule(
596 kDefaultServerHostName, "192.168.0.1", "");
597 host_resolver_.rules()->AddIPLiteralRule(
598 "mail.google.com", "192.168.0.1", "");
599
jri7046038f2015-10-22 00:29:26600 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56601 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50602 /*cert_verify_flags=*/0, host_port_pair_.host(),
603 "GET", net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38604 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
605 EXPECT_TRUE(stream.get());
606
607 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26608 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56609 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50610 /*cert_verify_flags=*/0, server2.host(), "GET",
611 net_log_, callback.callback()));
[email protected]eed749f92013-12-23 18:57:38612 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
613 EXPECT_TRUE(stream2.get());
614
jri7046038f2015-10-22 00:29:26615 EXPECT_EQ(
616 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_),
617 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38618
rch37de576c2015-05-17 20:28:17619 EXPECT_TRUE(socket_data.AllReadDataConsumed());
620 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38621}
622
jri584002d12014-09-09 00:51:28623TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) {
jri7046038f2015-10-22 00:29:26624 disable_connection_pooling_ = true;
625 Initialize();
626
jri584002d12014-09-09 00:51:28627 MockRead reads[] = {
628 MockRead(ASYNC, OK, 0) // EOF
629 };
rtennetibe635732014-10-02 22:51:42630 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
631 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28632 socket_factory_.AddSocketDataProvider(&socket_data1);
633 socket_factory_.AddSocketDataProvider(&socket_data2);
634 socket_data1.StopAfter(1);
635 socket_data2.StopAfter(1);
636
637 HostPortPair server2("mail.google.com", kDefaultServerPort);
638 host_resolver_.set_synchronous_mode(true);
639 host_resolver_.rules()->AddIPLiteralRule(
640 kDefaultServerHostName, "192.168.0.1", "");
641 host_resolver_.rules()->AddIPLiteralRule(
642 "mail.google.com", "192.168.0.1", "");
643
jri7046038f2015-10-22 00:29:26644 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56645 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50646 /*cert_verify_flags=*/0, host_port_pair_.host(),
647 "GET", net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28648 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
649 EXPECT_TRUE(stream.get());
650
651 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26652 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56653 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50654 /*cert_verify_flags=*/0, server2.host(), "GET",
655 net_log_, callback.callback()));
jri584002d12014-09-09 00:51:28656 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
657 EXPECT_TRUE(stream2.get());
658
jri7046038f2015-10-22 00:29:26659 EXPECT_NE(
660 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_),
661 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
jri584002d12014-09-09 00:51:28662
rch37de576c2015-05-17 20:28:17663 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
664 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
665 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
666 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28667}
668
[email protected]eed749f92013-12-23 18:57:38669TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
jri7046038f2015-10-22 00:29:26670 Initialize();
671
[email protected]eed749f92013-12-23 18:57:38672 MockRead reads[] = {
673 MockRead(ASYNC, OK, 0) // EOF
674 };
rtennetibe635732014-10-02 22:51:42675 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
676 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38677 socket_factory_.AddSocketDataProvider(&socket_data1);
678 socket_factory_.AddSocketDataProvider(&socket_data2);
679 socket_data1.StopAfter(1);
680 socket_data2.StopAfter(1);
681
[email protected]bf4ea2f2014-03-10 22:57:53682 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38683 host_resolver_.set_synchronous_mode(true);
684 host_resolver_.rules()->AddIPLiteralRule(
685 kDefaultServerHostName, "192.168.0.1", "");
686 host_resolver_.rules()->AddIPLiteralRule(
687 "mail.google.com", "192.168.0.1", "");
688
jri7046038f2015-10-22 00:29:26689 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56690 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50691 /*cert_verify_flags=*/0, host_port_pair_.host(),
692 "GET", net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38693 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
694 EXPECT_TRUE(stream.get());
695
696 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26697 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56698 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50699 /*cert_verify_flags=*/0, server2.host(), "GET",
700 net_log_, callback.callback()));
[email protected]eed749f92013-12-23 18:57:38701 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
702 EXPECT_TRUE(stream2.get());
703
jri7046038f2015-10-22 00:29:26704 factory_->OnSessionGoingAway(
705 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_));
rchf114d982015-10-21 01:34:56706 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:26707 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
708 EXPECT_FALSE(
709 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38710
711 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:26712 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:56713 EXPECT_EQ(OK, request3.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50714 /*cert_verify_flags=*/0, server2.host(), "GET",
715 net_log_, callback3.callback()));
[email protected]eed749f92013-12-23 18:57:38716 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
717 EXPECT_TRUE(stream3.get());
718
jri7046038f2015-10-22 00:29:26719 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38720
rch37de576c2015-05-17 20:28:17721 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
722 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
723 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
724 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38725}
726
[email protected]5db452202014-08-19 05:22:15727TEST_P(QuicStreamFactoryTest, HttpsPooling) {
jri7046038f2015-10-22 00:29:26728 Initialize();
[email protected]eed749f92013-12-23 18:57:38729 MockRead reads[] = {
730 MockRead(ASYNC, OK, 0) // EOF
731 };
rtennetibe635732014-10-02 22:51:42732 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38733 socket_factory_.AddSocketDataProvider(&socket_data);
734 socket_data.StopAfter(1);
735
[email protected]bf4ea2f2014-03-10 22:57:53736 HostPortPair server1("www.example.org", 443);
737 HostPortPair server2("mail.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38738
bncf8bf0722015-05-19 20:04:13739 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01740 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38741
742 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53743 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
744 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38745
jri7046038f2015-10-22 00:29:26746 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56747 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
rtennetia75df622015-06-21 23:59:50748 /*cert_verify_flags=*/0, server1.host(), "GET",
749 net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38750 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
751 EXPECT_TRUE(stream.get());
752
753 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26754 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56755 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50756 /*cert_verify_flags=*/0, server2.host(), "GET",
757 net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38758 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
759 EXPECT_TRUE(stream2.get());
760
jri7046038f2015-10-22 00:29:26761 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
762 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38763
rch37de576c2015-05-17 20:28:17764 EXPECT_TRUE(socket_data.AllReadDataConsumed());
765 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38766}
767
jri584002d12014-09-09 00:51:28768TEST_P(QuicStreamFactoryTest, NoHttpsPoolingIfDisabled) {
jri7046038f2015-10-22 00:29:26769 disable_connection_pooling_ = true;
770 Initialize();
771
jri584002d12014-09-09 00:51:28772 MockRead reads[] = {
773 MockRead(ASYNC, OK, 0) // EOF
774 };
rtennetibe635732014-10-02 22:51:42775 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
776 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28777 socket_factory_.AddSocketDataProvider(&socket_data1);
778 socket_factory_.AddSocketDataProvider(&socket_data2);
779 socket_data1.StopAfter(1);
780 socket_data2.StopAfter(1);
781
782 HostPortPair server1("www.example.org", 443);
783 HostPortPair server2("mail.example.org", 443);
784
bncf8bf0722015-05-19 20:04:13785 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01786 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28787
788 host_resolver_.set_synchronous_mode(true);
789 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
790 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
791
jri7046038f2015-10-22 00:29:26792 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56793 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
rtennetia75df622015-06-21 23:59:50794 /*cert_verify_flags=*/0, server1.host(), "GET",
795 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28796 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
797 EXPECT_TRUE(stream.get());
798
799 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26800 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56801 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50802 /*cert_verify_flags=*/0, server2.host(), "GET",
803 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28804 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
805 EXPECT_TRUE(stream2.get());
806
jri7046038f2015-10-22 00:29:26807 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
808 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
jri584002d12014-09-09 00:51:28809
rch37de576c2015-05-17 20:28:17810 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
811 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
812 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
813 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28814}
815
bnccb7ff3c2015-05-21 20:51:55816class QuicAlternativeServiceCertificateValidationPooling
817 : public QuicStreamFactoryTest {
818 public:
819 void Run(bool valid) {
820 MockRead reads[] = {
821 MockRead(ASYNC, OK, 0) // EOF
822 };
823 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
824 socket_factory_.AddSocketDataProvider(&socket_data1);
825 socket_data1.StopAfter(1);
[email protected]eed749f92013-12-23 18:57:38826
bnccb7ff3c2015-05-21 20:51:55827 HostPortPair server1("www.example.org", 443);
828 HostPortPair server2("mail.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38829
bnccb7ff3c2015-05-21 20:51:55830 std::string origin_host(valid ? "mail.example.org" : "invalid.example.org");
831 HostPortPair alternative("www.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38832
bnccb7ff3c2015-05-21 20:51:55833 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
834 bool common_name_fallback_used;
835 EXPECT_EQ(valid,
836 verify_details.cert_verify_result.verified_cert->VerifyNameMatch(
837 origin_host, &common_name_fallback_used));
838 EXPECT_TRUE(
839 verify_details.cert_verify_result.verified_cert->VerifyNameMatch(
840 alternative.host(), &common_name_fallback_used));
841 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38842
bnccb7ff3c2015-05-21 20:51:55843 host_resolver_.set_synchronous_mode(true);
844 host_resolver_.rules()->AddIPLiteralRule(alternative.host(), "192.168.0.1",
845 "");
[email protected]eed749f92013-12-23 18:57:38846
bnccb7ff3c2015-05-21 20:51:55847 // Open first stream to alternative.
jri7046038f2015-10-22 00:29:26848 QuicStreamRequest request1(factory_.get());
rchf114d982015-10-21 01:34:56849 EXPECT_EQ(OK, request1.Request(alternative, privacy_mode_,
rtennetia75df622015-06-21 23:59:50850 /*cert_verify_flags=*/0, alternative.host(),
851 "GET", net_log_, callback_.callback()));
bnccb7ff3c2015-05-21 20:51:55852 scoped_ptr<QuicHttpStream> stream1 = request1.ReleaseStream();
853 EXPECT_TRUE(stream1.get());
[email protected]eed749f92013-12-23 18:57:38854
jri7046038f2015-10-22 00:29:26855 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56856 int rv = request2.Request(alternative, privacy_mode_,
rtennetia75df622015-06-21 23:59:50857 /*cert_verify_flags=*/0, origin_host, "GET",
858 net_log_, callback_.callback());
bnccb7ff3c2015-05-21 20:51:55859 if (valid) {
860 // Alternative service of origin to |alternative| should pool to session
861 // of |stream1| even if origin is different. Since only one
862 // SocketDataProvider is set up, the second request succeeding means that
863 // it pooled to the session opened by the first one.
864 EXPECT_EQ(OK, rv);
865 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
866 EXPECT_TRUE(stream2.get());
867 } else {
868 EXPECT_EQ(ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN, rv);
869 }
[email protected]eed749f92013-12-23 18:57:38870
bnccb7ff3c2015-05-21 20:51:55871 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
872 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
873 }
874};
875
876INSTANTIATE_TEST_CASE_P(Version,
877 QuicAlternativeServiceCertificateValidationPooling,
878 ::testing::ValuesIn(GetTestParams()));
879
880TEST_P(QuicAlternativeServiceCertificateValidationPooling, Valid) {
jri7046038f2015-10-22 00:29:26881 Initialize();
bnccb7ff3c2015-05-21 20:51:55882 Run(true);
883}
884
885TEST_P(QuicAlternativeServiceCertificateValidationPooling, Invalid) {
jri7046038f2015-10-22 00:29:26886 Initialize();
bnccb7ff3c2015-05-21 20:51:55887 Run(false);
[email protected]eed749f92013-12-23 18:57:38888}
889
[email protected]5db452202014-08-19 05:22:15890TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
jri7046038f2015-10-22 00:29:26891 Initialize();
[email protected]5db452202014-08-19 05:22:15892 MockRead reads[] = {
893 MockRead(ASYNC, OK, 0) // EOF
894 };
rtennetibe635732014-10-02 22:51:42895 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15896 socket_factory_.AddSocketDataProvider(&socket_data);
897 socket_data.StopAfter(1);
898
899 HostPortPair server1("www.example.org", 443);
900 HostPortPair server2("mail.example.org", 443);
901 uint8 primary_pin = 1;
902 uint8 backup_pin = 2;
903 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
904 backup_pin);
905
bncf8bf0722015-05-19 20:04:13906 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
[email protected]5db452202014-08-19 05:22:15907 verify_details.cert_verify_result.public_key_hashes.push_back(
908 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01909 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]5db452202014-08-19 05:22:15910
911 host_resolver_.set_synchronous_mode(true);
912 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
913 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
914
jri7046038f2015-10-22 00:29:26915 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56916 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
rtennetia75df622015-06-21 23:59:50917 /*cert_verify_flags=*/0, server1.host(), "GET",
918 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15919 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
920 EXPECT_TRUE(stream.get());
921
922 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26923 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56924 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50925 /*cert_verify_flags=*/0, server2.host(), "GET",
926 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15927 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
928 EXPECT_TRUE(stream2.get());
929
jri7046038f2015-10-22 00:29:26930 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
931 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]5db452202014-08-19 05:22:15932
rch37de576c2015-05-17 20:28:17933 EXPECT_TRUE(socket_data.AllReadDataConsumed());
934 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:15935}
936
jri584002d12014-09-09 00:51:28937TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithMatchingPinsIfDisabled) {
jri7046038f2015-10-22 00:29:26938 disable_connection_pooling_ = true;
939 Initialize();
940
jri584002d12014-09-09 00:51:28941 MockRead reads[] = {
942 MockRead(ASYNC, OK, 0) // EOF
943 };
rtennetibe635732014-10-02 22:51:42944 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
945 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28946 socket_factory_.AddSocketDataProvider(&socket_data1);
947 socket_factory_.AddSocketDataProvider(&socket_data2);
948 socket_data1.StopAfter(1);
949 socket_data2.StopAfter(1);
950
951 HostPortPair server1("www.example.org", 443);
952 HostPortPair server2("mail.example.org", 443);
953 uint8 primary_pin = 1;
954 uint8 backup_pin = 2;
955 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
956 backup_pin);
957
bncf8bf0722015-05-19 20:04:13958 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
jri584002d12014-09-09 00:51:28959 verify_details.cert_verify_result.public_key_hashes.push_back(
960 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01961 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28962
963 host_resolver_.set_synchronous_mode(true);
964 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
965 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
966
jri7046038f2015-10-22 00:29:26967 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56968 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
rtennetia75df622015-06-21 23:59:50969 /*cert_verify_flags=*/0, server1.host(), "GET",
970 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28971 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
972 EXPECT_TRUE(stream.get());
973
974 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26975 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56976 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50977 /*cert_verify_flags=*/0, server2.host(), "GET",
978 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28979 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
980 EXPECT_TRUE(stream2.get());
981
jri7046038f2015-10-22 00:29:26982 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
983 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
jri584002d12014-09-09 00:51:28984
rch37de576c2015-05-17 20:28:17985 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
986 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
987 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
988 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28989}
990
[email protected]5db452202014-08-19 05:22:15991TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
jri7046038f2015-10-22 00:29:26992 Initialize();
[email protected]5db452202014-08-19 05:22:15993 MockRead reads[] = {
994 MockRead(ASYNC, OK, 0) // EOF
995 };
rtennetibe635732014-10-02 22:51:42996 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
997 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15998 socket_factory_.AddSocketDataProvider(&socket_data1);
999 socket_factory_.AddSocketDataProvider(&socket_data2);
1000 socket_data1.StopAfter(1);
1001 socket_data2.StopAfter(1);
1002
1003 HostPortPair server1("www.example.org", 443);
1004 HostPortPair server2("mail.example.org", 443);
1005 uint8 primary_pin = 1;
1006 uint8 backup_pin = 2;
1007 uint8 bad_pin = 3;
1008 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
1009 backup_pin);
1010
bncf8bf0722015-05-19 20:04:131011 ProofVerifyDetailsChromium verify_details1 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011012 verify_details1.cert_verify_result.public_key_hashes.push_back(
1013 test::GetTestHashValue(bad_pin));
1014 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
1015
bncf8bf0722015-05-19 20:04:131016 ProofVerifyDetailsChromium verify_details2 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011017 verify_details2.cert_verify_result.public_key_hashes.push_back(
1018 test::GetTestHashValue(primary_pin));
1019 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
[email protected]5db452202014-08-19 05:22:151020
1021 host_resolver_.set_synchronous_mode(true);
1022 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1023 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1024
jri7046038f2015-10-22 00:29:261025 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561026 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
rtennetia75df622015-06-21 23:59:501027 /*cert_verify_flags=*/0, server1.host(), "GET",
1028 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:151029 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1030 EXPECT_TRUE(stream.get());
1031
1032 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:261033 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:561034 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:501035 /*cert_verify_flags=*/0, server2.host(), "GET",
1036 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:151037 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1038 EXPECT_TRUE(stream2.get());
1039
jri7046038f2015-10-22 00:29:261040 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
1041 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]5db452202014-08-19 05:22:151042
rch37de576c2015-05-17 20:28:171043 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1044 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1045 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1046 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:151047}
1048
[email protected]1e960032013-12-20 19:00:201049TEST_P(QuicStreamFactoryTest, Goaway) {
jri7046038f2015-10-22 00:29:261050 Initialize();
[email protected]4d283b32013-10-17 12:57:271051 MockRead reads[] = {
1052 MockRead(ASYNC, OK, 0) // EOF
1053 };
rtennetibe635732014-10-02 22:51:421054 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271055 socket_data.StopAfter(1);
1056 socket_factory_.AddSocketDataProvider(&socket_data);
rtennetibe635732014-10-02 22:51:421057 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271058 socket_data2.StopAfter(1);
1059 socket_factory_.AddSocketDataProvider(&socket_data2);
1060
jri7046038f2015-10-22 00:29:261061 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591062 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561063 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501064 /*cert_verify_flags=*/0, host_port_pair_.host(),
1065 "GET", net_log_, callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271066
1067 EXPECT_EQ(OK, callback_.WaitForResult());
1068 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1069 EXPECT_TRUE(stream.get());
1070
1071 // Mark the session as going away. Ensure that while it is still alive
1072 // that it is no longer active.
rchf114d982015-10-21 01:34:561073 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:261074 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1075 factory_->OnSessionGoingAway(session);
1076 EXPECT_EQ(true,
1077 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
rchf114d982015-10-21 01:34:561078 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261079 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
bnccb7ff3c2015-05-21 20:51:551080 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]4d283b32013-10-17 12:57:271081
1082 // Create a new request for the same destination and verify that a
1083 // new session is created.
jri7046038f2015-10-22 00:29:261084 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591085 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561086 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501087 /*cert_verify_flags=*/0, host_port_pair_.host(),
1088 "GET", net_log_, callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271089 EXPECT_EQ(OK, callback_.WaitForResult());
1090 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1091 EXPECT_TRUE(stream2.get());
1092
rchf114d982015-10-21 01:34:561093 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:261094 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
1095 EXPECT_NE(session, QuicStreamFactoryPeer::GetActiveSession(factory_.get(),
rchf114d982015-10-21 01:34:561096 host_port_pair_));
jri7046038f2015-10-22 00:29:261097 EXPECT_EQ(true,
1098 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
[email protected]4d283b32013-10-17 12:57:271099
1100 stream2.reset();
1101 stream.reset();
1102
rch37de576c2015-05-17 20:28:171103 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1104 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1105 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1106 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]4d283b32013-10-17 12:57:271107}
1108
[email protected]1e960032013-12-20 19:00:201109TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
jri7046038f2015-10-22 00:29:261110 Initialize();
[email protected]66ae5962014-05-22 11:13:051111 QuicStreamId stream_id = kClientDataStreamId1;
ckrasicea295fe2015-10-31 05:03:271112 scoped_ptr<QuicEncryptedPacket> client_rst(
[email protected]1e960032013-12-20 19:00:201113 maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
[email protected]06ff5152013-08-29 01:03:051114 MockWrite writes[] = {
ckrasicea295fe2015-10-31 05:03:271115 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 0),
1116 };
1117 scoped_ptr<QuicEncryptedPacket> server_rst(
1118 maker_.MakeRstPacket(1, false, stream_id, QUIC_STREAM_CANCELLED));
1119 MockRead reads[] = {
1120 MockRead(ASYNC, server_rst->data(), server_rst->length(), 1),
1121 MockRead(ASYNC, OK, 2) // EOF
[email protected]06ff5152013-08-29 01:03:051122 };
1123 DeterministicSocketData socket_data(reads, arraysize(reads),
1124 writes, arraysize(writes));
[email protected]0b2294d32013-08-02 00:46:361125 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasicea295fe2015-10-31 05:03:271126 socket_data.StopAfter(2);
[email protected]0b2294d32013-08-02 00:46:361127
1128 HttpRequestInfo request_info;
1129 std::vector<QuicHttpStream*> streams;
1130 // The MockCryptoClientStream sets max_open_streams to be
rtenneti6a4cf3b2015-01-09 03:41:151131 // kDefaultMaxStreamsPerConnection / 2.
1132 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection / 2; i++) {
jri7046038f2015-10-22 00:29:261133 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561134 int rv = request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501135 /*cert_verify_flags=*/0, host_port_pair_.host(),
1136 "GET", net_log_, callback_.callback());
[email protected]0b2294d32013-08-02 00:46:361137 if (i == 0) {
1138 EXPECT_EQ(ERR_IO_PENDING, rv);
1139 EXPECT_EQ(OK, callback_.WaitForResult());
1140 } else {
1141 EXPECT_EQ(OK, rv);
1142 }
1143 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1144 EXPECT_TRUE(stream);
1145 EXPECT_EQ(OK, stream->InitializeStream(
1146 &request_info, DEFAULT_PRIORITY, net_log_, CompletionCallback()));
1147 streams.push_back(stream.release());
1148 }
1149
jri7046038f2015-10-22 00:29:261150 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561151 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501152 /*cert_verify_flags=*/0, host_port_pair_.host(),
1153 "GET", net_log_, CompletionCallback()));
[email protected]0b2294d32013-08-02 00:46:361154 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1155 EXPECT_TRUE(stream);
1156 EXPECT_EQ(ERR_IO_PENDING, stream->InitializeStream(
1157 &request_info, DEFAULT_PRIORITY, net_log_, callback_.callback()));
1158
1159 // Close the first stream.
1160 streams.front()->Close(false);
ckrasicea295fe2015-10-31 05:03:271161 // Trigger exchange of RSTs that in turn allow progress for the last
1162 // stream.
1163 socket_data.RunFor(2);
[email protected]0b2294d32013-08-02 00:46:361164
1165 ASSERT_TRUE(callback_.have_result());
[email protected]0b2294d32013-08-02 00:46:361166 EXPECT_EQ(OK, callback_.WaitForResult());
1167
rch37de576c2015-05-17 20:28:171168 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1169 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
ckrasicea295fe2015-10-31 05:03:271170
1171 // Force close of the connection to suppress the generation of RST
1172 // packets when streams are torn down, which wouldn't be relevant to
1173 // this test anyway.
1174 QuicChromiumClientSession* session =
1175 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1176 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
1177
[email protected]0b2294d32013-08-02 00:46:361178 STLDeleteElements(&streams);
1179}
1180
[email protected]1e960032013-12-20 19:00:201181TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
jri7046038f2015-10-22 00:29:261182 Initialize();
rtennetibe635732014-10-02 22:51:421183 DeterministicSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321184 socket_factory_.AddSocketDataProvider(&socket_data);
1185
[email protected]3c772402013-12-18 21:38:111186 host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName);
[email protected]e13201d82012-12-12 05:00:321187
jri7046038f2015-10-22 00:29:261188 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591189 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561190 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501191 /*cert_verify_flags=*/0, host_port_pair_.host(),
1192 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321193
1194 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
1195
rch37de576c2015-05-17 20:28:171196 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1197 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321198}
1199
[email protected]1e960032013-12-20 19:00:201200TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
jri7046038f2015-10-22 00:29:261201 Initialize();
[email protected]3c772402013-12-18 21:38:111202 MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
rtennetibe635732014-10-02 22:51:421203 DeterministicSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]3c772402013-12-18 21:38:111204 socket_data.set_connect_data(connect);
1205 socket_factory_.AddSocketDataProvider(&socket_data);
1206 socket_data.StopAfter(1);
1207
jri7046038f2015-10-22 00:29:261208 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591209 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561210 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501211 /*cert_verify_flags=*/0, host_port_pair_.host(),
1212 "GET", net_log_, callback_.callback()));
[email protected]3c772402013-12-18 21:38:111213
1214 EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult());
1215
rch37de576c2015-05-17 20:28:171216 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1217 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:111218}
1219
[email protected]1e960032013-12-20 19:00:201220TEST_P(QuicStreamFactoryTest, CancelCreate) {
jri7046038f2015-10-22 00:29:261221 Initialize();
[email protected]69dfd1b2013-06-04 22:20:121222 MockRead reads[] = {
[email protected]25c31dc2013-06-05 17:56:041223 MockRead(ASYNC, OK, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121224 };
rtennetibe635732014-10-02 22:51:421225 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321226 socket_factory_.AddSocketDataProvider(&socket_data);
1227 {
jri7046038f2015-10-22 00:29:261228 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591229 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561230 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501231 /*cert_verify_flags=*/0, host_port_pair_.host(),
1232 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321233 }
1234
[email protected]25c31dc2013-06-05 17:56:041235 socket_data.StopAfter(1);
[email protected]e13201d82012-12-12 05:00:321236 base::RunLoop run_loop;
1237 run_loop.RunUntilIdle();
1238
bnccb7ff3c2015-05-21 20:51:551239 scoped_ptr<QuicHttpStream> stream(CreateFromSession(host_port_pair_));
[email protected]e13201d82012-12-12 05:00:321240 EXPECT_TRUE(stream.get());
1241 stream.reset();
1242
rch37de576c2015-05-17 20:28:171243 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1244 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321245}
1246
[email protected]1e960032013-12-20 19:00:201247TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) {
jri7046038f2015-10-22 00:29:261248 Initialize();
1249
[email protected]3c772402013-12-18 21:38:111250 // Sequentially connect to the default host, then another host, and then the
1251 // default host. Verify that the default host gets a consistent ephemeral
1252 // port, that is different from the other host's connection.
1253
1254 std::string other_server_name = "other.google.com";
1255 EXPECT_NE(kDefaultServerHostName, other_server_name);
1256 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort);
[email protected]3c772402013-12-18 21:38:111257
[email protected]bf4ea2f2014-03-10 22:57:531258 int original_port = GetSourcePortForNewSession(host_port_pair_);
1259 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2));
1260 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]3c772402013-12-18 21:38:111261}
1262
[email protected]d8e2abf82014-03-06 10:30:101263TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) {
jri7046038f2015-10-22 00:29:261264 Initialize();
1265
[email protected]d8e2abf82014-03-06 10:30:101266 // Get a session to the host using the port suggester.
1267 int original_port =
[email protected]bf4ea2f2014-03-10 22:57:531268 GetSourcePortForNewSessionAndGoAway(host_port_pair_);
[email protected]d8e2abf82014-03-06 10:30:101269 // Verify that the port is different after the goaway.
[email protected]bf4ea2f2014-03-10 22:57:531270 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101271 // Since the previous session did not goaway we should see the original port.
[email protected]bf4ea2f2014-03-10 22:57:531272 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101273}
1274
[email protected]1e960032013-12-20 19:00:201275TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
jri7046038f2015-10-22 00:29:261276 Initialize();
[email protected]56dfb902013-01-03 23:17:551277 MockRead reads[] = {
[email protected]0edce6a2013-05-08 18:02:401278 MockRead(ASYNC, 0, 0) // EOF
[email protected]56dfb902013-01-03 23:17:551279 };
[email protected]459a7402014-02-10 12:58:521280 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1281 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311282 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521283 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421284 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521285 writes.size());
[email protected]56dfb902013-01-03 23:17:551286 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0edce6a2013-05-08 18:02:401287 socket_data.StopAfter(1);
[email protected]56dfb902013-01-03 23:17:551288
[email protected]69dfd1b2013-06-04 22:20:121289 MockRead reads2[] = {
[email protected]25c31dc2013-06-05 17:56:041290 MockRead(ASYNC, 0, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121291 };
rtennetibe635732014-10-02 22:51:421292 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]56dfb902013-01-03 23:17:551293 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]0edce6a2013-05-08 18:02:401294 socket_data2.StopAfter(1);
[email protected]56dfb902013-01-03 23:17:551295
jri7046038f2015-10-22 00:29:261296 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591297 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561298 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501299 /*cert_verify_flags=*/0, host_port_pair_.host(),
1300 "GET", net_log_, callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551301
1302 EXPECT_EQ(OK, callback_.WaitForResult());
1303 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361304 HttpRequestInfo request_info;
1305 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1306 DEFAULT_PRIORITY,
1307 net_log_, CompletionCallback()));
[email protected]56dfb902013-01-03 23:17:551308
1309 // Close the session and verify that stream saw the error.
jri7046038f2015-10-22 00:29:261310 factory_->CloseAllSessions(ERR_INTERNET_DISCONNECTED);
[email protected]56dfb902013-01-03 23:17:551311 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1312 stream->ReadResponseHeaders(callback_.callback()));
1313
1314 // Now attempting to request a stream to the same origin should create
1315 // a new session.
1316
jri7046038f2015-10-22 00:29:261317 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591318 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561319 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501320 /*cert_verify_flags=*/0, host_port_pair_.host(),
1321 "GET", net_log_, callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551322
1323 EXPECT_EQ(OK, callback_.WaitForResult());
1324 stream = request2.ReleaseStream();
1325 stream.reset(); // Will reset stream 3.
1326
rch37de576c2015-05-17 20:28:171327 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1328 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1329 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1330 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]56dfb902013-01-03 23:17:551331}
1332
[email protected]1e960032013-12-20 19:00:201333TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
jri8c44d692015-10-23 23:53:411334 close_sessions_on_ip_change_ = true;
jri7046038f2015-10-22 00:29:261335 Initialize();
jri8c44d692015-10-23 23:53:411336
[email protected]f698a012013-05-06 20:18:591337 MockRead reads[] = {
[email protected]0edce6a2013-05-08 18:02:401338 MockRead(ASYNC, 0, 0) // EOF
[email protected]f698a012013-05-06 20:18:591339 };
[email protected]459a7402014-02-10 12:58:521340 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1341 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311342 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521343 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421344 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521345 writes.size());
[email protected]f698a012013-05-06 20:18:591346 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0edce6a2013-05-08 18:02:401347 socket_data.StopAfter(1);
[email protected]f698a012013-05-06 20:18:591348
[email protected]69dfd1b2013-06-04 22:20:121349 MockRead reads2[] = {
[email protected]25c31dc2013-06-05 17:56:041350 MockRead(ASYNC, 0, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121351 };
rtennetibe635732014-10-02 22:51:421352 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]f698a012013-05-06 20:18:591353 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]0edce6a2013-05-08 18:02:401354 socket_data2.StopAfter(1);
[email protected]f698a012013-05-06 20:18:591355
jri7046038f2015-10-22 00:29:261356 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591357 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561358 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501359 /*cert_verify_flags=*/0, host_port_pair_.host(),
1360 "GET", net_log_, callback_.callback()));
[email protected]f698a012013-05-06 20:18:591361
1362 EXPECT_EQ(OK, callback_.WaitForResult());
1363 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361364 HttpRequestInfo request_info;
1365 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1366 DEFAULT_PRIORITY,
1367 net_log_, CompletionCallback()));
[email protected]f698a012013-05-06 20:18:591368
1369 // Change the IP address and verify that stream saw the error.
jri8c44d692015-10-23 23:53:411370 NotifyIPAddressChanged();
[email protected]f698a012013-05-06 20:18:591371 EXPECT_EQ(ERR_NETWORK_CHANGED,
1372 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:261373 EXPECT_TRUE(factory_->require_confirmation());
[email protected]f698a012013-05-06 20:18:591374
1375 // Now attempting to request a stream to the same origin should create
1376 // a new session.
1377
jri7046038f2015-10-22 00:29:261378 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591379 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561380 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501381 /*cert_verify_flags=*/0, host_port_pair_.host(),
1382 "GET", net_log_, callback_.callback()));
[email protected]f698a012013-05-06 20:18:591383
1384 EXPECT_EQ(OK, callback_.WaitForResult());
1385 stream = request2.ReleaseStream();
1386 stream.reset(); // Will reset stream 3.
1387
rch37de576c2015-05-17 20:28:171388 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1389 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1390 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1391 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]f698a012013-05-06 20:18:591392}
1393
rch02d87792015-09-09 09:05:531394TEST_P(QuicStreamFactoryTest, OnSSLConfigChanged) {
jri7046038f2015-10-22 00:29:261395 Initialize();
rch02d87792015-09-09 09:05:531396 MockRead reads[] = {
1397 MockRead(ASYNC, 0, 0) // EOF
1398 };
1399 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1400 std::vector<MockWrite> writes;
1401 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
1402 DeterministicSocketData socket_data(reads, arraysize(reads),
1403 writes.empty() ? nullptr : &writes[0],
1404 writes.size());
1405 socket_factory_.AddSocketDataProvider(&socket_data);
1406 socket_data.StopAfter(1);
1407
1408 MockRead reads2[] = {
1409 MockRead(ASYNC, 0, 0) // EOF
1410 };
1411 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1412 socket_factory_.AddSocketDataProvider(&socket_data2);
1413 socket_data2.StopAfter(1);
1414
jri7046038f2015-10-22 00:29:261415 QuicStreamRequest request(factory_.get());
rch02d87792015-09-09 09:05:531416 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561417 request.Request(host_port_pair_, privacy_mode_,
rch02d87792015-09-09 09:05:531418 /*cert_verify_flags=*/0, host_port_pair_.host(),
1419 "GET", net_log_, callback_.callback()));
1420
1421 EXPECT_EQ(OK, callback_.WaitForResult());
1422 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1423 HttpRequestInfo request_info;
1424 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1425 net_log_, CompletionCallback()));
1426
jri7046038f2015-10-22 00:29:261427 factory_->OnSSLConfigChanged();
rch02d87792015-09-09 09:05:531428 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1429 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:261430 EXPECT_FALSE(factory_->require_confirmation());
rch02d87792015-09-09 09:05:531431
1432 // Now attempting to request a stream to the same origin should create
1433 // a new session.
1434
jri7046038f2015-10-22 00:29:261435 QuicStreamRequest request2(factory_.get());
rch02d87792015-09-09 09:05:531436 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561437 request2.Request(host_port_pair_, privacy_mode_,
rch02d87792015-09-09 09:05:531438 /*cert_verify_flags=*/0, host_port_pair_.host(),
1439 "GET", net_log_, callback_.callback()));
1440
1441 EXPECT_EQ(OK, callback_.WaitForResult());
1442 stream = request2.ReleaseStream();
1443 stream.reset(); // Will reset stream 3.
1444
1445 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1446 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1447 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1448 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1449}
1450
[email protected]1e960032013-12-20 19:00:201451TEST_P(QuicStreamFactoryTest, OnCertAdded) {
jri7046038f2015-10-22 00:29:261452 Initialize();
[email protected]d7d1e50b2013-11-25 22:08:091453 MockRead reads[] = {
1454 MockRead(ASYNC, 0, 0) // EOF
1455 };
[email protected]459a7402014-02-10 12:58:521456 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1457 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311458 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521459 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421460 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521461 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:091462 socket_factory_.AddSocketDataProvider(&socket_data);
1463 socket_data.StopAfter(1);
1464
1465 MockRead reads2[] = {
1466 MockRead(ASYNC, 0, 0) // EOF
1467 };
rtennetibe635732014-10-02 22:51:421468 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:091469 socket_factory_.AddSocketDataProvider(&socket_data2);
1470 socket_data2.StopAfter(1);
1471
jri7046038f2015-10-22 00:29:261472 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591473 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561474 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501475 /*cert_verify_flags=*/0, host_port_pair_.host(),
1476 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091477
1478 EXPECT_EQ(OK, callback_.WaitForResult());
1479 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1480 HttpRequestInfo request_info;
1481 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1482 DEFAULT_PRIORITY,
1483 net_log_, CompletionCallback()));
1484
1485 // Add a cert and verify that stream saw the event.
jri7046038f2015-10-22 00:29:261486 factory_->OnCertAdded(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:091487 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1488 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:261489 EXPECT_FALSE(factory_->require_confirmation());
[email protected]d7d1e50b2013-11-25 22:08:091490
1491 // Now attempting to request a stream to the same origin should create
1492 // a new session.
1493
jri7046038f2015-10-22 00:29:261494 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591495 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561496 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501497 /*cert_verify_flags=*/0, host_port_pair_.host(),
1498 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091499
1500 EXPECT_EQ(OK, callback_.WaitForResult());
1501 stream = request2.ReleaseStream();
1502 stream.reset(); // Will reset stream 3.
1503
rch37de576c2015-05-17 20:28:171504 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1505 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1506 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1507 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:091508}
1509
[email protected]1e960032013-12-20 19:00:201510TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
jri7046038f2015-10-22 00:29:261511 Initialize();
[email protected]d7d1e50b2013-11-25 22:08:091512 MockRead reads[] = {
1513 MockRead(ASYNC, 0, 0) // EOF
1514 };
[email protected]459a7402014-02-10 12:58:521515 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1516 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311517 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521518 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421519 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521520 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:091521 socket_factory_.AddSocketDataProvider(&socket_data);
1522 socket_data.StopAfter(1);
1523
1524 MockRead reads2[] = {
1525 MockRead(ASYNC, 0, 0) // EOF
1526 };
rtennetibe635732014-10-02 22:51:421527 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:091528 socket_factory_.AddSocketDataProvider(&socket_data2);
1529 socket_data2.StopAfter(1);
1530
jri7046038f2015-10-22 00:29:261531 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591532 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561533 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501534 /*cert_verify_flags=*/0, host_port_pair_.host(),
1535 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091536
1537 EXPECT_EQ(OK, callback_.WaitForResult());
1538 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1539 HttpRequestInfo request_info;
1540 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1541 DEFAULT_PRIORITY,
1542 net_log_, CompletionCallback()));
1543
1544 // Change the CA cert and verify that stream saw the event.
jri7046038f2015-10-22 00:29:261545 factory_->OnCACertChanged(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:091546 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1547 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:261548 EXPECT_FALSE(factory_->require_confirmation());
[email protected]d7d1e50b2013-11-25 22:08:091549
1550 // Now attempting to request a stream to the same origin should create
1551 // a new session.
1552
jri7046038f2015-10-22 00:29:261553 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591554 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561555 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501556 /*cert_verify_flags=*/0, host_port_pair_.host(),
1557 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091558
1559 EXPECT_EQ(OK, callback_.WaitForResult());
1560 stream = request2.ReleaseStream();
1561 stream.reset(); // Will reset stream 3.
1562
rch37de576c2015-05-17 20:28:171563 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1564 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1565 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1566 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:091567}
1568
[email protected]1e960032013-12-20 19:00:201569TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
jri7046038f2015-10-22 00:29:261570 Initialize();
[email protected]6e12d702013-11-13 00:17:171571 vector<string> cannoncial_suffixes;
1572 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1573 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]c49ff182013-09-28 08:33:261574
[email protected]6e12d702013-11-13 00:17:171575 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1576 string r1_host_name("r1");
1577 string r2_host_name("r2");
1578 r1_host_name.append(cannoncial_suffixes[i]);
1579 r2_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141580
[email protected]bf4ea2f2014-03-10 22:57:531581 HostPortPair host_port_pair1(r1_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121582 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:261583 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rch1fe2eeb2015-10-26 14:45:571584 QuicServerId server_id1(host_port_pair1, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171585 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371586 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171587 EXPECT_FALSE(cached1->proof_valid());
1588 EXPECT_TRUE(cached1->source_address_token().empty());
1589
1590 // Mutate the cached1 to have different data.
1591 // TODO(rtenneti): mutate other members of CachedState.
1592 cached1->set_source_address_token(r1_host_name);
1593 cached1->SetProofValid();
1594
[email protected]bf4ea2f2014-03-10 22:57:531595 HostPortPair host_port_pair2(r2_host_name, 80);
rch1fe2eeb2015-10-26 14:45:571596 QuicServerId server_id2(host_port_pair2, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171597 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371598 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171599 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
1600 EXPECT_TRUE(cached2->proof_valid());
1601 }
[email protected]b70fdb792013-10-25 19:04:141602}
1603
[email protected]1e960032013-12-20 19:00:201604TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
jri7046038f2015-10-22 00:29:261605 Initialize();
[email protected]6e12d702013-11-13 00:17:171606 vector<string> cannoncial_suffixes;
1607 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1608 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]b70fdb792013-10-25 19:04:141609
[email protected]6e12d702013-11-13 00:17:171610 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1611 string r3_host_name("r3");
1612 string r4_host_name("r4");
1613 r3_host_name.append(cannoncial_suffixes[i]);
1614 r4_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141615
[email protected]bf4ea2f2014-03-10 22:57:531616 HostPortPair host_port_pair1(r3_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121617 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:261618 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rch1fe2eeb2015-10-26 14:45:571619 QuicServerId server_id1(host_port_pair1, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171620 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371621 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171622 EXPECT_FALSE(cached1->proof_valid());
1623 EXPECT_TRUE(cached1->source_address_token().empty());
1624
1625 // Mutate the cached1 to have different data.
1626 // TODO(rtenneti): mutate other members of CachedState.
1627 cached1->set_source_address_token(r3_host_name);
1628 cached1->SetProofInvalid();
1629
[email protected]bf4ea2f2014-03-10 22:57:531630 HostPortPair host_port_pair2(r4_host_name, 80);
rch1fe2eeb2015-10-26 14:45:571631 QuicServerId server_id2(host_port_pair2, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171632 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371633 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171634 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
1635 EXPECT_TRUE(cached2->source_address_token().empty());
1636 EXPECT_FALSE(cached2->proof_valid());
1637 }
[email protected]c49ff182013-09-28 08:33:261638}
1639
rtenneti14abd312015-02-06 21:56:011640TEST_P(QuicStreamFactoryTest, RacingConnections) {
jri7046038f2015-10-22 00:29:261641 disable_disk_cache_ = false;
1642 Initialize();
1643
rtenneti14abd312015-02-06 21:56:011644 if (!GetParam().enable_connection_racing)
1645 return;
jri7046038f2015-10-22 00:29:261646
1647 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneticcab42b2015-10-09 06:38:161648
rtenneti14abd312015-02-06 21:56:011649 MockRead reads[] = {
1650 MockRead(ASYNC, OK, 0) // EOF
1651 };
1652 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1653 socket_factory_.AddSocketDataProvider(&socket_data);
1654 socket_data.StopAfter(1);
1655
1656 MockRead reads2[] = {
1657 MockRead(ASYNC, 0, 0) // EOF
1658 };
1659 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1660 socket_factory_.AddSocketDataProvider(&socket_data2);
1661 socket_data2.StopAfter(1);
1662
rtenneticcab42b2015-10-09 06:38:161663 const AlternativeService alternative_service1(QUIC, host_port_pair_.host(),
1664 host_port_pair_.port());
1665 AlternativeServiceInfoVector alternative_service_info_vector;
1666 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1667 alternative_service_info_vector.push_back(
1668 AlternativeServiceInfo(alternative_service1, 1.0, expiration));
1669
1670 http_server_properties_.SetAlternativeServices(
1671 host_port_pair_, alternative_service_info_vector);
1672
rtenneti14abd312015-02-06 21:56:011673 crypto_client_stream_factory_.set_handshake_mode(
1674 MockCryptoClientStream::ZERO_RTT);
1675 host_resolver_.set_synchronous_mode(true);
1676 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1677 "192.168.0.1", "");
1678
jri7046038f2015-10-22 00:29:261679 QuicStreamRequest request(factory_.get());
rch1fe2eeb2015-10-26 14:45:571680 QuicServerId server_id(host_port_pair_, privacy_mode_);
rtenneti14abd312015-02-06 21:56:011681 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561682 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501683 /*cert_verify_flags=*/0, host_port_pair_.host(),
1684 "GET", net_log_, callback_.callback()));
jri7046038f2015-10-22 00:29:261685 EXPECT_EQ(2u, QuicStreamFactoryPeer::GetNumberOfActiveJobs(factory_.get(),
1686 server_id));
rtenneti14abd312015-02-06 21:56:011687
1688 runner_->RunNextTask();
1689
1690 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1691 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:171692 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1693 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
jri7046038f2015-10-22 00:29:261694 EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumberOfActiveJobs(factory_.get(),
1695 server_id));
rtenneti14abd312015-02-06 21:56:011696}
1697
rtenneti34dffe752015-02-24 23:27:321698TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) {
jri7046038f2015-10-22 00:29:261699 disable_disk_cache_ = true;
1700 Initialize();
1701 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti34dffe752015-02-24 23:27:321702
1703 MockRead reads[] = {
1704 MockRead(ASYNC, OK, 0) // EOF
1705 };
1706 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1707 socket_factory_.AddSocketDataProvider(&socket_data);
1708 socket_data.StopAfter(1);
1709
1710 crypto_client_stream_factory_.set_handshake_mode(
1711 MockCryptoClientStream::ZERO_RTT);
1712 host_resolver_.set_synchronous_mode(true);
1713 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1714 "192.168.0.1", "");
1715
jri7046038f2015-10-22 00:29:261716 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561717 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501718 /*cert_verify_flags=*/0, host_port_pair_.host(),
1719 "GET", net_log_, callback_.callback()));
rtenneti34dffe752015-02-24 23:27:321720
1721 // If we are waiting for disk cache, we would have posted a task. Verify that
1722 // the CancelWaitForDataReady task hasn't been posted.
1723 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
1724
1725 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1726 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:171727 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1728 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti34dffe752015-02-24 23:27:321729}
1730
rtenneti85dcfac22015-03-27 20:22:191731TEST_P(QuicStreamFactoryTest, BadPacketLoss) {
jri7046038f2015-10-22 00:29:261732 disable_disk_cache_ = false;
1733 max_number_of_lossy_connections_ = 2;
1734 Initialize();
1735 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
1736
1737 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1738 host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:191739 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261740 factory_.get(), host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:191741
1742 MockRead reads[] = {
1743 MockRead(ASYNC, OK, 0) // EOF
1744 };
1745 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1746 socket_factory_.AddSocketDataProvider(&socket_data);
1747 socket_data.StopAfter(1);
1748
rtenneti97137a92015-06-18 06:00:311749 DeterministicSocketData socket_data2(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:191750 socket_factory_.AddSocketDataProvider(&socket_data2);
1751 socket_data2.StopAfter(1);
1752
rtenneti97137a92015-06-18 06:00:311753 DeterministicSocketData socket_data3(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:191754 socket_factory_.AddSocketDataProvider(&socket_data3);
1755 socket_data3.StopAfter(1);
1756
rtenneti97137a92015-06-18 06:00:311757 DeterministicSocketData socket_data4(nullptr, 0, nullptr, 0);
1758 socket_factory_.AddSocketDataProvider(&socket_data4);
1759 socket_data4.StopAfter(1);
1760
rtenneti85dcfac22015-03-27 20:22:191761 HostPortPair server2("mail.example.org", kDefaultServerPort);
1762 HostPortPair server3("docs.example.org", kDefaultServerPort);
rtenneti97137a92015-06-18 06:00:311763 HostPortPair server4("images.example.org", kDefaultServerPort);
rtenneti85dcfac22015-03-27 20:22:191764
1765 crypto_client_stream_factory_.set_handshake_mode(
1766 MockCryptoClientStream::ZERO_RTT);
1767 host_resolver_.set_synchronous_mode(true);
1768 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1769 "192.168.0.1", "");
1770 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1771 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
rtenneti97137a92015-06-18 06:00:311772 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
rtenneti85dcfac22015-03-27 20:22:191773
jri7046038f2015-10-22 00:29:261774 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561775 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501776 /*cert_verify_flags=*/0, host_port_pair_.host(),
1777 "GET", net_log_, callback_.callback()));
rtenneti85dcfac22015-03-27 20:22:191778
rchf114d982015-10-21 01:34:561779 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:261780 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
rtenneti85dcfac22015-03-27 20:22:191781
1782 DVLOG(1) << "Create 1st session and test packet loss";
1783
1784 // Set packet_loss_rate to a lower value than packet_loss_threshold.
1785 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261786 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/0.9f));
rtenneti41633b1f2015-04-05 18:19:531787 EXPECT_TRUE(session->connection()->connected());
rchf114d982015-10-21 01:34:561788 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:261789 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
1790 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1791 host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:191792 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261793 factory_.get(), host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:191794
1795 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:311796 // and that shouldn't close the session and it shouldn't disable QUIC.
1797 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261798 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:191799 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261800 factory_.get(), host_port_pair_.port()));
rtenneti97137a92015-06-18 06:00:311801 EXPECT_TRUE(session->connection()->connected());
jri7046038f2015-10-22 00:29:261802 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1803 host_port_pair_.port()));
rchf114d982015-10-21 01:34:561804 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:261805 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
rtenneti85dcfac22015-03-27 20:22:191806
1807 // Test N-in-a-row high packet loss connections.
1808
1809 DVLOG(1) << "Create 2nd session and test packet loss";
1810
1811 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:261812 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:561813 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:501814 /*cert_verify_flags=*/0, server2.host(), "GET",
1815 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:161816 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:261817 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
rtenneti85dcfac22015-03-27 20:22:191818
1819 // If there is no packet loss during handshake confirmation, number of lossy
1820 // connections for the port should be 0.
1821 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261822 factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:191823 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261824 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/0.9f));
rtenneti85dcfac22015-03-27 20:22:191825 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261826 factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:191827 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261828 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:191829
1830 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:311831 // and that shouldn't close the session and it shouldn't disable QUIC.
1832 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261833 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:191834 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261835 factory_.get(), server2.port()));
rtenneti97137a92015-06-18 06:00:311836 EXPECT_TRUE(session2->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:191837 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261838 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
1839 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server2));
rtenneti85dcfac22015-03-27 20:22:191840
1841 DVLOG(1) << "Create 3rd session which also has packet loss";
1842
1843 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:261844 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:561845 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
rtennetia75df622015-06-21 23:59:501846 /*cert_verify_flags=*/0, server3.host(), "GET",
1847 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:161848 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:261849 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
rtenneti85dcfac22015-03-27 20:22:191850
rtenneti97137a92015-06-18 06:00:311851 DVLOG(1) << "Create 4th session with packet loss and test IsQuicDisabled()";
1852 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:261853 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:561854 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
rtennetia75df622015-06-21 23:59:501855 /*cert_verify_flags=*/0, server4.host(), "GET",
1856 net_log_, callback4.callback()));
ckrasic4f9d88d2015-07-22 22:23:161857 QuicChromiumClientSession* session4 =
jri7046038f2015-10-22 00:29:261858 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server4);
rtenneti97137a92015-06-18 06:00:311859
rtenneti85dcfac22015-03-27 20:22:191860 // Set packet_loss_rate to higher value than packet_loss_threshold 2nd time in
1861 // a row and that should close the session and disable QUIC.
1862 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:261863 factory_->OnHandshakeConfirmed(session3, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:191864 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261865 factory_.get(), server3.port()));
rtenneti97137a92015-06-18 06:00:311866 EXPECT_FALSE(session3->connection()->connected());
jri7046038f2015-10-22 00:29:261867 EXPECT_TRUE(
1868 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server3.port()));
1869 EXPECT_FALSE(
1870 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server3));
bnccb7ff3c2015-05-21 20:51:551871 EXPECT_FALSE(HasActiveSession(server3));
rtenneti85dcfac22015-03-27 20:22:191872
rtenneti97137a92015-06-18 06:00:311873 // Set packet_loss_rate to higher value than packet_loss_threshold 3rd time in
1874 // a row and IsQuicDisabled() should close the session.
1875 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:261876 factory_->OnHandshakeConfirmed(session4, /*packet_loss_rate=*/1.0f));
rtenneti97137a92015-06-18 06:00:311877 EXPECT_EQ(3, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261878 factory_.get(), server4.port()));
rtenneti97137a92015-06-18 06:00:311879 EXPECT_FALSE(session4->connection()->connected());
jri7046038f2015-10-22 00:29:261880 EXPECT_TRUE(
1881 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server4.port()));
1882 EXPECT_FALSE(
1883 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server4));
rtenneti97137a92015-06-18 06:00:311884 EXPECT_FALSE(HasActiveSession(server4));
1885
rtenneti85dcfac22015-03-27 20:22:191886 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1887 EXPECT_TRUE(stream.get());
1888 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1889 EXPECT_TRUE(stream2.get());
1890 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
1891 EXPECT_TRUE(stream3.get());
rtenneti97137a92015-06-18 06:00:311892 scoped_ptr<QuicHttpStream> stream4 = request4.ReleaseStream();
1893 EXPECT_TRUE(stream4.get());
rch37de576c2015-05-17 20:28:171894 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1895 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1896 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1897 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1898 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
1899 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
rtenneti97137a92015-06-18 06:00:311900 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
1901 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
rtenneti85dcfac22015-03-27 20:22:191902}
1903
ckrasic1e53b642015-07-08 22:39:351904TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfTwo) {
jri7046038f2015-10-22 00:29:261905 disable_disk_cache_ = false;
1906 threshold_public_resets_post_handshake_ = 2;
1907 Initialize();
1908 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
1909
1910 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1911 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351912 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261913 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351914
1915 MockRead reads[] = {
1916 MockRead(ASYNC, OK, 0) // EOF
1917 };
1918 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1919 socket_factory_.AddSocketDataProvider(&socket_data);
1920 socket_data.StopAfter(1);
1921
1922 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
1923 socket_factory_.AddSocketDataProvider(&socket_data2);
1924 socket_data2.StopAfter(1);
1925
1926 HostPortPair server2("mail.example.org", kDefaultServerPort);
1927
1928 crypto_client_stream_factory_.set_handshake_mode(
1929 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1930 host_resolver_.set_synchronous_mode(true);
1931 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1932 "192.168.0.1", "");
1933 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1934
jri7046038f2015-10-22 00:29:261935 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561936 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:351937 /*cert_verify_flags=*/0, host_port_pair_.host(),
1938 "GET", net_log_, callback_.callback()));
1939
rchf114d982015-10-21 01:34:561940 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:261941 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:351942
1943 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
1944 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
1945 // Need to spin the loop now to ensure that
1946 // QuicStreamFactory::OnSessionClosed() runs.
1947 base::RunLoop run_loop;
1948 run_loop.RunUntilIdle();
1949
jri7046038f2015-10-22 00:29:261950 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
1951 factory_.get()));
1952 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1953 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351954
1955 // Test two-in-a-row public reset post handshakes..
1956 DVLOG(1) << "Create 2nd session and trigger public reset post handshake";
1957 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:261958 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:561959 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:351960 /*cert_verify_flags=*/0, server2.host(), "GET",
1961 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:161962 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:261963 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:351964
1965 session2->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
1966 // Need to spin the loop now to ensure that
1967 // QuicStreamFactory::OnSessionClosed() runs.
1968 base::RunLoop run_loop2;
1969 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:261970 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
1971 factory_.get()));
1972 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1973 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:161974 EXPECT_EQ(
1975 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
jri7046038f2015-10-22 00:29:261976 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351977
1978 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1979 EXPECT_TRUE(stream.get());
1980 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1981 EXPECT_TRUE(stream2.get());
1982 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1983 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1984 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1985 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1986}
1987
1988TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfTwo) {
jri7046038f2015-10-22 00:29:261989 disable_disk_cache_ = true;
1990 threshold_timeouts_with_open_streams_ = 2;
1991 Initialize();
1992
1993 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
1994 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1995 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351996 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261997 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351998
1999 MockRead reads[] = {
2000 MockRead(ASYNC, OK, 0) // EOF
2001 };
2002 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
2003 socket_factory_.AddSocketDataProvider(&socket_data);
2004 socket_data.StopAfter(1);
2005
2006 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
2007 socket_factory_.AddSocketDataProvider(&socket_data2);
2008 socket_data2.StopAfter(1);
2009
2010 HostPortPair server2("mail.example.org", kDefaultServerPort);
2011
2012 crypto_client_stream_factory_.set_handshake_mode(
2013 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2014 host_resolver_.set_synchronous_mode(true);
2015 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2016 "192.168.0.1", "");
2017 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2018
jri7046038f2015-10-22 00:29:262019 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562020 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352021 /*cert_verify_flags=*/0, host_port_pair_.host(),
2022 "GET", net_log_, callback_.callback()));
2023
rchf114d982015-10-21 01:34:562024 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262025 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352026
2027 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2028 EXPECT_TRUE(stream.get());
2029 HttpRequestInfo request_info;
2030 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2031 net_log_, CompletionCallback()));
2032
2033 DVLOG(1)
2034 << "Created 1st session and initialized a stream. Now trigger timeout";
2035 session->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2036 // Need to spin the loop now to ensure that
2037 // QuicStreamFactory::OnSessionClosed() runs.
2038 base::RunLoop run_loop;
2039 run_loop.RunUntilIdle();
2040
jri7046038f2015-10-22 00:29:262041 EXPECT_EQ(
2042 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2043 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2044 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352045
2046 // Test two-in-a-row timeouts with open streams.
2047 DVLOG(1) << "Create 2nd session and timeout with open stream";
2048 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262049 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562050 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352051 /*cert_verify_flags=*/0, server2.host(), "GET",
2052 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162053 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262054 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352055
2056 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2057 EXPECT_TRUE(stream2.get());
2058 EXPECT_EQ(OK, stream2->InitializeStream(&request_info, DEFAULT_PRIORITY,
2059 net_log_, CompletionCallback()));
2060
2061 session2->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2062 // Need to spin the loop now to ensure that
2063 // QuicStreamFactory::OnSessionClosed() runs.
2064 base::RunLoop run_loop2;
2065 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262066 EXPECT_EQ(
2067 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2068 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2069 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:162070 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
jri7046038f2015-10-22 00:29:262071 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352072
2073 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2074 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2075 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2076 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2077}
2078
2079TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfThree) {
jri7046038f2015-10-22 00:29:262080 disable_disk_cache_ = true;
2081 threshold_public_resets_post_handshake_ = 2;
2082 Initialize();
2083
2084 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2085 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352086 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262087 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352088
2089 MockRead reads[] = {
2090 MockRead(ASYNC, OK, 0) // EOF
2091 };
2092 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
2093 socket_factory_.AddSocketDataProvider(&socket_data);
2094 socket_data.StopAfter(1);
2095
2096 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
2097 socket_factory_.AddSocketDataProvider(&socket_data2);
2098 socket_data2.StopAfter(1);
2099
2100 DeterministicSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
2101 socket_factory_.AddSocketDataProvider(&socket_data3);
2102 socket_data3.StopAfter(1);
2103
2104 HostPortPair server2("mail.example.org", kDefaultServerPort);
2105 HostPortPair server3("docs.example.org", kDefaultServerPort);
2106
2107 crypto_client_stream_factory_.set_handshake_mode(
2108 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2109 host_resolver_.set_synchronous_mode(true);
2110 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2111 "192.168.0.1", "");
2112 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2113 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
2114
2115 // Test first and third out of three public reset post handshakes.
jri7046038f2015-10-22 00:29:262116 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562117 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352118 /*cert_verify_flags=*/0, host_port_pair_.host(),
2119 "GET", net_log_, callback_.callback()));
2120
rchf114d982015-10-21 01:34:562121 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262122 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352123
2124 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
2125 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
2126 // Need to spin the loop now to ensure that
2127 // QuicStreamFactory::OnSessionClosed() runs.
2128 base::RunLoop run_loop;
2129 run_loop.RunUntilIdle();
2130
jri7046038f2015-10-22 00:29:262131 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2132 factory_.get()));
2133 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2134 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352135
2136 DVLOG(1) << "Create 2nd session without disable trigger";
2137 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262138 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562139 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352140 /*cert_verify_flags=*/0, server2.host(), "GET",
2141 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162142 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262143 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352144
2145 session2->connection()->CloseConnection(QUIC_NO_ERROR, false);
2146 // Need to spin the loop now to ensure that
2147 // QuicStreamFactory::OnSessionClosed() runs.
2148 base::RunLoop run_loop2;
2149 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262150 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2151 factory_.get()));
2152 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2153 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352154
2155 DVLOG(1) << "Create 3rd session with public reset post handshake,"
2156 << " will disable QUIC";
2157 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:262158 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:562159 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352160 /*cert_verify_flags=*/0, server3.host(), "GET",
2161 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:162162 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:262163 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:352164
2165 session3->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
2166 // Need to spin the loop now to ensure that
2167 // QuicStreamFactory::OnSessionClosed() runs.
2168 base::RunLoop run_loop3;
2169 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:262170 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2171 factory_.get()));
2172 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2173 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:162174 EXPECT_EQ(
2175 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
jri7046038f2015-10-22 00:29:262176 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352177
2178 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2179 EXPECT_TRUE(stream.get());
2180 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2181 EXPECT_TRUE(stream2.get());
2182 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2183 EXPECT_TRUE(stream3.get());
2184
2185 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2186 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2187 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2188 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2189 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2190 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
2191}
2192
2193TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfThree) {
jri7046038f2015-10-22 00:29:262194 disable_disk_cache_ = true;
2195 threshold_public_resets_post_handshake_ = 2;
2196 Initialize();
2197 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2198
2199 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2200 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352201 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262202 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352203
2204 MockRead reads[] = {
2205 MockRead(ASYNC, OK, 0) // EOF
2206 };
2207 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
2208 socket_factory_.AddSocketDataProvider(&socket_data);
2209 socket_data.StopAfter(1);
2210
2211 // DeterministicSocketData socket_data2(nullptr, 0, nullptr, 0);
2212 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
2213 socket_factory_.AddSocketDataProvider(&socket_data2);
2214 socket_data2.StopAfter(1);
2215
2216 DeterministicSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
2217 socket_factory_.AddSocketDataProvider(&socket_data3);
2218 socket_data3.StopAfter(1);
2219
2220 HostPortPair server2("mail.example.org", kDefaultServerPort);
2221 HostPortPair server3("docs.example.org", kDefaultServerPort);
2222
2223 crypto_client_stream_factory_.set_handshake_mode(
2224 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2225 host_resolver_.set_synchronous_mode(true);
2226 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2227 "192.168.0.1", "");
2228 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2229 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
2230
2231 // Test first and third out of three timeouts with open streams.
jri7046038f2015-10-22 00:29:262232 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562233 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352234 /*cert_verify_flags=*/0, host_port_pair_.host(),
2235 "GET", net_log_, callback_.callback()));
2236
rchf114d982015-10-21 01:34:562237 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262238 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352239
2240 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2241 EXPECT_TRUE(stream.get());
2242 HttpRequestInfo request_info;
2243 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2244 net_log_, CompletionCallback()));
2245
2246 DVLOG(1)
2247 << "Created 1st session and initialized a stream. Now trigger timeout";
2248 session->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2249 // Need to spin the loop now to ensure that
2250 // QuicStreamFactory::OnSessionClosed() runs.
2251 base::RunLoop run_loop;
2252 run_loop.RunUntilIdle();
2253
jri7046038f2015-10-22 00:29:262254 EXPECT_EQ(
2255 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2256 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2257 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352258
2259 // Test two-in-a-row timeouts with open streams.
2260 DVLOG(1) << "Create 2nd session without timeout";
2261 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262262 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562263 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352264 /*cert_verify_flags=*/0, server2.host(), "GET",
2265 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162266 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262267 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352268
2269 session2->connection()->CloseConnection(QUIC_NO_ERROR, true);
2270 // Need to spin the loop now to ensure that
2271 // QuicStreamFactory::OnSessionClosed() runs.
2272 base::RunLoop run_loop2;
2273 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262274 EXPECT_EQ(
2275 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2276 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2277 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352278
2279 DVLOG(1) << "Create 3rd session with timeout with open streams,"
2280 << " will disable QUIC";
2281
2282 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:262283 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:562284 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352285 /*cert_verify_flags=*/0, server3.host(), "GET",
2286 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:162287 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:262288 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:352289
2290 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2291 EXPECT_TRUE(stream3.get());
2292 EXPECT_EQ(OK, stream3->InitializeStream(&request_info, DEFAULT_PRIORITY,
2293 net_log_, CompletionCallback()));
2294 session3->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2295 // Need to spin the loop now to ensure that
2296 // QuicStreamFactory::OnSessionClosed() runs.
2297 base::RunLoop run_loop3;
2298 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:262299 EXPECT_EQ(
2300 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2301 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2302 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:162303 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
jri7046038f2015-10-22 00:29:262304 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352305
2306 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2307 EXPECT_TRUE(stream2.get());
2308 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2309 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2310 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2311 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2312 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2313 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
2314}
2315
2316TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfFour) {
jri7046038f2015-10-22 00:29:262317 disable_disk_cache_ = true;
2318 threshold_public_resets_post_handshake_ = 2;
2319 Initialize();
2320 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2321
2322 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2323 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352324 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262325 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352326
2327 MockRead reads[] = {
2328 MockRead(ASYNC, OK, 0) // EOF
2329 };
2330 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
2331 socket_factory_.AddSocketDataProvider(&socket_data);
2332 socket_data.StopAfter(1);
2333
2334 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
2335 socket_factory_.AddSocketDataProvider(&socket_data2);
2336 socket_data2.StopAfter(1);
2337
2338 DeterministicSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
2339 socket_factory_.AddSocketDataProvider(&socket_data3);
2340 socket_data3.StopAfter(1);
2341
2342 DeterministicSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
2343 socket_factory_.AddSocketDataProvider(&socket_data4);
2344 socket_data4.StopAfter(1);
2345
2346 HostPortPair server2("mail.example.org", kDefaultServerPort);
2347 HostPortPair server3("docs.example.org", kDefaultServerPort);
2348 HostPortPair server4("images.example.org", kDefaultServerPort);
2349
2350 crypto_client_stream_factory_.set_handshake_mode(
2351 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2352 host_resolver_.set_synchronous_mode(true);
2353 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2354 "192.168.0.1", "");
2355 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2356 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
2357 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
2358
2359 // Test first and fourth out of four public reset post handshakes.
jri7046038f2015-10-22 00:29:262360 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562361 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352362 /*cert_verify_flags=*/0, host_port_pair_.host(),
2363 "GET", net_log_, callback_.callback()));
2364
rchf114d982015-10-21 01:34:562365 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262366 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352367
2368 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
2369 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
2370 // Need to spin the loop now to ensure that
2371 // QuicStreamFactory::OnSessionClosed() runs.
2372 base::RunLoop run_loop;
2373 run_loop.RunUntilIdle();
2374
jri7046038f2015-10-22 00:29:262375 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2376 factory_.get()));
2377 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2378 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352379
2380 DVLOG(1) << "Create 2nd and 3rd sessions without disable trigger";
2381 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262382 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562383 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352384 /*cert_verify_flags=*/0, server2.host(), "GET",
2385 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162386 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262387 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352388
2389 session2->connection()->CloseConnection(QUIC_NO_ERROR, false);
2390 // Need to spin the loop now to ensure that
2391 // QuicStreamFactory::OnSessionClosed() runs.
2392 base::RunLoop run_loop2;
2393 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262394 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2395 factory_.get()));
2396 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2397 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352398
2399 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:262400 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:562401 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352402 /*cert_verify_flags=*/0, server3.host(), "GET",
2403 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:162404 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:262405 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:352406
2407 session3->connection()->CloseConnection(QUIC_NO_ERROR, false);
2408 // Need to spin the loop now to ensure that
2409 // QuicStreamFactory::OnSessionClosed() runs.
2410 base::RunLoop run_loop3;
2411 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:262412 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2413 factory_.get()));
2414 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2415 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352416
2417 DVLOG(1) << "Create 4rd session with public reset post handshake,"
2418 << " will not disable QUIC";
2419 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:262420 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:562421 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352422 /*cert_verify_flags=*/0, server4.host(), "GET",
2423 net_log_, callback4.callback()));
ckrasic4f9d88d2015-07-22 22:23:162424 QuicChromiumClientSession* session4 =
jri7046038f2015-10-22 00:29:262425 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server4);
ckrasic1e53b642015-07-08 22:39:352426
2427 session4->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
2428 // Need to spin the loop now to ensure that
2429 // QuicStreamFactory::OnSessionClosed() runs.
2430 base::RunLoop run_loop4;
2431 run_loop4.RunUntilIdle();
jri7046038f2015-10-22 00:29:262432 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2433 factory_.get()));
2434 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2435 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352436
2437 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2438 EXPECT_TRUE(stream.get());
2439 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2440 EXPECT_TRUE(stream2.get());
2441 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2442 EXPECT_TRUE(stream3.get());
2443 scoped_ptr<QuicHttpStream> stream4 = request4.ReleaseStream();
2444 EXPECT_TRUE(stream4.get());
2445
2446 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2447 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2448 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2449 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2450 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2451 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
2452 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
2453 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
2454}
2455
2456TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfFour) {
jri7046038f2015-10-22 00:29:262457 disable_disk_cache_ = true;
2458 threshold_public_resets_post_handshake_ = 2;
2459 Initialize();
2460 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2461
2462 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2463 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352464 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262465 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352466
2467 MockRead reads[] = {
2468 MockRead(ASYNC, OK, 0) // EOF
2469 };
2470 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
2471 socket_factory_.AddSocketDataProvider(&socket_data);
2472 socket_data.StopAfter(1);
2473
2474 // DeterministicSocketData socket_data2(nullptr, 0, nullptr, 0);
2475 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
2476 socket_factory_.AddSocketDataProvider(&socket_data2);
2477 socket_data2.StopAfter(1);
2478
2479 DeterministicSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
2480 socket_factory_.AddSocketDataProvider(&socket_data3);
2481 socket_data3.StopAfter(1);
2482
2483 DeterministicSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
2484 socket_factory_.AddSocketDataProvider(&socket_data4);
2485 socket_data4.StopAfter(1);
2486
2487 HostPortPair server2("mail.example.org", kDefaultServerPort);
2488 HostPortPair server3("docs.example.org", kDefaultServerPort);
2489 HostPortPair server4("images.example.org", kDefaultServerPort);
2490
2491 crypto_client_stream_factory_.set_handshake_mode(
2492 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2493 host_resolver_.set_synchronous_mode(true);
2494 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2495 "192.168.0.1", "");
2496 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2497 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
2498 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
2499
2500 // Test first and fourth out of three timeouts with open streams.
jri7046038f2015-10-22 00:29:262501 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562502 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352503 /*cert_verify_flags=*/0, host_port_pair_.host(),
2504 "GET", net_log_, callback_.callback()));
2505
rchf114d982015-10-21 01:34:562506 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262507 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352508
2509 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2510 EXPECT_TRUE(stream.get());
2511 HttpRequestInfo request_info;
2512 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2513 net_log_, CompletionCallback()));
2514
2515 DVLOG(1)
2516 << "Created 1st session and initialized a stream. Now trigger timeout";
2517 session->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2518 // Need to spin the loop now to ensure that
2519 // QuicStreamFactory::OnSessionClosed() runs.
2520 base::RunLoop run_loop;
2521 run_loop.RunUntilIdle();
2522
jri7046038f2015-10-22 00:29:262523 EXPECT_EQ(
2524 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2525 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2526 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352527
2528 DVLOG(1) << "Create 2nd and 3rd sessions without timeout";
2529 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262530 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562531 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352532 /*cert_verify_flags=*/0, server2.host(), "GET",
2533 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162534 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262535 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352536
2537 session2->connection()->CloseConnection(QUIC_NO_ERROR, true);
2538 // Need to spin the loop now to ensure that
2539 // QuicStreamFactory::OnSessionClosed() runs.
2540 base::RunLoop run_loop2;
2541 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262542 EXPECT_EQ(
2543 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2544 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2545 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352546
2547 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:262548 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:562549 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352550 /*cert_verify_flags=*/0, server3.host(), "GET",
2551 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:162552 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:262553 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:352554
2555 session3->connection()->CloseConnection(QUIC_NO_ERROR, true);
2556 // Need to spin the loop now to ensure that
2557 // QuicStreamFactory::OnSessionClosed() runs.
2558 base::RunLoop run_loop3;
2559 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:262560 EXPECT_EQ(
2561 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2562 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2563 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352564
2565 DVLOG(1) << "Create 4th session with timeout with open streams,"
2566 << " will not disable QUIC";
2567
2568 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:262569 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:562570 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352571 /*cert_verify_flags=*/0, server4.host(), "GET",
2572 net_log_, callback4.callback()));
ckrasic4f9d88d2015-07-22 22:23:162573 QuicChromiumClientSession* session4 =
jri7046038f2015-10-22 00:29:262574 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server4);
ckrasic1e53b642015-07-08 22:39:352575
2576 scoped_ptr<QuicHttpStream> stream4 = request4.ReleaseStream();
2577 EXPECT_TRUE(stream4.get());
2578 EXPECT_EQ(OK, stream4->InitializeStream(&request_info, DEFAULT_PRIORITY,
2579 net_log_, CompletionCallback()));
2580 session4->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2581 // Need to spin the loop now to ensure that
2582 // QuicStreamFactory::OnSessionClosed() runs.
2583 base::RunLoop run_loop4;
2584 run_loop4.RunUntilIdle();
jri7046038f2015-10-22 00:29:262585 EXPECT_EQ(
2586 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2587 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2588 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352589
2590 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2591 EXPECT_TRUE(stream2.get());
2592 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2593 EXPECT_TRUE(stream3.get());
2594 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2595 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2596 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2597 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2598 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2599 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
2600 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
2601 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
2602}
2603
rtenneti8332ba52015-09-17 19:33:412604TEST_P(QuicStreamFactoryTest, EnableDelayTcpRace) {
jri7046038f2015-10-22 00:29:262605 Initialize();
2606 bool delay_tcp_race = QuicStreamFactoryPeer::GetDelayTcpRace(factory_.get());
2607 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), false);
rtenneti8332ba52015-09-17 19:33:412608 MockRead reads[] = {
2609 MockRead(ASYNC, OK, 0),
2610 };
2611 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
2612 socket_factory_.AddSocketDataProvider(&socket_data);
2613 socket_data.StopAfter(1);
2614
rtenneti8332ba52015-09-17 19:33:412615 ServerNetworkStats stats1;
2616 stats1.srtt = base::TimeDelta::FromMicroseconds(10);
rtenneticcab42b2015-10-09 06:38:162617 http_server_properties_.SetServerNetworkStats(host_port_pair_, stats1);
rtenneti8332ba52015-09-17 19:33:412618
2619 crypto_client_stream_factory_.set_handshake_mode(
2620 MockCryptoClientStream::ZERO_RTT);
2621 host_resolver_.set_synchronous_mode(true);
2622 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2623 "192.168.0.1", "");
2624
jri7046038f2015-10-22 00:29:262625 QuicStreamRequest request(factory_.get());
rtenneti8332ba52015-09-17 19:33:412626 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562627 request.Request(host_port_pair_, privacy_mode_,
rtenneti8332ba52015-09-17 19:33:412628 /*cert_verify_flags=*/0, host_port_pair_.host(),
2629 "POST", net_log_, callback_.callback()));
2630
2631 // If we don't delay TCP connection, then time delay should be 0.
jri7046038f2015-10-22 00:29:262632 EXPECT_FALSE(factory_->delay_tcp_race());
rtenneti8332ba52015-09-17 19:33:412633 EXPECT_EQ(base::TimeDelta(), request.GetTimeDelayForWaitingJob());
2634
2635 // Enable |delay_tcp_race_| param and verify delay is one RTT and that
2636 // server supports QUIC.
jri7046038f2015-10-22 00:29:262637 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), true);
2638 EXPECT_TRUE(factory_->delay_tcp_race());
rtenneti8332ba52015-09-17 19:33:412639 EXPECT_EQ(base::TimeDelta::FromMicroseconds(15),
2640 request.GetTimeDelayForWaitingJob());
2641
2642 // Confirm the handshake and verify that the stream is created.
2643 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
2644 QuicSession::HANDSHAKE_CONFIRMED);
2645
2646 EXPECT_EQ(OK, callback_.WaitForResult());
2647
2648 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2649 EXPECT_TRUE(stream.get());
2650 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2651 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
jri7046038f2015-10-22 00:29:262652 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), delay_tcp_race);
rtenneti8332ba52015-09-17 19:33:412653}
2654
rtenneticd2aaa15b2015-10-10 20:29:332655TEST_P(QuicStreamFactoryTest, MaybeInitialize) {
jri7046038f2015-10-22 00:29:262656 store_server_configs_in_properties_ = true;
2657 Initialize();
2658 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti8a80a6dc2015-09-21 19:51:132659
rtenneti8a80a6dc2015-09-21 19:51:132660 const AlternativeService alternative_service1(QUIC, host_port_pair_.host(),
2661 host_port_pair_.port());
2662 AlternativeServiceInfoVector alternative_service_info_vector;
2663 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
2664 alternative_service_info_vector.push_back(
2665 AlternativeServiceInfo(alternative_service1, 1.0, expiration));
2666
rtenneticcab42b2015-10-09 06:38:162667 http_server_properties_.SetAlternativeServices(
rtenneti8a80a6dc2015-09-21 19:51:132668 host_port_pair_, alternative_service_info_vector);
2669
rch1fe2eeb2015-10-26 14:45:572670 QuicServerId quic_server_id("www.google.com", 80, PRIVACY_MODE_DISABLED);
rtenneticd2aaa15b2015-10-10 20:29:332671 QuicServerInfoFactory* quic_server_info_factory =
2672 new PropertiesBasedQuicServerInfoFactory(
2673 http_server_properties_.GetWeakPtr());
jri7046038f2015-10-22 00:29:262674 factory_->set_quic_server_info_factory(quic_server_info_factory);
rtenneticd2aaa15b2015-10-10 20:29:332675
2676 scoped_ptr<QuicServerInfo> quic_server_info(
2677 quic_server_info_factory->GetForServer(quic_server_id));
2678
2679 // Update quic_server_info's server_config and persist it.
2680 QuicServerInfo::State* state = quic_server_info->mutable_state();
2681 // Minimum SCFG that passes config validation checks.
2682 const char scfg[] = {// SCFG
2683 0x53, 0x43, 0x46, 0x47,
2684 // num entries
2685 0x01, 0x00,
2686 // padding
2687 0x00, 0x00,
2688 // EXPY
2689 0x45, 0x58, 0x50, 0x59,
2690 // EXPY end offset
2691 0x08, 0x00, 0x00, 0x00,
2692 // Value
2693 '1', '2', '3', '4', '5', '6', '7', '8'};
2694
2695 // Create temporary strings becasue Persist() clears string data in |state|.
2696 string server_config(reinterpret_cast<const char*>(&scfg), sizeof(scfg));
2697 string source_address_token("test_source_address_token");
2698 string signature("test_signature");
2699 string test_cert("test_cert");
2700 vector<string> certs;
2701 certs.push_back(test_cert);
2702 state->server_config = server_config;
2703 state->source_address_token = source_address_token;
2704 state->server_config_sig = signature;
2705 state->certs = certs;
2706
2707 quic_server_info->Persist();
2708
jri7046038f2015-10-22 00:29:262709 QuicStreamFactoryPeer::MaybeInitialize(factory_.get());
2710 EXPECT_TRUE(QuicStreamFactoryPeer::HasInitializedData(factory_.get()));
2711 EXPECT_TRUE(QuicStreamFactoryPeer::SupportsQuicAtStartUp(factory_.get(),
2712 host_port_pair_));
2713 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(factory_.get(),
rtenneticd2aaa15b2015-10-10 20:29:332714 quic_server_id));
2715 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:262716 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rtenneticd2aaa15b2015-10-10 20:29:332717 QuicCryptoClientConfig::CachedState* cached =
2718 crypto_config->LookupOrCreate(quic_server_id);
2719 EXPECT_FALSE(cached->server_config().empty());
2720 EXPECT_TRUE(cached->GetServerConfig());
2721 EXPECT_EQ(server_config, cached->server_config());
2722 EXPECT_EQ(source_address_token, cached->source_address_token());
2723 EXPECT_EQ(signature, cached->signature());
2724 ASSERT_EQ(1U, cached->certs().size());
2725 EXPECT_EQ(test_cert, cached->certs()[0]);
rtenneti8a80a6dc2015-09-21 19:51:132726}
2727
rtenneti1cd3b162015-09-29 02:58:282728TEST_P(QuicStreamFactoryTest, YieldAfterPackets) {
jri7046038f2015-10-22 00:29:262729 Initialize();
2730 QuicStreamFactoryPeer::SetYieldAfterPackets(factory_.get(), 0);
rtenneti1cd3b162015-09-29 02:58:282731
2732 scoped_ptr<QuicEncryptedPacket> close_packet(
2733 ConstructConnectionClosePacket(0));
rtenneticd2aaa15b2015-10-10 20:29:332734 vector<MockRead> reads;
rtenneti1cd3b162015-09-29 02:58:282735 reads.push_back(
2736 MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0));
2737 reads.push_back(MockRead(ASYNC, OK, 1));
2738 DeterministicSocketData socket_data(&reads[0], reads.size(), nullptr, 0);
2739 socket_factory_.AddSocketDataProvider(&socket_data);
2740 socket_data.StopAfter(1);
2741
2742 crypto_client_stream_factory_.set_handshake_mode(
2743 MockCryptoClientStream::ZERO_RTT);
2744 host_resolver_.set_synchronous_mode(true);
2745 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2746 "192.168.0.1", "");
2747
2748 // Set up the TaskObserver to verify QuicPacketReader::StartReading posts a
2749 // task.
2750 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
2751 SpdySessionTestTaskObserver observer("quic_packet_reader.cc", "StartReading");
2752
jri7046038f2015-10-22 00:29:262753 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562754 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtenneti1cd3b162015-09-29 02:58:282755 /*cert_verify_flags=*/0, host_port_pair_.host(),
2756 "GET", net_log_, callback_.callback()));
2757
2758 // Call run_loop so that QuicPacketReader::OnReadComplete() gets called.
2759 base::RunLoop run_loop;
2760 run_loop.RunUntilIdle();
2761
2762 // Verify task that the observer's executed_count is 1, which indicates
2763 // QuicPacketReader::StartReading() has posted only one task and yielded the
2764 // read.
2765 EXPECT_EQ(1u, observer.executed_count());
2766
2767 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2768 EXPECT_TRUE(stream.get());
2769 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2770 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2771}
2772
2773TEST_P(QuicStreamFactoryTest, YieldAfterDuration) {
jri7046038f2015-10-22 00:29:262774 Initialize();
rtenneti1cd3b162015-09-29 02:58:282775 QuicStreamFactoryPeer::SetYieldAfterDuration(
jri7046038f2015-10-22 00:29:262776 factory_.get(), QuicTime::Delta::FromMilliseconds(-1));
rtenneti1cd3b162015-09-29 02:58:282777
2778 scoped_ptr<QuicEncryptedPacket> close_packet(
2779 ConstructConnectionClosePacket(0));
rtenneticd2aaa15b2015-10-10 20:29:332780 vector<MockRead> reads;
rtenneti1cd3b162015-09-29 02:58:282781 reads.push_back(
2782 MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0));
2783 reads.push_back(MockRead(ASYNC, OK, 1));
2784 DeterministicSocketData socket_data(&reads[0], reads.size(), nullptr, 0);
2785 socket_factory_.AddSocketDataProvider(&socket_data);
2786 socket_data.StopAfter(1);
2787
2788 crypto_client_stream_factory_.set_handshake_mode(
2789 MockCryptoClientStream::ZERO_RTT);
2790 host_resolver_.set_synchronous_mode(true);
2791 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2792 "192.168.0.1", "");
2793
2794 // Set up the TaskObserver to verify QuicPacketReader::StartReading posts a
2795 // task.
2796 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
2797 SpdySessionTestTaskObserver observer("quic_packet_reader.cc", "StartReading");
2798
jri7046038f2015-10-22 00:29:262799 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562800 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtenneti1cd3b162015-09-29 02:58:282801 /*cert_verify_flags=*/0, host_port_pair_.host(),
2802 "GET", net_log_, callback_.callback()));
2803
2804 // Call run_loop so that QuicPacketReader::OnReadComplete() gets called.
2805 base::RunLoop run_loop;
2806 run_loop.RunUntilIdle();
2807
2808 // Verify task that the observer's executed_count is 1, which indicates
2809 // QuicPacketReader::StartReading() has posted only one task and yielded the
2810 // read.
2811 EXPECT_EQ(1u, observer.executed_count());
2812
2813 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2814 EXPECT_TRUE(stream.get());
2815 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2816 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2817}
2818
[email protected]e13201d82012-12-12 05:00:322819} // namespace test
[email protected]e13201d82012-12-12 05:00:322820} // namespace net