blob: dfbcc0f4af5ce347ba0c0ba4b1df3d6be1b4fb70 [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"
[email protected]f2cb3cf2013-03-21 01:40:5312#include "net/dns/mock_host_resolver.h"
[email protected]e13201d82012-12-12 05:00:3213#include "net/http/http_response_headers.h"
14#include "net/http/http_response_info.h"
rtenneti8332ba52015-09-17 19:33:4115#include "net/http/http_server_properties_impl.h"
[email protected]e13201d82012-12-12 05:00:3216#include "net/http/http_util.h"
[email protected]080b77932014-08-04 01:22:4617#include "net/http/transport_security_state.h"
[email protected]c49ff182013-09-28 08:33:2618#include "net/quic/crypto/crypto_handshake.h"
[email protected]b694e48c2014-03-18 17:10:1319#include "net/quic/crypto/proof_verifier_chromium.h"
rtenneticd2aaa15b2015-10-10 20:29:3320#include "net/quic/crypto/properties_based_quic_server_info.h"
21#include "net/quic/crypto/quic_crypto_client_config.h"
[email protected]4df69842013-02-27 06:32:1622#include "net/quic/crypto/quic_decrypter.h"
23#include "net/quic/crypto/quic_encrypter.h"
rtenneti38f5cd52014-10-28 20:28:2824#include "net/quic/crypto/quic_server_info.h"
[email protected]e13201d82012-12-12 05:00:3225#include "net/quic/quic_http_stream.h"
[email protected]257f24f2014-04-01 09:15:3726#include "net/quic/quic_server_id.h"
[email protected]e13201d82012-12-12 05:00:3227#include "net/quic/test_tools/mock_clock.h"
[email protected]e8ff26842013-03-22 21:02:0528#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
[email protected]9558c5d32012-12-22 00:08:1429#include "net/quic/test_tools/mock_random.h"
[email protected]1e960032013-12-20 19:00:2030#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]e13201d82012-12-12 05:00:3231#include "net/quic/test_tools/quic_test_utils.h"
rtenneti38f5cd52014-10-28 20:28:2832#include "net/quic/test_tools/test_task_runner.h"
[email protected]e13201d82012-12-12 05:00:3233#include "net/socket/socket_test_util.h"
rtenneti1cd3b162015-09-29 02:58:2834#include "net/spdy/spdy_session_test_util.h"
[email protected]5db452202014-08-19 05:22:1535#include "net/spdy/spdy_test_utils.h"
[email protected]6b8a3c742014-07-25 00:25:3536#include "net/ssl/channel_id_service.h"
37#include "net/ssl/default_channel_id_store.h"
[email protected]eed749f92013-12-23 18:57:3838#include "net/test/cert_test_util.h"
[email protected]e13201d82012-12-12 05:00:3239#include "testing/gtest/include/gtest/gtest.h"
40
[email protected]6e12d702013-11-13 00:17:1741using base::StringPiece;
rtenneti14abd312015-02-06 21:56:0142using std::ostream;
[email protected]6e12d702013-11-13 00:17:1743using std::string;
44using std::vector;
45
[email protected]e13201d82012-12-12 05:00:3246namespace net {
[email protected]e13201d82012-12-12 05:00:3247namespace test {
48
[email protected]3c772402013-12-18 21:38:1149namespace {
50const char kDefaultServerHostName[] = "www.google.com";
51const int kDefaultServerPort = 443;
rtenneti14abd312015-02-06 21:56:0152
53// Run all tests with all the combinations of versions and
54// enable_connection_racing.
55struct TestParams {
56 TestParams(const QuicVersion version, bool enable_connection_racing)
57 : version(version), enable_connection_racing(enable_connection_racing) {}
58
59 friend ostream& operator<<(ostream& os, const TestParams& p) {
60 os << "{ version: " << QuicVersionToString(p.version);
61 os << " enable_connection_racing: " << p.enable_connection_racing << " }";
62 return os;
63 }
64
65 QuicVersion version;
66 bool enable_connection_racing;
67};
68
69// Constructs various test permutations.
70vector<TestParams> GetTestParams() {
71 vector<TestParams> params;
72 QuicVersionVector all_supported_versions = QuicSupportedVersions();
73 for (const QuicVersion version : all_supported_versions) {
74 params.push_back(TestParams(version, false));
75 params.push_back(TestParams(version, true));
76 }
77 return params;
78}
79
[email protected]3c772402013-12-18 21:38:1180} // namespace anonymous
81
[email protected]c49ff182013-09-28 08:33:2682class QuicStreamFactoryPeer {
83 public:
[email protected]59c0bbd2014-03-22 04:08:1284 static QuicCryptoClientConfig* GetCryptoConfig(QuicStreamFactory* factory) {
85 return &factory->crypto_config_;
[email protected]c49ff182013-09-28 08:33:2686 }
[email protected]4d283b32013-10-17 12:57:2787
88 static bool HasActiveSession(QuicStreamFactory* factory,
rchf114d982015-10-21 01:34:5689 const HostPortPair& host_port_pair) {
rch1fe2eeb2015-10-26 14:45:5790 QuicServerId server_id(host_port_pair, PRIVACY_MODE_DISABLED);
[email protected]257f24f2014-04-01 09:15:3791 return factory->HasActiveSession(server_id);
[email protected]4d283b32013-10-17 12:57:2792 }
93
ckrasic4f9d88d2015-07-22 22:23:1694 static QuicChromiumClientSession* GetActiveSession(
[email protected]4d283b32013-10-17 12:57:2795 QuicStreamFactory* factory,
rchf114d982015-10-21 01:34:5696 const HostPortPair& host_port_pair) {
rch1fe2eeb2015-10-26 14:45:5797 QuicServerId server_id(host_port_pair, PRIVACY_MODE_DISABLED);
[email protected]257f24f2014-04-01 09:15:3798 DCHECK(factory->HasActiveSession(server_id));
99 return factory->active_sessions_[server_id];
[email protected]df157d9d2014-03-10 07:27:27100 }
101
bnccb7ff3c2015-05-21 20:51:55102 static scoped_ptr<QuicHttpStream> CreateFromSession(
[email protected]df157d9d2014-03-10 07:27:27103 QuicStreamFactory* factory,
ckrasic4f9d88d2015-07-22 22:23:16104 QuicChromiumClientSession* session) {
bnccb7ff3c2015-05-21 20:51:55105 return factory->CreateFromSession(session);
[email protected]4d283b32013-10-17 12:57:27106 }
107
108 static bool IsLiveSession(QuicStreamFactory* factory,
ckrasic4f9d88d2015-07-22 22:23:16109 QuicChromiumClientSession* session) {
[email protected]4d590c9c2014-05-02 05:14:33110 for (QuicStreamFactory::SessionIdMap::iterator it =
[email protected]4d283b32013-10-17 12:57:27111 factory->all_sessions_.begin();
112 it != factory->all_sessions_.end(); ++it) {
[email protected]4d590c9c2014-05-02 05:14:33113 if (it->first == session)
[email protected]4d283b32013-10-17 12:57:27114 return true;
115 }
116 return false;
117 }
jri584002d12014-09-09 00:51:28118
rtenneti38f5cd52014-10-28 20:28:28119 static void SetTaskRunner(QuicStreamFactory* factory,
120 base::TaskRunner* task_runner) {
121 factory->task_runner_ = task_runner;
122 }
123
rtenneti85dcfac22015-03-27 20:22:19124 static int GetNumberOfLossyConnections(QuicStreamFactory* factory,
125 uint16 port) {
126 return factory->number_of_lossy_connections_[port];
127 }
128
129 static bool IsQuicDisabled(QuicStreamFactory* factory, uint16 port) {
130 return factory->IsQuicDisabled(port);
131 }
132
rtenneti8332ba52015-09-17 19:33:41133 static bool GetDelayTcpRace(QuicStreamFactory* factory) {
134 return factory->delay_tcp_race_;
135 }
136
137 static void SetDelayTcpRace(QuicStreamFactory* factory, bool delay_tcp_race) {
138 factory->delay_tcp_race_ = delay_tcp_race;
139 }
140
rtenneti1cd3b162015-09-29 02:58:28141 static void SetYieldAfterPackets(QuicStreamFactory* factory,
142 int yield_after_packets) {
143 factory->yield_after_packets_ = yield_after_packets;
144 }
145
146 static void SetYieldAfterDuration(QuicStreamFactory* factory,
147 QuicTime::Delta yield_after_duration) {
148 factory->yield_after_duration_ = yield_after_duration;
149 }
150
rtenneti14abd312015-02-06 21:56:01151 static size_t GetNumberOfActiveJobs(QuicStreamFactory* factory,
152 const QuicServerId& server_id) {
153 return (factory->active_jobs_[server_id]).size();
154 }
ckrasic1e53b642015-07-08 22:39:35155
ckrasic1e53b642015-07-08 22:39:35156 static int GetNumTimeoutsWithOpenStreams(QuicStreamFactory* factory) {
157 return factory->num_timeouts_with_open_streams_;
158 }
159
ckrasic1e53b642015-07-08 22:39:35160 static int GetNumPublicResetsPostHandshake(QuicStreamFactory* factory) {
161 return factory->num_public_resets_post_handshake_;
162 }
rtenneti8a80a6dc2015-09-21 19:51:13163
rtenneticd2aaa15b2015-10-10 20:29:33164 static void MaybeInitialize(QuicStreamFactory* factory) {
165 factory->MaybeInitialize();
rtenneti8a80a6dc2015-09-21 19:51:13166 }
167
rtenneticd2aaa15b2015-10-10 20:29:33168 static bool HasInitializedData(QuicStreamFactory* factory) {
169 return factory->has_initialized_data_;
rtenneti8a80a6dc2015-09-21 19:51:13170 }
171
172 static bool SupportsQuicAtStartUp(QuicStreamFactory* factory,
173 HostPortPair host_port_pair) {
174 return ContainsKey(factory->quic_supported_servers_at_startup_,
175 host_port_pair);
176 }
rtenneticd2aaa15b2015-10-10 20:29:33177
178 static bool CryptoConfigCacheIsEmpty(QuicStreamFactory* factory,
179 QuicServerId& quic_server_id) {
180 return factory->CryptoConfigCacheIsEmpty(quic_server_id);
181 }
[email protected]c49ff182013-09-28 08:33:26182};
183
rtenneti38f5cd52014-10-28 20:28:28184class MockQuicServerInfo : public QuicServerInfo {
185 public:
186 MockQuicServerInfo(const QuicServerId& server_id)
187 : QuicServerInfo(server_id) {}
dcheng2339883c2014-12-23 00:23:05188 ~MockQuicServerInfo() override {}
rtenneti38f5cd52014-10-28 20:28:28189
dcheng2339883c2014-12-23 00:23:05190 void Start() override {}
rtenneti38f5cd52014-10-28 20:28:28191
dcheng2339883c2014-12-23 00:23:05192 int WaitForDataReady(const CompletionCallback& callback) override {
rtenneti38f5cd52014-10-28 20:28:28193 return ERR_IO_PENDING;
194 }
195
rtenneti170f36a2015-02-10 19:13:45196 void ResetWaitForDataReadyCallback() override {}
197
dcheng2339883c2014-12-23 00:23:05198 void CancelWaitForDataReadyCallback() override {}
rtenneti38f5cd52014-10-28 20:28:28199
dcheng2339883c2014-12-23 00:23:05200 bool IsDataReady() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28201
dcheng2339883c2014-12-23 00:23:05202 bool IsReadyToPersist() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28203
dcheng2339883c2014-12-23 00:23:05204 void Persist() override {}
rtennetif0b832b2014-11-07 02:32:30205
dcheng2339883c2014-12-23 00:23:05206 void OnExternalCacheHit() override {}
rtenneti38f5cd52014-10-28 20:28:28207};
208
209class MockQuicServerInfoFactory : public QuicServerInfoFactory {
210 public:
211 MockQuicServerInfoFactory() {}
dcheng2339883c2014-12-23 00:23:05212 ~MockQuicServerInfoFactory() override {}
rtenneti38f5cd52014-10-28 20:28:28213
dcheng2339883c2014-12-23 00:23:05214 QuicServerInfo* GetForServer(const QuicServerId& server_id) override {
rtenneti38f5cd52014-10-28 20:28:28215 return new MockQuicServerInfo(server_id);
216 }
217};
218
rtenneti14abd312015-02-06 21:56:01219class QuicStreamFactoryTest : public ::testing::TestWithParam<TestParams> {
[email protected]e13201d82012-12-12 05:00:32220 protected:
221 QuicStreamFactoryTest()
[email protected]457d6952013-12-13 09:24:58222 : random_generator_(0),
223 clock_(new MockClock()),
rtenneti38f5cd52014-10-28 20:28:28224 runner_(new TestTaskRunner(clock_)),
bncb07c05532015-05-14 19:07:20225 maker_(GetParam().version, 0, clock_, kDefaultServerHostName),
[email protected]59c0bbd2014-03-22 04:08:12226 cert_verifier_(CertVerifier::CreateDefault()),
jri2b966f22014-09-02 22:25:36227 channel_id_service_(
rtennetibe635732014-10-02 22:51:42228 new ChannelIDService(new DefaultChannelIDStore(nullptr),
skyostil4891b25b2015-06-11 11:43:45229 base::ThreadTaskRunnerHandle::Get())),
jri7046038f2015-10-22 00:29:26230 factory_(nullptr),
[email protected]bf4ea2f2014-03-10 22:57:53231 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
jri7046038f2015-10-22 00:29:26232 privacy_mode_(PRIVACY_MODE_DISABLED),
233 enable_port_selection_(true),
234 always_require_handshake_confirmation_(false),
235 disable_connection_pooling_(false),
236 load_server_info_timeout_srtt_multiplier_(0.0f),
237 enable_connection_racing_(true),
238 enable_non_blocking_io_(true),
239 disable_disk_cache_(false),
240 prefer_aes_(false),
241 max_number_of_lossy_connections_(0),
242 packet_loss_threshold_(1.0f),
243 max_disabled_reasons_(3),
244 threshold_timeouts_with_open_streams_(2),
245 threshold_public_resets_post_handshake_(2),
246 receive_buffer_size_(0),
247 delay_tcp_race_(false),
jri8c44d692015-10-23 23:53:41248 store_server_configs_in_properties_(false),
249 close_sessions_on_ip_change_(false) {
[email protected]ca4e0d92014-08-22 16:33:22250 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
jri7046038f2015-10-22 00:29:26251 }
252
253 void Initialize() {
254 factory_.reset(new QuicStreamFactory(
255 &host_resolver_, &socket_factory_, http_server_properties_.GetWeakPtr(),
256 cert_verifier_.get(), nullptr, channel_id_service_.get(),
257 &transport_security_state_,
258 /*SocketPerformanceWatcherFactory*/ nullptr,
259 &crypto_client_stream_factory_, &random_generator_, clock_,
260 kDefaultMaxPacketSize, std::string(),
261 SupportedVersions(GetParam().version), enable_port_selection_,
262 always_require_handshake_confirmation_, disable_connection_pooling_,
263 load_server_info_timeout_srtt_multiplier_, enable_connection_racing_,
264 enable_non_blocking_io_, disable_disk_cache_, prefer_aes_,
265 max_number_of_lossy_connections_, packet_loss_threshold_,
266 max_disabled_reasons_, threshold_timeouts_with_open_streams_,
267 threshold_public_resets_post_handshake_, receive_buffer_size_,
jri8c44d692015-10-23 23:53:41268 delay_tcp_race_, store_server_configs_in_properties_,
269 close_sessions_on_ip_change_, QuicTagVector()));
jri7046038f2015-10-22 00:29:26270 factory_->set_require_confirmation(false);
271 factory_->set_quic_server_info_factory(new MockQuicServerInfoFactory());
[email protected]e13201d82012-12-12 05:00:32272 }
273
bnccb7ff3c2015-05-21 20:51:55274 bool HasActiveSession(const HostPortPair& host_port_pair) {
jri7046038f2015-10-22 00:29:26275 return QuicStreamFactoryPeer::HasActiveSession(factory_.get(),
276 host_port_pair);
bnccb7ff3c2015-05-21 20:51:55277 }
278
279 scoped_ptr<QuicHttpStream> CreateFromSession(
280 const HostPortPair& host_port_pair) {
ckrasic4f9d88d2015-07-22 22:23:16281 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:26282 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair);
283 return QuicStreamFactoryPeer::CreateFromSession(factory_.get(), session);
[email protected]df157d9d2014-03-10 07:27:27284 }
[email protected]e13201d82012-12-12 05:00:32285
[email protected]bf4ea2f2014-03-10 22:57:53286 int GetSourcePortForNewSession(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10287 return GetSourcePortForNewSessionInner(destination, false);
288 }
289
290 int GetSourcePortForNewSessionAndGoAway(
[email protected]bf4ea2f2014-03-10 22:57:53291 const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10292 return GetSourcePortForNewSessionInner(destination, true);
293 }
294
[email protected]bf4ea2f2014-03-10 22:57:53295 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
[email protected]d8e2abf82014-03-06 10:30:10296 bool goaway_received) {
[email protected]3c772402013-12-18 21:38:11297 // Should only be called if there is no active session for this destination.
bnccb7ff3c2015-05-21 20:51:55298 EXPECT_FALSE(HasActiveSession(destination));
[email protected]3c772402013-12-18 21:38:11299 size_t socket_count = socket_factory_.udp_client_sockets().size();
300
301 MockRead reads[] = {
302 MockRead(ASYNC, OK, 0) // EOF
303 };
rtennetibe635732014-10-02 22:51:42304 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]3c772402013-12-18 21:38:11305 socket_data.StopAfter(1);
306 socket_factory_.AddSocketDataProvider(&socket_data);
307
jri7046038f2015-10-22 00:29:26308 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:59309 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56310 request.Request(destination, privacy_mode_,
rtennetia75df622015-06-21 23:59:50311 /*cert_verify_flags=*/0, destination.host(),
312 "GET", net_log_, callback_.callback()));
[email protected]3c772402013-12-18 21:38:11313
314 EXPECT_EQ(OK, callback_.WaitForResult());
315 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
316 EXPECT_TRUE(stream.get());
317 stream.reset();
318
ckrasic4f9d88d2015-07-22 22:23:16319 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:26320 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), destination);
[email protected]3c772402013-12-18 21:38:11321
322 if (socket_count + 1 != socket_factory_.udp_client_sockets().size()) {
323 EXPECT_TRUE(false);
324 return 0;
325 }
326
327 IPEndPoint endpoint;
328 socket_factory_.
329 udp_client_sockets()[socket_count]->GetLocalAddress(&endpoint);
330 int port = endpoint.port();
[email protected]d8e2abf82014-03-06 10:30:10331 if (goaway_received) {
332 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, "");
rtenneti9bd5d4b2015-08-21 05:44:52333 session->connection()->OnGoAwayFrame(goaway);
[email protected]d8e2abf82014-03-06 10:30:10334 }
[email protected]3c772402013-12-18 21:38:11335
jri7046038f2015-10-22 00:29:26336 factory_->OnSessionClosed(session);
bnccb7ff3c2015-05-21 20:51:55337 EXPECT_FALSE(HasActiveSession(destination));
rch37de576c2015-05-17 20:28:17338 EXPECT_TRUE(socket_data.AllReadDataConsumed());
339 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:11340 return port;
341 }
342
rtenneti1cd3b162015-09-29 02:58:28343 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
344 QuicPacketNumber num) {
345 return maker_.MakeConnectionClosePacket(num);
346 }
347
[email protected]459a7402014-02-10 12:58:52348 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() {
[email protected]66ae5962014-05-22 11:13:05349 QuicStreamId stream_id = kClientDataStreamId1;
[email protected]51cc1342014-04-18 23:44:37350 return maker_.MakeRstPacket(
351 1, true, stream_id,
rtenneti14abd312015-02-06 21:56:01352 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam().version));
[email protected]459a7402014-02-10 12:58:52353 }
354
bncf8bf0722015-05-19 20:04:13355 static ProofVerifyDetailsChromium DefaultProofVerifyDetails() {
356 // Load a certificate that is valid for www.example.org, mail.example.org,
357 // and mail.example.com.
358 scoped_refptr<X509Certificate> test_cert(
359 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
360 EXPECT_TRUE(test_cert.get());
361 ProofVerifyDetailsChromium verify_details;
362 verify_details.cert_verify_result.verified_cert = test_cert;
363 verify_details.cert_verify_result.is_issued_by_known_root = true;
364 return verify_details;
365 }
366
jri8c44d692015-10-23 23:53:41367 void NotifyIPAddressChanged() {
368 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
369 // For thread safety, the NCN queues tasks to do the actual notifications,
370 // so we need to spin the message loop so the notification is delivered.
371 base::MessageLoop::current()->RunUntilIdle();
372 }
373
[email protected]e13201d82012-12-12 05:00:32374 MockHostResolver host_resolver_;
[email protected]0edce6a2013-05-08 18:02:40375 DeterministicMockClientSocketFactory socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05376 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]9558c5d32012-12-22 00:08:14377 MockRandom random_generator_;
[email protected]872edd9e2013-01-16 08:51:15378 MockClock* clock_; // Owned by factory_.
rtenneti38f5cd52014-10-28 20:28:28379 scoped_refptr<TestTaskRunner> runner_;
rtenneti4b06ae72014-08-26 03:43:43380 QuicTestPacketMaker maker_;
rtenneticcab42b2015-10-09 06:38:16381 HttpServerPropertiesImpl http_server_properties_;
[email protected]59c0bbd2014-03-22 04:08:12382 scoped_ptr<CertVerifier> cert_verifier_;
[email protected]6b8a3c742014-07-25 00:25:35383 scoped_ptr<ChannelIDService> channel_id_service_;
[email protected]080b77932014-08-04 01:22:46384 TransportSecurityState transport_security_state_;
jri7046038f2015-10-22 00:29:26385 scoped_ptr<QuicStreamFactory> factory_;
[email protected]bf4ea2f2014-03-10 22:57:53386 HostPortPair host_port_pair_;
[email protected]9dd3ff0f2014-03-26 09:51:28387 PrivacyMode privacy_mode_;
[email protected]e13201d82012-12-12 05:00:32388 BoundNetLog net_log_;
389 TestCompletionCallback callback_;
jri7046038f2015-10-22 00:29:26390
391 // Variables to configure QuicStreamFactory.
392 bool enable_port_selection_;
393 bool always_require_handshake_confirmation_;
394 bool disable_connection_pooling_;
395 double load_server_info_timeout_srtt_multiplier_;
396 bool enable_connection_racing_;
397 bool enable_non_blocking_io_;
398 bool disable_disk_cache_;
399 bool prefer_aes_;
400 int max_number_of_lossy_connections_;
401 double packet_loss_threshold_;
402 int max_disabled_reasons_;
403 int threshold_timeouts_with_open_streams_;
404 int threshold_public_resets_post_handshake_;
405 int receive_buffer_size_;
406 bool delay_tcp_race_;
407 bool store_server_configs_in_properties_;
jri8c44d692015-10-23 23:53:41408 bool close_sessions_on_ip_change_;
[email protected]e13201d82012-12-12 05:00:32409};
410
rtenneti14abd312015-02-06 21:56:01411INSTANTIATE_TEST_CASE_P(Version,
412 QuicStreamFactoryTest,
413 ::testing::ValuesIn(GetTestParams()));
[email protected]1e960032013-12-20 19:00:20414
[email protected]1e960032013-12-20 19:00:20415TEST_P(QuicStreamFactoryTest, Create) {
jri7046038f2015-10-22 00:29:26416 Initialize();
417
[email protected]69dfd1b2013-06-04 22:20:12418 MockRead reads[] = {
[email protected]25c31dc2013-06-05 17:56:04419 MockRead(ASYNC, OK, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:12420 };
rtennetibe635732014-10-02 22:51:42421 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:32422 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]25c31dc2013-06-05 17:56:04423 socket_data.StopAfter(1);
[email protected]e13201d82012-12-12 05:00:32424
jri7046038f2015-10-22 00:29:26425 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:59426 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56427 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50428 /*cert_verify_flags=*/0, host_port_pair_.host(),
429 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32430
431 EXPECT_EQ(OK, callback_.WaitForResult());
432 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0edce6a2013-05-08 18:02:40433 EXPECT_TRUE(stream.get());
[email protected]e13201d82012-12-12 05:00:32434
435 // Will reset stream 3.
bnccb7ff3c2015-05-21 20:51:55436 stream = CreateFromSession(host_port_pair_);
[email protected]e13201d82012-12-12 05:00:32437 EXPECT_TRUE(stream.get());
438
[email protected]6d1b4ed2013-07-10 03:57:54439 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
440 // in streams on different sessions.
jri7046038f2015-10-22 00:29:26441 QuicStreamRequest request2(factory_.get());
rtennetia75df622015-06-21 23:59:50442 EXPECT_EQ(OK,
rchf114d982015-10-21 01:34:56443 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50444 /*cert_verify_flags=*/0, host_port_pair_.host(),
445 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32446 stream = request2.ReleaseStream(); // Will reset stream 5.
447 stream.reset(); // Will reset stream 7.
448
rch37de576c2015-05-17 20:28:17449 EXPECT_TRUE(socket_data.AllReadDataConsumed());
450 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:32451}
452
[email protected]8bd2b812014-03-26 04:01:17453TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
jri7046038f2015-10-22 00:29:26454 Initialize();
455
[email protected]8bd2b812014-03-26 04:01:17456 MockRead reads[] = {
457 MockRead(ASYNC, OK, 0) // EOF
458 };
rtennetibe635732014-10-02 22:51:42459 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17460 socket_factory_.AddSocketDataProvider(&socket_data);
461 socket_data.StopAfter(1);
462
463 crypto_client_stream_factory_.set_handshake_mode(
464 MockCryptoClientStream::ZERO_RTT);
465 host_resolver_.set_synchronous_mode(true);
466 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
467 "192.168.0.1", "");
468
jri7046038f2015-10-22 00:29:26469 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56470 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50471 /*cert_verify_flags=*/0, host_port_pair_.host(),
472 "GET", net_log_, callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17473
474 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
475 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17476 EXPECT_TRUE(socket_data.AllReadDataConsumed());
477 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17478}
479
480TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
jri7046038f2015-10-22 00:29:26481 Initialize();
482
[email protected]8bd2b812014-03-26 04:01:17483 MockRead reads[] = {
484 MockRead(ASYNC, OK, 0) // EOF
485 };
rtennetibe635732014-10-02 22:51:42486 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17487 socket_factory_.AddSocketDataProvider(&socket_data);
488 socket_data.StopAfter(1);
489
490 crypto_client_stream_factory_.set_handshake_mode(
491 MockCryptoClientStream::ZERO_RTT);
492 host_resolver_.set_synchronous_mode(true);
493 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
494 "192.168.0.1", "");
495
jri7046038f2015-10-22 00:29:26496 QuicStreamRequest request(factory_.get());
[email protected]8bd2b812014-03-26 04:01:17497 // Posts require handshake confirmation, so this will return asynchronously.
498 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56499 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50500 /*cert_verify_flags=*/0, host_port_pair_.host(),
501 "POST", net_log_, callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17502
503 // Confirm the handshake and verify that the stream is created.
504 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
505 QuicSession::HANDSHAKE_CONFIRMED);
506
507 EXPECT_EQ(OK, callback_.WaitForResult());
508 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
509 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17510 EXPECT_TRUE(socket_data.AllReadDataConsumed());
511 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17512}
513
bnc68d401dd2015-05-18 20:31:48514TEST_P(QuicStreamFactoryTest, NoZeroRttForDifferentHost) {
jri7046038f2015-10-22 00:29:26515 Initialize();
516
bnc68d401dd2015-05-18 20:31:48517 MockRead reads[] = {
518 MockRead(ASYNC, OK, 0),
519 };
520 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
521 socket_factory_.AddSocketDataProvider(&socket_data);
522 socket_data.StopAfter(1);
523
524 crypto_client_stream_factory_.set_handshake_mode(
525 MockCryptoClientStream::ZERO_RTT);
526 host_resolver_.set_synchronous_mode(true);
527 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
528 "192.168.0.1", "");
529
jri7046038f2015-10-22 00:29:26530 QuicStreamRequest request(factory_.get());
rtennetia75df622015-06-21 23:59:50531 int rv = request.Request(
rchf114d982015-10-21 01:34:56532 host_port_pair_, privacy_mode_, /*cert_verify_flags=*/0,
rtennetia75df622015-06-21 23:59:50533 "different.host.example.com", "GET", net_log_, callback_.callback());
bnc68d401dd2015-05-18 20:31:48534 // If server and origin have different hostnames, then handshake confirmation
535 // should be required, so Request will return asynchronously.
536 EXPECT_EQ(ERR_IO_PENDING, rv);
537 // Confirm handshake.
538 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
539 QuicSession::HANDSHAKE_CONFIRMED);
540 EXPECT_EQ(OK, callback_.WaitForResult());
541
542 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
543 EXPECT_TRUE(stream.get());
544 EXPECT_TRUE(socket_data.AllReadDataConsumed());
545 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
546}
547
rch68955482015-09-24 00:14:39548TEST_P(QuicStreamFactoryTest, GoAway) {
jri7046038f2015-10-22 00:29:26549 Initialize();
550
rch68955482015-09-24 00:14:39551 MockRead reads[] = {
552 MockRead(ASYNC, OK, 0) // EOF
553 };
554 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
555 socket_factory_.AddSocketDataProvider(&socket_data);
556 socket_data.StopAfter(1);
557
jri7046038f2015-10-22 00:29:26558 QuicStreamRequest request(factory_.get());
rch68955482015-09-24 00:14:39559 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56560 request.Request(host_port_pair_, privacy_mode_,
rch68955482015-09-24 00:14:39561 /*cert_verify_flags=*/0, host_port_pair_.host(),
562 "GET", net_log_, callback_.callback()));
563
564 EXPECT_EQ(OK, callback_.WaitForResult());
565 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
566 EXPECT_TRUE(stream.get());
567
rchf114d982015-10-21 01:34:56568 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:26569 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
rch68955482015-09-24 00:14:39570
571 session->OnGoAway(QuicGoAwayFrame());
572
rchf114d982015-10-21 01:34:56573 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:26574 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
rch68955482015-09-24 00:14:39575
576 EXPECT_TRUE(socket_data.AllReadDataConsumed());
577 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
578}
579
[email protected]5db452202014-08-19 05:22:15580TEST_P(QuicStreamFactoryTest, Pooling) {
jri7046038f2015-10-22 00:29:26581 Initialize();
582
[email protected]eed749f92013-12-23 18:57:38583 MockRead reads[] = {
584 MockRead(ASYNC, OK, 0) // EOF
585 };
rtennetibe635732014-10-02 22:51:42586 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38587 socket_factory_.AddSocketDataProvider(&socket_data);
588 socket_data.StopAfter(1);
589
[email protected]bf4ea2f2014-03-10 22:57:53590 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38591 host_resolver_.set_synchronous_mode(true);
592 host_resolver_.rules()->AddIPLiteralRule(
593 kDefaultServerHostName, "192.168.0.1", "");
594 host_resolver_.rules()->AddIPLiteralRule(
595 "mail.google.com", "192.168.0.1", "");
596
jri7046038f2015-10-22 00:29:26597 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56598 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50599 /*cert_verify_flags=*/0, host_port_pair_.host(),
600 "GET", net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38601 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
602 EXPECT_TRUE(stream.get());
603
604 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26605 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56606 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50607 /*cert_verify_flags=*/0, server2.host(), "GET",
608 net_log_, callback.callback()));
[email protected]eed749f92013-12-23 18:57:38609 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
610 EXPECT_TRUE(stream2.get());
611
jri7046038f2015-10-22 00:29:26612 EXPECT_EQ(
613 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_),
614 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38615
rch37de576c2015-05-17 20:28:17616 EXPECT_TRUE(socket_data.AllReadDataConsumed());
617 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38618}
619
jri584002d12014-09-09 00:51:28620TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) {
jri7046038f2015-10-22 00:29:26621 disable_connection_pooling_ = true;
622 Initialize();
623
jri584002d12014-09-09 00:51:28624 MockRead reads[] = {
625 MockRead(ASYNC, OK, 0) // EOF
626 };
rtennetibe635732014-10-02 22:51:42627 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
628 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28629 socket_factory_.AddSocketDataProvider(&socket_data1);
630 socket_factory_.AddSocketDataProvider(&socket_data2);
631 socket_data1.StopAfter(1);
632 socket_data2.StopAfter(1);
633
634 HostPortPair server2("mail.google.com", kDefaultServerPort);
635 host_resolver_.set_synchronous_mode(true);
636 host_resolver_.rules()->AddIPLiteralRule(
637 kDefaultServerHostName, "192.168.0.1", "");
638 host_resolver_.rules()->AddIPLiteralRule(
639 "mail.google.com", "192.168.0.1", "");
640
jri7046038f2015-10-22 00:29:26641 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56642 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50643 /*cert_verify_flags=*/0, host_port_pair_.host(),
644 "GET", net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28645 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
646 EXPECT_TRUE(stream.get());
647
648 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26649 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56650 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50651 /*cert_verify_flags=*/0, server2.host(), "GET",
652 net_log_, callback.callback()));
jri584002d12014-09-09 00:51:28653 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
654 EXPECT_TRUE(stream2.get());
655
jri7046038f2015-10-22 00:29:26656 EXPECT_NE(
657 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_),
658 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
jri584002d12014-09-09 00:51:28659
rch37de576c2015-05-17 20:28:17660 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
661 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
662 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
663 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28664}
665
[email protected]eed749f92013-12-23 18:57:38666TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
jri7046038f2015-10-22 00:29:26667 Initialize();
668
[email protected]eed749f92013-12-23 18:57:38669 MockRead reads[] = {
670 MockRead(ASYNC, OK, 0) // EOF
671 };
rtennetibe635732014-10-02 22:51:42672 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
673 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38674 socket_factory_.AddSocketDataProvider(&socket_data1);
675 socket_factory_.AddSocketDataProvider(&socket_data2);
676 socket_data1.StopAfter(1);
677 socket_data2.StopAfter(1);
678
[email protected]bf4ea2f2014-03-10 22:57:53679 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38680 host_resolver_.set_synchronous_mode(true);
681 host_resolver_.rules()->AddIPLiteralRule(
682 kDefaultServerHostName, "192.168.0.1", "");
683 host_resolver_.rules()->AddIPLiteralRule(
684 "mail.google.com", "192.168.0.1", "");
685
jri7046038f2015-10-22 00:29:26686 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56687 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50688 /*cert_verify_flags=*/0, host_port_pair_.host(),
689 "GET", net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38690 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
691 EXPECT_TRUE(stream.get());
692
693 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26694 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56695 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50696 /*cert_verify_flags=*/0, server2.host(), "GET",
697 net_log_, callback.callback()));
[email protected]eed749f92013-12-23 18:57:38698 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
699 EXPECT_TRUE(stream2.get());
700
jri7046038f2015-10-22 00:29:26701 factory_->OnSessionGoingAway(
702 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_));
rchf114d982015-10-21 01:34:56703 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:26704 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
705 EXPECT_FALSE(
706 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38707
708 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:26709 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:56710 EXPECT_EQ(OK, request3.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50711 /*cert_verify_flags=*/0, server2.host(), "GET",
712 net_log_, callback3.callback()));
[email protected]eed749f92013-12-23 18:57:38713 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
714 EXPECT_TRUE(stream3.get());
715
jri7046038f2015-10-22 00:29:26716 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38717
rch37de576c2015-05-17 20:28:17718 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
719 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
720 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
721 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38722}
723
[email protected]5db452202014-08-19 05:22:15724TEST_P(QuicStreamFactoryTest, HttpsPooling) {
jri7046038f2015-10-22 00:29:26725 Initialize();
[email protected]eed749f92013-12-23 18:57:38726 MockRead reads[] = {
727 MockRead(ASYNC, OK, 0) // EOF
728 };
rtennetibe635732014-10-02 22:51:42729 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38730 socket_factory_.AddSocketDataProvider(&socket_data);
731 socket_data.StopAfter(1);
732
[email protected]bf4ea2f2014-03-10 22:57:53733 HostPortPair server1("www.example.org", 443);
734 HostPortPair server2("mail.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38735
bncf8bf0722015-05-19 20:04:13736 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01737 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38738
739 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53740 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
741 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38742
jri7046038f2015-10-22 00:29:26743 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56744 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
rtennetia75df622015-06-21 23:59:50745 /*cert_verify_flags=*/0, server1.host(), "GET",
746 net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38747 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
748 EXPECT_TRUE(stream.get());
749
750 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26751 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56752 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50753 /*cert_verify_flags=*/0, server2.host(), "GET",
754 net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38755 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
756 EXPECT_TRUE(stream2.get());
757
jri7046038f2015-10-22 00:29:26758 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
759 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38760
rch37de576c2015-05-17 20:28:17761 EXPECT_TRUE(socket_data.AllReadDataConsumed());
762 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38763}
764
jri584002d12014-09-09 00:51:28765TEST_P(QuicStreamFactoryTest, NoHttpsPoolingIfDisabled) {
jri7046038f2015-10-22 00:29:26766 disable_connection_pooling_ = true;
767 Initialize();
768
jri584002d12014-09-09 00:51:28769 MockRead reads[] = {
770 MockRead(ASYNC, OK, 0) // EOF
771 };
rtennetibe635732014-10-02 22:51:42772 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
773 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28774 socket_factory_.AddSocketDataProvider(&socket_data1);
775 socket_factory_.AddSocketDataProvider(&socket_data2);
776 socket_data1.StopAfter(1);
777 socket_data2.StopAfter(1);
778
779 HostPortPair server1("www.example.org", 443);
780 HostPortPair server2("mail.example.org", 443);
781
bncf8bf0722015-05-19 20:04:13782 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01783 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28784
785 host_resolver_.set_synchronous_mode(true);
786 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
787 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
788
jri7046038f2015-10-22 00:29:26789 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56790 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
rtennetia75df622015-06-21 23:59:50791 /*cert_verify_flags=*/0, server1.host(), "GET",
792 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28793 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
794 EXPECT_TRUE(stream.get());
795
796 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26797 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56798 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50799 /*cert_verify_flags=*/0, server2.host(), "GET",
800 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28801 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
802 EXPECT_TRUE(stream2.get());
803
jri7046038f2015-10-22 00:29:26804 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
805 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
jri584002d12014-09-09 00:51:28806
rch37de576c2015-05-17 20:28:17807 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
808 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
809 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
810 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28811}
812
bnccb7ff3c2015-05-21 20:51:55813class QuicAlternativeServiceCertificateValidationPooling
814 : public QuicStreamFactoryTest {
815 public:
816 void Run(bool valid) {
817 MockRead reads[] = {
818 MockRead(ASYNC, OK, 0) // EOF
819 };
820 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
821 socket_factory_.AddSocketDataProvider(&socket_data1);
822 socket_data1.StopAfter(1);
[email protected]eed749f92013-12-23 18:57:38823
bnccb7ff3c2015-05-21 20:51:55824 HostPortPair server1("www.example.org", 443);
825 HostPortPair server2("mail.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38826
bnccb7ff3c2015-05-21 20:51:55827 std::string origin_host(valid ? "mail.example.org" : "invalid.example.org");
828 HostPortPair alternative("www.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38829
bnccb7ff3c2015-05-21 20:51:55830 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
831 bool common_name_fallback_used;
832 EXPECT_EQ(valid,
833 verify_details.cert_verify_result.verified_cert->VerifyNameMatch(
834 origin_host, &common_name_fallback_used));
835 EXPECT_TRUE(
836 verify_details.cert_verify_result.verified_cert->VerifyNameMatch(
837 alternative.host(), &common_name_fallback_used));
838 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38839
bnccb7ff3c2015-05-21 20:51:55840 host_resolver_.set_synchronous_mode(true);
841 host_resolver_.rules()->AddIPLiteralRule(alternative.host(), "192.168.0.1",
842 "");
[email protected]eed749f92013-12-23 18:57:38843
bnccb7ff3c2015-05-21 20:51:55844 // Open first stream to alternative.
jri7046038f2015-10-22 00:29:26845 QuicStreamRequest request1(factory_.get());
rchf114d982015-10-21 01:34:56846 EXPECT_EQ(OK, request1.Request(alternative, privacy_mode_,
rtennetia75df622015-06-21 23:59:50847 /*cert_verify_flags=*/0, alternative.host(),
848 "GET", net_log_, callback_.callback()));
bnccb7ff3c2015-05-21 20:51:55849 scoped_ptr<QuicHttpStream> stream1 = request1.ReleaseStream();
850 EXPECT_TRUE(stream1.get());
[email protected]eed749f92013-12-23 18:57:38851
jri7046038f2015-10-22 00:29:26852 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56853 int rv = request2.Request(alternative, privacy_mode_,
rtennetia75df622015-06-21 23:59:50854 /*cert_verify_flags=*/0, origin_host, "GET",
855 net_log_, callback_.callback());
bnccb7ff3c2015-05-21 20:51:55856 if (valid) {
857 // Alternative service of origin to |alternative| should pool to session
858 // of |stream1| even if origin is different. Since only one
859 // SocketDataProvider is set up, the second request succeeding means that
860 // it pooled to the session opened by the first one.
861 EXPECT_EQ(OK, rv);
862 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
863 EXPECT_TRUE(stream2.get());
864 } else {
865 EXPECT_EQ(ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN, rv);
866 }
[email protected]eed749f92013-12-23 18:57:38867
bnccb7ff3c2015-05-21 20:51:55868 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
869 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
870 }
871};
872
873INSTANTIATE_TEST_CASE_P(Version,
874 QuicAlternativeServiceCertificateValidationPooling,
875 ::testing::ValuesIn(GetTestParams()));
876
877TEST_P(QuicAlternativeServiceCertificateValidationPooling, Valid) {
jri7046038f2015-10-22 00:29:26878 Initialize();
bnccb7ff3c2015-05-21 20:51:55879 Run(true);
880}
881
882TEST_P(QuicAlternativeServiceCertificateValidationPooling, Invalid) {
jri7046038f2015-10-22 00:29:26883 Initialize();
bnccb7ff3c2015-05-21 20:51:55884 Run(false);
[email protected]eed749f92013-12-23 18:57:38885}
886
[email protected]5db452202014-08-19 05:22:15887TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
jri7046038f2015-10-22 00:29:26888 Initialize();
[email protected]5db452202014-08-19 05:22:15889 MockRead reads[] = {
890 MockRead(ASYNC, OK, 0) // EOF
891 };
rtennetibe635732014-10-02 22:51:42892 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15893 socket_factory_.AddSocketDataProvider(&socket_data);
894 socket_data.StopAfter(1);
895
896 HostPortPair server1("www.example.org", 443);
897 HostPortPair server2("mail.example.org", 443);
898 uint8 primary_pin = 1;
899 uint8 backup_pin = 2;
900 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
901 backup_pin);
902
bncf8bf0722015-05-19 20:04:13903 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
[email protected]5db452202014-08-19 05:22:15904 verify_details.cert_verify_result.public_key_hashes.push_back(
905 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01906 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]5db452202014-08-19 05:22:15907
908 host_resolver_.set_synchronous_mode(true);
909 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
910 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
911
jri7046038f2015-10-22 00:29:26912 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56913 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
rtennetia75df622015-06-21 23:59:50914 /*cert_verify_flags=*/0, server1.host(), "GET",
915 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15916 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
917 EXPECT_TRUE(stream.get());
918
919 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26920 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56921 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50922 /*cert_verify_flags=*/0, server2.host(), "GET",
923 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15924 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
925 EXPECT_TRUE(stream2.get());
926
jri7046038f2015-10-22 00:29:26927 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
928 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]5db452202014-08-19 05:22:15929
rch37de576c2015-05-17 20:28:17930 EXPECT_TRUE(socket_data.AllReadDataConsumed());
931 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:15932}
933
jri584002d12014-09-09 00:51:28934TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithMatchingPinsIfDisabled) {
jri7046038f2015-10-22 00:29:26935 disable_connection_pooling_ = true;
936 Initialize();
937
jri584002d12014-09-09 00:51:28938 MockRead reads[] = {
939 MockRead(ASYNC, OK, 0) // EOF
940 };
rtennetibe635732014-10-02 22:51:42941 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
942 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28943 socket_factory_.AddSocketDataProvider(&socket_data1);
944 socket_factory_.AddSocketDataProvider(&socket_data2);
945 socket_data1.StopAfter(1);
946 socket_data2.StopAfter(1);
947
948 HostPortPair server1("www.example.org", 443);
949 HostPortPair server2("mail.example.org", 443);
950 uint8 primary_pin = 1;
951 uint8 backup_pin = 2;
952 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
953 backup_pin);
954
bncf8bf0722015-05-19 20:04:13955 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
jri584002d12014-09-09 00:51:28956 verify_details.cert_verify_result.public_key_hashes.push_back(
957 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01958 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28959
960 host_resolver_.set_synchronous_mode(true);
961 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
962 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
963
jri7046038f2015-10-22 00:29:26964 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56965 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
rtennetia75df622015-06-21 23:59:50966 /*cert_verify_flags=*/0, server1.host(), "GET",
967 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28968 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
969 EXPECT_TRUE(stream.get());
970
971 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26972 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56973 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50974 /*cert_verify_flags=*/0, server2.host(), "GET",
975 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28976 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
977 EXPECT_TRUE(stream2.get());
978
jri7046038f2015-10-22 00:29:26979 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
980 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
jri584002d12014-09-09 00:51:28981
rch37de576c2015-05-17 20:28:17982 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
983 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
984 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
985 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28986}
987
[email protected]5db452202014-08-19 05:22:15988TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
jri7046038f2015-10-22 00:29:26989 Initialize();
[email protected]5db452202014-08-19 05:22:15990 MockRead reads[] = {
991 MockRead(ASYNC, OK, 0) // EOF
992 };
rtennetibe635732014-10-02 22:51:42993 DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
994 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15995 socket_factory_.AddSocketDataProvider(&socket_data1);
996 socket_factory_.AddSocketDataProvider(&socket_data2);
997 socket_data1.StopAfter(1);
998 socket_data2.StopAfter(1);
999
1000 HostPortPair server1("www.example.org", 443);
1001 HostPortPair server2("mail.example.org", 443);
1002 uint8 primary_pin = 1;
1003 uint8 backup_pin = 2;
1004 uint8 bad_pin = 3;
1005 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
1006 backup_pin);
1007
bncf8bf0722015-05-19 20:04:131008 ProofVerifyDetailsChromium verify_details1 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011009 verify_details1.cert_verify_result.public_key_hashes.push_back(
1010 test::GetTestHashValue(bad_pin));
1011 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
1012
bncf8bf0722015-05-19 20:04:131013 ProofVerifyDetailsChromium verify_details2 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011014 verify_details2.cert_verify_result.public_key_hashes.push_back(
1015 test::GetTestHashValue(primary_pin));
1016 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
[email protected]5db452202014-08-19 05:22:151017
1018 host_resolver_.set_synchronous_mode(true);
1019 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1020 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1021
jri7046038f2015-10-22 00:29:261022 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561023 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
rtennetia75df622015-06-21 23:59:501024 /*cert_verify_flags=*/0, server1.host(), "GET",
1025 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:151026 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1027 EXPECT_TRUE(stream.get());
1028
1029 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:261030 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:561031 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:501032 /*cert_verify_flags=*/0, server2.host(), "GET",
1033 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:151034 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1035 EXPECT_TRUE(stream2.get());
1036
jri7046038f2015-10-22 00:29:261037 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
1038 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]5db452202014-08-19 05:22:151039
rch37de576c2015-05-17 20:28:171040 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1041 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1042 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1043 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:151044}
1045
[email protected]1e960032013-12-20 19:00:201046TEST_P(QuicStreamFactoryTest, Goaway) {
jri7046038f2015-10-22 00:29:261047 Initialize();
[email protected]4d283b32013-10-17 12:57:271048 MockRead reads[] = {
1049 MockRead(ASYNC, OK, 0) // EOF
1050 };
rtennetibe635732014-10-02 22:51:421051 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271052 socket_data.StopAfter(1);
1053 socket_factory_.AddSocketDataProvider(&socket_data);
rtennetibe635732014-10-02 22:51:421054 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271055 socket_data2.StopAfter(1);
1056 socket_factory_.AddSocketDataProvider(&socket_data2);
1057
jri7046038f2015-10-22 00:29:261058 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591059 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561060 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501061 /*cert_verify_flags=*/0, host_port_pair_.host(),
1062 "GET", net_log_, callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271063
1064 EXPECT_EQ(OK, callback_.WaitForResult());
1065 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1066 EXPECT_TRUE(stream.get());
1067
1068 // Mark the session as going away. Ensure that while it is still alive
1069 // that it is no longer active.
rchf114d982015-10-21 01:34:561070 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:261071 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1072 factory_->OnSessionGoingAway(session);
1073 EXPECT_EQ(true,
1074 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
rchf114d982015-10-21 01:34:561075 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261076 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
bnccb7ff3c2015-05-21 20:51:551077 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]4d283b32013-10-17 12:57:271078
1079 // Create a new request for the same destination and verify that a
1080 // new session is created.
jri7046038f2015-10-22 00:29:261081 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591082 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561083 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501084 /*cert_verify_flags=*/0, host_port_pair_.host(),
1085 "GET", net_log_, callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271086 EXPECT_EQ(OK, callback_.WaitForResult());
1087 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1088 EXPECT_TRUE(stream2.get());
1089
rchf114d982015-10-21 01:34:561090 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:261091 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
1092 EXPECT_NE(session, QuicStreamFactoryPeer::GetActiveSession(factory_.get(),
rchf114d982015-10-21 01:34:561093 host_port_pair_));
jri7046038f2015-10-22 00:29:261094 EXPECT_EQ(true,
1095 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
[email protected]4d283b32013-10-17 12:57:271096
1097 stream2.reset();
1098 stream.reset();
1099
rch37de576c2015-05-17 20:28:171100 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1101 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1102 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1103 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]4d283b32013-10-17 12:57:271104}
1105
[email protected]1e960032013-12-20 19:00:201106TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
jri7046038f2015-10-22 00:29:261107 Initialize();
[email protected]66ae5962014-05-22 11:13:051108 QuicStreamId stream_id = kClientDataStreamId1;
ckrasicea295fe2015-10-31 05:03:271109 scoped_ptr<QuicEncryptedPacket> client_rst(
[email protected]1e960032013-12-20 19:00:201110 maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
[email protected]06ff5152013-08-29 01:03:051111 MockWrite writes[] = {
ckrasicea295fe2015-10-31 05:03:271112 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 0),
1113 };
1114 scoped_ptr<QuicEncryptedPacket> server_rst(
1115 maker_.MakeRstPacket(1, false, stream_id, QUIC_STREAM_CANCELLED));
1116 MockRead reads[] = {
1117 MockRead(ASYNC, server_rst->data(), server_rst->length(), 1),
1118 MockRead(ASYNC, OK, 2) // EOF
[email protected]06ff5152013-08-29 01:03:051119 };
1120 DeterministicSocketData socket_data(reads, arraysize(reads),
1121 writes, arraysize(writes));
[email protected]0b2294d32013-08-02 00:46:361122 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasicea295fe2015-10-31 05:03:271123 socket_data.StopAfter(2);
[email protected]0b2294d32013-08-02 00:46:361124
1125 HttpRequestInfo request_info;
1126 std::vector<QuicHttpStream*> streams;
1127 // The MockCryptoClientStream sets max_open_streams to be
rtenneti6a4cf3b2015-01-09 03:41:151128 // kDefaultMaxStreamsPerConnection / 2.
1129 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection / 2; i++) {
jri7046038f2015-10-22 00:29:261130 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561131 int rv = request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501132 /*cert_verify_flags=*/0, host_port_pair_.host(),
1133 "GET", net_log_, callback_.callback());
[email protected]0b2294d32013-08-02 00:46:361134 if (i == 0) {
1135 EXPECT_EQ(ERR_IO_PENDING, rv);
1136 EXPECT_EQ(OK, callback_.WaitForResult());
1137 } else {
1138 EXPECT_EQ(OK, rv);
1139 }
1140 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1141 EXPECT_TRUE(stream);
1142 EXPECT_EQ(OK, stream->InitializeStream(
1143 &request_info, DEFAULT_PRIORITY, net_log_, CompletionCallback()));
1144 streams.push_back(stream.release());
1145 }
1146
jri7046038f2015-10-22 00:29:261147 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561148 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501149 /*cert_verify_flags=*/0, host_port_pair_.host(),
1150 "GET", net_log_, CompletionCallback()));
[email protected]0b2294d32013-08-02 00:46:361151 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1152 EXPECT_TRUE(stream);
1153 EXPECT_EQ(ERR_IO_PENDING, stream->InitializeStream(
1154 &request_info, DEFAULT_PRIORITY, net_log_, callback_.callback()));
1155
1156 // Close the first stream.
1157 streams.front()->Close(false);
ckrasicea295fe2015-10-31 05:03:271158 // Trigger exchange of RSTs that in turn allow progress for the last
1159 // stream.
1160 socket_data.RunFor(2);
[email protected]0b2294d32013-08-02 00:46:361161
1162 ASSERT_TRUE(callback_.have_result());
[email protected]0b2294d32013-08-02 00:46:361163 EXPECT_EQ(OK, callback_.WaitForResult());
1164
rch37de576c2015-05-17 20:28:171165 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1166 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
ckrasicea295fe2015-10-31 05:03:271167
1168 // Force close of the connection to suppress the generation of RST
1169 // packets when streams are torn down, which wouldn't be relevant to
1170 // this test anyway.
1171 QuicChromiumClientSession* session =
1172 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1173 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
1174
[email protected]0b2294d32013-08-02 00:46:361175 STLDeleteElements(&streams);
1176}
1177
[email protected]1e960032013-12-20 19:00:201178TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
jri7046038f2015-10-22 00:29:261179 Initialize();
rtennetibe635732014-10-02 22:51:421180 DeterministicSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321181 socket_factory_.AddSocketDataProvider(&socket_data);
1182
[email protected]3c772402013-12-18 21:38:111183 host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName);
[email protected]e13201d82012-12-12 05:00:321184
jri7046038f2015-10-22 00:29:261185 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591186 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561187 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501188 /*cert_verify_flags=*/0, host_port_pair_.host(),
1189 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321190
1191 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
1192
rch37de576c2015-05-17 20:28:171193 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1194 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321195}
1196
[email protected]1e960032013-12-20 19:00:201197TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
jri7046038f2015-10-22 00:29:261198 Initialize();
[email protected]3c772402013-12-18 21:38:111199 MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
rtennetibe635732014-10-02 22:51:421200 DeterministicSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]3c772402013-12-18 21:38:111201 socket_data.set_connect_data(connect);
1202 socket_factory_.AddSocketDataProvider(&socket_data);
1203 socket_data.StopAfter(1);
1204
jri7046038f2015-10-22 00:29:261205 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591206 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561207 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501208 /*cert_verify_flags=*/0, host_port_pair_.host(),
1209 "GET", net_log_, callback_.callback()));
[email protected]3c772402013-12-18 21:38:111210
1211 EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult());
1212
rch37de576c2015-05-17 20:28:171213 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1214 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:111215}
1216
[email protected]1e960032013-12-20 19:00:201217TEST_P(QuicStreamFactoryTest, CancelCreate) {
jri7046038f2015-10-22 00:29:261218 Initialize();
[email protected]69dfd1b2013-06-04 22:20:121219 MockRead reads[] = {
[email protected]25c31dc2013-06-05 17:56:041220 MockRead(ASYNC, OK, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121221 };
rtennetibe635732014-10-02 22:51:421222 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321223 socket_factory_.AddSocketDataProvider(&socket_data);
1224 {
jri7046038f2015-10-22 00:29:261225 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591226 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561227 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501228 /*cert_verify_flags=*/0, host_port_pair_.host(),
1229 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321230 }
1231
[email protected]25c31dc2013-06-05 17:56:041232 socket_data.StopAfter(1);
[email protected]e13201d82012-12-12 05:00:321233 base::RunLoop run_loop;
1234 run_loop.RunUntilIdle();
1235
bnccb7ff3c2015-05-21 20:51:551236 scoped_ptr<QuicHttpStream> stream(CreateFromSession(host_port_pair_));
[email protected]e13201d82012-12-12 05:00:321237 EXPECT_TRUE(stream.get());
1238 stream.reset();
1239
rch37de576c2015-05-17 20:28:171240 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1241 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321242}
1243
[email protected]1e960032013-12-20 19:00:201244TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) {
jri7046038f2015-10-22 00:29:261245 Initialize();
1246
[email protected]3c772402013-12-18 21:38:111247 // Sequentially connect to the default host, then another host, and then the
1248 // default host. Verify that the default host gets a consistent ephemeral
1249 // port, that is different from the other host's connection.
1250
1251 std::string other_server_name = "other.google.com";
1252 EXPECT_NE(kDefaultServerHostName, other_server_name);
1253 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort);
[email protected]3c772402013-12-18 21:38:111254
[email protected]bf4ea2f2014-03-10 22:57:531255 int original_port = GetSourcePortForNewSession(host_port_pair_);
1256 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2));
1257 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]3c772402013-12-18 21:38:111258}
1259
[email protected]d8e2abf82014-03-06 10:30:101260TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) {
jri7046038f2015-10-22 00:29:261261 Initialize();
1262
[email protected]d8e2abf82014-03-06 10:30:101263 // Get a session to the host using the port suggester.
1264 int original_port =
[email protected]bf4ea2f2014-03-10 22:57:531265 GetSourcePortForNewSessionAndGoAway(host_port_pair_);
[email protected]d8e2abf82014-03-06 10:30:101266 // Verify that the port is different after the goaway.
[email protected]bf4ea2f2014-03-10 22:57:531267 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101268 // Since the previous session did not goaway we should see the original port.
[email protected]bf4ea2f2014-03-10 22:57:531269 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101270}
1271
[email protected]1e960032013-12-20 19:00:201272TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
jri7046038f2015-10-22 00:29:261273 Initialize();
[email protected]56dfb902013-01-03 23:17:551274 MockRead reads[] = {
[email protected]0edce6a2013-05-08 18:02:401275 MockRead(ASYNC, 0, 0) // EOF
[email protected]56dfb902013-01-03 23:17:551276 };
[email protected]459a7402014-02-10 12:58:521277 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1278 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311279 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521280 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421281 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521282 writes.size());
[email protected]56dfb902013-01-03 23:17:551283 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0edce6a2013-05-08 18:02:401284 socket_data.StopAfter(1);
[email protected]56dfb902013-01-03 23:17:551285
[email protected]69dfd1b2013-06-04 22:20:121286 MockRead reads2[] = {
[email protected]25c31dc2013-06-05 17:56:041287 MockRead(ASYNC, 0, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121288 };
rtennetibe635732014-10-02 22:51:421289 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]56dfb902013-01-03 23:17:551290 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]0edce6a2013-05-08 18:02:401291 socket_data2.StopAfter(1);
[email protected]56dfb902013-01-03 23:17:551292
jri7046038f2015-10-22 00:29:261293 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591294 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561295 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501296 /*cert_verify_flags=*/0, host_port_pair_.host(),
1297 "GET", net_log_, callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551298
1299 EXPECT_EQ(OK, callback_.WaitForResult());
1300 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361301 HttpRequestInfo request_info;
1302 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1303 DEFAULT_PRIORITY,
1304 net_log_, CompletionCallback()));
[email protected]56dfb902013-01-03 23:17:551305
1306 // Close the session and verify that stream saw the error.
jri7046038f2015-10-22 00:29:261307 factory_->CloseAllSessions(ERR_INTERNET_DISCONNECTED);
[email protected]56dfb902013-01-03 23:17:551308 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1309 stream->ReadResponseHeaders(callback_.callback()));
1310
1311 // Now attempting to request a stream to the same origin should create
1312 // a new session.
1313
jri7046038f2015-10-22 00:29:261314 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591315 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561316 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501317 /*cert_verify_flags=*/0, host_port_pair_.host(),
1318 "GET", net_log_, callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551319
1320 EXPECT_EQ(OK, callback_.WaitForResult());
1321 stream = request2.ReleaseStream();
1322 stream.reset(); // Will reset stream 3.
1323
rch37de576c2015-05-17 20:28:171324 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1325 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1326 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1327 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]56dfb902013-01-03 23:17:551328}
1329
[email protected]1e960032013-12-20 19:00:201330TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
jri8c44d692015-10-23 23:53:411331 close_sessions_on_ip_change_ = true;
jri7046038f2015-10-22 00:29:261332 Initialize();
jri8c44d692015-10-23 23:53:411333
[email protected]f698a012013-05-06 20:18:591334 MockRead reads[] = {
[email protected]0edce6a2013-05-08 18:02:401335 MockRead(ASYNC, 0, 0) // EOF
[email protected]f698a012013-05-06 20:18:591336 };
[email protected]459a7402014-02-10 12:58:521337 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1338 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311339 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521340 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421341 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521342 writes.size());
[email protected]f698a012013-05-06 20:18:591343 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0edce6a2013-05-08 18:02:401344 socket_data.StopAfter(1);
[email protected]f698a012013-05-06 20:18:591345
[email protected]69dfd1b2013-06-04 22:20:121346 MockRead reads2[] = {
[email protected]25c31dc2013-06-05 17:56:041347 MockRead(ASYNC, 0, 0) // EOF
[email protected]69dfd1b2013-06-04 22:20:121348 };
rtennetibe635732014-10-02 22:51:421349 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]f698a012013-05-06 20:18:591350 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]0edce6a2013-05-08 18:02:401351 socket_data2.StopAfter(1);
[email protected]f698a012013-05-06 20:18:591352
jri7046038f2015-10-22 00:29:261353 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591354 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561355 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501356 /*cert_verify_flags=*/0, host_port_pair_.host(),
1357 "GET", net_log_, callback_.callback()));
[email protected]f698a012013-05-06 20:18:591358
1359 EXPECT_EQ(OK, callback_.WaitForResult());
1360 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361361 HttpRequestInfo request_info;
1362 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1363 DEFAULT_PRIORITY,
1364 net_log_, CompletionCallback()));
[email protected]f698a012013-05-06 20:18:591365
1366 // Change the IP address and verify that stream saw the error.
jri8c44d692015-10-23 23:53:411367 NotifyIPAddressChanged();
[email protected]f698a012013-05-06 20:18:591368 EXPECT_EQ(ERR_NETWORK_CHANGED,
1369 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:261370 EXPECT_TRUE(factory_->require_confirmation());
[email protected]f698a012013-05-06 20:18:591371
1372 // Now attempting to request a stream to the same origin should create
1373 // a new session.
1374
jri7046038f2015-10-22 00:29:261375 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591376 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561377 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501378 /*cert_verify_flags=*/0, host_port_pair_.host(),
1379 "GET", net_log_, callback_.callback()));
[email protected]f698a012013-05-06 20:18:591380
1381 EXPECT_EQ(OK, callback_.WaitForResult());
1382 stream = request2.ReleaseStream();
1383 stream.reset(); // Will reset stream 3.
1384
rch37de576c2015-05-17 20:28:171385 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1386 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1387 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1388 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]f698a012013-05-06 20:18:591389}
1390
rch02d87792015-09-09 09:05:531391TEST_P(QuicStreamFactoryTest, OnSSLConfigChanged) {
jri7046038f2015-10-22 00:29:261392 Initialize();
rch02d87792015-09-09 09:05:531393 MockRead reads[] = {
1394 MockRead(ASYNC, 0, 0) // EOF
1395 };
1396 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1397 std::vector<MockWrite> writes;
1398 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
1399 DeterministicSocketData socket_data(reads, arraysize(reads),
1400 writes.empty() ? nullptr : &writes[0],
1401 writes.size());
1402 socket_factory_.AddSocketDataProvider(&socket_data);
1403 socket_data.StopAfter(1);
1404
1405 MockRead reads2[] = {
1406 MockRead(ASYNC, 0, 0) // EOF
1407 };
1408 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1409 socket_factory_.AddSocketDataProvider(&socket_data2);
1410 socket_data2.StopAfter(1);
1411
jri7046038f2015-10-22 00:29:261412 QuicStreamRequest request(factory_.get());
rch02d87792015-09-09 09:05:531413 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561414 request.Request(host_port_pair_, privacy_mode_,
rch02d87792015-09-09 09:05:531415 /*cert_verify_flags=*/0, host_port_pair_.host(),
1416 "GET", net_log_, callback_.callback()));
1417
1418 EXPECT_EQ(OK, callback_.WaitForResult());
1419 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1420 HttpRequestInfo request_info;
1421 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1422 net_log_, CompletionCallback()));
1423
jri7046038f2015-10-22 00:29:261424 factory_->OnSSLConfigChanged();
rch02d87792015-09-09 09:05:531425 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1426 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:261427 EXPECT_FALSE(factory_->require_confirmation());
rch02d87792015-09-09 09:05:531428
1429 // Now attempting to request a stream to the same origin should create
1430 // a new session.
1431
jri7046038f2015-10-22 00:29:261432 QuicStreamRequest request2(factory_.get());
rch02d87792015-09-09 09:05:531433 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561434 request2.Request(host_port_pair_, privacy_mode_,
rch02d87792015-09-09 09:05:531435 /*cert_verify_flags=*/0, host_port_pair_.host(),
1436 "GET", net_log_, callback_.callback()));
1437
1438 EXPECT_EQ(OK, callback_.WaitForResult());
1439 stream = request2.ReleaseStream();
1440 stream.reset(); // Will reset stream 3.
1441
1442 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1443 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1444 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1445 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1446}
1447
[email protected]1e960032013-12-20 19:00:201448TEST_P(QuicStreamFactoryTest, OnCertAdded) {
jri7046038f2015-10-22 00:29:261449 Initialize();
[email protected]d7d1e50b2013-11-25 22:08:091450 MockRead reads[] = {
1451 MockRead(ASYNC, 0, 0) // EOF
1452 };
[email protected]459a7402014-02-10 12:58:521453 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1454 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311455 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521456 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421457 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521458 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:091459 socket_factory_.AddSocketDataProvider(&socket_data);
1460 socket_data.StopAfter(1);
1461
1462 MockRead reads2[] = {
1463 MockRead(ASYNC, 0, 0) // EOF
1464 };
rtennetibe635732014-10-02 22:51:421465 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:091466 socket_factory_.AddSocketDataProvider(&socket_data2);
1467 socket_data2.StopAfter(1);
1468
jri7046038f2015-10-22 00:29:261469 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591470 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561471 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501472 /*cert_verify_flags=*/0, host_port_pair_.host(),
1473 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091474
1475 EXPECT_EQ(OK, callback_.WaitForResult());
1476 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1477 HttpRequestInfo request_info;
1478 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1479 DEFAULT_PRIORITY,
1480 net_log_, CompletionCallback()));
1481
1482 // Add a cert and verify that stream saw the event.
jri7046038f2015-10-22 00:29:261483 factory_->OnCertAdded(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:091484 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1485 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:261486 EXPECT_FALSE(factory_->require_confirmation());
[email protected]d7d1e50b2013-11-25 22:08:091487
1488 // Now attempting to request a stream to the same origin should create
1489 // a new session.
1490
jri7046038f2015-10-22 00:29:261491 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591492 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561493 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501494 /*cert_verify_flags=*/0, host_port_pair_.host(),
1495 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091496
1497 EXPECT_EQ(OK, callback_.WaitForResult());
1498 stream = request2.ReleaseStream();
1499 stream.reset(); // Will reset stream 3.
1500
rch37de576c2015-05-17 20:28:171501 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1502 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1503 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1504 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:091505}
1506
[email protected]1e960032013-12-20 19:00:201507TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
jri7046038f2015-10-22 00:29:261508 Initialize();
[email protected]d7d1e50b2013-11-25 22:08:091509 MockRead reads[] = {
1510 MockRead(ASYNC, 0, 0) // EOF
1511 };
[email protected]459a7402014-02-10 12:58:521512 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1513 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311514 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
[email protected]459a7402014-02-10 12:58:521515 DeterministicSocketData socket_data(reads, arraysize(reads),
rtennetibe635732014-10-02 22:51:421516 writes.empty() ? nullptr : &writes[0],
[email protected]459a7402014-02-10 12:58:521517 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:091518 socket_factory_.AddSocketDataProvider(&socket_data);
1519 socket_data.StopAfter(1);
1520
1521 MockRead reads2[] = {
1522 MockRead(ASYNC, 0, 0) // EOF
1523 };
rtennetibe635732014-10-02 22:51:421524 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:091525 socket_factory_.AddSocketDataProvider(&socket_data2);
1526 socket_data2.StopAfter(1);
1527
jri7046038f2015-10-22 00:29:261528 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591529 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561530 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501531 /*cert_verify_flags=*/0, host_port_pair_.host(),
1532 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091533
1534 EXPECT_EQ(OK, callback_.WaitForResult());
1535 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1536 HttpRequestInfo request_info;
1537 EXPECT_EQ(OK, stream->InitializeStream(&request_info,
1538 DEFAULT_PRIORITY,
1539 net_log_, CompletionCallback()));
1540
1541 // Change the CA cert and verify that stream saw the event.
jri7046038f2015-10-22 00:29:261542 factory_->OnCACertChanged(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:091543 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1544 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:261545 EXPECT_FALSE(factory_->require_confirmation());
[email protected]d7d1e50b2013-11-25 22:08:091546
1547 // Now attempting to request a stream to the same origin should create
1548 // a new session.
1549
jri7046038f2015-10-22 00:29:261550 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591551 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561552 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501553 /*cert_verify_flags=*/0, host_port_pair_.host(),
1554 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091555
1556 EXPECT_EQ(OK, callback_.WaitForResult());
1557 stream = request2.ReleaseStream();
1558 stream.reset(); // Will reset stream 3.
1559
rch37de576c2015-05-17 20:28:171560 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1561 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1562 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1563 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:091564}
1565
[email protected]1e960032013-12-20 19:00:201566TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
jri7046038f2015-10-22 00:29:261567 Initialize();
[email protected]6e12d702013-11-13 00:17:171568 vector<string> cannoncial_suffixes;
1569 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1570 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]c49ff182013-09-28 08:33:261571
[email protected]6e12d702013-11-13 00:17:171572 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1573 string r1_host_name("r1");
1574 string r2_host_name("r2");
1575 r1_host_name.append(cannoncial_suffixes[i]);
1576 r2_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141577
[email protected]bf4ea2f2014-03-10 22:57:531578 HostPortPair host_port_pair1(r1_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121579 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:261580 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rch1fe2eeb2015-10-26 14:45:571581 QuicServerId server_id1(host_port_pair1, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171582 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371583 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171584 EXPECT_FALSE(cached1->proof_valid());
1585 EXPECT_TRUE(cached1->source_address_token().empty());
1586
1587 // Mutate the cached1 to have different data.
1588 // TODO(rtenneti): mutate other members of CachedState.
1589 cached1->set_source_address_token(r1_host_name);
1590 cached1->SetProofValid();
1591
[email protected]bf4ea2f2014-03-10 22:57:531592 HostPortPair host_port_pair2(r2_host_name, 80);
rch1fe2eeb2015-10-26 14:45:571593 QuicServerId server_id2(host_port_pair2, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171594 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371595 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171596 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
1597 EXPECT_TRUE(cached2->proof_valid());
1598 }
[email protected]b70fdb792013-10-25 19:04:141599}
1600
[email protected]1e960032013-12-20 19:00:201601TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
jri7046038f2015-10-22 00:29:261602 Initialize();
[email protected]6e12d702013-11-13 00:17:171603 vector<string> cannoncial_suffixes;
1604 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1605 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]b70fdb792013-10-25 19:04:141606
[email protected]6e12d702013-11-13 00:17:171607 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1608 string r3_host_name("r3");
1609 string r4_host_name("r4");
1610 r3_host_name.append(cannoncial_suffixes[i]);
1611 r4_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141612
[email protected]bf4ea2f2014-03-10 22:57:531613 HostPortPair host_port_pair1(r3_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121614 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:261615 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rch1fe2eeb2015-10-26 14:45:571616 QuicServerId server_id1(host_port_pair1, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171617 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371618 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171619 EXPECT_FALSE(cached1->proof_valid());
1620 EXPECT_TRUE(cached1->source_address_token().empty());
1621
1622 // Mutate the cached1 to have different data.
1623 // TODO(rtenneti): mutate other members of CachedState.
1624 cached1->set_source_address_token(r3_host_name);
1625 cached1->SetProofInvalid();
1626
[email protected]bf4ea2f2014-03-10 22:57:531627 HostPortPair host_port_pair2(r4_host_name, 80);
rch1fe2eeb2015-10-26 14:45:571628 QuicServerId server_id2(host_port_pair2, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171629 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371630 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171631 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
1632 EXPECT_TRUE(cached2->source_address_token().empty());
1633 EXPECT_FALSE(cached2->proof_valid());
1634 }
[email protected]c49ff182013-09-28 08:33:261635}
1636
rtenneti14abd312015-02-06 21:56:011637TEST_P(QuicStreamFactoryTest, RacingConnections) {
jri7046038f2015-10-22 00:29:261638 disable_disk_cache_ = false;
1639 Initialize();
1640
rtenneti14abd312015-02-06 21:56:011641 if (!GetParam().enable_connection_racing)
1642 return;
jri7046038f2015-10-22 00:29:261643
1644 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneticcab42b2015-10-09 06:38:161645
rtenneti14abd312015-02-06 21:56:011646 MockRead reads[] = {
1647 MockRead(ASYNC, OK, 0) // EOF
1648 };
1649 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1650 socket_factory_.AddSocketDataProvider(&socket_data);
1651 socket_data.StopAfter(1);
1652
1653 MockRead reads2[] = {
1654 MockRead(ASYNC, 0, 0) // EOF
1655 };
1656 DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1657 socket_factory_.AddSocketDataProvider(&socket_data2);
1658 socket_data2.StopAfter(1);
1659
rtenneticcab42b2015-10-09 06:38:161660 const AlternativeService alternative_service1(QUIC, host_port_pair_.host(),
1661 host_port_pair_.port());
1662 AlternativeServiceInfoVector alternative_service_info_vector;
1663 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1664 alternative_service_info_vector.push_back(
1665 AlternativeServiceInfo(alternative_service1, 1.0, expiration));
1666
1667 http_server_properties_.SetAlternativeServices(
1668 host_port_pair_, alternative_service_info_vector);
1669
rtenneti14abd312015-02-06 21:56:011670 crypto_client_stream_factory_.set_handshake_mode(
1671 MockCryptoClientStream::ZERO_RTT);
1672 host_resolver_.set_synchronous_mode(true);
1673 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1674 "192.168.0.1", "");
1675
jri7046038f2015-10-22 00:29:261676 QuicStreamRequest request(factory_.get());
rch1fe2eeb2015-10-26 14:45:571677 QuicServerId server_id(host_port_pair_, privacy_mode_);
rtenneti14abd312015-02-06 21:56:011678 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561679 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501680 /*cert_verify_flags=*/0, host_port_pair_.host(),
1681 "GET", net_log_, callback_.callback()));
jri7046038f2015-10-22 00:29:261682 EXPECT_EQ(2u, QuicStreamFactoryPeer::GetNumberOfActiveJobs(factory_.get(),
1683 server_id));
rtenneti14abd312015-02-06 21:56:011684
1685 runner_->RunNextTask();
1686
1687 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1688 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:171689 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1690 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
jri7046038f2015-10-22 00:29:261691 EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumberOfActiveJobs(factory_.get(),
1692 server_id));
rtenneti14abd312015-02-06 21:56:011693}
1694
rtenneti34dffe752015-02-24 23:27:321695TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) {
jri7046038f2015-10-22 00:29:261696 disable_disk_cache_ = true;
1697 Initialize();
1698 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti34dffe752015-02-24 23:27:321699
1700 MockRead reads[] = {
1701 MockRead(ASYNC, OK, 0) // EOF
1702 };
1703 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1704 socket_factory_.AddSocketDataProvider(&socket_data);
1705 socket_data.StopAfter(1);
1706
1707 crypto_client_stream_factory_.set_handshake_mode(
1708 MockCryptoClientStream::ZERO_RTT);
1709 host_resolver_.set_synchronous_mode(true);
1710 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1711 "192.168.0.1", "");
1712
jri7046038f2015-10-22 00:29:261713 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561714 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501715 /*cert_verify_flags=*/0, host_port_pair_.host(),
1716 "GET", net_log_, callback_.callback()));
rtenneti34dffe752015-02-24 23:27:321717
1718 // If we are waiting for disk cache, we would have posted a task. Verify that
1719 // the CancelWaitForDataReady task hasn't been posted.
1720 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
1721
1722 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1723 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:171724 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1725 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti34dffe752015-02-24 23:27:321726}
1727
rtenneti85dcfac22015-03-27 20:22:191728TEST_P(QuicStreamFactoryTest, BadPacketLoss) {
jri7046038f2015-10-22 00:29:261729 disable_disk_cache_ = false;
1730 max_number_of_lossy_connections_ = 2;
1731 Initialize();
1732 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
1733
1734 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1735 host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:191736 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261737 factory_.get(), host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:191738
1739 MockRead reads[] = {
1740 MockRead(ASYNC, OK, 0) // EOF
1741 };
1742 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1743 socket_factory_.AddSocketDataProvider(&socket_data);
1744 socket_data.StopAfter(1);
1745
rtenneti97137a92015-06-18 06:00:311746 DeterministicSocketData socket_data2(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:191747 socket_factory_.AddSocketDataProvider(&socket_data2);
1748 socket_data2.StopAfter(1);
1749
rtenneti97137a92015-06-18 06:00:311750 DeterministicSocketData socket_data3(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:191751 socket_factory_.AddSocketDataProvider(&socket_data3);
1752 socket_data3.StopAfter(1);
1753
rtenneti97137a92015-06-18 06:00:311754 DeterministicSocketData socket_data4(nullptr, 0, nullptr, 0);
1755 socket_factory_.AddSocketDataProvider(&socket_data4);
1756 socket_data4.StopAfter(1);
1757
rtenneti85dcfac22015-03-27 20:22:191758 HostPortPair server2("mail.example.org", kDefaultServerPort);
1759 HostPortPair server3("docs.example.org", kDefaultServerPort);
rtenneti97137a92015-06-18 06:00:311760 HostPortPair server4("images.example.org", kDefaultServerPort);
rtenneti85dcfac22015-03-27 20:22:191761
1762 crypto_client_stream_factory_.set_handshake_mode(
1763 MockCryptoClientStream::ZERO_RTT);
1764 host_resolver_.set_synchronous_mode(true);
1765 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1766 "192.168.0.1", "");
1767 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1768 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
rtenneti97137a92015-06-18 06:00:311769 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
rtenneti85dcfac22015-03-27 20:22:191770
jri7046038f2015-10-22 00:29:261771 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561772 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501773 /*cert_verify_flags=*/0, host_port_pair_.host(),
1774 "GET", net_log_, callback_.callback()));
rtenneti85dcfac22015-03-27 20:22:191775
rchf114d982015-10-21 01:34:561776 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:261777 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
rtenneti85dcfac22015-03-27 20:22:191778
1779 DVLOG(1) << "Create 1st session and test packet loss";
1780
1781 // Set packet_loss_rate to a lower value than packet_loss_threshold.
1782 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261783 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/0.9f));
rtenneti41633b1f2015-04-05 18:19:531784 EXPECT_TRUE(session->connection()->connected());
rchf114d982015-10-21 01:34:561785 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:261786 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
1787 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1788 host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:191789 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261790 factory_.get(), host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:191791
1792 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:311793 // and that shouldn't close the session and it shouldn't disable QUIC.
1794 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261795 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:191796 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261797 factory_.get(), host_port_pair_.port()));
rtenneti97137a92015-06-18 06:00:311798 EXPECT_TRUE(session->connection()->connected());
jri7046038f2015-10-22 00:29:261799 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1800 host_port_pair_.port()));
rchf114d982015-10-21 01:34:561801 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:261802 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
rtenneti85dcfac22015-03-27 20:22:191803
1804 // Test N-in-a-row high packet loss connections.
1805
1806 DVLOG(1) << "Create 2nd session and test packet loss";
1807
1808 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:261809 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:561810 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:501811 /*cert_verify_flags=*/0, server2.host(), "GET",
1812 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:161813 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:261814 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
rtenneti85dcfac22015-03-27 20:22:191815
1816 // If there is no packet loss during handshake confirmation, number of lossy
1817 // connections for the port should be 0.
1818 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261819 factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:191820 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261821 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/0.9f));
rtenneti85dcfac22015-03-27 20:22:191822 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261823 factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:191824 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261825 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:191826
1827 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:311828 // and that shouldn't close the session and it shouldn't disable QUIC.
1829 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261830 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:191831 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261832 factory_.get(), server2.port()));
rtenneti97137a92015-06-18 06:00:311833 EXPECT_TRUE(session2->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:191834 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261835 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
1836 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server2));
rtenneti85dcfac22015-03-27 20:22:191837
1838 DVLOG(1) << "Create 3rd session which also has packet loss";
1839
1840 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:261841 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:561842 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
rtennetia75df622015-06-21 23:59:501843 /*cert_verify_flags=*/0, server3.host(), "GET",
1844 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:161845 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:261846 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
rtenneti85dcfac22015-03-27 20:22:191847
rtenneti97137a92015-06-18 06:00:311848 DVLOG(1) << "Create 4th session with packet loss and test IsQuicDisabled()";
1849 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:261850 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:561851 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
rtennetia75df622015-06-21 23:59:501852 /*cert_verify_flags=*/0, server4.host(), "GET",
1853 net_log_, callback4.callback()));
ckrasic4f9d88d2015-07-22 22:23:161854 QuicChromiumClientSession* session4 =
jri7046038f2015-10-22 00:29:261855 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server4);
rtenneti97137a92015-06-18 06:00:311856
rtenneti85dcfac22015-03-27 20:22:191857 // Set packet_loss_rate to higher value than packet_loss_threshold 2nd time in
1858 // a row and that should close the session and disable QUIC.
1859 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:261860 factory_->OnHandshakeConfirmed(session3, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:191861 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261862 factory_.get(), server3.port()));
rtenneti97137a92015-06-18 06:00:311863 EXPECT_FALSE(session3->connection()->connected());
jri7046038f2015-10-22 00:29:261864 EXPECT_TRUE(
1865 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server3.port()));
1866 EXPECT_FALSE(
1867 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server3));
bnccb7ff3c2015-05-21 20:51:551868 EXPECT_FALSE(HasActiveSession(server3));
rtenneti85dcfac22015-03-27 20:22:191869
rtenneti97137a92015-06-18 06:00:311870 // Set packet_loss_rate to higher value than packet_loss_threshold 3rd time in
1871 // a row and IsQuicDisabled() should close the session.
1872 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:261873 factory_->OnHandshakeConfirmed(session4, /*packet_loss_rate=*/1.0f));
rtenneti97137a92015-06-18 06:00:311874 EXPECT_EQ(3, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261875 factory_.get(), server4.port()));
rtenneti97137a92015-06-18 06:00:311876 EXPECT_FALSE(session4->connection()->connected());
jri7046038f2015-10-22 00:29:261877 EXPECT_TRUE(
1878 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server4.port()));
1879 EXPECT_FALSE(
1880 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server4));
rtenneti97137a92015-06-18 06:00:311881 EXPECT_FALSE(HasActiveSession(server4));
1882
rtenneti85dcfac22015-03-27 20:22:191883 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1884 EXPECT_TRUE(stream.get());
1885 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1886 EXPECT_TRUE(stream2.get());
1887 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
1888 EXPECT_TRUE(stream3.get());
rtenneti97137a92015-06-18 06:00:311889 scoped_ptr<QuicHttpStream> stream4 = request4.ReleaseStream();
1890 EXPECT_TRUE(stream4.get());
rch37de576c2015-05-17 20:28:171891 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1892 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1893 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1894 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1895 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
1896 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
rtenneti97137a92015-06-18 06:00:311897 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
1898 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
rtenneti85dcfac22015-03-27 20:22:191899}
1900
ckrasic1e53b642015-07-08 22:39:351901TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfTwo) {
jri7046038f2015-10-22 00:29:261902 disable_disk_cache_ = false;
1903 threshold_public_resets_post_handshake_ = 2;
1904 Initialize();
1905 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
1906
1907 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1908 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351909 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261910 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351911
1912 MockRead reads[] = {
1913 MockRead(ASYNC, OK, 0) // EOF
1914 };
1915 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1916 socket_factory_.AddSocketDataProvider(&socket_data);
1917 socket_data.StopAfter(1);
1918
1919 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
1920 socket_factory_.AddSocketDataProvider(&socket_data2);
1921 socket_data2.StopAfter(1);
1922
1923 HostPortPair server2("mail.example.org", kDefaultServerPort);
1924
1925 crypto_client_stream_factory_.set_handshake_mode(
1926 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1927 host_resolver_.set_synchronous_mode(true);
1928 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1929 "192.168.0.1", "");
1930 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1931
jri7046038f2015-10-22 00:29:261932 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561933 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:351934 /*cert_verify_flags=*/0, host_port_pair_.host(),
1935 "GET", net_log_, callback_.callback()));
1936
rchf114d982015-10-21 01:34:561937 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:261938 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:351939
1940 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
1941 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
1942 // Need to spin the loop now to ensure that
1943 // QuicStreamFactory::OnSessionClosed() runs.
1944 base::RunLoop run_loop;
1945 run_loop.RunUntilIdle();
1946
jri7046038f2015-10-22 00:29:261947 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
1948 factory_.get()));
1949 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1950 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351951
1952 // Test two-in-a-row public reset post handshakes..
1953 DVLOG(1) << "Create 2nd session and trigger public reset post handshake";
1954 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:261955 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:561956 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:351957 /*cert_verify_flags=*/0, server2.host(), "GET",
1958 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:161959 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:261960 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:351961
1962 session2->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
1963 // Need to spin the loop now to ensure that
1964 // QuicStreamFactory::OnSessionClosed() runs.
1965 base::RunLoop run_loop2;
1966 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:261967 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
1968 factory_.get()));
1969 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1970 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:161971 EXPECT_EQ(
1972 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
jri7046038f2015-10-22 00:29:261973 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351974
1975 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1976 EXPECT_TRUE(stream.get());
1977 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1978 EXPECT_TRUE(stream2.get());
1979 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1980 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1981 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1982 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1983}
1984
1985TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfTwo) {
jri7046038f2015-10-22 00:29:261986 disable_disk_cache_ = true;
1987 threshold_timeouts_with_open_streams_ = 2;
1988 Initialize();
1989
1990 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
1991 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1992 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351993 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261994 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351995
1996 MockRead reads[] = {
1997 MockRead(ASYNC, OK, 0) // EOF
1998 };
1999 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
2000 socket_factory_.AddSocketDataProvider(&socket_data);
2001 socket_data.StopAfter(1);
2002
2003 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
2004 socket_factory_.AddSocketDataProvider(&socket_data2);
2005 socket_data2.StopAfter(1);
2006
2007 HostPortPair server2("mail.example.org", kDefaultServerPort);
2008
2009 crypto_client_stream_factory_.set_handshake_mode(
2010 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2011 host_resolver_.set_synchronous_mode(true);
2012 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2013 "192.168.0.1", "");
2014 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2015
jri7046038f2015-10-22 00:29:262016 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562017 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352018 /*cert_verify_flags=*/0, host_port_pair_.host(),
2019 "GET", net_log_, callback_.callback()));
2020
rchf114d982015-10-21 01:34:562021 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262022 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352023
2024 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2025 EXPECT_TRUE(stream.get());
2026 HttpRequestInfo request_info;
2027 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2028 net_log_, CompletionCallback()));
2029
2030 DVLOG(1)
2031 << "Created 1st session and initialized a stream. Now trigger timeout";
2032 session->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2033 // Need to spin the loop now to ensure that
2034 // QuicStreamFactory::OnSessionClosed() runs.
2035 base::RunLoop run_loop;
2036 run_loop.RunUntilIdle();
2037
jri7046038f2015-10-22 00:29:262038 EXPECT_EQ(
2039 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2040 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2041 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352042
2043 // Test two-in-a-row timeouts with open streams.
2044 DVLOG(1) << "Create 2nd session and timeout with open stream";
2045 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262046 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562047 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352048 /*cert_verify_flags=*/0, server2.host(), "GET",
2049 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162050 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262051 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352052
2053 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2054 EXPECT_TRUE(stream2.get());
2055 EXPECT_EQ(OK, stream2->InitializeStream(&request_info, DEFAULT_PRIORITY,
2056 net_log_, CompletionCallback()));
2057
2058 session2->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2059 // Need to spin the loop now to ensure that
2060 // QuicStreamFactory::OnSessionClosed() runs.
2061 base::RunLoop run_loop2;
2062 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262063 EXPECT_EQ(
2064 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2065 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2066 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:162067 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
jri7046038f2015-10-22 00:29:262068 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352069
2070 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2071 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2072 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2073 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2074}
2075
2076TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfThree) {
jri7046038f2015-10-22 00:29:262077 disable_disk_cache_ = true;
2078 threshold_public_resets_post_handshake_ = 2;
2079 Initialize();
2080
2081 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2082 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352083 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262084 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352085
2086 MockRead reads[] = {
2087 MockRead(ASYNC, OK, 0) // EOF
2088 };
2089 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
2090 socket_factory_.AddSocketDataProvider(&socket_data);
2091 socket_data.StopAfter(1);
2092
2093 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
2094 socket_factory_.AddSocketDataProvider(&socket_data2);
2095 socket_data2.StopAfter(1);
2096
2097 DeterministicSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
2098 socket_factory_.AddSocketDataProvider(&socket_data3);
2099 socket_data3.StopAfter(1);
2100
2101 HostPortPair server2("mail.example.org", kDefaultServerPort);
2102 HostPortPair server3("docs.example.org", kDefaultServerPort);
2103
2104 crypto_client_stream_factory_.set_handshake_mode(
2105 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2106 host_resolver_.set_synchronous_mode(true);
2107 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2108 "192.168.0.1", "");
2109 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2110 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
2111
2112 // Test first and third out of three public reset post handshakes.
jri7046038f2015-10-22 00:29:262113 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562114 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352115 /*cert_verify_flags=*/0, host_port_pair_.host(),
2116 "GET", net_log_, callback_.callback()));
2117
rchf114d982015-10-21 01:34:562118 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262119 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352120
2121 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
2122 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
2123 // Need to spin the loop now to ensure that
2124 // QuicStreamFactory::OnSessionClosed() runs.
2125 base::RunLoop run_loop;
2126 run_loop.RunUntilIdle();
2127
jri7046038f2015-10-22 00:29:262128 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2129 factory_.get()));
2130 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2131 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352132
2133 DVLOG(1) << "Create 2nd session without disable trigger";
2134 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262135 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562136 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352137 /*cert_verify_flags=*/0, server2.host(), "GET",
2138 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162139 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262140 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352141
2142 session2->connection()->CloseConnection(QUIC_NO_ERROR, false);
2143 // Need to spin the loop now to ensure that
2144 // QuicStreamFactory::OnSessionClosed() runs.
2145 base::RunLoop run_loop2;
2146 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262147 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2148 factory_.get()));
2149 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2150 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352151
2152 DVLOG(1) << "Create 3rd session with public reset post handshake,"
2153 << " will disable QUIC";
2154 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:262155 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:562156 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352157 /*cert_verify_flags=*/0, server3.host(), "GET",
2158 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:162159 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:262160 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:352161
2162 session3->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
2163 // Need to spin the loop now to ensure that
2164 // QuicStreamFactory::OnSessionClosed() runs.
2165 base::RunLoop run_loop3;
2166 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:262167 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2168 factory_.get()));
2169 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2170 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:162171 EXPECT_EQ(
2172 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
jri7046038f2015-10-22 00:29:262173 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352174
2175 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2176 EXPECT_TRUE(stream.get());
2177 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2178 EXPECT_TRUE(stream2.get());
2179 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2180 EXPECT_TRUE(stream3.get());
2181
2182 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2183 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2184 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2185 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2186 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2187 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
2188}
2189
2190TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfThree) {
jri7046038f2015-10-22 00:29:262191 disable_disk_cache_ = true;
2192 threshold_public_resets_post_handshake_ = 2;
2193 Initialize();
2194 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2195
2196 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2197 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352198 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262199 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352200
2201 MockRead reads[] = {
2202 MockRead(ASYNC, OK, 0) // EOF
2203 };
2204 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
2205 socket_factory_.AddSocketDataProvider(&socket_data);
2206 socket_data.StopAfter(1);
2207
2208 // DeterministicSocketData socket_data2(nullptr, 0, nullptr, 0);
2209 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
2210 socket_factory_.AddSocketDataProvider(&socket_data2);
2211 socket_data2.StopAfter(1);
2212
2213 DeterministicSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
2214 socket_factory_.AddSocketDataProvider(&socket_data3);
2215 socket_data3.StopAfter(1);
2216
2217 HostPortPair server2("mail.example.org", kDefaultServerPort);
2218 HostPortPair server3("docs.example.org", kDefaultServerPort);
2219
2220 crypto_client_stream_factory_.set_handshake_mode(
2221 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2222 host_resolver_.set_synchronous_mode(true);
2223 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2224 "192.168.0.1", "");
2225 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2226 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
2227
2228 // Test first and third out of three timeouts with open streams.
jri7046038f2015-10-22 00:29:262229 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562230 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352231 /*cert_verify_flags=*/0, host_port_pair_.host(),
2232 "GET", net_log_, callback_.callback()));
2233
rchf114d982015-10-21 01:34:562234 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262235 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352236
2237 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2238 EXPECT_TRUE(stream.get());
2239 HttpRequestInfo request_info;
2240 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2241 net_log_, CompletionCallback()));
2242
2243 DVLOG(1)
2244 << "Created 1st session and initialized a stream. Now trigger timeout";
2245 session->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2246 // Need to spin the loop now to ensure that
2247 // QuicStreamFactory::OnSessionClosed() runs.
2248 base::RunLoop run_loop;
2249 run_loop.RunUntilIdle();
2250
jri7046038f2015-10-22 00:29:262251 EXPECT_EQ(
2252 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2253 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2254 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352255
2256 // Test two-in-a-row timeouts with open streams.
2257 DVLOG(1) << "Create 2nd session without timeout";
2258 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262259 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562260 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352261 /*cert_verify_flags=*/0, server2.host(), "GET",
2262 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162263 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262264 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352265
2266 session2->connection()->CloseConnection(QUIC_NO_ERROR, true);
2267 // Need to spin the loop now to ensure that
2268 // QuicStreamFactory::OnSessionClosed() runs.
2269 base::RunLoop run_loop2;
2270 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262271 EXPECT_EQ(
2272 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2273 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2274 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352275
2276 DVLOG(1) << "Create 3rd session with timeout with open streams,"
2277 << " will disable QUIC";
2278
2279 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:262280 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:562281 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352282 /*cert_verify_flags=*/0, server3.host(), "GET",
2283 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:162284 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:262285 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:352286
2287 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2288 EXPECT_TRUE(stream3.get());
2289 EXPECT_EQ(OK, stream3->InitializeStream(&request_info, DEFAULT_PRIORITY,
2290 net_log_, CompletionCallback()));
2291 session3->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2292 // Need to spin the loop now to ensure that
2293 // QuicStreamFactory::OnSessionClosed() runs.
2294 base::RunLoop run_loop3;
2295 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:262296 EXPECT_EQ(
2297 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2298 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2299 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:162300 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
jri7046038f2015-10-22 00:29:262301 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352302
2303 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2304 EXPECT_TRUE(stream2.get());
2305 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2306 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2307 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2308 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2309 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2310 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
2311}
2312
2313TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfFour) {
jri7046038f2015-10-22 00:29:262314 disable_disk_cache_ = true;
2315 threshold_public_resets_post_handshake_ = 2;
2316 Initialize();
2317 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2318
2319 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2320 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352321 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262322 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352323
2324 MockRead reads[] = {
2325 MockRead(ASYNC, OK, 0) // EOF
2326 };
2327 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
2328 socket_factory_.AddSocketDataProvider(&socket_data);
2329 socket_data.StopAfter(1);
2330
2331 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
2332 socket_factory_.AddSocketDataProvider(&socket_data2);
2333 socket_data2.StopAfter(1);
2334
2335 DeterministicSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
2336 socket_factory_.AddSocketDataProvider(&socket_data3);
2337 socket_data3.StopAfter(1);
2338
2339 DeterministicSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
2340 socket_factory_.AddSocketDataProvider(&socket_data4);
2341 socket_data4.StopAfter(1);
2342
2343 HostPortPair server2("mail.example.org", kDefaultServerPort);
2344 HostPortPair server3("docs.example.org", kDefaultServerPort);
2345 HostPortPair server4("images.example.org", kDefaultServerPort);
2346
2347 crypto_client_stream_factory_.set_handshake_mode(
2348 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2349 host_resolver_.set_synchronous_mode(true);
2350 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2351 "192.168.0.1", "");
2352 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2353 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
2354 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
2355
2356 // Test first and fourth out of four public reset post handshakes.
jri7046038f2015-10-22 00:29:262357 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562358 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352359 /*cert_verify_flags=*/0, host_port_pair_.host(),
2360 "GET", net_log_, callback_.callback()));
2361
rchf114d982015-10-21 01:34:562362 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262363 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352364
2365 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
2366 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
2367 // Need to spin the loop now to ensure that
2368 // QuicStreamFactory::OnSessionClosed() runs.
2369 base::RunLoop run_loop;
2370 run_loop.RunUntilIdle();
2371
jri7046038f2015-10-22 00:29:262372 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2373 factory_.get()));
2374 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2375 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352376
2377 DVLOG(1) << "Create 2nd and 3rd sessions without disable trigger";
2378 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262379 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562380 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352381 /*cert_verify_flags=*/0, server2.host(), "GET",
2382 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162383 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262384 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352385
2386 session2->connection()->CloseConnection(QUIC_NO_ERROR, false);
2387 // Need to spin the loop now to ensure that
2388 // QuicStreamFactory::OnSessionClosed() runs.
2389 base::RunLoop run_loop2;
2390 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262391 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2392 factory_.get()));
2393 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2394 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352395
2396 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:262397 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:562398 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352399 /*cert_verify_flags=*/0, server3.host(), "GET",
2400 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:162401 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:262402 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:352403
2404 session3->connection()->CloseConnection(QUIC_NO_ERROR, false);
2405 // Need to spin the loop now to ensure that
2406 // QuicStreamFactory::OnSessionClosed() runs.
2407 base::RunLoop run_loop3;
2408 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:262409 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2410 factory_.get()));
2411 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2412 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352413
2414 DVLOG(1) << "Create 4rd session with public reset post handshake,"
2415 << " will not disable QUIC";
2416 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:262417 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:562418 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352419 /*cert_verify_flags=*/0, server4.host(), "GET",
2420 net_log_, callback4.callback()));
ckrasic4f9d88d2015-07-22 22:23:162421 QuicChromiumClientSession* session4 =
jri7046038f2015-10-22 00:29:262422 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server4);
ckrasic1e53b642015-07-08 22:39:352423
2424 session4->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
2425 // Need to spin the loop now to ensure that
2426 // QuicStreamFactory::OnSessionClosed() runs.
2427 base::RunLoop run_loop4;
2428 run_loop4.RunUntilIdle();
jri7046038f2015-10-22 00:29:262429 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2430 factory_.get()));
2431 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2432 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352433
2434 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2435 EXPECT_TRUE(stream.get());
2436 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2437 EXPECT_TRUE(stream2.get());
2438 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2439 EXPECT_TRUE(stream3.get());
2440 scoped_ptr<QuicHttpStream> stream4 = request4.ReleaseStream();
2441 EXPECT_TRUE(stream4.get());
2442
2443 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2444 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2445 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2446 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2447 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2448 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
2449 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
2450 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
2451}
2452
2453TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfFour) {
jri7046038f2015-10-22 00:29:262454 disable_disk_cache_ = true;
2455 threshold_public_resets_post_handshake_ = 2;
2456 Initialize();
2457 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2458
2459 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2460 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352461 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262462 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352463
2464 MockRead reads[] = {
2465 MockRead(ASYNC, OK, 0) // EOF
2466 };
2467 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
2468 socket_factory_.AddSocketDataProvider(&socket_data);
2469 socket_data.StopAfter(1);
2470
2471 // DeterministicSocketData socket_data2(nullptr, 0, nullptr, 0);
2472 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
2473 socket_factory_.AddSocketDataProvider(&socket_data2);
2474 socket_data2.StopAfter(1);
2475
2476 DeterministicSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
2477 socket_factory_.AddSocketDataProvider(&socket_data3);
2478 socket_data3.StopAfter(1);
2479
2480 DeterministicSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
2481 socket_factory_.AddSocketDataProvider(&socket_data4);
2482 socket_data4.StopAfter(1);
2483
2484 HostPortPair server2("mail.example.org", kDefaultServerPort);
2485 HostPortPair server3("docs.example.org", kDefaultServerPort);
2486 HostPortPair server4("images.example.org", kDefaultServerPort);
2487
2488 crypto_client_stream_factory_.set_handshake_mode(
2489 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2490 host_resolver_.set_synchronous_mode(true);
2491 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2492 "192.168.0.1", "");
2493 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2494 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
2495 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
2496
2497 // Test first and fourth out of three timeouts with open streams.
jri7046038f2015-10-22 00:29:262498 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562499 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352500 /*cert_verify_flags=*/0, host_port_pair_.host(),
2501 "GET", net_log_, callback_.callback()));
2502
rchf114d982015-10-21 01:34:562503 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262504 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352505
2506 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2507 EXPECT_TRUE(stream.get());
2508 HttpRequestInfo request_info;
2509 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2510 net_log_, CompletionCallback()));
2511
2512 DVLOG(1)
2513 << "Created 1st session and initialized a stream. Now trigger timeout";
2514 session->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2515 // Need to spin the loop now to ensure that
2516 // QuicStreamFactory::OnSessionClosed() runs.
2517 base::RunLoop run_loop;
2518 run_loop.RunUntilIdle();
2519
jri7046038f2015-10-22 00:29:262520 EXPECT_EQ(
2521 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2522 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2523 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352524
2525 DVLOG(1) << "Create 2nd and 3rd sessions without timeout";
2526 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262527 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562528 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352529 /*cert_verify_flags=*/0, server2.host(), "GET",
2530 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162531 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262532 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352533
2534 session2->connection()->CloseConnection(QUIC_NO_ERROR, true);
2535 // Need to spin the loop now to ensure that
2536 // QuicStreamFactory::OnSessionClosed() runs.
2537 base::RunLoop run_loop2;
2538 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262539 EXPECT_EQ(
2540 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2541 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2542 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352543
2544 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:262545 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:562546 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352547 /*cert_verify_flags=*/0, server3.host(), "GET",
2548 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:162549 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:262550 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:352551
2552 session3->connection()->CloseConnection(QUIC_NO_ERROR, true);
2553 // Need to spin the loop now to ensure that
2554 // QuicStreamFactory::OnSessionClosed() runs.
2555 base::RunLoop run_loop3;
2556 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:262557 EXPECT_EQ(
2558 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2559 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2560 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352561
2562 DVLOG(1) << "Create 4th session with timeout with open streams,"
2563 << " will not disable QUIC";
2564
2565 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:262566 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:562567 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352568 /*cert_verify_flags=*/0, server4.host(), "GET",
2569 net_log_, callback4.callback()));
ckrasic4f9d88d2015-07-22 22:23:162570 QuicChromiumClientSession* session4 =
jri7046038f2015-10-22 00:29:262571 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server4);
ckrasic1e53b642015-07-08 22:39:352572
2573 scoped_ptr<QuicHttpStream> stream4 = request4.ReleaseStream();
2574 EXPECT_TRUE(stream4.get());
2575 EXPECT_EQ(OK, stream4->InitializeStream(&request_info, DEFAULT_PRIORITY,
2576 net_log_, CompletionCallback()));
2577 session4->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2578 // Need to spin the loop now to ensure that
2579 // QuicStreamFactory::OnSessionClosed() runs.
2580 base::RunLoop run_loop4;
2581 run_loop4.RunUntilIdle();
jri7046038f2015-10-22 00:29:262582 EXPECT_EQ(
2583 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2584 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2585 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352586
2587 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2588 EXPECT_TRUE(stream2.get());
2589 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2590 EXPECT_TRUE(stream3.get());
2591 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2592 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2593 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2594 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2595 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2596 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
2597 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
2598 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
2599}
2600
rtenneti8332ba52015-09-17 19:33:412601TEST_P(QuicStreamFactoryTest, EnableDelayTcpRace) {
jri7046038f2015-10-22 00:29:262602 Initialize();
2603 bool delay_tcp_race = QuicStreamFactoryPeer::GetDelayTcpRace(factory_.get());
2604 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), false);
rtenneti8332ba52015-09-17 19:33:412605 MockRead reads[] = {
2606 MockRead(ASYNC, OK, 0),
2607 };
2608 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
2609 socket_factory_.AddSocketDataProvider(&socket_data);
2610 socket_data.StopAfter(1);
2611
rtenneti8332ba52015-09-17 19:33:412612 ServerNetworkStats stats1;
2613 stats1.srtt = base::TimeDelta::FromMicroseconds(10);
rtenneticcab42b2015-10-09 06:38:162614 http_server_properties_.SetServerNetworkStats(host_port_pair_, stats1);
rtenneti8332ba52015-09-17 19:33:412615
2616 crypto_client_stream_factory_.set_handshake_mode(
2617 MockCryptoClientStream::ZERO_RTT);
2618 host_resolver_.set_synchronous_mode(true);
2619 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2620 "192.168.0.1", "");
2621
jri7046038f2015-10-22 00:29:262622 QuicStreamRequest request(factory_.get());
rtenneti8332ba52015-09-17 19:33:412623 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562624 request.Request(host_port_pair_, privacy_mode_,
rtenneti8332ba52015-09-17 19:33:412625 /*cert_verify_flags=*/0, host_port_pair_.host(),
2626 "POST", net_log_, callback_.callback()));
2627
2628 // If we don't delay TCP connection, then time delay should be 0.
jri7046038f2015-10-22 00:29:262629 EXPECT_FALSE(factory_->delay_tcp_race());
rtenneti8332ba52015-09-17 19:33:412630 EXPECT_EQ(base::TimeDelta(), request.GetTimeDelayForWaitingJob());
2631
2632 // Enable |delay_tcp_race_| param and verify delay is one RTT and that
2633 // server supports QUIC.
jri7046038f2015-10-22 00:29:262634 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), true);
2635 EXPECT_TRUE(factory_->delay_tcp_race());
rtenneti8332ba52015-09-17 19:33:412636 EXPECT_EQ(base::TimeDelta::FromMicroseconds(15),
2637 request.GetTimeDelayForWaitingJob());
2638
2639 // Confirm the handshake and verify that the stream is created.
2640 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
2641 QuicSession::HANDSHAKE_CONFIRMED);
2642
2643 EXPECT_EQ(OK, callback_.WaitForResult());
2644
2645 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2646 EXPECT_TRUE(stream.get());
2647 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2648 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
jri7046038f2015-10-22 00:29:262649 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), delay_tcp_race);
rtenneti8332ba52015-09-17 19:33:412650}
2651
rtenneticd2aaa15b2015-10-10 20:29:332652TEST_P(QuicStreamFactoryTest, MaybeInitialize) {
jri7046038f2015-10-22 00:29:262653 store_server_configs_in_properties_ = true;
2654 Initialize();
2655 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti8a80a6dc2015-09-21 19:51:132656
rtenneti8a80a6dc2015-09-21 19:51:132657 const AlternativeService alternative_service1(QUIC, host_port_pair_.host(),
2658 host_port_pair_.port());
2659 AlternativeServiceInfoVector alternative_service_info_vector;
2660 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
2661 alternative_service_info_vector.push_back(
2662 AlternativeServiceInfo(alternative_service1, 1.0, expiration));
2663
rtenneticcab42b2015-10-09 06:38:162664 http_server_properties_.SetAlternativeServices(
rtenneti8a80a6dc2015-09-21 19:51:132665 host_port_pair_, alternative_service_info_vector);
2666
rch1fe2eeb2015-10-26 14:45:572667 QuicServerId quic_server_id("www.google.com", 80, PRIVACY_MODE_DISABLED);
rtenneticd2aaa15b2015-10-10 20:29:332668 QuicServerInfoFactory* quic_server_info_factory =
2669 new PropertiesBasedQuicServerInfoFactory(
2670 http_server_properties_.GetWeakPtr());
jri7046038f2015-10-22 00:29:262671 factory_->set_quic_server_info_factory(quic_server_info_factory);
rtenneticd2aaa15b2015-10-10 20:29:332672
2673 scoped_ptr<QuicServerInfo> quic_server_info(
2674 quic_server_info_factory->GetForServer(quic_server_id));
2675
2676 // Update quic_server_info's server_config and persist it.
2677 QuicServerInfo::State* state = quic_server_info->mutable_state();
2678 // Minimum SCFG that passes config validation checks.
2679 const char scfg[] = {// SCFG
2680 0x53, 0x43, 0x46, 0x47,
2681 // num entries
2682 0x01, 0x00,
2683 // padding
2684 0x00, 0x00,
2685 // EXPY
2686 0x45, 0x58, 0x50, 0x59,
2687 // EXPY end offset
2688 0x08, 0x00, 0x00, 0x00,
2689 // Value
2690 '1', '2', '3', '4', '5', '6', '7', '8'};
2691
2692 // Create temporary strings becasue Persist() clears string data in |state|.
2693 string server_config(reinterpret_cast<const char*>(&scfg), sizeof(scfg));
2694 string source_address_token("test_source_address_token");
2695 string signature("test_signature");
2696 string test_cert("test_cert");
2697 vector<string> certs;
2698 certs.push_back(test_cert);
2699 state->server_config = server_config;
2700 state->source_address_token = source_address_token;
2701 state->server_config_sig = signature;
2702 state->certs = certs;
2703
2704 quic_server_info->Persist();
2705
jri7046038f2015-10-22 00:29:262706 QuicStreamFactoryPeer::MaybeInitialize(factory_.get());
2707 EXPECT_TRUE(QuicStreamFactoryPeer::HasInitializedData(factory_.get()));
2708 EXPECT_TRUE(QuicStreamFactoryPeer::SupportsQuicAtStartUp(factory_.get(),
2709 host_port_pair_));
2710 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(factory_.get(),
rtenneticd2aaa15b2015-10-10 20:29:332711 quic_server_id));
2712 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:262713 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rtenneticd2aaa15b2015-10-10 20:29:332714 QuicCryptoClientConfig::CachedState* cached =
2715 crypto_config->LookupOrCreate(quic_server_id);
2716 EXPECT_FALSE(cached->server_config().empty());
2717 EXPECT_TRUE(cached->GetServerConfig());
2718 EXPECT_EQ(server_config, cached->server_config());
2719 EXPECT_EQ(source_address_token, cached->source_address_token());
2720 EXPECT_EQ(signature, cached->signature());
2721 ASSERT_EQ(1U, cached->certs().size());
2722 EXPECT_EQ(test_cert, cached->certs()[0]);
rtenneti8a80a6dc2015-09-21 19:51:132723}
2724
rtenneti1cd3b162015-09-29 02:58:282725TEST_P(QuicStreamFactoryTest, YieldAfterPackets) {
jri7046038f2015-10-22 00:29:262726 Initialize();
2727 QuicStreamFactoryPeer::SetYieldAfterPackets(factory_.get(), 0);
rtenneti1cd3b162015-09-29 02:58:282728
2729 scoped_ptr<QuicEncryptedPacket> close_packet(
2730 ConstructConnectionClosePacket(0));
rtenneticd2aaa15b2015-10-10 20:29:332731 vector<MockRead> reads;
rtenneti1cd3b162015-09-29 02:58:282732 reads.push_back(
2733 MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0));
2734 reads.push_back(MockRead(ASYNC, OK, 1));
2735 DeterministicSocketData socket_data(&reads[0], reads.size(), nullptr, 0);
2736 socket_factory_.AddSocketDataProvider(&socket_data);
2737 socket_data.StopAfter(1);
2738
2739 crypto_client_stream_factory_.set_handshake_mode(
2740 MockCryptoClientStream::ZERO_RTT);
2741 host_resolver_.set_synchronous_mode(true);
2742 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2743 "192.168.0.1", "");
2744
2745 // Set up the TaskObserver to verify QuicPacketReader::StartReading posts a
2746 // task.
2747 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
2748 SpdySessionTestTaskObserver observer("quic_packet_reader.cc", "StartReading");
2749
jri7046038f2015-10-22 00:29:262750 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562751 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtenneti1cd3b162015-09-29 02:58:282752 /*cert_verify_flags=*/0, host_port_pair_.host(),
2753 "GET", net_log_, callback_.callback()));
2754
2755 // Call run_loop so that QuicPacketReader::OnReadComplete() gets called.
2756 base::RunLoop run_loop;
2757 run_loop.RunUntilIdle();
2758
2759 // Verify task that the observer's executed_count is 1, which indicates
2760 // QuicPacketReader::StartReading() has posted only one task and yielded the
2761 // read.
2762 EXPECT_EQ(1u, observer.executed_count());
2763
2764 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2765 EXPECT_TRUE(stream.get());
2766 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2767 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2768}
2769
2770TEST_P(QuicStreamFactoryTest, YieldAfterDuration) {
jri7046038f2015-10-22 00:29:262771 Initialize();
rtenneti1cd3b162015-09-29 02:58:282772 QuicStreamFactoryPeer::SetYieldAfterDuration(
jri7046038f2015-10-22 00:29:262773 factory_.get(), QuicTime::Delta::FromMilliseconds(-1));
rtenneti1cd3b162015-09-29 02:58:282774
2775 scoped_ptr<QuicEncryptedPacket> close_packet(
2776 ConstructConnectionClosePacket(0));
rtenneticd2aaa15b2015-10-10 20:29:332777 vector<MockRead> reads;
rtenneti1cd3b162015-09-29 02:58:282778 reads.push_back(
2779 MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0));
2780 reads.push_back(MockRead(ASYNC, OK, 1));
2781 DeterministicSocketData socket_data(&reads[0], reads.size(), nullptr, 0);
2782 socket_factory_.AddSocketDataProvider(&socket_data);
2783 socket_data.StopAfter(1);
2784
2785 crypto_client_stream_factory_.set_handshake_mode(
2786 MockCryptoClientStream::ZERO_RTT);
2787 host_resolver_.set_synchronous_mode(true);
2788 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2789 "192.168.0.1", "");
2790
2791 // Set up the TaskObserver to verify QuicPacketReader::StartReading posts a
2792 // task.
2793 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
2794 SpdySessionTestTaskObserver observer("quic_packet_reader.cc", "StartReading");
2795
jri7046038f2015-10-22 00:29:262796 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562797 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtenneti1cd3b162015-09-29 02:58:282798 /*cert_verify_flags=*/0, host_port_pair_.host(),
2799 "GET", net_log_, callback_.callback()));
2800
2801 // Call run_loop so that QuicPacketReader::OnReadComplete() gets called.
2802 base::RunLoop run_loop;
2803 run_loop.RunUntilIdle();
2804
2805 // Verify task that the observer's executed_count is 1, which indicates
2806 // QuicPacketReader::StartReading() has posted only one task and yielded the
2807 // read.
2808 EXPECT_EQ(1u, observer.executed_count());
2809
2810 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2811 EXPECT_TRUE(stream.get());
2812 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2813 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2814}
2815
[email protected]e13201d82012-12-12 05:00:322816} // namespace test
[email protected]e13201d82012-12-12 05:00:322817} // namespace net