blob: 30868c1458b4a86ddc78f29ef232468446908cb5 [file] [log] [blame]
[email protected]e13201d82012-12-12 05:00:321// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/quic/quic_stream_factory.h"
6
[email protected]e13201d82012-12-12 05:00:327#include "base/run_loop.h"
[email protected]fc9be5802013-06-11 10:56:518#include "base/strings/string_util.h"
skyostil4891b25b2015-06-11 11:43:459#include "base/thread_task_runner_handle.h"
[email protected]eed749f92013-12-23 18:57:3810#include "net/base/test_data_directory.h"
[email protected]6d1b4ed2013-07-10 03:57:5411#include "net/cert/cert_verifier.h"
rtenneti052774e2015-11-24 21:00:1212#include "net/cert/multi_log_ct_verifier.h"
[email protected]f2cb3cf2013-03-21 01:40:5313#include "net/dns/mock_host_resolver.h"
[email protected]e13201d82012-12-12 05:00:3214#include "net/http/http_response_headers.h"
15#include "net/http/http_response_info.h"
rtenneti8332ba52015-09-17 19:33:4116#include "net/http/http_server_properties_impl.h"
[email protected]e13201d82012-12-12 05:00:3217#include "net/http/http_util.h"
[email protected]080b77932014-08-04 01:22:4618#include "net/http/transport_security_state.h"
[email protected]c49ff182013-09-28 08:33:2619#include "net/quic/crypto/crypto_handshake.h"
[email protected]b694e48c2014-03-18 17:10:1320#include "net/quic/crypto/proof_verifier_chromium.h"
rtenneticd2aaa15b2015-10-10 20:29:3321#include "net/quic/crypto/properties_based_quic_server_info.h"
22#include "net/quic/crypto/quic_crypto_client_config.h"
[email protected]4df69842013-02-27 06:32:1623#include "net/quic/crypto/quic_decrypter.h"
24#include "net/quic/crypto/quic_encrypter.h"
rtenneti38f5cd52014-10-28 20:28:2825#include "net/quic/crypto/quic_server_info.h"
[email protected]e13201d82012-12-12 05:00:3226#include "net/quic/quic_http_stream.h"
[email protected]257f24f2014-04-01 09:15:3727#include "net/quic/quic_server_id.h"
[email protected]e13201d82012-12-12 05:00:3228#include "net/quic/test_tools/mock_clock.h"
[email protected]e8ff26842013-03-22 21:02:0529#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
[email protected]9558c5d32012-12-22 00:08:1430#include "net/quic/test_tools/mock_random.h"
rtennetid2e74caa2015-12-09 00:51:5731#include "net/quic/test_tools/quic_stream_factory_peer.h"
[email protected]1e960032013-12-20 19:00:2032#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]e13201d82012-12-12 05:00:3233#include "net/quic/test_tools/quic_test_utils.h"
rtenneti38f5cd52014-10-28 20:28:2834#include "net/quic/test_tools/test_task_runner.h"
[email protected]e13201d82012-12-12 05:00:3235#include "net/socket/socket_test_util.h"
rtenneti1cd3b162015-09-29 02:58:2836#include "net/spdy/spdy_session_test_util.h"
[email protected]5db452202014-08-19 05:22:1537#include "net/spdy/spdy_test_utils.h"
[email protected]6b8a3c742014-07-25 00:25:3538#include "net/ssl/channel_id_service.h"
39#include "net/ssl/default_channel_id_store.h"
[email protected]eed749f92013-12-23 18:57:3840#include "net/test/cert_test_util.h"
[email protected]e13201d82012-12-12 05:00:3241#include "testing/gtest/include/gtest/gtest.h"
42
[email protected]6e12d702013-11-13 00:17:1743using base::StringPiece;
rtenneti14abd312015-02-06 21:56:0144using std::ostream;
[email protected]6e12d702013-11-13 00:17:1745using std::string;
46using std::vector;
47
[email protected]e13201d82012-12-12 05:00:3248namespace net {
[email protected]e13201d82012-12-12 05:00:3249namespace test {
50
[email protected]3c772402013-12-18 21:38:1151namespace {
52const char kDefaultServerHostName[] = "www.google.com";
53const int kDefaultServerPort = 443;
rtenneti14abd312015-02-06 21:56:0154
55// Run all tests with all the combinations of versions and
56// enable_connection_racing.
57struct TestParams {
58 TestParams(const QuicVersion version, bool enable_connection_racing)
59 : version(version), enable_connection_racing(enable_connection_racing) {}
60
61 friend ostream& operator<<(ostream& os, const TestParams& p) {
62 os << "{ version: " << QuicVersionToString(p.version);
63 os << " enable_connection_racing: " << p.enable_connection_racing << " }";
64 return os;
65 }
66
67 QuicVersion version;
68 bool enable_connection_racing;
69};
70
71// Constructs various test permutations.
72vector<TestParams> GetTestParams() {
73 vector<TestParams> params;
74 QuicVersionVector all_supported_versions = QuicSupportedVersions();
75 for (const QuicVersion version : all_supported_versions) {
76 params.push_back(TestParams(version, false));
77 params.push_back(TestParams(version, true));
78 }
79 return params;
80}
81
[email protected]3c772402013-12-18 21:38:1182} // namespace anonymous
83
rtenneti38f5cd52014-10-28 20:28:2884class MockQuicServerInfo : public QuicServerInfo {
85 public:
86 MockQuicServerInfo(const QuicServerId& server_id)
87 : QuicServerInfo(server_id) {}
dcheng2339883c2014-12-23 00:23:0588 ~MockQuicServerInfo() override {}
rtenneti38f5cd52014-10-28 20:28:2889
dcheng2339883c2014-12-23 00:23:0590 void Start() override {}
rtenneti38f5cd52014-10-28 20:28:2891
dcheng2339883c2014-12-23 00:23:0592 int WaitForDataReady(const CompletionCallback& callback) override {
rtenneti38f5cd52014-10-28 20:28:2893 return ERR_IO_PENDING;
94 }
95
rtenneti170f36a2015-02-10 19:13:4596 void ResetWaitForDataReadyCallback() override {}
97
dcheng2339883c2014-12-23 00:23:0598 void CancelWaitForDataReadyCallback() override {}
rtenneti38f5cd52014-10-28 20:28:2899
dcheng2339883c2014-12-23 00:23:05100 bool IsDataReady() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28101
dcheng2339883c2014-12-23 00:23:05102 bool IsReadyToPersist() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28103
dcheng2339883c2014-12-23 00:23:05104 void Persist() override {}
rtennetif0b832b2014-11-07 02:32:30105
dcheng2339883c2014-12-23 00:23:05106 void OnExternalCacheHit() override {}
rtenneti38f5cd52014-10-28 20:28:28107};
108
109class MockQuicServerInfoFactory : public QuicServerInfoFactory {
110 public:
111 MockQuicServerInfoFactory() {}
dcheng2339883c2014-12-23 00:23:05112 ~MockQuicServerInfoFactory() override {}
rtenneti38f5cd52014-10-28 20:28:28113
dcheng2339883c2014-12-23 00:23:05114 QuicServerInfo* GetForServer(const QuicServerId& server_id) override {
rtenneti38f5cd52014-10-28 20:28:28115 return new MockQuicServerInfo(server_id);
116 }
117};
118
rtenneti14abd312015-02-06 21:56:01119class QuicStreamFactoryTest : public ::testing::TestWithParam<TestParams> {
[email protected]e13201d82012-12-12 05:00:32120 protected:
121 QuicStreamFactoryTest()
[email protected]457d6952013-12-13 09:24:58122 : random_generator_(0),
123 clock_(new MockClock()),
rtenneti38f5cd52014-10-28 20:28:28124 runner_(new TestTaskRunner(clock_)),
bncb07c05532015-05-14 19:07:20125 maker_(GetParam().version, 0, clock_, kDefaultServerHostName),
[email protected]59c0bbd2014-03-22 04:08:12126 cert_verifier_(CertVerifier::CreateDefault()),
jri2b966f22014-09-02 22:25:36127 channel_id_service_(
rtennetibe635732014-10-02 22:51:42128 new ChannelIDService(new DefaultChannelIDStore(nullptr),
skyostil4891b25b2015-06-11 11:43:45129 base::ThreadTaskRunnerHandle::Get())),
rtenneti052774e2015-11-24 21:00:12130 cert_transparency_verifier_(new MultiLogCTVerifier()),
jri7046038f2015-10-22 00:29:26131 factory_(nullptr),
[email protected]bf4ea2f2014-03-10 22:57:53132 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
jri7046038f2015-10-22 00:29:26133 privacy_mode_(PRIVACY_MODE_DISABLED),
134 enable_port_selection_(true),
135 always_require_handshake_confirmation_(false),
136 disable_connection_pooling_(false),
137 load_server_info_timeout_srtt_multiplier_(0.0f),
138 enable_connection_racing_(true),
139 enable_non_blocking_io_(true),
140 disable_disk_cache_(false),
141 prefer_aes_(false),
142 max_number_of_lossy_connections_(0),
143 packet_loss_threshold_(1.0f),
144 max_disabled_reasons_(3),
145 threshold_timeouts_with_open_streams_(2),
146 threshold_public_resets_post_handshake_(2),
147 receive_buffer_size_(0),
148 delay_tcp_race_(false),
jri8c44d692015-10-23 23:53:41149 store_server_configs_in_properties_(false),
rtenneti41c09992015-11-30 18:24:01150 close_sessions_on_ip_change_(false),
151 idle_connection_timeout_seconds_(kIdleConnectionTimeoutSeconds) {
[email protected]ca4e0d92014-08-22 16:33:22152 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
jri7046038f2015-10-22 00:29:26153 }
154
155 void Initialize() {
156 factory_.reset(new QuicStreamFactory(
157 &host_resolver_, &socket_factory_, http_server_properties_.GetWeakPtr(),
158 cert_verifier_.get(), nullptr, channel_id_service_.get(),
rtenneti052774e2015-11-24 21:00:12159 &transport_security_state_, cert_transparency_verifier_.get(),
jri7046038f2015-10-22 00:29:26160 /*SocketPerformanceWatcherFactory*/ nullptr,
161 &crypto_client_stream_factory_, &random_generator_, clock_,
162 kDefaultMaxPacketSize, std::string(),
163 SupportedVersions(GetParam().version), enable_port_selection_,
164 always_require_handshake_confirmation_, disable_connection_pooling_,
165 load_server_info_timeout_srtt_multiplier_, enable_connection_racing_,
166 enable_non_blocking_io_, disable_disk_cache_, prefer_aes_,
167 max_number_of_lossy_connections_, packet_loss_threshold_,
168 max_disabled_reasons_, threshold_timeouts_with_open_streams_,
169 threshold_public_resets_post_handshake_, receive_buffer_size_,
jri8c44d692015-10-23 23:53:41170 delay_tcp_race_, store_server_configs_in_properties_,
rtenneti41c09992015-11-30 18:24:01171 close_sessions_on_ip_change_, idle_connection_timeout_seconds_,
172 QuicTagVector()));
jri7046038f2015-10-22 00:29:26173 factory_->set_require_confirmation(false);
174 factory_->set_quic_server_info_factory(new MockQuicServerInfoFactory());
[email protected]e13201d82012-12-12 05:00:32175 }
176
bnccb7ff3c2015-05-21 20:51:55177 bool HasActiveSession(const HostPortPair& host_port_pair) {
jri7046038f2015-10-22 00:29:26178 return QuicStreamFactoryPeer::HasActiveSession(factory_.get(),
179 host_port_pair);
bnccb7ff3c2015-05-21 20:51:55180 }
181
182 scoped_ptr<QuicHttpStream> CreateFromSession(
183 const HostPortPair& host_port_pair) {
ckrasic4f9d88d2015-07-22 22:23:16184 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:26185 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair);
186 return QuicStreamFactoryPeer::CreateFromSession(factory_.get(), session);
[email protected]df157d9d2014-03-10 07:27:27187 }
[email protected]e13201d82012-12-12 05:00:32188
[email protected]bf4ea2f2014-03-10 22:57:53189 int GetSourcePortForNewSession(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10190 return GetSourcePortForNewSessionInner(destination, false);
191 }
192
rjshaded5ced072015-12-18 19:26:02193 int GetSourcePortForNewSessionAndGoAway(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10194 return GetSourcePortForNewSessionInner(destination, true);
195 }
196
[email protected]bf4ea2f2014-03-10 22:57:53197 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
[email protected]d8e2abf82014-03-06 10:30:10198 bool goaway_received) {
[email protected]3c772402013-12-18 21:38:11199 // Should only be called if there is no active session for this destination.
bnccb7ff3c2015-05-21 20:51:55200 EXPECT_FALSE(HasActiveSession(destination));
mmenke651bae7f2015-12-18 21:26:45201 size_t socket_count = socket_factory_.udp_client_socket_ports().size();
[email protected]3c772402013-12-18 21:38:11202
mmenke651bae7f2015-12-18 21:26:45203 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
204 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]3c772402013-12-18 21:38:11205 socket_factory_.AddSocketDataProvider(&socket_data);
206
jri7046038f2015-10-22 00:29:26207 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:59208 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56209 request.Request(destination, privacy_mode_,
rtennetia75df622015-06-21 23:59:50210 /*cert_verify_flags=*/0, destination.host(),
211 "GET", net_log_, callback_.callback()));
[email protected]3c772402013-12-18 21:38:11212
213 EXPECT_EQ(OK, callback_.WaitForResult());
214 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
215 EXPECT_TRUE(stream.get());
216 stream.reset();
217
ckrasic4f9d88d2015-07-22 22:23:16218 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:26219 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), destination);
[email protected]3c772402013-12-18 21:38:11220
mmenke651bae7f2015-12-18 21:26:45221 if (socket_count + 1 != socket_factory_.udp_client_socket_ports().size()) {
222 ADD_FAILURE();
[email protected]3c772402013-12-18 21:38:11223 return 0;
224 }
225
[email protected]d8e2abf82014-03-06 10:30:10226 if (goaway_received) {
227 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, "");
rtenneti9bd5d4b2015-08-21 05:44:52228 session->connection()->OnGoAwayFrame(goaway);
[email protected]d8e2abf82014-03-06 10:30:10229 }
[email protected]3c772402013-12-18 21:38:11230
jri7046038f2015-10-22 00:29:26231 factory_->OnSessionClosed(session);
bnccb7ff3c2015-05-21 20:51:55232 EXPECT_FALSE(HasActiveSession(destination));
rch37de576c2015-05-17 20:28:17233 EXPECT_TRUE(socket_data.AllReadDataConsumed());
234 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:45235 return socket_factory_.udp_client_socket_ports()[socket_count];
[email protected]3c772402013-12-18 21:38:11236 }
237
rtenneti1cd3b162015-09-29 02:58:28238 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
239 QuicPacketNumber num) {
240 return maker_.MakeConnectionClosePacket(num);
241 }
242
[email protected]459a7402014-02-10 12:58:52243 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() {
[email protected]66ae5962014-05-22 11:13:05244 QuicStreamId stream_id = kClientDataStreamId1;
[email protected]51cc1342014-04-18 23:44:37245 return maker_.MakeRstPacket(
246 1, true, stream_id,
rtenneti14abd312015-02-06 21:56:01247 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam().version));
[email protected]459a7402014-02-10 12:58:52248 }
249
bncf8bf0722015-05-19 20:04:13250 static ProofVerifyDetailsChromium DefaultProofVerifyDetails() {
251 // Load a certificate that is valid for www.example.org, mail.example.org,
252 // and mail.example.com.
253 scoped_refptr<X509Certificate> test_cert(
254 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
255 EXPECT_TRUE(test_cert.get());
256 ProofVerifyDetailsChromium verify_details;
257 verify_details.cert_verify_result.verified_cert = test_cert;
258 verify_details.cert_verify_result.is_issued_by_known_root = true;
259 return verify_details;
260 }
261
jri8c44d692015-10-23 23:53:41262 void NotifyIPAddressChanged() {
263 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
264 // For thread safety, the NCN queues tasks to do the actual notifications,
265 // so we need to spin the message loop so the notification is delivered.
266 base::MessageLoop::current()->RunUntilIdle();
267 }
268
[email protected]e13201d82012-12-12 05:00:32269 MockHostResolver host_resolver_;
mmenke651bae7f2015-12-18 21:26:45270 MockClientSocketFactory socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05271 MockCryptoClientStreamFactory crypto_client_stream_factory_;
[email protected]9558c5d32012-12-22 00:08:14272 MockRandom random_generator_;
[email protected]872edd9e2013-01-16 08:51:15273 MockClock* clock_; // Owned by factory_.
rtenneti38f5cd52014-10-28 20:28:28274 scoped_refptr<TestTaskRunner> runner_;
rtenneti4b06ae72014-08-26 03:43:43275 QuicTestPacketMaker maker_;
rtenneticcab42b2015-10-09 06:38:16276 HttpServerPropertiesImpl http_server_properties_;
[email protected]59c0bbd2014-03-22 04:08:12277 scoped_ptr<CertVerifier> cert_verifier_;
[email protected]6b8a3c742014-07-25 00:25:35278 scoped_ptr<ChannelIDService> channel_id_service_;
[email protected]080b77932014-08-04 01:22:46279 TransportSecurityState transport_security_state_;
rtenneti052774e2015-11-24 21:00:12280 scoped_ptr<CTVerifier> cert_transparency_verifier_;
jri7046038f2015-10-22 00:29:26281 scoped_ptr<QuicStreamFactory> factory_;
[email protected]bf4ea2f2014-03-10 22:57:53282 HostPortPair host_port_pair_;
[email protected]9dd3ff0f2014-03-26 09:51:28283 PrivacyMode privacy_mode_;
[email protected]e13201d82012-12-12 05:00:32284 BoundNetLog net_log_;
285 TestCompletionCallback callback_;
jri7046038f2015-10-22 00:29:26286
287 // Variables to configure QuicStreamFactory.
288 bool enable_port_selection_;
289 bool always_require_handshake_confirmation_;
290 bool disable_connection_pooling_;
291 double load_server_info_timeout_srtt_multiplier_;
292 bool enable_connection_racing_;
293 bool enable_non_blocking_io_;
294 bool disable_disk_cache_;
295 bool prefer_aes_;
296 int max_number_of_lossy_connections_;
297 double packet_loss_threshold_;
298 int max_disabled_reasons_;
299 int threshold_timeouts_with_open_streams_;
300 int threshold_public_resets_post_handshake_;
301 int receive_buffer_size_;
302 bool delay_tcp_race_;
303 bool store_server_configs_in_properties_;
jri8c44d692015-10-23 23:53:41304 bool close_sessions_on_ip_change_;
rtenneti41c09992015-11-30 18:24:01305 int idle_connection_timeout_seconds_;
[email protected]e13201d82012-12-12 05:00:32306};
307
rtenneti14abd312015-02-06 21:56:01308INSTANTIATE_TEST_CASE_P(Version,
309 QuicStreamFactoryTest,
310 ::testing::ValuesIn(GetTestParams()));
[email protected]1e960032013-12-20 19:00:20311
[email protected]1e960032013-12-20 19:00:20312TEST_P(QuicStreamFactoryTest, Create) {
jri7046038f2015-10-22 00:29:26313 Initialize();
314
mmenke651bae7f2015-12-18 21:26:45315 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
316 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:32317 socket_factory_.AddSocketDataProvider(&socket_data);
318
jri7046038f2015-10-22 00:29:26319 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:59320 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56321 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50322 /*cert_verify_flags=*/0, host_port_pair_.host(),
323 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32324
325 EXPECT_EQ(OK, callback_.WaitForResult());
326 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0edce6a2013-05-08 18:02:40327 EXPECT_TRUE(stream.get());
[email protected]e13201d82012-12-12 05:00:32328
329 // Will reset stream 3.
bnccb7ff3c2015-05-21 20:51:55330 stream = CreateFromSession(host_port_pair_);
[email protected]e13201d82012-12-12 05:00:32331 EXPECT_TRUE(stream.get());
332
[email protected]6d1b4ed2013-07-10 03:57:54333 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
334 // in streams on different sessions.
jri7046038f2015-10-22 00:29:26335 QuicStreamRequest request2(factory_.get());
rtennetia75df622015-06-21 23:59:50336 EXPECT_EQ(OK,
rchf114d982015-10-21 01:34:56337 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50338 /*cert_verify_flags=*/0, host_port_pair_.host(),
339 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32340 stream = request2.ReleaseStream(); // Will reset stream 5.
rjshaded5ced072015-12-18 19:26:02341 stream.reset(); // Will reset stream 7.
[email protected]e13201d82012-12-12 05:00:32342
rch37de576c2015-05-17 20:28:17343 EXPECT_TRUE(socket_data.AllReadDataConsumed());
344 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:32345}
346
[email protected]8bd2b812014-03-26 04:01:17347TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
jri7046038f2015-10-22 00:29:26348 Initialize();
349
mmenke651bae7f2015-12-18 21:26:45350 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
351 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17352 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]8bd2b812014-03-26 04:01:17353
354 crypto_client_stream_factory_.set_handshake_mode(
355 MockCryptoClientStream::ZERO_RTT);
356 host_resolver_.set_synchronous_mode(true);
357 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
358 "192.168.0.1", "");
359
jri7046038f2015-10-22 00:29:26360 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56361 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50362 /*cert_verify_flags=*/0, host_port_pair_.host(),
363 "GET", net_log_, callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17364
365 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
366 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17367 EXPECT_TRUE(socket_data.AllReadDataConsumed());
368 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17369}
370
371TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
jri7046038f2015-10-22 00:29:26372 Initialize();
373
mmenke651bae7f2015-12-18 21:26:45374 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
375 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17376 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]8bd2b812014-03-26 04:01:17377
378 crypto_client_stream_factory_.set_handshake_mode(
379 MockCryptoClientStream::ZERO_RTT);
380 host_resolver_.set_synchronous_mode(true);
381 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
382 "192.168.0.1", "");
383
jri7046038f2015-10-22 00:29:26384 QuicStreamRequest request(factory_.get());
[email protected]8bd2b812014-03-26 04:01:17385 // Posts require handshake confirmation, so this will return asynchronously.
386 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56387 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50388 /*cert_verify_flags=*/0, host_port_pair_.host(),
389 "POST", net_log_, callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17390
391 // Confirm the handshake and verify that the stream is created.
392 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
393 QuicSession::HANDSHAKE_CONFIRMED);
394
395 EXPECT_EQ(OK, callback_.WaitForResult());
396 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
397 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17398 EXPECT_TRUE(socket_data.AllReadDataConsumed());
399 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17400}
401
bnc68d401dd2015-05-18 20:31:48402TEST_P(QuicStreamFactoryTest, NoZeroRttForDifferentHost) {
jri7046038f2015-10-22 00:29:26403 Initialize();
404
mmenke651bae7f2015-12-18 21:26:45405 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
406 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
bnc68d401dd2015-05-18 20:31:48407 socket_factory_.AddSocketDataProvider(&socket_data);
bnc68d401dd2015-05-18 20:31:48408
409 crypto_client_stream_factory_.set_handshake_mode(
410 MockCryptoClientStream::ZERO_RTT);
411 host_resolver_.set_synchronous_mode(true);
412 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
413 "192.168.0.1", "");
414
jri7046038f2015-10-22 00:29:26415 QuicStreamRequest request(factory_.get());
rtennetia75df622015-06-21 23:59:50416 int rv = request.Request(
rchf114d982015-10-21 01:34:56417 host_port_pair_, privacy_mode_, /*cert_verify_flags=*/0,
rtennetia75df622015-06-21 23:59:50418 "different.host.example.com", "GET", net_log_, callback_.callback());
bnc68d401dd2015-05-18 20:31:48419 // If server and origin have different hostnames, then handshake confirmation
420 // should be required, so Request will return asynchronously.
421 EXPECT_EQ(ERR_IO_PENDING, rv);
422 // Confirm handshake.
423 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
424 QuicSession::HANDSHAKE_CONFIRMED);
425 EXPECT_EQ(OK, callback_.WaitForResult());
426
427 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
428 EXPECT_TRUE(stream.get());
429 EXPECT_TRUE(socket_data.AllReadDataConsumed());
430 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
431}
432
rch68955482015-09-24 00:14:39433TEST_P(QuicStreamFactoryTest, GoAway) {
jri7046038f2015-10-22 00:29:26434 Initialize();
435
mmenke651bae7f2015-12-18 21:26:45436 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
437 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rch68955482015-09-24 00:14:39438 socket_factory_.AddSocketDataProvider(&socket_data);
rch68955482015-09-24 00:14:39439
jri7046038f2015-10-22 00:29:26440 QuicStreamRequest request(factory_.get());
rch68955482015-09-24 00:14:39441 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56442 request.Request(host_port_pair_, privacy_mode_,
rch68955482015-09-24 00:14:39443 /*cert_verify_flags=*/0, host_port_pair_.host(),
444 "GET", net_log_, callback_.callback()));
445
446 EXPECT_EQ(OK, callback_.WaitForResult());
447 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
448 EXPECT_TRUE(stream.get());
449
rchf114d982015-10-21 01:34:56450 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:26451 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
rch68955482015-09-24 00:14:39452
453 session->OnGoAway(QuicGoAwayFrame());
454
rchf114d982015-10-21 01:34:56455 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:26456 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
rch68955482015-09-24 00:14:39457
458 EXPECT_TRUE(socket_data.AllReadDataConsumed());
459 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
460}
461
[email protected]5db452202014-08-19 05:22:15462TEST_P(QuicStreamFactoryTest, Pooling) {
jri7046038f2015-10-22 00:29:26463 Initialize();
464
mmenke651bae7f2015-12-18 21:26:45465 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
466 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38467 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]eed749f92013-12-23 18:57:38468
[email protected]bf4ea2f2014-03-10 22:57:53469 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38470 host_resolver_.set_synchronous_mode(true);
rjshaded5ced072015-12-18 19:26:02471 host_resolver_.rules()->AddIPLiteralRule(kDefaultServerHostName,
472 "192.168.0.1", "");
473 host_resolver_.rules()->AddIPLiteralRule("mail.google.com", "192.168.0.1",
474 "");
[email protected]eed749f92013-12-23 18:57:38475
jri7046038f2015-10-22 00:29:26476 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56477 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50478 /*cert_verify_flags=*/0, host_port_pair_.host(),
479 "GET", net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38480 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
481 EXPECT_TRUE(stream.get());
482
483 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26484 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56485 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50486 /*cert_verify_flags=*/0, server2.host(), "GET",
487 net_log_, callback.callback()));
[email protected]eed749f92013-12-23 18:57:38488 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
489 EXPECT_TRUE(stream2.get());
490
jri7046038f2015-10-22 00:29:26491 EXPECT_EQ(
492 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_),
493 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38494
rch37de576c2015-05-17 20:28:17495 EXPECT_TRUE(socket_data.AllReadDataConsumed());
496 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38497}
498
jri584002d12014-09-09 00:51:28499TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) {
jri7046038f2015-10-22 00:29:26500 disable_connection_pooling_ = true;
501 Initialize();
502
mmenke651bae7f2015-12-18 21:26:45503 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
504 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
505 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28506 socket_factory_.AddSocketDataProvider(&socket_data1);
507 socket_factory_.AddSocketDataProvider(&socket_data2);
jri584002d12014-09-09 00:51:28508
509 HostPortPair server2("mail.google.com", kDefaultServerPort);
510 host_resolver_.set_synchronous_mode(true);
rjshaded5ced072015-12-18 19:26:02511 host_resolver_.rules()->AddIPLiteralRule(kDefaultServerHostName,
512 "192.168.0.1", "");
513 host_resolver_.rules()->AddIPLiteralRule("mail.google.com", "192.168.0.1",
514 "");
jri584002d12014-09-09 00:51:28515
jri7046038f2015-10-22 00:29:26516 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56517 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50518 /*cert_verify_flags=*/0, host_port_pair_.host(),
519 "GET", net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28520 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
521 EXPECT_TRUE(stream.get());
522
523 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26524 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56525 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50526 /*cert_verify_flags=*/0, server2.host(), "GET",
527 net_log_, callback.callback()));
jri584002d12014-09-09 00:51:28528 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
529 EXPECT_TRUE(stream2.get());
530
jri7046038f2015-10-22 00:29:26531 EXPECT_NE(
532 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_),
533 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
jri584002d12014-09-09 00:51:28534
rch37de576c2015-05-17 20:28:17535 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
536 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
537 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
538 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28539}
540
[email protected]eed749f92013-12-23 18:57:38541TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
jri7046038f2015-10-22 00:29:26542 Initialize();
543
mmenke651bae7f2015-12-18 21:26:45544 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
545 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
546 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38547 socket_factory_.AddSocketDataProvider(&socket_data1);
548 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]eed749f92013-12-23 18:57:38549
[email protected]bf4ea2f2014-03-10 22:57:53550 HostPortPair server2("mail.google.com", kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38551 host_resolver_.set_synchronous_mode(true);
rjshaded5ced072015-12-18 19:26:02552 host_resolver_.rules()->AddIPLiteralRule(kDefaultServerHostName,
553 "192.168.0.1", "");
554 host_resolver_.rules()->AddIPLiteralRule("mail.google.com", "192.168.0.1",
555 "");
[email protected]eed749f92013-12-23 18:57:38556
jri7046038f2015-10-22 00:29:26557 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56558 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50559 /*cert_verify_flags=*/0, host_port_pair_.host(),
560 "GET", net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38561 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
562 EXPECT_TRUE(stream.get());
563
564 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26565 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56566 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50567 /*cert_verify_flags=*/0, server2.host(), "GET",
568 net_log_, callback.callback()));
[email protected]eed749f92013-12-23 18:57:38569 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
570 EXPECT_TRUE(stream2.get());
571
jri7046038f2015-10-22 00:29:26572 factory_->OnSessionGoingAway(
573 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_));
rchf114d982015-10-21 01:34:56574 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:26575 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
576 EXPECT_FALSE(
577 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38578
579 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:26580 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:56581 EXPECT_EQ(OK, request3.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50582 /*cert_verify_flags=*/0, server2.host(), "GET",
583 net_log_, callback3.callback()));
[email protected]eed749f92013-12-23 18:57:38584 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
585 EXPECT_TRUE(stream3.get());
586
jri7046038f2015-10-22 00:29:26587 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38588
rch37de576c2015-05-17 20:28:17589 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
590 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
591 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
592 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38593}
594
[email protected]5db452202014-08-19 05:22:15595TEST_P(QuicStreamFactoryTest, HttpsPooling) {
jri7046038f2015-10-22 00:29:26596 Initialize();
mmenke651bae7f2015-12-18 21:26:45597 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
598 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38599 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]eed749f92013-12-23 18:57:38600
[email protected]bf4ea2f2014-03-10 22:57:53601 HostPortPair server1("www.example.org", 443);
602 HostPortPair server2("mail.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38603
bncf8bf0722015-05-19 20:04:13604 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01605 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38606
607 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53608 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
609 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38610
jri7046038f2015-10-22 00:29:26611 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56612 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
rtennetia75df622015-06-21 23:59:50613 /*cert_verify_flags=*/0, server1.host(), "GET",
614 net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38615 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
616 EXPECT_TRUE(stream.get());
617
618 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26619 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56620 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50621 /*cert_verify_flags=*/0, server2.host(), "GET",
622 net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38623 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
624 EXPECT_TRUE(stream2.get());
625
jri7046038f2015-10-22 00:29:26626 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
627 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38628
rch37de576c2015-05-17 20:28:17629 EXPECT_TRUE(socket_data.AllReadDataConsumed());
630 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38631}
632
jri584002d12014-09-09 00:51:28633TEST_P(QuicStreamFactoryTest, NoHttpsPoolingIfDisabled) {
jri7046038f2015-10-22 00:29:26634 disable_connection_pooling_ = true;
635 Initialize();
636
mmenke651bae7f2015-12-18 21:26:45637 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
638 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
639 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28640 socket_factory_.AddSocketDataProvider(&socket_data1);
641 socket_factory_.AddSocketDataProvider(&socket_data2);
jri584002d12014-09-09 00:51:28642
643 HostPortPair server1("www.example.org", 443);
644 HostPortPair server2("mail.example.org", 443);
645
bncf8bf0722015-05-19 20:04:13646 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01647 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28648
649 host_resolver_.set_synchronous_mode(true);
650 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
651 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
652
jri7046038f2015-10-22 00:29:26653 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56654 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
rtennetia75df622015-06-21 23:59:50655 /*cert_verify_flags=*/0, server1.host(), "GET",
656 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28657 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
658 EXPECT_TRUE(stream.get());
659
660 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26661 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56662 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50663 /*cert_verify_flags=*/0, server2.host(), "GET",
664 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28665 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
666 EXPECT_TRUE(stream2.get());
667
jri7046038f2015-10-22 00:29:26668 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
669 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
jri584002d12014-09-09 00:51:28670
rch37de576c2015-05-17 20:28:17671 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
672 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
673 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
674 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28675}
676
bnccb7ff3c2015-05-21 20:51:55677class QuicAlternativeServiceCertificateValidationPooling
678 : public QuicStreamFactoryTest {
679 public:
680 void Run(bool valid) {
mmenke651bae7f2015-12-18 21:26:45681 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
682 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
bnccb7ff3c2015-05-21 20:51:55683 socket_factory_.AddSocketDataProvider(&socket_data1);
[email protected]eed749f92013-12-23 18:57:38684
bnccb7ff3c2015-05-21 20:51:55685 HostPortPair server1("www.example.org", 443);
686 HostPortPair server2("mail.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38687
bnccb7ff3c2015-05-21 20:51:55688 std::string origin_host(valid ? "mail.example.org" : "invalid.example.org");
689 HostPortPair alternative("www.example.org", 443);
[email protected]eed749f92013-12-23 18:57:38690
bnccb7ff3c2015-05-21 20:51:55691 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
692 bool common_name_fallback_used;
693 EXPECT_EQ(valid,
694 verify_details.cert_verify_result.verified_cert->VerifyNameMatch(
695 origin_host, &common_name_fallback_used));
696 EXPECT_TRUE(
697 verify_details.cert_verify_result.verified_cert->VerifyNameMatch(
698 alternative.host(), &common_name_fallback_used));
699 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38700
bnccb7ff3c2015-05-21 20:51:55701 host_resolver_.set_synchronous_mode(true);
702 host_resolver_.rules()->AddIPLiteralRule(alternative.host(), "192.168.0.1",
703 "");
[email protected]eed749f92013-12-23 18:57:38704
bnccb7ff3c2015-05-21 20:51:55705 // Open first stream to alternative.
jri7046038f2015-10-22 00:29:26706 QuicStreamRequest request1(factory_.get());
rchf114d982015-10-21 01:34:56707 EXPECT_EQ(OK, request1.Request(alternative, privacy_mode_,
rtennetia75df622015-06-21 23:59:50708 /*cert_verify_flags=*/0, alternative.host(),
709 "GET", net_log_, callback_.callback()));
bnccb7ff3c2015-05-21 20:51:55710 scoped_ptr<QuicHttpStream> stream1 = request1.ReleaseStream();
711 EXPECT_TRUE(stream1.get());
[email protected]eed749f92013-12-23 18:57:38712
jri7046038f2015-10-22 00:29:26713 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56714 int rv = request2.Request(alternative, privacy_mode_,
rtennetia75df622015-06-21 23:59:50715 /*cert_verify_flags=*/0, origin_host, "GET",
716 net_log_, callback_.callback());
bnccb7ff3c2015-05-21 20:51:55717 if (valid) {
718 // Alternative service of origin to |alternative| should pool to session
719 // of |stream1| even if origin is different. Since only one
720 // SocketDataProvider is set up, the second request succeeding means that
721 // it pooled to the session opened by the first one.
722 EXPECT_EQ(OK, rv);
723 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
724 EXPECT_TRUE(stream2.get());
725 } else {
726 EXPECT_EQ(ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN, rv);
727 }
[email protected]eed749f92013-12-23 18:57:38728
bnccb7ff3c2015-05-21 20:51:55729 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
730 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
731 }
732};
733
734INSTANTIATE_TEST_CASE_P(Version,
735 QuicAlternativeServiceCertificateValidationPooling,
736 ::testing::ValuesIn(GetTestParams()));
737
738TEST_P(QuicAlternativeServiceCertificateValidationPooling, Valid) {
jri7046038f2015-10-22 00:29:26739 Initialize();
bnccb7ff3c2015-05-21 20:51:55740 Run(true);
741}
742
743TEST_P(QuicAlternativeServiceCertificateValidationPooling, Invalid) {
jri7046038f2015-10-22 00:29:26744 Initialize();
bnccb7ff3c2015-05-21 20:51:55745 Run(false);
[email protected]eed749f92013-12-23 18:57:38746}
747
[email protected]5db452202014-08-19 05:22:15748TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
jri7046038f2015-10-22 00:29:26749 Initialize();
mmenke651bae7f2015-12-18 21:26:45750 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
751 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15752 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]5db452202014-08-19 05:22:15753
754 HostPortPair server1("www.example.org", 443);
755 HostPortPair server2("mail.example.org", 443);
Avi Drissman13fc8932015-12-20 04:40:46756 uint8_t primary_pin = 1;
757 uint8_t backup_pin = 2;
[email protected]5db452202014-08-19 05:22:15758 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
759 backup_pin);
760
bncf8bf0722015-05-19 20:04:13761 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
[email protected]5db452202014-08-19 05:22:15762 verify_details.cert_verify_result.public_key_hashes.push_back(
763 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01764 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]5db452202014-08-19 05:22:15765
766 host_resolver_.set_synchronous_mode(true);
767 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
768 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
769
jri7046038f2015-10-22 00:29:26770 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56771 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
rtennetia75df622015-06-21 23:59:50772 /*cert_verify_flags=*/0, server1.host(), "GET",
773 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15774 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
775 EXPECT_TRUE(stream.get());
776
777 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26778 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56779 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50780 /*cert_verify_flags=*/0, server2.host(), "GET",
781 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15782 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
783 EXPECT_TRUE(stream2.get());
784
jri7046038f2015-10-22 00:29:26785 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
786 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]5db452202014-08-19 05:22:15787
rch37de576c2015-05-17 20:28:17788 EXPECT_TRUE(socket_data.AllReadDataConsumed());
789 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:15790}
791
jri584002d12014-09-09 00:51:28792TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithMatchingPinsIfDisabled) {
jri7046038f2015-10-22 00:29:26793 disable_connection_pooling_ = true;
794 Initialize();
795
mmenke651bae7f2015-12-18 21:26:45796 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
797 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
798 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28799 socket_factory_.AddSocketDataProvider(&socket_data1);
800 socket_factory_.AddSocketDataProvider(&socket_data2);
jri584002d12014-09-09 00:51:28801
802 HostPortPair server1("www.example.org", 443);
803 HostPortPair server2("mail.example.org", 443);
Avi Drissman13fc8932015-12-20 04:40:46804 uint8_t primary_pin = 1;
805 uint8_t backup_pin = 2;
jri584002d12014-09-09 00:51:28806 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
807 backup_pin);
808
bncf8bf0722015-05-19 20:04:13809 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
jri584002d12014-09-09 00:51:28810 verify_details.cert_verify_result.public_key_hashes.push_back(
811 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01812 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28813
814 host_resolver_.set_synchronous_mode(true);
815 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
816 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
817
jri7046038f2015-10-22 00:29:26818 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56819 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
rtennetia75df622015-06-21 23:59:50820 /*cert_verify_flags=*/0, server1.host(), "GET",
821 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28822 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
823 EXPECT_TRUE(stream.get());
824
825 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26826 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56827 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50828 /*cert_verify_flags=*/0, server2.host(), "GET",
829 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28830 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
831 EXPECT_TRUE(stream2.get());
832
jri7046038f2015-10-22 00:29:26833 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
834 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
jri584002d12014-09-09 00:51:28835
rch37de576c2015-05-17 20:28:17836 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
837 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
838 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
839 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28840}
841
[email protected]5db452202014-08-19 05:22:15842TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
jri7046038f2015-10-22 00:29:26843 Initialize();
mmenke651bae7f2015-12-18 21:26:45844 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
845 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
846 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15847 socket_factory_.AddSocketDataProvider(&socket_data1);
848 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]5db452202014-08-19 05:22:15849
850 HostPortPair server1("www.example.org", 443);
851 HostPortPair server2("mail.example.org", 443);
Avi Drissman13fc8932015-12-20 04:40:46852 uint8_t primary_pin = 1;
853 uint8_t backup_pin = 2;
854 uint8_t bad_pin = 3;
[email protected]5db452202014-08-19 05:22:15855 test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
856 backup_pin);
857
bncf8bf0722015-05-19 20:04:13858 ProofVerifyDetailsChromium verify_details1 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01859 verify_details1.cert_verify_result.public_key_hashes.push_back(
860 test::GetTestHashValue(bad_pin));
861 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
862
bncf8bf0722015-05-19 20:04:13863 ProofVerifyDetailsChromium verify_details2 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01864 verify_details2.cert_verify_result.public_key_hashes.push_back(
865 test::GetTestHashValue(primary_pin));
866 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
[email protected]5db452202014-08-19 05:22:15867
868 host_resolver_.set_synchronous_mode(true);
869 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
870 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
871
jri7046038f2015-10-22 00:29:26872 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56873 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
rtennetia75df622015-06-21 23:59:50874 /*cert_verify_flags=*/0, server1.host(), "GET",
875 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15876 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
877 EXPECT_TRUE(stream.get());
878
879 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26880 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56881 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50882 /*cert_verify_flags=*/0, server2.host(), "GET",
883 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15884 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
885 EXPECT_TRUE(stream2.get());
886
jri7046038f2015-10-22 00:29:26887 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
888 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]5db452202014-08-19 05:22:15889
rch37de576c2015-05-17 20:28:17890 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
891 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
892 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
893 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:15894}
895
[email protected]1e960032013-12-20 19:00:20896TEST_P(QuicStreamFactoryTest, Goaway) {
jri7046038f2015-10-22 00:29:26897 Initialize();
mmenke651bae7f2015-12-18 21:26:45898 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
899 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:27900 socket_factory_.AddSocketDataProvider(&socket_data);
mmenke651bae7f2015-12-18 21:26:45901 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:27902 socket_factory_.AddSocketDataProvider(&socket_data2);
903
jri7046038f2015-10-22 00:29:26904 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:59905 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56906 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50907 /*cert_verify_flags=*/0, host_port_pair_.host(),
908 "GET", net_log_, callback_.callback()));
[email protected]4d283b32013-10-17 12:57:27909
910 EXPECT_EQ(OK, callback_.WaitForResult());
911 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
912 EXPECT_TRUE(stream.get());
913
914 // Mark the session as going away. Ensure that while it is still alive
915 // that it is no longer active.
rchf114d982015-10-21 01:34:56916 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:26917 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
918 factory_->OnSessionGoingAway(session);
919 EXPECT_EQ(true,
920 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
rchf114d982015-10-21 01:34:56921 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:26922 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
bnccb7ff3c2015-05-21 20:51:55923 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]4d283b32013-10-17 12:57:27924
925 // Create a new request for the same destination and verify that a
926 // new session is created.
jri7046038f2015-10-22 00:29:26927 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:59928 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56929 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50930 /*cert_verify_flags=*/0, host_port_pair_.host(),
931 "GET", net_log_, callback_.callback()));
[email protected]4d283b32013-10-17 12:57:27932 EXPECT_EQ(OK, callback_.WaitForResult());
933 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
934 EXPECT_TRUE(stream2.get());
935
rchf114d982015-10-21 01:34:56936 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:26937 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
938 EXPECT_NE(session, QuicStreamFactoryPeer::GetActiveSession(factory_.get(),
rchf114d982015-10-21 01:34:56939 host_port_pair_));
jri7046038f2015-10-22 00:29:26940 EXPECT_EQ(true,
941 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
[email protected]4d283b32013-10-17 12:57:27942
943 stream2.reset();
944 stream.reset();
945
rch37de576c2015-05-17 20:28:17946 EXPECT_TRUE(socket_data.AllReadDataConsumed());
947 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
948 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
949 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]4d283b32013-10-17 12:57:27950}
951
[email protected]1e960032013-12-20 19:00:20952TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
jri7046038f2015-10-22 00:29:26953 Initialize();
[email protected]66ae5962014-05-22 11:13:05954 QuicStreamId stream_id = kClientDataStreamId1;
ckrasicea295fe2015-10-31 05:03:27955 scoped_ptr<QuicEncryptedPacket> client_rst(
[email protected]1e960032013-12-20 19:00:20956 maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
[email protected]06ff5152013-08-29 01:03:05957 MockWrite writes[] = {
ckrasicea295fe2015-10-31 05:03:27958 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 0),
959 };
960 scoped_ptr<QuicEncryptedPacket> server_rst(
961 maker_.MakeRstPacket(1, false, stream_id, QUIC_STREAM_CANCELLED));
962 MockRead reads[] = {
963 MockRead(ASYNC, server_rst->data(), server_rst->length(), 1),
mmenke651bae7f2015-12-18 21:26:45964 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
965 SequencedSocketData socket_data(reads, arraysize(reads), writes,
966 arraysize(writes));
[email protected]0b2294d32013-08-02 00:46:36967 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0b2294d32013-08-02 00:46:36968
969 HttpRequestInfo request_info;
970 std::vector<QuicHttpStream*> streams;
971 // The MockCryptoClientStream sets max_open_streams to be
rtenneti6a4cf3b2015-01-09 03:41:15972 // kDefaultMaxStreamsPerConnection / 2.
973 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection / 2; i++) {
jri7046038f2015-10-22 00:29:26974 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56975 int rv = request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50976 /*cert_verify_flags=*/0, host_port_pair_.host(),
977 "GET", net_log_, callback_.callback());
[email protected]0b2294d32013-08-02 00:46:36978 if (i == 0) {
979 EXPECT_EQ(ERR_IO_PENDING, rv);
980 EXPECT_EQ(OK, callback_.WaitForResult());
981 } else {
982 EXPECT_EQ(OK, rv);
983 }
984 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
985 EXPECT_TRUE(stream);
rjshaded5ced072015-12-18 19:26:02986 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
987 net_log_, CompletionCallback()));
[email protected]0b2294d32013-08-02 00:46:36988 streams.push_back(stream.release());
989 }
990
jri7046038f2015-10-22 00:29:26991 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56992 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50993 /*cert_verify_flags=*/0, host_port_pair_.host(),
994 "GET", net_log_, CompletionCallback()));
[email protected]0b2294d32013-08-02 00:46:36995 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
996 EXPECT_TRUE(stream);
rjshaded5ced072015-12-18 19:26:02997 EXPECT_EQ(ERR_IO_PENDING,
998 stream->InitializeStream(&request_info, DEFAULT_PRIORITY, net_log_,
999 callback_.callback()));
[email protected]0b2294d32013-08-02 00:46:361000
1001 // Close the first stream.
1002 streams.front()->Close(false);
ckrasicea295fe2015-10-31 05:03:271003 // Trigger exchange of RSTs that in turn allow progress for the last
1004 // stream.
[email protected]0b2294d32013-08-02 00:46:361005 EXPECT_EQ(OK, callback_.WaitForResult());
1006
rch37de576c2015-05-17 20:28:171007 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1008 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
ckrasicea295fe2015-10-31 05:03:271009
1010 // Force close of the connection to suppress the generation of RST
1011 // packets when streams are torn down, which wouldn't be relevant to
1012 // this test anyway.
1013 QuicChromiumClientSession* session =
1014 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1015 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
1016
[email protected]0b2294d32013-08-02 00:46:361017 STLDeleteElements(&streams);
1018}
1019
[email protected]1e960032013-12-20 19:00:201020TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
jri7046038f2015-10-22 00:29:261021 Initialize();
mmenke651bae7f2015-12-18 21:26:451022 SequencedSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321023 socket_factory_.AddSocketDataProvider(&socket_data);
1024
[email protected]3c772402013-12-18 21:38:111025 host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName);
[email protected]e13201d82012-12-12 05:00:321026
jri7046038f2015-10-22 00:29:261027 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591028 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561029 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501030 /*cert_verify_flags=*/0, host_port_pair_.host(),
1031 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321032
1033 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
1034
rch37de576c2015-05-17 20:28:171035 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1036 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321037}
1038
[email protected]1e960032013-12-20 19:00:201039TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
jri7046038f2015-10-22 00:29:261040 Initialize();
[email protected]3c772402013-12-18 21:38:111041 MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
mmenke651bae7f2015-12-18 21:26:451042 SequencedSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]3c772402013-12-18 21:38:111043 socket_data.set_connect_data(connect);
1044 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]3c772402013-12-18 21:38:111045
jri7046038f2015-10-22 00:29:261046 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591047 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561048 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501049 /*cert_verify_flags=*/0, host_port_pair_.host(),
1050 "GET", net_log_, callback_.callback()));
[email protected]3c772402013-12-18 21:38:111051
1052 EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult());
1053
rch37de576c2015-05-17 20:28:171054 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1055 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:111056}
1057
[email protected]1e960032013-12-20 19:00:201058TEST_P(QuicStreamFactoryTest, CancelCreate) {
jri7046038f2015-10-22 00:29:261059 Initialize();
mmenke651bae7f2015-12-18 21:26:451060 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1061 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321062 socket_factory_.AddSocketDataProvider(&socket_data);
1063 {
jri7046038f2015-10-22 00:29:261064 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591065 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561066 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501067 /*cert_verify_flags=*/0, host_port_pair_.host(),
1068 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321069 }
1070
mmenke651bae7f2015-12-18 21:26:451071 base::RunLoop().RunUntilIdle();
[email protected]e13201d82012-12-12 05:00:321072
bnccb7ff3c2015-05-21 20:51:551073 scoped_ptr<QuicHttpStream> stream(CreateFromSession(host_port_pair_));
[email protected]e13201d82012-12-12 05:00:321074 EXPECT_TRUE(stream.get());
1075 stream.reset();
1076
rch37de576c2015-05-17 20:28:171077 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1078 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321079}
1080
[email protected]1e960032013-12-20 19:00:201081TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) {
jri7046038f2015-10-22 00:29:261082 Initialize();
1083
[email protected]3c772402013-12-18 21:38:111084 // Sequentially connect to the default host, then another host, and then the
1085 // default host. Verify that the default host gets a consistent ephemeral
1086 // port, that is different from the other host's connection.
1087
1088 std::string other_server_name = "other.google.com";
1089 EXPECT_NE(kDefaultServerHostName, other_server_name);
1090 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort);
[email protected]3c772402013-12-18 21:38:111091
[email protected]bf4ea2f2014-03-10 22:57:531092 int original_port = GetSourcePortForNewSession(host_port_pair_);
1093 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2));
1094 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]3c772402013-12-18 21:38:111095}
1096
[email protected]d8e2abf82014-03-06 10:30:101097TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) {
jri7046038f2015-10-22 00:29:261098 Initialize();
1099
[email protected]d8e2abf82014-03-06 10:30:101100 // Get a session to the host using the port suggester.
rjshaded5ced072015-12-18 19:26:021101 int original_port = GetSourcePortForNewSessionAndGoAway(host_port_pair_);
[email protected]d8e2abf82014-03-06 10:30:101102 // Verify that the port is different after the goaway.
[email protected]bf4ea2f2014-03-10 22:57:531103 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101104 // Since the previous session did not goaway we should see the original port.
[email protected]bf4ea2f2014-03-10 22:57:531105 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101106}
1107
[email protected]1e960032013-12-20 19:00:201108TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
jri7046038f2015-10-22 00:29:261109 Initialize();
mmenke651bae7f2015-12-18 21:26:451110 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
[email protected]459a7402014-02-10 12:58:521111 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1112 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311113 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:451114 SequencedSocketData socket_data(reads, arraysize(reads),
1115 writes.empty() ? nullptr : &writes[0],
1116 writes.size());
[email protected]56dfb902013-01-03 23:17:551117 socket_factory_.AddSocketDataProvider(&socket_data);
1118
mmenke651bae7f2015-12-18 21:26:451119 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1120 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]56dfb902013-01-03 23:17:551121 socket_factory_.AddSocketDataProvider(&socket_data2);
1122
jri7046038f2015-10-22 00:29:261123 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591124 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561125 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501126 /*cert_verify_flags=*/0, host_port_pair_.host(),
1127 "GET", net_log_, callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551128
1129 EXPECT_EQ(OK, callback_.WaitForResult());
1130 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361131 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:021132 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]0b2294d32013-08-02 00:46:361133 net_log_, CompletionCallback()));
[email protected]56dfb902013-01-03 23:17:551134
1135 // Close the session and verify that stream saw the error.
jri7046038f2015-10-22 00:29:261136 factory_->CloseAllSessions(ERR_INTERNET_DISCONNECTED);
[email protected]56dfb902013-01-03 23:17:551137 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1138 stream->ReadResponseHeaders(callback_.callback()));
1139
1140 // Now attempting to request a stream to the same origin should create
1141 // a new session.
1142
jri7046038f2015-10-22 00:29:261143 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591144 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561145 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501146 /*cert_verify_flags=*/0, host_port_pair_.host(),
1147 "GET", net_log_, callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551148
1149 EXPECT_EQ(OK, callback_.WaitForResult());
1150 stream = request2.ReleaseStream();
1151 stream.reset(); // Will reset stream 3.
1152
rch37de576c2015-05-17 20:28:171153 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1154 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1155 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1156 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]56dfb902013-01-03 23:17:551157}
1158
[email protected]1e960032013-12-20 19:00:201159TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
jri8c44d692015-10-23 23:53:411160 close_sessions_on_ip_change_ = true;
jri7046038f2015-10-22 00:29:261161 Initialize();
jri8c44d692015-10-23 23:53:411162
mmenke651bae7f2015-12-18 21:26:451163 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
[email protected]459a7402014-02-10 12:58:521164 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1165 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311166 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:451167 SequencedSocketData socket_data(reads, arraysize(reads),
1168 writes.empty() ? nullptr : &writes[0],
1169 writes.size());
[email protected]f698a012013-05-06 20:18:591170 socket_factory_.AddSocketDataProvider(&socket_data);
1171
mmenke651bae7f2015-12-18 21:26:451172 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1173 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]f698a012013-05-06 20:18:591174 socket_factory_.AddSocketDataProvider(&socket_data2);
1175
jri7046038f2015-10-22 00:29:261176 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591177 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561178 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501179 /*cert_verify_flags=*/0, host_port_pair_.host(),
1180 "GET", net_log_, callback_.callback()));
[email protected]f698a012013-05-06 20:18:591181
1182 EXPECT_EQ(OK, callback_.WaitForResult());
1183 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361184 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:021185 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]0b2294d32013-08-02 00:46:361186 net_log_, CompletionCallback()));
[email protected]f698a012013-05-06 20:18:591187
1188 // Change the IP address and verify that stream saw the error.
jri8c44d692015-10-23 23:53:411189 NotifyIPAddressChanged();
[email protected]f698a012013-05-06 20:18:591190 EXPECT_EQ(ERR_NETWORK_CHANGED,
1191 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:261192 EXPECT_TRUE(factory_->require_confirmation());
[email protected]f698a012013-05-06 20:18:591193
1194 // Now attempting to request a stream to the same origin should create
1195 // a new session.
1196
jri7046038f2015-10-22 00:29:261197 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591198 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561199 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501200 /*cert_verify_flags=*/0, host_port_pair_.host(),
1201 "GET", net_log_, callback_.callback()));
[email protected]f698a012013-05-06 20:18:591202
1203 EXPECT_EQ(OK, callback_.WaitForResult());
1204 stream = request2.ReleaseStream();
1205 stream.reset(); // Will reset stream 3.
1206
rch37de576c2015-05-17 20:28:171207 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1208 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1209 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1210 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]f698a012013-05-06 20:18:591211}
1212
rch02d87792015-09-09 09:05:531213TEST_P(QuicStreamFactoryTest, OnSSLConfigChanged) {
jri7046038f2015-10-22 00:29:261214 Initialize();
mmenke651bae7f2015-12-18 21:26:451215 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
rch02d87792015-09-09 09:05:531216 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1217 std::vector<MockWrite> writes;
1218 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:451219 SequencedSocketData socket_data(reads, arraysize(reads),
1220 writes.empty() ? nullptr : &writes[0],
1221 writes.size());
rch02d87792015-09-09 09:05:531222 socket_factory_.AddSocketDataProvider(&socket_data);
rch02d87792015-09-09 09:05:531223
mmenke651bae7f2015-12-18 21:26:451224 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1225 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
rch02d87792015-09-09 09:05:531226 socket_factory_.AddSocketDataProvider(&socket_data2);
rch02d87792015-09-09 09:05:531227
jri7046038f2015-10-22 00:29:261228 QuicStreamRequest request(factory_.get());
rch02d87792015-09-09 09:05:531229 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561230 request.Request(host_port_pair_, privacy_mode_,
rch02d87792015-09-09 09:05:531231 /*cert_verify_flags=*/0, host_port_pair_.host(),
1232 "GET", net_log_, callback_.callback()));
1233
1234 EXPECT_EQ(OK, callback_.WaitForResult());
1235 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1236 HttpRequestInfo request_info;
1237 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1238 net_log_, CompletionCallback()));
1239
jri7046038f2015-10-22 00:29:261240 factory_->OnSSLConfigChanged();
rch02d87792015-09-09 09:05:531241 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1242 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:261243 EXPECT_FALSE(factory_->require_confirmation());
rch02d87792015-09-09 09:05:531244
1245 // Now attempting to request a stream to the same origin should create
1246 // a new session.
1247
jri7046038f2015-10-22 00:29:261248 QuicStreamRequest request2(factory_.get());
rch02d87792015-09-09 09:05:531249 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561250 request2.Request(host_port_pair_, privacy_mode_,
rch02d87792015-09-09 09:05:531251 /*cert_verify_flags=*/0, host_port_pair_.host(),
1252 "GET", net_log_, callback_.callback()));
1253
1254 EXPECT_EQ(OK, callback_.WaitForResult());
1255 stream = request2.ReleaseStream();
1256 stream.reset(); // Will reset stream 3.
1257
1258 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1259 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1260 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1261 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1262}
1263
[email protected]1e960032013-12-20 19:00:201264TEST_P(QuicStreamFactoryTest, OnCertAdded) {
jri7046038f2015-10-22 00:29:261265 Initialize();
mmenke651bae7f2015-12-18 21:26:451266 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
[email protected]459a7402014-02-10 12:58:521267 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1268 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311269 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:451270 SequencedSocketData socket_data(reads, arraysize(reads),
1271 writes.empty() ? nullptr : &writes[0],
1272 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:091273 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]d7d1e50b2013-11-25 22:08:091274
mmenke651bae7f2015-12-18 21:26:451275 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1276 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:091277 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]d7d1e50b2013-11-25 22:08:091278
jri7046038f2015-10-22 00:29:261279 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591280 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561281 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501282 /*cert_verify_flags=*/0, host_port_pair_.host(),
1283 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091284
1285 EXPECT_EQ(OK, callback_.WaitForResult());
1286 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1287 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:021288 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]d7d1e50b2013-11-25 22:08:091289 net_log_, CompletionCallback()));
1290
1291 // Add a cert and verify that stream saw the event.
jri7046038f2015-10-22 00:29:261292 factory_->OnCertAdded(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:091293 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1294 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:261295 EXPECT_FALSE(factory_->require_confirmation());
[email protected]d7d1e50b2013-11-25 22:08:091296
1297 // Now attempting to request a stream to the same origin should create
1298 // a new session.
1299
jri7046038f2015-10-22 00:29:261300 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591301 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561302 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501303 /*cert_verify_flags=*/0, host_port_pair_.host(),
1304 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091305
1306 EXPECT_EQ(OK, callback_.WaitForResult());
1307 stream = request2.ReleaseStream();
1308 stream.reset(); // Will reset stream 3.
1309
rch37de576c2015-05-17 20:28:171310 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1311 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1312 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1313 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:091314}
1315
[email protected]1e960032013-12-20 19:00:201316TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
jri7046038f2015-10-22 00:29:261317 Initialize();
mmenke651bae7f2015-12-18 21:26:451318 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
[email protected]459a7402014-02-10 12:58:521319 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1320 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311321 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:451322 SequencedSocketData socket_data(reads, arraysize(reads),
1323 writes.empty() ? nullptr : &writes[0],
1324 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:091325 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]d7d1e50b2013-11-25 22:08:091326
mmenke651bae7f2015-12-18 21:26:451327 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1328 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:091329 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]d7d1e50b2013-11-25 22:08:091330
jri7046038f2015-10-22 00:29:261331 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591332 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561333 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501334 /*cert_verify_flags=*/0, host_port_pair_.host(),
1335 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091336
1337 EXPECT_EQ(OK, callback_.WaitForResult());
1338 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1339 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:021340 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]d7d1e50b2013-11-25 22:08:091341 net_log_, CompletionCallback()));
1342
1343 // Change the CA cert and verify that stream saw the event.
jri7046038f2015-10-22 00:29:261344 factory_->OnCACertChanged(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:091345 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
1346 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:261347 EXPECT_FALSE(factory_->require_confirmation());
[email protected]d7d1e50b2013-11-25 22:08:091348
1349 // Now attempting to request a stream to the same origin should create
1350 // a new session.
1351
jri7046038f2015-10-22 00:29:261352 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591353 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561354 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501355 /*cert_verify_flags=*/0, host_port_pair_.host(),
1356 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:091357
1358 EXPECT_EQ(OK, callback_.WaitForResult());
1359 stream = request2.ReleaseStream();
1360 stream.reset(); // Will reset stream 3.
1361
rch37de576c2015-05-17 20:28:171362 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1363 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1364 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1365 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:091366}
1367
[email protected]1e960032013-12-20 19:00:201368TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
jri7046038f2015-10-22 00:29:261369 Initialize();
[email protected]6e12d702013-11-13 00:17:171370 vector<string> cannoncial_suffixes;
1371 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1372 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]c49ff182013-09-28 08:33:261373
[email protected]6e12d702013-11-13 00:17:171374 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1375 string r1_host_name("r1");
1376 string r2_host_name("r2");
1377 r1_host_name.append(cannoncial_suffixes[i]);
1378 r2_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141379
[email protected]bf4ea2f2014-03-10 22:57:531380 HostPortPair host_port_pair1(r1_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121381 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:261382 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rch1fe2eeb2015-10-26 14:45:571383 QuicServerId server_id1(host_port_pair1, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171384 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371385 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171386 EXPECT_FALSE(cached1->proof_valid());
1387 EXPECT_TRUE(cached1->source_address_token().empty());
1388
1389 // Mutate the cached1 to have different data.
1390 // TODO(rtenneti): mutate other members of CachedState.
1391 cached1->set_source_address_token(r1_host_name);
1392 cached1->SetProofValid();
1393
[email protected]bf4ea2f2014-03-10 22:57:531394 HostPortPair host_port_pair2(r2_host_name, 80);
rch1fe2eeb2015-10-26 14:45:571395 QuicServerId server_id2(host_port_pair2, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171396 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371397 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171398 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
1399 EXPECT_TRUE(cached2->proof_valid());
1400 }
[email protected]b70fdb792013-10-25 19:04:141401}
1402
[email protected]1e960032013-12-20 19:00:201403TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
jri7046038f2015-10-22 00:29:261404 Initialize();
[email protected]6e12d702013-11-13 00:17:171405 vector<string> cannoncial_suffixes;
1406 cannoncial_suffixes.push_back(string(".c.youtube.com"));
1407 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]b70fdb792013-10-25 19:04:141408
[email protected]6e12d702013-11-13 00:17:171409 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
1410 string r3_host_name("r3");
1411 string r4_host_name("r4");
1412 r3_host_name.append(cannoncial_suffixes[i]);
1413 r4_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:141414
[email protected]bf4ea2f2014-03-10 22:57:531415 HostPortPair host_port_pair1(r3_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:121416 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:261417 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rch1fe2eeb2015-10-26 14:45:571418 QuicServerId server_id1(host_port_pair1, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171419 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:371420 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:171421 EXPECT_FALSE(cached1->proof_valid());
1422 EXPECT_TRUE(cached1->source_address_token().empty());
1423
1424 // Mutate the cached1 to have different data.
1425 // TODO(rtenneti): mutate other members of CachedState.
1426 cached1->set_source_address_token(r3_host_name);
1427 cached1->SetProofInvalid();
1428
[email protected]bf4ea2f2014-03-10 22:57:531429 HostPortPair host_port_pair2(r4_host_name, 80);
rch1fe2eeb2015-10-26 14:45:571430 QuicServerId server_id2(host_port_pair2, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:171431 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:371432 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:171433 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
1434 EXPECT_TRUE(cached2->source_address_token().empty());
1435 EXPECT_FALSE(cached2->proof_valid());
1436 }
[email protected]c49ff182013-09-28 08:33:261437}
1438
rtenneti14abd312015-02-06 21:56:011439TEST_P(QuicStreamFactoryTest, RacingConnections) {
jri7046038f2015-10-22 00:29:261440 disable_disk_cache_ = false;
1441 Initialize();
1442
rtenneti14abd312015-02-06 21:56:011443 if (!GetParam().enable_connection_racing)
1444 return;
jri7046038f2015-10-22 00:29:261445
1446 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneticcab42b2015-10-09 06:38:161447
mmenke651bae7f2015-12-18 21:26:451448 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1449 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti14abd312015-02-06 21:56:011450 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti14abd312015-02-06 21:56:011451
mmenke651bae7f2015-12-18 21:26:451452 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1453 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
rtenneti14abd312015-02-06 21:56:011454 socket_factory_.AddSocketDataProvider(&socket_data2);
rtenneti14abd312015-02-06 21:56:011455
rtenneticcab42b2015-10-09 06:38:161456 const AlternativeService alternative_service1(QUIC, host_port_pair_.host(),
1457 host_port_pair_.port());
1458 AlternativeServiceInfoVector alternative_service_info_vector;
1459 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1460 alternative_service_info_vector.push_back(
1461 AlternativeServiceInfo(alternative_service1, 1.0, expiration));
1462
1463 http_server_properties_.SetAlternativeServices(
1464 host_port_pair_, alternative_service_info_vector);
1465
rtenneti14abd312015-02-06 21:56:011466 crypto_client_stream_factory_.set_handshake_mode(
1467 MockCryptoClientStream::ZERO_RTT);
1468 host_resolver_.set_synchronous_mode(true);
1469 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1470 "192.168.0.1", "");
1471
jri7046038f2015-10-22 00:29:261472 QuicStreamRequest request(factory_.get());
rch1fe2eeb2015-10-26 14:45:571473 QuicServerId server_id(host_port_pair_, privacy_mode_);
rtenneti14abd312015-02-06 21:56:011474 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561475 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501476 /*cert_verify_flags=*/0, host_port_pair_.host(),
1477 "GET", net_log_, callback_.callback()));
jri7046038f2015-10-22 00:29:261478 EXPECT_EQ(2u, QuicStreamFactoryPeer::GetNumberOfActiveJobs(factory_.get(),
1479 server_id));
rtenneti14abd312015-02-06 21:56:011480
1481 runner_->RunNextTask();
1482
1483 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1484 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:171485 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1486 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
jri7046038f2015-10-22 00:29:261487 EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumberOfActiveJobs(factory_.get(),
1488 server_id));
rtenneti14abd312015-02-06 21:56:011489}
1490
rtenneti34dffe752015-02-24 23:27:321491TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) {
jri7046038f2015-10-22 00:29:261492 disable_disk_cache_ = true;
1493 Initialize();
1494 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti34dffe752015-02-24 23:27:321495
mmenke651bae7f2015-12-18 21:26:451496 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1497 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti34dffe752015-02-24 23:27:321498 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti34dffe752015-02-24 23:27:321499
1500 crypto_client_stream_factory_.set_handshake_mode(
1501 MockCryptoClientStream::ZERO_RTT);
1502 host_resolver_.set_synchronous_mode(true);
1503 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1504 "192.168.0.1", "");
1505
jri7046038f2015-10-22 00:29:261506 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561507 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501508 /*cert_verify_flags=*/0, host_port_pair_.host(),
1509 "GET", net_log_, callback_.callback()));
rtenneti34dffe752015-02-24 23:27:321510
1511 // If we are waiting for disk cache, we would have posted a task. Verify that
1512 // the CancelWaitForDataReady task hasn't been posted.
1513 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
1514
1515 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1516 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:171517 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1518 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti34dffe752015-02-24 23:27:321519}
1520
rtenneti85dcfac22015-03-27 20:22:191521TEST_P(QuicStreamFactoryTest, BadPacketLoss) {
jri7046038f2015-10-22 00:29:261522 disable_disk_cache_ = false;
1523 max_number_of_lossy_connections_ = 2;
1524 Initialize();
1525 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
1526
1527 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1528 host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:191529 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261530 factory_.get(), host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:191531
mmenke651bae7f2015-12-18 21:26:451532 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1533 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:191534 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti85dcfac22015-03-27 20:22:191535
mmenke651bae7f2015-12-18 21:26:451536 SequencedSocketData socket_data2(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:191537 socket_factory_.AddSocketDataProvider(&socket_data2);
rtenneti85dcfac22015-03-27 20:22:191538
mmenke651bae7f2015-12-18 21:26:451539 SequencedSocketData socket_data3(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:191540 socket_factory_.AddSocketDataProvider(&socket_data3);
rtenneti85dcfac22015-03-27 20:22:191541
mmenke651bae7f2015-12-18 21:26:451542 SequencedSocketData socket_data4(nullptr, 0, nullptr, 0);
rtenneti97137a92015-06-18 06:00:311543 socket_factory_.AddSocketDataProvider(&socket_data4);
rtenneti97137a92015-06-18 06:00:311544
rtenneti85dcfac22015-03-27 20:22:191545 HostPortPair server2("mail.example.org", kDefaultServerPort);
1546 HostPortPair server3("docs.example.org", kDefaultServerPort);
rtenneti97137a92015-06-18 06:00:311547 HostPortPair server4("images.example.org", kDefaultServerPort);
rtenneti85dcfac22015-03-27 20:22:191548
1549 crypto_client_stream_factory_.set_handshake_mode(
1550 MockCryptoClientStream::ZERO_RTT);
1551 host_resolver_.set_synchronous_mode(true);
1552 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1553 "192.168.0.1", "");
1554 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1555 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
rtenneti97137a92015-06-18 06:00:311556 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
rtenneti85dcfac22015-03-27 20:22:191557
jri7046038f2015-10-22 00:29:261558 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561559 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501560 /*cert_verify_flags=*/0, host_port_pair_.host(),
1561 "GET", net_log_, callback_.callback()));
rtenneti85dcfac22015-03-27 20:22:191562
rchf114d982015-10-21 01:34:561563 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:261564 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
rtenneti85dcfac22015-03-27 20:22:191565
1566 DVLOG(1) << "Create 1st session and test packet loss";
1567
1568 // Set packet_loss_rate to a lower value than packet_loss_threshold.
1569 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261570 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/0.9f));
rtenneti41633b1f2015-04-05 18:19:531571 EXPECT_TRUE(session->connection()->connected());
rchf114d982015-10-21 01:34:561572 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:261573 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
1574 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1575 host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:191576 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261577 factory_.get(), host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:191578
1579 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:311580 // and that shouldn't close the session and it shouldn't disable QUIC.
1581 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261582 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:191583 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261584 factory_.get(), host_port_pair_.port()));
rtenneti97137a92015-06-18 06:00:311585 EXPECT_TRUE(session->connection()->connected());
jri7046038f2015-10-22 00:29:261586 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1587 host_port_pair_.port()));
rchf114d982015-10-21 01:34:561588 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:261589 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
rtenneti85dcfac22015-03-27 20:22:191590
1591 // Test N-in-a-row high packet loss connections.
1592
1593 DVLOG(1) << "Create 2nd session and test packet loss";
1594
1595 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:261596 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:561597 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:501598 /*cert_verify_flags=*/0, server2.host(), "GET",
1599 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:161600 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:261601 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
rtenneti85dcfac22015-03-27 20:22:191602
1603 // If there is no packet loss during handshake confirmation, number of lossy
1604 // connections for the port should be 0.
1605 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261606 factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:191607 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261608 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/0.9f));
rtenneti85dcfac22015-03-27 20:22:191609 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261610 factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:191611 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261612 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:191613
1614 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:311615 // and that shouldn't close the session and it shouldn't disable QUIC.
1616 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261617 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:191618 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261619 factory_.get(), server2.port()));
rtenneti97137a92015-06-18 06:00:311620 EXPECT_TRUE(session2->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:191621 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261622 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
1623 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server2));
rtenneti85dcfac22015-03-27 20:22:191624
1625 DVLOG(1) << "Create 3rd session which also has packet loss";
1626
1627 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:261628 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:561629 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
rtennetia75df622015-06-21 23:59:501630 /*cert_verify_flags=*/0, server3.host(), "GET",
1631 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:161632 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:261633 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
rtenneti85dcfac22015-03-27 20:22:191634
rtenneti97137a92015-06-18 06:00:311635 DVLOG(1) << "Create 4th session with packet loss and test IsQuicDisabled()";
1636 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:261637 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:561638 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
rtennetia75df622015-06-21 23:59:501639 /*cert_verify_flags=*/0, server4.host(), "GET",
1640 net_log_, callback4.callback()));
ckrasic4f9d88d2015-07-22 22:23:161641 QuicChromiumClientSession* session4 =
jri7046038f2015-10-22 00:29:261642 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server4);
rtenneti97137a92015-06-18 06:00:311643
rtenneti85dcfac22015-03-27 20:22:191644 // Set packet_loss_rate to higher value than packet_loss_threshold 2nd time in
1645 // a row and that should close the session and disable QUIC.
1646 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:261647 factory_->OnHandshakeConfirmed(session3, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:191648 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261649 factory_.get(), server3.port()));
rtenneti97137a92015-06-18 06:00:311650 EXPECT_FALSE(session3->connection()->connected());
jri7046038f2015-10-22 00:29:261651 EXPECT_TRUE(
1652 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server3.port()));
1653 EXPECT_FALSE(
1654 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server3));
bnccb7ff3c2015-05-21 20:51:551655 EXPECT_FALSE(HasActiveSession(server3));
rtenneti85dcfac22015-03-27 20:22:191656
rtenneti97137a92015-06-18 06:00:311657 // Set packet_loss_rate to higher value than packet_loss_threshold 3rd time in
1658 // a row and IsQuicDisabled() should close the session.
1659 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:261660 factory_->OnHandshakeConfirmed(session4, /*packet_loss_rate=*/1.0f));
rtenneti97137a92015-06-18 06:00:311661 EXPECT_EQ(3, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261662 factory_.get(), server4.port()));
rtenneti97137a92015-06-18 06:00:311663 EXPECT_FALSE(session4->connection()->connected());
jri7046038f2015-10-22 00:29:261664 EXPECT_TRUE(
1665 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server4.port()));
1666 EXPECT_FALSE(
1667 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server4));
rtenneti97137a92015-06-18 06:00:311668 EXPECT_FALSE(HasActiveSession(server4));
1669
rtenneti85dcfac22015-03-27 20:22:191670 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1671 EXPECT_TRUE(stream.get());
1672 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1673 EXPECT_TRUE(stream2.get());
1674 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
1675 EXPECT_TRUE(stream3.get());
rtenneti97137a92015-06-18 06:00:311676 scoped_ptr<QuicHttpStream> stream4 = request4.ReleaseStream();
1677 EXPECT_TRUE(stream4.get());
rch37de576c2015-05-17 20:28:171678 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1679 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1680 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1681 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1682 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
1683 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
rtenneti97137a92015-06-18 06:00:311684 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
1685 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
rtenneti85dcfac22015-03-27 20:22:191686}
1687
ckrasic1e53b642015-07-08 22:39:351688TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfTwo) {
jri7046038f2015-10-22 00:29:261689 disable_disk_cache_ = false;
1690 threshold_public_resets_post_handshake_ = 2;
1691 Initialize();
1692 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
1693
1694 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1695 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351696 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261697 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351698
mmenke651bae7f2015-12-18 21:26:451699 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1700 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:351701 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:351702
mmenke651bae7f2015-12-18 21:26:451703 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:351704 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:351705
1706 HostPortPair server2("mail.example.org", kDefaultServerPort);
1707
1708 crypto_client_stream_factory_.set_handshake_mode(
1709 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1710 host_resolver_.set_synchronous_mode(true);
1711 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1712 "192.168.0.1", "");
1713 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1714
jri7046038f2015-10-22 00:29:261715 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561716 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:351717 /*cert_verify_flags=*/0, host_port_pair_.host(),
1718 "GET", net_log_, callback_.callback()));
1719
rchf114d982015-10-21 01:34:561720 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:261721 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:351722
1723 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
1724 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
1725 // Need to spin the loop now to ensure that
1726 // QuicStreamFactory::OnSessionClosed() runs.
1727 base::RunLoop run_loop;
1728 run_loop.RunUntilIdle();
1729
jri7046038f2015-10-22 00:29:261730 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
1731 factory_.get()));
1732 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1733 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351734
1735 // Test two-in-a-row public reset post handshakes..
1736 DVLOG(1) << "Create 2nd session and trigger public reset post handshake";
1737 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:261738 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:561739 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:351740 /*cert_verify_flags=*/0, server2.host(), "GET",
1741 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:161742 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:261743 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:351744
1745 session2->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
1746 // Need to spin the loop now to ensure that
1747 // QuicStreamFactory::OnSessionClosed() runs.
1748 base::RunLoop run_loop2;
1749 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:261750 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
1751 factory_.get()));
1752 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1753 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:161754 EXPECT_EQ(
1755 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
jri7046038f2015-10-22 00:29:261756 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351757
1758 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1759 EXPECT_TRUE(stream.get());
1760 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1761 EXPECT_TRUE(stream2.get());
1762 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1763 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1764 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1765 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1766}
1767
1768TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfTwo) {
jri7046038f2015-10-22 00:29:261769 disable_disk_cache_ = true;
1770 threshold_timeouts_with_open_streams_ = 2;
1771 Initialize();
1772
1773 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
1774 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1775 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351776 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261777 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351778
mmenke651bae7f2015-12-18 21:26:451779 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1780 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:351781 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:351782
mmenke651bae7f2015-12-18 21:26:451783 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:351784 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:351785
1786 HostPortPair server2("mail.example.org", kDefaultServerPort);
1787
1788 crypto_client_stream_factory_.set_handshake_mode(
1789 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1790 host_resolver_.set_synchronous_mode(true);
1791 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1792 "192.168.0.1", "");
1793 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1794
jri7046038f2015-10-22 00:29:261795 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561796 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:351797 /*cert_verify_flags=*/0, host_port_pair_.host(),
1798 "GET", net_log_, callback_.callback()));
1799
rchf114d982015-10-21 01:34:561800 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:261801 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:351802
1803 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1804 EXPECT_TRUE(stream.get());
1805 HttpRequestInfo request_info;
1806 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1807 net_log_, CompletionCallback()));
1808
1809 DVLOG(1)
1810 << "Created 1st session and initialized a stream. Now trigger timeout";
1811 session->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
1812 // Need to spin the loop now to ensure that
1813 // QuicStreamFactory::OnSessionClosed() runs.
1814 base::RunLoop run_loop;
1815 run_loop.RunUntilIdle();
1816
jri7046038f2015-10-22 00:29:261817 EXPECT_EQ(
1818 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
1819 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1820 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351821
1822 // Test two-in-a-row timeouts with open streams.
1823 DVLOG(1) << "Create 2nd session and timeout with open stream";
1824 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:261825 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:561826 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:351827 /*cert_verify_flags=*/0, server2.host(), "GET",
1828 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:161829 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:261830 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:351831
1832 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1833 EXPECT_TRUE(stream2.get());
1834 EXPECT_EQ(OK, stream2->InitializeStream(&request_info, DEFAULT_PRIORITY,
1835 net_log_, CompletionCallback()));
1836
1837 session2->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
1838 // Need to spin the loop now to ensure that
1839 // QuicStreamFactory::OnSessionClosed() runs.
1840 base::RunLoop run_loop2;
1841 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:261842 EXPECT_EQ(
1843 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
1844 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1845 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:161846 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
jri7046038f2015-10-22 00:29:261847 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351848
1849 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1850 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1851 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1852 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1853}
1854
1855TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfThree) {
jri7046038f2015-10-22 00:29:261856 disable_disk_cache_ = true;
1857 threshold_public_resets_post_handshake_ = 2;
1858 Initialize();
1859
1860 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1861 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351862 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261863 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351864
mmenke651bae7f2015-12-18 21:26:451865 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1866 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:351867 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:351868
mmenke651bae7f2015-12-18 21:26:451869 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:351870 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:351871
mmenke651bae7f2015-12-18 21:26:451872 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:351873 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:351874
1875 HostPortPair server2("mail.example.org", kDefaultServerPort);
1876 HostPortPair server3("docs.example.org", kDefaultServerPort);
1877
1878 crypto_client_stream_factory_.set_handshake_mode(
1879 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1880 host_resolver_.set_synchronous_mode(true);
1881 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1882 "192.168.0.1", "");
1883 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1884 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
1885
1886 // Test first and third out of three public reset post handshakes.
jri7046038f2015-10-22 00:29:261887 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561888 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:351889 /*cert_verify_flags=*/0, host_port_pair_.host(),
1890 "GET", net_log_, callback_.callback()));
1891
rchf114d982015-10-21 01:34:561892 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:261893 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:351894
1895 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
1896 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
1897 // Need to spin the loop now to ensure that
1898 // QuicStreamFactory::OnSessionClosed() runs.
1899 base::RunLoop run_loop;
1900 run_loop.RunUntilIdle();
1901
jri7046038f2015-10-22 00:29:261902 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
1903 factory_.get()));
1904 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1905 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351906
1907 DVLOG(1) << "Create 2nd session without disable trigger";
1908 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:261909 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:561910 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:351911 /*cert_verify_flags=*/0, server2.host(), "GET",
1912 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:161913 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:261914 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:351915
1916 session2->connection()->CloseConnection(QUIC_NO_ERROR, false);
1917 // Need to spin the loop now to ensure that
1918 // QuicStreamFactory::OnSessionClosed() runs.
1919 base::RunLoop run_loop2;
1920 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:261921 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
1922 factory_.get()));
1923 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1924 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351925
1926 DVLOG(1) << "Create 3rd session with public reset post handshake,"
1927 << " will disable QUIC";
1928 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:261929 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:561930 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:351931 /*cert_verify_flags=*/0, server3.host(), "GET",
1932 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:161933 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:261934 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:351935
1936 session3->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
1937 // Need to spin the loop now to ensure that
1938 // QuicStreamFactory::OnSessionClosed() runs.
1939 base::RunLoop run_loop3;
1940 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:261941 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
1942 factory_.get()));
1943 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1944 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:161945 EXPECT_EQ(
1946 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
jri7046038f2015-10-22 00:29:261947 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351948
1949 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1950 EXPECT_TRUE(stream.get());
1951 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1952 EXPECT_TRUE(stream2.get());
1953 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
1954 EXPECT_TRUE(stream3.get());
1955
1956 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1957 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1958 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1959 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1960 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
1961 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
1962}
1963
1964TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfThree) {
jri7046038f2015-10-22 00:29:261965 disable_disk_cache_ = true;
1966 threshold_public_resets_post_handshake_ = 2;
1967 Initialize();
1968 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
1969
1970 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
1971 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351972 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:261973 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:351974
mmenke651bae7f2015-12-18 21:26:451975 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1976 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:351977 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:351978
mmenke651bae7f2015-12-18 21:26:451979 // SequencedSocketData socket_data2(nullptr, 0, nullptr, 0);
1980 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:351981 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:351982
mmenke651bae7f2015-12-18 21:26:451983 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:351984 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:351985
1986 HostPortPair server2("mail.example.org", kDefaultServerPort);
1987 HostPortPair server3("docs.example.org", kDefaultServerPort);
1988
1989 crypto_client_stream_factory_.set_handshake_mode(
1990 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1991 host_resolver_.set_synchronous_mode(true);
1992 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1993 "192.168.0.1", "");
1994 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1995 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
1996
1997 // Test first and third out of three timeouts with open streams.
jri7046038f2015-10-22 00:29:261998 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561999 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352000 /*cert_verify_flags=*/0, host_port_pair_.host(),
2001 "GET", net_log_, callback_.callback()));
2002
rchf114d982015-10-21 01:34:562003 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262004 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352005
2006 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2007 EXPECT_TRUE(stream.get());
2008 HttpRequestInfo request_info;
2009 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2010 net_log_, CompletionCallback()));
2011
2012 DVLOG(1)
2013 << "Created 1st session and initialized a stream. Now trigger timeout";
2014 session->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2015 // Need to spin the loop now to ensure that
2016 // QuicStreamFactory::OnSessionClosed() runs.
2017 base::RunLoop run_loop;
2018 run_loop.RunUntilIdle();
2019
jri7046038f2015-10-22 00:29:262020 EXPECT_EQ(
2021 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2022 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2023 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352024
2025 // Test two-in-a-row timeouts with open streams.
2026 DVLOG(1) << "Create 2nd session without timeout";
2027 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262028 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562029 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352030 /*cert_verify_flags=*/0, server2.host(), "GET",
2031 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162032 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262033 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352034
2035 session2->connection()->CloseConnection(QUIC_NO_ERROR, true);
2036 // Need to spin the loop now to ensure that
2037 // QuicStreamFactory::OnSessionClosed() runs.
2038 base::RunLoop run_loop2;
2039 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262040 EXPECT_EQ(
2041 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2042 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2043 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352044
2045 DVLOG(1) << "Create 3rd session with timeout with open streams,"
2046 << " will disable QUIC";
2047
2048 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:262049 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:562050 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352051 /*cert_verify_flags=*/0, server3.host(), "GET",
2052 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:162053 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:262054 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:352055
2056 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2057 EXPECT_TRUE(stream3.get());
2058 EXPECT_EQ(OK, stream3->InitializeStream(&request_info, DEFAULT_PRIORITY,
2059 net_log_, CompletionCallback()));
2060 session3->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2061 // Need to spin the loop now to ensure that
2062 // QuicStreamFactory::OnSessionClosed() runs.
2063 base::RunLoop run_loop3;
2064 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:262065 EXPECT_EQ(
2066 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2067 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2068 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:162069 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
jri7046038f2015-10-22 00:29:262070 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352071
2072 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2073 EXPECT_TRUE(stream2.get());
2074 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2075 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2076 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2077 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2078 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2079 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
2080}
2081
2082TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfFour) {
jri7046038f2015-10-22 00:29:262083 disable_disk_cache_ = true;
2084 threshold_public_resets_post_handshake_ = 2;
2085 Initialize();
2086 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2087
2088 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2089 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352090 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262091 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352092
mmenke651bae7f2015-12-18 21:26:452093 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2094 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352095 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:352096
mmenke651bae7f2015-12-18 21:26:452097 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352098 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:352099
mmenke651bae7f2015-12-18 21:26:452100 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352101 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:352102
mmenke651bae7f2015-12-18 21:26:452103 SequencedSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352104 socket_factory_.AddSocketDataProvider(&socket_data4);
ckrasic1e53b642015-07-08 22:39:352105
2106 HostPortPair server2("mail.example.org", kDefaultServerPort);
2107 HostPortPair server3("docs.example.org", kDefaultServerPort);
2108 HostPortPair server4("images.example.org", kDefaultServerPort);
2109
2110 crypto_client_stream_factory_.set_handshake_mode(
2111 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2112 host_resolver_.set_synchronous_mode(true);
2113 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2114 "192.168.0.1", "");
2115 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2116 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
2117 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
2118
2119 // Test first and fourth out of four public reset post handshakes.
jri7046038f2015-10-22 00:29:262120 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562121 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352122 /*cert_verify_flags=*/0, host_port_pair_.host(),
2123 "GET", net_log_, callback_.callback()));
2124
rchf114d982015-10-21 01:34:562125 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262126 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352127
2128 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
2129 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
2130 // Need to spin the loop now to ensure that
2131 // QuicStreamFactory::OnSessionClosed() runs.
2132 base::RunLoop run_loop;
2133 run_loop.RunUntilIdle();
2134
jri7046038f2015-10-22 00:29:262135 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2136 factory_.get()));
2137 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2138 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352139
2140 DVLOG(1) << "Create 2nd and 3rd sessions without disable trigger";
2141 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262142 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562143 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352144 /*cert_verify_flags=*/0, server2.host(), "GET",
2145 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162146 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262147 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352148
2149 session2->connection()->CloseConnection(QUIC_NO_ERROR, false);
2150 // Need to spin the loop now to ensure that
2151 // QuicStreamFactory::OnSessionClosed() runs.
2152 base::RunLoop run_loop2;
2153 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262154 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2155 factory_.get()));
2156 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2157 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352158
2159 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:262160 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:562161 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352162 /*cert_verify_flags=*/0, server3.host(), "GET",
2163 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:162164 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:262165 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:352166
2167 session3->connection()->CloseConnection(QUIC_NO_ERROR, false);
2168 // Need to spin the loop now to ensure that
2169 // QuicStreamFactory::OnSessionClosed() runs.
2170 base::RunLoop run_loop3;
2171 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:262172 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2173 factory_.get()));
2174 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2175 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352176
2177 DVLOG(1) << "Create 4rd session with public reset post handshake,"
2178 << " will not disable QUIC";
2179 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:262180 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:562181 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352182 /*cert_verify_flags=*/0, server4.host(), "GET",
2183 net_log_, callback4.callback()));
ckrasic4f9d88d2015-07-22 22:23:162184 QuicChromiumClientSession* session4 =
jri7046038f2015-10-22 00:29:262185 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server4);
ckrasic1e53b642015-07-08 22:39:352186
2187 session4->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
2188 // Need to spin the loop now to ensure that
2189 // QuicStreamFactory::OnSessionClosed() runs.
2190 base::RunLoop run_loop4;
2191 run_loop4.RunUntilIdle();
jri7046038f2015-10-22 00:29:262192 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2193 factory_.get()));
2194 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2195 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352196
2197 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2198 EXPECT_TRUE(stream.get());
2199 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2200 EXPECT_TRUE(stream2.get());
2201 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2202 EXPECT_TRUE(stream3.get());
2203 scoped_ptr<QuicHttpStream> stream4 = request4.ReleaseStream();
2204 EXPECT_TRUE(stream4.get());
2205
2206 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2207 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2208 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2209 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2210 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2211 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
2212 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
2213 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
2214}
2215
2216TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfFour) {
jri7046038f2015-10-22 00:29:262217 disable_disk_cache_ = true;
2218 threshold_public_resets_post_handshake_ = 2;
2219 Initialize();
2220 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2221
2222 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2223 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352224 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262225 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352226
mmenke651bae7f2015-12-18 21:26:452227 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2228 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352229 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:352230
mmenke651bae7f2015-12-18 21:26:452231 // SequencedSocketData socket_data2(nullptr, 0, nullptr, 0);
2232 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352233 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:352234
mmenke651bae7f2015-12-18 21:26:452235 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352236 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:352237
mmenke651bae7f2015-12-18 21:26:452238 SequencedSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352239 socket_factory_.AddSocketDataProvider(&socket_data4);
ckrasic1e53b642015-07-08 22:39:352240
2241 HostPortPair server2("mail.example.org", kDefaultServerPort);
2242 HostPortPair server3("docs.example.org", kDefaultServerPort);
2243 HostPortPair server4("images.example.org", kDefaultServerPort);
2244
2245 crypto_client_stream_factory_.set_handshake_mode(
2246 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2247 host_resolver_.set_synchronous_mode(true);
2248 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2249 "192.168.0.1", "");
2250 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2251 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
2252 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
2253
2254 // Test first and fourth out of three timeouts with open streams.
jri7046038f2015-10-22 00:29:262255 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562256 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352257 /*cert_verify_flags=*/0, host_port_pair_.host(),
2258 "GET", net_log_, callback_.callback()));
2259
rchf114d982015-10-21 01:34:562260 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262261 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352262
2263 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2264 EXPECT_TRUE(stream.get());
2265 HttpRequestInfo request_info;
2266 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2267 net_log_, CompletionCallback()));
2268
2269 DVLOG(1)
2270 << "Created 1st session and initialized a stream. Now trigger timeout";
2271 session->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2272 // Need to spin the loop now to ensure that
2273 // QuicStreamFactory::OnSessionClosed() runs.
2274 base::RunLoop run_loop;
2275 run_loop.RunUntilIdle();
2276
jri7046038f2015-10-22 00:29:262277 EXPECT_EQ(
2278 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2279 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2280 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352281
2282 DVLOG(1) << "Create 2nd and 3rd sessions without timeout";
2283 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262284 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562285 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352286 /*cert_verify_flags=*/0, server2.host(), "GET",
2287 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162288 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262289 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352290
2291 session2->connection()->CloseConnection(QUIC_NO_ERROR, true);
2292 // Need to spin the loop now to ensure that
2293 // QuicStreamFactory::OnSessionClosed() runs.
2294 base::RunLoop run_loop2;
2295 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262296 EXPECT_EQ(
2297 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2298 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2299 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352300
2301 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:262302 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:562303 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352304 /*cert_verify_flags=*/0, server3.host(), "GET",
2305 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:162306 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:262307 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:352308
2309 session3->connection()->CloseConnection(QUIC_NO_ERROR, true);
2310 // Need to spin the loop now to ensure that
2311 // QuicStreamFactory::OnSessionClosed() runs.
2312 base::RunLoop run_loop3;
2313 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:262314 EXPECT_EQ(
2315 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2316 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2317 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352318
2319 DVLOG(1) << "Create 4th session with timeout with open streams,"
2320 << " will not disable QUIC";
2321
2322 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:262323 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:562324 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352325 /*cert_verify_flags=*/0, server4.host(), "GET",
2326 net_log_, callback4.callback()));
ckrasic4f9d88d2015-07-22 22:23:162327 QuicChromiumClientSession* session4 =
jri7046038f2015-10-22 00:29:262328 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server4);
ckrasic1e53b642015-07-08 22:39:352329
2330 scoped_ptr<QuicHttpStream> stream4 = request4.ReleaseStream();
2331 EXPECT_TRUE(stream4.get());
2332 EXPECT_EQ(OK, stream4->InitializeStream(&request_info, DEFAULT_PRIORITY,
2333 net_log_, CompletionCallback()));
2334 session4->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2335 // Need to spin the loop now to ensure that
2336 // QuicStreamFactory::OnSessionClosed() runs.
2337 base::RunLoop run_loop4;
2338 run_loop4.RunUntilIdle();
jri7046038f2015-10-22 00:29:262339 EXPECT_EQ(
2340 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2341 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2342 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352343
2344 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2345 EXPECT_TRUE(stream2.get());
2346 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2347 EXPECT_TRUE(stream3.get());
2348 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2349 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2350 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2351 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2352 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2353 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
2354 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
2355 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
2356}
2357
rtenneti8332ba52015-09-17 19:33:412358TEST_P(QuicStreamFactoryTest, EnableDelayTcpRace) {
jri7046038f2015-10-22 00:29:262359 Initialize();
2360 bool delay_tcp_race = QuicStreamFactoryPeer::GetDelayTcpRace(factory_.get());
2361 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), false);
mmenke651bae7f2015-12-18 21:26:452362 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2363 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti8332ba52015-09-17 19:33:412364 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti8332ba52015-09-17 19:33:412365
rtenneti8332ba52015-09-17 19:33:412366 ServerNetworkStats stats1;
2367 stats1.srtt = base::TimeDelta::FromMicroseconds(10);
rtenneticcab42b2015-10-09 06:38:162368 http_server_properties_.SetServerNetworkStats(host_port_pair_, stats1);
rtenneti8332ba52015-09-17 19:33:412369
2370 crypto_client_stream_factory_.set_handshake_mode(
2371 MockCryptoClientStream::ZERO_RTT);
2372 host_resolver_.set_synchronous_mode(true);
2373 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2374 "192.168.0.1", "");
2375
jri7046038f2015-10-22 00:29:262376 QuicStreamRequest request(factory_.get());
rtenneti8332ba52015-09-17 19:33:412377 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562378 request.Request(host_port_pair_, privacy_mode_,
rtenneti8332ba52015-09-17 19:33:412379 /*cert_verify_flags=*/0, host_port_pair_.host(),
2380 "POST", net_log_, callback_.callback()));
2381
2382 // If we don't delay TCP connection, then time delay should be 0.
jri7046038f2015-10-22 00:29:262383 EXPECT_FALSE(factory_->delay_tcp_race());
rtenneti8332ba52015-09-17 19:33:412384 EXPECT_EQ(base::TimeDelta(), request.GetTimeDelayForWaitingJob());
2385
2386 // Enable |delay_tcp_race_| param and verify delay is one RTT and that
2387 // server supports QUIC.
jri7046038f2015-10-22 00:29:262388 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), true);
2389 EXPECT_TRUE(factory_->delay_tcp_race());
rtenneti8332ba52015-09-17 19:33:412390 EXPECT_EQ(base::TimeDelta::FromMicroseconds(15),
2391 request.GetTimeDelayForWaitingJob());
2392
2393 // Confirm the handshake and verify that the stream is created.
2394 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
2395 QuicSession::HANDSHAKE_CONFIRMED);
2396
2397 EXPECT_EQ(OK, callback_.WaitForResult());
2398
2399 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2400 EXPECT_TRUE(stream.get());
2401 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2402 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
jri7046038f2015-10-22 00:29:262403 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), delay_tcp_race);
rtenneti8332ba52015-09-17 19:33:412404}
2405
rtenneticd2aaa15b2015-10-10 20:29:332406TEST_P(QuicStreamFactoryTest, MaybeInitialize) {
jri7046038f2015-10-22 00:29:262407 store_server_configs_in_properties_ = true;
rtenneti41c09992015-11-30 18:24:012408 idle_connection_timeout_seconds_ = 500;
jri7046038f2015-10-22 00:29:262409 Initialize();
rtenneti41c09992015-11-30 18:24:012410 const QuicConfig* config = QuicStreamFactoryPeer::GetConfig(factory_.get());
2411 EXPECT_EQ(500, config->IdleConnectionStateLifetime().ToSeconds());
2412
jri7046038f2015-10-22 00:29:262413 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti8a80a6dc2015-09-21 19:51:132414
rtenneti8a80a6dc2015-09-21 19:51:132415 const AlternativeService alternative_service1(QUIC, host_port_pair_.host(),
2416 host_port_pair_.port());
2417 AlternativeServiceInfoVector alternative_service_info_vector;
2418 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
2419 alternative_service_info_vector.push_back(
2420 AlternativeServiceInfo(alternative_service1, 1.0, expiration));
2421
rtenneticcab42b2015-10-09 06:38:162422 http_server_properties_.SetAlternativeServices(
rtenneti8a80a6dc2015-09-21 19:51:132423 host_port_pair_, alternative_service_info_vector);
2424
rch1fe2eeb2015-10-26 14:45:572425 QuicServerId quic_server_id("www.google.com", 80, PRIVACY_MODE_DISABLED);
rtenneticd2aaa15b2015-10-10 20:29:332426 QuicServerInfoFactory* quic_server_info_factory =
2427 new PropertiesBasedQuicServerInfoFactory(
2428 http_server_properties_.GetWeakPtr());
jri7046038f2015-10-22 00:29:262429 factory_->set_quic_server_info_factory(quic_server_info_factory);
rtenneticd2aaa15b2015-10-10 20:29:332430
2431 scoped_ptr<QuicServerInfo> quic_server_info(
2432 quic_server_info_factory->GetForServer(quic_server_id));
2433
2434 // Update quic_server_info's server_config and persist it.
2435 QuicServerInfo::State* state = quic_server_info->mutable_state();
2436 // Minimum SCFG that passes config validation checks.
2437 const char scfg[] = {// SCFG
2438 0x53, 0x43, 0x46, 0x47,
2439 // num entries
2440 0x01, 0x00,
2441 // padding
2442 0x00, 0x00,
2443 // EXPY
2444 0x45, 0x58, 0x50, 0x59,
2445 // EXPY end offset
2446 0x08, 0x00, 0x00, 0x00,
2447 // Value
2448 '1', '2', '3', '4', '5', '6', '7', '8'};
2449
2450 // Create temporary strings becasue Persist() clears string data in |state|.
2451 string server_config(reinterpret_cast<const char*>(&scfg), sizeof(scfg));
2452 string source_address_token("test_source_address_token");
2453 string signature("test_signature");
2454 string test_cert("test_cert");
2455 vector<string> certs;
2456 certs.push_back(test_cert);
2457 state->server_config = server_config;
2458 state->source_address_token = source_address_token;
2459 state->server_config_sig = signature;
2460 state->certs = certs;
2461
2462 quic_server_info->Persist();
2463
jri7046038f2015-10-22 00:29:262464 QuicStreamFactoryPeer::MaybeInitialize(factory_.get());
2465 EXPECT_TRUE(QuicStreamFactoryPeer::HasInitializedData(factory_.get()));
2466 EXPECT_TRUE(QuicStreamFactoryPeer::SupportsQuicAtStartUp(factory_.get(),
2467 host_port_pair_));
2468 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(factory_.get(),
rtenneticd2aaa15b2015-10-10 20:29:332469 quic_server_id));
2470 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:262471 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rtenneticd2aaa15b2015-10-10 20:29:332472 QuicCryptoClientConfig::CachedState* cached =
2473 crypto_config->LookupOrCreate(quic_server_id);
2474 EXPECT_FALSE(cached->server_config().empty());
2475 EXPECT_TRUE(cached->GetServerConfig());
2476 EXPECT_EQ(server_config, cached->server_config());
2477 EXPECT_EQ(source_address_token, cached->source_address_token());
2478 EXPECT_EQ(signature, cached->signature());
2479 ASSERT_EQ(1U, cached->certs().size());
2480 EXPECT_EQ(test_cert, cached->certs()[0]);
rtenneti8a80a6dc2015-09-21 19:51:132481}
2482
rtennetid2e74caa2015-12-09 00:51:572483TEST_P(QuicStreamFactoryTest, QuicDoingZeroRTT) {
2484 Initialize();
2485
2486 factory_->set_require_confirmation(true);
2487 QuicServerId quic_server_id(host_port_pair_, PRIVACY_MODE_DISABLED);
2488 EXPECT_FALSE(factory_->ZeroRTTEnabledFor(quic_server_id));
2489
2490 factory_->set_require_confirmation(false);
2491 EXPECT_FALSE(factory_->ZeroRTTEnabledFor(quic_server_id));
2492
2493 // Load server config and verify QUIC will do 0RTT.
2494 QuicStreamFactoryPeer::CacheDummyServerConfig(factory_.get(), quic_server_id);
2495 EXPECT_TRUE(factory_->ZeroRTTEnabledFor(quic_server_id));
2496}
2497
rtenneti1cd3b162015-09-29 02:58:282498TEST_P(QuicStreamFactoryTest, YieldAfterPackets) {
jri7046038f2015-10-22 00:29:262499 Initialize();
2500 QuicStreamFactoryPeer::SetYieldAfterPackets(factory_.get(), 0);
rtenneti1cd3b162015-09-29 02:58:282501
2502 scoped_ptr<QuicEncryptedPacket> close_packet(
2503 ConstructConnectionClosePacket(0));
rtenneticd2aaa15b2015-10-10 20:29:332504 vector<MockRead> reads;
rtenneti1cd3b162015-09-29 02:58:282505 reads.push_back(
2506 MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0));
2507 reads.push_back(MockRead(ASYNC, OK, 1));
mmenke651bae7f2015-12-18 21:26:452508 SequencedSocketData socket_data(&reads[0], reads.size(), nullptr, 0);
rtenneti1cd3b162015-09-29 02:58:282509 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti1cd3b162015-09-29 02:58:282510
2511 crypto_client_stream_factory_.set_handshake_mode(
2512 MockCryptoClientStream::ZERO_RTT);
2513 host_resolver_.set_synchronous_mode(true);
2514 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2515 "192.168.0.1", "");
2516
2517 // Set up the TaskObserver to verify QuicPacketReader::StartReading posts a
2518 // task.
2519 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
2520 SpdySessionTestTaskObserver observer("quic_packet_reader.cc", "StartReading");
2521
jri7046038f2015-10-22 00:29:262522 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562523 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtenneti1cd3b162015-09-29 02:58:282524 /*cert_verify_flags=*/0, host_port_pair_.host(),
2525 "GET", net_log_, callback_.callback()));
2526
2527 // Call run_loop so that QuicPacketReader::OnReadComplete() gets called.
2528 base::RunLoop run_loop;
2529 run_loop.RunUntilIdle();
2530
2531 // Verify task that the observer's executed_count is 1, which indicates
2532 // QuicPacketReader::StartReading() has posted only one task and yielded the
2533 // read.
2534 EXPECT_EQ(1u, observer.executed_count());
2535
2536 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2537 EXPECT_TRUE(stream.get());
2538 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2539 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2540}
2541
2542TEST_P(QuicStreamFactoryTest, YieldAfterDuration) {
jri7046038f2015-10-22 00:29:262543 Initialize();
rtenneti1cd3b162015-09-29 02:58:282544 QuicStreamFactoryPeer::SetYieldAfterDuration(
jri7046038f2015-10-22 00:29:262545 factory_.get(), QuicTime::Delta::FromMilliseconds(-1));
rtenneti1cd3b162015-09-29 02:58:282546
2547 scoped_ptr<QuicEncryptedPacket> close_packet(
2548 ConstructConnectionClosePacket(0));
rtenneticd2aaa15b2015-10-10 20:29:332549 vector<MockRead> reads;
rtenneti1cd3b162015-09-29 02:58:282550 reads.push_back(
2551 MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0));
2552 reads.push_back(MockRead(ASYNC, OK, 1));
mmenke651bae7f2015-12-18 21:26:452553 SequencedSocketData socket_data(&reads[0], reads.size(), nullptr, 0);
rtenneti1cd3b162015-09-29 02:58:282554 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti1cd3b162015-09-29 02:58:282555
2556 crypto_client_stream_factory_.set_handshake_mode(
2557 MockCryptoClientStream::ZERO_RTT);
2558 host_resolver_.set_synchronous_mode(true);
2559 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2560 "192.168.0.1", "");
2561
2562 // Set up the TaskObserver to verify QuicPacketReader::StartReading posts a
2563 // task.
2564 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
2565 SpdySessionTestTaskObserver observer("quic_packet_reader.cc", "StartReading");
2566
jri7046038f2015-10-22 00:29:262567 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562568 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtenneti1cd3b162015-09-29 02:58:282569 /*cert_verify_flags=*/0, host_port_pair_.host(),
2570 "GET", net_log_, callback_.callback()));
2571
2572 // Call run_loop so that QuicPacketReader::OnReadComplete() gets called.
2573 base::RunLoop run_loop;
2574 run_loop.RunUntilIdle();
2575
2576 // Verify task that the observer's executed_count is 1, which indicates
2577 // QuicPacketReader::StartReading() has posted only one task and yielded the
2578 // read.
2579 EXPECT_EQ(1u, observer.executed_count());
2580
2581 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2582 EXPECT_TRUE(stream.get());
2583 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2584 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2585}
2586
[email protected]e13201d82012-12-12 05:00:322587} // namespace test
[email protected]e13201d82012-12-12 05:00:322588} // namespace net