blob: 95705d38a7d57a4b5ad1e2034a204a177ec4cde4 [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:
rtenneti41c09992015-11-30 18:24:0185 static const QuicConfig* GetConfig(QuicStreamFactory* factory) {
86 return &factory->config_;
87 }
88
[email protected]59c0bbd2014-03-22 04:08:1289 static QuicCryptoClientConfig* GetCryptoConfig(QuicStreamFactory* factory) {
90 return &factory->crypto_config_;
[email protected]c49ff182013-09-28 08:33:2691 }
[email protected]4d283b32013-10-17 12:57:2792
93 static bool HasActiveSession(QuicStreamFactory* factory,
rchf114d982015-10-21 01:34:5694 const HostPortPair& host_port_pair) {
rch1fe2eeb2015-10-26 14:45:5795 QuicServerId server_id(host_port_pair, PRIVACY_MODE_DISABLED);
[email protected]257f24f2014-04-01 09:15:3796 return factory->HasActiveSession(server_id);
[email protected]4d283b32013-10-17 12:57:2797 }
98
ckrasic4f9d88d2015-07-22 22:23:1699 static QuicChromiumClientSession* GetActiveSession(
[email protected]4d283b32013-10-17 12:57:27100 QuicStreamFactory* factory,
rchf114d982015-10-21 01:34:56101 const HostPortPair& host_port_pair) {
rch1fe2eeb2015-10-26 14:45:57102 QuicServerId server_id(host_port_pair, PRIVACY_MODE_DISABLED);
[email protected]257f24f2014-04-01 09:15:37103 DCHECK(factory->HasActiveSession(server_id));
104 return factory->active_sessions_[server_id];
[email protected]df157d9d2014-03-10 07:27:27105 }
106
bnccb7ff3c2015-05-21 20:51:55107 static scoped_ptr<QuicHttpStream> CreateFromSession(
[email protected]df157d9d2014-03-10 07:27:27108 QuicStreamFactory* factory,
ckrasic4f9d88d2015-07-22 22:23:16109 QuicChromiumClientSession* session) {
bnccb7ff3c2015-05-21 20:51:55110 return factory->CreateFromSession(session);
[email protected]4d283b32013-10-17 12:57:27111 }
112
113 static bool IsLiveSession(QuicStreamFactory* factory,
ckrasic4f9d88d2015-07-22 22:23:16114 QuicChromiumClientSession* session) {
[email protected]4d590c9c2014-05-02 05:14:33115 for (QuicStreamFactory::SessionIdMap::iterator it =
[email protected]4d283b32013-10-17 12:57:27116 factory->all_sessions_.begin();
117 it != factory->all_sessions_.end(); ++it) {
[email protected]4d590c9c2014-05-02 05:14:33118 if (it->first == session)
[email protected]4d283b32013-10-17 12:57:27119 return true;
120 }
121 return false;
122 }
jri584002d12014-09-09 00:51:28123
rtenneti38f5cd52014-10-28 20:28:28124 static void SetTaskRunner(QuicStreamFactory* factory,
125 base::TaskRunner* task_runner) {
126 factory->task_runner_ = task_runner;
127 }
128
rtenneti85dcfac22015-03-27 20:22:19129 static int GetNumberOfLossyConnections(QuicStreamFactory* factory,
130 uint16 port) {
131 return factory->number_of_lossy_connections_[port];
132 }
133
134 static bool IsQuicDisabled(QuicStreamFactory* factory, uint16 port) {
135 return factory->IsQuicDisabled(port);
136 }
137
rtenneti8332ba52015-09-17 19:33:41138 static bool GetDelayTcpRace(QuicStreamFactory* factory) {
139 return factory->delay_tcp_race_;
140 }
141
142 static void SetDelayTcpRace(QuicStreamFactory* factory, bool delay_tcp_race) {
143 factory->delay_tcp_race_ = delay_tcp_race;
144 }
145
rtenneti1cd3b162015-09-29 02:58:28146 static void SetYieldAfterPackets(QuicStreamFactory* factory,
147 int yield_after_packets) {
148 factory->yield_after_packets_ = yield_after_packets;
149 }
150
151 static void SetYieldAfterDuration(QuicStreamFactory* factory,
152 QuicTime::Delta yield_after_duration) {
153 factory->yield_after_duration_ = yield_after_duration;
154 }
155
rtenneti14abd312015-02-06 21:56:01156 static size_t GetNumberOfActiveJobs(QuicStreamFactory* factory,
157 const QuicServerId& server_id) {
158 return (factory->active_jobs_[server_id]).size();
159 }
ckrasic1e53b642015-07-08 22:39:35160
ckrasic1e53b642015-07-08 22:39:35161 static int GetNumTimeoutsWithOpenStreams(QuicStreamFactory* factory) {
162 return factory->num_timeouts_with_open_streams_;
163 }
164
ckrasic1e53b642015-07-08 22:39:35165 static int GetNumPublicResetsPostHandshake(QuicStreamFactory* factory) {
166 return factory->num_public_resets_post_handshake_;
167 }
rtenneti8a80a6dc2015-09-21 19:51:13168
rtenneticd2aaa15b2015-10-10 20:29:33169 static void MaybeInitialize(QuicStreamFactory* factory) {
170 factory->MaybeInitialize();
rtenneti8a80a6dc2015-09-21 19:51:13171 }
172
rtenneticd2aaa15b2015-10-10 20:29:33173 static bool HasInitializedData(QuicStreamFactory* factory) {
174 return factory->has_initialized_data_;
rtenneti8a80a6dc2015-09-21 19:51:13175 }
176
177 static bool SupportsQuicAtStartUp(QuicStreamFactory* factory,
178 HostPortPair host_port_pair) {
179 return ContainsKey(factory->quic_supported_servers_at_startup_,
180 host_port_pair);
181 }
rtenneticd2aaa15b2015-10-10 20:29:33182
183 static bool CryptoConfigCacheIsEmpty(QuicStreamFactory* factory,
184 QuicServerId& quic_server_id) {
185 return factory->CryptoConfigCacheIsEmpty(quic_server_id);
186 }
[email protected]c49ff182013-09-28 08:33:26187};
188
rtenneti38f5cd52014-10-28 20:28:28189class MockQuicServerInfo : public QuicServerInfo {
190 public:
191 MockQuicServerInfo(const QuicServerId& server_id)
192 : QuicServerInfo(server_id) {}
dcheng2339883c2014-12-23 00:23:05193 ~MockQuicServerInfo() override {}
rtenneti38f5cd52014-10-28 20:28:28194
dcheng2339883c2014-12-23 00:23:05195 void Start() override {}
rtenneti38f5cd52014-10-28 20:28:28196
dcheng2339883c2014-12-23 00:23:05197 int WaitForDataReady(const CompletionCallback& callback) override {
rtenneti38f5cd52014-10-28 20:28:28198 return ERR_IO_PENDING;
199 }
200
rtenneti170f36a2015-02-10 19:13:45201 void ResetWaitForDataReadyCallback() override {}
202
dcheng2339883c2014-12-23 00:23:05203 void CancelWaitForDataReadyCallback() override {}
rtenneti38f5cd52014-10-28 20:28:28204
dcheng2339883c2014-12-23 00:23:05205 bool IsDataReady() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28206
dcheng2339883c2014-12-23 00:23:05207 bool IsReadyToPersist() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28208
dcheng2339883c2014-12-23 00:23:05209 void Persist() override {}
rtennetif0b832b2014-11-07 02:32:30210
dcheng2339883c2014-12-23 00:23:05211 void OnExternalCacheHit() override {}
rtenneti38f5cd52014-10-28 20:28:28212};
213
214class MockQuicServerInfoFactory : public QuicServerInfoFactory {
215 public:
216 MockQuicServerInfoFactory() {}
dcheng2339883c2014-12-23 00:23:05217 ~MockQuicServerInfoFactory() override {}
rtenneti38f5cd52014-10-28 20:28:28218
dcheng2339883c2014-12-23 00:23:05219 QuicServerInfo* GetForServer(const QuicServerId& server_id) override {
rtenneti38f5cd52014-10-28 20:28:28220 return new MockQuicServerInfo(server_id);
221 }
222};
223
rtenneti14abd312015-02-06 21:56:01224class QuicStreamFactoryTest : public ::testing::TestWithParam<TestParams> {
[email protected]e13201d82012-12-12 05:00:32225 protected:
226 QuicStreamFactoryTest()
[email protected]457d6952013-12-13 09:24:58227 : random_generator_(0),
228 clock_(new MockClock()),
rtenneti38f5cd52014-10-28 20:28:28229 runner_(new TestTaskRunner(clock_)),
bncb07c05532015-05-14 19:07:20230 maker_(GetParam().version, 0, clock_, kDefaultServerHostName),
[email protected]59c0bbd2014-03-22 04:08:12231 cert_verifier_(CertVerifier::CreateDefault()),
jri2b966f22014-09-02 22:25:36232 channel_id_service_(
rtennetibe635732014-10-02 22:51:42233 new ChannelIDService(new DefaultChannelIDStore(nullptr),
skyostil4891b25b2015-06-11 11:43:45234 base::ThreadTaskRunnerHandle::Get())),
rtenneti052774e2015-11-24 21:00:12235 cert_transparency_verifier_(new MultiLogCTVerifier()),
jri7046038f2015-10-22 00:29:26236 factory_(nullptr),
[email protected]bf4ea2f2014-03-10 22:57:53237 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
jri7046038f2015-10-22 00:29:26238 privacy_mode_(PRIVACY_MODE_DISABLED),
239 enable_port_selection_(true),
240 always_require_handshake_confirmation_(false),
241 disable_connection_pooling_(false),
242 load_server_info_timeout_srtt_multiplier_(0.0f),
243 enable_connection_racing_(true),
244 enable_non_blocking_io_(true),
245 disable_disk_cache_(false),
246 prefer_aes_(false),
247 max_number_of_lossy_connections_(0),
248 packet_loss_threshold_(1.0f),
249 max_disabled_reasons_(3),
250 threshold_timeouts_with_open_streams_(2),
251 threshold_public_resets_post_handshake_(2),
252 receive_buffer_size_(0),
253 delay_tcp_race_(false),
jri8c44d692015-10-23 23:53:41254 store_server_configs_in_properties_(false),
rtenneti41c09992015-11-30 18:24:01255 close_sessions_on_ip_change_(false),
256 idle_connection_timeout_seconds_(kIdleConnectionTimeoutSeconds) {
[email protected]ca4e0d92014-08-22 16:33:22257 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
jri7046038f2015-10-22 00:29:26258 }
259
260 void Initialize() {
261 factory_.reset(new QuicStreamFactory(
262 &host_resolver_, &socket_factory_, http_server_properties_.GetWeakPtr(),
263 cert_verifier_.get(), nullptr, channel_id_service_.get(),
rtenneti052774e2015-11-24 21:00:12264 &transport_security_state_, cert_transparency_verifier_.get(),
jri7046038f2015-10-22 00:29:26265 /*SocketPerformanceWatcherFactory*/ nullptr,
266 &crypto_client_stream_factory_, &random_generator_, clock_,
267 kDefaultMaxPacketSize, std::string(),
268 SupportedVersions(GetParam().version), enable_port_selection_,
269 always_require_handshake_confirmation_, disable_connection_pooling_,
270 load_server_info_timeout_srtt_multiplier_, enable_connection_racing_,
271 enable_non_blocking_io_, disable_disk_cache_, prefer_aes_,
272 max_number_of_lossy_connections_, packet_loss_threshold_,
273 max_disabled_reasons_, threshold_timeouts_with_open_streams_,
274 threshold_public_resets_post_handshake_, receive_buffer_size_,
jri8c44d692015-10-23 23:53:41275 delay_tcp_race_, store_server_configs_in_properties_,
rtenneti41c09992015-11-30 18:24:01276 close_sessions_on_ip_change_, idle_connection_timeout_seconds_,
277 QuicTagVector()));
jri7046038f2015-10-22 00:29:26278 factory_->set_require_confirmation(false);
279 factory_->set_quic_server_info_factory(new MockQuicServerInfoFactory());
[email protected]e13201d82012-12-12 05:00:32280 }
281
bnccb7ff3c2015-05-21 20:51:55282 bool HasActiveSession(const HostPortPair& host_port_pair) {
jri7046038f2015-10-22 00:29:26283 return QuicStreamFactoryPeer::HasActiveSession(factory_.get(),
284 host_port_pair);
bnccb7ff3c2015-05-21 20:51:55285 }
286
287 scoped_ptr<QuicHttpStream> CreateFromSession(
288 const HostPortPair& host_port_pair) {
ckrasic4f9d88d2015-07-22 22:23:16289 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:26290 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair);
291 return QuicStreamFactoryPeer::CreateFromSession(factory_.get(), session);
[email protected]df157d9d2014-03-10 07:27:27292 }
[email protected]e13201d82012-12-12 05:00:32293
[email protected]bf4ea2f2014-03-10 22:57:53294 int GetSourcePortForNewSession(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10295 return GetSourcePortForNewSessionInner(destination, false);
296 }
297
298 int GetSourcePortForNewSessionAndGoAway(
[email protected]bf4ea2f2014-03-10 22:57:53299 const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10300 return GetSourcePortForNewSessionInner(destination, true);
301 }
302
[email protected]bf4ea2f2014-03-10 22:57:53303 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
[email protected]d8e2abf82014-03-06 10:30:10304 bool goaway_received) {
[email protected]3c772402013-12-18 21:38:11305 // Should only be called if there is no active session for this destination.
bnccb7ff3c2015-05-21 20:51:55306 EXPECT_FALSE(HasActiveSession(destination));
[email protected]3c772402013-12-18 21:38:11307 size_t socket_count = socket_factory_.udp_client_sockets().size();
308
309 MockRead reads[] = {
310 MockRead(ASYNC, OK, 0) // EOF
311 };
rtennetibe635732014-10-02 22:51:42312 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]3c772402013-12-18 21:38:11313 socket_data.StopAfter(1);
314 socket_factory_.AddSocketDataProvider(&socket_data);
315
jri7046038f2015-10-22 00:29:26316 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:59317 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56318 request.Request(destination, privacy_mode_,
rtennetia75df622015-06-21 23:59:50319 /*cert_verify_flags=*/0, destination.host(),
320 "GET", net_log_, callback_.callback()));
[email protected]3c772402013-12-18 21:38:11321
322 EXPECT_EQ(OK, callback_.WaitForResult());
323 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
324 EXPECT_TRUE(stream.get());
325 stream.reset();
326
ckrasic4f9d88d2015-07-22 22:23:16327 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:26328 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), destination);
[email protected]3c772402013-12-18 21:38:11329
330 if (socket_count + 1 != socket_factory_.udp_client_sockets().size()) {
331 EXPECT_TRUE(false);
332 return 0;
333 }
334
335 IPEndPoint endpoint;
336 socket_factory_.
337 udp_client_sockets()[socket_count]->GetLocalAddress(&endpoint);
338 int port = endpoint.port();
[email protected]d8e2abf82014-03-06 10:30:10339 if (goaway_received) {
340 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, "");
rtenneti9bd5d4b2015-08-21 05:44:52341 session->connection()->OnGoAwayFrame(goaway);
[email protected]d8e2abf82014-03-06 10:30:10342 }
[email protected]3c772402013-12-18 21:38:11343
jri7046038f2015-10-22 00:29:26344 factory_->OnSessionClosed(session);
bnccb7ff3c2015-05-21 20:51:55345 EXPECT_FALSE(HasActiveSession(destination));
rch37de576c2015-05-17 20:28:17346 EXPECT_TRUE(socket_data.AllReadDataConsumed());
347 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:11348 return port;
349 }
350
rtenneti1cd3b162015-09-29 02:58:28351 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
352 QuicPacketNumber num) {
353 return maker_.MakeConnectionClosePacket(num);
354 }
355
[email protected]459a7402014-02-10 12:58:52356 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() {
[email protected]66ae5962014-05-22 11:13:05357 QuicStreamId stream_id = kClientDataStreamId1;
[email protected]51cc1342014-04-18 23:44:37358 return maker_.MakeRstPacket(
359 1, true, stream_id,
rtenneti14abd312015-02-06 21:56:01360 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam().version));
[email protected]459a7402014-02-10 12:58:52361 }
362
bncf8bf0722015-05-19 20:04:13363 static ProofVerifyDetailsChromium DefaultProofVerifyDetails() {
364 // Load a certificate that is valid for www.example.org, mail.example.org,
365 // and mail.example.com.
366 scoped_refptr<X509Certificate> test_cert(
367 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
368 EXPECT_TRUE(test_cert.get());
369 ProofVerifyDetailsChromium verify_details;
370 verify_details.cert_verify_result.verified_cert = test_cert;
371 verify_details.cert_verify_result.is_issued_by_known_root = true;
372 return verify_details;
373 }
374
jri8c44d692015-10-23 23:53:41375 void NotifyIPAddressChanged() {
376 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
377 // For thread safety, the NCN queues tasks to do the actual notifications,
378 // so we need to spin the message loop so the notification is delivered.
379 base::MessageLoop::current()->RunUntilIdle();
380 }
381
[email protected]e13201d82012-12-12 05:00:32382 MockHostResolver host_resolver_;
[email protected]0edce6a2013-05-08 18:02:40383 DeterministicMockClientSocketFactory socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05384 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]9558c5d32012-12-22 00:08:14385 MockRandom random_generator_;
[email protected]872edd9e2013-01-16 08:51:15386 MockClock* clock_; // Owned by factory_.
rtenneti38f5cd52014-10-28 20:28:28387 scoped_refptr<TestTaskRunner> runner_;
rtenneti4b06ae72014-08-26 03:43:43388 QuicTestPacketMaker maker_;
rtenneticcab42b2015-10-09 06:38:16389 HttpServerPropertiesImpl http_server_properties_;
[email protected]59c0bbd2014-03-22 04:08:12390 scoped_ptr<CertVerifier> cert_verifier_;
[email protected]6b8a3c742014-07-25 00:25:35391 scoped_ptr<ChannelIDService> channel_id_service_;
[email protected]080b77932014-08-04 01:22:46392 TransportSecurityState transport_security_state_;
rtenneti052774e2015-11-24 21:00:12393 scoped_ptr<CTVerifier> cert_transparency_verifier_;
jri7046038f2015-10-22 00:29:26394 scoped_ptr<QuicStreamFactory> factory_;
[email protected]bf4ea2f2014-03-10 22:57:53395 HostPortPair host_port_pair_;
[email protected]9dd3ff0f2014-03-26 09:51:28396 PrivacyMode privacy_mode_;
[email protected]e13201d82012-12-12 05:00:32397 BoundNetLog net_log_;
398 TestCompletionCallback callback_;
jri7046038f2015-10-22 00:29:26399
400 // Variables to configure QuicStreamFactory.
401 bool enable_port_selection_;
402 bool always_require_handshake_confirmation_;
403 bool disable_connection_pooling_;
404 double load_server_info_timeout_srtt_multiplier_;
405 bool enable_connection_racing_;
406 bool enable_non_blocking_io_;
407 bool disable_disk_cache_;
408 bool prefer_aes_;
409 int max_number_of_lossy_connections_;
410 double packet_loss_threshold_;
411 int max_disabled_reasons_;
412 int threshold_timeouts_with_open_streams_;
413 int threshold_public_resets_post_handshake_;
414 int receive_buffer_size_;
415 bool delay_tcp_race_;
416 bool store_server_configs_in_properties_;
jri8c44d692015-10-23 23:53:41417 bool close_sessions_on_ip_change_;
rtenneti41c09992015-11-30 18:24:01418 int idle_connection_timeout_seconds_;
[email protected]e13201d82012-12-12 05:00:32419};
420
rtenneti14abd312015-02-06 21:56:01421INSTANTIATE_TEST_CASE_P(Version,
422 QuicStreamFactoryTest,
423 ::testing::ValuesIn(GetTestParams()));
[email protected]1e960032013-12-20 19:00:20424
[email protected]1e960032013-12-20 19:00:20425TEST_P(QuicStreamFactoryTest, Create) {
jri7046038f2015-10-22 00:29:26426 Initialize();
427
[email protected]69dfd1b2013-06-04 22:20:12428 MockRead reads[] = {
[email protected]25c31dc2013-06-05 17:56:04429 MockRead(ASYNC, OK, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:12430 };
rtennetibe635732014-10-02 22:51:42431 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:32432 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]25c31dc2013-06-05 17:56:04433 socket_data.StopAfter(1);
[email protected]e13201d82012-12-12 05:00:32434
jri7046038f2015-10-22 00:29:26435 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:59436 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56437 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50438 /*cert_verify_flags=*/0, host_port_pair_.host(),
439 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32440
441 EXPECT_EQ(OK, callback_.WaitForResult());
442 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0edce6a2013-05-08 18:02:40443 EXPECT_TRUE(stream.get());
[email protected]e13201d82012-12-12 05:00:32444
445 // Will reset stream 3.
bnccb7ff3c2015-05-21 20:51:55446 stream = CreateFromSession(host_port_pair_);
[email protected]e13201d82012-12-12 05:00:32447 EXPECT_TRUE(stream.get());
448
[email protected]6d1b4ed2013-07-10 03:57:54449 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
450 // in streams on different sessions.
jri7046038f2015-10-22 00:29:26451 QuicStreamRequest request2(factory_.get());
rtennetia75df622015-06-21 23:59:50452 EXPECT_EQ(OK,
rchf114d982015-10-21 01:34:56453 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50454 /*cert_verify_flags=*/0, host_port_pair_.host(),
455 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32456 stream = request2.ReleaseStream(); // Will reset stream 5.
457 stream.reset(); // Will reset stream 7.
458
rch37de576c2015-05-17 20:28:17459 EXPECT_TRUE(socket_data.AllReadDataConsumed());
460 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:32461}
462
[email protected]8bd2b812014-03-26 04:01:17463TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
jri7046038f2015-10-22 00:29:26464 Initialize();
465
[email protected]8bd2b812014-03-26 04:01:17466 MockRead reads[] = {
467 MockRead(ASYNC, OK, 0) // EOF
468 };
rtennetibe635732014-10-02 22:51:42469 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17470 socket_factory_.AddSocketDataProvider(&socket_data);
471 socket_data.StopAfter(1);
472
473 crypto_client_stream_factory_.set_handshake_mode(
474 MockCryptoClientStream::ZERO_RTT);
475 host_resolver_.set_synchronous_mode(true);
476 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
477 "192.168.0.1", "");
478
jri7046038f2015-10-22 00:29:26479 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56480 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50481 /*cert_verify_flags=*/0, host_port_pair_.host(),
482 "GET", net_log_, callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17483
484 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
485 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17486 EXPECT_TRUE(socket_data.AllReadDataConsumed());
487 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17488}
489
490TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
jri7046038f2015-10-22 00:29:26491 Initialize();
492
[email protected]8bd2b812014-03-26 04:01:17493 MockRead reads[] = {
494 MockRead(ASYNC, OK, 0) // EOF
495 };
rtennetibe635732014-10-02 22:51:42496 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17497 socket_factory_.AddSocketDataProvider(&socket_data);
498 socket_data.StopAfter(1);
499
500 crypto_client_stream_factory_.set_handshake_mode(
501 MockCryptoClientStream::ZERO_RTT);
502 host_resolver_.set_synchronous_mode(true);
503 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
504 "192.168.0.1", "");
505
jri7046038f2015-10-22 00:29:26506 QuicStreamRequest request(factory_.get());
[email protected]8bd2b812014-03-26 04:01:17507 // Posts require handshake confirmation, so this will return asynchronously.
508 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56509 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50510 /*cert_verify_flags=*/0, host_port_pair_.host(),
511 "POST", net_log_, callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17512
513 // Confirm the handshake and verify that the stream is created.
514 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
515 QuicSession::HANDSHAKE_CONFIRMED);
516
517 EXPECT_EQ(OK, callback_.WaitForResult());
518 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
519 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17520 EXPECT_TRUE(socket_data.AllReadDataConsumed());
521 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17522}
523
bnc68d401dd2015-05-18 20:31:48524TEST_P(QuicStreamFactoryTest, NoZeroRttForDifferentHost) {
jri7046038f2015-10-22 00:29:26525 Initialize();
526
bnc68d401dd2015-05-18 20:31:48527 MockRead reads[] = {
528 MockRead(ASYNC, OK, 0),
529 };
530 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
531 socket_factory_.AddSocketDataProvider(&socket_data);
532 socket_data.StopAfter(1);
533
534 crypto_client_stream_factory_.set_handshake_mode(
535 MockCryptoClientStream::ZERO_RTT);
536 host_resolver_.set_synchronous_mode(true);
537 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
538 "192.168.0.1", "");
539
jri7046038f2015-10-22 00:29:26540 QuicStreamRequest request(factory_.get());
rtennetia75df622015-06-21 23:59:50541 int rv = request.Request(
rchf114d982015-10-21 01:34:56542 host_port_pair_, privacy_mode_, /*cert_verify_flags=*/0,
rtennetia75df622015-06-21 23:59:50543 "different.host.example.com", "GET", net_log_, callback_.callback());
bnc68d401dd2015-05-18 20:31:48544 // If server and origin have different hostnames, then handshake confirmation
545 // should be required, so Request will return asynchronously.
546 EXPECT_EQ(ERR_IO_PENDING, rv);
547 // Confirm handshake.
548 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
549 QuicSession::HANDSHAKE_CONFIRMED);
550 EXPECT_EQ(OK, callback_.WaitForResult());
551
552 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
553 EXPECT_TRUE(stream.get());
554 EXPECT_TRUE(socket_data.AllReadDataConsumed());
555 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
556}
557
rch68955482015-09-24 00:14:39558TEST_P(QuicStreamFactoryTest, GoAway) {
jri7046038f2015-10-22 00:29:26559 Initialize();
560
rch68955482015-09-24 00:14:39561 MockRead reads[] = {
562 MockRead(ASYNC, OK, 0) // EOF
563 };
564 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
565 socket_factory_.AddSocketDataProvider(&socket_data);
566 socket_data.StopAfter(1);
567
jri7046038f2015-10-22 00:29:26568 QuicStreamRequest request(factory_.get());
rch68955482015-09-24 00:14:39569 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56570 request.Request(host_port_pair_, privacy_mode_,
rch68955482015-09-24 00:14:39571 /*cert_verify_flags=*/0, host_port_pair_.host(),
572 "GET", net_log_, callback_.callback()));
573
574 EXPECT_EQ(OK, callback_.WaitForResult());
575 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
576 EXPECT_TRUE(stream.get());
577
rchf114d982015-10-21 01:34:56578 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:26579 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
rch68955482015-09-24 00:14:39580
581 session->OnGoAway(QuicGoAwayFrame());
582
rchf114d982015-10-21 01:34:56583 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:26584 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
rch68955482015-09-24 00:14:39585
586 EXPECT_TRUE(socket_data.AllReadDataConsumed());
587 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
588}
589
[email protected]5db452202014-08-19 05:22:15590TEST_P(QuicStreamFactoryTest, Pooling) {
jri7046038f2015-10-22 00:29:26591 Initialize();
592
[email protected]eed749f92013-12-23 18:57:38593 MockRead reads[] = {
594 MockRead(ASYNC, OK, 0) // EOF
595 };
rtennetibe635732014-10-02 22:51:42596 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38597 socket_factory_.AddSocketDataProvider(&socket_data);
598 socket_data.StopAfter(1);
599
[email protected]bf4ea2f2014-03-10 22:57:53600 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38601 host_resolver_.set_synchronous_mode(true);
602 host_resolver_.rules()->AddIPLiteralRule(
603 kDefaultServerHostName, "192.168.0.1", "");
604 host_resolver_.rules()->AddIPLiteralRule(
605 "mail.google.com", "192.168.0.1", "");
606
jri7046038f2015-10-22 00:29:26607 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56608 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50609 /*cert_verify_flags=*/0, host_port_pair_.host(),
610 "GET", net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38611 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
612 EXPECT_TRUE(stream.get());
613
614 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26615 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56616 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50617 /*cert_verify_flags=*/0, server2.host(), "GET",
618 net_log_, callback.callback()));
[email protected]eed749f92013-12-23 18:57:38619 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
620 EXPECT_TRUE(stream2.get());
621
jri7046038f2015-10-22 00:29:26622 EXPECT_EQ(
623 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_),
624 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38625
rch37de576c2015-05-17 20:28:17626 EXPECT_TRUE(socket_data.AllReadDataConsumed());
627 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38628}
629
jri584002d12014-09-09 00:51:28630TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) {
jri7046038f2015-10-22 00:29:26631 disable_connection_pooling_ = true;
632 Initialize();
633
jri584002d12014-09-09 00:51:28634 MockRead reads[] = {
635 MockRead(ASYNC, OK, 0) // EOF
636 };
rtennetibe635732014-10-02 22:51:42637 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
638 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28639 socket_factory_.AddSocketDataProvider(&socket_data1);
640 socket_factory_.AddSocketDataProvider(&socket_data2);
641 socket_data1.StopAfter(1);
642 socket_data2.StopAfter(1);
643
644 HostPortPair server2("mail.google.com", kDefaultServerPort);
645 host_resolver_.set_synchronous_mode(true);
646 host_resolver_.rules()->AddIPLiteralRule(
647 kDefaultServerHostName, "192.168.0.1", "");
648 host_resolver_.rules()->AddIPLiteralRule(
649 "mail.google.com", "192.168.0.1", "");
650
jri7046038f2015-10-22 00:29:26651 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56652 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50653 /*cert_verify_flags=*/0, host_port_pair_.host(),
654 "GET", net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28655 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
656 EXPECT_TRUE(stream.get());
657
658 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26659 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56660 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50661 /*cert_verify_flags=*/0, server2.host(), "GET",
662 net_log_, callback.callback()));
jri584002d12014-09-09 00:51:28663 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
664 EXPECT_TRUE(stream2.get());
665
jri7046038f2015-10-22 00:29:26666 EXPECT_NE(
667 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_),
668 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
jri584002d12014-09-09 00:51:28669
rch37de576c2015-05-17 20:28:17670 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
671 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
672 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
673 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28674}
675
[email protected]eed749f92013-12-23 18:57:38676TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
jri7046038f2015-10-22 00:29:26677 Initialize();
678
[email protected]eed749f92013-12-23 18:57:38679 MockRead reads[] = {
680 MockRead(ASYNC, OK, 0) // EOF
681 };
rtennetibe635732014-10-02 22:51:42682 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
683 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38684 socket_factory_.AddSocketDataProvider(&socket_data1);
685 socket_factory_.AddSocketDataProvider(&socket_data2);
686 socket_data1.StopAfter(1);
687 socket_data2.StopAfter(1);
688
[email protected]bf4ea2f2014-03-10 22:57:53689 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38690 host_resolver_.set_synchronous_mode(true);
691 host_resolver_.rules()->AddIPLiteralRule(
692 kDefaultServerHostName, "192.168.0.1", "");
693 host_resolver_.rules()->AddIPLiteralRule(
694 "mail.google.com", "192.168.0.1", "");
695
jri7046038f2015-10-22 00:29:26696 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56697 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50698 /*cert_verify_flags=*/0, host_port_pair_.host(),
699 "GET", net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38700 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
701 EXPECT_TRUE(stream.get());
702
703 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26704 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56705 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50706 /*cert_verify_flags=*/0, server2.host(), "GET",
707 net_log_, callback.callback()));
[email protected]eed749f92013-12-23 18:57:38708 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
709 EXPECT_TRUE(stream2.get());
710
jri7046038f2015-10-22 00:29:26711 factory_->OnSessionGoingAway(
712 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_));
rchf114d982015-10-21 01:34:56713 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:26714 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
715 EXPECT_FALSE(
716 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38717
718 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:26719 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:56720 EXPECT_EQ(OK, request3.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50721 /*cert_verify_flags=*/0, server2.host(), "GET",
722 net_log_, callback3.callback()));
[email protected]eed749f92013-12-23 18:57:38723 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
724 EXPECT_TRUE(stream3.get());
725
jri7046038f2015-10-22 00:29:26726 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38727
rch37de576c2015-05-17 20:28:17728 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
729 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
730 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
731 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38732}
733
[email protected]5db452202014-08-19 05:22:15734TEST_P(QuicStreamFactoryTest, HttpsPooling) {
jri7046038f2015-10-22 00:29:26735 Initialize();
[email protected]eed749f92013-12-23 18:57:38736 MockRead reads[] = {
737 MockRead(ASYNC, OK, 0) // EOF
738 };
rtennetibe635732014-10-02 22:51:42739 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38740 socket_factory_.AddSocketDataProvider(&socket_data);
741 socket_data.StopAfter(1);
742
[email protected]bf4ea2f2014-03-10 22:57:53743 HostPortPair server1("www.example.org", 443);
744 HostPortPair server2("mail.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38745
bncf8bf0722015-05-19 20:04:13746 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01747 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38748
749 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53750 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
751 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38752
jri7046038f2015-10-22 00:29:26753 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56754 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
rtennetia75df622015-06-21 23:59:50755 /*cert_verify_flags=*/0, server1.host(), "GET",
756 net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38757 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
758 EXPECT_TRUE(stream.get());
759
760 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26761 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56762 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50763 /*cert_verify_flags=*/0, server2.host(), "GET",
764 net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38765 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
766 EXPECT_TRUE(stream2.get());
767
jri7046038f2015-10-22 00:29:26768 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
769 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38770
rch37de576c2015-05-17 20:28:17771 EXPECT_TRUE(socket_data.AllReadDataConsumed());
772 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38773}
774
jri584002d12014-09-09 00:51:28775TEST_P(QuicStreamFactoryTest, NoHttpsPoolingIfDisabled) {
jri7046038f2015-10-22 00:29:26776 disable_connection_pooling_ = true;
777 Initialize();
778
jri584002d12014-09-09 00:51:28779 MockRead reads[] = {
780 MockRead(ASYNC, OK, 0) // EOF
781 };
rtennetibe635732014-10-02 22:51:42782 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
783 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28784 socket_factory_.AddSocketDataProvider(&socket_data1);
785 socket_factory_.AddSocketDataProvider(&socket_data2);
786 socket_data1.StopAfter(1);
787 socket_data2.StopAfter(1);
788
789 HostPortPair server1("www.example.org", 443);
790 HostPortPair server2("mail.example.org", 443);
791
bncf8bf0722015-05-19 20:04:13792 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01793 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28794
795 host_resolver_.set_synchronous_mode(true);
796 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
797 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
798
jri7046038f2015-10-22 00:29:26799 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56800 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
rtennetia75df622015-06-21 23:59:50801 /*cert_verify_flags=*/0, server1.host(), "GET",
802 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28803 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
804 EXPECT_TRUE(stream.get());
805
806 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26807 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56808 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50809 /*cert_verify_flags=*/0, server2.host(), "GET",
810 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28811 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
812 EXPECT_TRUE(stream2.get());
813
jri7046038f2015-10-22 00:29:26814 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
815 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
jri584002d12014-09-09 00:51:28816
rch37de576c2015-05-17 20:28:17817 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
818 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
819 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
820 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28821}
822
bnccb7ff3c2015-05-21 20:51:55823class QuicAlternativeServiceCertificateValidationPooling
824 : public QuicStreamFactoryTest {
825 public:
826 void Run(bool valid) {
827 MockRead reads[] = {
828 MockRead(ASYNC, OK, 0) // EOF
829 };
830 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
831 socket_factory_.AddSocketDataProvider(&socket_data1);
832 socket_data1.StopAfter(1);
[email protected]eed749f92013-12-23 18:57:38833
bnccb7ff3c2015-05-21 20:51:55834 HostPortPair server1("www.example.org", 443);
835 HostPortPair server2("mail.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38836
bnccb7ff3c2015-05-21 20:51:55837 std::string origin_host(valid ? "mail.example.org" : "invalid.example.org");
838 HostPortPair alternative("www.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38839
bnccb7ff3c2015-05-21 20:51:55840 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
841 bool common_name_fallback_used;
842 EXPECT_EQ(valid,
843 verify_details.cert_verify_result.verified_cert->VerifyNameMatch(
844 origin_host, &common_name_fallback_used));
845 EXPECT_TRUE(
846 verify_details.cert_verify_result.verified_cert->VerifyNameMatch(
847 alternative.host(), &common_name_fallback_used));
848 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38849
bnccb7ff3c2015-05-21 20:51:55850 host_resolver_.set_synchronous_mode(true);
851 host_resolver_.rules()->AddIPLiteralRule(alternative.host(), "192.168.0.1",
852 "");
[email protected]eed749f92013-12-23 18:57:38853
bnccb7ff3c2015-05-21 20:51:55854 // Open first stream to alternative.
jri7046038f2015-10-22 00:29:26855 QuicStreamRequest request1(factory_.get());
rchf114d982015-10-21 01:34:56856 EXPECT_EQ(OK, request1.Request(alternative, privacy_mode_,
rtennetia75df622015-06-21 23:59:50857 /*cert_verify_flags=*/0, alternative.host(),
858 "GET", net_log_, callback_.callback()));
bnccb7ff3c2015-05-21 20:51:55859 scoped_ptr<QuicHttpStream> stream1 = request1.ReleaseStream();
860 EXPECT_TRUE(stream1.get());
[email protected]eed749f92013-12-23 18:57:38861
jri7046038f2015-10-22 00:29:26862 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56863 int rv = request2.Request(alternative, privacy_mode_,
rtennetia75df622015-06-21 23:59:50864 /*cert_verify_flags=*/0, origin_host, "GET",
865 net_log_, callback_.callback());
bnccb7ff3c2015-05-21 20:51:55866 if (valid) {
867 // Alternative service of origin to |alternative| should pool to session
868 // of |stream1| even if origin is different. Since only one
869 // SocketDataProvider is set up, the second request succeeding means that
870 // it pooled to the session opened by the first one.
871 EXPECT_EQ(OK, rv);
872 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
873 EXPECT_TRUE(stream2.get());
874 } else {
875 EXPECT_EQ(ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN, rv);
876 }
[email protected]eed749f92013-12-23 18:57:38877
bnccb7ff3c2015-05-21 20:51:55878 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
879 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
880 }
881};
882
883INSTANTIATE_TEST_CASE_P(Version,
884 QuicAlternativeServiceCertificateValidationPooling,
885 ::testing::ValuesIn(GetTestParams()));
886
887TEST_P(QuicAlternativeServiceCertificateValidationPooling, Valid) {
jri7046038f2015-10-22 00:29:26888 Initialize();
bnccb7ff3c2015-05-21 20:51:55889 Run(true);
890}
891
892TEST_P(QuicAlternativeServiceCertificateValidationPooling, Invalid) {
jri7046038f2015-10-22 00:29:26893 Initialize();
bnccb7ff3c2015-05-21 20:51:55894 Run(false);
[email protected]eed749f92013-12-23 18:57:38895}
896
[email protected]5db452202014-08-19 05:22:15897TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
jri7046038f2015-10-22 00:29:26898 Initialize();
[email protected]5db452202014-08-19 05:22:15899 MockRead reads[] = {
900 MockRead(ASYNC, OK, 0) // EOF
901 };
rtennetibe635732014-10-02 22:51:42902 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15903 socket_factory_.AddSocketDataProvider(&socket_data);
904 socket_data.StopAfter(1);
905
906 HostPortPair server1("www.example.org", 443);
907 HostPortPair server2("mail.example.org", 443);
908 uint8 primary_pin = 1;
909 uint8 backup_pin = 2;
910 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
911 backup_pin);
912
bncf8bf0722015-05-19 20:04:13913 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
[email protected]5db452202014-08-19 05:22:15914 verify_details.cert_verify_result.public_key_hashes.push_back(
915 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01916 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]5db452202014-08-19 05:22:15917
918 host_resolver_.set_synchronous_mode(true);
919 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
920 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
921
jri7046038f2015-10-22 00:29:26922 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56923 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
rtennetia75df622015-06-21 23:59:50924 /*cert_verify_flags=*/0, server1.host(), "GET",
925 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15926 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
927 EXPECT_TRUE(stream.get());
928
929 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26930 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56931 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50932 /*cert_verify_flags=*/0, server2.host(), "GET",
933 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15934 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
935 EXPECT_TRUE(stream2.get());
936
jri7046038f2015-10-22 00:29:26937 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
938 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]5db452202014-08-19 05:22:15939
rch37de576c2015-05-17 20:28:17940 EXPECT_TRUE(socket_data.AllReadDataConsumed());
941 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:15942}
943
jri584002d12014-09-09 00:51:28944TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithMatchingPinsIfDisabled) {
jri7046038f2015-10-22 00:29:26945 disable_connection_pooling_ = true;
946 Initialize();
947
jri584002d12014-09-09 00:51:28948 MockRead reads[] = {
949 MockRead(ASYNC, OK, 0) // EOF
950 };
rtennetibe635732014-10-02 22:51:42951 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
952 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28953 socket_factory_.AddSocketDataProvider(&socket_data1);
954 socket_factory_.AddSocketDataProvider(&socket_data2);
955 socket_data1.StopAfter(1);
956 socket_data2.StopAfter(1);
957
958 HostPortPair server1("www.example.org", 443);
959 HostPortPair server2("mail.example.org", 443);
960 uint8 primary_pin = 1;
961 uint8 backup_pin = 2;
962 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
963 backup_pin);
964
bncf8bf0722015-05-19 20:04:13965 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
jri584002d12014-09-09 00:51:28966 verify_details.cert_verify_result.public_key_hashes.push_back(
967 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01968 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28969
970 host_resolver_.set_synchronous_mode(true);
971 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
972 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
973
jri7046038f2015-10-22 00:29:26974 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56975 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
rtennetia75df622015-06-21 23:59:50976 /*cert_verify_flags=*/0, server1.host(), "GET",
977 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28978 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
979 EXPECT_TRUE(stream.get());
980
981 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26982 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56983 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50984 /*cert_verify_flags=*/0, server2.host(), "GET",
985 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28986 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
987 EXPECT_TRUE(stream2.get());
988
jri7046038f2015-10-22 00:29:26989 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
990 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
jri584002d12014-09-09 00:51:28991
rch37de576c2015-05-17 20:28:17992 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
993 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
994 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
995 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28996}
997
[email protected]5db452202014-08-19 05:22:15998TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
jri7046038f2015-10-22 00:29:26999 Initialize();
[email protected]5db452202014-08-19 05:22:151000 MockRead reads[] = {
1001 MockRead(ASYNC, OK, 0) // EOF
1002 };
rtennetibe635732014-10-02 22:51:421003 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
1004 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:151005 socket_factory_.AddSocketDataProvider(&socket_data1);
1006 socket_factory_.AddSocketDataProvider(&socket_data2);
1007 socket_data1.StopAfter(1);
1008 socket_data2.StopAfter(1);
1009
1010 HostPortPair server1("www.example.org", 443);
1011 HostPortPair server2("mail.example.org", 443);
1012 uint8 primary_pin = 1;
1013 uint8 backup_pin = 2;
1014 uint8 bad_pin = 3;
1015 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
1016 backup_pin);
1017
bncf8bf0722015-05-19 20:04:131018 ProofVerifyDetailsChromium verify_details1 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011019 verify_details1.cert_verify_result.public_key_hashes.push_back(
1020 test::GetTestHashValue(bad_pin));
1021 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
1022
bncf8bf0722015-05-19 20:04:131023 ProofVerifyDetailsChromium verify_details2 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011024 verify_details2.cert_verify_result.public_key_hashes.push_back(
1025 test::GetTestHashValue(primary_pin));
1026 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
[email protected]5db452202014-08-19 05:22:151027
1028 host_resolver_.set_synchronous_mode(true);
1029 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1030 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1031
jri7046038f2015-10-22 00:29:261032 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561033 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
rtennetia75df622015-06-21 23:59:501034 /*cert_verify_flags=*/0, server1.host(), "GET",
1035 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:151036 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1037 EXPECT_TRUE(stream.get());
1038
1039 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:261040 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:561041 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:501042 /*cert_verify_flags=*/0, server2.host(), "GET",
1043 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:151044 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1045 EXPECT_TRUE(stream2.get());
1046
jri7046038f2015-10-22 00:29:261047 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
1048 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]5db452202014-08-19 05:22:151049
rch37de576c2015-05-17 20:28:171050 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1051 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1052 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1053 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:151054}
1055
[email protected]1e960032013-12-20 19:00:201056TEST_P(QuicStreamFactoryTest, Goaway) {
jri7046038f2015-10-22 00:29:261057 Initialize();
[email protected]4d283b32013-10-17 12:57:271058 MockRead reads[] = {
1059 MockRead(ASYNC, OK, 0) // EOF
1060 };
rtennetibe635732014-10-02 22:51:421061 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271062 socket_data.StopAfter(1);
1063 socket_factory_.AddSocketDataProvider(&socket_data);
rtennetibe635732014-10-02 22:51:421064 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271065 socket_data2.StopAfter(1);
1066 socket_factory_.AddSocketDataProvider(&socket_data2);
1067
jri7046038f2015-10-22 00:29:261068 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591069 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561070 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501071 /*cert_verify_flags=*/0, host_port_pair_.host(),
1072 "GET", net_log_, callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271073
1074 EXPECT_EQ(OK, callback_.WaitForResult());
1075 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1076 EXPECT_TRUE(stream.get());
1077
1078 // Mark the session as going away. Ensure that while it is still alive
1079 // that it is no longer active.
rchf114d982015-10-21 01:34:561080 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:261081 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1082 factory_->OnSessionGoingAway(session);
1083 EXPECT_EQ(true,
1084 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
rchf114d982015-10-21 01:34:561085 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261086 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
bnccb7ff3c2015-05-21 20:51:551087 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]4d283b32013-10-17 12:57:271088
1089 // Create a new request for the same destination and verify that a
1090 // new session is created.
jri7046038f2015-10-22 00:29:261091 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591092 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561093 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501094 /*cert_verify_flags=*/0, host_port_pair_.host(),
1095 "GET", net_log_, callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271096 EXPECT_EQ(OK, callback_.WaitForResult());
1097 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1098 EXPECT_TRUE(stream2.get());
1099
rchf114d982015-10-21 01:34:561100 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:261101 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
1102 EXPECT_NE(session, QuicStreamFactoryPeer::GetActiveSession(factory_.get(),
rchf114d982015-10-21 01:34:561103 host_port_pair_));
jri7046038f2015-10-22 00:29:261104 EXPECT_EQ(true,
1105 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
[email protected]4d283b32013-10-17 12:57:271106
1107 stream2.reset();
1108 stream.reset();
1109
rch37de576c2015-05-17 20:28:171110 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1111 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1112 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1113 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]4d283b32013-10-17 12:57:271114}
1115
[email protected]1e960032013-12-20 19:00:201116TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
jri7046038f2015-10-22 00:29:261117 Initialize();
[email protected]66ae5962014-05-22 11:13:051118 QuicStreamId stream_id = kClientDataStreamId1;
ckrasicea295fe2015-10-31 05:03:271119 scoped_ptr<QuicEncryptedPacket> client_rst(
[email protected]1e960032013-12-20 19:00:201120 maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
[email protected]06ff5152013-08-29 01:03:051121 MockWrite writes[] = {
ckrasicea295fe2015-10-31 05:03:271122 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 0),
1123 };
1124 scoped_ptr<QuicEncryptedPacket> server_rst(
1125 maker_.MakeRstPacket(1, false, stream_id, QUIC_STREAM_CANCELLED));
1126 MockRead reads[] = {
1127 MockRead(ASYNC, server_rst->data(), server_rst->length(), 1),
1128 MockRead(ASYNC, OK, 2) // EOF
[email protected]06ff5152013-08-29 01:03:051129 };
1130 DeterministicSocketData socket_data(reads, arraysize(reads),
1131 writes, arraysize(writes));
[email protected]0b2294d32013-08-02 00:46:361132 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasicea295fe2015-10-31 05:03:271133 socket_data.StopAfter(2);
[email protected]0b2294d32013-08-02 00:46:361134
1135 HttpRequestInfo request_info;
1136 std::vector<QuicHttpStream*> streams;
1137 // The MockCryptoClientStream sets max_open_streams to be
rtenneti6a4cf3b2015-01-09 03:41:151138 // kDefaultMaxStreamsPerConnection / 2.
1139 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection / 2; i++) {
jri7046038f2015-10-22 00:29:261140 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561141 int rv = request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501142 /*cert_verify_flags=*/0, host_port_pair_.host(),
1143 "GET", net_log_, callback_.callback());
[email protected]0b2294d32013-08-02 00:46:361144 if (i == 0) {
1145 EXPECT_EQ(ERR_IO_PENDING, rv);
1146 EXPECT_EQ(OK, callback_.WaitForResult());
1147 } else {
1148 EXPECT_EQ(OK, rv);
1149 }
1150 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1151 EXPECT_TRUE(stream);
1152 EXPECT_EQ(OK, stream->InitializeStream(
1153 &request_info, DEFAULT_PRIORITY, net_log_, CompletionCallback()));
1154 streams.push_back(stream.release());
1155 }
1156
jri7046038f2015-10-22 00:29:261157 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561158 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501159 /*cert_verify_flags=*/0, host_port_pair_.host(),
1160 "GET", net_log_, CompletionCallback()));
[email protected]0b2294d32013-08-02 00:46:361161 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1162 EXPECT_TRUE(stream);
1163 EXPECT_EQ(ERR_IO_PENDING, stream->InitializeStream(
1164 &request_info, DEFAULT_PRIORITY, net_log_, callback_.callback()));
1165
1166 // Close the first stream.
1167 streams.front()->Close(false);
ckrasicea295fe2015-10-31 05:03:271168 // Trigger exchange of RSTs that in turn allow progress for the last
1169 // stream.
1170 socket_data.RunFor(2);
[email protected]0b2294d32013-08-02 00:46:361171
1172 ASSERT_TRUE(callback_.have_result());
[email protected]0b2294d32013-08-02 00:46:361173 EXPECT_EQ(OK, callback_.WaitForResult());
1174
rch37de576c2015-05-17 20:28:171175 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1176 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
ckrasicea295fe2015-10-31 05:03:271177
1178 // Force close of the connection to suppress the generation of RST
1179 // packets when streams are torn down, which wouldn't be relevant to
1180 // this test anyway.
1181 QuicChromiumClientSession* session =
1182 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1183 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
1184
[email protected]0b2294d32013-08-02 00:46:361185 STLDeleteElements(&streams);
1186}
1187
[email protected]1e960032013-12-20 19:00:201188TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
jri7046038f2015-10-22 00:29:261189 Initialize();
rtennetibe635732014-10-02 22:51:421190 DeterministicSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321191 socket_factory_.AddSocketDataProvider(&socket_data);
1192
[email protected]3c772402013-12-18 21:38:111193 host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName);
[email protected]e13201d82012-12-12 05:00:321194
jri7046038f2015-10-22 00:29:261195 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591196 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561197 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501198 /*cert_verify_flags=*/0, host_port_pair_.host(),
1199 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321200
1201 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
1202
rch37de576c2015-05-17 20:28:171203 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1204 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321205}
1206
[email protected]1e960032013-12-20 19:00:201207TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
jri7046038f2015-10-22 00:29:261208 Initialize();
[email protected]3c772402013-12-18 21:38:111209 MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
rtennetibe635732014-10-02 22:51:421210 DeterministicSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]3c772402013-12-18 21:38:111211 socket_data.set_connect_data(connect);
1212 socket_factory_.AddSocketDataProvider(&socket_data);
1213 socket_data.StopAfter(1);
1214
jri7046038f2015-10-22 00:29:261215 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591216 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561217 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501218 /*cert_verify_flags=*/0, host_port_pair_.host(),
1219 "GET", net_log_, callback_.callback()));
[email protected]3c772402013-12-18 21:38:111220
1221 EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult());
1222
rch37de576c2015-05-17 20:28:171223 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1224 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:111225}
1226
[email protected]1e960032013-12-20 19:00:201227TEST_P(QuicStreamFactoryTest, CancelCreate) {
jri7046038f2015-10-22 00:29:261228 Initialize();
[email protected]69dfd1b2013-06-04 22:20:121229 MockRead reads[] = {
[email protected]25c31dc2013-06-05 17:56:041230 MockRead(ASYNC, OK, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121231 };
rtennetibe635732014-10-02 22:51:421232 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321233 socket_factory_.AddSocketDataProvider(&socket_data);
1234 {
jri7046038f2015-10-22 00:29:261235 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591236 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561237 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501238 /*cert_verify_flags=*/0, host_port_pair_.host(),
1239 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321240 }
1241
[email protected]25c31dc2013-06-05 17:56:041242 socket_data.StopAfter(1);
[email protected]e13201d82012-12-12 05:00:321243 base::RunLoop run_loop;
1244 run_loop.RunUntilIdle();
1245
bnccb7ff3c2015-05-21 20:51:551246 scoped_ptr<QuicHttpStream> stream(CreateFromSession(host_port_pair_));
[email protected]e13201d82012-12-12 05:00:321247 EXPECT_TRUE(stream.get());
1248 stream.reset();
1249
rch37de576c2015-05-17 20:28:171250 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1251 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321252}
1253
[email protected]1e960032013-12-20 19:00:201254TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) {
jri7046038f2015-10-22 00:29:261255 Initialize();
1256
[email protected]3c772402013-12-18 21:38:111257 // Sequentially connect to the default host, then another host, and then the
1258 // default host. Verify that the default host gets a consistent ephemeral
1259 // port, that is different from the other host's connection.
1260
1261 std::string other_server_name = "other.google.com";
1262 EXPECT_NE(kDefaultServerHostName, other_server_name);
1263 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort);
[email protected]3c772402013-12-18 21:38:111264
[email protected]bf4ea2f2014-03-10 22:57:531265 int original_port = GetSourcePortForNewSession(host_port_pair_);
1266 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2));
1267 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]3c772402013-12-18 21:38:111268}
1269
[email protected]d8e2abf82014-03-06 10:30:101270TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) {
jri7046038f2015-10-22 00:29:261271 Initialize();
1272
[email protected]d8e2abf82014-03-06 10:30:101273 // Get a session to the host using the port suggester.
1274 int original_port =
[email protected]bf4ea2f2014-03-10 22:57:531275 GetSourcePortForNewSessionAndGoAway(host_port_pair_);
[email protected]d8e2abf82014-03-06 10:30:101276 // Verify that the port is different after the goaway.
[email protected]bf4ea2f2014-03-10 22:57:531277 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101278 // Since the previous session did not goaway we should see the original port.
[email protected]bf4ea2f2014-03-10 22:57:531279 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101280}
1281
[email protected]1e960032013-12-20 19:00:201282TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
jri7046038f2015-10-22 00:29:261283 Initialize();
[email protected]56dfb902013-01-03 23:17:551284 MockRead reads[] = {
[email protected]0edce6a2013-05-08 18:02:401285 MockRead(ASYNC, 0, 0) // EOF
[email protected]56dfb902013-01-03 23:17:551286 };
[email protected]459a7402014-02-10 12:58:521287 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1288 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311289 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521290 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421291 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521292 writes.size());
[email protected]56dfb902013-01-03 23:17:551293 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0edce6a2013-05-08 18:02:401294 socket_data.StopAfter(1);
[email protected]56dfb902013-01-03 23:17:551295
[email protected]69dfd1b2013-06-04 22:20:121296 MockRead reads2[] = {
[email protected]25c31dc2013-06-05 17:56:041297 MockRead(ASYNC, 0, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121298 };
rtennetibe635732014-10-02 22:51:421299 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]56dfb902013-01-03 23:17:551300 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]0edce6a2013-05-08 18:02:401301 socket_data2.StopAfter(1);
[email protected]56dfb902013-01-03 23:17:551302
jri7046038f2015-10-22 00:29:261303 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591304 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561305 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501306 /*cert_verify_flags=*/0, host_port_pair_.host(),
1307 "GET", net_log_, callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551308
1309 EXPECT_EQ(OK, callback_.WaitForResult());
1310 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361311 HttpRequestInfo request_info;
1312 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1313 DEFAULT_PRIORITY,
1314 net_log_, CompletionCallback()));
[email protected]56dfb902013-01-03 23:17:551315
1316 // Close the session and verify that stream saw the error.
jri7046038f2015-10-22 00:29:261317 factory_->CloseAllSessions(ERR_INTERNET_DISCONNECTED);
[email protected]56dfb902013-01-03 23:17:551318 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1319 stream->ReadResponseHeaders(callback_.callback()));
1320
1321 // Now attempting to request a stream to the same origin should create
1322 // a new session.
1323
jri7046038f2015-10-22 00:29:261324 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591325 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561326 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501327 /*cert_verify_flags=*/0, host_port_pair_.host(),
1328 "GET", net_log_, callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551329
1330 EXPECT_EQ(OK, callback_.WaitForResult());
1331 stream = request2.ReleaseStream();
1332 stream.reset(); // Will reset stream 3.
1333
rch37de576c2015-05-17 20:28:171334 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1335 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1336 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1337 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]56dfb902013-01-03 23:17:551338}
1339
[email protected]1e960032013-12-20 19:00:201340TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
jri8c44d692015-10-23 23:53:411341 close_sessions_on_ip_change_ = true;
jri7046038f2015-10-22 00:29:261342 Initialize();
jri8c44d692015-10-23 23:53:411343
[email protected]f698a012013-05-06 20:18:591344 MockRead reads[] = {
[email protected]0edce6a2013-05-08 18:02:401345 MockRead(ASYNC, 0, 0) // EOF
[email protected]f698a012013-05-06 20:18:591346 };
[email protected]459a7402014-02-10 12:58:521347 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1348 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311349 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521350 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421351 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521352 writes.size());
[email protected]f698a012013-05-06 20:18:591353 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0edce6a2013-05-08 18:02:401354 socket_data.StopAfter(1);
[email protected]f698a012013-05-06 20:18:591355
[email protected]69dfd1b2013-06-04 22:20:121356 MockRead reads2[] = {
[email protected]25c31dc2013-06-05 17:56:041357 MockRead(ASYNC, 0, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121358 };
rtennetibe635732014-10-02 22:51:421359 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]f698a012013-05-06 20:18:591360 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]0edce6a2013-05-08 18:02:401361 socket_data2.StopAfter(1);
[email protected]f698a012013-05-06 20:18:591362
jri7046038f2015-10-22 00:29:261363 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591364 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561365 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501366 /*cert_verify_flags=*/0, host_port_pair_.host(),
1367 "GET", net_log_, callback_.callback()));
[email protected]f698a012013-05-06 20:18:591368
1369 EXPECT_EQ(OK, callback_.WaitForResult());
1370 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361371 HttpRequestInfo request_info;
1372 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1373 DEFAULT_PRIORITY,
1374 net_log_, CompletionCallback()));
[email protected]f698a012013-05-06 20:18:591375
1376 // Change the IP address and verify that stream saw the error.
jri8c44d692015-10-23 23:53:411377 NotifyIPAddressChanged();
[email protected]f698a012013-05-06 20:18:591378 EXPECT_EQ(ERR_NETWORK_CHANGED,
1379 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:261380 EXPECT_TRUE(factory_->require_confirmation());
[email protected]f698a012013-05-06 20:18:591381
1382 // Now attempting to request a stream to the same origin should create
1383 // a new session.
1384
jri7046038f2015-10-22 00:29:261385 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591386 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561387 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501388 /*cert_verify_flags=*/0, host_port_pair_.host(),
1389 "GET", net_log_, callback_.callback()));
[email protected]f698a012013-05-06 20:18:591390
1391 EXPECT_EQ(OK, callback_.WaitForResult());
1392 stream = request2.ReleaseStream();
1393 stream.reset(); // Will reset stream 3.
1394
rch37de576c2015-05-17 20:28:171395 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1396 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1397 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1398 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]f698a012013-05-06 20:18:591399}
1400
rch02d87792015-09-09 09:05:531401TEST_P(QuicStreamFactoryTest, OnSSLConfigChanged) {
jri7046038f2015-10-22 00:29:261402 Initialize();
rch02d87792015-09-09 09:05:531403 MockRead reads[] = {
1404 MockRead(ASYNC, 0, 0) // EOF
1405 };
1406 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1407 std::vector<MockWrite> writes;
1408 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
1409 DeterministicSocketData socket_data(reads, arraysize(reads),
1410 writes.empty() ? nullptr : &writes[0],
1411 writes.size());
1412 socket_factory_.AddSocketDataProvider(&socket_data);
1413 socket_data.StopAfter(1);
1414
1415 MockRead reads2[] = {
1416 MockRead(ASYNC, 0, 0) // EOF
1417 };
1418 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1419 socket_factory_.AddSocketDataProvider(&socket_data2);
1420 socket_data2.StopAfter(1);
1421
jri7046038f2015-10-22 00:29:261422 QuicStreamRequest request(factory_.get());
rch02d87792015-09-09 09:05:531423 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561424 request.Request(host_port_pair_, privacy_mode_,
rch02d87792015-09-09 09:05:531425 /*cert_verify_flags=*/0, host_port_pair_.host(),
1426 "GET", net_log_, callback_.callback()));
1427
1428 EXPECT_EQ(OK, callback_.WaitForResult());
1429 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1430 HttpRequestInfo request_info;
1431 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1432 net_log_, CompletionCallback()));
1433
jri7046038f2015-10-22 00:29:261434 factory_->OnSSLConfigChanged();
rch02d87792015-09-09 09:05:531435 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1436 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:261437 EXPECT_FALSE(factory_->require_confirmation());
rch02d87792015-09-09 09:05:531438
1439 // Now attempting to request a stream to the same origin should create
1440 // a new session.
1441
jri7046038f2015-10-22 00:29:261442 QuicStreamRequest request2(factory_.get());
rch02d87792015-09-09 09:05:531443 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561444 request2.Request(host_port_pair_, privacy_mode_,
rch02d87792015-09-09 09:05:531445 /*cert_verify_flags=*/0, host_port_pair_.host(),
1446 "GET", net_log_, callback_.callback()));
1447
1448 EXPECT_EQ(OK, callback_.WaitForResult());
1449 stream = request2.ReleaseStream();
1450 stream.reset(); // Will reset stream 3.
1451
1452 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1453 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1454 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1455 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1456}
1457
[email protected]1e960032013-12-20 19:00:201458TEST_P(QuicStreamFactoryTest, OnCertAdded) {
jri7046038f2015-10-22 00:29:261459 Initialize();
[email protected]d7d1e50b2013-11-25 22:08:091460 MockRead reads[] = {
1461 MockRead(ASYNC, 0, 0) // EOF
1462 };
[email protected]459a7402014-02-10 12:58:521463 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1464 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311465 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521466 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421467 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521468 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:091469 socket_factory_.AddSocketDataProvider(&socket_data);
1470 socket_data.StopAfter(1);
1471
1472 MockRead reads2[] = {
1473 MockRead(ASYNC, 0, 0) // EOF
1474 };
rtennetibe635732014-10-02 22:51:421475 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:091476 socket_factory_.AddSocketDataProvider(&socket_data2);
1477 socket_data2.StopAfter(1);
1478
jri7046038f2015-10-22 00:29:261479 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591480 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561481 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501482 /*cert_verify_flags=*/0, host_port_pair_.host(),
1483 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091484
1485 EXPECT_EQ(OK, callback_.WaitForResult());
1486 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1487 HttpRequestInfo request_info;
1488 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1489 DEFAULT_PRIORITY,
1490 net_log_, CompletionCallback()));
1491
1492 // Add a cert and verify that stream saw the event.
jri7046038f2015-10-22 00:29:261493 factory_->OnCertAdded(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:091494 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1495 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:261496 EXPECT_FALSE(factory_->require_confirmation());
[email protected]d7d1e50b2013-11-25 22:08:091497
1498 // Now attempting to request a stream to the same origin should create
1499 // a new session.
1500
jri7046038f2015-10-22 00:29:261501 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591502 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561503 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501504 /*cert_verify_flags=*/0, host_port_pair_.host(),
1505 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091506
1507 EXPECT_EQ(OK, callback_.WaitForResult());
1508 stream = request2.ReleaseStream();
1509 stream.reset(); // Will reset stream 3.
1510
rch37de576c2015-05-17 20:28:171511 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1512 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1513 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1514 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:091515}
1516
[email protected]1e960032013-12-20 19:00:201517TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
jri7046038f2015-10-22 00:29:261518 Initialize();
[email protected]d7d1e50b2013-11-25 22:08:091519 MockRead reads[] = {
1520 MockRead(ASYNC, 0, 0) // EOF
1521 };
[email protected]459a7402014-02-10 12:58:521522 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1523 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311524 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521525 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421526 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521527 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:091528 socket_factory_.AddSocketDataProvider(&socket_data);
1529 socket_data.StopAfter(1);
1530
1531 MockRead reads2[] = {
1532 MockRead(ASYNC, 0, 0) // EOF
1533 };
rtennetibe635732014-10-02 22:51:421534 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:091535 socket_factory_.AddSocketDataProvider(&socket_data2);
1536 socket_data2.StopAfter(1);
1537
jri7046038f2015-10-22 00:29:261538 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591539 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561540 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501541 /*cert_verify_flags=*/0, host_port_pair_.host(),
1542 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091543
1544 EXPECT_EQ(OK, callback_.WaitForResult());
1545 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1546 HttpRequestInfo request_info;
1547 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1548 DEFAULT_PRIORITY,
1549 net_log_, CompletionCallback()));
1550
1551 // Change the CA cert and verify that stream saw the event.
jri7046038f2015-10-22 00:29:261552 factory_->OnCACertChanged(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:091553 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1554 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:261555 EXPECT_FALSE(factory_->require_confirmation());
[email protected]d7d1e50b2013-11-25 22:08:091556
1557 // Now attempting to request a stream to the same origin should create
1558 // a new session.
1559
jri7046038f2015-10-22 00:29:261560 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591561 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561562 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501563 /*cert_verify_flags=*/0, host_port_pair_.host(),
1564 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091565
1566 EXPECT_EQ(OK, callback_.WaitForResult());
1567 stream = request2.ReleaseStream();
1568 stream.reset(); // Will reset stream 3.
1569
rch37de576c2015-05-17 20:28:171570 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1571 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1572 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1573 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:091574}
1575
[email protected]1e960032013-12-20 19:00:201576TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
jri7046038f2015-10-22 00:29:261577 Initialize();
[email protected]6e12d702013-11-13 00:17:171578 vector<string> cannoncial_suffixes;
1579 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1580 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]c49ff182013-09-28 08:33:261581
[email protected]6e12d702013-11-13 00:17:171582 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1583 string r1_host_name("r1");
1584 string r2_host_name("r2");
1585 r1_host_name.append(cannoncial_suffixes[i]);
1586 r2_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141587
[email protected]bf4ea2f2014-03-10 22:57:531588 HostPortPair host_port_pair1(r1_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121589 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:261590 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rch1fe2eeb2015-10-26 14:45:571591 QuicServerId server_id1(host_port_pair1, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171592 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371593 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171594 EXPECT_FALSE(cached1->proof_valid());
1595 EXPECT_TRUE(cached1->source_address_token().empty());
1596
1597 // Mutate the cached1 to have different data.
1598 // TODO(rtenneti): mutate other members of CachedState.
1599 cached1->set_source_address_token(r1_host_name);
1600 cached1->SetProofValid();
1601
[email protected]bf4ea2f2014-03-10 22:57:531602 HostPortPair host_port_pair2(r2_host_name, 80);
rch1fe2eeb2015-10-26 14:45:571603 QuicServerId server_id2(host_port_pair2, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171604 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371605 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171606 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
1607 EXPECT_TRUE(cached2->proof_valid());
1608 }
[email protected]b70fdb792013-10-25 19:04:141609}
1610
[email protected]1e960032013-12-20 19:00:201611TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
jri7046038f2015-10-22 00:29:261612 Initialize();
[email protected]6e12d702013-11-13 00:17:171613 vector<string> cannoncial_suffixes;
1614 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1615 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]b70fdb792013-10-25 19:04:141616
[email protected]6e12d702013-11-13 00:17:171617 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1618 string r3_host_name("r3");
1619 string r4_host_name("r4");
1620 r3_host_name.append(cannoncial_suffixes[i]);
1621 r4_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141622
[email protected]bf4ea2f2014-03-10 22:57:531623 HostPortPair host_port_pair1(r3_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121624 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:261625 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rch1fe2eeb2015-10-26 14:45:571626 QuicServerId server_id1(host_port_pair1, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171627 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371628 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171629 EXPECT_FALSE(cached1->proof_valid());
1630 EXPECT_TRUE(cached1->source_address_token().empty());
1631
1632 // Mutate the cached1 to have different data.
1633 // TODO(rtenneti): mutate other members of CachedState.
1634 cached1->set_source_address_token(r3_host_name);
1635 cached1->SetProofInvalid();
1636
[email protected]bf4ea2f2014-03-10 22:57:531637 HostPortPair host_port_pair2(r4_host_name, 80);
rch1fe2eeb2015-10-26 14:45:571638 QuicServerId server_id2(host_port_pair2, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171639 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371640 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171641 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
1642 EXPECT_TRUE(cached2->source_address_token().empty());
1643 EXPECT_FALSE(cached2->proof_valid());
1644 }
[email protected]c49ff182013-09-28 08:33:261645}
1646
rtenneti14abd312015-02-06 21:56:011647TEST_P(QuicStreamFactoryTest, RacingConnections) {
jri7046038f2015-10-22 00:29:261648 disable_disk_cache_ = false;
1649 Initialize();
1650
rtenneti14abd312015-02-06 21:56:011651 if (!GetParam().enable_connection_racing)
1652 return;
jri7046038f2015-10-22 00:29:261653
1654 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneticcab42b2015-10-09 06:38:161655
rtenneti14abd312015-02-06 21:56:011656 MockRead reads[] = {
1657 MockRead(ASYNC, OK, 0) // EOF
1658 };
1659 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1660 socket_factory_.AddSocketDataProvider(&socket_data);
1661 socket_data.StopAfter(1);
1662
1663 MockRead reads2[] = {
1664 MockRead(ASYNC, 0, 0) // EOF
1665 };
1666 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1667 socket_factory_.AddSocketDataProvider(&socket_data2);
1668 socket_data2.StopAfter(1);
1669
rtenneticcab42b2015-10-09 06:38:161670 const AlternativeService alternative_service1(QUIC, host_port_pair_.host(),
1671 host_port_pair_.port());
1672 AlternativeServiceInfoVector alternative_service_info_vector;
1673 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1674 alternative_service_info_vector.push_back(
1675 AlternativeServiceInfo(alternative_service1, 1.0, expiration));
1676
1677 http_server_properties_.SetAlternativeServices(
1678 host_port_pair_, alternative_service_info_vector);
1679
rtenneti14abd312015-02-06 21:56:011680 crypto_client_stream_factory_.set_handshake_mode(
1681 MockCryptoClientStream::ZERO_RTT);
1682 host_resolver_.set_synchronous_mode(true);
1683 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1684 "192.168.0.1", "");
1685
jri7046038f2015-10-22 00:29:261686 QuicStreamRequest request(factory_.get());
rch1fe2eeb2015-10-26 14:45:571687 QuicServerId server_id(host_port_pair_, privacy_mode_);
rtenneti14abd312015-02-06 21:56:011688 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561689 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501690 /*cert_verify_flags=*/0, host_port_pair_.host(),
1691 "GET", net_log_, callback_.callback()));
jri7046038f2015-10-22 00:29:261692 EXPECT_EQ(2u, QuicStreamFactoryPeer::GetNumberOfActiveJobs(factory_.get(),
1693 server_id));
rtenneti14abd312015-02-06 21:56:011694
1695 runner_->RunNextTask();
1696
1697 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1698 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:171699 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1700 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
jri7046038f2015-10-22 00:29:261701 EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumberOfActiveJobs(factory_.get(),
1702 server_id));
rtenneti14abd312015-02-06 21:56:011703}
1704
rtenneti34dffe752015-02-24 23:27:321705TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) {
jri7046038f2015-10-22 00:29:261706 disable_disk_cache_ = true;
1707 Initialize();
1708 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti34dffe752015-02-24 23:27:321709
1710 MockRead reads[] = {
1711 MockRead(ASYNC, OK, 0) // EOF
1712 };
1713 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1714 socket_factory_.AddSocketDataProvider(&socket_data);
1715 socket_data.StopAfter(1);
1716
1717 crypto_client_stream_factory_.set_handshake_mode(
1718 MockCryptoClientStream::ZERO_RTT);
1719 host_resolver_.set_synchronous_mode(true);
1720 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1721 "192.168.0.1", "");
1722
jri7046038f2015-10-22 00:29:261723 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561724 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501725 /*cert_verify_flags=*/0, host_port_pair_.host(),
1726 "GET", net_log_, callback_.callback()));
rtenneti34dffe752015-02-24 23:27:321727
1728 // If we are waiting for disk cache, we would have posted a task. Verify that
1729 // the CancelWaitForDataReady task hasn't been posted.
1730 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
1731
1732 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1733 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:171734 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1735 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti34dffe752015-02-24 23:27:321736}
1737
rtenneti85dcfac22015-03-27 20:22:191738TEST_P(QuicStreamFactoryTest, BadPacketLoss) {
jri7046038f2015-10-22 00:29:261739 disable_disk_cache_ = false;
1740 max_number_of_lossy_connections_ = 2;
1741 Initialize();
1742 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
1743
1744 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1745 host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:191746 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261747 factory_.get(), host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:191748
1749 MockRead reads[] = {
1750 MockRead(ASYNC, OK, 0) // EOF
1751 };
1752 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1753 socket_factory_.AddSocketDataProvider(&socket_data);
1754 socket_data.StopAfter(1);
1755
rtenneti97137a92015-06-18 06:00:311756 DeterministicSocketData socket_data2(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:191757 socket_factory_.AddSocketDataProvider(&socket_data2);
1758 socket_data2.StopAfter(1);
1759
rtenneti97137a92015-06-18 06:00:311760 DeterministicSocketData socket_data3(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:191761 socket_factory_.AddSocketDataProvider(&socket_data3);
1762 socket_data3.StopAfter(1);
1763
rtenneti97137a92015-06-18 06:00:311764 DeterministicSocketData socket_data4(nullptr, 0, nullptr, 0);
1765 socket_factory_.AddSocketDataProvider(&socket_data4);
1766 socket_data4.StopAfter(1);
1767
rtenneti85dcfac22015-03-27 20:22:191768 HostPortPair server2("mail.example.org", kDefaultServerPort);
1769 HostPortPair server3("docs.example.org", kDefaultServerPort);
rtenneti97137a92015-06-18 06:00:311770 HostPortPair server4("images.example.org", kDefaultServerPort);
rtenneti85dcfac22015-03-27 20:22:191771
1772 crypto_client_stream_factory_.set_handshake_mode(
1773 MockCryptoClientStream::ZERO_RTT);
1774 host_resolver_.set_synchronous_mode(true);
1775 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1776 "192.168.0.1", "");
1777 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1778 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
rtenneti97137a92015-06-18 06:00:311779 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
rtenneti85dcfac22015-03-27 20:22:191780
jri7046038f2015-10-22 00:29:261781 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561782 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501783 /*cert_verify_flags=*/0, host_port_pair_.host(),
1784 "GET", net_log_, callback_.callback()));
rtenneti85dcfac22015-03-27 20:22:191785
rchf114d982015-10-21 01:34:561786 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:261787 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
rtenneti85dcfac22015-03-27 20:22:191788
1789 DVLOG(1) << "Create 1st session and test packet loss";
1790
1791 // Set packet_loss_rate to a lower value than packet_loss_threshold.
1792 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261793 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/0.9f));
rtenneti41633b1f2015-04-05 18:19:531794 EXPECT_TRUE(session->connection()->connected());
rchf114d982015-10-21 01:34:561795 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:261796 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
1797 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1798 host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:191799 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261800 factory_.get(), host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:191801
1802 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:311803 // and that shouldn't close the session and it shouldn't disable QUIC.
1804 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261805 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:191806 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261807 factory_.get(), host_port_pair_.port()));
rtenneti97137a92015-06-18 06:00:311808 EXPECT_TRUE(session->connection()->connected());
jri7046038f2015-10-22 00:29:261809 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1810 host_port_pair_.port()));
rchf114d982015-10-21 01:34:561811 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:261812 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
rtenneti85dcfac22015-03-27 20:22:191813
1814 // Test N-in-a-row high packet loss connections.
1815
1816 DVLOG(1) << "Create 2nd session and test packet loss";
1817
1818 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:261819 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:561820 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:501821 /*cert_verify_flags=*/0, server2.host(), "GET",
1822 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:161823 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:261824 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
rtenneti85dcfac22015-03-27 20:22:191825
1826 // If there is no packet loss during handshake confirmation, number of lossy
1827 // connections for the port should be 0.
1828 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261829 factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:191830 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261831 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/0.9f));
rtenneti85dcfac22015-03-27 20:22:191832 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261833 factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:191834 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261835 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:191836
1837 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:311838 // and that shouldn't close the session and it shouldn't disable QUIC.
1839 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261840 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:191841 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261842 factory_.get(), server2.port()));
rtenneti97137a92015-06-18 06:00:311843 EXPECT_TRUE(session2->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:191844 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261845 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
1846 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server2));
rtenneti85dcfac22015-03-27 20:22:191847
1848 DVLOG(1) << "Create 3rd session which also has packet loss";
1849
1850 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:261851 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:561852 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
rtennetia75df622015-06-21 23:59:501853 /*cert_verify_flags=*/0, server3.host(), "GET",
1854 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:161855 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:261856 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
rtenneti85dcfac22015-03-27 20:22:191857
rtenneti97137a92015-06-18 06:00:311858 DVLOG(1) << "Create 4th session with packet loss and test IsQuicDisabled()";
1859 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:261860 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:561861 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
rtennetia75df622015-06-21 23:59:501862 /*cert_verify_flags=*/0, server4.host(), "GET",
1863 net_log_, callback4.callback()));
ckrasic4f9d88d2015-07-22 22:23:161864 QuicChromiumClientSession* session4 =
jri7046038f2015-10-22 00:29:261865 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server4);
rtenneti97137a92015-06-18 06:00:311866
rtenneti85dcfac22015-03-27 20:22:191867 // Set packet_loss_rate to higher value than packet_loss_threshold 2nd time in
1868 // a row and that should close the session and disable QUIC.
1869 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:261870 factory_->OnHandshakeConfirmed(session3, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:191871 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261872 factory_.get(), server3.port()));
rtenneti97137a92015-06-18 06:00:311873 EXPECT_FALSE(session3->connection()->connected());
jri7046038f2015-10-22 00:29:261874 EXPECT_TRUE(
1875 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server3.port()));
1876 EXPECT_FALSE(
1877 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server3));
bnccb7ff3c2015-05-21 20:51:551878 EXPECT_FALSE(HasActiveSession(server3));
rtenneti85dcfac22015-03-27 20:22:191879
rtenneti97137a92015-06-18 06:00:311880 // Set packet_loss_rate to higher value than packet_loss_threshold 3rd time in
1881 // a row and IsQuicDisabled() should close the session.
1882 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:261883 factory_->OnHandshakeConfirmed(session4, /*packet_loss_rate=*/1.0f));
rtenneti97137a92015-06-18 06:00:311884 EXPECT_EQ(3, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261885 factory_.get(), server4.port()));
rtenneti97137a92015-06-18 06:00:311886 EXPECT_FALSE(session4->connection()->connected());
jri7046038f2015-10-22 00:29:261887 EXPECT_TRUE(
1888 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server4.port()));
1889 EXPECT_FALSE(
1890 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server4));
rtenneti97137a92015-06-18 06:00:311891 EXPECT_FALSE(HasActiveSession(server4));
1892
rtenneti85dcfac22015-03-27 20:22:191893 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1894 EXPECT_TRUE(stream.get());
1895 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1896 EXPECT_TRUE(stream2.get());
1897 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
1898 EXPECT_TRUE(stream3.get());
rtenneti97137a92015-06-18 06:00:311899 scoped_ptr<QuicHttpStream> stream4 = request4.ReleaseStream();
1900 EXPECT_TRUE(stream4.get());
rch37de576c2015-05-17 20:28:171901 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1902 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1903 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1904 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1905 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
1906 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
rtenneti97137a92015-06-18 06:00:311907 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
1908 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
rtenneti85dcfac22015-03-27 20:22:191909}
1910
ckrasic1e53b642015-07-08 22:39:351911TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfTwo) {
jri7046038f2015-10-22 00:29:261912 disable_disk_cache_ = false;
1913 threshold_public_resets_post_handshake_ = 2;
1914 Initialize();
1915 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
1916
1917 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1918 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351919 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261920 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351921
1922 MockRead reads[] = {
1923 MockRead(ASYNC, OK, 0) // EOF
1924 };
1925 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1926 socket_factory_.AddSocketDataProvider(&socket_data);
1927 socket_data.StopAfter(1);
1928
1929 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
1930 socket_factory_.AddSocketDataProvider(&socket_data2);
1931 socket_data2.StopAfter(1);
1932
1933 HostPortPair server2("mail.example.org", kDefaultServerPort);
1934
1935 crypto_client_stream_factory_.set_handshake_mode(
1936 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1937 host_resolver_.set_synchronous_mode(true);
1938 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1939 "192.168.0.1", "");
1940 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1941
jri7046038f2015-10-22 00:29:261942 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561943 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:351944 /*cert_verify_flags=*/0, host_port_pair_.host(),
1945 "GET", net_log_, callback_.callback()));
1946
rchf114d982015-10-21 01:34:561947 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:261948 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:351949
1950 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
1951 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
1952 // Need to spin the loop now to ensure that
1953 // QuicStreamFactory::OnSessionClosed() runs.
1954 base::RunLoop run_loop;
1955 run_loop.RunUntilIdle();
1956
jri7046038f2015-10-22 00:29:261957 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
1958 factory_.get()));
1959 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1960 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351961
1962 // Test two-in-a-row public reset post handshakes..
1963 DVLOG(1) << "Create 2nd session and trigger public reset post handshake";
1964 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:261965 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:561966 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:351967 /*cert_verify_flags=*/0, server2.host(), "GET",
1968 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:161969 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:261970 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:351971
1972 session2->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
1973 // Need to spin the loop now to ensure that
1974 // QuicStreamFactory::OnSessionClosed() runs.
1975 base::RunLoop run_loop2;
1976 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:261977 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
1978 factory_.get()));
1979 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1980 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:161981 EXPECT_EQ(
1982 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
jri7046038f2015-10-22 00:29:261983 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351984
1985 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1986 EXPECT_TRUE(stream.get());
1987 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1988 EXPECT_TRUE(stream2.get());
1989 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1990 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1991 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1992 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1993}
1994
1995TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfTwo) {
jri7046038f2015-10-22 00:29:261996 disable_disk_cache_ = true;
1997 threshold_timeouts_with_open_streams_ = 2;
1998 Initialize();
1999
2000 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2001 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2002 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352003 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262004 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352005
2006 MockRead reads[] = {
2007 MockRead(ASYNC, OK, 0) // EOF
2008 };
2009 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
2010 socket_factory_.AddSocketDataProvider(&socket_data);
2011 socket_data.StopAfter(1);
2012
2013 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
2014 socket_factory_.AddSocketDataProvider(&socket_data2);
2015 socket_data2.StopAfter(1);
2016
2017 HostPortPair server2("mail.example.org", kDefaultServerPort);
2018
2019 crypto_client_stream_factory_.set_handshake_mode(
2020 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2021 host_resolver_.set_synchronous_mode(true);
2022 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2023 "192.168.0.1", "");
2024 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2025
jri7046038f2015-10-22 00:29:262026 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562027 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352028 /*cert_verify_flags=*/0, host_port_pair_.host(),
2029 "GET", net_log_, callback_.callback()));
2030
rchf114d982015-10-21 01:34:562031 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262032 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352033
2034 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2035 EXPECT_TRUE(stream.get());
2036 HttpRequestInfo request_info;
2037 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2038 net_log_, CompletionCallback()));
2039
2040 DVLOG(1)
2041 << "Created 1st session and initialized a stream. Now trigger timeout";
2042 session->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2043 // Need to spin the loop now to ensure that
2044 // QuicStreamFactory::OnSessionClosed() runs.
2045 base::RunLoop run_loop;
2046 run_loop.RunUntilIdle();
2047
jri7046038f2015-10-22 00:29:262048 EXPECT_EQ(
2049 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2050 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2051 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352052
2053 // Test two-in-a-row timeouts with open streams.
2054 DVLOG(1) << "Create 2nd session and timeout with open stream";
2055 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262056 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562057 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352058 /*cert_verify_flags=*/0, server2.host(), "GET",
2059 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162060 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262061 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352062
2063 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2064 EXPECT_TRUE(stream2.get());
2065 EXPECT_EQ(OK, stream2->InitializeStream(&request_info, DEFAULT_PRIORITY,
2066 net_log_, CompletionCallback()));
2067
2068 session2->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2069 // Need to spin the loop now to ensure that
2070 // QuicStreamFactory::OnSessionClosed() runs.
2071 base::RunLoop run_loop2;
2072 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262073 EXPECT_EQ(
2074 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2075 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2076 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:162077 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
jri7046038f2015-10-22 00:29:262078 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352079
2080 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2081 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2082 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2083 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2084}
2085
2086TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfThree) {
jri7046038f2015-10-22 00:29:262087 disable_disk_cache_ = true;
2088 threshold_public_resets_post_handshake_ = 2;
2089 Initialize();
2090
2091 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2092 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352093 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262094 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352095
2096 MockRead reads[] = {
2097 MockRead(ASYNC, OK, 0) // EOF
2098 };
2099 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
2100 socket_factory_.AddSocketDataProvider(&socket_data);
2101 socket_data.StopAfter(1);
2102
2103 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
2104 socket_factory_.AddSocketDataProvider(&socket_data2);
2105 socket_data2.StopAfter(1);
2106
2107 DeterministicSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
2108 socket_factory_.AddSocketDataProvider(&socket_data3);
2109 socket_data3.StopAfter(1);
2110
2111 HostPortPair server2("mail.example.org", kDefaultServerPort);
2112 HostPortPair server3("docs.example.org", kDefaultServerPort);
2113
2114 crypto_client_stream_factory_.set_handshake_mode(
2115 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2116 host_resolver_.set_synchronous_mode(true);
2117 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2118 "192.168.0.1", "");
2119 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2120 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
2121
2122 // Test first and third out of three public reset post handshakes.
jri7046038f2015-10-22 00:29:262123 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562124 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352125 /*cert_verify_flags=*/0, host_port_pair_.host(),
2126 "GET", net_log_, callback_.callback()));
2127
rchf114d982015-10-21 01:34:562128 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262129 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352130
2131 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
2132 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
2133 // Need to spin the loop now to ensure that
2134 // QuicStreamFactory::OnSessionClosed() runs.
2135 base::RunLoop run_loop;
2136 run_loop.RunUntilIdle();
2137
jri7046038f2015-10-22 00:29:262138 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2139 factory_.get()));
2140 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2141 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352142
2143 DVLOG(1) << "Create 2nd session without disable trigger";
2144 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262145 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562146 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352147 /*cert_verify_flags=*/0, server2.host(), "GET",
2148 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162149 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262150 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352151
2152 session2->connection()->CloseConnection(QUIC_NO_ERROR, false);
2153 // Need to spin the loop now to ensure that
2154 // QuicStreamFactory::OnSessionClosed() runs.
2155 base::RunLoop run_loop2;
2156 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262157 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2158 factory_.get()));
2159 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2160 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352161
2162 DVLOG(1) << "Create 3rd session with public reset post handshake,"
2163 << " will disable QUIC";
2164 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:262165 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:562166 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352167 /*cert_verify_flags=*/0, server3.host(), "GET",
2168 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:162169 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:262170 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:352171
2172 session3->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
2173 // Need to spin the loop now to ensure that
2174 // QuicStreamFactory::OnSessionClosed() runs.
2175 base::RunLoop run_loop3;
2176 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:262177 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2178 factory_.get()));
2179 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2180 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:162181 EXPECT_EQ(
2182 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
jri7046038f2015-10-22 00:29:262183 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352184
2185 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2186 EXPECT_TRUE(stream.get());
2187 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2188 EXPECT_TRUE(stream2.get());
2189 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2190 EXPECT_TRUE(stream3.get());
2191
2192 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2193 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2194 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2195 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2196 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2197 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
2198}
2199
2200TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfThree) {
jri7046038f2015-10-22 00:29:262201 disable_disk_cache_ = true;
2202 threshold_public_resets_post_handshake_ = 2;
2203 Initialize();
2204 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2205
2206 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2207 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352208 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262209 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352210
2211 MockRead reads[] = {
2212 MockRead(ASYNC, OK, 0) // EOF
2213 };
2214 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
2215 socket_factory_.AddSocketDataProvider(&socket_data);
2216 socket_data.StopAfter(1);
2217
2218 // DeterministicSocketData socket_data2(nullptr, 0, nullptr, 0);
2219 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
2220 socket_factory_.AddSocketDataProvider(&socket_data2);
2221 socket_data2.StopAfter(1);
2222
2223 DeterministicSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
2224 socket_factory_.AddSocketDataProvider(&socket_data3);
2225 socket_data3.StopAfter(1);
2226
2227 HostPortPair server2("mail.example.org", kDefaultServerPort);
2228 HostPortPair server3("docs.example.org", kDefaultServerPort);
2229
2230 crypto_client_stream_factory_.set_handshake_mode(
2231 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2232 host_resolver_.set_synchronous_mode(true);
2233 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2234 "192.168.0.1", "");
2235 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2236 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
2237
2238 // Test first and third out of three timeouts with open streams.
jri7046038f2015-10-22 00:29:262239 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562240 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352241 /*cert_verify_flags=*/0, host_port_pair_.host(),
2242 "GET", net_log_, callback_.callback()));
2243
rchf114d982015-10-21 01:34:562244 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262245 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352246
2247 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2248 EXPECT_TRUE(stream.get());
2249 HttpRequestInfo request_info;
2250 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2251 net_log_, CompletionCallback()));
2252
2253 DVLOG(1)
2254 << "Created 1st session and initialized a stream. Now trigger timeout";
2255 session->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2256 // Need to spin the loop now to ensure that
2257 // QuicStreamFactory::OnSessionClosed() runs.
2258 base::RunLoop run_loop;
2259 run_loop.RunUntilIdle();
2260
jri7046038f2015-10-22 00:29:262261 EXPECT_EQ(
2262 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2263 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2264 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352265
2266 // Test two-in-a-row timeouts with open streams.
2267 DVLOG(1) << "Create 2nd session without timeout";
2268 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262269 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562270 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352271 /*cert_verify_flags=*/0, server2.host(), "GET",
2272 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162273 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262274 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352275
2276 session2->connection()->CloseConnection(QUIC_NO_ERROR, true);
2277 // Need to spin the loop now to ensure that
2278 // QuicStreamFactory::OnSessionClosed() runs.
2279 base::RunLoop run_loop2;
2280 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262281 EXPECT_EQ(
2282 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2283 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2284 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352285
2286 DVLOG(1) << "Create 3rd session with timeout with open streams,"
2287 << " will disable QUIC";
2288
2289 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:262290 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:562291 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352292 /*cert_verify_flags=*/0, server3.host(), "GET",
2293 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:162294 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:262295 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:352296
2297 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2298 EXPECT_TRUE(stream3.get());
2299 EXPECT_EQ(OK, stream3->InitializeStream(&request_info, DEFAULT_PRIORITY,
2300 net_log_, CompletionCallback()));
2301 session3->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2302 // Need to spin the loop now to ensure that
2303 // QuicStreamFactory::OnSessionClosed() runs.
2304 base::RunLoop run_loop3;
2305 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:262306 EXPECT_EQ(
2307 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2308 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2309 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:162310 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
jri7046038f2015-10-22 00:29:262311 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352312
2313 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2314 EXPECT_TRUE(stream2.get());
2315 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2316 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2317 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2318 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2319 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2320 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
2321}
2322
2323TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfFour) {
jri7046038f2015-10-22 00:29:262324 disable_disk_cache_ = true;
2325 threshold_public_resets_post_handshake_ = 2;
2326 Initialize();
2327 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2328
2329 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2330 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352331 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262332 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352333
2334 MockRead reads[] = {
2335 MockRead(ASYNC, OK, 0) // EOF
2336 };
2337 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
2338 socket_factory_.AddSocketDataProvider(&socket_data);
2339 socket_data.StopAfter(1);
2340
2341 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
2342 socket_factory_.AddSocketDataProvider(&socket_data2);
2343 socket_data2.StopAfter(1);
2344
2345 DeterministicSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
2346 socket_factory_.AddSocketDataProvider(&socket_data3);
2347 socket_data3.StopAfter(1);
2348
2349 DeterministicSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
2350 socket_factory_.AddSocketDataProvider(&socket_data4);
2351 socket_data4.StopAfter(1);
2352
2353 HostPortPair server2("mail.example.org", kDefaultServerPort);
2354 HostPortPair server3("docs.example.org", kDefaultServerPort);
2355 HostPortPair server4("images.example.org", kDefaultServerPort);
2356
2357 crypto_client_stream_factory_.set_handshake_mode(
2358 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2359 host_resolver_.set_synchronous_mode(true);
2360 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2361 "192.168.0.1", "");
2362 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2363 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
2364 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
2365
2366 // Test first and fourth out of four public reset post handshakes.
jri7046038f2015-10-22 00:29:262367 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562368 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352369 /*cert_verify_flags=*/0, host_port_pair_.host(),
2370 "GET", net_log_, callback_.callback()));
2371
rchf114d982015-10-21 01:34:562372 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262373 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352374
2375 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
2376 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
2377 // Need to spin the loop now to ensure that
2378 // QuicStreamFactory::OnSessionClosed() runs.
2379 base::RunLoop run_loop;
2380 run_loop.RunUntilIdle();
2381
jri7046038f2015-10-22 00:29:262382 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2383 factory_.get()));
2384 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2385 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352386
2387 DVLOG(1) << "Create 2nd and 3rd sessions without disable trigger";
2388 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262389 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562390 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352391 /*cert_verify_flags=*/0, server2.host(), "GET",
2392 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162393 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262394 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352395
2396 session2->connection()->CloseConnection(QUIC_NO_ERROR, false);
2397 // Need to spin the loop now to ensure that
2398 // QuicStreamFactory::OnSessionClosed() runs.
2399 base::RunLoop run_loop2;
2400 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262401 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2402 factory_.get()));
2403 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2404 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352405
2406 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:262407 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:562408 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352409 /*cert_verify_flags=*/0, server3.host(), "GET",
2410 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:162411 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:262412 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:352413
2414 session3->connection()->CloseConnection(QUIC_NO_ERROR, false);
2415 // Need to spin the loop now to ensure that
2416 // QuicStreamFactory::OnSessionClosed() runs.
2417 base::RunLoop run_loop3;
2418 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:262419 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2420 factory_.get()));
2421 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2422 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352423
2424 DVLOG(1) << "Create 4rd session with public reset post handshake,"
2425 << " will not disable QUIC";
2426 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:262427 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:562428 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352429 /*cert_verify_flags=*/0, server4.host(), "GET",
2430 net_log_, callback4.callback()));
ckrasic4f9d88d2015-07-22 22:23:162431 QuicChromiumClientSession* session4 =
jri7046038f2015-10-22 00:29:262432 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server4);
ckrasic1e53b642015-07-08 22:39:352433
2434 session4->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
2435 // Need to spin the loop now to ensure that
2436 // QuicStreamFactory::OnSessionClosed() runs.
2437 base::RunLoop run_loop4;
2438 run_loop4.RunUntilIdle();
jri7046038f2015-10-22 00:29:262439 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2440 factory_.get()));
2441 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2442 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352443
2444 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2445 EXPECT_TRUE(stream.get());
2446 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2447 EXPECT_TRUE(stream2.get());
2448 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2449 EXPECT_TRUE(stream3.get());
2450 scoped_ptr<QuicHttpStream> stream4 = request4.ReleaseStream();
2451 EXPECT_TRUE(stream4.get());
2452
2453 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2454 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2455 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2456 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2457 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2458 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
2459 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
2460 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
2461}
2462
2463TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfFour) {
jri7046038f2015-10-22 00:29:262464 disable_disk_cache_ = true;
2465 threshold_public_resets_post_handshake_ = 2;
2466 Initialize();
2467 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2468
2469 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2470 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352471 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262472 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352473
2474 MockRead reads[] = {
2475 MockRead(ASYNC, OK, 0) // EOF
2476 };
2477 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
2478 socket_factory_.AddSocketDataProvider(&socket_data);
2479 socket_data.StopAfter(1);
2480
2481 // DeterministicSocketData socket_data2(nullptr, 0, nullptr, 0);
2482 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
2483 socket_factory_.AddSocketDataProvider(&socket_data2);
2484 socket_data2.StopAfter(1);
2485
2486 DeterministicSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
2487 socket_factory_.AddSocketDataProvider(&socket_data3);
2488 socket_data3.StopAfter(1);
2489
2490 DeterministicSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
2491 socket_factory_.AddSocketDataProvider(&socket_data4);
2492 socket_data4.StopAfter(1);
2493
2494 HostPortPair server2("mail.example.org", kDefaultServerPort);
2495 HostPortPair server3("docs.example.org", kDefaultServerPort);
2496 HostPortPair server4("images.example.org", kDefaultServerPort);
2497
2498 crypto_client_stream_factory_.set_handshake_mode(
2499 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2500 host_resolver_.set_synchronous_mode(true);
2501 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2502 "192.168.0.1", "");
2503 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2504 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
2505 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
2506
2507 // Test first and fourth out of three timeouts with open streams.
jri7046038f2015-10-22 00:29:262508 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562509 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352510 /*cert_verify_flags=*/0, host_port_pair_.host(),
2511 "GET", net_log_, callback_.callback()));
2512
rchf114d982015-10-21 01:34:562513 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262514 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352515
2516 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2517 EXPECT_TRUE(stream.get());
2518 HttpRequestInfo request_info;
2519 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2520 net_log_, CompletionCallback()));
2521
2522 DVLOG(1)
2523 << "Created 1st session and initialized a stream. Now trigger timeout";
2524 session->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2525 // Need to spin the loop now to ensure that
2526 // QuicStreamFactory::OnSessionClosed() runs.
2527 base::RunLoop run_loop;
2528 run_loop.RunUntilIdle();
2529
jri7046038f2015-10-22 00:29:262530 EXPECT_EQ(
2531 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2532 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2533 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352534
2535 DVLOG(1) << "Create 2nd and 3rd sessions without timeout";
2536 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262537 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562538 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352539 /*cert_verify_flags=*/0, server2.host(), "GET",
2540 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162541 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262542 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352543
2544 session2->connection()->CloseConnection(QUIC_NO_ERROR, true);
2545 // Need to spin the loop now to ensure that
2546 // QuicStreamFactory::OnSessionClosed() runs.
2547 base::RunLoop run_loop2;
2548 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262549 EXPECT_EQ(
2550 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2551 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2552 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352553
2554 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:262555 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:562556 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352557 /*cert_verify_flags=*/0, server3.host(), "GET",
2558 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:162559 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:262560 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:352561
2562 session3->connection()->CloseConnection(QUIC_NO_ERROR, true);
2563 // Need to spin the loop now to ensure that
2564 // QuicStreamFactory::OnSessionClosed() runs.
2565 base::RunLoop run_loop3;
2566 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:262567 EXPECT_EQ(
2568 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2569 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2570 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352571
2572 DVLOG(1) << "Create 4th session with timeout with open streams,"
2573 << " will not disable QUIC";
2574
2575 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:262576 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:562577 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352578 /*cert_verify_flags=*/0, server4.host(), "GET",
2579 net_log_, callback4.callback()));
ckrasic4f9d88d2015-07-22 22:23:162580 QuicChromiumClientSession* session4 =
jri7046038f2015-10-22 00:29:262581 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server4);
ckrasic1e53b642015-07-08 22:39:352582
2583 scoped_ptr<QuicHttpStream> stream4 = request4.ReleaseStream();
2584 EXPECT_TRUE(stream4.get());
2585 EXPECT_EQ(OK, stream4->InitializeStream(&request_info, DEFAULT_PRIORITY,
2586 net_log_, CompletionCallback()));
2587 session4->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2588 // Need to spin the loop now to ensure that
2589 // QuicStreamFactory::OnSessionClosed() runs.
2590 base::RunLoop run_loop4;
2591 run_loop4.RunUntilIdle();
jri7046038f2015-10-22 00:29:262592 EXPECT_EQ(
2593 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2594 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2595 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352596
2597 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2598 EXPECT_TRUE(stream2.get());
2599 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2600 EXPECT_TRUE(stream3.get());
2601 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2602 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2603 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2604 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2605 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2606 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
2607 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
2608 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
2609}
2610
rtenneti8332ba52015-09-17 19:33:412611TEST_P(QuicStreamFactoryTest, EnableDelayTcpRace) {
jri7046038f2015-10-22 00:29:262612 Initialize();
2613 bool delay_tcp_race = QuicStreamFactoryPeer::GetDelayTcpRace(factory_.get());
2614 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), false);
rtenneti8332ba52015-09-17 19:33:412615 MockRead reads[] = {
2616 MockRead(ASYNC, OK, 0),
2617 };
2618 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
2619 socket_factory_.AddSocketDataProvider(&socket_data);
2620 socket_data.StopAfter(1);
2621
rtenneti8332ba52015-09-17 19:33:412622 ServerNetworkStats stats1;
2623 stats1.srtt = base::TimeDelta::FromMicroseconds(10);
rtenneticcab42b2015-10-09 06:38:162624 http_server_properties_.SetServerNetworkStats(host_port_pair_, stats1);
rtenneti8332ba52015-09-17 19:33:412625
2626 crypto_client_stream_factory_.set_handshake_mode(
2627 MockCryptoClientStream::ZERO_RTT);
2628 host_resolver_.set_synchronous_mode(true);
2629 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2630 "192.168.0.1", "");
2631
jri7046038f2015-10-22 00:29:262632 QuicStreamRequest request(factory_.get());
rtenneti8332ba52015-09-17 19:33:412633 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562634 request.Request(host_port_pair_, privacy_mode_,
rtenneti8332ba52015-09-17 19:33:412635 /*cert_verify_flags=*/0, host_port_pair_.host(),
2636 "POST", net_log_, callback_.callback()));
2637
2638 // If we don't delay TCP connection, then time delay should be 0.
jri7046038f2015-10-22 00:29:262639 EXPECT_FALSE(factory_->delay_tcp_race());
rtenneti8332ba52015-09-17 19:33:412640 EXPECT_EQ(base::TimeDelta(), request.GetTimeDelayForWaitingJob());
2641
2642 // Enable |delay_tcp_race_| param and verify delay is one RTT and that
2643 // server supports QUIC.
jri7046038f2015-10-22 00:29:262644 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), true);
2645 EXPECT_TRUE(factory_->delay_tcp_race());
rtenneti8332ba52015-09-17 19:33:412646 EXPECT_EQ(base::TimeDelta::FromMicroseconds(15),
2647 request.GetTimeDelayForWaitingJob());
2648
2649 // Confirm the handshake and verify that the stream is created.
2650 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
2651 QuicSession::HANDSHAKE_CONFIRMED);
2652
2653 EXPECT_EQ(OK, callback_.WaitForResult());
2654
2655 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2656 EXPECT_TRUE(stream.get());
2657 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2658 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
jri7046038f2015-10-22 00:29:262659 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), delay_tcp_race);
rtenneti8332ba52015-09-17 19:33:412660}
2661
rtenneticd2aaa15b2015-10-10 20:29:332662TEST_P(QuicStreamFactoryTest, MaybeInitialize) {
jri7046038f2015-10-22 00:29:262663 store_server_configs_in_properties_ = true;
rtenneti41c09992015-11-30 18:24:012664 idle_connection_timeout_seconds_ = 500;
jri7046038f2015-10-22 00:29:262665 Initialize();
rtenneti41c09992015-11-30 18:24:012666 const QuicConfig* config = QuicStreamFactoryPeer::GetConfig(factory_.get());
2667 EXPECT_EQ(500, config->IdleConnectionStateLifetime().ToSeconds());
2668
jri7046038f2015-10-22 00:29:262669 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti8a80a6dc2015-09-21 19:51:132670
rtenneti8a80a6dc2015-09-21 19:51:132671 const AlternativeService alternative_service1(QUIC, host_port_pair_.host(),
2672 host_port_pair_.port());
2673 AlternativeServiceInfoVector alternative_service_info_vector;
2674 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
2675 alternative_service_info_vector.push_back(
2676 AlternativeServiceInfo(alternative_service1, 1.0, expiration));
2677
rtenneticcab42b2015-10-09 06:38:162678 http_server_properties_.SetAlternativeServices(
rtenneti8a80a6dc2015-09-21 19:51:132679 host_port_pair_, alternative_service_info_vector);
2680
rch1fe2eeb2015-10-26 14:45:572681 QuicServerId quic_server_id("www.google.com", 80, PRIVACY_MODE_DISABLED);
rtenneticd2aaa15b2015-10-10 20:29:332682 QuicServerInfoFactory* quic_server_info_factory =
2683 new PropertiesBasedQuicServerInfoFactory(
2684 http_server_properties_.GetWeakPtr());
jri7046038f2015-10-22 00:29:262685 factory_->set_quic_server_info_factory(quic_server_info_factory);
rtenneticd2aaa15b2015-10-10 20:29:332686
2687 scoped_ptr<QuicServerInfo> quic_server_info(
2688 quic_server_info_factory->GetForServer(quic_server_id));
2689
2690 // Update quic_server_info's server_config and persist it.
2691 QuicServerInfo::State* state = quic_server_info->mutable_state();
2692 // Minimum SCFG that passes config validation checks.
2693 const char scfg[] = {// SCFG
2694 0x53, 0x43, 0x46, 0x47,
2695 // num entries
2696 0x01, 0x00,
2697 // padding
2698 0x00, 0x00,
2699 // EXPY
2700 0x45, 0x58, 0x50, 0x59,
2701 // EXPY end offset
2702 0x08, 0x00, 0x00, 0x00,
2703 // Value
2704 '1', '2', '3', '4', '5', '6', '7', '8'};
2705
2706 // Create temporary strings becasue Persist() clears string data in |state|.
2707 string server_config(reinterpret_cast<const char*>(&scfg), sizeof(scfg));
2708 string source_address_token("test_source_address_token");
2709 string signature("test_signature");
2710 string test_cert("test_cert");
2711 vector<string> certs;
2712 certs.push_back(test_cert);
2713 state->server_config = server_config;
2714 state->source_address_token = source_address_token;
2715 state->server_config_sig = signature;
2716 state->certs = certs;
2717
2718 quic_server_info->Persist();
2719
jri7046038f2015-10-22 00:29:262720 QuicStreamFactoryPeer::MaybeInitialize(factory_.get());
2721 EXPECT_TRUE(QuicStreamFactoryPeer::HasInitializedData(factory_.get()));
2722 EXPECT_TRUE(QuicStreamFactoryPeer::SupportsQuicAtStartUp(factory_.get(),
2723 host_port_pair_));
2724 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(factory_.get(),
rtenneticd2aaa15b2015-10-10 20:29:332725 quic_server_id));
2726 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:262727 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rtenneticd2aaa15b2015-10-10 20:29:332728 QuicCryptoClientConfig::CachedState* cached =
2729 crypto_config->LookupOrCreate(quic_server_id);
2730 EXPECT_FALSE(cached->server_config().empty());
2731 EXPECT_TRUE(cached->GetServerConfig());
2732 EXPECT_EQ(server_config, cached->server_config());
2733 EXPECT_EQ(source_address_token, cached->source_address_token());
2734 EXPECT_EQ(signature, cached->signature());
2735 ASSERT_EQ(1U, cached->certs().size());
2736 EXPECT_EQ(test_cert, cached->certs()[0]);
rtenneti8a80a6dc2015-09-21 19:51:132737}
2738
rtenneti1cd3b162015-09-29 02:58:282739TEST_P(QuicStreamFactoryTest, YieldAfterPackets) {
jri7046038f2015-10-22 00:29:262740 Initialize();
2741 QuicStreamFactoryPeer::SetYieldAfterPackets(factory_.get(), 0);
rtenneti1cd3b162015-09-29 02:58:282742
2743 scoped_ptr<QuicEncryptedPacket> close_packet(
2744 ConstructConnectionClosePacket(0));
rtenneticd2aaa15b2015-10-10 20:29:332745 vector<MockRead> reads;
rtenneti1cd3b162015-09-29 02:58:282746 reads.push_back(
2747 MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0));
2748 reads.push_back(MockRead(ASYNC, OK, 1));
2749 DeterministicSocketData socket_data(&reads[0], reads.size(), nullptr, 0);
2750 socket_factory_.AddSocketDataProvider(&socket_data);
2751 socket_data.StopAfter(1);
2752
2753 crypto_client_stream_factory_.set_handshake_mode(
2754 MockCryptoClientStream::ZERO_RTT);
2755 host_resolver_.set_synchronous_mode(true);
2756 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2757 "192.168.0.1", "");
2758
2759 // Set up the TaskObserver to verify QuicPacketReader::StartReading posts a
2760 // task.
2761 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
2762 SpdySessionTestTaskObserver observer("quic_packet_reader.cc", "StartReading");
2763
jri7046038f2015-10-22 00:29:262764 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562765 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtenneti1cd3b162015-09-29 02:58:282766 /*cert_verify_flags=*/0, host_port_pair_.host(),
2767 "GET", net_log_, callback_.callback()));
2768
2769 // Call run_loop so that QuicPacketReader::OnReadComplete() gets called.
2770 base::RunLoop run_loop;
2771 run_loop.RunUntilIdle();
2772
2773 // Verify task that the observer's executed_count is 1, which indicates
2774 // QuicPacketReader::StartReading() has posted only one task and yielded the
2775 // read.
2776 EXPECT_EQ(1u, observer.executed_count());
2777
2778 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2779 EXPECT_TRUE(stream.get());
2780 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2781 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2782}
2783
2784TEST_P(QuicStreamFactoryTest, YieldAfterDuration) {
jri7046038f2015-10-22 00:29:262785 Initialize();
rtenneti1cd3b162015-09-29 02:58:282786 QuicStreamFactoryPeer::SetYieldAfterDuration(
jri7046038f2015-10-22 00:29:262787 factory_.get(), QuicTime::Delta::FromMilliseconds(-1));
rtenneti1cd3b162015-09-29 02:58:282788
2789 scoped_ptr<QuicEncryptedPacket> close_packet(
2790 ConstructConnectionClosePacket(0));
rtenneticd2aaa15b2015-10-10 20:29:332791 vector<MockRead> reads;
rtenneti1cd3b162015-09-29 02:58:282792 reads.push_back(
2793 MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0));
2794 reads.push_back(MockRead(ASYNC, OK, 1));
2795 DeterministicSocketData socket_data(&reads[0], reads.size(), nullptr, 0);
2796 socket_factory_.AddSocketDataProvider(&socket_data);
2797 socket_data.StopAfter(1);
2798
2799 crypto_client_stream_factory_.set_handshake_mode(
2800 MockCryptoClientStream::ZERO_RTT);
2801 host_resolver_.set_synchronous_mode(true);
2802 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2803 "192.168.0.1", "");
2804
2805 // Set up the TaskObserver to verify QuicPacketReader::StartReading posts a
2806 // task.
2807 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
2808 SpdySessionTestTaskObserver observer("quic_packet_reader.cc", "StartReading");
2809
jri7046038f2015-10-22 00:29:262810 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562811 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtenneti1cd3b162015-09-29 02:58:282812 /*cert_verify_flags=*/0, host_port_pair_.host(),
2813 "GET", net_log_, callback_.callback()));
2814
2815 // Call run_loop so that QuicPacketReader::OnReadComplete() gets called.
2816 base::RunLoop run_loop;
2817 run_loop.RunUntilIdle();
2818
2819 // Verify task that the observer's executed_count is 1, which indicates
2820 // QuicPacketReader::StartReading() has posted only one task and yielded the
2821 // read.
2822 EXPECT_EQ(1u, observer.executed_count());
2823
2824 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2825 EXPECT_TRUE(stream.get());
2826 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2827 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2828}
2829
[email protected]e13201d82012-12-12 05:00:322830} // namespace test
[email protected]e13201d82012-12-12 05:00:322831} // namespace net