blob: 2cd26b03e260e81b6a56691b400a6b2f05f25bf9 [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"
jri7e636642016-01-14 06:57:0827#include "net/quic/quic_http_utils.h"
[email protected]257f24f2014-04-01 09:15:3728#include "net/quic/quic_server_id.h"
[email protected]e13201d82012-12-12 05:00:3229#include "net/quic/test_tools/mock_clock.h"
[email protected]e8ff26842013-03-22 21:02:0530#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
[email protected]9558c5d32012-12-22 00:08:1431#include "net/quic/test_tools/mock_random.h"
rtennetid2e74caa2015-12-09 00:51:5732#include "net/quic/test_tools/quic_stream_factory_peer.h"
[email protected]1e960032013-12-20 19:00:2033#include "net/quic/test_tools/quic_test_packet_maker.h"
[email protected]e13201d82012-12-12 05:00:3234#include "net/quic/test_tools/quic_test_utils.h"
rtenneti38f5cd52014-10-28 20:28:2835#include "net/quic/test_tools/test_task_runner.h"
[email protected]e13201d82012-12-12 05:00:3236#include "net/socket/socket_test_util.h"
rtenneti1cd3b162015-09-29 02:58:2837#include "net/spdy/spdy_session_test_util.h"
[email protected]5db452202014-08-19 05:22:1538#include "net/spdy/spdy_test_utils.h"
[email protected]6b8a3c742014-07-25 00:25:3539#include "net/ssl/channel_id_service.h"
40#include "net/ssl/default_channel_id_store.h"
[email protected]eed749f92013-12-23 18:57:3841#include "net/test/cert_test_util.h"
[email protected]e13201d82012-12-12 05:00:3242#include "testing/gtest/include/gtest/gtest.h"
43
[email protected]6e12d702013-11-13 00:17:1744using base::StringPiece;
rtenneti14abd312015-02-06 21:56:0145using std::ostream;
[email protected]6e12d702013-11-13 00:17:1746using std::string;
47using std::vector;
48
[email protected]e13201d82012-12-12 05:00:3249namespace net {
jri7e636642016-01-14 06:57:0850
[email protected]e13201d82012-12-12 05:00:3251namespace test {
52
[email protected]3c772402013-12-18 21:38:1153namespace {
rch6faa4d42016-01-05 20:48:4354const char kDefaultServerHostName[] = "www.example.org";
55const char kServer2HostName[] = "mail.example.org";
56const char kServer3HostName[] = "docs.example.org";
57const char kServer4HostName[] = "images.example.org";
[email protected]3c772402013-12-18 21:38:1158const int kDefaultServerPort = 443;
rtenneti14abd312015-02-06 21:56:0159
60// Run all tests with all the combinations of versions and
61// enable_connection_racing.
62struct TestParams {
63 TestParams(const QuicVersion version, bool enable_connection_racing)
64 : version(version), enable_connection_racing(enable_connection_racing) {}
65
66 friend ostream& operator<<(ostream& os, const TestParams& p) {
67 os << "{ version: " << QuicVersionToString(p.version);
68 os << " enable_connection_racing: " << p.enable_connection_racing << " }";
69 return os;
70 }
71
72 QuicVersion version;
73 bool enable_connection_racing;
74};
75
76// Constructs various test permutations.
77vector<TestParams> GetTestParams() {
78 vector<TestParams> params;
79 QuicVersionVector all_supported_versions = QuicSupportedVersions();
80 for (const QuicVersion version : all_supported_versions) {
81 params.push_back(TestParams(version, false));
82 params.push_back(TestParams(version, true));
83 }
84 return params;
85}
86
[email protected]3c772402013-12-18 21:38:1187} // namespace anonymous
88
rtenneti38f5cd52014-10-28 20:28:2889class MockQuicServerInfo : public QuicServerInfo {
90 public:
91 MockQuicServerInfo(const QuicServerId& server_id)
92 : QuicServerInfo(server_id) {}
dcheng2339883c2014-12-23 00:23:0593 ~MockQuicServerInfo() override {}
rtenneti38f5cd52014-10-28 20:28:2894
dcheng2339883c2014-12-23 00:23:0595 void Start() override {}
rtenneti38f5cd52014-10-28 20:28:2896
dcheng2339883c2014-12-23 00:23:0597 int WaitForDataReady(const CompletionCallback& callback) override {
rtenneti38f5cd52014-10-28 20:28:2898 return ERR_IO_PENDING;
99 }
100
rtenneti170f36a2015-02-10 19:13:45101 void ResetWaitForDataReadyCallback() override {}
102
dcheng2339883c2014-12-23 00:23:05103 void CancelWaitForDataReadyCallback() override {}
rtenneti38f5cd52014-10-28 20:28:28104
dcheng2339883c2014-12-23 00:23:05105 bool IsDataReady() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28106
dcheng2339883c2014-12-23 00:23:05107 bool IsReadyToPersist() override { return false; }
rtenneti38f5cd52014-10-28 20:28:28108
dcheng2339883c2014-12-23 00:23:05109 void Persist() override {}
rtennetif0b832b2014-11-07 02:32:30110
dcheng2339883c2014-12-23 00:23:05111 void OnExternalCacheHit() override {}
rtenneti38f5cd52014-10-28 20:28:28112};
113
114class MockQuicServerInfoFactory : public QuicServerInfoFactory {
115 public:
116 MockQuicServerInfoFactory() {}
dcheng2339883c2014-12-23 00:23:05117 ~MockQuicServerInfoFactory() override {}
rtenneti38f5cd52014-10-28 20:28:28118
dcheng2339883c2014-12-23 00:23:05119 QuicServerInfo* GetForServer(const QuicServerId& server_id) override {
rtenneti38f5cd52014-10-28 20:28:28120 return new MockQuicServerInfo(server_id);
121 }
122};
123
jri7e636642016-01-14 06:57:08124class MockNetworkChangeNotifier : public NetworkChangeNotifier {
125 public:
126 MockNetworkChangeNotifier() : force_network_handles_supported_(false) {}
127
128 ConnectionType GetCurrentConnectionType() const override {
129 return CONNECTION_UNKNOWN;
130 }
131
132 void ForceNetworkHandlesSupported() {
133 force_network_handles_supported_ = true;
134 }
135
136 bool AreNetworkHandlesCurrentlySupported() const override {
137 return force_network_handles_supported_;
138 }
139
140 void SetConnectedNetworksList(const NetworkList& network_list) {
141 connected_networks_ = network_list;
142 }
143
144 void GetCurrentConnectedNetworks(NetworkList* network_list) const override {
145 network_list->clear();
146 *network_list = connected_networks_;
147 }
148
149 void NotifyNetworkSoonToDisconnect(
150 NetworkChangeNotifier::NetworkHandle network) {
151 NetworkChangeNotifier::NotifyObserversOfSpecificNetworkChange(
152 NetworkChangeNotifier::SOON_TO_DISCONNECT, network);
153 // Spin the message loop so the notification is delivered.
154 base::MessageLoop::current()->RunUntilIdle();
155 }
156
157 void NotifyNetworkDisconnected(NetworkChangeNotifier::NetworkHandle network) {
158 NetworkChangeNotifier::NotifyObserversOfSpecificNetworkChange(
159 NetworkChangeNotifier::DISCONNECTED, network);
160 // Spin the message loop so the notification is delivered.
161 base::MessageLoop::current()->RunUntilIdle();
162 }
163
164 private:
165 bool force_network_handles_supported_;
166 NetworkChangeNotifier::NetworkList connected_networks_;
167};
168
169// Class to replace existing NetworkChangeNotifier singleton with a
170// MockNetworkChangeNotifier for a test. To use, simply create a
171// ScopedMockNetworkChangeNotifier object in the test.
172class ScopedMockNetworkChangeNotifier {
173 public:
174 ScopedMockNetworkChangeNotifier()
175 : disable_network_change_notifier_for_tests_(
176 new NetworkChangeNotifier::DisableForTest()),
177 mock_network_change_notifier_(new MockNetworkChangeNotifier()) {}
178
179 MockNetworkChangeNotifier* mock_network_change_notifier() {
180 return mock_network_change_notifier_.get();
181 }
182
183 private:
184 scoped_ptr<NetworkChangeNotifier::DisableForTest>
185 disable_network_change_notifier_for_tests_;
186 scoped_ptr<MockNetworkChangeNotifier> mock_network_change_notifier_;
187};
188
rtenneti14abd312015-02-06 21:56:01189class QuicStreamFactoryTest : public ::testing::TestWithParam<TestParams> {
[email protected]e13201d82012-12-12 05:00:32190 protected:
191 QuicStreamFactoryTest()
[email protected]457d6952013-12-13 09:24:58192 : random_generator_(0),
193 clock_(new MockClock()),
rtenneti38f5cd52014-10-28 20:28:28194 runner_(new TestTaskRunner(clock_)),
bncb07c05532015-05-14 19:07:20195 maker_(GetParam().version, 0, clock_, kDefaultServerHostName),
[email protected]59c0bbd2014-03-22 04:08:12196 cert_verifier_(CertVerifier::CreateDefault()),
jri2b966f22014-09-02 22:25:36197 channel_id_service_(
rtennetibe635732014-10-02 22:51:42198 new ChannelIDService(new DefaultChannelIDStore(nullptr),
skyostil4891b25b2015-06-11 11:43:45199 base::ThreadTaskRunnerHandle::Get())),
rtenneti052774e2015-11-24 21:00:12200 cert_transparency_verifier_(new MultiLogCTVerifier()),
jri7e636642016-01-14 06:57:08201 scoped_mock_network_change_notifier_(nullptr),
jri7046038f2015-10-22 00:29:26202 factory_(nullptr),
[email protected]bf4ea2f2014-03-10 22:57:53203 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
jri7046038f2015-10-22 00:29:26204 privacy_mode_(PRIVACY_MODE_DISABLED),
205 enable_port_selection_(true),
206 always_require_handshake_confirmation_(false),
207 disable_connection_pooling_(false),
208 load_server_info_timeout_srtt_multiplier_(0.0f),
209 enable_connection_racing_(true),
210 enable_non_blocking_io_(true),
211 disable_disk_cache_(false),
212 prefer_aes_(false),
213 max_number_of_lossy_connections_(0),
214 packet_loss_threshold_(1.0f),
215 max_disabled_reasons_(3),
216 threshold_timeouts_with_open_streams_(2),
217 threshold_public_resets_post_handshake_(2),
218 receive_buffer_size_(0),
219 delay_tcp_race_(false),
rtenneti41c09992015-11-30 18:24:01220 close_sessions_on_ip_change_(false),
zhongyi89649c32016-01-22 00:14:01221 disable_quic_on_timeout_with_open_streams_(false),
jri7e636642016-01-14 06:57:08222 idle_connection_timeout_seconds_(kIdleConnectionTimeoutSeconds),
jrid36ada62016-02-06 02:42:08223 migrate_sessions_on_network_change_(false),
224 migrate_sessions_early_(false) {
[email protected]ca4e0d92014-08-22 16:33:22225 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
jri7046038f2015-10-22 00:29:26226 }
227
228 void Initialize() {
229 factory_.reset(new QuicStreamFactory(
230 &host_resolver_, &socket_factory_, http_server_properties_.GetWeakPtr(),
231 cert_verifier_.get(), nullptr, channel_id_service_.get(),
rtenneti052774e2015-11-24 21:00:12232 &transport_security_state_, cert_transparency_verifier_.get(),
jri7046038f2015-10-22 00:29:26233 /*SocketPerformanceWatcherFactory*/ nullptr,
234 &crypto_client_stream_factory_, &random_generator_, clock_,
235 kDefaultMaxPacketSize, std::string(),
236 SupportedVersions(GetParam().version), enable_port_selection_,
237 always_require_handshake_confirmation_, disable_connection_pooling_,
238 load_server_info_timeout_srtt_multiplier_, enable_connection_racing_,
239 enable_non_blocking_io_, disable_disk_cache_, prefer_aes_,
240 max_number_of_lossy_connections_, packet_loss_threshold_,
241 max_disabled_reasons_, threshold_timeouts_with_open_streams_,
242 threshold_public_resets_post_handshake_, receive_buffer_size_,
rtenneti6971c172016-01-15 20:12:10243 delay_tcp_race_, /*max_server_configs_stored_in_properties*/ 0,
zhongyi89649c32016-01-22 00:14:01244 close_sessions_on_ip_change_,
245 disable_quic_on_timeout_with_open_streams_,
246 idle_connection_timeout_seconds_, migrate_sessions_on_network_change_,
jrid36ada62016-02-06 02:42:08247 migrate_sessions_early_, QuicTagVector()));
jri7046038f2015-10-22 00:29:26248 factory_->set_require_confirmation(false);
rtenneti6971c172016-01-15 20:12:10249 EXPECT_FALSE(factory_->has_quic_server_info_factory());
jri7046038f2015-10-22 00:29:26250 factory_->set_quic_server_info_factory(new MockQuicServerInfoFactory());
rtenneti6971c172016-01-15 20:12:10251 EXPECT_TRUE(factory_->has_quic_server_info_factory());
[email protected]e13201d82012-12-12 05:00:32252 }
253
jri7e636642016-01-14 06:57:08254 void InitializeConnectionMigrationTest(
255 NetworkChangeNotifier::NetworkList connected_networks) {
256 scoped_mock_network_change_notifier_.reset(
257 new ScopedMockNetworkChangeNotifier());
258 MockNetworkChangeNotifier* mock_ncn =
259 scoped_mock_network_change_notifier_->mock_network_change_notifier();
260 mock_ncn->ForceNetworkHandlesSupported();
261 mock_ncn->SetConnectedNetworksList(connected_networks);
262 migrate_sessions_on_network_change_ = true;
jrid36ada62016-02-06 02:42:08263 migrate_sessions_early_ = true;
jri7e636642016-01-14 06:57:08264 Initialize();
265 }
266
bnccb7ff3c2015-05-21 20:51:55267 bool HasActiveSession(const HostPortPair& host_port_pair) {
jri7046038f2015-10-22 00:29:26268 return QuicStreamFactoryPeer::HasActiveSession(factory_.get(),
269 host_port_pair);
bnccb7ff3c2015-05-21 20:51:55270 }
271
272 scoped_ptr<QuicHttpStream> CreateFromSession(
273 const HostPortPair& host_port_pair) {
ckrasic4f9d88d2015-07-22 22:23:16274 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:26275 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair);
276 return QuicStreamFactoryPeer::CreateFromSession(factory_.get(), session);
[email protected]df157d9d2014-03-10 07:27:27277 }
[email protected]e13201d82012-12-12 05:00:32278
[email protected]bf4ea2f2014-03-10 22:57:53279 int GetSourcePortForNewSession(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10280 return GetSourcePortForNewSessionInner(destination, false);
281 }
282
rjshaded5ced072015-12-18 19:26:02283 int GetSourcePortForNewSessionAndGoAway(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10284 return GetSourcePortForNewSessionInner(destination, true);
285 }
286
[email protected]bf4ea2f2014-03-10 22:57:53287 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
[email protected]d8e2abf82014-03-06 10:30:10288 bool goaway_received) {
[email protected]3c772402013-12-18 21:38:11289 // Should only be called if there is no active session for this destination.
bnccb7ff3c2015-05-21 20:51:55290 EXPECT_FALSE(HasActiveSession(destination));
mmenke651bae7f2015-12-18 21:26:45291 size_t socket_count = socket_factory_.udp_client_socket_ports().size();
[email protected]3c772402013-12-18 21:38:11292
mmenke651bae7f2015-12-18 21:26:45293 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
294 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]3c772402013-12-18 21:38:11295 socket_factory_.AddSocketDataProvider(&socket_data);
296
jri7046038f2015-10-22 00:29:26297 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:59298 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56299 request.Request(destination, privacy_mode_,
rtennetia75df622015-06-21 23:59:50300 /*cert_verify_flags=*/0, destination.host(),
301 "GET", net_log_, callback_.callback()));
[email protected]3c772402013-12-18 21:38:11302
303 EXPECT_EQ(OK, callback_.WaitForResult());
304 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
305 EXPECT_TRUE(stream.get());
306 stream.reset();
307
ckrasic4f9d88d2015-07-22 22:23:16308 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:26309 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), destination);
[email protected]3c772402013-12-18 21:38:11310
mmenke651bae7f2015-12-18 21:26:45311 if (socket_count + 1 != socket_factory_.udp_client_socket_ports().size()) {
312 ADD_FAILURE();
[email protected]3c772402013-12-18 21:38:11313 return 0;
314 }
315
[email protected]d8e2abf82014-03-06 10:30:10316 if (goaway_received) {
317 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, "");
rtenneti9bd5d4b2015-08-21 05:44:52318 session->connection()->OnGoAwayFrame(goaway);
[email protected]d8e2abf82014-03-06 10:30:10319 }
[email protected]3c772402013-12-18 21:38:11320
jri7046038f2015-10-22 00:29:26321 factory_->OnSessionClosed(session);
bnccb7ff3c2015-05-21 20:51:55322 EXPECT_FALSE(HasActiveSession(destination));
rch37de576c2015-05-17 20:28:17323 EXPECT_TRUE(socket_data.AllReadDataConsumed());
324 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
mmenke651bae7f2015-12-18 21:26:45325 return socket_factory_.udp_client_socket_ports()[socket_count];
[email protected]3c772402013-12-18 21:38:11326 }
327
rtenneti1cd3b162015-09-29 02:58:28328 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
329 QuicPacketNumber num) {
330 return maker_.MakeConnectionClosePacket(num);
331 }
332
[email protected]459a7402014-02-10 12:58:52333 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() {
[email protected]66ae5962014-05-22 11:13:05334 QuicStreamId stream_id = kClientDataStreamId1;
[email protected]51cc1342014-04-18 23:44:37335 return maker_.MakeRstPacket(
336 1, true, stream_id,
rtenneti14abd312015-02-06 21:56:01337 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam().version));
[email protected]459a7402014-02-10 12:58:52338 }
339
bncf8bf0722015-05-19 20:04:13340 static ProofVerifyDetailsChromium DefaultProofVerifyDetails() {
rch6faa4d42016-01-05 20:48:43341 // Load a certificate that is valid for *.example.org
bncf8bf0722015-05-19 20:04:13342 scoped_refptr<X509Certificate> test_cert(
rch6faa4d42016-01-05 20:48:43343 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bncf8bf0722015-05-19 20:04:13344 EXPECT_TRUE(test_cert.get());
345 ProofVerifyDetailsChromium verify_details;
346 verify_details.cert_verify_result.verified_cert = test_cert;
347 verify_details.cert_verify_result.is_issued_by_known_root = true;
348 return verify_details;
349 }
350
jri8c44d692015-10-23 23:53:41351 void NotifyIPAddressChanged() {
352 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
jri7e636642016-01-14 06:57:08353 // Spin the message loop so the notification is delivered.
jri8c44d692015-10-23 23:53:41354 base::MessageLoop::current()->RunUntilIdle();
355 }
356
jri7e636642016-01-14 06:57:08357 scoped_ptr<QuicEncryptedPacket> ConstructGetRequestPacket(
358 QuicPacketNumber packet_number,
359 QuicStreamId stream_id,
360 bool should_include_version,
361 bool fin) {
362 SpdyHeaderBlock headers = maker_.GetRequestHeaders("GET", "https", "/");
363 SpdyPriority priority =
364 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
365 size_t spdy_headers_frame_len;
366 return maker_.MakeRequestHeadersPacket(
367 packet_number, stream_id, should_include_version, fin, priority,
368 headers, &spdy_headers_frame_len);
369 }
370
371 scoped_ptr<QuicEncryptedPacket> ConstructOkResponsePacket(
372 QuicPacketNumber packet_number,
373 QuicStreamId stream_id,
374 bool should_include_version,
375 bool fin) {
376 SpdyHeaderBlock headers = maker_.GetResponseHeaders("200 OK");
377 size_t spdy_headers_frame_len;
378 return maker_.MakeResponseHeadersPacket(packet_number, stream_id,
379 should_include_version, fin,
380 headers, &spdy_headers_frame_len);
381 }
382
[email protected]e13201d82012-12-12 05:00:32383 MockHostResolver host_resolver_;
mmenke651bae7f2015-12-18 21:26:45384 MockClientSocketFactory socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05385 MockCryptoClientStreamFactory crypto_client_stream_factory_;
jri7e636642016-01-14 06:57:08386 ProofVerifyDetailsChromium verify_details_;
[email protected]9558c5d32012-12-22 00:08:14387 MockRandom random_generator_;
[email protected]872edd9e2013-01-16 08:51:15388 MockClock* clock_; // Owned by factory_.
rtenneti38f5cd52014-10-28 20:28:28389 scoped_refptr<TestTaskRunner> runner_;
rtenneti4b06ae72014-08-26 03:43:43390 QuicTestPacketMaker maker_;
rtenneticcab42b2015-10-09 06:38:16391 HttpServerPropertiesImpl http_server_properties_;
[email protected]59c0bbd2014-03-22 04:08:12392 scoped_ptr<CertVerifier> cert_verifier_;
[email protected]6b8a3c742014-07-25 00:25:35393 scoped_ptr<ChannelIDService> channel_id_service_;
[email protected]080b77932014-08-04 01:22:46394 TransportSecurityState transport_security_state_;
rtenneti052774e2015-11-24 21:00:12395 scoped_ptr<CTVerifier> cert_transparency_verifier_;
jri7e636642016-01-14 06:57:08396 scoped_ptr<ScopedMockNetworkChangeNotifier>
397 scoped_mock_network_change_notifier_;
jri7046038f2015-10-22 00:29:26398 scoped_ptr<QuicStreamFactory> factory_;
[email protected]bf4ea2f2014-03-10 22:57:53399 HostPortPair host_port_pair_;
[email protected]9dd3ff0f2014-03-26 09:51:28400 PrivacyMode privacy_mode_;
[email protected]e13201d82012-12-12 05:00:32401 BoundNetLog net_log_;
402 TestCompletionCallback callback_;
jri7046038f2015-10-22 00:29:26403
404 // Variables to configure QuicStreamFactory.
405 bool enable_port_selection_;
406 bool always_require_handshake_confirmation_;
407 bool disable_connection_pooling_;
408 double load_server_info_timeout_srtt_multiplier_;
409 bool enable_connection_racing_;
410 bool enable_non_blocking_io_;
411 bool disable_disk_cache_;
412 bool prefer_aes_;
413 int max_number_of_lossy_connections_;
414 double packet_loss_threshold_;
415 int max_disabled_reasons_;
416 int threshold_timeouts_with_open_streams_;
417 int threshold_public_resets_post_handshake_;
418 int receive_buffer_size_;
419 bool delay_tcp_race_;
jri8c44d692015-10-23 23:53:41420 bool close_sessions_on_ip_change_;
zhongyi89649c32016-01-22 00:14:01421 bool disable_quic_on_timeout_with_open_streams_;
rtenneti41c09992015-11-30 18:24:01422 int idle_connection_timeout_seconds_;
jri7e636642016-01-14 06:57:08423 bool migrate_sessions_on_network_change_;
jrid36ada62016-02-06 02:42:08424 bool migrate_sessions_early_;
[email protected]e13201d82012-12-12 05:00:32425};
426
rtenneti14abd312015-02-06 21:56:01427INSTANTIATE_TEST_CASE_P(Version,
428 QuicStreamFactoryTest,
429 ::testing::ValuesIn(GetTestParams()));
[email protected]1e960032013-12-20 19:00:20430
[email protected]1e960032013-12-20 19:00:20431TEST_P(QuicStreamFactoryTest, Create) {
jri7046038f2015-10-22 00:29:26432 Initialize();
rch6faa4d42016-01-05 20:48:43433 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
434 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26435
mmenke651bae7f2015-12-18 21:26:45436 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
437 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:32438 socket_factory_.AddSocketDataProvider(&socket_data);
439
jri7046038f2015-10-22 00:29:26440 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:59441 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56442 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50443 /*cert_verify_flags=*/0, host_port_pair_.host(),
444 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32445
446 EXPECT_EQ(OK, callback_.WaitForResult());
447 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0edce6a2013-05-08 18:02:40448 EXPECT_TRUE(stream.get());
[email protected]e13201d82012-12-12 05:00:32449
450 // Will reset stream 3.
bnccb7ff3c2015-05-21 20:51:55451 stream = CreateFromSession(host_port_pair_);
[email protected]e13201d82012-12-12 05:00:32452 EXPECT_TRUE(stream.get());
453
[email protected]6d1b4ed2013-07-10 03:57:54454 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
455 // in streams on different sessions.
jri7046038f2015-10-22 00:29:26456 QuicStreamRequest request2(factory_.get());
rtennetia75df622015-06-21 23:59:50457 EXPECT_EQ(OK,
rchf114d982015-10-21 01:34:56458 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50459 /*cert_verify_flags=*/0, host_port_pair_.host(),
460 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32461 stream = request2.ReleaseStream(); // Will reset stream 5.
rjshaded5ced072015-12-18 19:26:02462 stream.reset(); // Will reset stream 7.
[email protected]e13201d82012-12-12 05:00:32463
rch37de576c2015-05-17 20:28:17464 EXPECT_TRUE(socket_data.AllReadDataConsumed());
465 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:32466}
467
[email protected]8bd2b812014-03-26 04:01:17468TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
jri7046038f2015-10-22 00:29:26469 Initialize();
rch6faa4d42016-01-05 20:48:43470 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
471 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26472
mmenke651bae7f2015-12-18 21:26:45473 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
474 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17475 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]8bd2b812014-03-26 04:01:17476
477 crypto_client_stream_factory_.set_handshake_mode(
478 MockCryptoClientStream::ZERO_RTT);
479 host_resolver_.set_synchronous_mode(true);
480 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
481 "192.168.0.1", "");
482
jri7046038f2015-10-22 00:29:26483 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56484 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50485 /*cert_verify_flags=*/0, host_port_pair_.host(),
486 "GET", net_log_, callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17487
488 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
489 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17490 EXPECT_TRUE(socket_data.AllReadDataConsumed());
491 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17492}
493
494TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
jri7046038f2015-10-22 00:29:26495 Initialize();
rch6faa4d42016-01-05 20:48:43496 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
497 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26498
mmenke651bae7f2015-12-18 21:26:45499 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
500 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]8bd2b812014-03-26 04:01:17501 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]8bd2b812014-03-26 04:01:17502
503 crypto_client_stream_factory_.set_handshake_mode(
504 MockCryptoClientStream::ZERO_RTT);
505 host_resolver_.set_synchronous_mode(true);
506 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
507 "192.168.0.1", "");
508
jri7046038f2015-10-22 00:29:26509 QuicStreamRequest request(factory_.get());
[email protected]8bd2b812014-03-26 04:01:17510 // Posts require handshake confirmation, so this will return asynchronously.
511 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56512 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50513 /*cert_verify_flags=*/0, host_port_pair_.host(),
514 "POST", net_log_, callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17515
516 // Confirm the handshake and verify that the stream is created.
517 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
518 QuicSession::HANDSHAKE_CONFIRMED);
519
520 EXPECT_EQ(OK, callback_.WaitForResult());
521 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
522 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17523 EXPECT_TRUE(socket_data.AllReadDataConsumed());
524 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17525}
526
bnc68d401dd2015-05-18 20:31:48527TEST_P(QuicStreamFactoryTest, NoZeroRttForDifferentHost) {
jri7046038f2015-10-22 00:29:26528 Initialize();
rch6faa4d42016-01-05 20:48:43529 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
530 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26531
mmenke651bae7f2015-12-18 21:26:45532 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
533 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
bnc68d401dd2015-05-18 20:31:48534 socket_factory_.AddSocketDataProvider(&socket_data);
bnc68d401dd2015-05-18 20:31:48535
536 crypto_client_stream_factory_.set_handshake_mode(
537 MockCryptoClientStream::ZERO_RTT);
538 host_resolver_.set_synchronous_mode(true);
539 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
540 "192.168.0.1", "");
541
jri7046038f2015-10-22 00:29:26542 QuicStreamRequest request(factory_.get());
rch6faa4d42016-01-05 20:48:43543 int rv =
544 request.Request(host_port_pair_, privacy_mode_, /*cert_verify_flags=*/0,
545 kServer2HostName, "GET", net_log_, callback_.callback());
bnc68d401dd2015-05-18 20:31:48546 // If server and origin have different hostnames, then handshake confirmation
547 // should be required, so Request will return asynchronously.
548 EXPECT_EQ(ERR_IO_PENDING, rv);
549 // Confirm handshake.
550 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
551 QuicSession::HANDSHAKE_CONFIRMED);
552 EXPECT_EQ(OK, callback_.WaitForResult());
553
554 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
555 EXPECT_TRUE(stream.get());
556 EXPECT_TRUE(socket_data.AllReadDataConsumed());
557 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
558}
559
rch68955482015-09-24 00:14:39560TEST_P(QuicStreamFactoryTest, GoAway) {
jri7046038f2015-10-22 00:29:26561 Initialize();
rch6faa4d42016-01-05 20:48:43562 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
563 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26564
mmenke651bae7f2015-12-18 21:26:45565 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
566 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rch68955482015-09-24 00:14:39567 socket_factory_.AddSocketDataProvider(&socket_data);
rch68955482015-09-24 00:14:39568
jri7046038f2015-10-22 00:29:26569 QuicStreamRequest request(factory_.get());
rch68955482015-09-24 00:14:39570 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:56571 request.Request(host_port_pair_, privacy_mode_,
rch68955482015-09-24 00:14:39572 /*cert_verify_flags=*/0, host_port_pair_.host(),
573 "GET", net_log_, callback_.callback()));
574
575 EXPECT_EQ(OK, callback_.WaitForResult());
576 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
577 EXPECT_TRUE(stream.get());
578
rchf114d982015-10-21 01:34:56579 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:26580 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
rch68955482015-09-24 00:14:39581
582 session->OnGoAway(QuicGoAwayFrame());
583
rchf114d982015-10-21 01:34:56584 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:26585 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
rch68955482015-09-24 00:14:39586
587 EXPECT_TRUE(socket_data.AllReadDataConsumed());
588 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
589}
590
[email protected]5db452202014-08-19 05:22:15591TEST_P(QuicStreamFactoryTest, Pooling) {
jri7046038f2015-10-22 00:29:26592 Initialize();
rch6faa4d42016-01-05 20:48:43593 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
594 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26595
mmenke651bae7f2015-12-18 21:26:45596 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
597 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38598 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]eed749f92013-12-23 18:57:38599
rch6faa4d42016-01-05 20:48:43600 HostPortPair server2(kServer2HostName, kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38601 host_resolver_.set_synchronous_mode(true);
rch6faa4d42016-01-05 20:48:43602 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
rjshaded5ced072015-12-18 19:26:02603 "192.168.0.1", "");
rch6faa4d42016-01-05 20:48:43604 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38605
jri7046038f2015-10-22 00:29:26606 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56607 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50608 /*cert_verify_flags=*/0, host_port_pair_.host(),
609 "GET", net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38610 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
611 EXPECT_TRUE(stream.get());
612
613 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26614 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56615 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50616 /*cert_verify_flags=*/0, server2.host(), "GET",
617 net_log_, callback.callback()));
[email protected]eed749f92013-12-23 18:57:38618 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
619 EXPECT_TRUE(stream2.get());
620
jri7046038f2015-10-22 00:29:26621 EXPECT_EQ(
622 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_),
623 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38624
rch37de576c2015-05-17 20:28:17625 EXPECT_TRUE(socket_data.AllReadDataConsumed());
626 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38627}
628
jri584002d12014-09-09 00:51:28629TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) {
jri7046038f2015-10-22 00:29:26630 disable_connection_pooling_ = true;
631 Initialize();
rch6faa4d42016-01-05 20:48:43632 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
633 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
634 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26635
mmenke651bae7f2015-12-18 21:26:45636 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
637 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
638 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28639 socket_factory_.AddSocketDataProvider(&socket_data1);
640 socket_factory_.AddSocketDataProvider(&socket_data2);
jri584002d12014-09-09 00:51:28641
rch6faa4d42016-01-05 20:48:43642 HostPortPair server2(kServer2HostName, kDefaultServerPort);
jri584002d12014-09-09 00:51:28643 host_resolver_.set_synchronous_mode(true);
rch6faa4d42016-01-05 20:48:43644 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
rjshaded5ced072015-12-18 19:26:02645 "192.168.0.1", "");
rch6faa4d42016-01-05 20:48:43646 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
jri584002d12014-09-09 00:51:28647
jri7046038f2015-10-22 00:29:26648 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56649 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50650 /*cert_verify_flags=*/0, host_port_pair_.host(),
651 "GET", net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28652 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
653 EXPECT_TRUE(stream.get());
654
655 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26656 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56657 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50658 /*cert_verify_flags=*/0, server2.host(), "GET",
659 net_log_, callback.callback()));
jri584002d12014-09-09 00:51:28660 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
661 EXPECT_TRUE(stream2.get());
662
jri7046038f2015-10-22 00:29:26663 EXPECT_NE(
664 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_),
665 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
jri584002d12014-09-09 00:51:28666
rch37de576c2015-05-17 20:28:17667 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
668 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
669 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
670 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28671}
672
[email protected]eed749f92013-12-23 18:57:38673TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
jri7046038f2015-10-22 00:29:26674 Initialize();
rch6faa4d42016-01-05 20:48:43675 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
676 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
677 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26678
mmenke651bae7f2015-12-18 21:26:45679 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
680 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
681 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38682 socket_factory_.AddSocketDataProvider(&socket_data1);
683 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]eed749f92013-12-23 18:57:38684
rch6faa4d42016-01-05 20:48:43685 HostPortPair server2(kServer2HostName, kDefaultServerPort);
[email protected]eed749f92013-12-23 18:57:38686 host_resolver_.set_synchronous_mode(true);
rch6faa4d42016-01-05 20:48:43687 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
rjshaded5ced072015-12-18 19:26:02688 "192.168.0.1", "");
rch6faa4d42016-01-05 20:48:43689 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38690
jri7046038f2015-10-22 00:29:26691 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56692 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:50693 /*cert_verify_flags=*/0, host_port_pair_.host(),
694 "GET", net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38695 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
696 EXPECT_TRUE(stream.get());
697
698 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26699 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56700 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50701 /*cert_verify_flags=*/0, server2.host(), "GET",
702 net_log_, callback.callback()));
[email protected]eed749f92013-12-23 18:57:38703 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
704 EXPECT_TRUE(stream2.get());
705
jri7046038f2015-10-22 00:29:26706 factory_->OnSessionGoingAway(
707 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_));
rchf114d982015-10-21 01:34:56708 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:26709 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
710 EXPECT_FALSE(
711 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38712
713 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:26714 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:56715 EXPECT_EQ(OK, request3.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50716 /*cert_verify_flags=*/0, server2.host(), "GET",
717 net_log_, callback3.callback()));
[email protected]eed749f92013-12-23 18:57:38718 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
719 EXPECT_TRUE(stream3.get());
720
jri7046038f2015-10-22 00:29:26721 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38722
rch37de576c2015-05-17 20:28:17723 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
724 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
725 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
726 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38727}
728
[email protected]5db452202014-08-19 05:22:15729TEST_P(QuicStreamFactoryTest, HttpsPooling) {
jri7046038f2015-10-22 00:29:26730 Initialize();
rch6faa4d42016-01-05 20:48:43731
mmenke651bae7f2015-12-18 21:26:45732 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
733 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]eed749f92013-12-23 18:57:38734 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]eed749f92013-12-23 18:57:38735
rch6faa4d42016-01-05 20:48:43736 HostPortPair server1(kDefaultServerHostName, 443);
737 HostPortPair server2(kServer2HostName, 443);
[email protected]eed749f92013-12-23 18:57:38738
bncf8bf0722015-05-19 20:04:13739 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01740 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38741
742 host_resolver_.set_synchronous_mode(true);
[email protected]bf4ea2f2014-03-10 22:57:53743 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
744 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:38745
jri7046038f2015-10-22 00:29:26746 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56747 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
rtennetia75df622015-06-21 23:59:50748 /*cert_verify_flags=*/0, server1.host(), "GET",
749 net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38750 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
751 EXPECT_TRUE(stream.get());
752
753 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26754 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56755 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50756 /*cert_verify_flags=*/0, server2.host(), "GET",
757 net_log_, callback_.callback()));
[email protected]eed749f92013-12-23 18:57:38758 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
759 EXPECT_TRUE(stream2.get());
760
jri7046038f2015-10-22 00:29:26761 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
762 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]eed749f92013-12-23 18:57:38763
rch37de576c2015-05-17 20:28:17764 EXPECT_TRUE(socket_data.AllReadDataConsumed());
765 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:38766}
767
jri584002d12014-09-09 00:51:28768TEST_P(QuicStreamFactoryTest, NoHttpsPoolingIfDisabled) {
jri7046038f2015-10-22 00:29:26769 disable_connection_pooling_ = true;
770 Initialize();
771
mmenke651bae7f2015-12-18 21:26:45772 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
773 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
774 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28775 socket_factory_.AddSocketDataProvider(&socket_data1);
776 socket_factory_.AddSocketDataProvider(&socket_data2);
jri584002d12014-09-09 00:51:28777
rch6faa4d42016-01-05 20:48:43778 HostPortPair server1(kDefaultServerHostName, 443);
779 HostPortPair server2(kServer2HostName, 443);
jri584002d12014-09-09 00:51:28780
bncf8bf0722015-05-19 20:04:13781 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01782 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rch6faa4d42016-01-05 20:48:43783 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28784
785 host_resolver_.set_synchronous_mode(true);
786 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
787 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
788
jri7046038f2015-10-22 00:29:26789 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56790 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
rtennetia75df622015-06-21 23:59:50791 /*cert_verify_flags=*/0, server1.host(), "GET",
792 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28793 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
794 EXPECT_TRUE(stream.get());
795
796 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26797 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56798 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50799 /*cert_verify_flags=*/0, server2.host(), "GET",
800 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28801 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
802 EXPECT_TRUE(stream2.get());
803
jri7046038f2015-10-22 00:29:26804 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
805 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
jri584002d12014-09-09 00:51:28806
rch37de576c2015-05-17 20:28:17807 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
808 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
809 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
810 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28811}
812
bnccb7ff3c2015-05-21 20:51:55813class QuicAlternativeServiceCertificateValidationPooling
814 : public QuicStreamFactoryTest {
815 public:
816 void Run(bool valid) {
mmenke651bae7f2015-12-18 21:26:45817 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
818 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
bnccb7ff3c2015-05-21 20:51:55819 socket_factory_.AddSocketDataProvider(&socket_data1);
[email protected]eed749f92013-12-23 18:57:38820
rch6faa4d42016-01-05 20:48:43821 HostPortPair server1(kDefaultServerHostName, 443);
822 HostPortPair server2(kServer2HostName, 443);
[email protected]eed749f92013-12-23 18:57:38823
rch6faa4d42016-01-05 20:48:43824 std::string origin_host(valid ? kServer2HostName : "invalid.example.com");
825 HostPortPair alternative(kDefaultServerHostName, 443);
[email protected]eed749f92013-12-23 18:57:38826
bnccb7ff3c2015-05-21 20:51:55827 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
828 bool common_name_fallback_used;
829 EXPECT_EQ(valid,
830 verify_details.cert_verify_result.verified_cert->VerifyNameMatch(
831 origin_host, &common_name_fallback_used));
832 EXPECT_TRUE(
833 verify_details.cert_verify_result.verified_cert->VerifyNameMatch(
834 alternative.host(), &common_name_fallback_used));
835 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:38836
bnccb7ff3c2015-05-21 20:51:55837 host_resolver_.set_synchronous_mode(true);
838 host_resolver_.rules()->AddIPLiteralRule(alternative.host(), "192.168.0.1",
839 "");
[email protected]eed749f92013-12-23 18:57:38840
bnccb7ff3c2015-05-21 20:51:55841 // Open first stream to alternative.
jri7046038f2015-10-22 00:29:26842 QuicStreamRequest request1(factory_.get());
rchf114d982015-10-21 01:34:56843 EXPECT_EQ(OK, request1.Request(alternative, privacy_mode_,
rtennetia75df622015-06-21 23:59:50844 /*cert_verify_flags=*/0, alternative.host(),
845 "GET", net_log_, callback_.callback()));
bnccb7ff3c2015-05-21 20:51:55846 scoped_ptr<QuicHttpStream> stream1 = request1.ReleaseStream();
847 EXPECT_TRUE(stream1.get());
[email protected]eed749f92013-12-23 18:57:38848
jri7046038f2015-10-22 00:29:26849 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56850 int rv = request2.Request(alternative, privacy_mode_,
rtennetia75df622015-06-21 23:59:50851 /*cert_verify_flags=*/0, origin_host, "GET",
852 net_log_, callback_.callback());
bnccb7ff3c2015-05-21 20:51:55853 if (valid) {
854 // Alternative service of origin to |alternative| should pool to session
855 // of |stream1| even if origin is different. Since only one
856 // SocketDataProvider is set up, the second request succeeding means that
857 // it pooled to the session opened by the first one.
858 EXPECT_EQ(OK, rv);
859 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
860 EXPECT_TRUE(stream2.get());
861 } else {
862 EXPECT_EQ(ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN, rv);
863 }
[email protected]eed749f92013-12-23 18:57:38864
bnccb7ff3c2015-05-21 20:51:55865 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
866 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
867 }
868};
869
870INSTANTIATE_TEST_CASE_P(Version,
871 QuicAlternativeServiceCertificateValidationPooling,
872 ::testing::ValuesIn(GetTestParams()));
873
874TEST_P(QuicAlternativeServiceCertificateValidationPooling, Valid) {
jri7046038f2015-10-22 00:29:26875 Initialize();
bnccb7ff3c2015-05-21 20:51:55876 Run(true);
877}
878
879TEST_P(QuicAlternativeServiceCertificateValidationPooling, Invalid) {
jri7046038f2015-10-22 00:29:26880 Initialize();
bnccb7ff3c2015-05-21 20:51:55881 Run(false);
[email protected]eed749f92013-12-23 18:57:38882}
883
[email protected]5db452202014-08-19 05:22:15884TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
jri7046038f2015-10-22 00:29:26885 Initialize();
mmenke651bae7f2015-12-18 21:26:45886 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
887 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15888 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]5db452202014-08-19 05:22:15889
rch6faa4d42016-01-05 20:48:43890 HostPortPair server1(kDefaultServerHostName, 443);
891 HostPortPair server2(kServer2HostName, 443);
Avi Drissman13fc8932015-12-20 04:40:46892 uint8_t primary_pin = 1;
893 uint8_t backup_pin = 2;
rch6faa4d42016-01-05 20:48:43894 test::AddPin(&transport_security_state_, kServer2HostName, primary_pin,
[email protected]5db452202014-08-19 05:22:15895 backup_pin);
896
bncf8bf0722015-05-19 20:04:13897 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
[email protected]5db452202014-08-19 05:22:15898 verify_details.cert_verify_result.public_key_hashes.push_back(
899 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01900 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]5db452202014-08-19 05:22:15901
902 host_resolver_.set_synchronous_mode(true);
903 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
904 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
905
jri7046038f2015-10-22 00:29:26906 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56907 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
rtennetia75df622015-06-21 23:59:50908 /*cert_verify_flags=*/0, server1.host(), "GET",
909 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15910 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
911 EXPECT_TRUE(stream.get());
912
913 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26914 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56915 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50916 /*cert_verify_flags=*/0, server2.host(), "GET",
917 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:15918 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
919 EXPECT_TRUE(stream2.get());
920
jri7046038f2015-10-22 00:29:26921 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
922 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]5db452202014-08-19 05:22:15923
rch37de576c2015-05-17 20:28:17924 EXPECT_TRUE(socket_data.AllReadDataConsumed());
925 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:15926}
927
jri584002d12014-09-09 00:51:28928TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithMatchingPinsIfDisabled) {
jri7046038f2015-10-22 00:29:26929 disable_connection_pooling_ = true;
930 Initialize();
931
mmenke651bae7f2015-12-18 21:26:45932 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
933 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
934 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
jri584002d12014-09-09 00:51:28935 socket_factory_.AddSocketDataProvider(&socket_data1);
936 socket_factory_.AddSocketDataProvider(&socket_data2);
jri584002d12014-09-09 00:51:28937
rch6faa4d42016-01-05 20:48:43938 HostPortPair server1(kDefaultServerHostName, 443);
939 HostPortPair server2(kServer2HostName, 443);
Avi Drissman13fc8932015-12-20 04:40:46940 uint8_t primary_pin = 1;
941 uint8_t backup_pin = 2;
rch6faa4d42016-01-05 20:48:43942 test::AddPin(&transport_security_state_, kServer2HostName, primary_pin,
jri584002d12014-09-09 00:51:28943 backup_pin);
944
bncf8bf0722015-05-19 20:04:13945 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
jri584002d12014-09-09 00:51:28946 verify_details.cert_verify_result.public_key_hashes.push_back(
947 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:01948 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rch6faa4d42016-01-05 20:48:43949 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri584002d12014-09-09 00:51:28950
951 host_resolver_.set_synchronous_mode(true);
952 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
953 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
954
jri7046038f2015-10-22 00:29:26955 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:56956 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
rtennetia75df622015-06-21 23:59:50957 /*cert_verify_flags=*/0, server1.host(), "GET",
958 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28959 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
960 EXPECT_TRUE(stream.get());
961
962 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:26963 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:56964 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:50965 /*cert_verify_flags=*/0, server2.host(), "GET",
966 net_log_, callback_.callback()));
jri584002d12014-09-09 00:51:28967 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
968 EXPECT_TRUE(stream2.get());
969
jri7046038f2015-10-22 00:29:26970 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
971 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
jri584002d12014-09-09 00:51:28972
rch37de576c2015-05-17 20:28:17973 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
974 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
975 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
976 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri584002d12014-09-09 00:51:28977}
978
[email protected]5db452202014-08-19 05:22:15979TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
jri7046038f2015-10-22 00:29:26980 Initialize();
mmenke651bae7f2015-12-18 21:26:45981 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
982 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
983 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]5db452202014-08-19 05:22:15984 socket_factory_.AddSocketDataProvider(&socket_data1);
985 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]5db452202014-08-19 05:22:15986
rch6faa4d42016-01-05 20:48:43987 HostPortPair server1(kDefaultServerHostName, 443);
988 HostPortPair server2(kServer2HostName, 443);
Avi Drissman13fc8932015-12-20 04:40:46989 uint8_t primary_pin = 1;
990 uint8_t backup_pin = 2;
991 uint8_t bad_pin = 3;
rch6faa4d42016-01-05 20:48:43992 test::AddPin(&transport_security_state_, kServer2HostName, primary_pin,
[email protected]5db452202014-08-19 05:22:15993 backup_pin);
994
bncf8bf0722015-05-19 20:04:13995 ProofVerifyDetailsChromium verify_details1 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:01996 verify_details1.cert_verify_result.public_key_hashes.push_back(
997 test::GetTestHashValue(bad_pin));
998 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
999
bncf8bf0722015-05-19 20:04:131000 ProofVerifyDetailsChromium verify_details2 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011001 verify_details2.cert_verify_result.public_key_hashes.push_back(
1002 test::GetTestHashValue(primary_pin));
1003 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
[email protected]5db452202014-08-19 05:22:151004
1005 host_resolver_.set_synchronous_mode(true);
1006 host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1007 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1008
jri7046038f2015-10-22 00:29:261009 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561010 EXPECT_EQ(OK, request.Request(server1, privacy_mode_,
rtennetia75df622015-06-21 23:59:501011 /*cert_verify_flags=*/0, server1.host(), "GET",
1012 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:151013 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1014 EXPECT_TRUE(stream.get());
1015
1016 TestCompletionCallback callback;
jri7046038f2015-10-22 00:29:261017 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:561018 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:501019 /*cert_verify_flags=*/0, server2.host(), "GET",
1020 net_log_, callback_.callback()));
[email protected]5db452202014-08-19 05:22:151021 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1022 EXPECT_TRUE(stream2.get());
1023
jri7046038f2015-10-22 00:29:261024 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server1),
1025 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2));
[email protected]5db452202014-08-19 05:22:151026
rch37de576c2015-05-17 20:28:171027 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1028 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1029 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1030 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:151031}
1032
[email protected]1e960032013-12-20 19:00:201033TEST_P(QuicStreamFactoryTest, Goaway) {
jri7046038f2015-10-22 00:29:261034 Initialize();
rch6faa4d42016-01-05 20:48:431035 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1036 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1037 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1038
mmenke651bae7f2015-12-18 21:26:451039 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1040 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271041 socket_factory_.AddSocketDataProvider(&socket_data);
mmenke651bae7f2015-12-18 21:26:451042 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
[email protected]4d283b32013-10-17 12:57:271043 socket_factory_.AddSocketDataProvider(&socket_data2);
1044
jri7046038f2015-10-22 00:29:261045 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591046 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561047 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501048 /*cert_verify_flags=*/0, host_port_pair_.host(),
1049 "GET", net_log_, callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271050
1051 EXPECT_EQ(OK, callback_.WaitForResult());
1052 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1053 EXPECT_TRUE(stream.get());
1054
1055 // Mark the session as going away. Ensure that while it is still alive
1056 // that it is no longer active.
rchf114d982015-10-21 01:34:561057 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:261058 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1059 factory_->OnSessionGoingAway(session);
1060 EXPECT_EQ(true,
1061 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
rchf114d982015-10-21 01:34:561062 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:261063 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
bnccb7ff3c2015-05-21 20:51:551064 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]4d283b32013-10-17 12:57:271065
1066 // Create a new request for the same destination and verify that a
1067 // new session is created.
jri7046038f2015-10-22 00:29:261068 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591069 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561070 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501071 /*cert_verify_flags=*/0, host_port_pair_.host(),
1072 "GET", net_log_, callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271073 EXPECT_EQ(OK, callback_.WaitForResult());
1074 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1075 EXPECT_TRUE(stream2.get());
1076
rchf114d982015-10-21 01:34:561077 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:261078 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
1079 EXPECT_NE(session, QuicStreamFactoryPeer::GetActiveSession(factory_.get(),
rchf114d982015-10-21 01:34:561080 host_port_pair_));
jri7046038f2015-10-22 00:29:261081 EXPECT_EQ(true,
1082 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
[email protected]4d283b32013-10-17 12:57:271083
1084 stream2.reset();
1085 stream.reset();
1086
rch37de576c2015-05-17 20:28:171087 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1088 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1089 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1090 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]4d283b32013-10-17 12:57:271091}
1092
[email protected]1e960032013-12-20 19:00:201093TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
jri7046038f2015-10-22 00:29:261094 Initialize();
rch6faa4d42016-01-05 20:48:431095 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1096 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1097
[email protected]66ae5962014-05-22 11:13:051098 QuicStreamId stream_id = kClientDataStreamId1;
ckrasicea295fe2015-10-31 05:03:271099 scoped_ptr<QuicEncryptedPacket> client_rst(
[email protected]1e960032013-12-20 19:00:201100 maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
[email protected]06ff5152013-08-29 01:03:051101 MockWrite writes[] = {
ckrasicea295fe2015-10-31 05:03:271102 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 0),
1103 };
1104 scoped_ptr<QuicEncryptedPacket> server_rst(
1105 maker_.MakeRstPacket(1, false, stream_id, QUIC_STREAM_CANCELLED));
1106 MockRead reads[] = {
1107 MockRead(ASYNC, server_rst->data(), server_rst->length(), 1),
mmenke651bae7f2015-12-18 21:26:451108 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
1109 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1110 arraysize(writes));
[email protected]0b2294d32013-08-02 00:46:361111 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]0b2294d32013-08-02 00:46:361112
1113 HttpRequestInfo request_info;
1114 std::vector<QuicHttpStream*> streams;
1115 // The MockCryptoClientStream sets max_open_streams to be
rtenneti6a4cf3b2015-01-09 03:41:151116 // kDefaultMaxStreamsPerConnection / 2.
1117 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection / 2; i++) {
jri7046038f2015-10-22 00:29:261118 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561119 int rv = request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501120 /*cert_verify_flags=*/0, host_port_pair_.host(),
1121 "GET", net_log_, callback_.callback());
[email protected]0b2294d32013-08-02 00:46:361122 if (i == 0) {
1123 EXPECT_EQ(ERR_IO_PENDING, rv);
1124 EXPECT_EQ(OK, callback_.WaitForResult());
1125 } else {
1126 EXPECT_EQ(OK, rv);
1127 }
1128 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1129 EXPECT_TRUE(stream);
rjshaded5ced072015-12-18 19:26:021130 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1131 net_log_, CompletionCallback()));
[email protected]0b2294d32013-08-02 00:46:361132 streams.push_back(stream.release());
1133 }
1134
jri7046038f2015-10-22 00:29:261135 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:561136 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501137 /*cert_verify_flags=*/0, host_port_pair_.host(),
1138 "GET", net_log_, CompletionCallback()));
[email protected]0b2294d32013-08-02 00:46:361139 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1140 EXPECT_TRUE(stream);
rjshaded5ced072015-12-18 19:26:021141 EXPECT_EQ(ERR_IO_PENDING,
1142 stream->InitializeStream(&request_info, DEFAULT_PRIORITY, net_log_,
1143 callback_.callback()));
[email protected]0b2294d32013-08-02 00:46:361144
1145 // Close the first stream.
1146 streams.front()->Close(false);
ckrasicea295fe2015-10-31 05:03:271147 // Trigger exchange of RSTs that in turn allow progress for the last
1148 // stream.
[email protected]0b2294d32013-08-02 00:46:361149 EXPECT_EQ(OK, callback_.WaitForResult());
1150
rch37de576c2015-05-17 20:28:171151 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1152 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
ckrasicea295fe2015-10-31 05:03:271153
1154 // Force close of the connection to suppress the generation of RST
1155 // packets when streams are torn down, which wouldn't be relevant to
1156 // this test anyway.
1157 QuicChromiumClientSession* session =
1158 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1159 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
1160
[email protected]0b2294d32013-08-02 00:46:361161 STLDeleteElements(&streams);
1162}
1163
[email protected]1e960032013-12-20 19:00:201164TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
jri7046038f2015-10-22 00:29:261165 Initialize();
mmenke651bae7f2015-12-18 21:26:451166 SequencedSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321167 socket_factory_.AddSocketDataProvider(&socket_data);
1168
[email protected]3c772402013-12-18 21:38:111169 host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName);
[email protected]e13201d82012-12-12 05:00:321170
jri7046038f2015-10-22 00:29:261171 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591172 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561173 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501174 /*cert_verify_flags=*/0, host_port_pair_.host(),
1175 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321176
1177 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
1178
rch37de576c2015-05-17 20:28:171179 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1180 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321181}
1182
[email protected]1e960032013-12-20 19:00:201183TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
jri7046038f2015-10-22 00:29:261184 Initialize();
[email protected]3c772402013-12-18 21:38:111185 MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
mmenke651bae7f2015-12-18 21:26:451186 SequencedSocketData socket_data(nullptr, 0, nullptr, 0);
[email protected]3c772402013-12-18 21:38:111187 socket_data.set_connect_data(connect);
1188 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]3c772402013-12-18 21:38:111189
jri7046038f2015-10-22 00:29:261190 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591191 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561192 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501193 /*cert_verify_flags=*/0, host_port_pair_.host(),
1194 "GET", net_log_, callback_.callback()));
[email protected]3c772402013-12-18 21:38:111195
1196 EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult());
1197
rch37de576c2015-05-17 20:28:171198 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1199 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:111200}
1201
[email protected]1e960032013-12-20 19:00:201202TEST_P(QuicStreamFactoryTest, CancelCreate) {
jri7046038f2015-10-22 00:29:261203 Initialize();
mmenke651bae7f2015-12-18 21:26:451204 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1205 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
[email protected]e13201d82012-12-12 05:00:321206 socket_factory_.AddSocketDataProvider(&socket_data);
1207 {
jri7046038f2015-10-22 00:29:261208 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591209 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561210 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501211 /*cert_verify_flags=*/0, host_port_pair_.host(),
1212 "GET", net_log_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321213 }
1214
mmenke651bae7f2015-12-18 21:26:451215 base::RunLoop().RunUntilIdle();
[email protected]e13201d82012-12-12 05:00:321216
bnccb7ff3c2015-05-21 20:51:551217 scoped_ptr<QuicHttpStream> stream(CreateFromSession(host_port_pair_));
[email protected]e13201d82012-12-12 05:00:321218 EXPECT_TRUE(stream.get());
1219 stream.reset();
1220
rch37de576c2015-05-17 20:28:171221 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1222 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321223}
1224
[email protected]1e960032013-12-20 19:00:201225TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) {
jri7046038f2015-10-22 00:29:261226 Initialize();
rch6faa4d42016-01-05 20:48:431227 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1228 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1229 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1230 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261231
[email protected]3c772402013-12-18 21:38:111232 // Sequentially connect to the default host, then another host, and then the
1233 // default host. Verify that the default host gets a consistent ephemeral
1234 // port, that is different from the other host's connection.
1235
rch6faa4d42016-01-05 20:48:431236 std::string other_server_name = kServer2HostName;
[email protected]3c772402013-12-18 21:38:111237 EXPECT_NE(kDefaultServerHostName, other_server_name);
1238 HostPortPair host_port_pair2(other_server_name, kDefaultServerPort);
[email protected]3c772402013-12-18 21:38:111239
[email protected]bf4ea2f2014-03-10 22:57:531240 int original_port = GetSourcePortForNewSession(host_port_pair_);
1241 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2));
1242 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]3c772402013-12-18 21:38:111243}
1244
[email protected]d8e2abf82014-03-06 10:30:101245TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) {
jri7046038f2015-10-22 00:29:261246 Initialize();
rch6faa4d42016-01-05 20:48:431247 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1248 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1249 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1250 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261251
[email protected]d8e2abf82014-03-06 10:30:101252 // Get a session to the host using the port suggester.
rjshaded5ced072015-12-18 19:26:021253 int original_port = GetSourcePortForNewSessionAndGoAway(host_port_pair_);
[email protected]d8e2abf82014-03-06 10:30:101254 // Verify that the port is different after the goaway.
[email protected]bf4ea2f2014-03-10 22:57:531255 EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101256 // Since the previous session did not goaway we should see the original port.
[email protected]bf4ea2f2014-03-10 22:57:531257 EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
[email protected]d8e2abf82014-03-06 10:30:101258}
1259
[email protected]1e960032013-12-20 19:00:201260TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
jri7046038f2015-10-22 00:29:261261 Initialize();
rch6faa4d42016-01-05 20:48:431262 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1263 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1264 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1265
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]56dfb902013-01-03 23:17:551273 socket_factory_.AddSocketDataProvider(&socket_data);
1274
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]56dfb902013-01-03 23:17:551277 socket_factory_.AddSocketDataProvider(&socket_data2);
1278
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]56dfb902013-01-03 23:17:551284
1285 EXPECT_EQ(OK, callback_.WaitForResult());
1286 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361287 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:021288 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]0b2294d32013-08-02 00:46:361289 net_log_, CompletionCallback()));
[email protected]56dfb902013-01-03 23:17:551290
1291 // Close the session and verify that stream saw the error.
jri7e636642016-01-14 06:57:081292 factory_->CloseAllSessions(ERR_INTERNET_DISCONNECTED, QUIC_INTERNAL_ERROR);
[email protected]56dfb902013-01-03 23:17:551293 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1294 stream->ReadResponseHeaders(callback_.callback()));
1295
1296 // Now attempting to request a stream to the same origin should create
1297 // a new session.
1298
jri7046038f2015-10-22 00:29:261299 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591300 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561301 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501302 /*cert_verify_flags=*/0, host_port_pair_.host(),
1303 "GET", net_log_, callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551304
1305 EXPECT_EQ(OK, callback_.WaitForResult());
1306 stream = request2.ReleaseStream();
1307 stream.reset(); // Will reset stream 3.
1308
rch37de576c2015-05-17 20:28:171309 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1310 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1311 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1312 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]56dfb902013-01-03 23:17:551313}
1314
[email protected]1e960032013-12-20 19:00:201315TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
jri8c44d692015-10-23 23:53:411316 close_sessions_on_ip_change_ = true;
jri7046038f2015-10-22 00:29:261317 Initialize();
rch6faa4d42016-01-05 20:48:431318 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1319 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1320 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri8c44d692015-10-23 23:53:411321
mmenke651bae7f2015-12-18 21:26:451322 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
[email protected]459a7402014-02-10 12:58:521323 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
1324 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:311325 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:451326 SequencedSocketData socket_data(reads, arraysize(reads),
1327 writes.empty() ? nullptr : &writes[0],
1328 writes.size());
[email protected]f698a012013-05-06 20:18:591329 socket_factory_.AddSocketDataProvider(&socket_data);
1330
mmenke651bae7f2015-12-18 21:26:451331 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1332 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]f698a012013-05-06 20:18:591333 socket_factory_.AddSocketDataProvider(&socket_data2);
1334
jri7046038f2015-10-22 00:29:261335 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:591336 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561337 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501338 /*cert_verify_flags=*/0, host_port_pair_.host(),
1339 "GET", net_log_, callback_.callback()));
[email protected]f698a012013-05-06 20:18:591340
1341 EXPECT_EQ(OK, callback_.WaitForResult());
1342 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
[email protected]0b2294d32013-08-02 00:46:361343 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:021344 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]0b2294d32013-08-02 00:46:361345 net_log_, CompletionCallback()));
[email protected]f698a012013-05-06 20:18:591346
1347 // Change the IP address and verify that stream saw the error.
jri8c44d692015-10-23 23:53:411348 NotifyIPAddressChanged();
[email protected]f698a012013-05-06 20:18:591349 EXPECT_EQ(ERR_NETWORK_CHANGED,
1350 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:261351 EXPECT_TRUE(factory_->require_confirmation());
[email protected]f698a012013-05-06 20:18:591352
1353 // Now attempting to request a stream to the same origin should create
1354 // a new session.
1355
jri7046038f2015-10-22 00:29:261356 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:591357 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:561358 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:501359 /*cert_verify_flags=*/0, host_port_pair_.host(),
1360 "GET", net_log_, callback_.callback()));
[email protected]f698a012013-05-06 20:18:591361
1362 EXPECT_EQ(OK, callback_.WaitForResult());
1363 stream = request2.ReleaseStream();
1364 stream.reset(); // Will reset stream 3.
1365
rch37de576c2015-05-17 20:28:171366 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1367 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1368 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1369 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]f698a012013-05-06 20:18:591370}
1371
jri7e636642016-01-14 06:57:081372TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnect) {
1373 InitializeConnectionMigrationTest(
1374 {kDefaultNetworkForTests, kNewNetworkForTests});
1375 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1376 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1377 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1378
1379 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1380 scoped_ptr<QuicEncryptedPacket> request_packet(
1381 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true));
1382 MockWrite writes[] = {MockWrite(SYNCHRONOUS, request_packet->data(),
1383 request_packet->length(), 1)};
1384 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1385 arraysize(writes));
1386 socket_factory_.AddSocketDataProvider(&socket_data);
1387
1388 // Create request and QuicHttpStream.
1389 QuicStreamRequest request(factory_.get());
1390 EXPECT_EQ(ERR_IO_PENDING,
1391 request.Request(host_port_pair_, privacy_mode_,
1392 /*cert_verify_flags=*/0, host_port_pair_.host(),
1393 "GET", net_log_, callback_.callback()));
1394 EXPECT_EQ(OK, callback_.WaitForResult());
1395 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1396 EXPECT_TRUE(stream.get());
1397
1398 // Cause QUIC stream to be created.
1399 HttpRequestInfo request_info;
1400 request_info.method = "GET";
1401 request_info.url = GURL("https://www.example.org/");
1402 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1403 net_log_, CompletionCallback()));
1404
1405 // Ensure that session is alive and active.
1406 QuicChromiumClientSession* session =
1407 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1408 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1409 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1410
1411 // Send GET request on stream.
1412 HttpResponseInfo response;
1413 HttpRequestHeaders request_headers;
1414 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
1415 callback_.callback()));
1416
1417 // Set up second socket data provider that is used after migration.
1418 // The response to the earlier request is read on this new socket.
1419 scoped_ptr<QuicEncryptedPacket> ping(
1420 maker_.MakePingPacket(2, /*include_version=*/true));
1421 MockWrite writes1[] = {
1422 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 0)};
1423 scoped_ptr<QuicEncryptedPacket> response_headers_packet(
1424 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
1425 MockRead reads1[] = {MockRead(ASYNC, response_headers_packet->data(),
1426 response_headers_packet->length(), 1),
1427 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
1428 SequencedSocketData socket_data1(reads1, arraysize(reads1), writes1,
1429 arraysize(writes1));
1430 socket_factory_.AddSocketDataProvider(&socket_data1);
1431
1432 // Trigger connection migration. This should cause a PING frame
1433 // to be emitted.
1434 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1435 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1436
1437 // The session should now be marked as going away. Ensure that
1438 // while it is still alive, it is no longer active.
1439 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1440 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1441 EXPECT_EQ(1u, session->GetNumActiveStreams());
1442
1443 // Verify that response headers on the migrated socket were delivered to the
1444 // stream.
1445 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
1446 EXPECT_EQ(200, response.headers->response_code());
1447
1448 // Create a new request for the same destination and verify that a
1449 // new session is created.
1450 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1451 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1452 socket_factory_.AddSocketDataProvider(&socket_data2);
1453
1454 QuicStreamRequest request2(factory_.get());
1455 EXPECT_EQ(ERR_IO_PENDING,
1456 request2.Request(host_port_pair_, privacy_mode_,
1457 /*cert_verify_flags=*/0, host_port_pair_.host(),
1458 "GET", net_log_, callback_.callback()));
1459 EXPECT_EQ(OK, callback_.WaitForResult());
1460 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1461 EXPECT_TRUE(stream2.get());
1462
1463 EXPECT_TRUE(
1464 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
jrid36ada62016-02-06 02:42:081465 QuicChromiumClientSession* new_session =
1466 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1467 EXPECT_NE(session, new_session);
jri7e636642016-01-14 06:57:081468
jrid36ada62016-02-06 02:42:081469 // On a DISCONNECTED notification, nothing happens to the migrated
1470 // session, but the new session is closed since it has no open
1471 // streams.
jri7e636642016-01-14 06:57:081472 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1473 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1474 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1475 EXPECT_EQ(1u, session->GetNumActiveStreams());
jrid36ada62016-02-06 02:42:081476 EXPECT_FALSE(
1477 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), new_session));
jri7e636642016-01-14 06:57:081478
1479 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1480 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1481 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1482 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1483 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1484 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1485}
1486
1487TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnected) {
1488 InitializeConnectionMigrationTest(
1489 {kDefaultNetworkForTests, kNewNetworkForTests});
1490 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1491 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1492 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1493
1494 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1495 scoped_ptr<QuicEncryptedPacket> request_packet(
1496 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true));
1497 MockWrite writes[] = {MockWrite(SYNCHRONOUS, request_packet->data(),
1498 request_packet->length(), 1)};
1499 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1500 arraysize(writes));
1501 socket_factory_.AddSocketDataProvider(&socket_data);
1502
1503 // Create request and QuicHttpStream.
1504 QuicStreamRequest request(factory_.get());
1505 EXPECT_EQ(ERR_IO_PENDING,
1506 request.Request(host_port_pair_, privacy_mode_,
1507 /*cert_verify_flags=*/0, host_port_pair_.host(),
1508 "GET", net_log_, callback_.callback()));
1509 EXPECT_EQ(OK, callback_.WaitForResult());
1510 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1511 EXPECT_TRUE(stream.get());
1512
1513 // Cause QUIC stream to be created.
1514 HttpRequestInfo request_info;
1515 request_info.method = "GET";
1516 request_info.url = GURL("https://www.example.org/");
1517 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1518 net_log_, CompletionCallback()));
1519
1520 // Ensure that session is alive and active.
1521 QuicChromiumClientSession* session =
1522 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1523 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1524 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1525
1526 // Send GET request on stream.
1527 HttpResponseInfo response_info;
1528 HttpRequestHeaders request_headers;
1529 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response_info,
1530 callback_.callback()));
1531
1532 // Set up second socket data provider that is used after migration.
1533 scoped_ptr<QuicEncryptedPacket> ping(
1534 maker_.MakePingPacket(2, /*include_version=*/true));
1535 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
1536 3, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1537 MockWrite writes1[] = {
1538 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 0)};
1539 scoped_ptr<QuicEncryptedPacket> response_packet(
1540 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
1541 MockRead reads1[] = {
1542 MockRead(ASYNC, response_packet->data(), response_packet->length(), 1),
1543 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
1544 SequencedSocketData socket_data1(reads1, arraysize(reads1), writes1,
1545 arraysize(writes1));
1546 socket_factory_.AddSocketDataProvider(&socket_data1);
1547
1548 // Trigger connection migration. This should cause a PING frame
1549 // to be emitted.
1550 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1551 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1552
1553 // The session should now be marked as going away. Ensure that
1554 // while it is still alive, it is no longer active.
1555 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1556 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1557 EXPECT_EQ(1u, session->GetNumActiveStreams());
1558
1559 // Create a new request for the same destination and verify that a
1560 // new session is created.
1561 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1562 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1563 socket_factory_.AddSocketDataProvider(&socket_data2);
1564
1565 QuicStreamRequest request2(factory_.get());
1566 EXPECT_EQ(ERR_IO_PENDING,
1567 request2.Request(host_port_pair_, privacy_mode_,
1568 /*cert_verify_flags=*/0, host_port_pair_.host(),
1569 "GET", net_log_, callback_.callback()));
1570 EXPECT_EQ(OK, callback_.WaitForResult());
1571 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1572 EXPECT_TRUE(stream2.get());
1573
1574 EXPECT_TRUE(
1575 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
1576 EXPECT_NE(session, QuicStreamFactoryPeer::GetActiveSession(factory_.get(),
1577 host_port_pair_));
1578 EXPECT_EQ(true,
1579 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1580
1581 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1582 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1583 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1584 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1585 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1586 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1587}
1588
1589TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoNetworks) {
1590 NetworkChangeNotifier::NetworkList no_networks(0);
1591 InitializeConnectionMigrationTest(no_networks);
1592 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1593 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1594
1595 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1596 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
1597 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1598 MockWrite writes[] = {
1599 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1600 };
1601 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1602 arraysize(writes));
1603 socket_factory_.AddSocketDataProvider(&socket_data);
1604
1605 // Create request and QuicHttpStream.
1606 QuicStreamRequest request(factory_.get());
1607 EXPECT_EQ(ERR_IO_PENDING,
1608 request.Request(host_port_pair_, privacy_mode_,
1609 /*cert_verify_flags=*/0, host_port_pair_.host(),
1610 "GET", net_log_, callback_.callback()));
1611 EXPECT_EQ(OK, callback_.WaitForResult());
1612 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1613 EXPECT_TRUE(stream.get());
1614
1615 // Cause QUIC stream to be created.
1616 HttpRequestInfo request_info;
1617 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1618 net_log_, CompletionCallback()));
1619
1620 // Ensure that session is alive and active.
1621 QuicChromiumClientSession* session =
1622 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1623 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1624 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1625 EXPECT_EQ(1u, session->GetNumActiveStreams());
1626
1627 // Trigger connection migration. Since there are no networks
1628 // to migrate to, this should cause the session to continue on the same
1629 // socket, but be marked as going away.
1630 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1631 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1632
1633 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1634 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1635 EXPECT_EQ(1u, session->GetNumActiveStreams());
1636
1637 stream.reset();
1638
1639 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1640 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1641}
1642
1643TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoNetworks) {
1644 NetworkChangeNotifier::NetworkList no_networks(0);
1645 InitializeConnectionMigrationTest(no_networks);
1646 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1647 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1648
1649 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1650 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
1651 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1652 MockWrite writes[] = {
1653 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
1654 };
1655 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1656 arraysize(writes));
1657 socket_factory_.AddSocketDataProvider(&socket_data);
1658
1659 // Create request and QuicHttpStream.
1660 QuicStreamRequest request(factory_.get());
1661 EXPECT_EQ(ERR_IO_PENDING,
1662 request.Request(host_port_pair_, privacy_mode_,
1663 /*cert_verify_flags=*/0, host_port_pair_.host(),
1664 "GET", net_log_, callback_.callback()));
1665 EXPECT_EQ(OK, callback_.WaitForResult());
1666 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1667 EXPECT_TRUE(stream.get());
1668
1669 // Cause QUIC stream to be created.
1670 HttpRequestInfo request_info;
1671 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1672 net_log_, CompletionCallback()));
1673
1674 // Ensure that session is alive and active.
1675 QuicChromiumClientSession* session =
1676 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1677 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1678 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1679
1680 // Trigger connection migration. Since there are no networks
1681 // to migrate to, this should cause a RST_STREAM frame to be emitted
1682 // and the session to be closed.
1683 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1684 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1685
1686 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1687 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1688
1689 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1690 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1691}
1692
1693TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoNewNetwork) {
1694 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
1695 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1696 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1697
1698 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1699 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
1700 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
1701 MockWrite writes[] = {
1702 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
1703 };
1704 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1705 arraysize(writes));
1706 socket_factory_.AddSocketDataProvider(&socket_data);
1707
1708 // Create request and QuicHttpStream.
1709 QuicStreamRequest request(factory_.get());
1710 EXPECT_EQ(ERR_IO_PENDING,
1711 request.Request(host_port_pair_, privacy_mode_,
1712 /*cert_verify_flags=*/0, host_port_pair_.host(),
1713 "GET", net_log_, callback_.callback()));
1714 EXPECT_EQ(OK, callback_.WaitForResult());
1715 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1716 EXPECT_TRUE(stream.get());
1717
1718 // Cause QUIC stream to be created.
1719 HttpRequestInfo request_info;
1720 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1721 net_log_, CompletionCallback()));
1722
1723 // Ensure that session is alive and active.
1724 QuicChromiumClientSession* session =
1725 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1726 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1727 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1728
1729 // Trigger connection migration. Since there are no networks
1730 // to migrate to, this should cause session to be continue but be marked as
1731 // going away.
1732 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1733 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1734
1735 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1736 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1737 EXPECT_EQ(1u, session->GetNumActiveStreams());
1738
1739 stream.reset();
1740
1741 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1742 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1743}
1744
1745TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoNewNetwork) {
1746 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
1747 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1748 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1749
1750 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1751 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
1752 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
1753 MockWrite writes[] = {
1754 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
1755 };
1756 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1757 arraysize(writes));
1758 socket_factory_.AddSocketDataProvider(&socket_data);
1759
1760 // Create request and QuicHttpStream.
1761 QuicStreamRequest request(factory_.get());
1762 EXPECT_EQ(ERR_IO_PENDING,
1763 request.Request(host_port_pair_, privacy_mode_,
1764 /*cert_verify_flags=*/0, host_port_pair_.host(),
1765 "GET", net_log_, callback_.callback()));
1766 EXPECT_EQ(OK, callback_.WaitForResult());
1767 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1768 EXPECT_TRUE(stream.get());
1769
1770 // Cause QUIC stream to be created.
1771 HttpRequestInfo request_info;
1772 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1773 net_log_, CompletionCallback()));
1774
1775 // Ensure that session is alive and active.
1776 QuicChromiumClientSession* session =
1777 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1778 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1779 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1780
1781 // Trigger connection migration. Since there are no networks
1782 // to migrate to, this should cause a RST_STREAM frame to be emitted
1783 // with QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed.
1784 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1785 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1786
1787 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1788 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1789
1790 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1791 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1792}
1793
1794TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoOpenStreams) {
1795 InitializeConnectionMigrationTest(
1796 {kDefaultNetworkForTests, kNewNetworkForTests});
1797 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1798 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1799
1800 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1801 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0u);
1802 socket_factory_.AddSocketDataProvider(&socket_data);
1803
1804 // Create request and QuicHttpStream.
1805 QuicStreamRequest request(factory_.get());
1806 EXPECT_EQ(ERR_IO_PENDING,
1807 request.Request(host_port_pair_, privacy_mode_,
1808 /*cert_verify_flags=*/0, host_port_pair_.host(),
1809 "GET", net_log_, callback_.callback()));
1810 EXPECT_EQ(OK, callback_.WaitForResult());
1811 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1812 EXPECT_TRUE(stream.get());
1813
1814 // Ensure that session is alive and active.
1815 QuicChromiumClientSession* session =
1816 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1817 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1818 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1819
1820 // Trigger connection migration. Since there are no active streams,
1821 // the session will be closed.
1822 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1823 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1824
1825 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1826 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1827
1828 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1829 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1830}
1831
1832TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNoOpenStreams) {
1833 InitializeConnectionMigrationTest(
1834 {kDefaultNetworkForTests, kNewNetworkForTests});
1835 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1836 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1837
1838 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1839 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0u);
1840 socket_factory_.AddSocketDataProvider(&socket_data);
1841
1842 // Create request and QuicHttpStream.
1843 QuicStreamRequest request(factory_.get());
1844 EXPECT_EQ(ERR_IO_PENDING,
1845 request.Request(host_port_pair_, privacy_mode_,
1846 /*cert_verify_flags=*/0, host_port_pair_.host(),
1847 "GET", net_log_, callback_.callback()));
1848 EXPECT_EQ(OK, callback_.WaitForResult());
1849 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1850 EXPECT_TRUE(stream.get());
1851
1852 // Ensure that session is alive and active.
1853 QuicChromiumClientSession* session =
1854 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1855 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1856 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1857
1858 // Trigger connection migration. Since there are no active streams,
1859 // the session will be closed.
1860 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1861 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1862
1863 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1864 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1865
1866 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1867 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1868}
1869
jrid36ada62016-02-06 02:42:081870TEST_P(QuicStreamFactoryTest, MigrateSessionEarly) {
1871 InitializeConnectionMigrationTest(
1872 {kDefaultNetworkForTests, kNewNetworkForTests});
1873 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1874 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1875 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1876
1877 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1878 scoped_ptr<QuicEncryptedPacket> request_packet(
1879 ConstructGetRequestPacket(1, kClientDataStreamId1, true, true));
1880 MockWrite writes[] = {MockWrite(SYNCHRONOUS, request_packet->data(),
1881 request_packet->length(), 1)};
1882 SequencedSocketData socket_data(reads, arraysize(reads), writes,
1883 arraysize(writes));
1884 socket_factory_.AddSocketDataProvider(&socket_data);
1885
1886 // Create request and QuicHttpStream.
1887 QuicStreamRequest request(factory_.get());
1888 EXPECT_EQ(ERR_IO_PENDING,
1889 request.Request(host_port_pair_, privacy_mode_,
1890 /*cert_verify_flags=*/0, host_port_pair_.host(),
1891 "GET", net_log_, callback_.callback()));
1892 EXPECT_EQ(OK, callback_.WaitForResult());
1893 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1894 EXPECT_TRUE(stream.get());
1895
1896 // Cause QUIC stream to be created.
1897 HttpRequestInfo request_info;
1898 request_info.method = "GET";
1899 request_info.url = GURL("https://www.example.org/");
1900 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1901 net_log_, CompletionCallback()));
1902
1903 // Ensure that session is alive and active.
1904 QuicChromiumClientSession* session =
1905 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1906 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1907 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1908
1909 // Send GET request on stream.
1910 HttpResponseInfo response;
1911 HttpRequestHeaders request_headers;
1912 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
1913 callback_.callback()));
1914
1915 // Set up second socket data provider that is used after migration.
1916 // The response to the earlier request is read on this new socket.
1917 scoped_ptr<QuicEncryptedPacket> ping(
1918 maker_.MakePingPacket(2, /*include_version=*/true));
1919 MockWrite writes1[] = {
1920 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 0)};
1921 scoped_ptr<QuicEncryptedPacket> response_headers_packet(
1922 ConstructOkResponsePacket(1, kClientDataStreamId1, false, false));
1923 MockRead reads1[] = {MockRead(ASYNC, response_headers_packet->data(),
1924 response_headers_packet->length(), 1),
1925 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
1926 SequencedSocketData socket_data1(reads1, arraysize(reads1), writes1,
1927 arraysize(writes1));
1928 socket_factory_.AddSocketDataProvider(&socket_data1);
1929
1930 // Trigger early connection migration. This should cause a PING frame
1931 // to be emitted.
1932 session->OnPathDegrading();
1933
1934 // Run the message loop so that data queued in the new socket is read by the
1935 // packet reader.
1936 base::RunLoop().RunUntilIdle();
1937
1938 // The session should now be marked as going away. Ensure that
1939 // while it is still alive, it is no longer active.
1940 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1941 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1942 EXPECT_EQ(1u, session->GetNumActiveStreams());
1943
1944 // Verify that response headers on the migrated socket were delivered to the
1945 // stream.
1946 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
1947 EXPECT_EQ(200, response.headers->response_code());
1948
1949 // Create a new request for the same destination and verify that a
1950 // new session is created.
1951 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
1952 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
1953 socket_factory_.AddSocketDataProvider(&socket_data2);
1954
1955 QuicStreamRequest request2(factory_.get());
1956 EXPECT_EQ(ERR_IO_PENDING,
1957 request2.Request(host_port_pair_, privacy_mode_,
1958 /*cert_verify_flags=*/0, host_port_pair_.host(),
1959 "GET", net_log_, callback_.callback()));
1960 EXPECT_EQ(OK, callback_.WaitForResult());
1961 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1962 EXPECT_TRUE(stream2.get());
1963
1964 EXPECT_TRUE(
1965 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
1966 QuicChromiumClientSession* new_session =
1967 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
1968 EXPECT_NE(session, new_session);
1969
1970 // On a SOON_TO_DISCONNECT notification, nothing happens to the
1971 // migrated session, but the new session is closed since it has no
1972 // open streams.
1973 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1974 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests);
1975 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1976 EXPECT_EQ(1u, session->GetNumActiveStreams());
1977 EXPECT_FALSE(
1978 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), new_session));
1979
1980 // On a DISCONNECTED notification, nothing happens to the migrated session.
1981 scoped_mock_network_change_notifier_->mock_network_change_notifier()
1982 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
1983 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
1984 EXPECT_EQ(1u, session->GetNumActiveStreams());
1985
1986 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1987 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1988 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1989 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1990 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1991 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1992}
1993
1994TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyNoNewNetwork) {
1995 InitializeConnectionMigrationTest({kDefaultNetworkForTests});
1996 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1997 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1998
1999 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2000 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
2001 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
2002 MockWrite writes[] = {
2003 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
2004 };
2005 SequencedSocketData socket_data(reads, arraysize(reads), writes,
2006 arraysize(writes));
2007 socket_factory_.AddSocketDataProvider(&socket_data);
2008
2009 // Create request and QuicHttpStream.
2010 QuicStreamRequest request(factory_.get());
2011 EXPECT_EQ(ERR_IO_PENDING,
2012 request.Request(host_port_pair_, privacy_mode_,
2013 /*cert_verify_flags=*/0, host_port_pair_.host(),
2014 "GET", net_log_, callback_.callback()));
2015 EXPECT_EQ(OK, callback_.WaitForResult());
2016 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2017 EXPECT_TRUE(stream.get());
2018
2019 // Cause QUIC stream to be created.
2020 HttpRequestInfo request_info;
2021 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2022 net_log_, CompletionCallback()));
2023
2024 // Ensure that session is alive and active.
2025 QuicChromiumClientSession* session =
2026 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
2027 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2028 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2029
2030 // Trigger connection migration. Since there are no networks
2031 // to migrate to, this should cause session to be continue but be marked as
2032 // going away.
2033 session->OnPathDegrading();
2034
2035 // Run the message loop so that data queued in the new socket is read by the
2036 // packet reader.
2037 base::RunLoop().RunUntilIdle();
2038
2039 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2040 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2041 EXPECT_EQ(1u, session->GetNumActiveStreams());
2042
2043 stream.reset();
2044
2045 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2046 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2047}
2048
rch02d87792015-09-09 09:05:532049TEST_P(QuicStreamFactoryTest, OnSSLConfigChanged) {
jri7046038f2015-10-22 00:29:262050 Initialize();
rch6faa4d42016-01-05 20:48:432051 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2052 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2053 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2054
mmenke651bae7f2015-12-18 21:26:452055 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
rch02d87792015-09-09 09:05:532056 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
2057 std::vector<MockWrite> writes;
2058 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:452059 SequencedSocketData socket_data(reads, arraysize(reads),
2060 writes.empty() ? nullptr : &writes[0],
2061 writes.size());
rch02d87792015-09-09 09:05:532062 socket_factory_.AddSocketDataProvider(&socket_data);
rch02d87792015-09-09 09:05:532063
mmenke651bae7f2015-12-18 21:26:452064 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2065 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
rch02d87792015-09-09 09:05:532066 socket_factory_.AddSocketDataProvider(&socket_data2);
rch02d87792015-09-09 09:05:532067
jri7046038f2015-10-22 00:29:262068 QuicStreamRequest request(factory_.get());
rch02d87792015-09-09 09:05:532069 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562070 request.Request(host_port_pair_, privacy_mode_,
rch02d87792015-09-09 09:05:532071 /*cert_verify_flags=*/0, host_port_pair_.host(),
2072 "GET", net_log_, callback_.callback()));
2073
2074 EXPECT_EQ(OK, callback_.WaitForResult());
2075 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2076 HttpRequestInfo request_info;
2077 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2078 net_log_, CompletionCallback()));
2079
jri7046038f2015-10-22 00:29:262080 factory_->OnSSLConfigChanged();
rch02d87792015-09-09 09:05:532081 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
2082 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262083 EXPECT_FALSE(factory_->require_confirmation());
rch02d87792015-09-09 09:05:532084
2085 // Now attempting to request a stream to the same origin should create
2086 // a new session.
2087
jri7046038f2015-10-22 00:29:262088 QuicStreamRequest request2(factory_.get());
rch02d87792015-09-09 09:05:532089 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562090 request2.Request(host_port_pair_, privacy_mode_,
rch02d87792015-09-09 09:05:532091 /*cert_verify_flags=*/0, host_port_pair_.host(),
2092 "GET", net_log_, callback_.callback()));
2093
2094 EXPECT_EQ(OK, callback_.WaitForResult());
2095 stream = request2.ReleaseStream();
2096 stream.reset(); // Will reset stream 3.
2097
2098 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2099 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2100 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2101 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2102}
2103
[email protected]1e960032013-12-20 19:00:202104TEST_P(QuicStreamFactoryTest, OnCertAdded) {
jri7046038f2015-10-22 00:29:262105 Initialize();
rch6faa4d42016-01-05 20:48:432106 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2107 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2108 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2109
mmenke651bae7f2015-12-18 21:26:452110 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
[email protected]459a7402014-02-10 12:58:522111 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
2112 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:312113 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:452114 SequencedSocketData socket_data(reads, arraysize(reads),
2115 writes.empty() ? nullptr : &writes[0],
2116 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:092117 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]d7d1e50b2013-11-25 22:08:092118
mmenke651bae7f2015-12-18 21:26:452119 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2120 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:092121 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]d7d1e50b2013-11-25 22:08:092122
jri7046038f2015-10-22 00:29:262123 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:592124 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562125 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:502126 /*cert_verify_flags=*/0, host_port_pair_.host(),
2127 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092128
2129 EXPECT_EQ(OK, callback_.WaitForResult());
2130 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2131 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:022132 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]d7d1e50b2013-11-25 22:08:092133 net_log_, CompletionCallback()));
2134
2135 // Add a cert and verify that stream saw the event.
jri7046038f2015-10-22 00:29:262136 factory_->OnCertAdded(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:092137 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
2138 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262139 EXPECT_FALSE(factory_->require_confirmation());
[email protected]d7d1e50b2013-11-25 22:08:092140
2141 // Now attempting to request a stream to the same origin should create
2142 // a new session.
2143
jri7046038f2015-10-22 00:29:262144 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:592145 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562146 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:502147 /*cert_verify_flags=*/0, host_port_pair_.host(),
2148 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092149
2150 EXPECT_EQ(OK, callback_.WaitForResult());
2151 stream = request2.ReleaseStream();
2152 stream.reset(); // Will reset stream 3.
2153
rch37de576c2015-05-17 20:28:172154 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2155 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2156 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2157 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:092158}
2159
[email protected]1e960032013-12-20 19:00:202160TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
jri7046038f2015-10-22 00:29:262161 Initialize();
rch6faa4d42016-01-05 20:48:432162 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2163 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2164 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2165
mmenke651bae7f2015-12-18 21:26:452166 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
[email protected]459a7402014-02-10 12:58:522167 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
2168 std::vector<MockWrite> writes;
[email protected]08da9adb2014-04-24 08:33:312169 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
mmenke651bae7f2015-12-18 21:26:452170 SequencedSocketData socket_data(reads, arraysize(reads),
2171 writes.empty() ? nullptr : &writes[0],
2172 writes.size());
[email protected]d7d1e50b2013-11-25 22:08:092173 socket_factory_.AddSocketDataProvider(&socket_data);
[email protected]d7d1e50b2013-11-25 22:08:092174
mmenke651bae7f2015-12-18 21:26:452175 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2176 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
[email protected]d7d1e50b2013-11-25 22:08:092177 socket_factory_.AddSocketDataProvider(&socket_data2);
[email protected]d7d1e50b2013-11-25 22:08:092178
jri7046038f2015-10-22 00:29:262179 QuicStreamRequest request(factory_.get());
[email protected]974849d2014-02-06 01:32:592180 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562181 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:502182 /*cert_verify_flags=*/0, host_port_pair_.host(),
2183 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092184
2185 EXPECT_EQ(OK, callback_.WaitForResult());
2186 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2187 HttpRequestInfo request_info;
rjshaded5ced072015-12-18 19:26:022188 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
[email protected]d7d1e50b2013-11-25 22:08:092189 net_log_, CompletionCallback()));
2190
2191 // Change the CA cert and verify that stream saw the event.
jri7046038f2015-10-22 00:29:262192 factory_->OnCACertChanged(nullptr);
[email protected]d7d1e50b2013-11-25 22:08:092193 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
2194 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262195 EXPECT_FALSE(factory_->require_confirmation());
[email protected]d7d1e50b2013-11-25 22:08:092196
2197 // Now attempting to request a stream to the same origin should create
2198 // a new session.
2199
jri7046038f2015-10-22 00:29:262200 QuicStreamRequest request2(factory_.get());
[email protected]974849d2014-02-06 01:32:592201 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562202 request2.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:502203 /*cert_verify_flags=*/0, host_port_pair_.host(),
2204 "GET", net_log_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:092205
2206 EXPECT_EQ(OK, callback_.WaitForResult());
2207 stream = request2.ReleaseStream();
2208 stream.reset(); // Will reset stream 3.
2209
rch37de576c2015-05-17 20:28:172210 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2211 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2212 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2213 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:092214}
2215
[email protected]1e960032013-12-20 19:00:202216TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
jri7046038f2015-10-22 00:29:262217 Initialize();
rch6faa4d42016-01-05 20:48:432218
[email protected]6e12d702013-11-13 00:17:172219 vector<string> cannoncial_suffixes;
2220 cannoncial_suffixes.push_back(string(".c.youtube.com"));
2221 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]c49ff182013-09-28 08:33:262222
[email protected]6e12d702013-11-13 00:17:172223 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
2224 string r1_host_name("r1");
2225 string r2_host_name("r2");
2226 r1_host_name.append(cannoncial_suffixes[i]);
2227 r2_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:142228
[email protected]bf4ea2f2014-03-10 22:57:532229 HostPortPair host_port_pair1(r1_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:122230 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:262231 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rch1fe2eeb2015-10-26 14:45:572232 QuicServerId server_id1(host_port_pair1, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172233 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:372234 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:172235 EXPECT_FALSE(cached1->proof_valid());
2236 EXPECT_TRUE(cached1->source_address_token().empty());
2237
2238 // Mutate the cached1 to have different data.
2239 // TODO(rtenneti): mutate other members of CachedState.
2240 cached1->set_source_address_token(r1_host_name);
2241 cached1->SetProofValid();
2242
[email protected]bf4ea2f2014-03-10 22:57:532243 HostPortPair host_port_pair2(r2_host_name, 80);
rch1fe2eeb2015-10-26 14:45:572244 QuicServerId server_id2(host_port_pair2, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172245 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:372246 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:172247 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
2248 EXPECT_TRUE(cached2->proof_valid());
2249 }
[email protected]b70fdb792013-10-25 19:04:142250}
2251
[email protected]1e960032013-12-20 19:00:202252TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
jri7046038f2015-10-22 00:29:262253 Initialize();
[email protected]6e12d702013-11-13 00:17:172254 vector<string> cannoncial_suffixes;
2255 cannoncial_suffixes.push_back(string(".c.youtube.com"));
2256 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]b70fdb792013-10-25 19:04:142257
[email protected]6e12d702013-11-13 00:17:172258 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
2259 string r3_host_name("r3");
2260 string r4_host_name("r4");
2261 r3_host_name.append(cannoncial_suffixes[i]);
2262 r4_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:142263
[email protected]bf4ea2f2014-03-10 22:57:532264 HostPortPair host_port_pair1(r3_host_name, 80);
[email protected]59c0bbd2014-03-22 04:08:122265 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:262266 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rch1fe2eeb2015-10-26 14:45:572267 QuicServerId server_id1(host_port_pair1, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172268 QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:372269 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:172270 EXPECT_FALSE(cached1->proof_valid());
2271 EXPECT_TRUE(cached1->source_address_token().empty());
2272
2273 // Mutate the cached1 to have different data.
2274 // TODO(rtenneti): mutate other members of CachedState.
2275 cached1->set_source_address_token(r3_host_name);
2276 cached1->SetProofInvalid();
2277
[email protected]bf4ea2f2014-03-10 22:57:532278 HostPortPair host_port_pair2(r4_host_name, 80);
rch1fe2eeb2015-10-26 14:45:572279 QuicServerId server_id2(host_port_pair2, privacy_mode_);
[email protected]6e12d702013-11-13 00:17:172280 QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:372281 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:172282 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
2283 EXPECT_TRUE(cached2->source_address_token().empty());
2284 EXPECT_FALSE(cached2->proof_valid());
2285 }
[email protected]c49ff182013-09-28 08:33:262286}
2287
rtenneti14abd312015-02-06 21:56:012288TEST_P(QuicStreamFactoryTest, RacingConnections) {
jri7046038f2015-10-22 00:29:262289 disable_disk_cache_ = false;
2290 Initialize();
rch6faa4d42016-01-05 20:48:432291 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2292 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:262293
rtenneti14abd312015-02-06 21:56:012294 if (!GetParam().enable_connection_racing)
2295 return;
jri7046038f2015-10-22 00:29:262296
2297 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneticcab42b2015-10-09 06:38:162298
mmenke651bae7f2015-12-18 21:26:452299 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2300 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti14abd312015-02-06 21:56:012301 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti14abd312015-02-06 21:56:012302
mmenke651bae7f2015-12-18 21:26:452303 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2304 SequencedSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
rtenneti14abd312015-02-06 21:56:012305 socket_factory_.AddSocketDataProvider(&socket_data2);
rtenneti14abd312015-02-06 21:56:012306
rtenneticcab42b2015-10-09 06:38:162307 const AlternativeService alternative_service1(QUIC, host_port_pair_.host(),
2308 host_port_pair_.port());
2309 AlternativeServiceInfoVector alternative_service_info_vector;
2310 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
2311 alternative_service_info_vector.push_back(
2312 AlternativeServiceInfo(alternative_service1, 1.0, expiration));
2313
2314 http_server_properties_.SetAlternativeServices(
2315 host_port_pair_, alternative_service_info_vector);
2316
rtenneti14abd312015-02-06 21:56:012317 crypto_client_stream_factory_.set_handshake_mode(
2318 MockCryptoClientStream::ZERO_RTT);
2319 host_resolver_.set_synchronous_mode(true);
2320 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2321 "192.168.0.1", "");
2322
jri7046038f2015-10-22 00:29:262323 QuicStreamRequest request(factory_.get());
rch1fe2eeb2015-10-26 14:45:572324 QuicServerId server_id(host_port_pair_, privacy_mode_);
rtenneti14abd312015-02-06 21:56:012325 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:562326 request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:502327 /*cert_verify_flags=*/0, host_port_pair_.host(),
2328 "GET", net_log_, callback_.callback()));
jri7046038f2015-10-22 00:29:262329 EXPECT_EQ(2u, QuicStreamFactoryPeer::GetNumberOfActiveJobs(factory_.get(),
2330 server_id));
rtenneti14abd312015-02-06 21:56:012331
2332 runner_->RunNextTask();
2333
2334 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2335 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:172336 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2337 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
jri7046038f2015-10-22 00:29:262338 EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumberOfActiveJobs(factory_.get(),
2339 server_id));
rtenneti14abd312015-02-06 21:56:012340}
2341
rtenneti34dffe752015-02-24 23:27:322342TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) {
jri7046038f2015-10-22 00:29:262343 disable_disk_cache_ = true;
2344 Initialize();
rch6faa4d42016-01-05 20:48:432345 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2346 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2347
jri7046038f2015-10-22 00:29:262348 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti34dffe752015-02-24 23:27:322349
mmenke651bae7f2015-12-18 21:26:452350 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2351 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti34dffe752015-02-24 23:27:322352 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti34dffe752015-02-24 23:27:322353
2354 crypto_client_stream_factory_.set_handshake_mode(
2355 MockCryptoClientStream::ZERO_RTT);
2356 host_resolver_.set_synchronous_mode(true);
2357 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2358 "192.168.0.1", "");
2359
jri7046038f2015-10-22 00:29:262360 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562361 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:502362 /*cert_verify_flags=*/0, host_port_pair_.host(),
2363 "GET", net_log_, callback_.callback()));
rtenneti34dffe752015-02-24 23:27:322364
2365 // If we are waiting for disk cache, we would have posted a task. Verify that
2366 // the CancelWaitForDataReady task hasn't been posted.
2367 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
2368
2369 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2370 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:172371 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2372 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti34dffe752015-02-24 23:27:322373}
2374
rtenneti85dcfac22015-03-27 20:22:192375TEST_P(QuicStreamFactoryTest, BadPacketLoss) {
jri7046038f2015-10-22 00:29:262376 disable_disk_cache_ = false;
2377 max_number_of_lossy_connections_ = 2;
2378 Initialize();
rch6faa4d42016-01-05 20:48:432379 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2380 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2381 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2382 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2383 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2384
jri7046038f2015-10-22 00:29:262385 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2386
2387 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2388 host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192389 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262390 factory_.get(), host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192391
mmenke651bae7f2015-12-18 21:26:452392 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2393 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:192394 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti85dcfac22015-03-27 20:22:192395
mmenke651bae7f2015-12-18 21:26:452396 SequencedSocketData socket_data2(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:192397 socket_factory_.AddSocketDataProvider(&socket_data2);
rtenneti85dcfac22015-03-27 20:22:192398
mmenke651bae7f2015-12-18 21:26:452399 SequencedSocketData socket_data3(nullptr, 0, nullptr, 0);
rtenneti85dcfac22015-03-27 20:22:192400 socket_factory_.AddSocketDataProvider(&socket_data3);
rtenneti85dcfac22015-03-27 20:22:192401
mmenke651bae7f2015-12-18 21:26:452402 SequencedSocketData socket_data4(nullptr, 0, nullptr, 0);
rtenneti97137a92015-06-18 06:00:312403 socket_factory_.AddSocketDataProvider(&socket_data4);
rtenneti97137a92015-06-18 06:00:312404
rch6faa4d42016-01-05 20:48:432405 HostPortPair server2(kServer2HostName, kDefaultServerPort);
2406 HostPortPair server3(kServer3HostName, kDefaultServerPort);
2407 HostPortPair server4(kServer4HostName, kDefaultServerPort);
rtenneti85dcfac22015-03-27 20:22:192408
2409 crypto_client_stream_factory_.set_handshake_mode(
2410 MockCryptoClientStream::ZERO_RTT);
2411 host_resolver_.set_synchronous_mode(true);
2412 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2413 "192.168.0.1", "");
2414 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2415 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
rtenneti97137a92015-06-18 06:00:312416 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
rtenneti85dcfac22015-03-27 20:22:192417
jri7046038f2015-10-22 00:29:262418 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562419 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtennetia75df622015-06-21 23:59:502420 /*cert_verify_flags=*/0, host_port_pair_.host(),
2421 "GET", net_log_, callback_.callback()));
rtenneti85dcfac22015-03-27 20:22:192422
rchf114d982015-10-21 01:34:562423 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262424 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
rtenneti85dcfac22015-03-27 20:22:192425
2426 DVLOG(1) << "Create 1st session and test packet loss";
2427
2428 // Set packet_loss_rate to a lower value than packet_loss_threshold.
2429 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262430 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/0.9f));
rtenneti41633b1f2015-04-05 18:19:532431 EXPECT_TRUE(session->connection()->connected());
rchf114d982015-10-21 01:34:562432 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:262433 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
2434 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2435 host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192436 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262437 factory_.get(), host_port_pair_.port()));
rtenneti85dcfac22015-03-27 20:22:192438
2439 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:312440 // and that shouldn't close the session and it shouldn't disable QUIC.
2441 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262442 factory_->OnHandshakeConfirmed(session, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:192443 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262444 factory_.get(), host_port_pair_.port()));
rtenneti97137a92015-06-18 06:00:312445 EXPECT_TRUE(session->connection()->connected());
jri7046038f2015-10-22 00:29:262446 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2447 host_port_pair_.port()));
rchf114d982015-10-21 01:34:562448 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:262449 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), host_port_pair_));
rtenneti85dcfac22015-03-27 20:22:192450
2451 // Test N-in-a-row high packet loss connections.
2452
2453 DVLOG(1) << "Create 2nd session and test packet loss";
2454
2455 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262456 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562457 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
rtennetia75df622015-06-21 23:59:502458 /*cert_verify_flags=*/0, server2.host(), "GET",
2459 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162460 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262461 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
rtenneti85dcfac22015-03-27 20:22:192462
2463 // If there is no packet loss during handshake confirmation, number of lossy
2464 // connections for the port should be 0.
2465 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262466 factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:192467 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262468 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/0.9f));
rtenneti85dcfac22015-03-27 20:22:192469 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262470 factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:192471 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262472 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
rtenneti85dcfac22015-03-27 20:22:192473
2474 // Set packet_loss_rate to a higher value than packet_loss_threshold only once
rtenneti97137a92015-06-18 06:00:312475 // and that shouldn't close the session and it shouldn't disable QUIC.
2476 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262477 factory_->OnHandshakeConfirmed(session2, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:192478 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262479 factory_.get(), server2.port()));
rtenneti97137a92015-06-18 06:00:312480 EXPECT_TRUE(session2->connection()->connected());
rtenneti85dcfac22015-03-27 20:22:192481 EXPECT_FALSE(
jri7046038f2015-10-22 00:29:262482 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server2.port()));
2483 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server2));
rtenneti85dcfac22015-03-27 20:22:192484
2485 DVLOG(1) << "Create 3rd session which also has packet loss";
2486
2487 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:262488 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:562489 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
rtennetia75df622015-06-21 23:59:502490 /*cert_verify_flags=*/0, server3.host(), "GET",
2491 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:162492 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:262493 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
rtenneti85dcfac22015-03-27 20:22:192494
rtenneti97137a92015-06-18 06:00:312495 DVLOG(1) << "Create 4th session with packet loss and test IsQuicDisabled()";
2496 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:262497 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:562498 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
rtennetia75df622015-06-21 23:59:502499 /*cert_verify_flags=*/0, server4.host(), "GET",
2500 net_log_, callback4.callback()));
ckrasic4f9d88d2015-07-22 22:23:162501 QuicChromiumClientSession* session4 =
jri7046038f2015-10-22 00:29:262502 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server4);
rtenneti97137a92015-06-18 06:00:312503
rtenneti85dcfac22015-03-27 20:22:192504 // Set packet_loss_rate to higher value than packet_loss_threshold 2nd time in
2505 // a row and that should close the session and disable QUIC.
2506 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:262507 factory_->OnHandshakeConfirmed(session3, /*packet_loss_rate=*/1.0f));
rtenneti85dcfac22015-03-27 20:22:192508 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262509 factory_.get(), server3.port()));
rtenneti97137a92015-06-18 06:00:312510 EXPECT_FALSE(session3->connection()->connected());
jri7046038f2015-10-22 00:29:262511 EXPECT_TRUE(
2512 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server3.port()));
2513 EXPECT_FALSE(
2514 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server3));
bnccb7ff3c2015-05-21 20:51:552515 EXPECT_FALSE(HasActiveSession(server3));
rtenneti85dcfac22015-03-27 20:22:192516
rtenneti97137a92015-06-18 06:00:312517 // Set packet_loss_rate to higher value than packet_loss_threshold 3rd time in
2518 // a row and IsQuicDisabled() should close the session.
2519 EXPECT_TRUE(
jri7046038f2015-10-22 00:29:262520 factory_->OnHandshakeConfirmed(session4, /*packet_loss_rate=*/1.0f));
rtenneti97137a92015-06-18 06:00:312521 EXPECT_EQ(3, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262522 factory_.get(), server4.port()));
rtenneti97137a92015-06-18 06:00:312523 EXPECT_FALSE(session4->connection()->connected());
jri7046038f2015-10-22 00:29:262524 EXPECT_TRUE(
2525 QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(), server4.port()));
2526 EXPECT_FALSE(
2527 QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server4));
rtenneti97137a92015-06-18 06:00:312528 EXPECT_FALSE(HasActiveSession(server4));
2529
rtenneti85dcfac22015-03-27 20:22:192530 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2531 EXPECT_TRUE(stream.get());
2532 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2533 EXPECT_TRUE(stream2.get());
2534 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2535 EXPECT_TRUE(stream3.get());
rtenneti97137a92015-06-18 06:00:312536 scoped_ptr<QuicHttpStream> stream4 = request4.ReleaseStream();
2537 EXPECT_TRUE(stream4.get());
rch37de576c2015-05-17 20:28:172538 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2539 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2540 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2541 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2542 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2543 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
rtenneti97137a92015-06-18 06:00:312544 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
2545 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
rtenneti85dcfac22015-03-27 20:22:192546}
2547
ckrasic1e53b642015-07-08 22:39:352548TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfTwo) {
jri7046038f2015-10-22 00:29:262549 disable_disk_cache_ = false;
2550 threshold_public_resets_post_handshake_ = 2;
2551 Initialize();
rch6faa4d42016-01-05 20:48:432552 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2553 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2554 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:262555 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2556
2557 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2558 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352559 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262560 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352561
mmenke651bae7f2015-12-18 21:26:452562 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2563 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352564 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:352565
mmenke651bae7f2015-12-18 21:26:452566 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352567 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:352568
rch6faa4d42016-01-05 20:48:432569 HostPortPair server2(kServer2HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:352570
2571 crypto_client_stream_factory_.set_handshake_mode(
2572 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2573 host_resolver_.set_synchronous_mode(true);
2574 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2575 "192.168.0.1", "");
2576 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2577
jri7046038f2015-10-22 00:29:262578 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562579 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352580 /*cert_verify_flags=*/0, host_port_pair_.host(),
2581 "GET", net_log_, callback_.callback()));
2582
rchf114d982015-10-21 01:34:562583 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262584 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352585
2586 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
2587 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
2588 // Need to spin the loop now to ensure that
2589 // QuicStreamFactory::OnSessionClosed() runs.
2590 base::RunLoop run_loop;
2591 run_loop.RunUntilIdle();
2592
jri7046038f2015-10-22 00:29:262593 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2594 factory_.get()));
2595 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2596 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352597
2598 // Test two-in-a-row public reset post handshakes..
2599 DVLOG(1) << "Create 2nd session and trigger public reset post handshake";
2600 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262601 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562602 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352603 /*cert_verify_flags=*/0, server2.host(), "GET",
2604 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162605 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262606 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352607
2608 session2->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
2609 // Need to spin the loop now to ensure that
2610 // QuicStreamFactory::OnSessionClosed() runs.
2611 base::RunLoop run_loop2;
2612 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262613 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2614 factory_.get()));
2615 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2616 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:162617 EXPECT_EQ(
2618 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
jri7046038f2015-10-22 00:29:262619 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352620
2621 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2622 EXPECT_TRUE(stream.get());
2623 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2624 EXPECT_TRUE(stream2.get());
2625 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2626 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2627 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2628 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2629}
2630
2631TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfTwo) {
jri7046038f2015-10-22 00:29:262632 disable_disk_cache_ = true;
2633 threshold_timeouts_with_open_streams_ = 2;
2634 Initialize();
rch6faa4d42016-01-05 20:48:432635 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2636 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2637 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:262638
2639 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2640 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2641 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352642 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262643 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352644
mmenke651bae7f2015-12-18 21:26:452645 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2646 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352647 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:352648
mmenke651bae7f2015-12-18 21:26:452649 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352650 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:352651
rch6faa4d42016-01-05 20:48:432652 HostPortPair server2(kServer2HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:352653
2654 crypto_client_stream_factory_.set_handshake_mode(
2655 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2656 host_resolver_.set_synchronous_mode(true);
2657 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2658 "192.168.0.1", "");
2659 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2660
jri7046038f2015-10-22 00:29:262661 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562662 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352663 /*cert_verify_flags=*/0, host_port_pair_.host(),
2664 "GET", net_log_, callback_.callback()));
2665
rchf114d982015-10-21 01:34:562666 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262667 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352668
2669 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2670 EXPECT_TRUE(stream.get());
2671 HttpRequestInfo request_info;
2672 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2673 net_log_, CompletionCallback()));
2674
2675 DVLOG(1)
2676 << "Created 1st session and initialized a stream. Now trigger timeout";
rtenneti2cae2072016-02-05 02:21:332677 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, false);
ckrasic1e53b642015-07-08 22:39:352678 // Need to spin the loop now to ensure that
2679 // QuicStreamFactory::OnSessionClosed() runs.
2680 base::RunLoop run_loop;
2681 run_loop.RunUntilIdle();
2682
jri7046038f2015-10-22 00:29:262683 EXPECT_EQ(
2684 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2685 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2686 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352687
2688 // Test two-in-a-row timeouts with open streams.
2689 DVLOG(1) << "Create 2nd session and timeout with open stream";
2690 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262691 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562692 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352693 /*cert_verify_flags=*/0, server2.host(), "GET",
2694 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162695 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262696 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352697
2698 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2699 EXPECT_TRUE(stream2.get());
2700 EXPECT_EQ(OK, stream2->InitializeStream(&request_info, DEFAULT_PRIORITY,
2701 net_log_, CompletionCallback()));
2702
rtenneti2cae2072016-02-05 02:21:332703 session2->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, false);
ckrasic1e53b642015-07-08 22:39:352704 // Need to spin the loop now to ensure that
2705 // QuicStreamFactory::OnSessionClosed() runs.
2706 base::RunLoop run_loop2;
2707 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262708 EXPECT_EQ(
2709 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2710 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2711 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:162712 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
jri7046038f2015-10-22 00:29:262713 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352714
2715 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2716 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2717 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2718 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2719}
2720
2721TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfThree) {
jri7046038f2015-10-22 00:29:262722 disable_disk_cache_ = true;
2723 threshold_public_resets_post_handshake_ = 2;
2724 Initialize();
rch6faa4d42016-01-05 20:48:432725 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2726 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2727 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2728 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:262729
2730 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2731 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352732 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262733 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352734
mmenke651bae7f2015-12-18 21:26:452735 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2736 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352737 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:352738
mmenke651bae7f2015-12-18 21:26:452739 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352740 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:352741
mmenke651bae7f2015-12-18 21:26:452742 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352743 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:352744
rch6faa4d42016-01-05 20:48:432745 HostPortPair server2(kServer2HostName, kDefaultServerPort);
2746 HostPortPair server3(kServer3HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:352747
2748 crypto_client_stream_factory_.set_handshake_mode(
2749 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2750 host_resolver_.set_synchronous_mode(true);
2751 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2752 "192.168.0.1", "");
2753 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2754 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
2755
2756 // Test first and third out of three public reset post handshakes.
jri7046038f2015-10-22 00:29:262757 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562758 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352759 /*cert_verify_flags=*/0, host_port_pair_.host(),
2760 "GET", net_log_, callback_.callback()));
2761
rchf114d982015-10-21 01:34:562762 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262763 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352764
2765 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
2766 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
2767 // Need to spin the loop now to ensure that
2768 // QuicStreamFactory::OnSessionClosed() runs.
2769 base::RunLoop run_loop;
2770 run_loop.RunUntilIdle();
2771
jri7046038f2015-10-22 00:29:262772 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2773 factory_.get()));
2774 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2775 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352776
2777 DVLOG(1) << "Create 2nd session without disable trigger";
2778 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262779 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562780 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352781 /*cert_verify_flags=*/0, server2.host(), "GET",
2782 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162783 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262784 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352785
2786 session2->connection()->CloseConnection(QUIC_NO_ERROR, false);
2787 // Need to spin the loop now to ensure that
2788 // QuicStreamFactory::OnSessionClosed() runs.
2789 base::RunLoop run_loop2;
2790 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262791 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2792 factory_.get()));
2793 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2794 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352795
2796 DVLOG(1) << "Create 3rd session with public reset post handshake,"
2797 << " will disable QUIC";
2798 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:262799 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:562800 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352801 /*cert_verify_flags=*/0, server3.host(), "GET",
2802 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:162803 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:262804 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:352805
2806 session3->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
2807 // Need to spin the loop now to ensure that
2808 // QuicStreamFactory::OnSessionClosed() runs.
2809 base::RunLoop run_loop3;
2810 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:262811 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
2812 factory_.get()));
2813 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2814 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:162815 EXPECT_EQ(
2816 QuicChromiumClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
jri7046038f2015-10-22 00:29:262817 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352818
2819 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2820 EXPECT_TRUE(stream.get());
2821 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2822 EXPECT_TRUE(stream2.get());
2823 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2824 EXPECT_TRUE(stream3.get());
2825
2826 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2827 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2828 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2829 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2830 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2831 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
2832}
2833
2834TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfThree) {
jri7046038f2015-10-22 00:29:262835 disable_disk_cache_ = true;
2836 threshold_public_resets_post_handshake_ = 2;
2837 Initialize();
rch6faa4d42016-01-05 20:48:432838 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2839 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2840 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2841 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:262842 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2843
2844 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2845 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352846 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:262847 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352848
mmenke651bae7f2015-12-18 21:26:452849 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2850 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352851 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:352852
mmenke651bae7f2015-12-18 21:26:452853 // SequencedSocketData socket_data2(nullptr, 0, nullptr, 0);
2854 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352855 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:352856
mmenke651bae7f2015-12-18 21:26:452857 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:352858 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:352859
rch6faa4d42016-01-05 20:48:432860 HostPortPair server2(kServer2HostName, kDefaultServerPort);
2861 HostPortPair server3(kServer3HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:352862
2863 crypto_client_stream_factory_.set_handshake_mode(
2864 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2865 host_resolver_.set_synchronous_mode(true);
2866 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2867 "192.168.0.1", "");
2868 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2869 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
2870
2871 // Test first and third out of three timeouts with open streams.
jri7046038f2015-10-22 00:29:262872 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:562873 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352874 /*cert_verify_flags=*/0, host_port_pair_.host(),
2875 "GET", net_log_, callback_.callback()));
2876
rchf114d982015-10-21 01:34:562877 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:262878 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:352879
2880 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2881 EXPECT_TRUE(stream.get());
2882 HttpRequestInfo request_info;
2883 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2884 net_log_, CompletionCallback()));
2885
2886 DVLOG(1)
2887 << "Created 1st session and initialized a stream. Now trigger timeout";
rtenneti2cae2072016-02-05 02:21:332888 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, false);
ckrasic1e53b642015-07-08 22:39:352889 // Need to spin the loop now to ensure that
2890 // QuicStreamFactory::OnSessionClosed() runs.
2891 base::RunLoop run_loop;
2892 run_loop.RunUntilIdle();
2893
jri7046038f2015-10-22 00:29:262894 EXPECT_EQ(
2895 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2896 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2897 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352898
2899 // Test two-in-a-row timeouts with open streams.
2900 DVLOG(1) << "Create 2nd session without timeout";
2901 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:262902 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:562903 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352904 /*cert_verify_flags=*/0, server2.host(), "GET",
2905 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:162906 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:262907 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:352908
2909 session2->connection()->CloseConnection(QUIC_NO_ERROR, true);
2910 // Need to spin the loop now to ensure that
2911 // QuicStreamFactory::OnSessionClosed() runs.
2912 base::RunLoop run_loop2;
2913 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:262914 EXPECT_EQ(
2915 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2916 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2917 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352918
2919 DVLOG(1) << "Create 3rd session with timeout with open streams,"
2920 << " will disable QUIC";
2921
2922 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:262923 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:562924 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:352925 /*cert_verify_flags=*/0, server3.host(), "GET",
2926 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:162927 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:262928 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:352929
2930 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2931 EXPECT_TRUE(stream3.get());
2932 EXPECT_EQ(OK, stream3->InitializeStream(&request_info, DEFAULT_PRIORITY,
2933 net_log_, CompletionCallback()));
rtenneti2cae2072016-02-05 02:21:332934 session3->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, false);
ckrasic1e53b642015-07-08 22:39:352935 // Need to spin the loop now to ensure that
2936 // QuicStreamFactory::OnSessionClosed() runs.
2937 base::RunLoop run_loop3;
2938 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:262939 EXPECT_EQ(
2940 2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
2941 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2942 host_port_pair_.port()));
ckrasic4f9d88d2015-07-22 22:23:162943 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
jri7046038f2015-10-22 00:29:262944 factory_->QuicDisabledReason(host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:352945
2946 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2947 EXPECT_TRUE(stream2.get());
2948 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2949 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2950 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2951 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2952 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2953 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
2954}
2955
zhongyi89649c32016-01-22 00:14:012956TEST_P(QuicStreamFactoryTest, DisableQuicWhenTimeoutsWithOpenStreams) {
2957 disable_disk_cache_ = true;
2958 disable_quic_on_timeout_with_open_streams_ = true;
2959 Initialize();
2960 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2961 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2962 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
2963
2964 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
2965 host_port_pair_.port()));
2966 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
2967 factory_.get(), host_port_pair_.port()));
2968
2969 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
2970 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
2971 socket_factory_.AddSocketDataProvider(&socket_data);
2972
2973 crypto_client_stream_factory_.set_handshake_mode(
2974 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2975 host_resolver_.set_synchronous_mode(true);
2976 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2977 "192.168.0.1", "");
2978
2979 // Test first timeouts with open streams will disable QUIC.
2980 QuicStreamRequest request(factory_.get());
2981 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
2982 /*cert_verify_flags=*/0, host_port_pair_.host(),
2983 "GET", net_log_, callback_.callback()));
2984
2985 QuicChromiumClientSession* session =
2986 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
2987
2988 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2989 EXPECT_TRUE(stream.get());
2990 HttpRequestInfo request_info;
2991 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2992 net_log_, CompletionCallback()));
2993
2994 DVLOG(1)
2995 << "Created 1st session and initialized a stream. Now trigger timeout."
2996 << "Will disable QUIC.";
rtenneti2cae2072016-02-05 02:21:332997 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, false);
zhongyi89649c32016-01-22 00:14:012998 // Need to spin the loop now to ensure that
2999 // QuicStreamFactory::OnSessionClosed() runs.
3000 base::RunLoop run_loop;
3001 run_loop.RunUntilIdle();
3002
3003 EXPECT_EQ(
3004 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3005 EXPECT_TRUE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3006 host_port_pair_.port()));
3007
3008 EXPECT_EQ(QuicChromiumClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
3009 factory_->QuicDisabledReason(host_port_pair_.port()));
3010
3011 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3012 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3013}
3014
ckrasic1e53b642015-07-08 22:39:353015TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfFour) {
jri7046038f2015-10-22 00:29:263016 disable_disk_cache_ = true;
3017 threshold_public_resets_post_handshake_ = 2;
3018 Initialize();
rch6faa4d42016-01-05 20:48:433019 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3020 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3021 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3022 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3023 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263024 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3025
3026 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3027 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353028 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263029 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353030
mmenke651bae7f2015-12-18 21:26:453031 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3032 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353033 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353034
mmenke651bae7f2015-12-18 21:26:453035 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353036 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353037
mmenke651bae7f2015-12-18 21:26:453038 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353039 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:353040
mmenke651bae7f2015-12-18 21:26:453041 SequencedSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353042 socket_factory_.AddSocketDataProvider(&socket_data4);
ckrasic1e53b642015-07-08 22:39:353043
rch6faa4d42016-01-05 20:48:433044 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3045 HostPortPair server3(kServer3HostName, kDefaultServerPort);
3046 HostPortPair server4(kServer4HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353047
3048 crypto_client_stream_factory_.set_handshake_mode(
3049 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3050 host_resolver_.set_synchronous_mode(true);
3051 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3052 "192.168.0.1", "");
3053 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3054 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3055 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
3056
3057 // Test first and fourth out of four public reset post handshakes.
jri7046038f2015-10-22 00:29:263058 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563059 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:353060 /*cert_verify_flags=*/0, host_port_pair_.host(),
3061 "GET", net_log_, callback_.callback()));
3062
rchf114d982015-10-21 01:34:563063 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:263064 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353065
3066 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
3067 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
3068 // Need to spin the loop now to ensure that
3069 // QuicStreamFactory::OnSessionClosed() runs.
3070 base::RunLoop run_loop;
3071 run_loop.RunUntilIdle();
3072
jri7046038f2015-10-22 00:29:263073 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3074 factory_.get()));
3075 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3076 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353077
3078 DVLOG(1) << "Create 2nd and 3rd sessions without disable trigger";
3079 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263080 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563081 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:353082 /*cert_verify_flags=*/0, server2.host(), "GET",
3083 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:163084 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:263085 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:353086
3087 session2->connection()->CloseConnection(QUIC_NO_ERROR, false);
3088 // Need to spin the loop now to ensure that
3089 // QuicStreamFactory::OnSessionClosed() runs.
3090 base::RunLoop run_loop2;
3091 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263092 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3093 factory_.get()));
3094 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3095 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353096
3097 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263098 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563099 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:353100 /*cert_verify_flags=*/0, server3.host(), "GET",
3101 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:163102 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:263103 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:353104
3105 session3->connection()->CloseConnection(QUIC_NO_ERROR, false);
3106 // Need to spin the loop now to ensure that
3107 // QuicStreamFactory::OnSessionClosed() runs.
3108 base::RunLoop run_loop3;
3109 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:263110 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3111 factory_.get()));
3112 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3113 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353114
3115 DVLOG(1) << "Create 4rd session with public reset post handshake,"
3116 << " will not disable QUIC";
3117 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:263118 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:563119 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:353120 /*cert_verify_flags=*/0, server4.host(), "GET",
3121 net_log_, callback4.callback()));
ckrasic4f9d88d2015-07-22 22:23:163122 QuicChromiumClientSession* session4 =
jri7046038f2015-10-22 00:29:263123 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server4);
ckrasic1e53b642015-07-08 22:39:353124
3125 session4->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
3126 // Need to spin the loop now to ensure that
3127 // QuicStreamFactory::OnSessionClosed() runs.
3128 base::RunLoop run_loop4;
3129 run_loop4.RunUntilIdle();
jri7046038f2015-10-22 00:29:263130 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(
3131 factory_.get()));
3132 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3133 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353134
3135 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
3136 EXPECT_TRUE(stream.get());
3137 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
3138 EXPECT_TRUE(stream2.get());
3139 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
3140 EXPECT_TRUE(stream3.get());
3141 scoped_ptr<QuicHttpStream> stream4 = request4.ReleaseStream();
3142 EXPECT_TRUE(stream4.get());
3143
3144 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3145 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3146 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3147 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3148 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3149 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3150 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
3151 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
3152}
3153
3154TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfFour) {
jri7046038f2015-10-22 00:29:263155 disable_disk_cache_ = true;
3156 threshold_public_resets_post_handshake_ = 2;
3157 Initialize();
rch6faa4d42016-01-05 20:48:433158 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3159 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3160 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3161 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3162 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263163 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3164
3165 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3166 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353167 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
jri7046038f2015-10-22 00:29:263168 factory_.get(), host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353169
mmenke651bae7f2015-12-18 21:26:453170 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3171 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353172 socket_factory_.AddSocketDataProvider(&socket_data);
ckrasic1e53b642015-07-08 22:39:353173
mmenke651bae7f2015-12-18 21:26:453174 // SequencedSocketData socket_data2(nullptr, 0, nullptr, 0);
3175 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353176 socket_factory_.AddSocketDataProvider(&socket_data2);
ckrasic1e53b642015-07-08 22:39:353177
mmenke651bae7f2015-12-18 21:26:453178 SequencedSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353179 socket_factory_.AddSocketDataProvider(&socket_data3);
ckrasic1e53b642015-07-08 22:39:353180
mmenke651bae7f2015-12-18 21:26:453181 SequencedSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
ckrasic1e53b642015-07-08 22:39:353182 socket_factory_.AddSocketDataProvider(&socket_data4);
ckrasic1e53b642015-07-08 22:39:353183
rch6faa4d42016-01-05 20:48:433184 HostPortPair server2(kServer2HostName, kDefaultServerPort);
3185 HostPortPair server3(kServer3HostName, kDefaultServerPort);
3186 HostPortPair server4(kServer4HostName, kDefaultServerPort);
ckrasic1e53b642015-07-08 22:39:353187
3188 crypto_client_stream_factory_.set_handshake_mode(
3189 MockCryptoClientStream::CONFIRM_HANDSHAKE);
3190 host_resolver_.set_synchronous_mode(true);
3191 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3192 "192.168.0.1", "");
3193 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
3194 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
3195 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
3196
3197 // Test first and fourth out of three timeouts with open streams.
jri7046038f2015-10-22 00:29:263198 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563199 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:353200 /*cert_verify_flags=*/0, host_port_pair_.host(),
3201 "GET", net_log_, callback_.callback()));
3202
rchf114d982015-10-21 01:34:563203 QuicChromiumClientSession* session =
jri7046038f2015-10-22 00:29:263204 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_);
ckrasic1e53b642015-07-08 22:39:353205
3206 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
3207 EXPECT_TRUE(stream.get());
3208 HttpRequestInfo request_info;
3209 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
3210 net_log_, CompletionCallback()));
3211
3212 DVLOG(1)
3213 << "Created 1st session and initialized a stream. Now trigger timeout";
rtenneti2cae2072016-02-05 02:21:333214 session->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, false);
ckrasic1e53b642015-07-08 22:39:353215 // Need to spin the loop now to ensure that
3216 // QuicStreamFactory::OnSessionClosed() runs.
3217 base::RunLoop run_loop;
3218 run_loop.RunUntilIdle();
3219
jri7046038f2015-10-22 00:29:263220 EXPECT_EQ(
3221 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3222 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3223 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353224
3225 DVLOG(1) << "Create 2nd and 3rd sessions without timeout";
3226 TestCompletionCallback callback2;
jri7046038f2015-10-22 00:29:263227 QuicStreamRequest request2(factory_.get());
rchf114d982015-10-21 01:34:563228 EXPECT_EQ(OK, request2.Request(server2, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:353229 /*cert_verify_flags=*/0, server2.host(), "GET",
3230 net_log_, callback2.callback()));
ckrasic4f9d88d2015-07-22 22:23:163231 QuicChromiumClientSession* session2 =
jri7046038f2015-10-22 00:29:263232 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server2);
ckrasic1e53b642015-07-08 22:39:353233
3234 session2->connection()->CloseConnection(QUIC_NO_ERROR, true);
3235 // Need to spin the loop now to ensure that
3236 // QuicStreamFactory::OnSessionClosed() runs.
3237 base::RunLoop run_loop2;
3238 run_loop2.RunUntilIdle();
jri7046038f2015-10-22 00:29:263239 EXPECT_EQ(
3240 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3241 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3242 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353243
3244 TestCompletionCallback callback3;
jri7046038f2015-10-22 00:29:263245 QuicStreamRequest request3(factory_.get());
rchf114d982015-10-21 01:34:563246 EXPECT_EQ(OK, request3.Request(server3, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:353247 /*cert_verify_flags=*/0, server3.host(), "GET",
3248 net_log_, callback3.callback()));
ckrasic4f9d88d2015-07-22 22:23:163249 QuicChromiumClientSession* session3 =
jri7046038f2015-10-22 00:29:263250 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server3);
ckrasic1e53b642015-07-08 22:39:353251
3252 session3->connection()->CloseConnection(QUIC_NO_ERROR, true);
3253 // Need to spin the loop now to ensure that
3254 // QuicStreamFactory::OnSessionClosed() runs.
3255 base::RunLoop run_loop3;
3256 run_loop3.RunUntilIdle();
jri7046038f2015-10-22 00:29:263257 EXPECT_EQ(
3258 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3259 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3260 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353261
3262 DVLOG(1) << "Create 4th session with timeout with open streams,"
3263 << " will not disable QUIC";
3264
3265 TestCompletionCallback callback4;
jri7046038f2015-10-22 00:29:263266 QuicStreamRequest request4(factory_.get());
rchf114d982015-10-21 01:34:563267 EXPECT_EQ(OK, request4.Request(server4, privacy_mode_,
ckrasic1e53b642015-07-08 22:39:353268 /*cert_verify_flags=*/0, server4.host(), "GET",
3269 net_log_, callback4.callback()));
ckrasic4f9d88d2015-07-22 22:23:163270 QuicChromiumClientSession* session4 =
jri7046038f2015-10-22 00:29:263271 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server4);
ckrasic1e53b642015-07-08 22:39:353272
3273 scoped_ptr<QuicHttpStream> stream4 = request4.ReleaseStream();
3274 EXPECT_TRUE(stream4.get());
3275 EXPECT_EQ(OK, stream4->InitializeStream(&request_info, DEFAULT_PRIORITY,
3276 net_log_, CompletionCallback()));
rtenneti2cae2072016-02-05 02:21:333277 session4->connection()->CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, false);
ckrasic1e53b642015-07-08 22:39:353278 // Need to spin the loop now to ensure that
3279 // QuicStreamFactory::OnSessionClosed() runs.
3280 base::RunLoop run_loop4;
3281 run_loop4.RunUntilIdle();
jri7046038f2015-10-22 00:29:263282 EXPECT_EQ(
3283 1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(factory_.get()));
3284 EXPECT_FALSE(QuicStreamFactoryPeer::IsQuicDisabled(factory_.get(),
3285 host_port_pair_.port()));
ckrasic1e53b642015-07-08 22:39:353286
3287 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
3288 EXPECT_TRUE(stream2.get());
3289 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
3290 EXPECT_TRUE(stream3.get());
3291 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3292 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3293 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
3294 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
3295 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
3296 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
3297 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
3298 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
3299}
3300
rtenneti8332ba52015-09-17 19:33:413301TEST_P(QuicStreamFactoryTest, EnableDelayTcpRace) {
jri7046038f2015-10-22 00:29:263302 Initialize();
rch6faa4d42016-01-05 20:48:433303 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3304 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263305 bool delay_tcp_race = QuicStreamFactoryPeer::GetDelayTcpRace(factory_.get());
3306 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), false);
mmenke651bae7f2015-12-18 21:26:453307 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3308 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
rtenneti8332ba52015-09-17 19:33:413309 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti8332ba52015-09-17 19:33:413310
rtenneti8332ba52015-09-17 19:33:413311 ServerNetworkStats stats1;
3312 stats1.srtt = base::TimeDelta::FromMicroseconds(10);
rtenneticcab42b2015-10-09 06:38:163313 http_server_properties_.SetServerNetworkStats(host_port_pair_, stats1);
rtenneti8332ba52015-09-17 19:33:413314
3315 crypto_client_stream_factory_.set_handshake_mode(
3316 MockCryptoClientStream::ZERO_RTT);
3317 host_resolver_.set_synchronous_mode(true);
3318 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3319 "192.168.0.1", "");
3320
jri7046038f2015-10-22 00:29:263321 QuicStreamRequest request(factory_.get());
rtenneti8332ba52015-09-17 19:33:413322 EXPECT_EQ(ERR_IO_PENDING,
rchf114d982015-10-21 01:34:563323 request.Request(host_port_pair_, privacy_mode_,
rtenneti8332ba52015-09-17 19:33:413324 /*cert_verify_flags=*/0, host_port_pair_.host(),
3325 "POST", net_log_, callback_.callback()));
3326
3327 // If we don't delay TCP connection, then time delay should be 0.
jri7046038f2015-10-22 00:29:263328 EXPECT_FALSE(factory_->delay_tcp_race());
rtenneti8332ba52015-09-17 19:33:413329 EXPECT_EQ(base::TimeDelta(), request.GetTimeDelayForWaitingJob());
3330
3331 // Enable |delay_tcp_race_| param and verify delay is one RTT and that
3332 // server supports QUIC.
jri7046038f2015-10-22 00:29:263333 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), true);
3334 EXPECT_TRUE(factory_->delay_tcp_race());
rtenneti8332ba52015-09-17 19:33:413335 EXPECT_EQ(base::TimeDelta::FromMicroseconds(15),
3336 request.GetTimeDelayForWaitingJob());
3337
3338 // Confirm the handshake and verify that the stream is created.
3339 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
3340 QuicSession::HANDSHAKE_CONFIRMED);
3341
3342 EXPECT_EQ(OK, callback_.WaitForResult());
3343
3344 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
3345 EXPECT_TRUE(stream.get());
3346 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3347 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
jri7046038f2015-10-22 00:29:263348 QuicStreamFactoryPeer::SetDelayTcpRace(factory_.get(), delay_tcp_race);
rtenneti8332ba52015-09-17 19:33:413349}
3350
rtenneticd2aaa15b2015-10-10 20:29:333351TEST_P(QuicStreamFactoryTest, MaybeInitialize) {
rtenneti41c09992015-11-30 18:24:013352 idle_connection_timeout_seconds_ = 500;
jri7046038f2015-10-22 00:29:263353 Initialize();
rch6faa4d42016-01-05 20:48:433354 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3355 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rtenneti41c09992015-11-30 18:24:013356 const QuicConfig* config = QuicStreamFactoryPeer::GetConfig(factory_.get());
3357 EXPECT_EQ(500, config->IdleConnectionStateLifetime().ToSeconds());
3358
jri7046038f2015-10-22 00:29:263359 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti8a80a6dc2015-09-21 19:51:133360
rtenneti8a80a6dc2015-09-21 19:51:133361 const AlternativeService alternative_service1(QUIC, host_port_pair_.host(),
3362 host_port_pair_.port());
3363 AlternativeServiceInfoVector alternative_service_info_vector;
3364 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
3365 alternative_service_info_vector.push_back(
3366 AlternativeServiceInfo(alternative_service1, 1.0, expiration));
3367
rtenneticcab42b2015-10-09 06:38:163368 http_server_properties_.SetAlternativeServices(
rtenneti8a80a6dc2015-09-21 19:51:133369 host_port_pair_, alternative_service_info_vector);
rtenneti6971c172016-01-15 20:12:103370 http_server_properties_.SetMaxServerConfigsStoredInProperties(
3371 kMaxQuicServersToPersist);
rtenneti8a80a6dc2015-09-21 19:51:133372
rch6faa4d42016-01-05 20:48:433373 QuicServerId quic_server_id(kDefaultServerHostName, 80,
3374 PRIVACY_MODE_DISABLED);
rtenneticd2aaa15b2015-10-10 20:29:333375 QuicServerInfoFactory* quic_server_info_factory =
3376 new PropertiesBasedQuicServerInfoFactory(
3377 http_server_properties_.GetWeakPtr());
jri7046038f2015-10-22 00:29:263378 factory_->set_quic_server_info_factory(quic_server_info_factory);
rtenneticd2aaa15b2015-10-10 20:29:333379
3380 scoped_ptr<QuicServerInfo> quic_server_info(
3381 quic_server_info_factory->GetForServer(quic_server_id));
3382
3383 // Update quic_server_info's server_config and persist it.
3384 QuicServerInfo::State* state = quic_server_info->mutable_state();
3385 // Minimum SCFG that passes config validation checks.
3386 const char scfg[] = {// SCFG
3387 0x53, 0x43, 0x46, 0x47,
3388 // num entries
3389 0x01, 0x00,
3390 // padding
3391 0x00, 0x00,
3392 // EXPY
3393 0x45, 0x58, 0x50, 0x59,
3394 // EXPY end offset
3395 0x08, 0x00, 0x00, 0x00,
3396 // Value
3397 '1', '2', '3', '4', '5', '6', '7', '8'};
3398
3399 // Create temporary strings becasue Persist() clears string data in |state|.
3400 string server_config(reinterpret_cast<const char*>(&scfg), sizeof(scfg));
3401 string source_address_token("test_source_address_token");
3402 string signature("test_signature");
3403 string test_cert("test_cert");
3404 vector<string> certs;
3405 certs.push_back(test_cert);
3406 state->server_config = server_config;
3407 state->source_address_token = source_address_token;
3408 state->server_config_sig = signature;
3409 state->certs = certs;
3410
3411 quic_server_info->Persist();
3412
jri7046038f2015-10-22 00:29:263413 QuicStreamFactoryPeer::MaybeInitialize(factory_.get());
3414 EXPECT_TRUE(QuicStreamFactoryPeer::HasInitializedData(factory_.get()));
3415 EXPECT_TRUE(QuicStreamFactoryPeer::SupportsQuicAtStartUp(factory_.get(),
3416 host_port_pair_));
3417 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(factory_.get(),
rtenneticd2aaa15b2015-10-10 20:29:333418 quic_server_id));
3419 QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:263420 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
rtenneticd2aaa15b2015-10-10 20:29:333421 QuicCryptoClientConfig::CachedState* cached =
3422 crypto_config->LookupOrCreate(quic_server_id);
3423 EXPECT_FALSE(cached->server_config().empty());
3424 EXPECT_TRUE(cached->GetServerConfig());
3425 EXPECT_EQ(server_config, cached->server_config());
3426 EXPECT_EQ(source_address_token, cached->source_address_token());
3427 EXPECT_EQ(signature, cached->signature());
3428 ASSERT_EQ(1U, cached->certs().size());
3429 EXPECT_EQ(test_cert, cached->certs()[0]);
rtenneti8a80a6dc2015-09-21 19:51:133430}
3431
rtennetid2e74caa2015-12-09 00:51:573432TEST_P(QuicStreamFactoryTest, QuicDoingZeroRTT) {
3433 Initialize();
3434
3435 factory_->set_require_confirmation(true);
3436 QuicServerId quic_server_id(host_port_pair_, PRIVACY_MODE_DISABLED);
3437 EXPECT_FALSE(factory_->ZeroRTTEnabledFor(quic_server_id));
3438
3439 factory_->set_require_confirmation(false);
3440 EXPECT_FALSE(factory_->ZeroRTTEnabledFor(quic_server_id));
3441
3442 // Load server config and verify QUIC will do 0RTT.
3443 QuicStreamFactoryPeer::CacheDummyServerConfig(factory_.get(), quic_server_id);
3444 EXPECT_TRUE(factory_->ZeroRTTEnabledFor(quic_server_id));
3445}
3446
rtenneti1cd3b162015-09-29 02:58:283447TEST_P(QuicStreamFactoryTest, YieldAfterPackets) {
jri7046038f2015-10-22 00:29:263448 Initialize();
rch6faa4d42016-01-05 20:48:433449 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3450 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:263451 QuicStreamFactoryPeer::SetYieldAfterPackets(factory_.get(), 0);
rtenneti1cd3b162015-09-29 02:58:283452
3453 scoped_ptr<QuicEncryptedPacket> close_packet(
3454 ConstructConnectionClosePacket(0));
rtenneticd2aaa15b2015-10-10 20:29:333455 vector<MockRead> reads;
rtenneti1cd3b162015-09-29 02:58:283456 reads.push_back(
3457 MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0));
3458 reads.push_back(MockRead(ASYNC, OK, 1));
mmenke651bae7f2015-12-18 21:26:453459 SequencedSocketData socket_data(&reads[0], reads.size(), nullptr, 0);
rtenneti1cd3b162015-09-29 02:58:283460 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti1cd3b162015-09-29 02:58:283461
3462 crypto_client_stream_factory_.set_handshake_mode(
3463 MockCryptoClientStream::ZERO_RTT);
3464 host_resolver_.set_synchronous_mode(true);
3465 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3466 "192.168.0.1", "");
3467
rcha02807b42016-01-29 21:56:153468 // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
3469 // posts a task.
rtenneti1cd3b162015-09-29 02:58:283470 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
rcha02807b42016-01-29 21:56:153471 SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
3472 "StartReading");
rtenneti1cd3b162015-09-29 02:58:283473
jri7046038f2015-10-22 00:29:263474 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563475 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtenneti1cd3b162015-09-29 02:58:283476 /*cert_verify_flags=*/0, host_port_pair_.host(),
3477 "GET", net_log_, callback_.callback()));
3478
rcha02807b42016-01-29 21:56:153479 // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
3480 // called.
rtenneti1cd3b162015-09-29 02:58:283481 base::RunLoop run_loop;
3482 run_loop.RunUntilIdle();
3483
3484 // Verify task that the observer's executed_count is 1, which indicates
rcha02807b42016-01-29 21:56:153485 // QuicChromiumPacketReader::StartReading() has posted only one task and
3486 // yielded the read.
rtenneti1cd3b162015-09-29 02:58:283487 EXPECT_EQ(1u, observer.executed_count());
3488
3489 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
3490 EXPECT_TRUE(stream.get());
3491 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3492 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3493}
3494
3495TEST_P(QuicStreamFactoryTest, YieldAfterDuration) {
jri7046038f2015-10-22 00:29:263496 Initialize();
rch6faa4d42016-01-05 20:48:433497 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3498 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rtenneti1cd3b162015-09-29 02:58:283499 QuicStreamFactoryPeer::SetYieldAfterDuration(
jri7046038f2015-10-22 00:29:263500 factory_.get(), QuicTime::Delta::FromMilliseconds(-1));
rtenneti1cd3b162015-09-29 02:58:283501
3502 scoped_ptr<QuicEncryptedPacket> close_packet(
3503 ConstructConnectionClosePacket(0));
rtenneticd2aaa15b2015-10-10 20:29:333504 vector<MockRead> reads;
rtenneti1cd3b162015-09-29 02:58:283505 reads.push_back(
3506 MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0));
3507 reads.push_back(MockRead(ASYNC, OK, 1));
mmenke651bae7f2015-12-18 21:26:453508 SequencedSocketData socket_data(&reads[0], reads.size(), nullptr, 0);
rtenneti1cd3b162015-09-29 02:58:283509 socket_factory_.AddSocketDataProvider(&socket_data);
rtenneti1cd3b162015-09-29 02:58:283510
3511 crypto_client_stream_factory_.set_handshake_mode(
3512 MockCryptoClientStream::ZERO_RTT);
3513 host_resolver_.set_synchronous_mode(true);
3514 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
3515 "192.168.0.1", "");
3516
rcha02807b42016-01-29 21:56:153517 // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
3518 // posts a task.
rtenneti1cd3b162015-09-29 02:58:283519 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
rcha02807b42016-01-29 21:56:153520 SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
3521 "StartReading");
rtenneti1cd3b162015-09-29 02:58:283522
jri7046038f2015-10-22 00:29:263523 QuicStreamRequest request(factory_.get());
rchf114d982015-10-21 01:34:563524 EXPECT_EQ(OK, request.Request(host_port_pair_, privacy_mode_,
rtenneti1cd3b162015-09-29 02:58:283525 /*cert_verify_flags=*/0, host_port_pair_.host(),
3526 "GET", net_log_, callback_.callback()));
3527
rcha02807b42016-01-29 21:56:153528 // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
3529 // called.
rtenneti1cd3b162015-09-29 02:58:283530 base::RunLoop run_loop;
3531 run_loop.RunUntilIdle();
3532
3533 // Verify task that the observer's executed_count is 1, which indicates
rcha02807b42016-01-29 21:56:153534 // QuicChromiumPacketReader::StartReading() has posted only one task and
3535 // yielded the read.
rtenneti1cd3b162015-09-29 02:58:283536 EXPECT_EQ(1u, observer.executed_count());
3537
3538 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
3539 EXPECT_TRUE(stream.get());
3540 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3541 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3542}
3543
[email protected]e13201d82012-12-12 05:00:323544} // namespace test
[email protected]e13201d82012-12-12 05:00:323545} // namespace net