blob: 8904b3f2cd7b6200fd8d0895b816ed2f4127f8e6 [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
Ryan Hamiltona3ee93a72018-08-01 22:03:085#include "net/quic/quic_stream_factory.h"
[email protected]e13201d82012-12-12 05:00:326
avib3635452016-10-21 18:33:537#include <memory>
bnc359ed2a2016-04-29 20:43:458#include <ostream>
bnc086b39e12016-06-24 13:05:269#include <utility>
bnc359ed2a2016-04-29 20:43:4510
msramek992625ec2016-08-04 18:33:5811#include "base/bind.h"
12#include "base/callback.h"
xunjieli48e4f102017-04-11 23:06:5313#include "base/macros.h"
[email protected]e13201d82012-12-12 05:00:3214#include "base/run_loop.h"
[email protected]fc9be5802013-06-11 10:56:5115#include "base/strings/string_util.h"
Zhongyi Shic4823bd2018-04-27 00:49:1916#include "base/test/test_mock_time_task_runner.h"
Paul Jensen8e3c5d32018-02-19 17:06:3317#include "build/build_config.h"
mgershaf9a9232017-04-13 20:19:0318#include "net/base/mock_network_change_notifier.h"
rsleevid6de8302016-06-21 01:33:2019#include "net/cert/ct_policy_enforcer.h"
Ryan Sleevi987d2d92017-12-19 19:22:1420#include "net/cert/do_nothing_ct_verifier.h"
21#include "net/cert/mock_cert_verifier.h"
[email protected]f2cb3cf2013-03-21 01:40:5322#include "net/dns/mock_host_resolver.h"
[email protected]e13201d82012-12-12 05:00:3223#include "net/http/http_response_headers.h"
24#include "net/http/http_response_info.h"
rtenneti8332ba52015-09-17 19:33:4125#include "net/http/http_server_properties_impl.h"
[email protected]e13201d82012-12-12 05:00:3226#include "net/http/http_util.h"
[email protected]080b77932014-08-04 01:22:4627#include "net/http/transport_security_state.h"
Matt Mueller230996f12018-10-22 19:39:4428#include "net/http/transport_security_state_test_util.h"
Ryan Hamiltona3ee93a72018-08-01 22:03:0829#include "net/quic/crypto/proof_verifier_chromium.h"
30#include "net/quic/mock_crypto_client_stream_factory.h"
31#include "net/quic/mock_quic_data.h"
32#include "net/quic/properties_based_quic_server_info.h"
33#include "net/quic/quic_http_stream.h"
34#include "net/quic/quic_http_utils.h"
35#include "net/quic/quic_server_info.h"
36#include "net/quic/quic_stream_factory_peer.h"
37#include "net/quic/quic_test_packet_maker.h"
38#include "net/quic/test_task_runner.h"
bnc3472afd2016-11-17 15:27:2139#include "net/socket/next_proto.h"
[email protected]e13201d82012-12-12 05:00:3240#include "net/socket/socket_test_util.h"
Bence Béky94658bf2018-05-11 19:22:5841#include "net/spdy/spdy_session_test_util.h"
42#include "net/spdy/spdy_test_util_common.h"
[email protected]eed749f92013-12-23 18:57:3843#include "net/test/cert_test_util.h"
robpercival214763f2016-07-01 23:27:0144#include "net/test/gtest_util.h"
rsleevia69c79a2016-06-22 03:28:4345#include "net/test/test_data_directory.h"
Bence Béky98447b12018-05-08 03:14:0146#include "net/test/test_with_scoped_task_environment.h"
Ryan Hamilton56b10c5d2018-05-11 13:40:1647#include "net/third_party/quic/core/crypto/crypto_handshake.h"
48#include "net/third_party/quic/core/crypto/quic_crypto_client_config.h"
49#include "net/third_party/quic/core/crypto/quic_decrypter.h"
50#include "net/third_party/quic/core/crypto/quic_encrypter.h"
Victor Vasilievc5b409c22018-07-24 12:23:4651#include "net/third_party/quic/core/http/quic_client_promised_info.h"
David Schinazic8281052019-01-24 06:14:1752#include "net/third_party/quic/core/quic_utils.h"
Ryan Hamilton56b10c5d2018-05-11 13:40:1653#include "net/third_party/quic/platform/api/quic_test.h"
54#include "net/third_party/quic/test_tools/mock_clock.h"
55#include "net/third_party/quic/test_tools/mock_random.h"
56#include "net/third_party/quic/test_tools/quic_config_peer.h"
57#include "net/third_party/quic/test_tools/quic_spdy_session_peer.h"
58#include "net/third_party/quic/test_tools/quic_test_utils.h"
Victor Vasiliev27cc7712019-01-24 11:50:1459#include "net/third_party/quiche/src/spdy/core/spdy_test_utils.h"
Ramin Halavati683bcaa92018-02-14 08:42:3960#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
robpercival214763f2016-07-01 23:27:0161#include "testing/gmock/include/gmock/gmock.h"
[email protected]e13201d82012-12-12 05:00:3262#include "testing/gtest/include/gtest/gtest.h"
msramek992625ec2016-08-04 18:33:5863#include "url/gurl.h"
[email protected]e13201d82012-12-12 05:00:3264
[email protected]6e12d702013-11-13 00:17:1765using std::string;
[email protected]6e12d702013-11-13 00:17:1766
[email protected]e13201d82012-12-12 05:00:3267namespace net {
jri7e636642016-01-14 06:57:0868
nharper642ae4b2016-06-30 00:40:3669namespace {
70
71class MockSSLConfigService : public SSLConfigService {
72 public:
73 MockSSLConfigService() {}
Ryan Sleevib8449e02018-07-15 04:31:0774 ~MockSSLConfigService() override {}
nharper642ae4b2016-06-30 00:40:3675
76 void GetSSLConfig(SSLConfig* config) override { *config = config_; }
77
Nick Harper89bc7212018-07-31 19:07:5778 bool CanShareConnectionWithClientCerts(
79 const std::string& hostname) const override {
80 return false;
81 }
82
nharper642ae4b2016-06-30 00:40:3683 private:
nharper642ae4b2016-06-30 00:40:3684 SSLConfig config_;
85};
86
87} // namespace
88
[email protected]e13201d82012-12-12 05:00:3289namespace test {
90
[email protected]3c772402013-12-18 21:38:1191namespace {
bnc359ed2a2016-04-29 20:43:4592
93enum DestinationType {
94 // In pooling tests with two requests for different origins to the same
95 // destination, the destination should be
96 SAME_AS_FIRST, // the same as the first origin,
97 SAME_AS_SECOND, // the same as the second origin, or
98 DIFFERENT, // different from both.
99};
100
rch6faa4d42016-01-05 20:48:43101const char kDefaultServerHostName[] = "www.example.org";
102const char kServer2HostName[] = "mail.example.org";
bnc359ed2a2016-04-29 20:43:45103const char kDifferentHostname[] = "different.example.com";
[email protected]3c772402013-12-18 21:38:11104const int kDefaultServerPort = 443;
ckrasic3865ee0f2016-02-29 22:04:56105const char kDefaultUrl[] = "https://www.example.org/";
106const char kServer2Url[] = "https://mail.example.org/";
107const char kServer3Url[] = "https://docs.example.org/";
108const char kServer4Url[] = "https://images.example.org/";
Zhongyi Shic4823bd2018-04-27 00:49:19109const int kDefaultRTTMilliSecs = 300;
110const size_t kMinRetryTimeForDefaultNetworkSecs = 1;
Zhongyi Shib1b1fa42018-06-19 23:13:47111const size_t kWaitTimeForNewNetworkSecs = 10;
Renjiea0cb4a2c2018-09-26 23:37:30112const IPAddress kCachedIPAddress = IPAddress(192, 168, 0, 2);
113const char kNonCachedIPAddress[] = "192.168.0.1";
rtenneti14abd312015-02-06 21:56:01114
bnc359ed2a2016-04-29 20:43:45115// Run QuicStreamFactoryTest instances with all value combinations of version
116// and enable_connection_racting.
rtenneti14abd312015-02-06 21:56:01117struct TestParams {
bnc359ed2a2016-04-29 20:43:45118 friend std::ostream& operator<<(std::ostream& os, const TestParams& p) {
Yixin Wang079ad542018-01-11 04:06:05119 os << "{ version: " << QuicVersionToString(p.version)
120 << ", client_headers_include_h2_stream_dependency: "
121 << p.client_headers_include_h2_stream_dependency << " }";
rtenneti14abd312015-02-06 21:56:01122 return os;
123 }
124
Ryan Hamilton8d9ee76e2018-05-29 23:52:52125 quic::QuicTransportVersion version;
Yixin Wang079ad542018-01-11 04:06:05126 bool client_headers_include_h2_stream_dependency;
rtenneti14abd312015-02-06 21:56:01127};
128
rch872e00e2016-12-02 02:48:18129std::vector<TestParams> GetTestParams() {
130 std::vector<TestParams> params;
Ryan Hamilton8d9ee76e2018-05-29 23:52:52131 quic::QuicTransportVersionVector all_supported_versions =
132 quic::AllSupportedTransportVersions();
Yixin Wang079ad542018-01-11 04:06:05133 for (const auto& version : all_supported_versions) {
134 params.push_back(TestParams{version, false});
135 params.push_back(TestParams{version, true});
136 }
bnc359ed2a2016-04-29 20:43:45137 return params;
138}
139
140// Run QuicStreamFactoryWithDestinationTest instances with all value
141// combinations of version, enable_connection_racting, and destination_type.
142struct PoolingTestParams {
143 friend std::ostream& operator<<(std::ostream& os,
144 const PoolingTestParams& p) {
145 os << "{ version: " << QuicVersionToString(p.version)
bnc359ed2a2016-04-29 20:43:45146 << ", destination_type: ";
147 switch (p.destination_type) {
148 case SAME_AS_FIRST:
149 os << "SAME_AS_FIRST";
150 break;
151 case SAME_AS_SECOND:
152 os << "SAME_AS_SECOND";
153 break;
154 case DIFFERENT:
155 os << "DIFFERENT";
156 break;
157 }
Yixin Wang079ad542018-01-11 04:06:05158 os << ", client_headers_include_h2_stream_dependency: "
159 << p.client_headers_include_h2_stream_dependency;
bnc359ed2a2016-04-29 20:43:45160 os << " }";
161 return os;
162 }
163
Ryan Hamilton8d9ee76e2018-05-29 23:52:52164 quic::QuicTransportVersion version;
bnc359ed2a2016-04-29 20:43:45165 DestinationType destination_type;
Yixin Wang079ad542018-01-11 04:06:05166 bool client_headers_include_h2_stream_dependency;
bnc359ed2a2016-04-29 20:43:45167};
168
rch872e00e2016-12-02 02:48:18169std::vector<PoolingTestParams> GetPoolingTestParams() {
170 std::vector<PoolingTestParams> params;
Ryan Hamilton8d9ee76e2018-05-29 23:52:52171 quic::QuicTransportVersionVector all_supported_versions =
172 quic::AllSupportedTransportVersions();
173 for (const quic::QuicTransportVersion version : all_supported_versions) {
Yixin Wang079ad542018-01-11 04:06:05174 params.push_back(PoolingTestParams{version, SAME_AS_FIRST, false});
175 params.push_back(PoolingTestParams{version, SAME_AS_FIRST, true});
176 params.push_back(PoolingTestParams{version, SAME_AS_SECOND, false});
177 params.push_back(PoolingTestParams{version, SAME_AS_SECOND, true});
178 params.push_back(PoolingTestParams{version, DIFFERENT, false});
179 params.push_back(PoolingTestParams{version, DIFFERENT, true});
rtenneti14abd312015-02-06 21:56:01180 }
181 return params;
182}
183
bnc912a04b2016-04-20 14:19:50184} // namespace
[email protected]3c772402013-12-18 21:38:11185
bnc359ed2a2016-04-29 20:43:45186class QuicHttpStreamPeer {
187 public:
rchf0b18c8a2017-05-05 19:31:57188 static QuicChromiumClientSession::Handle* GetSessionHandle(
189 HttpStream* stream) {
190 return static_cast<QuicHttpStream*>(stream)->quic_session();
bnc359ed2a2016-04-29 20:43:45191 }
192};
193
Zhongyi Shi5f587cc2017-11-21 23:24:17194// TestConnectionMigrationSocketFactory will vend sockets with incremental port
195// number.
196class TestConnectionMigrationSocketFactory : public MockClientSocketFactory {
197 public:
198 TestConnectionMigrationSocketFactory() : next_source_port_num_(1u) {}
199 ~TestConnectionMigrationSocketFactory() override {}
200
201 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
202 DatagramSocket::BindType bind_type,
Zhongyi Shi5f587cc2017-11-21 23:24:17203 NetLog* net_log,
204 const NetLogSource& source) override {
205 SocketDataProvider* data_provider = mock_data().GetNext();
206 std::unique_ptr<MockUDPClientSocket> socket(
207 new MockUDPClientSocket(data_provider, net_log));
208 socket->set_source_port(next_source_port_num_++);
209 return std::move(socket);
210 }
211
212 private:
213 uint16_t next_source_port_num_;
214
215 DISALLOW_COPY_AND_ASSIGN(TestConnectionMigrationSocketFactory);
216};
217
Bence Béky98447b12018-05-08 03:14:01218class QuicStreamFactoryTestBase : public WithScopedTaskEnvironment {
[email protected]e13201d82012-12-12 05:00:32219 protected:
Ryan Hamilton8d9ee76e2018-05-29 23:52:52220 QuicStreamFactoryTestBase(quic::QuicTransportVersion version,
Yixin Wang079ad542018-01-11 04:06:05221 bool client_headers_include_h2_stream_dependency)
Renjiea0cb4a2c2018-09-26 23:37:30222 : host_resolver_(new MockHostResolver),
223 ssl_config_service_(new MockSSLConfigService),
Zhongyi Shi5f587cc2017-11-21 23:24:17224 socket_factory_(new MockClientSocketFactory),
nharper642ae4b2016-06-30 00:40:36225 random_generator_(0),
rchbf4c26d2017-04-16 23:17:55226 runner_(new TestTaskRunner(&clock_)),
bnc359ed2a2016-04-29 20:43:45227 version_(version),
David Schinazic8281052019-01-24 06:14:17228 client_maker_(
229 version_,
230 quic::QuicUtils::CreateRandomConnectionId(&random_generator_),
231 &clock_,
232 kDefaultServerHostName,
233 quic::Perspective::IS_CLIENT,
Zhongyi Shi967d2f12019-02-08 20:58:53234 client_headers_include_h2_stream_dependency),
David Schinazic8281052019-01-24 06:14:17235 server_maker_(
236 version_,
237 quic::QuicUtils::CreateRandomConnectionId(&random_generator_),
238 &clock_,
239 kDefaultServerHostName,
240 quic::Perspective::IS_SERVER,
241 false),
Ryan Sleevi987d2d92017-12-19 19:22:14242 cert_verifier_(std::make_unique<MockCertVerifier>()),
Ryan Sleevi987d2d92017-12-19 19:22:14243 cert_transparency_verifier_(std::make_unique<DoNothingCTVerifier>()),
jri7e636642016-01-14 06:57:08244 scoped_mock_network_change_notifier_(nullptr),
jri7046038f2015-10-22 00:29:26245 factory_(nullptr),
[email protected]bf4ea2f2014-03-10 22:57:53246 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
ckrasic3865ee0f2016-02-29 22:04:56247 url_(kDefaultUrl),
248 url2_(kServer2Url),
249 url3_(kServer3Url),
250 url4_(kServer4Url),
jri7046038f2015-10-22 00:29:26251 privacy_mode_(PRIVACY_MODE_DISABLED),
Zhongyi Shia6b68d112018-09-24 07:49:03252 failed_on_default_network_callback_(base::BindRepeating(
253 &QuicStreamFactoryTestBase::OnFailedOnDefaultNetwork,
254 base::Unretained(this))),
255 failed_on_default_network_(false),
Zhongyi Shi967d2f12019-02-08 20:58:53256 store_server_configs_in_properties_(false) {
257 test_params_.quic_headers_include_h2_stream_dependency =
258 client_headers_include_h2_stream_dependency;
Ryan Hamilton8d9ee76e2018-05-29 23:52:52259 clock_.AdvanceTime(quic::QuicTime::Delta::FromSeconds(1));
bnc359ed2a2016-04-29 20:43:45260 }
261
jri7046038f2015-10-22 00:29:26262 void Initialize() {
bnc359ed2a2016-04-29 20:43:45263 DCHECK(!factory_);
jri7046038f2015-10-22 00:29:26264 factory_.reset(new QuicStreamFactory(
Renjiea0cb4a2c2018-09-26 23:37:30265 net_log_.net_log(), host_resolver_.get(), ssl_config_service_.get(),
Zhongyi Shi5f587cc2017-11-21 23:24:17266 socket_factory_.get(), &http_server_properties_, cert_verifier_.get(),
Nick Harperecf319d2018-10-16 07:58:54267 &ct_policy_enforcer_, &transport_security_state_,
268 cert_transparency_verifier_.get(),
jri7046038f2015-10-22 00:29:26269 /*SocketPerformanceWatcherFactory*/ nullptr,
rchbf4c26d2017-04-16 23:17:55270 &crypto_client_stream_factory_, &random_generator_, &clock_,
Zhongyi Shi967d2f12019-02-08 20:58:53271 test_params_.quic_max_packet_length, test_params_.quic_user_agent_id,
272 store_server_configs_in_properties_,
273 test_params_.quic_close_sessions_on_ip_change,
274 test_params_.quic_goaway_sessions_on_ip_change,
275 test_params_.mark_quic_broken_when_network_blackholes,
276 test_params_.quic_idle_connection_timeout_seconds,
277 test_params_.quic_reduced_ping_timeout_seconds,
278 test_params_.quic_max_time_before_crypto_handshake_seconds,
279 test_params_.quic_max_idle_time_before_crypto_handshake_seconds,
280 test_params_.quic_migrate_sessions_on_network_change_v2,
281 test_params_.quic_migrate_sessions_early_v2,
282 test_params_.quic_retry_on_alternate_network_before_handshake,
283 test_params_.quic_max_time_on_non_default_network,
284 test_params_.quic_max_migrations_to_non_default_network_on_write_error,
285 test_params_
286 .quic_max_migrations_to_non_default_network_on_path_degrading,
287 test_params_.quic_allow_server_migration,
288 test_params_.quic_race_stale_dns_on_connection,
289 test_params_.quic_go_away_on_path_degrading,
290 test_params_.quic_race_cert_verification,
291 test_params_.quic_estimate_initial_rtt,
292 test_params_.quic_headers_include_h2_stream_dependency,
293 test_params_.quic_connection_options,
294 test_params_.quic_client_connection_options,
295 test_params_.quic_enable_socket_recv_optimization));
[email protected]e13201d82012-12-12 05:00:32296 }
297
Zhongyi Shi5f587cc2017-11-21 23:24:17298 void InitializeConnectionMigrationV2Test(
299 NetworkChangeNotifier::NetworkList connected_networks) {
300 scoped_mock_network_change_notifier_.reset(
301 new ScopedMockNetworkChangeNotifier());
302 MockNetworkChangeNotifier* mock_ncn =
303 scoped_mock_network_change_notifier_->mock_network_change_notifier();
304 mock_ncn->ForceNetworkHandlesSupported();
305 mock_ncn->SetConnectedNetworksList(connected_networks);
Zhongyi Shi967d2f12019-02-08 20:58:53306 test_params_.quic_migrate_sessions_on_network_change_v2 = true;
307 test_params_.quic_migrate_sessions_early_v2 = true;
Zhongyi Shi5f587cc2017-11-21 23:24:17308 socket_factory_.reset(new TestConnectionMigrationSocketFactory);
309 Initialize();
310 }
311
Yixin Wang7891a39d2017-11-08 20:59:24312 std::unique_ptr<HttpStream> CreateStream(QuicStreamRequest* request) {
313 std::unique_ptr<QuicChromiumClientSession::Handle> session =
314 request->ReleaseSessionHandle();
315 if (!session || !session->IsConnected())
316 return nullptr;
317
318 return std::make_unique<QuicHttpStream>(std::move(session));
319 }
320
bnccb7ff3c2015-05-21 20:51:55321 bool HasActiveSession(const HostPortPair& host_port_pair) {
Ryan Hamilton4f0b26e2018-06-27 23:52:32322 quic::QuicServerId server_id(host_port_pair.host(), host_port_pair.port(),
323 false);
bnc5fdc07162016-05-23 17:36:03324 return QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server_id);
bnccb7ff3c2015-05-21 20:51:55325 }
326
Renjiea0cb4a2c2018-09-26 23:37:30327 bool HasLiveSession(const HostPortPair& host_port_pair) {
328 quic::QuicServerId server_id(host_port_pair.host(), host_port_pair.port(),
329 false);
330 return QuicStreamFactoryPeer::HasLiveSession(factory_.get(), host_port_pair,
331 server_id);
332 }
333
zhongyi363c91c2017-03-23 23:16:08334 bool HasActiveJob(const HostPortPair& host_port_pair,
335 const PrivacyMode privacy_mode) {
Ryan Hamilton4f0b26e2018-06-27 23:52:32336 quic::QuicServerId server_id(host_port_pair.host(), host_port_pair.port(),
337 privacy_mode == PRIVACY_MODE_ENABLED);
zhongyi363c91c2017-03-23 23:16:08338 return QuicStreamFactoryPeer::HasActiveJob(factory_.get(), server_id);
339 }
340
Ryan Hamilton8d9ee76e2018-05-29 23:52:52341 bool HasActiveCertVerifierJob(const quic::QuicServerId& server_id) {
rtennetid073dd22016-08-04 01:58:33342 return QuicStreamFactoryPeer::HasActiveCertVerifierJob(factory_.get(),
343 server_id);
344 }
345
Zhongyi Shic1449372018-08-09 09:58:58346 // Get the pending, not activated session, if there is only one session alive.
347 QuicChromiumClientSession* GetPendingSession(
348 const HostPortPair& host_port_pair) {
349 quic::QuicServerId server_id(host_port_pair.host(), host_port_pair.port(),
350 false);
351 return QuicStreamFactoryPeer::GetPendingSession(factory_.get(), server_id,
352 host_port_pair);
353 }
354
bnc912a04b2016-04-20 14:19:50355 QuicChromiumClientSession* GetActiveSession(
356 const HostPortPair& host_port_pair) {
Ryan Hamilton4f0b26e2018-06-27 23:52:32357 quic::QuicServerId server_id(host_port_pair.host(), host_port_pair.port(),
358 false);
bnc5fdc07162016-05-23 17:36:03359 return QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server_id);
bnc912a04b2016-04-20 14:19:50360 }
361
[email protected]bf4ea2f2014-03-10 22:57:53362 int GetSourcePortForNewSession(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10363 return GetSourcePortForNewSessionInner(destination, false);
364 }
365
rjshaded5ced072015-12-18 19:26:02366 int GetSourcePortForNewSessionAndGoAway(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10367 return GetSourcePortForNewSessionInner(destination, true);
368 }
369
[email protected]bf4ea2f2014-03-10 22:57:53370 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
[email protected]d8e2abf82014-03-06 10:30:10371 bool goaway_received) {
[email protected]3c772402013-12-18 21:38:11372 // Should only be called if there is no active session for this destination.
bnccb7ff3c2015-05-21 20:51:55373 EXPECT_FALSE(HasActiveSession(destination));
Zhongyi Shi5f587cc2017-11-21 23:24:17374 size_t socket_count = socket_factory_->udp_client_socket_ports().size();
[email protected]3c772402013-12-18 21:38:11375
rcha00569732016-08-27 11:09:36376 MockQuicData socket_data;
377 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:43378 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:17379 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]3c772402013-12-18 21:38:11380
zhongyi98d6a9262017-05-19 02:47:45381 QuicStreamRequest request(factory_.get());
ckrasic3865ee0f2016-02-29 22:04:56382 GURL url("https://" + destination.host() + "/");
Zhongyi Shia6b68d112018-09-24 07:49:03383 EXPECT_EQ(
384 ERR_IO_PENDING,
385 request.Request(
386 destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
387 /*cert_verify_flags=*/0, url, net_log_, &net_error_details_,
388 failed_on_default_network_callback_, callback_.callback()));
[email protected]3c772402013-12-18 21:38:11389
robpercival214763f2016-07-01 23:27:01390 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:24391 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]3c772402013-12-18 21:38:11392 EXPECT_TRUE(stream.get());
393 stream.reset();
394
bnc912a04b2016-04-20 14:19:50395 QuicChromiumClientSession* session = GetActiveSession(destination);
[email protected]3c772402013-12-18 21:38:11396
Zhongyi Shi5f587cc2017-11-21 23:24:17397 if (socket_count + 1 != socket_factory_->udp_client_socket_ports().size()) {
mmenke651bae7f2015-12-18 21:26:45398 ADD_FAILURE();
[email protected]3c772402013-12-18 21:38:11399 return 0;
400 }
401
[email protected]d8e2abf82014-03-06 10:30:10402 if (goaway_received) {
Ryan Hamilton8d9ee76e2018-05-29 23:52:52403 quic::QuicGoAwayFrame goaway(quic::kInvalidControlFrameId,
404 quic::QUIC_NO_ERROR, 1, "");
rtenneti9bd5d4b2015-08-21 05:44:52405 session->connection()->OnGoAwayFrame(goaway);
[email protected]d8e2abf82014-03-06 10:30:10406 }
[email protected]3c772402013-12-18 21:38:11407
jri7046038f2015-10-22 00:29:26408 factory_->OnSessionClosed(session);
bnccb7ff3c2015-05-21 20:51:55409 EXPECT_FALSE(HasActiveSession(destination));
rch37de576c2015-05-17 20:28:17410 EXPECT_TRUE(socket_data.AllReadDataConsumed());
411 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
Zhongyi Shi5f587cc2017-11-21 23:24:17412 return socket_factory_->udp_client_socket_ports()[socket_count];
[email protected]3c772402013-12-18 21:38:11413 }
414
Ryan Hamilton8d9ee76e2018-05-29 23:52:52415 std::unique_ptr<quic::QuicEncryptedPacket>
Fan Yangac867502019-01-28 21:10:23416 ConstructClientConnectionClosePacket(uint64_t num) {
Bin Wu5311aca2018-01-22 01:19:03417 return client_maker_.MakeConnectionClosePacket(
Ryan Hamilton8d9ee76e2018-05-29 23:52:52418 num, false, quic::QUIC_CRYPTO_VERSION_NOT_SUPPORTED, "Time to panic!");
rtenneti1cd3b162015-09-29 02:58:28419 }
420
Ryan Hamilton8d9ee76e2018-05-29 23:52:52421 std::unique_ptr<quic::QuicEncryptedPacket> ConstructClientRstPacket(
Fan Yangac867502019-01-28 21:10:23422 uint64_t packet_number,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52423 quic::QuicRstStreamErrorCode error_code) {
Fan Yang32c5a112018-12-10 20:06:33424 quic::QuicStreamId stream_id =
425 GetNthClientInitiatedBidirectionalStreamId(0);
fayang3bcb8b502016-12-07 21:44:37426 return client_maker_.MakeRstPacket(packet_number, true, stream_id,
Jana Iyengarba355772017-09-21 22:03:21427 error_code);
fayang3bcb8b502016-12-07 21:44:37428 }
429
bncf8bf0722015-05-19 20:04:13430 static ProofVerifyDetailsChromium DefaultProofVerifyDetails() {
rch6faa4d42016-01-05 20:48:43431 // Load a certificate that is valid for *.example.org
bncf8bf0722015-05-19 20:04:13432 scoped_refptr<X509Certificate> test_cert(
rch6faa4d42016-01-05 20:48:43433 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bncf8bf0722015-05-19 20:04:13434 EXPECT_TRUE(test_cert.get());
435 ProofVerifyDetailsChromium verify_details;
436 verify_details.cert_verify_result.verified_cert = test_cert;
437 verify_details.cert_verify_result.is_issued_by_known_root = true;
438 return verify_details;
439 }
440
jri8c44d692015-10-23 23:53:41441 void NotifyIPAddressChanged() {
442 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
jri7e636642016-01-14 06:57:08443 // Spin the message loop so the notification is delivered.
fdoray92e35a72016-06-10 15:54:55444 base::RunLoop().RunUntilIdle();
jri8c44d692015-10-23 23:53:41445 }
446
Ryan Hamilton8d9ee76e2018-05-29 23:52:52447 std::unique_ptr<quic::QuicEncryptedPacket> ConstructGetRequestPacket(
Fan Yangac867502019-01-28 21:10:23448 uint64_t packet_number,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52449 quic::QuicStreamId stream_id,
jri7e636642016-01-14 06:57:08450 bool should_include_version,
451 bool fin) {
Ryan Hamilton0239aac2018-05-19 00:03:13452 spdy::SpdyHeaderBlock headers =
alyssar2adf3ac2016-05-03 17:12:58453 client_maker_.GetRequestHeaders("GET", "https", "/");
Ryan Hamilton0239aac2018-05-19 00:03:13454 spdy::SpdyPriority priority =
jri7e636642016-01-14 06:57:08455 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
456 size_t spdy_headers_frame_len;
alyssar2adf3ac2016-05-03 17:12:58457 return client_maker_.MakeRequestHeadersPacket(
jri7e636642016-01-14 06:57:08458 packet_number, stream_id, should_include_version, fin, priority,
Yixin Wang7a3f1b8d2018-01-17 21:40:48459 std::move(headers), 0, &spdy_headers_frame_len);
jri7e636642016-01-14 06:57:08460 }
461
Ryan Hamilton8d9ee76e2018-05-29 23:52:52462 std::unique_ptr<quic::QuicEncryptedPacket> ConstructGetRequestPacket(
Fan Yangac867502019-01-28 21:10:23463 uint64_t packet_number,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52464 quic::QuicStreamId stream_id,
Zhongyi Shi3c4c9e92018-07-02 23:16:23465 quic::QuicStreamId parent_stream_id,
fayang3bcb8b502016-12-07 21:44:37466 bool should_include_version,
467 bool fin,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52468 quic::QuicStreamOffset* offset) {
Ryan Hamilton0239aac2018-05-19 00:03:13469 spdy::SpdyHeaderBlock headers =
fayang3bcb8b502016-12-07 21:44:37470 client_maker_.GetRequestHeaders("GET", "https", "/");
Ryan Hamilton0239aac2018-05-19 00:03:13471 spdy::SpdyPriority priority =
fayang3bcb8b502016-12-07 21:44:37472 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
473 size_t spdy_headers_frame_len;
474 return client_maker_.MakeRequestHeadersPacket(
475 packet_number, stream_id, should_include_version, fin, priority,
Zhongyi Shi3c4c9e92018-07-02 23:16:23476 std::move(headers), parent_stream_id, &spdy_headers_frame_len, offset);
477 }
478
479 std::unique_ptr<quic::QuicEncryptedPacket> ConstructGetRequestPacket(
Fan Yangac867502019-01-28 21:10:23480 uint64_t packet_number,
Zhongyi Shi3c4c9e92018-07-02 23:16:23481 quic::QuicStreamId stream_id,
482 bool should_include_version,
483 bool fin,
484 quic::QuicStreamOffset* offset) {
485 return ConstructGetRequestPacket(packet_number, stream_id,
486 /*parent_stream_id=*/0,
487 should_include_version, fin, offset);
fayang3bcb8b502016-12-07 21:44:37488 }
489
Ryan Hamilton8d9ee76e2018-05-29 23:52:52490 std::unique_ptr<quic::QuicEncryptedPacket> ConstructOkResponsePacket(
Fan Yangac867502019-01-28 21:10:23491 uint64_t packet_number,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52492 quic::QuicStreamId stream_id,
jri7e636642016-01-14 06:57:08493 bool should_include_version,
494 bool fin) {
Ryan Hamilton0239aac2018-05-19 00:03:13495 spdy::SpdyHeaderBlock headers = server_maker_.GetResponseHeaders("200 OK");
jri7e636642016-01-14 06:57:08496 size_t spdy_headers_frame_len;
alyssar2adf3ac2016-05-03 17:12:58497 return server_maker_.MakeResponseHeadersPacket(
bnc086b39e12016-06-24 13:05:26498 packet_number, stream_id, should_include_version, fin,
499 std::move(headers), &spdy_headers_frame_len);
jri7e636642016-01-14 06:57:08500 }
501
Ryan Hamilton8d9ee76e2018-05-29 23:52:52502 std::unique_ptr<quic::QuicReceivedPacket> ConstructInitialSettingsPacket() {
rch5cb522462017-04-25 20:18:36503 return client_maker_.MakeInitialSettingsPacket(1, nullptr);
504 }
505
Ryan Hamilton8d9ee76e2018-05-29 23:52:52506 std::unique_ptr<quic::QuicReceivedPacket> ConstructInitialSettingsPacket(
Fan Yangac867502019-01-28 21:10:23507 uint64_t packet_number,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52508 quic::QuicStreamOffset* offset) {
rch5cb522462017-04-25 20:18:36509 return client_maker_.MakeInitialSettingsPacket(packet_number, offset);
fayang3bcb8b502016-12-07 21:44:37510 }
511
jri053fdbd2016-08-19 02:33:05512 // Helper method for server migration tests.
Ryan Hamilton8d9ee76e2018-05-29 23:52:52513 void VerifyServerMigration(const quic::QuicConfig& config,
bnc6a0348c2017-05-22 18:56:19514 IPEndPoint expected_address) {
Zhongyi Shi967d2f12019-02-08 20:58:53515 test_params_.quic_allow_server_migration = true;
jri053fdbd2016-08-19 02:33:05516 Initialize();
517
518 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
519 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri053fdbd2016-08-19 02:33:05520 crypto_client_stream_factory_.SetConfig(config);
521
522 // Set up first socket data provider.
rcha00569732016-08-27 11:09:36523 MockQuicData socket_data1;
524 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:17525 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri053fdbd2016-08-19 02:33:05526
rcha00569732016-08-27 11:09:36527 // Set up second socket data provider that is used after
528 // migration.
529 MockQuicData socket_data2;
530 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:43531 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
fayang3bcb8b502016-12-07 21:44:37532 socket_data2.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:43533 SYNCHRONOUS, client_maker_.MakePingPacket(2, /*include_version=*/true));
534 socket_data2.AddWrite(
Fan Yang32c5a112018-12-10 20:06:33535 SYNCHRONOUS, client_maker_.MakeRstPacket(
536 3, true, GetNthClientInitiatedBidirectionalStreamId(0),
537 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:17538 socket_data2.AddSocketDataToFactory(socket_factory_.get());
jri053fdbd2016-08-19 02:33:05539
540 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:45541 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:33542 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:03543 request.Request(
544 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
545 SocketTag(),
546 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
547 failed_on_default_network_callback_, callback_.callback()));
jri053fdbd2016-08-19 02:33:05548 EXPECT_EQ(OK, callback_.WaitForResult());
bnceb9aa7112017-01-05 01:03:46549
550 // Run QuicChromiumClientSession::WriteToNewSocket()
551 // posted by QuicChromiumClientSession::MigrateToSocket().
552 base::RunLoop().RunUntilIdle();
553
Yixin Wang7891a39d2017-11-08 20:59:24554 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri053fdbd2016-08-19 02:33:05555 EXPECT_TRUE(stream.get());
556
557 // Cause QUIC stream to be created.
558 HttpRequestInfo request_info;
559 request_info.method = "GET";
560 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:39561 request_info.traffic_annotation =
562 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:27563 EXPECT_EQ(OK,
564 stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:39565 net_log_, CompletionOnceCallback()));
jri053fdbd2016-08-19 02:33:05566 // Ensure that session is alive and active.
567 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
568 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
569 EXPECT_TRUE(HasActiveSession(host_port_pair_));
570
571 IPEndPoint actual_address;
572 session->GetDefaultSocket()->GetPeerAddress(&actual_address);
573 EXPECT_EQ(actual_address, expected_address);
574 DVLOG(1) << "Socket connected to: " << actual_address.address().ToString()
575 << " " << actual_address.port();
576 DVLOG(1) << "Expected address: " << expected_address.address().ToString()
577 << " " << expected_address.port();
578
579 stream.reset();
580 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
581 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
582 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
583 }
584
tbansal3b966952016-10-25 23:25:14585 // Verifies that the QUIC stream factory is initialized correctly.
tbansal9b1cdf32017-05-10 17:28:39586 void VerifyInitialization() {
rch431dd4452017-04-19 15:22:35587 store_server_configs_in_properties_ = true;
Zhongyi Shi967d2f12019-02-08 20:58:53588 test_params_.quic_idle_connection_timeout_seconds = 500;
tbansal3b966952016-10-25 23:25:14589 Initialize();
Ryan Hamiltona12722b2017-08-12 02:23:20590 factory_->set_require_confirmation(false);
tbansal3b966952016-10-25 23:25:14591 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
592 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rch431dd4452017-04-19 15:22:35593 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
594 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:27595 MockCryptoClientStream::ZERO_RTT);
Ryan Hamilton8d9ee76e2018-05-29 23:52:52596 const quic::QuicConfig* config =
597 QuicStreamFactoryPeer::GetConfig(factory_.get());
ckrasic32b17dcd2016-10-31 06:15:35598 EXPECT_EQ(500, config->IdleNetworkTimeout().ToSeconds());
tbansal3b966952016-10-25 23:25:14599
600 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
601
bnc3472afd2016-11-17 15:27:21602 const AlternativeService alternative_service1(
603 kProtoQUIC, host_port_pair_.host(), host_port_pair_.port());
tbansal3b966952016-10-25 23:25:14604 AlternativeServiceInfoVector alternative_service_info_vector;
605 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
606 alternative_service_info_vector.push_back(
zhongyie537a002017-06-27 16:48:21607 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
608 alternative_service1, expiration, {version_}));
tbansal3b966952016-10-25 23:25:14609 http_server_properties_.SetAlternativeServices(
610 url::SchemeHostPort(url_), alternative_service_info_vector);
611
612 HostPortPair host_port_pair2(kServer2HostName, kDefaultServerPort);
613 url::SchemeHostPort server2("https", kServer2HostName, kDefaultServerPort);
bnc3472afd2016-11-17 15:27:21614 const AlternativeService alternative_service2(
615 kProtoQUIC, host_port_pair2.host(), host_port_pair2.port());
tbansal3b966952016-10-25 23:25:14616 AlternativeServiceInfoVector alternative_service_info_vector2;
617 alternative_service_info_vector2.push_back(
zhongyie537a002017-06-27 16:48:21618 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
619 alternative_service2, expiration, {version_}));
tbansal9b1cdf32017-05-10 17:28:39620
621 http_server_properties_.SetAlternativeServices(
622 server2, alternative_service_info_vector2);
623 // Verify that the properties of both QUIC servers are stored in the
624 // HTTP properties map.
625 EXPECT_EQ(2U, http_server_properties_.alternative_service_map().size());
tbansal3b966952016-10-25 23:25:14626
627 http_server_properties_.SetMaxServerConfigsStoredInProperties(
Yixin Wang4a227aa22017-11-30 21:33:01628 kDefaultMaxQuicServerEntries);
tbansal3b966952016-10-25 23:25:14629
Ryan Hamilton8d9ee76e2018-05-29 23:52:52630 quic::QuicServerId quic_server_id(kDefaultServerHostName, 443,
631 PRIVACY_MODE_DISABLED);
rch431dd4452017-04-19 15:22:35632 std::unique_ptr<QuicServerInfo> quic_server_info =
Jeremy Roman0579ed62017-08-29 15:56:19633 std::make_unique<PropertiesBasedQuicServerInfo>(
rch431dd4452017-04-19 15:22:35634 quic_server_id, &http_server_properties_);
tbansal3b966952016-10-25 23:25:14635
636 // Update quic_server_info's server_config and persist it.
637 QuicServerInfo::State* state = quic_server_info->mutable_state();
638 // Minimum SCFG that passes config validation checks.
639 const char scfg[] = {// SCFG
640 0x53, 0x43, 0x46, 0x47,
641 // num entries
642 0x01, 0x00,
643 // padding
644 0x00, 0x00,
645 // EXPY
646 0x45, 0x58, 0x50, 0x59,
647 // EXPY end offset
648 0x08, 0x00, 0x00, 0x00,
649 // Value
650 '1', '2', '3', '4', '5', '6', '7', '8'};
651
652 // Create temporary strings becasue Persist() clears string data in |state|.
653 string server_config(reinterpret_cast<const char*>(&scfg), sizeof(scfg));
654 string source_address_token("test_source_address_token");
655 string cert_sct("test_cert_sct");
656 string chlo_hash("test_chlo_hash");
657 string signature("test_signature");
658 string test_cert("test_cert");
rch872e00e2016-12-02 02:48:18659 std::vector<string> certs;
tbansal3b966952016-10-25 23:25:14660 certs.push_back(test_cert);
661 state->server_config = server_config;
662 state->source_address_token = source_address_token;
663 state->cert_sct = cert_sct;
664 state->chlo_hash = chlo_hash;
665 state->server_config_sig = signature;
666 state->certs = certs;
667
668 quic_server_info->Persist();
669
Ryan Hamilton8d9ee76e2018-05-29 23:52:52670 quic::QuicServerId quic_server_id2(kServer2HostName, 443,
671 PRIVACY_MODE_DISABLED);
rch431dd4452017-04-19 15:22:35672 std::unique_ptr<QuicServerInfo> quic_server_info2 =
Jeremy Roman0579ed62017-08-29 15:56:19673 std::make_unique<PropertiesBasedQuicServerInfo>(
rch431dd4452017-04-19 15:22:35674 quic_server_id2, &http_server_properties_);
tbansal3b966952016-10-25 23:25:14675 // Update quic_server_info2's server_config and persist it.
676 QuicServerInfo::State* state2 = quic_server_info2->mutable_state();
677
678 // Minimum SCFG that passes config validation checks.
679 const char scfg2[] = {// SCFG
680 0x53, 0x43, 0x46, 0x47,
681 // num entries
682 0x01, 0x00,
683 // padding
684 0x00, 0x00,
685 // EXPY
686 0x45, 0x58, 0x50, 0x59,
687 // EXPY end offset
688 0x08, 0x00, 0x00, 0x00,
689 // Value
690 '8', '7', '3', '4', '5', '6', '2', '1'};
691
692 // Create temporary strings becasue Persist() clears string data in
693 // |state2|.
694 string server_config2(reinterpret_cast<const char*>(&scfg2), sizeof(scfg2));
695 string source_address_token2("test_source_address_token2");
696 string cert_sct2("test_cert_sct2");
697 string chlo_hash2("test_chlo_hash2");
698 string signature2("test_signature2");
699 string test_cert2("test_cert2");
rch872e00e2016-12-02 02:48:18700 std::vector<string> certs2;
tbansal3b966952016-10-25 23:25:14701 certs2.push_back(test_cert2);
702 state2->server_config = server_config2;
703 state2->source_address_token = source_address_token2;
704 state2->cert_sct = cert_sct2;
705 state2->chlo_hash = chlo_hash2;
706 state2->server_config_sig = signature2;
707 state2->certs = certs2;
708
709 quic_server_info2->Persist();
710
tbansal3b966952016-10-25 23:25:14711 // Verify the MRU order is maintained.
712 const QuicServerInfoMap& quic_server_info_map =
713 http_server_properties_.quic_server_info_map();
714 EXPECT_EQ(2u, quic_server_info_map.size());
jdoerrie22a91d8b92018-10-05 08:43:26715 auto quic_server_info_map_it = quic_server_info_map.begin();
tbansal3b966952016-10-25 23:25:14716 EXPECT_EQ(quic_server_info_map_it->first, quic_server_id2);
717 ++quic_server_info_map_it;
718 EXPECT_EQ(quic_server_info_map_it->first, quic_server_id);
719
Renjiea0cb4a2c2018-09-26 23:37:30720 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
721 "192.168.0.1", "");
rch431dd4452017-04-19 15:22:35722
723 // Create a session and verify that the cached state is loaded.
724 MockQuicData socket_data;
725 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:17726 socket_data.AddSocketDataToFactory(socket_factory_.get());
rch431dd4452017-04-19 15:22:35727
zhongyi98d6a9262017-05-19 02:47:45728 QuicStreamRequest request(factory_.get());
Yixin Wang247ea642017-11-15 01:15:50729 EXPECT_EQ(ERR_IO_PENDING,
Ryan Hamilton4f0b26e2018-06-27 23:52:32730 request.Request(
731 HostPortPair(quic_server_id.host(), quic_server_id.port()),
732 version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
733 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
Zhongyi Shia6b68d112018-09-24 07:49:03734 failed_on_default_network_callback_, callback_.callback()));
rch431dd4452017-04-19 15:22:35735 EXPECT_THAT(callback_.WaitForResult(), IsOk());
736
tbansal3b966952016-10-25 23:25:14737 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(
738 factory_.get(), quic_server_id));
Ryan Hamilton8d9ee76e2018-05-29 23:52:52739 quic::QuicCryptoClientConfig* crypto_config =
tbansal3b966952016-10-25 23:25:14740 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
Ryan Hamilton8d9ee76e2018-05-29 23:52:52741 quic::QuicCryptoClientConfig::CachedState* cached =
tbansal3b966952016-10-25 23:25:14742 crypto_config->LookupOrCreate(quic_server_id);
743 EXPECT_FALSE(cached->server_config().empty());
744 EXPECT_TRUE(cached->GetServerConfig());
745 EXPECT_EQ(server_config, cached->server_config());
746 EXPECT_EQ(source_address_token, cached->source_address_token());
747 EXPECT_EQ(cert_sct, cached->cert_sct());
748 EXPECT_EQ(chlo_hash, cached->chlo_hash());
749 EXPECT_EQ(signature, cached->signature());
750 ASSERT_EQ(1U, cached->certs().size());
751 EXPECT_EQ(test_cert, cached->certs()[0]);
752
rch431dd4452017-04-19 15:22:35753 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
754
755 // Create a session and verify that the cached state is loaded.
756 MockQuicData socket_data2;
757 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:17758 socket_data2.AddSocketDataToFactory(socket_factory_.get());
rch431dd4452017-04-19 15:22:35759
Renjiea0cb4a2c2018-09-26 23:37:30760 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
761 "192.168.0.2", "");
rch431dd4452017-04-19 15:22:35762
zhongyi98d6a9262017-05-19 02:47:45763 QuicStreamRequest request2(factory_.get());
rch431dd4452017-04-19 15:22:35764 EXPECT_EQ(ERR_IO_PENDING,
Ryan Hamilton4f0b26e2018-06-27 23:52:32765 request2.Request(
766 HostPortPair(quic_server_id2.host(), quic_server_id2.port()),
767 version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
768 /*cert_verify_flags=*/0, GURL("https://mail.example.org/"),
Zhongyi Shia6b68d112018-09-24 07:49:03769 net_log_, &net_error_details_,
770 failed_on_default_network_callback_, callback_.callback()));
rch431dd4452017-04-19 15:22:35771 EXPECT_THAT(callback_.WaitForResult(), IsOk());
772
tbansal3b966952016-10-25 23:25:14773 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(
774 factory_.get(), quic_server_id2));
Ryan Hamilton8d9ee76e2018-05-29 23:52:52775 quic::QuicCryptoClientConfig::CachedState* cached2 =
tbansal3b966952016-10-25 23:25:14776 crypto_config->LookupOrCreate(quic_server_id2);
777 EXPECT_FALSE(cached2->server_config().empty());
778 EXPECT_TRUE(cached2->GetServerConfig());
779 EXPECT_EQ(server_config2, cached2->server_config());
780 EXPECT_EQ(source_address_token2, cached2->source_address_token());
781 EXPECT_EQ(cert_sct2, cached2->cert_sct());
782 EXPECT_EQ(chlo_hash2, cached2->chlo_hash());
783 EXPECT_EQ(signature2, cached2->signature());
784 ASSERT_EQ(1U, cached->certs().size());
785 EXPECT_EQ(test_cert2, cached2->certs()[0]);
786 }
787
jri5b785512016-09-13 04:29:11788 void RunTestLoopUntilIdle() {
789 while (!runner_->GetPostedTasks().empty())
790 runner_->RunNextTask();
791 }
792
Fan Yang32c5a112018-12-10 20:06:33793 quic::QuicStreamId GetNthClientInitiatedBidirectionalStreamId(int n) {
794 return quic::test::GetNthClientInitiatedBidirectionalStreamId(version_, n);
ckrasicbf2f59c2017-05-04 23:54:36795 }
796
Fan Yang32c5a112018-12-10 20:06:33797 quic::QuicStreamId GetNthServerInitiatedUnidirectionalStreamId(int n) {
798 return quic::test::GetNthServerInitiatedUnidirectionalStreamId(version_, n);
ckrasicbf2f59c2017-05-04 23:54:36799 }
800
Zhongyi Shia6b68d112018-09-24 07:49:03801 void OnFailedOnDefaultNetwork(int rv) { failed_on_default_network_ = true; }
802
jri9f303712016-09-13 01:10:22803 // Helper methods for tests of connection migration on write error.
804 void TestMigrationOnWriteErrorNonMigratableStream(IoMode write_error_mode);
Zhongyi Shi0439ecc72018-07-11 04:41:26805 // Migratable stream triggers write error.
806 void TestMigrationOnWriteErrorMixedStreams(IoMode write_error_mode);
807 // Non-migratable stream triggers write error.
808 void TestMigrationOnWriteErrorMixedStreams2(IoMode write_error_mode);
jri9f303712016-09-13 01:10:22809 void TestMigrationOnWriteErrorMigrationDisabled(IoMode write_error_mode);
810 void TestMigrationOnWriteError(IoMode write_error_mode);
Zhongyi Shi0439ecc72018-07-11 04:41:26811 void TestMigrationOnWriteErrorWithMultipleRequests(IoMode write_error_mode);
jri9f303712016-09-13 01:10:22812 void TestMigrationOnWriteErrorNoNewNetwork(IoMode write_error_mode);
Zhongyi Shi7f1d9212018-06-22 23:24:36813 void TestMigrationOnMultipleWriteErrors(
814 IoMode write_error_mode_on_old_network,
815 IoMode write_error_mode_on_new_network);
Zhongyi Shib24001c02018-06-18 20:01:52816 void TestMigrationOnNetworkNotificationWithWriteErrorQueuedLater(
817 bool disconnected);
Zhongyi Shi1e2bc742018-06-16 02:06:07818 void TestMigrationOnWriteErrorWithNotificationQueuedLater(bool disconnected);
Zhongyi Shi9f316b262018-06-18 22:01:16819 void TestMigrationOnNetworkDisconnected(bool async_write_before);
Zhongyi Shia0644e32018-06-21 05:19:52820 void TestMigrationOnNetworkMadeDefault(IoMode write_mode);
Zhongyi Shi22fd5f52018-06-20 17:39:09821 void TestMigrationOnPathDegrading(bool async_write_before);
Zhongyi Shib3bc982c2018-07-10 19:59:24822 void TestMigrateSessionWithDrainingStream(
823 IoMode write_mode_for_queued_packet);
jri5b785512016-09-13 04:29:11824 void TestMigrationOnWriteErrorPauseBeforeConnected(IoMode write_error_mode);
Zhongyi Shi4ac9e1f2018-06-21 05:21:47825 void TestMigrationOnWriteErrorWithMultipleNotifications(
jri5b785512016-09-13 04:29:11826 IoMode write_error_mode,
Zhongyi Shi4ac9e1f2018-06-21 05:21:47827 bool disconnect_before_connect);
Zhongyi Shi634c1882018-08-16 04:05:59828 void TestNoAlternateNetworkBeforeHandshake(quic::QuicErrorCode error);
Zhongyi Shi8de43832018-08-15 23:40:00829 void TestNewConnectionOnAlternateNetworkBeforeHandshake(
830 quic::QuicErrorCode error);
jri9f303712016-09-13 01:10:22831
Jana Iyengarf6b13d82017-09-04 02:09:10832 QuicFlagSaver flags_; // Save/restore all QUIC flag values.
Renjiea0cb4a2c2018-09-26 23:37:30833 std::unique_ptr<MockHostResolverBase> host_resolver_;
Ryan Sleevib8449e02018-07-15 04:31:07834 std::unique_ptr<SSLConfigService> ssl_config_service_;
Zhongyi Shi5f587cc2017-11-21 23:24:17835 std::unique_ptr<MockClientSocketFactory> socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05836 MockCryptoClientStreamFactory crypto_client_stream_factory_;
Ryan Hamilton8d9ee76e2018-05-29 23:52:52837 quic::test::MockRandom random_generator_;
838 quic::MockClock clock_;
rtenneti38f5cd52014-10-28 20:28:28839 scoped_refptr<TestTaskRunner> runner_;
Ryan Hamilton8d9ee76e2018-05-29 23:52:52840 const quic::QuicTransportVersion version_;
alyssar2adf3ac2016-05-03 17:12:58841 QuicTestPacketMaker client_maker_;
842 QuicTestPacketMaker server_maker_;
rtenneticcab42b2015-10-09 06:38:16843 HttpServerPropertiesImpl http_server_properties_;
danakjad1777e2016-04-16 00:56:42844 std::unique_ptr<CertVerifier> cert_verifier_;
[email protected]080b77932014-08-04 01:22:46845 TransportSecurityState transport_security_state_;
danakjad1777e2016-04-16 00:56:42846 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
Ryan Sleevi8a9c9c12018-05-09 02:36:23847 DefaultCTPolicyEnforcer ct_policy_enforcer_;
danakjad1777e2016-04-16 00:56:42848 std::unique_ptr<ScopedMockNetworkChangeNotifier>
jri7e636642016-01-14 06:57:08849 scoped_mock_network_change_notifier_;
danakjad1777e2016-04-16 00:56:42850 std::unique_ptr<QuicStreamFactory> factory_;
[email protected]bf4ea2f2014-03-10 22:57:53851 HostPortPair host_port_pair_;
ckrasic3865ee0f2016-02-29 22:04:56852 GURL url_;
853 GURL url2_;
854 GURL url3_;
855 GURL url4_;
856
[email protected]9dd3ff0f2014-03-26 09:51:28857 PrivacyMode privacy_mode_;
tfarina42834112016-09-22 13:38:20858 NetLogWithSource net_log_;
[email protected]e13201d82012-12-12 05:00:32859 TestCompletionCallback callback_;
Zhongyi Shia6b68d112018-09-24 07:49:03860 const CompletionRepeatingCallback failed_on_default_network_callback_;
861 bool failed_on_default_network_;
Ryan Hamilton75f197262017-08-17 14:00:07862 NetErrorDetails net_error_details_;
jri7046038f2015-10-22 00:29:26863
864 // Variables to configure QuicStreamFactory.
Zhongyi Shi967d2f12019-02-08 20:58:53865 HttpNetworkSession::Params test_params_;
rch431dd4452017-04-19 15:22:35866 bool store_server_configs_in_properties_;
[email protected]e13201d82012-12-12 05:00:32867};
868
bnc359ed2a2016-04-29 20:43:45869class QuicStreamFactoryTest : public QuicStreamFactoryTestBase,
870 public ::testing::TestWithParam<TestParams> {
871 protected:
Yixin Wang079ad542018-01-11 04:06:05872 QuicStreamFactoryTest()
873 : QuicStreamFactoryTestBase(
874 GetParam().version,
875 GetParam().client_headers_include_h2_stream_dependency) {}
bnc359ed2a2016-04-29 20:43:45876};
877
Victor Costane635086f2019-01-27 05:20:30878INSTANTIATE_TEST_SUITE_P(VersionIncludeStreamDependencySequence,
879 QuicStreamFactoryTest,
880 ::testing::ValuesIn(GetTestParams()));
[email protected]1e960032013-12-20 19:00:20881
[email protected]1e960032013-12-20 19:00:20882TEST_P(QuicStreamFactoryTest, Create) {
jri7046038f2015-10-22 00:29:26883 Initialize();
rch6faa4d42016-01-05 20:48:43884 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
885 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26886
rcha00569732016-08-27 11:09:36887 MockQuicData socket_data;
888 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:43889 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:17890 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]e13201d82012-12-12 05:00:32891
zhongyi98d6a9262017-05-19 02:47:45892 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:33893 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:03894 request.Request(
895 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
896 SocketTag(),
897 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
898 failed_on_default_network_callback_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32899
robpercival214763f2016-07-01 23:27:01900 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:24901 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]0edce6a2013-05-08 18:02:40902 EXPECT_TRUE(stream.get());
[email protected]e13201d82012-12-12 05:00:32903
Renjiea0cb4a2c2018-09-26 23:37:30904 EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->last_request_priority());
Yixin Wang247ea642017-11-15 01:15:50905
zhongyi98d6a9262017-05-19 02:47:45906 QuicStreamRequest request2(factory_.get());
zhongyia00ca012017-07-06 23:36:39907 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:33908 DEFAULT_PRIORITY, SocketTag(),
909 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:03910 &net_error_details_,
911 failed_on_default_network_callback_,
912 callback_.callback()));
rch68a80eb2017-04-25 05:24:24913 // Will reset stream 3.
Yixin Wang7891a39d2017-11-08 20:59:24914 stream = CreateStream(&request2);
rch68a80eb2017-04-25 05:24:24915
916 EXPECT_TRUE(stream.get());
917
918 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
919 // in streams on different sessions.
zhongyi98d6a9262017-05-19 02:47:45920 QuicStreamRequest request3(factory_.get());
zhongyia00ca012017-07-06 23:36:39921 EXPECT_EQ(OK, request3.Request(host_port_pair_, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:33922 DEFAULT_PRIORITY, SocketTag(),
923 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:03924 &net_error_details_,
925 failed_on_default_network_callback_,
926 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:24927 stream = CreateStream(&request3); // Will reset stream 5.
Ryan Hamiltona12722b2017-08-12 02:23:20928 stream.reset(); // Will reset stream 7.
[email protected]e13201d82012-12-12 05:00:32929
rch37de576c2015-05-17 20:28:17930 EXPECT_TRUE(socket_data.AllReadDataConsumed());
931 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:32932}
933
[email protected]8bd2b812014-03-26 04:01:17934TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
jri7046038f2015-10-22 00:29:26935 Initialize();
Ryan Hamiltona12722b2017-08-12 02:23:20936 factory_->set_require_confirmation(false);
rch6faa4d42016-01-05 20:48:43937 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
938 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26939
rcha00569732016-08-27 11:09:36940 MockQuicData socket_data;
941 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:17942 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]8bd2b812014-03-26 04:01:17943
944 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:27945 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:30946 host_resolver_->set_synchronous_mode(true);
947 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
948 "192.168.0.1", "");
[email protected]8bd2b812014-03-26 04:01:17949
zhongyi98d6a9262017-05-19 02:47:45950 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:33951 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
952 DEFAULT_PRIORITY, SocketTag(),
953 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:03954 &net_error_details_,
955 failed_on_default_network_callback_,
956 callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17957
Yixin Wang7891a39d2017-11-08 20:59:24958 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]8bd2b812014-03-26 04:01:17959 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17960 EXPECT_TRUE(socket_data.AllReadDataConsumed());
961 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17962}
963
rchd6163f32017-01-30 23:50:38964TEST_P(QuicStreamFactoryTest, DefaultInitialRtt) {
965 Initialize();
966 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
967 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
968
969 MockQuicData socket_data;
970 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:43971 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:17972 socket_data.AddSocketDataToFactory(socket_factory_.get());
rchd6163f32017-01-30 23:50:38973
zhongyi98d6a9262017-05-19 02:47:45974 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:33975 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:03976 request.Request(
977 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
978 SocketTag(),
979 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
980 failed_on_default_network_callback_, callback_.callback()));
rchd6163f32017-01-30 23:50:38981
982 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:24983 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rchd6163f32017-01-30 23:50:38984 EXPECT_TRUE(stream.get());
985
986 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
Ryan Hamiltona12722b2017-08-12 02:23:20987 EXPECT_TRUE(session->require_confirmation());
rchd6163f32017-01-30 23:50:38988 EXPECT_EQ(100000u, session->connection()->GetStats().srtt_us);
989 ASSERT_FALSE(session->config()->HasInitialRoundTripTimeUsToSend());
990}
991
Helen Li0e823912017-09-25 19:48:30992TEST_P(QuicStreamFactoryTest, FactoryDestroyedWhenJobPending) {
993 Initialize();
994 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
995 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
996
997 MockQuicData socket_data;
998 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:43999 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171000 socket_data.AddSocketDataToFactory(socket_factory_.get());
Helen Li0e823912017-09-25 19:48:301001
1002 auto request = std::make_unique<QuicStreamRequest>(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331003 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031004 request->Request(
1005 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1006 SocketTag(),
1007 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1008 failed_on_default_network_callback_, callback_.callback()));
Helen Li0e823912017-09-25 19:48:301009 request.reset();
1010 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
1011 // Tearing down a QuicStreamFactory with a pending Job should not cause any
1012 // crash. crbug.com/768343.
1013 factory_.reset();
1014}
1015
Ryan Hamiltona12722b2017-08-12 02:23:201016TEST_P(QuicStreamFactoryTest, RequireConfirmation) {
1017 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:271018 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:301019 host_resolver_->set_synchronous_mode(true);
1020 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1021 "192.168.0.1", "");
Ryan Hamiltona12722b2017-08-12 02:23:201022 Initialize();
1023 factory_->set_require_confirmation(true);
1024 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1025 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1026
1027 MockQuicData socket_data;
1028 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431029 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171030 socket_data.AddSocketDataToFactory(socket_factory_.get());
Ryan Hamiltona12722b2017-08-12 02:23:201031
1032 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331033 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031034 request.Request(
1035 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1036 SocketTag(),
1037 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1038 failed_on_default_network_callback_, callback_.callback()));
Ryan Hamiltona12722b2017-08-12 02:23:201039
Ryan Hamilton8e32a2b2017-08-28 20:06:521040 IPAddress last_address;
1041 EXPECT_FALSE(http_server_properties_.GetSupportsQuic(&last_address));
1042
Ryan Hamiltona12722b2017-08-12 02:23:201043 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521044 quic::QuicSession::HANDSHAKE_CONFIRMED);
Ryan Hamiltona12722b2017-08-12 02:23:201045
Ryan Hamilton8e32a2b2017-08-28 20:06:521046 EXPECT_TRUE(http_server_properties_.GetSupportsQuic(&last_address));
1047
Ryan Hamiltona12722b2017-08-12 02:23:201048 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241049 std::unique_ptr<HttpStream> stream = CreateStream(&request);
Ryan Hamiltona12722b2017-08-12 02:23:201050 EXPECT_TRUE(stream.get());
1051
1052 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1053 EXPECT_TRUE(session->require_confirmation());
1054}
1055
1056TEST_P(QuicStreamFactoryTest, DontRequireConfirmationFromSameIP) {
1057 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:271058 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:301059 host_resolver_->set_synchronous_mode(true);
1060 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1061 "192.168.0.1", "");
Ryan Hamiltona12722b2017-08-12 02:23:201062 Initialize();
1063 factory_->set_require_confirmation(true);
1064 http_server_properties_.SetSupportsQuic(IPAddress(192, 0, 2, 33));
1065
1066 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1067 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1068
1069 MockQuicData socket_data;
1070 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431071 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171072 socket_data.AddSocketDataToFactory(socket_factory_.get());
Ryan Hamiltona12722b2017-08-12 02:23:201073
1074 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031075 EXPECT_THAT(request.Request(
1076 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1077 SocketTag(),
1078 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1079 failed_on_default_network_callback_, callback_.callback()),
Paul Jensen8e3c5d32018-02-19 17:06:331080 IsOk());
Ryan Hamiltona12722b2017-08-12 02:23:201081
Ryan Hamilton8e32a2b2017-08-28 20:06:521082 IPAddress last_address;
1083 EXPECT_FALSE(http_server_properties_.GetSupportsQuic(&last_address));
1084
Yixin Wang7891a39d2017-11-08 20:59:241085 std::unique_ptr<HttpStream> stream = CreateStream(&request);
Ryan Hamiltona12722b2017-08-12 02:23:201086 EXPECT_TRUE(stream.get());
1087
1088 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1089 EXPECT_FALSE(session->require_confirmation());
Ryan Hamilton8e32a2b2017-08-28 20:06:521090
1091 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521092 quic::QuicSession::HANDSHAKE_CONFIRMED);
Ryan Hamilton8e32a2b2017-08-28 20:06:521093
1094 EXPECT_TRUE(http_server_properties_.GetSupportsQuic(&last_address));
Ryan Hamiltona12722b2017-08-12 02:23:201095}
1096
rchd6163f32017-01-30 23:50:381097TEST_P(QuicStreamFactoryTest, CachedInitialRtt) {
1098 ServerNetworkStats stats;
1099 stats.srtt = base::TimeDelta::FromMilliseconds(10);
1100 http_server_properties_.SetServerNetworkStats(url::SchemeHostPort(url_),
1101 stats);
Zhongyi Shi967d2f12019-02-08 20:58:531102 test_params_.quic_estimate_initial_rtt = true;
rchd6163f32017-01-30 23:50:381103
1104 Initialize();
1105 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1106 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1107
1108 MockQuicData socket_data;
1109 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431110 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171111 socket_data.AddSocketDataToFactory(socket_factory_.get());
rchd6163f32017-01-30 23:50:381112
zhongyi98d6a9262017-05-19 02:47:451113 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331114 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031115 request.Request(
1116 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1117 SocketTag(),
1118 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1119 failed_on_default_network_callback_, callback_.callback()));
rchd6163f32017-01-30 23:50:381120
1121 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241122 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rchd6163f32017-01-30 23:50:381123 EXPECT_TRUE(stream.get());
1124
1125 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1126 EXPECT_EQ(10000u, session->connection()->GetStats().srtt_us);
1127 ASSERT_TRUE(session->config()->HasInitialRoundTripTimeUsToSend());
1128 EXPECT_EQ(10000u, session->config()->GetInitialRoundTripTimeUsToSend());
1129}
1130
1131TEST_P(QuicStreamFactoryTest, 2gInitialRtt) {
1132 ScopedMockNetworkChangeNotifier notifier;
1133 notifier.mock_network_change_notifier()->SetConnectionType(
1134 NetworkChangeNotifier::CONNECTION_2G);
Zhongyi Shi967d2f12019-02-08 20:58:531135 test_params_.quic_estimate_initial_rtt = true;
rchd6163f32017-01-30 23:50:381136
1137 Initialize();
1138 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1139 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1140
1141 MockQuicData socket_data;
1142 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431143 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171144 socket_data.AddSocketDataToFactory(socket_factory_.get());
rchd6163f32017-01-30 23:50:381145
zhongyi98d6a9262017-05-19 02:47:451146 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331147 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031148 request.Request(
1149 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1150 SocketTag(),
1151 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1152 failed_on_default_network_callback_, callback_.callback()));
rchd6163f32017-01-30 23:50:381153
1154 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241155 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rchd6163f32017-01-30 23:50:381156 EXPECT_TRUE(stream.get());
1157
1158 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1159 EXPECT_EQ(1200000u, session->connection()->GetStats().srtt_us);
1160 ASSERT_TRUE(session->config()->HasInitialRoundTripTimeUsToSend());
1161 EXPECT_EQ(1200000u, session->config()->GetInitialRoundTripTimeUsToSend());
1162}
1163
1164TEST_P(QuicStreamFactoryTest, 3gInitialRtt) {
1165 ScopedMockNetworkChangeNotifier notifier;
1166 notifier.mock_network_change_notifier()->SetConnectionType(
1167 NetworkChangeNotifier::CONNECTION_3G);
Zhongyi Shi967d2f12019-02-08 20:58:531168 test_params_.quic_estimate_initial_rtt = true;
rchd6163f32017-01-30 23:50:381169
1170 Initialize();
1171 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1172 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1173
1174 MockQuicData socket_data;
1175 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431176 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171177 socket_data.AddSocketDataToFactory(socket_factory_.get());
rchd6163f32017-01-30 23:50:381178
zhongyi98d6a9262017-05-19 02:47:451179 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331180 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031181 request.Request(
1182 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1183 SocketTag(),
1184 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1185 failed_on_default_network_callback_, callback_.callback()));
rchd6163f32017-01-30 23:50:381186
1187 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241188 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rchd6163f32017-01-30 23:50:381189 EXPECT_TRUE(stream.get());
1190
1191 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1192 EXPECT_EQ(400000u, session->connection()->GetStats().srtt_us);
1193 ASSERT_TRUE(session->config()->HasInitialRoundTripTimeUsToSend());
1194 EXPECT_EQ(400000u, session->config()->GetInitialRoundTripTimeUsToSend());
1195}
1196
rch68955482015-09-24 00:14:391197TEST_P(QuicStreamFactoryTest, GoAway) {
jri7046038f2015-10-22 00:29:261198 Initialize();
rch6faa4d42016-01-05 20:48:431199 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1200 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261201
rcha00569732016-08-27 11:09:361202 MockQuicData socket_data;
1203 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431204 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171205 socket_data.AddSocketDataToFactory(socket_factory_.get());
rch68955482015-09-24 00:14:391206
zhongyi98d6a9262017-05-19 02:47:451207 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331208 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031209 request.Request(
1210 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1211 SocketTag(),
1212 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1213 failed_on_default_network_callback_, callback_.callback()));
rch68955482015-09-24 00:14:391214
robpercival214763f2016-07-01 23:27:011215 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241216 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rch68955482015-09-24 00:14:391217 EXPECT_TRUE(stream.get());
1218
bnc912a04b2016-04-20 14:19:501219 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
rch68955482015-09-24 00:14:391220
Ryan Hamilton8d9ee76e2018-05-29 23:52:521221 session->OnGoAway(quic::QuicGoAwayFrame());
rch68955482015-09-24 00:14:391222
bnc912a04b2016-04-20 14:19:501223 EXPECT_FALSE(HasActiveSession(host_port_pair_));
rch68955482015-09-24 00:14:391224
1225 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1226 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1227}
1228
zhongyi6b5a3892016-03-12 04:46:201229TEST_P(QuicStreamFactoryTest, GoAwayForConnectionMigrationWithPortOnly) {
1230 Initialize();
1231 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1232 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1233
rcha00569732016-08-27 11:09:361234 MockQuicData socket_data;
1235 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431236 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171237 socket_data.AddSocketDataToFactory(socket_factory_.get());
zhongyi6b5a3892016-03-12 04:46:201238
zhongyi98d6a9262017-05-19 02:47:451239 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331240 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031241 request.Request(
1242 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1243 SocketTag(),
1244 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1245 failed_on_default_network_callback_, callback_.callback()));
zhongyi6b5a3892016-03-12 04:46:201246
robpercival214763f2016-07-01 23:27:011247 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241248 std::unique_ptr<HttpStream> stream = CreateStream(&request);
zhongyi6b5a3892016-03-12 04:46:201249 EXPECT_TRUE(stream.get());
1250
bnc912a04b2016-04-20 14:19:501251 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
zhongyi6b5a3892016-03-12 04:46:201252
Ryan Hamilton8d9ee76e2018-05-29 23:52:521253 session->OnGoAway(quic::QuicGoAwayFrame(
1254 quic::kInvalidControlFrameId, quic::QUIC_ERROR_MIGRATING_PORT, 0,
1255 "peer connection migration due to port change only"));
zhongyi6b5a3892016-03-12 04:46:201256 NetErrorDetails details;
1257 EXPECT_FALSE(details.quic_port_migration_detected);
1258 session->PopulateNetErrorDetails(&details);
1259 EXPECT_TRUE(details.quic_port_migration_detected);
1260 details.quic_port_migration_detected = false;
1261 stream->PopulateNetErrorDetails(&details);
1262 EXPECT_TRUE(details.quic_port_migration_detected);
1263
bnc912a04b2016-04-20 14:19:501264 EXPECT_FALSE(HasActiveSession(host_port_pair_));
zhongyi6b5a3892016-03-12 04:46:201265
1266 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1267 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1268}
1269
[email protected]5db452202014-08-19 05:22:151270TEST_P(QuicStreamFactoryTest, Pooling) {
jri7046038f2015-10-22 00:29:261271 Initialize();
rch6faa4d42016-01-05 20:48:431272 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1273 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261274
rcha00569732016-08-27 11:09:361275 MockQuicData socket_data;
1276 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431277 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171278 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]eed749f92013-12-23 18:57:381279
rch6faa4d42016-01-05 20:48:431280 HostPortPair server2(kServer2HostName, kDefaultServerPort);
Renjiea0cb4a2c2018-09-26 23:37:301281 host_resolver_->set_synchronous_mode(true);
1282 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1283 "192.168.0.1", "");
1284 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:381285
zhongyi98d6a9262017-05-19 02:47:451286 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331287 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
1288 DEFAULT_PRIORITY, SocketTag(),
1289 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:031290 &net_error_details_,
1291 failed_on_default_network_callback_,
1292 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241293 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]eed749f92013-12-23 18:57:381294 EXPECT_TRUE(stream.get());
1295
1296 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451297 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031298 EXPECT_EQ(OK,
1299 request2.Request(
1300 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1301 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1302 failed_on_default_network_callback_, callback.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241303 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]eed749f92013-12-23 18:57:381304 EXPECT_TRUE(stream2.get());
1305
bnc912a04b2016-04-20 14:19:501306 EXPECT_EQ(GetActiveSession(host_port_pair_), GetActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:381307
rch37de576c2015-05-17 20:28:171308 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1309 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:381310}
1311
jri94ddc3142016-08-26 01:32:431312TEST_P(QuicStreamFactoryTest, PoolingWithServerMigration) {
1313 // Set up session to migrate.
Renjiea0cb4a2c2018-09-26 23:37:301314 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1315 "192.168.0.1", "");
jri94ddc3142016-08-26 01:32:431316 IPEndPoint alt_address = IPEndPoint(IPAddress(1, 2, 3, 4), 443);
Ryan Hamilton8d9ee76e2018-05-29 23:52:521317 quic::QuicConfig config;
fayang91ca2012016-11-22 07:42:461318 config.SetAlternateServerAddressToSend(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521319 quic::QuicSocketAddress(quic::QuicSocketAddressImpl(alt_address)));
jri94ddc3142016-08-26 01:32:431320
1321 VerifyServerMigration(config, alt_address);
1322
1323 // Close server-migrated session.
1324 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
Renjieba55fae2018-09-20 03:05:161325 session->CloseSessionOnError(0u, quic::QUIC_NO_ERROR,
1326 quic::ConnectionCloseBehavior::SILENT_CLOSE);
jri94ddc3142016-08-26 01:32:431327
1328 // Set up server IP, socket, proof, and config for new session.
1329 HostPortPair server2(kServer2HostName, kDefaultServerPort);
Renjiea0cb4a2c2018-09-26 23:37:301330 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
jri94ddc3142016-08-26 01:32:431331
1332 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
Ryan Hamilton8d9ee76e2018-05-29 23:52:521333 std::unique_ptr<quic::QuicEncryptedPacket> settings_packet(
rch5cb522462017-04-25 20:18:361334 client_maker_.MakeInitialSettingsPacket(1, nullptr));
bnceb9aa7112017-01-05 01:03:461335 MockWrite writes[] = {MockWrite(SYNCHRONOUS, settings_packet->data(),
1336 settings_packet->length(), 1)};
fayang3bcb8b502016-12-07 21:44:371337
Ryan Sleevib8d7ea02018-05-07 20:01:011338 SequencedSocketData socket_data(reads, writes);
Zhongyi Shi5f587cc2017-11-21 23:24:171339 socket_factory_->AddSocketDataProvider(&socket_data);
jri94ddc3142016-08-26 01:32:431340
1341 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1342 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
Ryan Hamilton8d9ee76e2018-05-29 23:52:521343 quic::QuicConfig config2;
jri94ddc3142016-08-26 01:32:431344 crypto_client_stream_factory_.SetConfig(config2);
1345
1346 // Create new request to cause new session creation.
1347 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451348 QuicStreamRequest request2(factory_.get());
jri94ddc3142016-08-26 01:32:431349 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031350 request2.Request(
1351 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1352 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1353 failed_on_default_network_callback_, callback.callback()));
jri94ddc3142016-08-26 01:32:431354 EXPECT_EQ(OK, callback.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:241355 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
jri94ddc3142016-08-26 01:32:431356 EXPECT_TRUE(stream2.get());
1357
1358 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1359 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1360 // EXPECT_EQ(GetActiveSession(host_port_pair_), GetActiveSession(server2));
1361}
1362
[email protected]eed749f92013-12-23 18:57:381363TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
jri7046038f2015-10-22 00:29:261364 Initialize();
rch6faa4d42016-01-05 20:48:431365 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1366 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1367 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261368
rcha00569732016-08-27 11:09:361369 MockQuicData socket_data1;
1370 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431371 socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171372 socket_data1.AddSocketDataToFactory(socket_factory_.get());
rcha00569732016-08-27 11:09:361373 MockQuicData socket_data2;
1374 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431375 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171376 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]eed749f92013-12-23 18:57:381377
rch6faa4d42016-01-05 20:48:431378 HostPortPair server2(kServer2HostName, kDefaultServerPort);
Renjiea0cb4a2c2018-09-26 23:37:301379 host_resolver_->set_synchronous_mode(true);
1380 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1381 "192.168.0.1", "");
1382 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:381383
zhongyi98d6a9262017-05-19 02:47:451384 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331385 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
1386 DEFAULT_PRIORITY, SocketTag(),
1387 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:031388 &net_error_details_,
1389 failed_on_default_network_callback_,
1390 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241391 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]eed749f92013-12-23 18:57:381392 EXPECT_TRUE(stream.get());
1393
1394 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451395 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031396 EXPECT_EQ(OK,
1397 request2.Request(
1398 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1399 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1400 failed_on_default_network_callback_, callback.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241401 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]eed749f92013-12-23 18:57:381402 EXPECT_TRUE(stream2.get());
1403
bnc912a04b2016-04-20 14:19:501404 factory_->OnSessionGoingAway(GetActiveSession(host_port_pair_));
1405 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1406 EXPECT_FALSE(HasActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:381407
1408 TestCompletionCallback callback3;
zhongyi98d6a9262017-05-19 02:47:451409 QuicStreamRequest request3(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031410 EXPECT_EQ(OK,
1411 request3.Request(
1412 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1413 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1414 failed_on_default_network_callback_, callback3.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241415 std::unique_ptr<HttpStream> stream3 = CreateStream(&request3);
[email protected]eed749f92013-12-23 18:57:381416 EXPECT_TRUE(stream3.get());
1417
bnc912a04b2016-04-20 14:19:501418 EXPECT_TRUE(HasActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:381419
rch37de576c2015-05-17 20:28:171420 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1421 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1422 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1423 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:381424}
1425
[email protected]5db452202014-08-19 05:22:151426TEST_P(QuicStreamFactoryTest, HttpsPooling) {
jri7046038f2015-10-22 00:29:261427 Initialize();
rch6faa4d42016-01-05 20:48:431428
rcha00569732016-08-27 11:09:361429 MockQuicData socket_data;
1430 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431431 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171432 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]eed749f92013-12-23 18:57:381433
rch6faa4d42016-01-05 20:48:431434 HostPortPair server1(kDefaultServerHostName, 443);
1435 HostPortPair server2(kServer2HostName, 443);
[email protected]eed749f92013-12-23 18:57:381436
bncf8bf0722015-05-19 20:04:131437 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011438 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:381439
Renjiea0cb4a2c2018-09-26 23:37:301440 host_resolver_->set_synchronous_mode(true);
1441 host_resolver_->rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1442 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:381443
zhongyi98d6a9262017-05-19 02:47:451444 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031445 EXPECT_EQ(OK,
1446 request.Request(
1447 server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1448 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1449 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241450 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]eed749f92013-12-23 18:57:381451 EXPECT_TRUE(stream.get());
1452
1453 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451454 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031455 EXPECT_EQ(OK,
1456 request2.Request(
1457 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1458 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1459 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241460 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]eed749f92013-12-23 18:57:381461 EXPECT_TRUE(stream2.get());
1462
bnc912a04b2016-04-20 14:19:501463 EXPECT_EQ(GetActiveSession(server1), GetActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:381464
rch37de576c2015-05-17 20:28:171465 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1466 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:381467}
1468
[email protected]5db452202014-08-19 05:22:151469TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
jri7046038f2015-10-22 00:29:261470 Initialize();
rcha00569732016-08-27 11:09:361471 MockQuicData socket_data;
1472 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431473 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171474 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]5db452202014-08-19 05:22:151475
rch6faa4d42016-01-05 20:48:431476 HostPortPair server1(kDefaultServerHostName, 443);
1477 HostPortPair server2(kServer2HostName, 443);
Matt Mueller230996f12018-10-22 19:39:441478 transport_security_state_.EnableStaticPinsForTesting();
1479 ScopedTransportSecurityStateSource scoped_security_state_source;
[email protected]5db452202014-08-19 05:22:151480
Matt Mueller230996f12018-10-22 19:39:441481 HashValue primary_pin(HASH_VALUE_SHA256);
1482 EXPECT_TRUE(primary_pin.FromString(
1483 "sha256/Nn8jk5By4Vkq6BeOVZ7R7AC6XUUBZsWmUbJR1f1Y5FY="));
bncf8bf0722015-05-19 20:04:131484 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
Matt Mueller230996f12018-10-22 19:39:441485 verify_details.cert_verify_result.public_key_hashes.push_back(primary_pin);
bnc20daf9a2015-05-15 17:11:011486 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]5db452202014-08-19 05:22:151487
Renjiea0cb4a2c2018-09-26 23:37:301488 host_resolver_->set_synchronous_mode(true);
1489 host_resolver_->rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1490 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]5db452202014-08-19 05:22:151491
zhongyi98d6a9262017-05-19 02:47:451492 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031493 EXPECT_EQ(OK,
1494 request.Request(
1495 server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1496 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1497 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241498 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]5db452202014-08-19 05:22:151499 EXPECT_TRUE(stream.get());
1500
1501 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451502 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031503 EXPECT_EQ(OK,
1504 request2.Request(
1505 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1506 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1507 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241508 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]5db452202014-08-19 05:22:151509 EXPECT_TRUE(stream2.get());
1510
bnc912a04b2016-04-20 14:19:501511 EXPECT_EQ(GetActiveSession(server1), GetActiveSession(server2));
[email protected]5db452202014-08-19 05:22:151512
rch37de576c2015-05-17 20:28:171513 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1514 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:151515}
1516
1517TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
jri7046038f2015-10-22 00:29:261518 Initialize();
rcha00569732016-08-27 11:09:361519
1520 MockQuicData socket_data1;
1521 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431522 socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171523 socket_data1.AddSocketDataToFactory(socket_factory_.get());
rcha00569732016-08-27 11:09:361524 MockQuicData socket_data2;
1525 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431526 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171527 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]5db452202014-08-19 05:22:151528
rch6faa4d42016-01-05 20:48:431529 HostPortPair server1(kDefaultServerHostName, 443);
1530 HostPortPair server2(kServer2HostName, 443);
Matt Mueller230996f12018-10-22 19:39:441531 transport_security_state_.EnableStaticPinsForTesting();
1532 ScopedTransportSecurityStateSource scoped_security_state_source;
[email protected]5db452202014-08-19 05:22:151533
bncf8bf0722015-05-19 20:04:131534 ProofVerifyDetailsChromium verify_details1 = DefaultProofVerifyDetails();
Matt Mueller230996f12018-10-22 19:39:441535 uint8_t bad_pin = 3;
bnc20daf9a2015-05-15 17:11:011536 verify_details1.cert_verify_result.public_key_hashes.push_back(
1537 test::GetTestHashValue(bad_pin));
1538 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
1539
Matt Mueller230996f12018-10-22 19:39:441540 HashValue primary_pin(HASH_VALUE_SHA256);
1541 EXPECT_TRUE(primary_pin.FromString(
1542 "sha256/Nn8jk5By4Vkq6BeOVZ7R7AC6XUUBZsWmUbJR1f1Y5FY="));
bncf8bf0722015-05-19 20:04:131543 ProofVerifyDetailsChromium verify_details2 = DefaultProofVerifyDetails();
Matt Mueller230996f12018-10-22 19:39:441544 verify_details2.cert_verify_result.public_key_hashes.push_back(primary_pin);
bnc20daf9a2015-05-15 17:11:011545 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
[email protected]5db452202014-08-19 05:22:151546
Renjiea0cb4a2c2018-09-26 23:37:301547 host_resolver_->set_synchronous_mode(true);
1548 host_resolver_->rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1549 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]5db452202014-08-19 05:22:151550
zhongyi98d6a9262017-05-19 02:47:451551 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031552 EXPECT_EQ(OK,
1553 request.Request(
1554 server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1555 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1556 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241557 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]5db452202014-08-19 05:22:151558 EXPECT_TRUE(stream.get());
1559
1560 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451561 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031562 EXPECT_EQ(OK,
1563 request2.Request(
1564 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1565 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1566 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241567 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]5db452202014-08-19 05:22:151568 EXPECT_TRUE(stream2.get());
1569
bnc912a04b2016-04-20 14:19:501570 EXPECT_NE(GetActiveSession(server1), GetActiveSession(server2));
[email protected]5db452202014-08-19 05:22:151571
rch37de576c2015-05-17 20:28:171572 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1573 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1574 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1575 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:151576}
1577
[email protected]1e960032013-12-20 19:00:201578TEST_P(QuicStreamFactoryTest, Goaway) {
jri7046038f2015-10-22 00:29:261579 Initialize();
rch6faa4d42016-01-05 20:48:431580 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1581 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1582 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1583
rcha00569732016-08-27 11:09:361584 MockQuicData socket_data;
1585 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431586 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171587 socket_data.AddSocketDataToFactory(socket_factory_.get());
rcha00569732016-08-27 11:09:361588 MockQuicData socket_data2;
1589 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431590 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171591 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]4d283b32013-10-17 12:57:271592
zhongyi98d6a9262017-05-19 02:47:451593 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331594 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031595 request.Request(
1596 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1597 SocketTag(),
1598 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1599 failed_on_default_network_callback_, callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271600
robpercival214763f2016-07-01 23:27:011601 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241602 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]4d283b32013-10-17 12:57:271603 EXPECT_TRUE(stream.get());
1604
1605 // Mark the session as going away. Ensure that while it is still alive
1606 // that it is no longer active.
bnc912a04b2016-04-20 14:19:501607 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7046038f2015-10-22 00:29:261608 factory_->OnSessionGoingAway(session);
1609 EXPECT_EQ(true,
1610 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
bnc912a04b2016-04-20 14:19:501611 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]4d283b32013-10-17 12:57:271612
1613 // Create a new request for the same destination and verify that a
1614 // new session is created.
zhongyi98d6a9262017-05-19 02:47:451615 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331616 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031617 request2.Request(
1618 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1619 SocketTag(),
1620 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1621 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:011622 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241623 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]4d283b32013-10-17 12:57:271624 EXPECT_TRUE(stream2.get());
1625
bnc912a04b2016-04-20 14:19:501626 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1627 EXPECT_NE(session, GetActiveSession(host_port_pair_));
jri7046038f2015-10-22 00:29:261628 EXPECT_EQ(true,
1629 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
[email protected]4d283b32013-10-17 12:57:271630
1631 stream2.reset();
1632 stream.reset();
1633
rch37de576c2015-05-17 20:28:171634 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1635 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1636 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1637 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]4d283b32013-10-17 12:57:271638}
1639
[email protected]1e960032013-12-20 19:00:201640TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
jri7046038f2015-10-22 00:29:261641 Initialize();
rch6faa4d42016-01-05 20:48:431642 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1643 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1644
Fan Yang32c5a112018-12-10 20:06:331645 quic::QuicStreamId stream_id = GetNthClientInitiatedBidirectionalStreamId(0);
rcha00569732016-08-27 11:09:361646 MockQuicData socket_data;
Zhongyi Shi32f2fd02018-04-16 18:23:431647 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Frank Kastenholz878763bf2018-11-28 19:14:481648 if (version_ == quic::QUIC_VERSION_99) {
Fan Yang32c5a112018-12-10 20:06:331649 socket_data.AddWrite(
1650 SYNCHRONOUS,
1651 client_maker_.MakeStreamIdBlockedPacket(
1652 2, true, GetNthClientInitiatedBidirectionalStreamId(49)));
Frank Kastenholzc9b9bea2018-12-03 20:13:471653 socket_data.AddWrite(
1654 SYNCHRONOUS, client_maker_.MakeRstPacket(3, true, stream_id,
1655 quic::QUIC_STREAM_CANCELLED));
1656 socket_data.AddRead(
1657 ASYNC, server_maker_.MakeRstPacket(1, false, stream_id,
1658 quic::QUIC_STREAM_CANCELLED));
Fan Yang32c5a112018-12-10 20:06:331659 socket_data.AddRead(
1660 ASYNC, server_maker_.MakeMaxStreamIdPacket(
1661 4, true, GetNthClientInitiatedBidirectionalStreamId(50)));
Frank Kastenholzc9b9bea2018-12-03 20:13:471662 } else {
1663 socket_data.AddWrite(
1664 SYNCHRONOUS, client_maker_.MakeRstPacket(2, true, stream_id,
1665 quic::QUIC_STREAM_CANCELLED));
1666 socket_data.AddRead(
1667 ASYNC, server_maker_.MakeRstPacket(1, false, stream_id,
1668 quic::QUIC_STREAM_CANCELLED));
Frank Kastenholz878763bf2018-11-28 19:14:481669 }
rcha00569732016-08-27 11:09:361670 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:171671 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]0b2294d32013-08-02 00:46:361672
1673 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:391674 request_info.traffic_annotation =
1675 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
1676
xunjieli1d2b4272017-04-25 22:37:171677 std::vector<std::unique_ptr<HttpStream>> streams;
Ryan Hamilton9835e662018-08-02 05:36:271678 // The MockCryptoClientStream sets max_open_streams to be
Ryan Hamilton8d9ee76e2018-05-29 23:52:521679 // quic::kDefaultMaxStreamsPerConnection / 2.
1680 for (size_t i = 0; i < quic::kDefaultMaxStreamsPerConnection / 2; i++) {
zhongyi98d6a9262017-05-19 02:47:451681 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031682 int rv = request.Request(
1683 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1684 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1685 failed_on_default_network_callback_, callback_.callback());
[email protected]0b2294d32013-08-02 00:46:361686 if (i == 0) {
robpercival214763f2016-07-01 23:27:011687 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1688 EXPECT_THAT(callback_.WaitForResult(), IsOk());
[email protected]0b2294d32013-08-02 00:46:361689 } else {
robpercival214763f2016-07-01 23:27:011690 EXPECT_THAT(rv, IsOk());
[email protected]0b2294d32013-08-02 00:46:361691 }
Yixin Wang7891a39d2017-11-08 20:59:241692 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]0b2294d32013-08-02 00:46:361693 EXPECT_TRUE(stream);
Steven Valdezb4ff0412018-01-18 22:39:271694 EXPECT_EQ(OK,
1695 stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:391696 net_log_, CompletionOnceCallback()));
avib3635452016-10-21 18:33:531697 streams.push_back(std::move(stream));
[email protected]0b2294d32013-08-02 00:46:361698 }
1699
zhongyi98d6a9262017-05-19 02:47:451700 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331701 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
1702 DEFAULT_PRIORITY, SocketTag(),
1703 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:031704 &net_error_details_,
1705 failed_on_default_network_callback_,
1706 CompletionOnceCallback()));
Yixin Wang7891a39d2017-11-08 20:59:241707 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]0b2294d32013-08-02 00:46:361708 EXPECT_TRUE(stream);
rjshaded5ced072015-12-18 19:26:021709 EXPECT_EQ(ERR_IO_PENDING,
Steven Valdezb4ff0412018-01-18 22:39:271710 stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
1711 net_log_, callback_.callback()));
[email protected]0b2294d32013-08-02 00:46:361712
1713 // Close the first stream.
1714 streams.front()->Close(false);
ckrasicea295fe2015-10-31 05:03:271715 // Trigger exchange of RSTs that in turn allow progress for the last
1716 // stream.
Frank Kastenholz878763bf2018-11-28 19:14:481717 base::RunLoop().RunUntilIdle();
robpercival214763f2016-07-01 23:27:011718 EXPECT_THAT(callback_.WaitForResult(), IsOk());
[email protected]0b2294d32013-08-02 00:46:361719
rch37de576c2015-05-17 20:28:171720 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1721 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
ckrasicea295fe2015-10-31 05:03:271722
1723 // Force close of the connection to suppress the generation of RST
1724 // packets when streams are torn down, which wouldn't be relevant to
1725 // this test anyway.
bnc912a04b2016-04-20 14:19:501726 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:521727 session->connection()->CloseConnection(
1728 quic::QUIC_PUBLIC_RESET, "test",
1729 quic::ConnectionCloseBehavior::SILENT_CLOSE);
[email protected]0b2294d32013-08-02 00:46:361730}
1731
[email protected]1e960032013-12-20 19:00:201732TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
jri7046038f2015-10-22 00:29:261733 Initialize();
rcha00569732016-08-27 11:09:361734 MockQuicData socket_data;
Zhongyi Shi5f587cc2017-11-21 23:24:171735 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]e13201d82012-12-12 05:00:321736
Renjiea0cb4a2c2018-09-26 23:37:301737 host_resolver_->rules()->AddSimulatedFailure(kDefaultServerHostName);
[email protected]e13201d82012-12-12 05:00:321738
zhongyi98d6a9262017-05-19 02:47:451739 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331740 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031741 request.Request(
1742 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1743 SocketTag(),
1744 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1745 failed_on_default_network_callback_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321746
robpercival214763f2016-07-01 23:27:011747 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
[email protected]e13201d82012-12-12 05:00:321748
rch37de576c2015-05-17 20:28:171749 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1750 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321751}
1752
[email protected]1e960032013-12-20 19:00:201753TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
jri7046038f2015-10-22 00:29:261754 Initialize();
rcha00569732016-08-27 11:09:361755
1756 MockQuicData socket_data;
1757 socket_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
Zhongyi Shi5f587cc2017-11-21 23:24:171758 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]3c772402013-12-18 21:38:111759
zhongyi98d6a9262017-05-19 02:47:451760 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331761 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031762 request.Request(
1763 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1764 SocketTag(),
1765 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1766 failed_on_default_network_callback_, callback_.callback()));
[email protected]3c772402013-12-18 21:38:111767
robpercival214763f2016-07-01 23:27:011768 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_ADDRESS_IN_USE));
[email protected]3c772402013-12-18 21:38:111769
rch37de576c2015-05-17 20:28:171770 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1771 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:111772}
1773
[email protected]1e960032013-12-20 19:00:201774TEST_P(QuicStreamFactoryTest, CancelCreate) {
jri7046038f2015-10-22 00:29:261775 Initialize();
rcha00569732016-08-27 11:09:361776 MockQuicData socket_data;
1777 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431778 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171779 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]e13201d82012-12-12 05:00:321780 {
zhongyi98d6a9262017-05-19 02:47:451781 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331782 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031783 request.Request(
1784 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1785 SocketTag(),
1786 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1787 failed_on_default_network_callback_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321788 }
1789
mmenke651bae7f2015-12-18 21:26:451790 base::RunLoop().RunUntilIdle();
[email protected]e13201d82012-12-12 05:00:321791
zhongyi98d6a9262017-05-19 02:47:451792 QuicStreamRequest request2(factory_.get());
zhongyia00ca012017-07-06 23:36:391793 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:331794 DEFAULT_PRIORITY, SocketTag(),
1795 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:031796 &net_error_details_,
1797 failed_on_default_network_callback_,
1798 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241799 std::unique_ptr<HttpStream> stream = CreateStream(&request2);
rch68a80eb2017-04-25 05:24:241800
[email protected]e13201d82012-12-12 05:00:321801 EXPECT_TRUE(stream.get());
1802 stream.reset();
1803
rch37de576c2015-05-17 20:28:171804 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1805 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321806}
1807
[email protected]1e960032013-12-20 19:00:201808TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
jri7046038f2015-10-22 00:29:261809 Initialize();
rch6faa4d42016-01-05 20:48:431810 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1811 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1812 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1813
rcha00569732016-08-27 11:09:361814 MockQuicData socket_data;
1815 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431816 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Ryan Hamilton8d9ee76e2018-05-29 23:52:521817 socket_data.AddWrite(
1818 SYNCHRONOUS, ConstructClientRstPacket(2, quic::QUIC_RST_ACKNOWLEDGEMENT));
Renjieba55fae2018-09-20 03:05:161819 socket_data.AddWrite(SYNCHRONOUS,
1820 client_maker_.MakeConnectionClosePacket(
1821 3, true, quic::QUIC_INTERNAL_ERROR, "net error"));
Zhongyi Shi5f587cc2017-11-21 23:24:171822 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]56dfb902013-01-03 23:17:551823
rcha00569732016-08-27 11:09:361824 MockQuicData socket_data2;
1825 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431826 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171827 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]56dfb902013-01-03 23:17:551828
zhongyi98d6a9262017-05-19 02:47:451829 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331830 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031831 request.Request(
1832 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1833 SocketTag(),
1834 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1835 failed_on_default_network_callback_, callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551836
robpercival214763f2016-07-01 23:27:011837 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241838 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]0b2294d32013-08-02 00:46:361839 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:391840 request_info.traffic_annotation =
1841 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:271842 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:391843 net_log_, CompletionOnceCallback()));
[email protected]56dfb902013-01-03 23:17:551844
1845 // Close the session and verify that stream saw the error.
Ryan Hamilton8d9ee76e2018-05-29 23:52:521846 factory_->CloseAllSessions(ERR_INTERNET_DISCONNECTED,
1847 quic::QUIC_INTERNAL_ERROR);
[email protected]56dfb902013-01-03 23:17:551848 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1849 stream->ReadResponseHeaders(callback_.callback()));
1850
1851 // Now attempting to request a stream to the same origin should create
1852 // a new session.
1853
zhongyi98d6a9262017-05-19 02:47:451854 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331855 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031856 request2.Request(
1857 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1858 SocketTag(),
1859 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1860 failed_on_default_network_callback_, callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551861
robpercival214763f2016-07-01 23:27:011862 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241863 stream = CreateStream(&request2);
[email protected]56dfb902013-01-03 23:17:551864 stream.reset(); // Will reset stream 3.
1865
rch37de576c2015-05-17 20:28:171866 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1867 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1868 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1869 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]56dfb902013-01-03 23:17:551870}
1871
zhongyi363c91c2017-03-23 23:16:081872// Regression test for crbug.com/700617. Test a write error during the
1873// crypto handshake will not hang QuicStreamFactory::Job and should
1874// report QUIC_HANDSHAKE_FAILED to upper layers. Subsequent
1875// QuicStreamRequest should succeed without hanging.
1876TEST_P(QuicStreamFactoryTest,
1877 WriteErrorInCryptoConnectWithAsyncHostResolution) {
1878 Initialize();
1879 // Use unmocked crypto stream to do crypto connect.
1880 crypto_client_stream_factory_.set_handshake_mode(
Zhongyi Shi879659422018-08-02 17:58:251881 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
zhongyi363c91c2017-03-23 23:16:081882
1883 MockQuicData socket_data;
1884 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1885 // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect.
1886 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:171887 socket_data.AddSocketDataToFactory(socket_factory_.get());
zhongyi363c91c2017-03-23 23:16:081888
1889 // Create request, should fail after the write of the CHLO fails.
zhongyi98d6a9262017-05-19 02:47:451890 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331891 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031892 request.Request(
1893 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1894 SocketTag(),
1895 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1896 failed_on_default_network_callback_, callback_.callback()));
zhongyi363c91c2017-03-23 23:16:081897 EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, callback_.WaitForResult());
1898 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1899 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
1900
1901 // Verify new requests can be sent normally without hanging.
1902 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:271903 MockCryptoClientStream::COLD_START);
zhongyi363c91c2017-03-23 23:16:081904 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1905 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1906 MockQuicData socket_data2;
1907 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431908 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171909 socket_data2.AddSocketDataToFactory(socket_factory_.get());
zhongyi363c91c2017-03-23 23:16:081910
zhongyi98d6a9262017-05-19 02:47:451911 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331912 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031913 request2.Request(
1914 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1915 SocketTag(),
1916 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1917 failed_on_default_network_callback_, callback_.callback()));
zhongyi363c91c2017-03-23 23:16:081918 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1919 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
1920 // Run the message loop to complete host resolution.
1921 base::RunLoop().RunUntilIdle();
1922
1923 // Complete handshake. QuicStreamFactory::Job should complete and succeed.
1924 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521925 quic::QuicSession::HANDSHAKE_CONFIRMED);
zhongyi363c91c2017-03-23 23:16:081926 EXPECT_THAT(callback_.WaitForResult(), IsOk());
1927 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1928 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
1929
1930 // Create QuicHttpStream.
Yixin Wang7891a39d2017-11-08 20:59:241931 std::unique_ptr<HttpStream> stream = CreateStream(&request2);
zhongyi363c91c2017-03-23 23:16:081932 EXPECT_TRUE(stream.get());
1933 stream.reset();
1934 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1935 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1936 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1937 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1938}
1939
1940TEST_P(QuicStreamFactoryTest, WriteErrorInCryptoConnectWithSyncHostResolution) {
1941 Initialize();
1942 // Use unmocked crypto stream to do crypto connect.
1943 crypto_client_stream_factory_.set_handshake_mode(
Zhongyi Shi879659422018-08-02 17:58:251944 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
Renjiea0cb4a2c2018-09-26 23:37:301945 host_resolver_->set_synchronous_mode(true);
1946 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1947 "192.168.0.1", "");
zhongyi363c91c2017-03-23 23:16:081948
1949 MockQuicData socket_data;
1950 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1951 // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect.
1952 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:171953 socket_data.AddSocketDataToFactory(socket_factory_.get());
zhongyi363c91c2017-03-23 23:16:081954
1955 // Create request, should fail immediately.
zhongyi98d6a9262017-05-19 02:47:451956 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331957 EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED,
Zhongyi Shia6b68d112018-09-24 07:49:031958 request.Request(
1959 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1960 SocketTag(),
1961 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1962 failed_on_default_network_callback_, callback_.callback()));
zhongyi363c91c2017-03-23 23:16:081963 // Check no active session, or active jobs left for this server.
1964 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1965 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
1966
1967 // Verify new requests can be sent normally without hanging.
1968 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:271969 MockCryptoClientStream::COLD_START);
zhongyi363c91c2017-03-23 23:16:081970 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1971 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1972 MockQuicData socket_data2;
1973 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431974 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171975 socket_data2.AddSocketDataToFactory(socket_factory_.get());
zhongyi363c91c2017-03-23 23:16:081976
zhongyi98d6a9262017-05-19 02:47:451977 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331978 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031979 request2.Request(
1980 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1981 SocketTag(),
1982 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1983 failed_on_default_network_callback_, callback_.callback()));
zhongyi363c91c2017-03-23 23:16:081984 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1985 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
1986
1987 // Complete handshake.
1988 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521989 quic::QuicSession::HANDSHAKE_CONFIRMED);
zhongyi363c91c2017-03-23 23:16:081990 EXPECT_THAT(callback_.WaitForResult(), IsOk());
1991 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1992 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
1993
1994 // Create QuicHttpStream.
Yixin Wang7891a39d2017-11-08 20:59:241995 std::unique_ptr<HttpStream> stream = CreateStream(&request2);
zhongyi363c91c2017-03-23 23:16:081996 EXPECT_TRUE(stream.get());
1997 stream.reset();
1998 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1999 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2000 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2001 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2002}
2003
Zhongyi Shi63574b72018-06-01 20:22:252004TEST_P(QuicStreamFactoryTest, CloseSessionsOnIPAddressChanged) {
Zhongyi Shi967d2f12019-02-08 20:58:532005 test_params_.quic_close_sessions_on_ip_change = true;
jri7046038f2015-10-22 00:29:262006 Initialize();
rch6faa4d42016-01-05 20:48:432007 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2008 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2009 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri8c44d692015-10-23 23:53:412010
rcha00569732016-08-27 11:09:362011 MockQuicData socket_data;
2012 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432013 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Ryan Hamilton8d9ee76e2018-05-29 23:52:522014 socket_data.AddWrite(
2015 SYNCHRONOUS, ConstructClientRstPacket(2, quic::QUIC_RST_ACKNOWLEDGEMENT));
Renjieba55fae2018-09-20 03:05:162016 socket_data.AddWrite(
2017 SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
2018 3, true, quic::QUIC_IP_ADDRESS_CHANGED, "net error"));
Zhongyi Shi5f587cc2017-11-21 23:24:172019 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]f698a012013-05-06 20:18:592020
rcha00569732016-08-27 11:09:362021 MockQuicData socket_data2;
2022 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432023 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:172024 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]f698a012013-05-06 20:18:592025
zhongyi98d6a9262017-05-19 02:47:452026 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332027 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032028 request.Request(
2029 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2030 SocketTag(),
2031 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2032 failed_on_default_network_callback_, callback_.callback()));
[email protected]f698a012013-05-06 20:18:592033
robpercival214763f2016-07-01 23:27:012034 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242035 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]0b2294d32013-08-02 00:46:362036 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:392037 request_info.traffic_annotation =
2038 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272039 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392040 net_log_, CompletionOnceCallback()));
[email protected]f698a012013-05-06 20:18:592041
Zhongyi Shi63574b72018-06-01 20:22:252042 // Check an active session exisits for the destination.
2043 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2044 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2045 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2046
Ryan Hamilton8e32a2b2017-08-28 20:06:522047 IPAddress last_address;
2048 EXPECT_TRUE(http_server_properties_.GetSupportsQuic(&last_address));
Zhongyi Shi63574b72018-06-01 20:22:252049 // Change the IP address and verify that stream saw the error and the active
2050 // session is closed.
jri8c44d692015-10-23 23:53:412051 NotifyIPAddressChanged();
[email protected]f698a012013-05-06 20:18:592052 EXPECT_EQ(ERR_NETWORK_CHANGED,
2053 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262054 EXPECT_TRUE(factory_->require_confirmation());
Ryan Hamilton8e32a2b2017-08-28 20:06:522055 EXPECT_FALSE(http_server_properties_.GetSupportsQuic(&last_address));
Zhongyi Shi63574b72018-06-01 20:22:252056 // Check no active session exists for the destination.
2057 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]f698a012013-05-06 20:18:592058
2059 // Now attempting to request a stream to the same origin should create
2060 // a new session.
zhongyi98d6a9262017-05-19 02:47:452061 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332062 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032063 request2.Request(
2064 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2065 SocketTag(),
2066 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2067 failed_on_default_network_callback_, callback_.callback()));
[email protected]f698a012013-05-06 20:18:592068
robpercival214763f2016-07-01 23:27:012069 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242070 stream = CreateStream(&request2);
[email protected]f698a012013-05-06 20:18:592071
Zhongyi Shi63574b72018-06-01 20:22:252072 // Check a new active session exisits for the destination and the old session
2073 // is no longer live.
2074 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2075 QuicChromiumClientSession* session2 = GetActiveSession(host_port_pair_);
2076 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
2077
2078 stream.reset(); // Will reset stream 3.
rch37de576c2015-05-17 20:28:172079 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2080 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2081 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2082 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]f698a012013-05-06 20:18:592083}
2084
Zhongyi Shi63574b72018-06-01 20:22:252085// Test that if goaway_session_on_ip_change is set, old sessions will be marked
2086// as going away on IP address change instead of being closed. New requests will
2087// go to a new connection.
2088TEST_P(QuicStreamFactoryTest, GoAwaySessionsOnIPAddressChanged) {
Zhongyi Shi967d2f12019-02-08 20:58:532089 test_params_.quic_goaway_sessions_on_ip_change = true;
Zhongyi Shi63574b72018-06-01 20:22:252090 Initialize();
2091 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2092 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2093 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2094
2095 MockQuicData quic_data1;
2096 quic::QuicStreamOffset header_stream_offset = 0;
2097 quic_data1.AddWrite(SYNCHRONOUS,
2098 ConstructInitialSettingsPacket(1, &header_stream_offset));
Fan Yang32c5a112018-12-10 20:06:332099 quic_data1.AddWrite(
2100 SYNCHRONOUS, ConstructGetRequestPacket(
2101 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
2102 true, &header_stream_offset));
Zhongyi Shi63574b72018-06-01 20:22:252103 quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
2104 quic_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:332105 ASYNC,
2106 ConstructOkResponsePacket(
2107 1, GetNthClientInitiatedBidirectionalStreamId(0), false, true));
Zhongyi Shi63574b72018-06-01 20:22:252108 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
2109 quic_data1.AddSocketDataToFactory(socket_factory_.get());
2110
2111 MockQuicData quic_data2;
2112 quic::QuicStreamOffset header_stream_offset2 = 0;
2113 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
2114 quic_data2.AddWrite(
2115 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset2));
2116 quic_data2.AddSocketDataToFactory(socket_factory_.get());
2117
2118 // Create request and QuicHttpStream.
2119 QuicStreamRequest request(factory_.get());
2120 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032121 request.Request(
2122 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2123 SocketTag(),
2124 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2125 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi63574b72018-06-01 20:22:252126 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2127 std::unique_ptr<HttpStream> stream = CreateStream(&request);
2128 EXPECT_TRUE(stream.get());
2129
2130 // Cause QUIC stream to be created.
2131 HttpRequestInfo request_info;
2132 request_info.method = "GET";
2133 request_info.url = url_;
2134 request_info.traffic_annotation =
2135 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
2136 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
2137 net_log_, CompletionOnceCallback()));
2138
2139 // Ensure that session is alive and active.
2140 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2141 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2142 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2143
2144 // Send GET request on stream.
2145 HttpResponseInfo response;
2146 HttpRequestHeaders request_headers;
2147 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2148 callback_.callback()));
2149
2150 // Receive an IP address change notification.
2151 NotifyIPAddressChanged();
2152
2153 // The connection should still be alive, but marked as going away.
2154 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2155 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2156 EXPECT_EQ(1u, session->GetNumActiveStreams());
2157
2158 // Resume the data, response should be read from the original connection.
2159 quic_data1.Resume();
2160 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
2161 EXPECT_EQ(200, response.headers->response_code());
2162 EXPECT_EQ(0u, session->GetNumActiveStreams());
2163
2164 // Second request should be sent on a new connection.
2165 QuicStreamRequest request2(factory_.get());
2166 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032167 request2.Request(
2168 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2169 SocketTag(),
2170 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2171 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi63574b72018-06-01 20:22:252172 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2173 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
2174 EXPECT_TRUE(stream2.get());
2175
2176 // Check an active session exisits for the destination.
2177 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2178 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2179 QuicChromiumClientSession* session2 = GetActiveSession(host_port_pair_);
2180 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
2181
2182 stream.reset();
2183 stream2.reset();
2184 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
2185 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
2186 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
2187 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
2188}
2189
Jana Iyengarba355772017-09-21 22:03:212190TEST_P(QuicStreamFactoryTest, OnIPAddressChangedWithConnectionMigration) {
Zhongyi Shi1a054612018-06-14 04:59:082191 InitializeConnectionMigrationV2Test(
Jana Iyengarba355772017-09-21 22:03:212192 {kDefaultNetworkForTests, kNewNetworkForTests});
2193 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2194 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2195 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2196
2197 MockQuicData socket_data;
2198 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432199 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Ryan Hamilton8d9ee76e2018-05-29 23:52:522200 socket_data.AddWrite(
2201 SYNCHRONOUS, ConstructClientRstPacket(2, quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:172202 socket_data.AddSocketDataToFactory(socket_factory_.get());
Jana Iyengarba355772017-09-21 22:03:212203
2204 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332205 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032206 request.Request(
2207 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2208 SocketTag(),
2209 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2210 failed_on_default_network_callback_, callback_.callback()));
Jana Iyengarba355772017-09-21 22:03:212211
2212 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242213 std::unique_ptr<HttpStream> stream = CreateStream(&request);
Jana Iyengarba355772017-09-21 22:03:212214 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:392215 request_info.traffic_annotation =
2216 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272217 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392218 net_log_, CompletionOnceCallback()));
Jana Iyengarba355772017-09-21 22:03:212219
2220 IPAddress last_address;
2221 EXPECT_TRUE(http_server_properties_.GetSupportsQuic(&last_address));
2222
2223 // Change the IP address and verify that the connection is unaffected.
2224 NotifyIPAddressChanged();
2225 EXPECT_FALSE(factory_->require_confirmation());
2226 EXPECT_TRUE(http_server_properties_.GetSupportsQuic(&last_address));
2227
2228 // Attempting a new request to the same origin uses the same connection.
2229 QuicStreamRequest request2(factory_.get());
2230 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:332231 DEFAULT_PRIORITY, SocketTag(),
2232 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:032233 &net_error_details_,
2234 failed_on_default_network_callback_,
2235 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:242236 stream = CreateStream(&request2);
Jana Iyengarba355772017-09-21 22:03:212237
2238 stream.reset();
2239 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2240 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2241}
2242
Zhongyi Shia0644e32018-06-21 05:19:522243TEST_P(QuicStreamFactoryTest, MigrateOnNetworkMadeDefaultWithSynchronousWrite) {
2244 TestMigrationOnNetworkMadeDefault(SYNCHRONOUS);
jri9f303712016-09-13 01:10:222245}
2246
Zhongyi Shia0644e32018-06-21 05:19:522247TEST_P(QuicStreamFactoryTest, MigrateOnNetworkMadeDefaultWithAsyncWrite) {
2248 TestMigrationOnNetworkMadeDefault(ASYNC);
jri9f303712016-09-13 01:10:222249}
2250
Zhongyi Shia0644e32018-06-21 05:19:522251// Sets up a test which attempts connection migration successfully after probing
2252// when a new network is made as default and the old default is still available.
2253// |write_mode| specifies the write mode for the last write before
2254// OnNetworkMadeDefault is delivered to session.
2255void QuicStreamFactoryTestBase::TestMigrationOnNetworkMadeDefault(
2256 IoMode write_mode) {
2257 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jri7e636642016-01-14 06:57:082258 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2259 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2260 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2261
Zhongyi Shia0644e32018-06-21 05:19:522262 // Using a testing task runner so that we can control time.
2263 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2264 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
2265
2266 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2267 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
2268
2269 MockQuicData quic_data1;
Ryan Hamilton8d9ee76e2018-05-29 23:52:522270 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shia0644e32018-06-21 05:19:522271 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
2272 quic_data1.AddWrite(SYNCHRONOUS,
2273 ConstructInitialSettingsPacket(1, &header_stream_offset));
2274 quic_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:332275 write_mode, ConstructGetRequestPacket(
2276 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
2277 true, &header_stream_offset));
Zhongyi Shia0644e32018-06-21 05:19:522278 quic_data1.AddSocketDataToFactory(socket_factory_.get());
2279
2280 // Set up the second socket data provider that is used after migration.
2281 // The response to the earlier request is read on the new socket.
2282 MockQuicData quic_data2;
2283 // Connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:252284 quic_data2.AddWrite(SYNCHRONOUS,
2285 client_maker_.MakeConnectivityProbingPacket(3, true));
Zhongyi Shia0644e32018-06-21 05:19:522286 quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
2287 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:252288 quic_data2.AddRead(ASYNC,
2289 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shia0644e32018-06-21 05:19:522290 // Ping packet to send after migration is completed.
2291 quic_data2.AddWrite(ASYNC,
2292 client_maker_.MakeAckAndPingPacket(4, false, 1, 1, 1));
2293 quic_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:332294 ASYNC,
2295 ConstructOkResponsePacket(
2296 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shia0644e32018-06-21 05:19:522297 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:332298 quic_data2.AddWrite(
2299 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
2300 5, false, GetNthClientInitiatedBidirectionalStreamId(0),
2301 quic::QUIC_STREAM_CANCELLED, 2, 2, 1, true));
Zhongyi Shia0644e32018-06-21 05:19:522302 quic_data2.AddSocketDataToFactory(socket_factory_.get());
jri7e636642016-01-14 06:57:082303
2304 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452305 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332306 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032307 request.Request(
2308 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2309 SocketTag(),
2310 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2311 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012312 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242313 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri7e636642016-01-14 06:57:082314 EXPECT_TRUE(stream.get());
2315
2316 // Cause QUIC stream to be created.
2317 HttpRequestInfo request_info;
2318 request_info.method = "GET";
bnc3d9035b32016-06-30 18:18:482319 request_info.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:392320 request_info.traffic_annotation =
2321 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272322 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392323 net_log_, CompletionOnceCallback()));
jri7e636642016-01-14 06:57:082324
2325 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502326 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:082327 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2328 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2329
2330 // Send GET request on stream.
2331 HttpResponseInfo response;
2332 HttpRequestHeaders request_headers;
2333 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2334 callback_.callback()));
2335
Zhongyi Shia0644e32018-06-21 05:19:522336 // Deliver a signal that a alternate network is connected now, this should
2337 // cause the connection to start early migration on path degrading.
2338 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2339 ->SetConnectedNetworksList(
2340 {kDefaultNetworkForTests, kNewNetworkForTests});
2341 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2342 ->NotifyNetworkConnected(kNewNetworkForTests);
jri9f303712016-09-13 01:10:222343
Zhongyi Shia0644e32018-06-21 05:19:522344 // Cause the connection to report path degrading to the session.
2345 // Due to lack of alternate network, session will not mgirate connection.
2346 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
jri7e636642016-01-14 06:57:082347 scoped_mock_network_change_notifier_->mock_network_change_notifier()
jrie2661982016-08-20 08:24:342348 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
jri7e636642016-01-14 06:57:082349
Zhongyi Shia0644e32018-06-21 05:19:522350 // A task will be posted to migrate to the new default network.
2351 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
2352 EXPECT_EQ(base::TimeDelta(), task_runner->NextPendingTaskDelay());
2353
2354 // Execute the posted task to migrate back to the default network.
2355 task_runner->RunUntilIdle();
2356 // Another task to try send a new connectivity probe is posted. And a task to
2357 // retry migrate back to default network is scheduled.
2358 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
2359 // Next connectivity probe is scheduled to be sent in 2 *
2360 // kDefaultRTTMilliSecs.
2361 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
2362 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
2363 next_task_delay);
2364
2365 // The connection should still be alive, and not marked as going away.
jri7e636642016-01-14 06:57:082366 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia0644e32018-06-21 05:19:522367 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2368 EXPECT_EQ(1u, session->GetNumActiveStreams());
2369 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
2370
2371 // Resume quic data and a connectivity probe response will be read on the new
2372 // socket, declare probing as successful. And a new task to WriteToNewSocket
2373 // will be posted to complete migration.
2374 quic_data2.Resume();
2375
2376 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2377 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri7e636642016-01-14 06:57:082378 EXPECT_EQ(1u, session->GetNumActiveStreams());
2379
Zhongyi Shia0644e32018-06-21 05:19:522380 // There should be three pending tasks, the nearest one will complete
2381 // migration to the new network.
2382 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
2383 next_task_delay = task_runner->NextPendingTaskDelay();
2384 EXPECT_EQ(base::TimeDelta(), next_task_delay);
2385 task_runner->FastForwardBy(next_task_delay);
2386
2387 // Response headers are received over the new network.
2388 EXPECT_THAT(callback_.WaitForResult(), IsOk());
jri7e636642016-01-14 06:57:082389 EXPECT_EQ(200, response.headers->response_code());
2390
Zhongyi Shia0644e32018-06-21 05:19:522391 // Now there are two pending tasks, the nearest one was to send connectivity
2392 // probe and has been cancelled due to successful migration.
2393 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
2394 next_task_delay = task_runner->NextPendingTaskDelay();
2395 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
2396 next_task_delay);
2397 task_runner->FastForwardBy(next_task_delay);
jri7e636642016-01-14 06:57:082398
Zhongyi Shia0644e32018-06-21 05:19:522399 // There's one more task to mgirate back to the default network in 0.4s, which
2400 // is also cancelled due to the success migration on the previous trial.
2401 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
2402 next_task_delay = task_runner->NextPendingTaskDelay();
2403 base::TimeDelta expected_delay =
2404 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
2405 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
2406 EXPECT_EQ(expected_delay, next_task_delay);
2407 task_runner->FastForwardBy(next_task_delay);
2408 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
jri7e636642016-01-14 06:57:082409
Zhongyi Shia0644e32018-06-21 05:19:522410 // Verify that the session is still alive.
jri7e636642016-01-14 06:57:082411 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia0644e32018-06-21 05:19:522412 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri7e636642016-01-14 06:57:082413
Zhongyi Shia0644e32018-06-21 05:19:522414 stream.reset();
2415 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
2416 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
2417 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
2418 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
jri7e636642016-01-14 06:57:082419}
2420
Zhongyi Shib3bc982c2018-07-10 19:59:242421// Regression test for http://859674.
2422// This test veries that a writer will not attempt to write packets until being
2423// unblocked on both socket level and network level. In this test, a probing
2424// writer is used to send two connectivity probes to the peer: where the first
2425// one completes successfully, while a connectivity response is received before
2426// completes sending the second one. The connection migration attempt will
2427// proceed while the probing writer is blocked at the socket level, which will
2428// block the writer on the network level. Once connection migration completes
2429// successfully, the probing writer will be unblocked on the network level, it
2430// will not attempt to write new packets until the socket level is unblocked.
2431TEST_P(QuicStreamFactoryTest, MigratedToBlockedSocketAfterProbing) {
2432 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
2433 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2434 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2435 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2436
2437 // Using a testing task runner so that we can control time.
2438 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2439 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
2440
2441 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2442 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
2443
2444 MockQuicData quic_data1;
2445 quic::QuicStreamOffset header_stream_offset = 0;
2446 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
2447 quic_data1.AddWrite(SYNCHRONOUS,
2448 ConstructInitialSettingsPacket(1, &header_stream_offset));
Fan Yang32c5a112018-12-10 20:06:332449 quic_data1.AddWrite(
2450 SYNCHRONOUS, ConstructGetRequestPacket(
2451 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
2452 true, &header_stream_offset));
Zhongyi Shib3bc982c2018-07-10 19:59:242453 quic_data1.AddSocketDataToFactory(socket_factory_.get());
2454
2455 // Set up the second socket data provider that is used after migration.
2456 // The response to the earlier request is read on the new socket.
2457 MockQuicData quic_data2;
2458 // First connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:252459 quic_data2.AddWrite(SYNCHRONOUS,
2460 client_maker_.MakeConnectivityProbingPacket(3, true));
Zhongyi Shib3bc982c2018-07-10 19:59:242461 quic_data2.AddRead(ASYNC,
2462 ERR_IO_PENDING); // Pause so that we can control time.
2463 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:252464 quic_data2.AddRead(ASYNC,
2465 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shib3bc982c2018-07-10 19:59:242466 // Second connectivity probe which will complete asynchronously.
Zhongyi Shi879659422018-08-02 17:58:252467 quic_data2.AddWrite(ASYNC,
2468 client_maker_.MakeConnectivityProbingPacket(4, true));
Zhongyi Shib3bc982c2018-07-10 19:59:242469 quic_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:332470 ASYNC,
2471 ConstructOkResponsePacket(
2472 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shib3bc982c2018-07-10 19:59:242473 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
2474 quic_data2.AddWrite(ASYNC,
2475 client_maker_.MakeAckAndPingPacket(5, false, 1, 1, 1));
Fan Yang32c5a112018-12-10 20:06:332476 quic_data2.AddWrite(
2477 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
2478 6, false, GetNthClientInitiatedBidirectionalStreamId(0),
2479 quic::QUIC_STREAM_CANCELLED, 2, 2, 1, true));
Zhongyi Shib3bc982c2018-07-10 19:59:242480
2481 quic_data2.AddSocketDataToFactory(socket_factory_.get());
2482
2483 // Create request and QuicHttpStream.
2484 QuicStreamRequest request(factory_.get());
2485 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032486 request.Request(
2487 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2488 SocketTag(),
2489 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2490 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shib3bc982c2018-07-10 19:59:242491 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2492 std::unique_ptr<HttpStream> stream = CreateStream(&request);
2493 EXPECT_TRUE(stream.get());
2494
2495 // Cause QUIC stream to be created.
2496 HttpRequestInfo request_info;
2497 request_info.method = "GET";
2498 request_info.url = url_;
2499 request_info.traffic_annotation =
2500 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
2501 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
2502 net_log_, CompletionOnceCallback()));
2503
2504 // Ensure that session is alive and active.
2505 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2506 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2507 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2508
2509 // Send GET request on stream.
2510 HttpResponseInfo response;
2511 HttpRequestHeaders request_headers;
2512 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2513 callback_.callback()));
2514
2515 // Deliver a signal that a alternate network is connected now, this should
2516 // cause the connection to start early migration on path degrading.
2517 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2518 ->SetConnectedNetworksList(
2519 {kDefaultNetworkForTests, kNewNetworkForTests});
2520 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2521 ->NotifyNetworkConnected(kNewNetworkForTests);
2522
2523 // Cause the connection to report path degrading to the session.
2524 // Due to lack of alternate network, session will not mgirate connection.
2525 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
2526 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2527 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
2528
2529 // A task will be posted to migrate to the new default network.
2530 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
2531 EXPECT_EQ(base::TimeDelta(), task_runner->NextPendingTaskDelay());
2532
2533 // Execute the posted task to migrate back to the default network.
2534 task_runner->RunUntilIdle();
2535 // Another task to resend a new connectivity probe is posted. And a task to
2536 // retry migrate back to default network is scheduled.
2537 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
2538 // Next connectivity probe is scheduled to be sent in 2 *
2539 // kDefaultRTTMilliSecs.
2540 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
2541 base::TimeDelta expected_delay =
2542 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
2543 EXPECT_EQ(expected_delay, next_task_delay);
2544
2545 // Fast forward to send the second connectivity probe. The write will be
2546 // asynchronous and complete after the read completes.
2547 task_runner->FastForwardBy(next_task_delay);
2548
2549 // Resume quic data and a connectivity probe response will be read on the new
2550 // socket, declare probing as successful.
2551 quic_data2.Resume();
2552
2553 // The connection should still be alive, and not marked as going away.
2554 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2555 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2556 EXPECT_EQ(1u, session->GetNumActiveStreams());
2557 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
2558
2559 // There should be three pending tasks, the nearest one will complete
2560 // migration to the new network. Second task will retry migrate back to
2561 // default but cancelled, and the third task will retry send connectivity
2562 // probe but also cancelled.
2563 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
2564 EXPECT_EQ(base::TimeDelta(), task_runner->NextPendingTaskDelay());
2565 task_runner->RunUntilIdle();
2566
2567 // Response headers are received over the new network.
2568 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2569 EXPECT_EQ(200, response.headers->response_code());
2570
2571 // Run the message loop to complete the asynchronous write of ack and ping.
2572 base::RunLoop().RunUntilIdle();
2573
2574 // Now there are two pending tasks, the nearest one was to retry migrate back
2575 // to default network and has been cancelled due to successful migration.
2576 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
2577 expected_delay =
2578 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
2579 expected_delay;
2580 next_task_delay = task_runner->NextPendingTaskDelay();
2581 EXPECT_EQ(expected_delay, next_task_delay);
2582 task_runner->FastForwardBy(next_task_delay);
2583
2584 // There's one more task to retry sending connectivity probe in 0.4s and has
2585 // also been cancelled due to the successful probing.
2586 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
2587 next_task_delay = task_runner->NextPendingTaskDelay();
2588 expected_delay =
2589 base::TimeDelta::FromMilliseconds(3 * 2 * kDefaultRTTMilliSecs) -
2590 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs);
2591 EXPECT_EQ(expected_delay, next_task_delay);
2592 task_runner->FastForwardBy(next_task_delay);
2593 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
2594
2595 // Verify that the session is still alive.
2596 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2597 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2598
2599 stream.reset();
2600 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
2601 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
2602 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
2603 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
2604}
2605
Zhongyi Shib1b1fa42018-06-19 23:13:472606// This test verifies that session times out connection migration attempt
2607// with signals delivered in the following order (no alternate network is
2608// available):
2609// - default network disconnected is delivered: session attempts connection
2610// migration but found not alternate network. Session waits for a new network
2611// comes up in the next kWaitTimeForNewNetworkSecs seonds.
2612// - no new network is connected, migration times out. Session is closed.
2613TEST_P(QuicStreamFactoryTest, MigrationTimeoutWithNoNewNetwork) {
2614 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jri7e636642016-01-14 06:57:082615 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2616 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2617
Zhongyi Shib1b1fa42018-06-19 23:13:472618 // Using a testing task runner so that we can control time.
2619 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2620 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
jri5b785512016-09-13 04:29:112621
rcha00569732016-08-27 11:09:362622 MockQuicData socket_data;
2623 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432624 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:172625 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri7e636642016-01-14 06:57:082626
2627 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452628 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332629 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032630 request.Request(
2631 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2632 SocketTag(),
2633 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2634 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012635 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242636 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri7e636642016-01-14 06:57:082637 EXPECT_TRUE(stream.get());
2638
2639 // Cause QUIC stream to be created.
2640 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:392641 request_info.traffic_annotation =
2642 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272643 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392644 net_log_, CompletionOnceCallback()));
jri7e636642016-01-14 06:57:082645
2646 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502647 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:082648 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2649 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2650
2651 // Trigger connection migration. Since there are no networks
jri5b785512016-09-13 04:29:112652 // to migrate to, this should cause the session to wait for a new network.
jri7e636642016-01-14 06:57:082653 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2654 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2655
jri5b785512016-09-13 04:29:112656 // The migration will not fail until the migration alarm timeout.
2657 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shib1b1fa42018-06-19 23:13:472658 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:112659 EXPECT_EQ(1u, session->GetNumActiveStreams());
2660 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
2661 EXPECT_EQ(true, session->connection()->writer()->IsWriteBlocked());
2662
Zhongyi Shib1b1fa42018-06-19 23:13:472663 // Migration will be timed out after kWaitTimeForNewNetwokSecs.
2664 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
2665 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
2666 EXPECT_EQ(base::TimeDelta::FromSeconds(kWaitTimeForNewNetworkSecs),
2667 next_task_delay);
2668 task_runner->FastForwardBy(next_task_delay);
jri5b785512016-09-13 04:29:112669
2670 // The connection should now be closed. A request for response
2671 // headers should fail.
jri7e636642016-01-14 06:57:082672 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2673 EXPECT_FALSE(HasActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:112674 EXPECT_EQ(ERR_NETWORK_CHANGED, callback_.WaitForResult());
jri7e636642016-01-14 06:57:082675
2676 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2677 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2678}
2679
Zhongyi Shi21e99532018-07-17 22:23:072680// This test verifies that connectivity probes will be sent even if there is
2681// a non-migratable stream. However, when connection migrates to the
2682// successfully probed path, any non-migratable stream will be reset. And if
2683// the connection becomes idle then, close the connection.
jri9f303712016-09-13 01:10:222684TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultNonMigratableStream) {
Zhongyi Shi5f587cc2017-11-21 23:24:172685 InitializeConnectionMigrationV2Test(
2686 {kDefaultNetworkForTests, kNewNetworkForTests});
2687 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2688 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2689
2690 MockQuicData socket_data;
2691 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432692 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Renjieba55fae2018-09-20 03:05:162693 socket_data.AddWrite(
2694 SYNCHRONOUS,
2695 client_maker_.MakeRstAckAndConnectionClosePacket(
Fan Yang32c5a112018-12-10 20:06:332696 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
Fan Yang7c68f632018-11-06 03:05:382697 quic::QUIC_STREAM_CANCELLED,
Renjieba55fae2018-09-20 03:05:162698 quic::QuicTime::Delta::FromMilliseconds(0), 1, 1, 1,
2699 quic::QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS, "net error"));
2700
Zhongyi Shi5f587cc2017-11-21 23:24:172701 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri231c2972016-03-08 19:50:112702
Zhongyi Shi21e99532018-07-17 22:23:072703 // Set up the second socket data provider that is used for probing.
2704 MockQuicData quic_data1;
2705 // Connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:252706 quic_data1.AddWrite(SYNCHRONOUS,
2707 client_maker_.MakeConnectivityProbingPacket(2, true));
Zhongyi Shi21e99532018-07-17 22:23:072708 quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
2709 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:252710 quic_data1.AddRead(ASYNC,
2711 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shi21e99532018-07-17 22:23:072712 quic_data1.AddSocketDataToFactory(socket_factory_.get());
2713
jri231c2972016-03-08 19:50:112714 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452715 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332716 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032717 request.Request(
2718 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2719 SocketTag(),
2720 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2721 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012722 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242723 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri231c2972016-03-08 19:50:112724 EXPECT_TRUE(stream.get());
2725
2726 // Cause QUIC stream to be created, but marked as non-migratable.
2727 HttpRequestInfo request_info;
Zhongyi Shibb28b1f2018-07-18 02:41:262728 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
Ramin Halavati683bcaa92018-02-14 08:42:392729 request_info.traffic_annotation =
2730 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272731 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392732 net_log_, CompletionOnceCallback()));
jri231c2972016-03-08 19:50:112733
2734 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502735 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:112736 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2737 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2738
Zhongyi Shi21e99532018-07-17 22:23:072739 // Trigger connection migration. Session will start to probe the alternative
2740 // network. Although there is a non-migratable stream, session will still be
2741 // active until probing is declared as successful.
jri231c2972016-03-08 19:50:112742 scoped_mock_network_change_notifier_->mock_network_change_notifier()
jrie2661982016-08-20 08:24:342743 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
jri231c2972016-03-08 19:50:112744
2745 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shi21e99532018-07-17 22:23:072746 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri231c2972016-03-08 19:50:112747 EXPECT_EQ(1u, session->GetNumActiveStreams());
2748
Zhongyi Shi21e99532018-07-17 22:23:072749 // Resume data to read a connectivity probing response, which will cause
2750 // non-migtable streams to be closed. As session becomes idle, connection will
2751 // be closed.
2752 quic_data1.Resume();
2753 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2754 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2755 EXPECT_EQ(0u, session->GetNumActiveStreams());
jri231c2972016-03-08 19:50:112756
Zhongyi Shi21e99532018-07-17 22:23:072757 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
2758 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
jri231c2972016-03-08 19:50:112759 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2760 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2761}
2762
jri9f303712016-09-13 01:10:222763TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultConnectionMigrationDisabled) {
Zhongyi Shi5f587cc2017-11-21 23:24:172764 InitializeConnectionMigrationV2Test(
2765 {kDefaultNetworkForTests, kNewNetworkForTests});
2766 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2767 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2768
2769 MockQuicData socket_data;
2770 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432771 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
2772 socket_data.AddWrite(
Fan Yang32c5a112018-12-10 20:06:332773 SYNCHRONOUS, client_maker_.MakeRstPacket(
2774 2, true, GetNthClientInitiatedBidirectionalStreamId(0),
2775 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:172776 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9c541572016-03-29 17:51:482777
2778 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452779 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332780 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032781 request.Request(
2782 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2783 SocketTag(),
2784 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2785 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012786 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242787 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9c541572016-03-29 17:51:482788 EXPECT_TRUE(stream.get());
2789
2790 // Cause QUIC stream to be created.
2791 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:392792 request_info.traffic_annotation =
2793 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272794 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392795 net_log_, CompletionOnceCallback()));
jri9c541572016-03-29 17:51:482796
2797 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502798 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:482799 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2800 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2801
2802 // Set session config to have connection migration disabled.
Ryan Hamilton8d9ee76e2018-05-29 23:52:522803 quic::test::QuicConfigPeer::SetReceivedDisableConnectionMigration(
2804 session->config());
jri9c541572016-03-29 17:51:482805 EXPECT_TRUE(session->config()->DisableConnectionMigration());
2806
2807 // Trigger connection migration. Since there is a non-migratable stream,
2808 // this should cause session to continue but be marked as going away.
2809 scoped_mock_network_change_notifier_->mock_network_change_notifier()
jrie2661982016-08-20 08:24:342810 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
jri9c541572016-03-29 17:51:482811
2812 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2813 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2814 EXPECT_EQ(1u, session->GetNumActiveStreams());
2815
2816 stream.reset();
2817
2818 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2819 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2820}
2821
jri9f303712016-09-13 01:10:222822TEST_P(QuicStreamFactoryTest, OnNetworkDisconnectedNonMigratableStream) {
Zhongyi Shi5f587cc2017-11-21 23:24:172823 InitializeConnectionMigrationV2Test(
2824 {kDefaultNetworkForTests, kNewNetworkForTests});
2825 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2826 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2827
2828 MockQuicData socket_data;
2829 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432830 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
2831 socket_data.AddWrite(
Fan Yang32c5a112018-12-10 20:06:332832 SYNCHRONOUS, client_maker_.MakeRstPacket(
2833 2, true, GetNthClientInitiatedBidirectionalStreamId(0),
2834 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:172835 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri231c2972016-03-08 19:50:112836
2837 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452838 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332839 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032840 request.Request(
2841 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2842 SocketTag(),
2843 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2844 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012845 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242846 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri231c2972016-03-08 19:50:112847 EXPECT_TRUE(stream.get());
2848
2849 // Cause QUIC stream to be created, but marked as non-migratable.
2850 HttpRequestInfo request_info;
Zhongyi Shibb28b1f2018-07-18 02:41:262851 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
Ramin Halavati683bcaa92018-02-14 08:42:392852 request_info.traffic_annotation =
2853 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272854 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392855 net_log_, CompletionOnceCallback()));
jri231c2972016-03-08 19:50:112856
2857 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502858 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:112859 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2860 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2861
2862 // Trigger connection migration. Since there is a non-migratable stream,
2863 // this should cause a RST_STREAM frame to be emitted with
Zhongyi Shi0439ecc72018-07-11 04:41:262864 // quic::QUIC_STREAM_CANCELLED error code, and the session will be closed.
jri231c2972016-03-08 19:50:112865 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2866 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2867
2868 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2869 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2870
2871 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2872 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2873}
2874
jri9c541572016-03-29 17:51:482875TEST_P(QuicStreamFactoryTest,
jri9f303712016-09-13 01:10:222876 OnNetworkDisconnectedConnectionMigrationDisabled) {
Zhongyi Shi5f587cc2017-11-21 23:24:172877 InitializeConnectionMigrationV2Test(
2878 {kDefaultNetworkForTests, kNewNetworkForTests});
2879 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2880 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2881
2882 MockQuicData socket_data;
2883 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432884 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
2885 socket_data.AddWrite(
Fan Yang32c5a112018-12-10 20:06:332886 SYNCHRONOUS, client_maker_.MakeRstPacket(
2887 2, true, GetNthClientInitiatedBidirectionalStreamId(0),
2888 quic::QUIC_RST_ACKNOWLEDGEMENT));
Zhongyi Shi5f587cc2017-11-21 23:24:172889 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9c541572016-03-29 17:51:482890
2891 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452892 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332893 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032894 request.Request(
2895 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2896 SocketTag(),
2897 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2898 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012899 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242900 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9c541572016-03-29 17:51:482901 EXPECT_TRUE(stream.get());
2902
2903 // Cause QUIC stream to be created.
2904 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:392905 request_info.traffic_annotation =
2906 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272907 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392908 net_log_, CompletionOnceCallback()));
jri9c541572016-03-29 17:51:482909
2910 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502911 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:482912 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2913 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2914
2915 // Set session config to have connection migration disabled.
Ryan Hamilton8d9ee76e2018-05-29 23:52:522916 quic::test::QuicConfigPeer::SetReceivedDisableConnectionMigration(
2917 session->config());
jri9c541572016-03-29 17:51:482918 EXPECT_TRUE(session->config()->DisableConnectionMigration());
2919
2920 // Trigger connection migration. Since there is a non-migratable stream,
2921 // this should cause a RST_STREAM frame to be emitted with
Ryan Hamilton8d9ee76e2018-05-29 23:52:522922 // quic::QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed.
jri9c541572016-03-29 17:51:482923 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2924 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2925
2926 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2927 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2928
2929 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2930 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2931}
2932
jri9f303712016-09-13 01:10:222933TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultNoOpenStreams) {
Zhongyi Shi5f587cc2017-11-21 23:24:172934 InitializeConnectionMigrationV2Test(
2935 {kDefaultNetworkForTests, kNewNetworkForTests});
2936 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2937 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2938
2939 MockQuicData socket_data;
2940 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432941 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Renjieba55fae2018-09-20 03:05:162942 socket_data.AddWrite(
2943 SYNCHRONOUS,
2944 client_maker_.MakeConnectionClosePacket(
2945 2, true, quic::QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS,
2946 "net error"));
Zhongyi Shi5f587cc2017-11-21 23:24:172947 socket_data.AddSocketDataToFactory(socket_factory_.get());
2948
2949 // Create request and QuicHttpStream.
2950 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332951 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032952 request.Request(
2953 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2954 SocketTag(),
2955 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2956 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi5f587cc2017-11-21 23:24:172957 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2958 std::unique_ptr<HttpStream> stream = CreateStream(&request);
2959 EXPECT_TRUE(stream.get());
2960
2961 // Ensure that session is alive and active.
2962 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2963 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2964 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2965
2966 // Trigger connection migration.
2967 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2968 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
2969
2970 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2971 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2972
2973 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2974 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2975}
2976
jri9f303712016-09-13 01:10:222977TEST_P(QuicStreamFactoryTest, OnNetworkDisconnectedNoOpenStreams) {
Zhongyi Shi5f587cc2017-11-21 23:24:172978 InitializeConnectionMigrationV2Test(
2979 {kDefaultNetworkForTests, kNewNetworkForTests});
2980 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2981 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2982
2983 MockQuicData socket_data;
2984 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432985 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:172986 socket_data.AddSocketDataToFactory(socket_factory_.get());
2987
2988 // Create request and QuicHttpStream.
2989 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332990 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032991 request.Request(
2992 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2993 SocketTag(),
2994 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2995 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi5f587cc2017-11-21 23:24:172996 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2997 std::unique_ptr<HttpStream> stream = CreateStream(&request);
2998 EXPECT_TRUE(stream.get());
2999
3000 // Ensure that session is alive and active.
3001 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3002 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3003 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3004
3005 // Trigger connection migration. Since there are no active streams,
3006 // the session will be closed.
3007 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3008 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
3009
3010 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3011 EXPECT_FALSE(HasActiveSession(host_port_pair_));
3012
3013 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3014 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3015}
3016
Zhongyi Shi9f316b262018-06-18 22:01:163017// This test verifies session migrates to the alternate network immediately when
3018// default network disconnects with a synchronous write before migration.
3019TEST_P(QuicStreamFactoryTest, MigrateOnDefaultNetworkDisconnectedSync) {
3020 TestMigrationOnNetworkDisconnected(/*async_write_before*/ false);
3021}
3022
3023// This test verifies session migrates to the alternate network immediately when
3024// default network disconnects with an asynchronously write before migration.
3025TEST_P(QuicStreamFactoryTest, MigrateOnDefaultNetworkDisconnectedAsync) {
3026 TestMigrationOnNetworkDisconnected(/*async_write_before*/ true);
3027}
3028
3029void QuicStreamFactoryTestBase::TestMigrationOnNetworkDisconnected(
3030 bool async_write_before) {
3031 InitializeConnectionMigrationV2Test(
3032 {kDefaultNetworkForTests, kNewNetworkForTests});
3033 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3034 ->NotifyNetworkMadeDefault(kDefaultNetworkForTests);
3035 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3036 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3037 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3038
3039 // Use the test task runner.
3040 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3041
3042 int packet_number = 1;
3043 MockQuicData socket_data;
3044 quic::QuicStreamOffset header_stream_offset = 0;
3045 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3046 socket_data.AddWrite(
3047 SYNCHRONOUS,
3048 ConstructInitialSettingsPacket(packet_number++, &header_stream_offset));
3049 socket_data.AddWrite(
Fan Yang32c5a112018-12-10 20:06:333050 SYNCHRONOUS,
3051 ConstructGetRequestPacket(packet_number++,
3052 GetNthClientInitiatedBidirectionalStreamId(0),
3053 true, true, &header_stream_offset));
Zhongyi Shi9f316b262018-06-18 22:01:163054 if (async_write_before) {
3055 socket_data.AddWrite(ASYNC, OK);
3056 packet_number++;
3057 }
3058 socket_data.AddSocketDataToFactory(socket_factory_.get());
3059
3060 // Create request and QuicHttpStream.
3061 QuicStreamRequest request(factory_.get());
3062 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033063 request.Request(
3064 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3065 SocketTag(),
3066 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3067 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi9f316b262018-06-18 22:01:163068 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3069 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3070 EXPECT_TRUE(stream.get());
3071
3072 // Cause QUIC stream to be created.
3073 HttpRequestInfo request_info;
3074 request_info.method = "GET";
3075 request_info.url = url_;
3076 request_info.traffic_annotation =
3077 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3078 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3079 net_log_, CompletionOnceCallback()));
3080
3081 // Ensure that session is alive and active.
3082 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3083 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3084 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3085
3086 // Send GET request on stream.
3087 HttpResponseInfo response;
3088 HttpRequestHeaders request_headers;
3089 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3090 callback_.callback()));
3091
Zhongyi Shi22fd5f52018-06-20 17:39:093092 if (async_write_before)
Zhongyi Shi9f316b262018-06-18 22:01:163093 session->SendPing();
Zhongyi Shi9f316b262018-06-18 22:01:163094
3095 // Set up second socket data provider that is used after migration.
3096 // The response to the earlier request is read on this new socket.
3097 MockQuicData socket_data1;
3098 socket_data1.AddWrite(
3099 SYNCHRONOUS,
3100 client_maker_.MakePingPacket(packet_number++, /*include_version=*/true));
3101 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:333102 ASYNC,
3103 ConstructOkResponsePacket(
3104 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shi9f316b262018-06-18 22:01:163105 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3106 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:333107 SYNCHRONOUS,
3108 client_maker_.MakeAckAndRstPacket(
3109 packet_number++, false, GetNthClientInitiatedBidirectionalStreamId(0),
3110 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi9f316b262018-06-18 22:01:163111 socket_data1.AddSocketDataToFactory(socket_factory_.get());
3112
3113 // Trigger connection migration.
3114 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3115 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
3116
3117 // The connection should still be alive, not marked as going away.
3118 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3119 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3120 EXPECT_EQ(1u, session->GetNumActiveStreams());
3121 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
3122
3123 // Ensure that the session is still alive.
3124 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3125 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3126 EXPECT_EQ(1u, session->GetNumActiveStreams());
3127
3128 // Run the message loop so that data queued in the new socket is read by the
3129 // packet reader.
3130 runner_->RunNextTask();
3131
3132 // Response headers are received over the new network.
3133 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3134 EXPECT_EQ(200, response.headers->response_code());
3135
3136 // Check that the session is still alive.
3137 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3138 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3139
3140 // There should be posted tasks not executed, which is to migrate back to
3141 // default network.
3142 EXPECT_FALSE(runner_->GetPostedTasks().empty());
3143
3144 // Receive signal to mark new network as default.
3145 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3146 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
3147
3148 stream.reset();
3149 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3150 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3151 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
3152 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
3153}
3154
Zhongyi Shi5f587cc2017-11-21 23:24:173155// This test receives NCN signals in the following order:
3156// - default network disconnected
3157// - after a pause, new network is connected.
3158// - new network is made default.
3159TEST_P(QuicStreamFactoryTest, NewNetworkConnectedAfterNoNetwork) {
3160 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
3161 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3162 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3163 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3164
3165 // Use the test task runner.
3166 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3167
3168 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:523169 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shi5f587cc2017-11-21 23:24:173170 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3171 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:433172 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
Fan Yang32c5a112018-12-10 20:06:333173 socket_data.AddWrite(
3174 SYNCHRONOUS, ConstructGetRequestPacket(
3175 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
3176 true, &header_stream_offset));
Zhongyi Shi5f587cc2017-11-21 23:24:173177 socket_data.AddSocketDataToFactory(socket_factory_.get());
3178
3179 // Create request and QuicHttpStream.
3180 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:333181 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033182 request.Request(
3183 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3184 SocketTag(),
3185 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3186 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi5f587cc2017-11-21 23:24:173187 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3188 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3189 EXPECT_TRUE(stream.get());
3190
3191 // Cause QUIC stream to be created.
3192 HttpRequestInfo request_info;
3193 request_info.method = "GET";
3194 request_info.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:393195 request_info.traffic_annotation =
3196 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:273197 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:393198 net_log_, CompletionOnceCallback()));
Zhongyi Shi5f587cc2017-11-21 23:24:173199
3200 // Ensure that session is alive and active.
3201 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3202 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3203 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3204
3205 // Send GET request on stream.
3206 HttpResponseInfo response;
3207 HttpRequestHeaders request_headers;
3208 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3209 callback_.callback()));
3210
3211 // Trigger connection migration. Since there are no networks
3212 // to migrate to, this should cause the session to wait for a new network.
3213 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3214 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
3215
3216 // The connection should still be alive, not marked as going away.
3217 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3218 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3219 EXPECT_EQ(1u, session->GetNumActiveStreams());
3220 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
3221
3222 // Set up second socket data provider that is used after migration.
3223 // The response to the earlier request is read on this new socket.
3224 MockQuicData socket_data1;
3225 socket_data1.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:433226 SYNCHRONOUS, client_maker_.MakePingPacket(3, /*include_version=*/true));
3227 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:333228 ASYNC,
3229 ConstructOkResponsePacket(
3230 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shi5f587cc2017-11-21 23:24:173231 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:333232 socket_data1.AddWrite(
3233 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
3234 4, false, GetNthClientInitiatedBidirectionalStreamId(0),
3235 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:173236 socket_data1.AddSocketDataToFactory(socket_factory_.get());
3237
3238 // Add a new network and notify the stream factory of a new connected network.
3239 // This causes a PING packet to be sent over the new network.
3240 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3241 ->SetConnectedNetworksList({kNewNetworkForTests});
3242 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3243 ->NotifyNetworkConnected(kNewNetworkForTests);
3244
3245 // Ensure that the session is still alive.
3246 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3247 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3248 EXPECT_EQ(1u, session->GetNumActiveStreams());
3249
3250 // Run the message loop so that data queued in the new socket is read by the
3251 // packet reader.
3252 runner_->RunNextTask();
3253
3254 // Response headers are received over the new network.
3255 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3256 EXPECT_EQ(200, response.headers->response_code());
3257
3258 // Check that the session is still alive.
3259 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3260 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3261
3262 // There should posted tasks not executed, which is to migrate back to default
3263 // network.
3264 EXPECT_FALSE(runner_->GetPostedTasks().empty());
3265
3266 // Receive signal to mark new network as default.
3267 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3268 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
3269
3270 stream.reset();
3271 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3272 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3273 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
3274 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
3275}
3276
Zhongyi Shid3d5f502018-08-10 00:22:223277// Regression test for http://crbug.com/872011.
3278// This test verifies that migrate to the probing socket will not trigger
3279// new packets being read synchronously and generate ACK frame while
3280// processing the initial connectivity probe response, which may cause a
3281// connection being closed with INTERNAL_ERROR as pending ACK frame is not
3282// allowed when processing a new packet.
Zhongyi Shi6a7323b2018-12-07 01:26:323283TEST_P(QuicStreamFactoryTest, MigrateToProbingSocket) {
Zhongyi Shid3d5f502018-08-10 00:22:223284 InitializeConnectionMigrationV2Test(
3285 {kDefaultNetworkForTests, kNewNetworkForTests});
3286 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3287 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3288 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3289
3290 // Using a testing task runner so that we can control time.
3291 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
3292 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
3293
3294 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3295 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
3296
3297 int packet_number = 1;
3298 MockQuicData quic_data1;
3299 quic::QuicStreamOffset header_stream_offset = 0;
3300 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
3301 quic_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket(
3302 packet_number++, &header_stream_offset));
3303 quic_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:333304 SYNCHRONOUS,
3305 ConstructGetRequestPacket(packet_number++,
3306 GetNthClientInitiatedBidirectionalStreamId(0),
3307 true, true, &header_stream_offset));
Zhongyi Shid3d5f502018-08-10 00:22:223308 quic_data1.AddSocketDataToFactory(socket_factory_.get());
3309
3310 // Set up the second socket data provider that is used for probing on the
3311 // alternate network.
3312 MockQuicData quic_data2;
3313 // Connectivity probe to be sent on the new path.
3314 quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
3315 packet_number++, true));
3316 quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
3317 // First connectivity probe to receive from the server, which will complete
3318 // connection migraiton on path degrading.
3319 quic_data2.AddRead(ASYNC,
3320 server_maker_.MakeConnectivityProbingPacket(1, false));
3321 // Read multiple connectivity probes synchronously.
3322 quic_data2.AddRead(SYNCHRONOUS,
3323 server_maker_.MakeConnectivityProbingPacket(2, false));
3324 quic_data2.AddRead(SYNCHRONOUS,
3325 server_maker_.MakeConnectivityProbingPacket(3, false));
3326 quic_data2.AddRead(SYNCHRONOUS,
3327 server_maker_.MakeConnectivityProbingPacket(4, false));
3328 quic_data2.AddWrite(
3329 ASYNC, client_maker_.MakeAckPacket(packet_number++, 1, 4, 1, 1, true));
3330 quic_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:333331 ASYNC,
3332 ConstructOkResponsePacket(
3333 5, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shid3d5f502018-08-10 00:22:223334 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3335 quic_data2.AddWrite(
Fan Yang32c5a112018-12-10 20:06:333336 SYNCHRONOUS,
3337 client_maker_.MakeAckAndRstPacket(
3338 packet_number++, false, GetNthClientInitiatedBidirectionalStreamId(0),
3339 quic::QUIC_STREAM_CANCELLED, 5, 1, 1, true));
Zhongyi Shid3d5f502018-08-10 00:22:223340 quic_data2.AddSocketDataToFactory(socket_factory_.get());
3341
3342 // Create request and QuicHttpStream.
3343 QuicStreamRequest request(factory_.get());
3344 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033345 request.Request(
3346 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3347 SocketTag(),
3348 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3349 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shid3d5f502018-08-10 00:22:223350 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3351 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3352 EXPECT_TRUE(stream.get());
3353
3354 // Cause QUIC stream to be created.
3355 HttpRequestInfo request_info;
3356 request_info.method = "GET";
3357 request_info.url = url_;
3358 request_info.traffic_annotation =
3359 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3360 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3361 net_log_, CompletionOnceCallback()));
3362
3363 // Ensure that session is alive and active.
3364 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3365 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3366 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3367
3368 // Send GET request on stream.
3369 HttpResponseInfo response;
3370 HttpRequestHeaders request_headers;
3371 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3372 callback_.callback()));
3373
3374 // Cause the connection to report path degrading to the session.
3375 // Session will start to probe the alternate network.
3376 session->connection()->OnPathDegradingTimeout();
3377
3378 // Next connectivity probe is scheduled to be sent in 2 *
3379 // kDefaultRTTMilliSecs.
3380 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3381 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
3382 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3383 next_task_delay);
3384
3385 // The connection should still be alive, and not marked as going away.
3386 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3387 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3388 EXPECT_EQ(1u, session->GetNumActiveStreams());
3389 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
3390
3391 // Resume quic data and a connectivity probe response will be read on the new
3392 // socket.
3393 quic_data2.Resume();
3394
3395 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3396 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3397 EXPECT_EQ(1u, session->GetNumActiveStreams());
3398
3399 // There should be three pending tasks, the nearest one will complete
3400 // migration to the new network.
3401 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
3402 next_task_delay = task_runner->NextPendingTaskDelay();
3403 EXPECT_EQ(base::TimeDelta(), next_task_delay);
3404 task_runner->FastForwardBy(next_task_delay);
3405
3406 // Response headers are received over the new network.
3407 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3408 EXPECT_EQ(200, response.headers->response_code());
3409
3410 // Now there are two pending tasks, the nearest one was to send connectivity
3411 // probe and has been cancelled due to successful migration.
3412 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
3413 next_task_delay = task_runner->NextPendingTaskDelay();
3414 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3415 next_task_delay);
3416 task_runner->FastForwardBy(next_task_delay);
3417
3418 // There's one more task to mgirate back to the default network in 0.4s.
3419 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3420 next_task_delay = task_runner->NextPendingTaskDelay();
3421 base::TimeDelta expected_delay =
3422 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
3423 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
3424 EXPECT_EQ(expected_delay, next_task_delay);
3425
3426 // Deliver a signal that the alternate network now becomes default to session,
3427 // this will cancel mgirate back to default network timer.
3428 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3429 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
3430
3431 task_runner->FastForwardBy(next_task_delay);
3432 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
3433
3434 // Verify that the session is still alive.
3435 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3436 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3437
3438 stream.reset();
3439 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
3440 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
3441 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
3442 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
3443}
3444
Zhongyi Shic4823bd2018-04-27 00:49:193445// This test verifies that the connection migrates to the alternate network
Zhongyi Shi22fd5f52018-06-20 17:39:093446// early when path degrading is detected with an ASYNCHRONOUS write before
3447// migration.
3448TEST_P(QuicStreamFactoryTest, MigrateEarlyOnPathDegradingAysnc) {
3449 TestMigrationOnPathDegrading(/*async_write_before_migration*/ true);
3450}
3451
3452// This test verifies that the connection migrates to the alternate network
3453// early when path degrading is detected with a SYNCHRONOUS write before
3454// migration.
3455TEST_P(QuicStreamFactoryTest, MigrateEarlyOnPathDegradingSync) {
3456 TestMigrationOnPathDegrading(/*async_write_before_migration*/ false);
3457}
3458
3459void QuicStreamFactoryTestBase::TestMigrationOnPathDegrading(
3460 bool async_write_before) {
Zhongyi Shic4823bd2018-04-27 00:49:193461 InitializeConnectionMigrationV2Test(
3462 {kDefaultNetworkForTests, kNewNetworkForTests});
3463 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3464 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3465 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3466
3467 // Using a testing task runner so that we can control time.
3468 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
3469 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
3470
3471 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3472 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
3473
Zhongyi Shi22fd5f52018-06-20 17:39:093474 int packet_number = 1;
Zhongyi Shic4823bd2018-04-27 00:49:193475 MockQuicData quic_data1;
Ryan Hamilton8d9ee76e2018-05-29 23:52:523476 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shic4823bd2018-04-27 00:49:193477 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
Zhongyi Shi22fd5f52018-06-20 17:39:093478 quic_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket(
3479 packet_number++, &header_stream_offset));
3480 quic_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:333481 SYNCHRONOUS,
3482 ConstructGetRequestPacket(packet_number++,
3483 GetNthClientInitiatedBidirectionalStreamId(0),
3484 true, true, &header_stream_offset));
Zhongyi Shi22fd5f52018-06-20 17:39:093485 if (async_write_before) {
3486 quic_data1.AddWrite(ASYNC, OK);
3487 packet_number++;
3488 }
Zhongyi Shic4823bd2018-04-27 00:49:193489 quic_data1.AddSocketDataToFactory(socket_factory_.get());
3490
3491 // Set up the second socket data provider that is used after migration.
3492 // The response to the earlier request is read on the new socket.
3493 MockQuicData quic_data2;
3494 // Connectivity probe to be sent on the new path.
Zhongyi Shi22fd5f52018-06-20 17:39:093495 quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
Zhongyi Shi879659422018-08-02 17:58:253496 packet_number++, true));
Zhongyi Shic4823bd2018-04-27 00:49:193497 quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
3498 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:253499 quic_data2.AddRead(ASYNC,
3500 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shic4823bd2018-04-27 00:49:193501 // Ping packet to send after migration is completed.
Zhongyi Shi22fd5f52018-06-20 17:39:093502 quic_data2.AddWrite(ASYNC, client_maker_.MakeAckAndPingPacket(
3503 packet_number++, false, 1, 1, 1));
Ryan Hamiltona3ee93a72018-08-01 22:03:083504 quic_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:333505 ASYNC,
3506 ConstructOkResponsePacket(
3507 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shic4823bd2018-04-27 00:49:193508 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi22fd5f52018-06-20 17:39:093509 quic_data2.AddWrite(
Fan Yang32c5a112018-12-10 20:06:333510 SYNCHRONOUS,
3511 client_maker_.MakeAckAndRstPacket(
3512 packet_number++, false, GetNthClientInitiatedBidirectionalStreamId(0),
3513 quic::QUIC_STREAM_CANCELLED, 2, 2, 1, true));
Zhongyi Shic4823bd2018-04-27 00:49:193514 quic_data2.AddSocketDataToFactory(socket_factory_.get());
3515
3516 // Create request and QuicHttpStream.
3517 QuicStreamRequest request(factory_.get());
3518 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033519 request.Request(
3520 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3521 SocketTag(),
3522 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3523 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shic4823bd2018-04-27 00:49:193524 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3525 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3526 EXPECT_TRUE(stream.get());
3527
3528 // Cause QUIC stream to be created.
3529 HttpRequestInfo request_info;
3530 request_info.method = "GET";
3531 request_info.url = url_;
3532 request_info.traffic_annotation =
3533 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3534 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3535 net_log_, CompletionOnceCallback()));
3536
3537 // Ensure that session is alive and active.
3538 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3539 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3540 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3541
3542 // Send GET request on stream.
3543 HttpResponseInfo response;
3544 HttpRequestHeaders request_headers;
3545 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3546 callback_.callback()));
3547
Zhongyi Shi22fd5f52018-06-20 17:39:093548 if (async_write_before)
3549 session->SendPing();
3550
Zhongyi Shiaba4a832018-04-30 20:29:083551 // Cause the connection to report path degrading to the session.
3552 // Session will start to probe the alternate network.
3553 session->connection()->OnPathDegradingTimeout();
3554
3555 // Next connectivity probe is scheduled to be sent in 2 *
3556 // kDefaultRTTMilliSecs.
3557 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3558 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
3559 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3560 next_task_delay);
3561
3562 // The connection should still be alive, and not marked as going away.
3563 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3564 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3565 EXPECT_EQ(1u, session->GetNumActiveStreams());
3566 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
3567
3568 // Resume quic data and a connectivity probe response will be read on the new
3569 // socket.
3570 quic_data2.Resume();
3571
3572 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3573 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3574 EXPECT_EQ(1u, session->GetNumActiveStreams());
3575
3576 // There should be three pending tasks, the nearest one will complete
3577 // migration to the new network.
3578 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
3579 next_task_delay = task_runner->NextPendingTaskDelay();
3580 EXPECT_EQ(base::TimeDelta(), next_task_delay);
3581 task_runner->FastForwardBy(next_task_delay);
3582
3583 // Response headers are received over the new network.
3584 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3585 EXPECT_EQ(200, response.headers->response_code());
3586
3587 // Now there are two pending tasks, the nearest one was to send connectivity
3588 // probe and has been cancelled due to successful migration.
3589 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
3590 next_task_delay = task_runner->NextPendingTaskDelay();
3591 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3592 next_task_delay);
3593 task_runner->FastForwardBy(next_task_delay);
3594
3595 // There's one more task to mgirate back to the default network in 0.4s.
3596 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3597 next_task_delay = task_runner->NextPendingTaskDelay();
3598 base::TimeDelta expected_delay =
3599 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
3600 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
3601 EXPECT_EQ(expected_delay, next_task_delay);
3602
3603 // Deliver a signal that the alternate network now becomes default to session,
3604 // this will cancel mgirate back to default network timer.
3605 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3606 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
3607
3608 task_runner->FastForwardBy(next_task_delay);
3609 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
3610
3611 // Verify that the session is still alive.
3612 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3613 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3614
3615 stream.reset();
3616 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
3617 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
3618 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
3619 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
3620}
3621
Renjiea5722ccf2018-08-10 00:18:493622// This test verifies that the session marks itself GOAWAY on path degrading
3623// and it does not receive any new request
3624TEST_P(QuicStreamFactoryTest, GoawayOnPathDegrading) {
Zhongyi Shi967d2f12019-02-08 20:58:533625 test_params_.quic_go_away_on_path_degrading = true;
Renjiea5722ccf2018-08-10 00:18:493626 Initialize();
3627 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3628 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3629 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3630
3631 MockQuicData quic_data1;
3632 quic::QuicStreamOffset header_stream_offset = 0;
3633 quic_data1.AddWrite(SYNCHRONOUS,
3634 ConstructInitialSettingsPacket(1, &header_stream_offset));
Fan Yang32c5a112018-12-10 20:06:333635 quic_data1.AddWrite(
3636 SYNCHRONOUS, ConstructGetRequestPacket(
3637 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
3638 true, &header_stream_offset));
Renjiea5722ccf2018-08-10 00:18:493639 quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
3640 quic_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:333641 ASYNC,
3642 ConstructOkResponsePacket(
3643 1, GetNthClientInitiatedBidirectionalStreamId(0), false, true));
Renjiea5722ccf2018-08-10 00:18:493644 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
3645 quic_data1.AddSocketDataToFactory(socket_factory_.get());
3646
3647 MockQuicData quic_data2;
3648 quic::QuicStreamOffset header_stream_offset2 = 0;
3649 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
3650 quic_data2.AddWrite(
3651 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset2));
3652 quic_data2.AddSocketDataToFactory(socket_factory_.get());
3653
3654 // Creat request and QuicHttpStream.
3655 QuicStreamRequest request(factory_.get());
3656 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033657 request.Request(
3658 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3659 SocketTag(),
3660 /*cerf_verify_flags=*/0, url_, net_log_, &net_error_details_,
3661 failed_on_default_network_callback_, callback_.callback()));
Renjiea5722ccf2018-08-10 00:18:493662 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3663 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3664 EXPECT_TRUE(stream.get());
3665
3666 // Cause QUIC stream to be created.
3667 HttpRequestInfo request_info;
3668 request_info.method = "GET";
3669 request_info.url = url_;
3670 request_info.traffic_annotation =
3671 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3672 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3673 net_log_, CompletionOnceCallback()));
3674
3675 // Ensure that session is alive and active.
3676 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3677 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3678 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3679
3680 // Send GET request on stream.
3681 HttpResponseInfo response;
3682 HttpRequestHeaders request_headers;
3683 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3684 callback_.callback()));
3685
3686 // Trigger the connection to report path degrading to the session.
3687 // Session will mark itself GOAWAY.
3688 session->connection()->OnPathDegradingTimeout();
3689
3690 // The connection should still be alive, but marked as going away.
3691 EXPECT_FALSE(HasActiveSession(host_port_pair_));
3692 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3693 EXPECT_EQ(1u, session->GetNumActiveStreams());
3694
3695 // Second request should be sent on a new connection.
3696 QuicStreamRequest request2(factory_.get());
3697 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033698 request2.Request(
3699 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3700 SocketTag(),
3701 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3702 failed_on_default_network_callback_, callback_.callback()));
Renjiea5722ccf2018-08-10 00:18:493703 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3704 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
3705 EXPECT_TRUE(stream2.get());
3706
3707 // Resume the data, verify old request can read response on the old session
3708 // successfully.
3709 quic_data1.Resume();
3710 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
3711 EXPECT_EQ(200, response.headers->response_code());
3712 EXPECT_EQ(0U, session->GetNumActiveStreams());
3713
3714 // Check an active session exists for the destination.
3715 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3716 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3717 QuicChromiumClientSession* session2 = GetActiveSession(host_port_pair_);
3718 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
3719 EXPECT_NE(session, session2);
3720
3721 stream.reset();
3722 stream2.reset();
3723 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
3724 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
3725 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
3726 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
3727}
3728
Zhongyi Shibb770d92018-06-16 02:07:003729// This test verifies that the connection will not migrate to a bad socket
3730// when path degrading is detected.
3731TEST_P(QuicStreamFactoryTest, DoNotMigrateToBadSocketOnPathDegrading) {
3732 InitializeConnectionMigrationV2Test(
3733 {kDefaultNetworkForTests, kNewNetworkForTests});
3734 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3735 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3736 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3737
3738 // Using a testing task runner so that we can control time.
3739 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
3740 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
3741
3742 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3743 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
3744
3745 MockQuicData quic_data;
3746 quic::QuicStreamOffset header_stream_offset = 0;
3747 quic_data.AddWrite(SYNCHRONOUS,
3748 ConstructInitialSettingsPacket(1, &header_stream_offset));
Zhongyi Shibb770d92018-06-16 02:07:003749 quic_data.AddWrite(SYNCHRONOUS,
Fan Yang32c5a112018-12-10 20:06:333750 ConstructGetRequestPacket(
3751 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
3752 true, &header_stream_offset));
3753 quic_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
3754 quic_data.AddRead(ASYNC, ConstructOkResponsePacket(
3755 1, GetNthClientInitiatedBidirectionalStreamId(0),
3756 false, false));
3757 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3758 quic_data.AddWrite(
3759 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
3760 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
3761 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shibb770d92018-06-16 02:07:003762 quic_data.AddSocketDataToFactory(socket_factory_.get());
3763
3764 // Set up second socket that will immediately return disconnected.
3765 // The stream factory will abort probe the alternate network.
3766 MockConnect bad_connect = MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED);
3767 SequencedSocketData socket_data(bad_connect, base::span<MockRead>(),
3768 base::span<MockWrite>());
3769 socket_factory_->AddSocketDataProvider(&socket_data);
3770
3771 // Create request and QuicHttpStream.
3772 QuicStreamRequest request(factory_.get());
3773 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033774 request.Request(
3775 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3776 SocketTag(),
3777 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3778 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shibb770d92018-06-16 02:07:003779 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3780 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3781 EXPECT_TRUE(stream.get());
3782
3783 // Cause QUIC stream to be created.
3784 HttpRequestInfo request_info;
3785 request_info.method = "GET";
3786 request_info.url = url_;
3787 request_info.traffic_annotation =
3788 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3789 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3790 net_log_, CompletionOnceCallback()));
3791
3792 // Ensure that session is alive and active.
3793 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3794 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3795 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3796
3797 // Send GET request on stream.
3798 HttpResponseInfo response;
3799 HttpRequestHeaders request_headers;
3800 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3801 callback_.callback()));
3802
3803 // Cause the connection to report path degrading to the session.
3804 // Session will start to probe the alternate network.
3805 session->connection()->OnPathDegradingTimeout();
3806
3807 // The connection should still be alive, and not marked as going away.
3808 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3809 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3810 EXPECT_EQ(1u, session->GetNumActiveStreams());
3811 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
3812
3813 // Resume the data, and response header is received over the original network.
3814 quic_data.Resume();
3815 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3816 EXPECT_EQ(200, response.headers->response_code());
3817
3818 // Verify there is no pending task as probing alternate network is halted.
3819 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
3820
3821 // Verify that the session is still alive.
3822 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3823 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3824
3825 stream.reset();
3826 EXPECT_TRUE(quic_data.AllReadDataConsumed());
3827 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
3828}
3829
Zhongyi Shif5cc30392018-05-30 18:25:153830// Regression test for http://crbug.com/847569.
3831// This test verifies that the connection migrates to the alternate network
3832// early when there is no active stream but a draining stream.
Zhongyi Shib3bc982c2018-07-10 19:59:243833// The first packet being written after migration is a synchrnous write, which
3834// will cause a PING packet being sent.
3835TEST_P(QuicStreamFactoryTest, MigrateSessionWithDrainingStreamSync) {
3836 TestMigrateSessionWithDrainingStream(SYNCHRONOUS);
3837}
3838
3839// Regression test for http://crbug.com/847569.
3840// This test verifies that the connection migrates to the alternate network
3841// early when there is no active stream but a draining stream.
3842// The first packet being written after migration is an asynchronous write, no
3843// PING packet will be sent.
3844TEST_P(QuicStreamFactoryTest, MigrateSessionWithDrainingStreamAsync) {
3845 TestMigrateSessionWithDrainingStream(ASYNC);
3846}
3847
3848void QuicStreamFactoryTestBase::TestMigrateSessionWithDrainingStream(
3849 IoMode write_mode_for_queued_packet) {
Zhongyi Shif5cc30392018-05-30 18:25:153850 InitializeConnectionMigrationV2Test(
3851 {kDefaultNetworkForTests, kNewNetworkForTests});
3852 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3853 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3854 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3855
3856 // Using a testing task runner so that we can control time.
3857 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
3858 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
3859
3860 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3861 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
3862
Zhongyi Shib3bc982c2018-07-10 19:59:243863 int packet_number = 1;
Zhongyi Shif5cc30392018-05-30 18:25:153864 MockQuicData quic_data1;
3865 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shib3bc982c2018-07-10 19:59:243866 quic_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket(
3867 packet_number++, &header_stream_offset));
3868 quic_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:333869 SYNCHRONOUS,
3870 ConstructGetRequestPacket(packet_number++,
3871 GetNthClientInitiatedBidirectionalStreamId(0),
3872 true, true, &header_stream_offset));
Zhongyi Shif5cc30392018-05-30 18:25:153873 // Read an out of order packet with FIN to drain the stream.
3874 quic_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:333875 ASYNC, ConstructOkResponsePacket(
3876 2, GetNthClientInitiatedBidirectionalStreamId(0), false,
3877 true)); // keep sending version.
Zhongyi Shib3bc982c2018-07-10 19:59:243878 quic_data1.AddWrite(SYNCHRONOUS, client_maker_.MakeAckPacket(
3879 packet_number++, 2, 2, 2, 1, true));
Zhongyi Shif5cc30392018-05-30 18:25:153880 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3881 quic_data1.AddSocketDataToFactory(socket_factory_.get());
3882
3883 // Set up the second socket data provider that is used after migration.
3884 MockQuicData quic_data2;
3885 // Connectivity probe to be sent on the new path.
Zhongyi Shib3bc982c2018-07-10 19:59:243886 quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
Zhongyi Shi879659422018-08-02 17:58:253887 packet_number++, false));
Zhongyi Shif5cc30392018-05-30 18:25:153888 quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
3889 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:253890 quic_data2.AddRead(ASYNC,
3891 server_maker_.MakeConnectivityProbingPacket(3, false));
Zhongyi Shif5cc30392018-05-30 18:25:153892 // Ping packet to send after migration is completed.
Zhongyi Shib3bc982c2018-07-10 19:59:243893 quic_data2.AddWrite(
3894 write_mode_for_queued_packet,
3895 client_maker_.MakeAckPacket(packet_number++, 2, 3, 3, 1, true));
3896 if (write_mode_for_queued_packet == SYNCHRONOUS) {
3897 quic_data2.AddWrite(ASYNC,
3898 client_maker_.MakePingPacket(packet_number++, false));
3899 }
Zhongyi Shif5cc30392018-05-30 18:25:153900 quic_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:333901 ASYNC,
3902 ConstructOkResponsePacket(
3903 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shib3bc982c2018-07-10 19:59:243904 quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeAckPacket(
3905 packet_number++, 1, 3, 1, 1, true));
Zhongyi Shif5cc30392018-05-30 18:25:153906 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3907 quic_data2.AddSocketDataToFactory(socket_factory_.get());
3908
3909 // Create request and QuicHttpStream.
3910 QuicStreamRequest request(factory_.get());
3911 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033912 request.Request(
3913 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3914 SocketTag(),
3915 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3916 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shif5cc30392018-05-30 18:25:153917 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3918 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3919 EXPECT_TRUE(stream.get());
3920
3921 // Cause QUIC stream to be created.
3922 HttpRequestInfo request_info;
3923 request_info.method = "GET";
3924 request_info.url = url_;
3925 request_info.traffic_annotation =
3926 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3927 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3928 net_log_, CompletionOnceCallback()));
3929
3930 // Ensure that session is alive and active.
3931 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3932 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3933 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3934
3935 // Send GET request on stream.
3936 HttpResponseInfo response;
3937 HttpRequestHeaders request_headers;
3938 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3939 callback_.callback()));
3940
3941 // Run the message loop to receive the out of order packet which contains a
3942 // FIN and drains the stream.
3943 base::RunLoop().RunUntilIdle();
3944 EXPECT_EQ(0u, session->GetNumActiveStreams());
3945
3946 // Cause the connection to report path degrading to the session.
3947 // Session should still start to probe the alternate network.
3948 session->connection()->OnPathDegradingTimeout();
3949 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3950
3951 // Next connectivity probe is scheduled to be sent in 2 *
3952 // kDefaultRTTMilliSecs.
3953 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3954 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
3955 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3956 next_task_delay);
3957
3958 // The connection should still be alive, and not marked as going away.
3959 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shif5cc30392018-05-30 18:25:153960
3961 // Resume quic data and a connectivity probe response will be read on the new
3962 // socket.
3963 quic_data2.Resume();
3964
3965 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3966 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi0439ecc72018-07-11 04:41:263967 EXPECT_EQ(0u, session->GetNumActiveStreams());
3968 EXPECT_EQ(1u, session->GetNumDrainingStreams());
Zhongyi Shif5cc30392018-05-30 18:25:153969
3970 // There should be three pending tasks, the nearest one will complete
3971 // migration to the new network.
3972 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
3973 next_task_delay = task_runner->NextPendingTaskDelay();
3974 EXPECT_EQ(base::TimeDelta(), next_task_delay);
3975 task_runner->FastForwardBy(next_task_delay);
3976
3977 // Now there are two pending tasks, the nearest one was to send connectivity
3978 // probe and has been cancelled due to successful migration.
3979 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
3980 next_task_delay = task_runner->NextPendingTaskDelay();
3981 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3982 next_task_delay);
3983 task_runner->FastForwardBy(next_task_delay);
3984
3985 // There's one more task to mgirate back to the default network in 0.4s.
3986 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3987 next_task_delay = task_runner->NextPendingTaskDelay();
3988 base::TimeDelta expected_delay =
3989 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
3990 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
3991 EXPECT_EQ(expected_delay, next_task_delay);
3992
Zhongyi Shib3bc982c2018-07-10 19:59:243993 base::RunLoop().RunUntilIdle();
3994
Zhongyi Shif5cc30392018-05-30 18:25:153995 // Deliver a signal that the alternate network now becomes default to session,
3996 // this will cancel mgirate back to default network timer.
3997 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3998 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
3999
4000 task_runner->FastForwardBy(next_task_delay);
4001 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4002
4003 // Verify that the session is still alive.
4004 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4005 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi0439ecc72018-07-11 04:41:264006 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
Zhongyi Shif5cc30392018-05-30 18:25:154007
4008 stream.reset();
4009 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
4010 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
4011 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
4012 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
4013}
4014
Zhongyi Shiaba4a832018-04-30 20:29:084015// Regression test for http://crbug.com/835444.
4016// This test verifies that the connection migrates to the alternate network
4017// when the alternate network is connected after path has been degrading.
4018TEST_P(QuicStreamFactoryTest, MigrateOnNewNetworkConnectAfterPathDegrading) {
4019 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
4020 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4021 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4022 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4023
4024 // Using a testing task runner so that we can control time.
4025 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4026 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4027
4028 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4029 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
4030
4031 MockQuicData quic_data1;
Ryan Hamilton8d9ee76e2018-05-29 23:52:524032 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shiaba4a832018-04-30 20:29:084033 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
4034 quic_data1.AddWrite(SYNCHRONOUS,
4035 ConstructInitialSettingsPacket(1, &header_stream_offset));
Fan Yang32c5a112018-12-10 20:06:334036 quic_data1.AddWrite(
4037 SYNCHRONOUS, ConstructGetRequestPacket(
4038 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
4039 true, &header_stream_offset));
Zhongyi Shiaba4a832018-04-30 20:29:084040 quic_data1.AddSocketDataToFactory(socket_factory_.get());
4041
4042 // Set up the second socket data provider that is used after migration.
4043 // The response to the earlier request is read on the new socket.
4044 MockQuicData quic_data2;
4045 // Connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:254046 quic_data2.AddWrite(SYNCHRONOUS,
4047 client_maker_.MakeConnectivityProbingPacket(3, true));
Zhongyi Shiaba4a832018-04-30 20:29:084048 quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
4049 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:254050 quic_data2.AddRead(ASYNC,
4051 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shiaba4a832018-04-30 20:29:084052 // Ping packet to send after migration is completed.
4053 quic_data2.AddWrite(ASYNC,
4054 client_maker_.MakeAckAndPingPacket(4, false, 1, 1, 1));
4055 quic_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:334056 ASYNC,
4057 ConstructOkResponsePacket(
4058 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shiaba4a832018-04-30 20:29:084059 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:334060 quic_data2.AddWrite(
4061 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
4062 5, false, GetNthClientInitiatedBidirectionalStreamId(0),
4063 quic::QUIC_STREAM_CANCELLED, 2, 2, 1, true));
Zhongyi Shiaba4a832018-04-30 20:29:084064 quic_data2.AddSocketDataToFactory(socket_factory_.get());
4065
4066 // Create request and QuicHttpStream.
4067 QuicStreamRequest request(factory_.get());
4068 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034069 request.Request(
4070 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4071 SocketTag(),
4072 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4073 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shiaba4a832018-04-30 20:29:084074 EXPECT_THAT(callback_.WaitForResult(), IsOk());
4075 std::unique_ptr<HttpStream> stream = CreateStream(&request);
4076 EXPECT_TRUE(stream.get());
4077
4078 // Cause QUIC stream to be created.
4079 HttpRequestInfo request_info;
4080 request_info.method = "GET";
4081 request_info.url = url_;
4082 request_info.traffic_annotation =
4083 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
4084 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
4085 net_log_, CompletionOnceCallback()));
4086
4087 // Ensure that session is alive and active.
4088 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4089 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4090 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4091
4092 // Send GET request on stream.
4093 HttpResponseInfo response;
4094 HttpRequestHeaders request_headers;
4095 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
4096 callback_.callback()));
4097
4098 // Cause the connection to report path degrading to the session.
4099 // Due to lack of alternate network, session will not mgirate connection.
4100 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4101 session->connection()->OnPathDegradingTimeout();
4102 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4103
4104 // Deliver a signal that a alternate network is connected now, this should
4105 // cause the connection to start early migration on path degrading.
4106 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4107 ->SetConnectedNetworksList(
4108 {kDefaultNetworkForTests, kNewNetworkForTests});
4109 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4110 ->NotifyNetworkConnected(kNewNetworkForTests);
Zhongyi Shic4823bd2018-04-27 00:49:194111
4112 // Next connectivity probe is scheduled to be sent in 2 *
4113 // kDefaultRTTMilliSecs.
4114 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4115 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
4116 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
4117 next_task_delay);
4118
4119 // The connection should still be alive, and not marked as going away.
4120 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4121 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4122 EXPECT_EQ(1u, session->GetNumActiveStreams());
4123 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
4124
4125 // Resume quic data and a connectivity probe response will be read on the new
4126 // socket.
4127 quic_data2.Resume();
4128
4129 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4130 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4131 EXPECT_EQ(1u, session->GetNumActiveStreams());
4132
4133 // There should be three pending tasks, the nearest one will complete
4134 // migration to the new network.
4135 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
4136 next_task_delay = task_runner->NextPendingTaskDelay();
4137 EXPECT_EQ(base::TimeDelta(), next_task_delay);
4138 task_runner->FastForwardBy(next_task_delay);
4139
4140 // Response headers are received over the new network.
4141 EXPECT_THAT(callback_.WaitForResult(), IsOk());
4142 EXPECT_EQ(200, response.headers->response_code());
4143
4144 // Now there are two pending tasks, the nearest one was to send connectivity
4145 // probe and has been cancelled due to successful migration.
4146 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
4147 next_task_delay = task_runner->NextPendingTaskDelay();
4148 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
4149 next_task_delay);
4150 task_runner->FastForwardBy(next_task_delay);
4151
4152 // There's one more task to mgirate back to the default network in 0.4s.
4153 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4154 next_task_delay = task_runner->NextPendingTaskDelay();
4155 base::TimeDelta expected_delay =
4156 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
4157 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
4158 EXPECT_EQ(expected_delay, next_task_delay);
4159
4160 // Deliver a signal that the alternate network now becomes default to session,
4161 // this will cancel mgirate back to default network timer.
4162 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4163 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
4164
4165 task_runner->FastForwardBy(next_task_delay);
4166 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4167
4168 // Verify that the session is still alive.
4169 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4170 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4171
4172 stream.reset();
4173 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
4174 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
4175 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
4176 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
4177}
4178
Zhongyi Shi28f6e352018-06-20 21:15:434179// This test verifies that multiple sessions are migrated on connection
4180// migration signal.
jrie3d187c2016-09-16 14:29:174181TEST_P(QuicStreamFactoryTest,
Zhongyi Shi28f6e352018-06-20 21:15:434182 MigrateMultipleSessionsToBadSocketsAfterDisconnected) {
4183 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jrie3d187c2016-09-16 14:29:174184
4185 MockQuicData socket_data1;
4186 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:434187 socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
jrie3d187c2016-09-16 14:29:174188 socket_data1.AddWrite(ASYNC, OK);
Zhongyi Shi5f587cc2017-11-21 23:24:174189 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jrie3d187c2016-09-16 14:29:174190 MockQuicData socket_data2;
4191 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:434192 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
jrie3d187c2016-09-16 14:29:174193 socket_data2.AddWrite(ASYNC, OK);
Zhongyi Shi5f587cc2017-11-21 23:24:174194 socket_data2.AddSocketDataToFactory(socket_factory_.get());
jrie3d187c2016-09-16 14:29:174195
4196 HostPortPair server1(kDefaultServerHostName, 443);
4197 HostPortPair server2(kServer2HostName, 443);
4198
4199 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4200 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4201 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4202
Renjiea0cb4a2c2018-09-26 23:37:304203 host_resolver_->set_synchronous_mode(true);
4204 host_resolver_->rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
4205 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.2", "");
jrie3d187c2016-09-16 14:29:174206
4207 // Create request and QuicHttpStream to create session1.
zhongyi98d6a9262017-05-19 02:47:454208 QuicStreamRequest request1(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:034209 EXPECT_EQ(OK,
4210 request1.Request(
4211 server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
4212 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4213 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:244214 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
jrie3d187c2016-09-16 14:29:174215 EXPECT_TRUE(stream1.get());
4216
4217 // Create request and QuicHttpStream to create session2.
zhongyi98d6a9262017-05-19 02:47:454218 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:034219 EXPECT_EQ(OK,
4220 request2.Request(
4221 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
4222 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
4223 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:244224 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
jrie3d187c2016-09-16 14:29:174225 EXPECT_TRUE(stream2.get());
4226
4227 QuicChromiumClientSession* session1 = GetActiveSession(server1);
4228 QuicChromiumClientSession* session2 = GetActiveSession(server2);
4229 EXPECT_NE(session1, session2);
4230
4231 // Cause QUIC stream to be created and send GET so session1 has an open
4232 // stream.
4233 HttpRequestInfo request_info1;
4234 request_info1.method = "GET";
4235 request_info1.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:394236 request_info1.traffic_annotation =
4237 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:274238 EXPECT_EQ(OK,
4239 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:394240 net_log_, CompletionOnceCallback()));
jrie3d187c2016-09-16 14:29:174241 HttpResponseInfo response1;
4242 HttpRequestHeaders request_headers1;
4243 EXPECT_EQ(OK, stream1->SendRequest(request_headers1, &response1,
4244 callback_.callback()));
4245
4246 // Cause QUIC stream to be created and send GET so session2 has an open
4247 // stream.
4248 HttpRequestInfo request_info2;
4249 request_info2.method = "GET";
4250 request_info2.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:394251 request_info2.traffic_annotation =
4252 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:274253 EXPECT_EQ(OK,
4254 stream2->InitializeStream(&request_info2, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:394255 net_log_, CompletionOnceCallback()));
jrie3d187c2016-09-16 14:29:174256 HttpResponseInfo response2;
4257 HttpRequestHeaders request_headers2;
4258 EXPECT_EQ(OK, stream2->SendRequest(request_headers2, &response2,
4259 callback_.callback()));
4260
4261 // Cause both sessions to be paused due to DISCONNECTED.
4262 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4263 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
4264
4265 // Ensure that both sessions are paused but alive.
4266 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session1));
4267 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
4268
Zhongyi Shi28f6e352018-06-20 21:15:434269 // Add new sockets to use post migration. Those are bad sockets and will cause
4270 // migration to fail.
jrie3d187c2016-09-16 14:29:174271 MockConnect connect_result =
4272 MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED);
Ryan Sleevib8d7ea02018-05-07 20:01:014273 SequencedSocketData socket_data3(connect_result, base::span<MockRead>(),
4274 base::span<MockWrite>());
Zhongyi Shi5f587cc2017-11-21 23:24:174275 socket_factory_->AddSocketDataProvider(&socket_data3);
Ryan Sleevib8d7ea02018-05-07 20:01:014276 SequencedSocketData socket_data4(connect_result, base::span<MockRead>(),
4277 base::span<MockWrite>());
Zhongyi Shi5f587cc2017-11-21 23:24:174278 socket_factory_->AddSocketDataProvider(&socket_data4);
jrie3d187c2016-09-16 14:29:174279
Zhongyi Shi28f6e352018-06-20 21:15:434280 // Connect the new network and cause migration to bad sockets, causing
4281 // sessions to close.
jrie3d187c2016-09-16 14:29:174282 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4283 ->SetConnectedNetworksList({kNewNetworkForTests});
4284 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4285 ->NotifyNetworkConnected(kNewNetworkForTests);
4286
4287 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session1));
4288 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
4289
4290 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
4291 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
4292 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
4293 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
4294}
4295
Zhongyi Shi6ec9b36e2018-06-20 20:32:544296// This test verifies that session attempts connection migration with signals
4297// delivered in the following order (no alternate network is available):
4298// - path degrading is detected: session attempts connection migration but no
4299// alternate network is available, session caches path degrading signal in
4300// connection and stays on the original network.
4301// - original network backs up, request is served in the orignal network,
4302// session is not marked as going away.
4303TEST_P(QuicStreamFactoryTest, MigrateOnPathDegradingWithNoNewNetwork) {
4304 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jrid36ada62016-02-06 02:42:084305 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4306 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4307
Zhongyi Shi6ec9b36e2018-06-20 20:32:544308 MockQuicData quic_data;
4309 quic::QuicStreamOffset header_stream_offset = 0;
4310 quic_data.AddWrite(SYNCHRONOUS,
4311 ConstructInitialSettingsPacket(1, &header_stream_offset));
Fan Yang32c5a112018-12-10 20:06:334312 quic_data.AddWrite(SYNCHRONOUS,
4313 ConstructGetRequestPacket(
4314 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
4315 true, &header_stream_offset));
Zhongyi Shi6ec9b36e2018-06-20 20:32:544316 quic_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause for path degrading signal.
4317
4318 // The rest of the data will still flow in the original socket as there is no
4319 // new network after path degrading.
Fan Yang32c5a112018-12-10 20:06:334320 quic_data.AddRead(ASYNC, ConstructOkResponsePacket(
4321 1, GetNthClientInitiatedBidirectionalStreamId(0),
4322 false, false));
Zhongyi Shi6ec9b36e2018-06-20 20:32:544323 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:334324 quic_data.AddWrite(
4325 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
4326 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
4327 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi6ec9b36e2018-06-20 20:32:544328 quic_data.AddSocketDataToFactory(socket_factory_.get());
jrid36ada62016-02-06 02:42:084329
4330 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:454331 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:334332 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034333 request.Request(
4334 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4335 SocketTag(),
4336 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4337 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:014338 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:244339 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jrid36ada62016-02-06 02:42:084340 EXPECT_TRUE(stream.get());
4341
4342 // Cause QUIC stream to be created.
4343 HttpRequestInfo request_info;
Zhongyi Shi6ec9b36e2018-06-20 20:32:544344 request_info.method = "GET";
4345 request_info.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:394346 request_info.traffic_annotation =
4347 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Zhongyi Shi6ec9b36e2018-06-20 20:32:544348 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:394349 net_log_, CompletionOnceCallback()));
jrid36ada62016-02-06 02:42:084350
4351 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:504352 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jrid36ada62016-02-06 02:42:084353 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4354 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4355
Zhongyi Shi6ec9b36e2018-06-20 20:32:544356 // Send GET request on stream.
4357 HttpResponseInfo response;
4358 HttpRequestHeaders request_headers;
4359 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
4360 callback_.callback()));
jrid36ada62016-02-06 02:42:084361
Zhongyi Shi6ec9b36e2018-06-20 20:32:544362 // Trigger connection migration on path degrading. Since there are no networks
4363 // to migrate to, the session will remain on the original network, not marked
4364 // as going away.
4365 session->connection()->OnPathDegradingTimeout();
4366 EXPECT_TRUE(session->connection()->IsPathDegrading());
4367
4368 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4369 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4370 EXPECT_EQ(1u, session->GetNumActiveStreams());
4371 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
4372
4373 // Resume so that rest of the data will flow in the original socket.
4374 quic_data.Resume();
jrid36ada62016-02-06 02:42:084375
4376 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4377 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4378 EXPECT_EQ(1u, session->GetNumActiveStreams());
4379
4380 stream.reset();
Zhongyi Shi6ec9b36e2018-06-20 20:32:544381 EXPECT_TRUE(quic_data.AllReadDataConsumed());
4382 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
jrid36ada62016-02-06 02:42:084383}
4384
Zhongyi Shi21e99532018-07-17 22:23:074385// This test verifies that session with non-migratable stream will probe the
4386// alternate network on path degrading, and close the non-migratable streams
4387// when probe is successful.
jri231c2972016-03-08 19:50:114388TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyNonMigratableStream) {
Zhongyi Shi1a054612018-06-14 04:59:084389 InitializeConnectionMigrationV2Test(
jri231c2972016-03-08 19:50:114390 {kDefaultNetworkForTests, kNewNetworkForTests});
4391 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4392 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4393
rcha00569732016-08-27 11:09:364394 MockQuicData socket_data;
4395 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:434396 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Renjieba55fae2018-09-20 03:05:164397 socket_data.AddWrite(
4398 SYNCHRONOUS,
4399 client_maker_.MakeRstAckAndConnectionClosePacket(
Fan Yang32c5a112018-12-10 20:06:334400 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
Fan Yang7c68f632018-11-06 03:05:384401 quic::QUIC_STREAM_CANCELLED,
Renjieba55fae2018-09-20 03:05:164402 quic::QuicTime::Delta::FromMilliseconds(0), 1, 1, 1,
4403 quic::QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS, "net error"));
Zhongyi Shi5f587cc2017-11-21 23:24:174404 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri231c2972016-03-08 19:50:114405
Zhongyi Shi21e99532018-07-17 22:23:074406 // Set up the second socket data provider that is used for probing.
4407 MockQuicData quic_data1;
4408 // Connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:254409 quic_data1.AddWrite(SYNCHRONOUS,
4410 client_maker_.MakeConnectivityProbingPacket(2, true));
Zhongyi Shi21e99532018-07-17 22:23:074411 quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
4412 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:254413 quic_data1.AddRead(ASYNC,
4414 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shi21e99532018-07-17 22:23:074415 quic_data1.AddSocketDataToFactory(socket_factory_.get());
4416
jri231c2972016-03-08 19:50:114417 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:454418 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:334419 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034420 request.Request(
4421 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4422 SocketTag(),
4423 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4424 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:014425 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:244426 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri231c2972016-03-08 19:50:114427 EXPECT_TRUE(stream.get());
4428
4429 // Cause QUIC stream to be created, but marked as non-migratable.
4430 HttpRequestInfo request_info;
Zhongyi Shibb28b1f2018-07-18 02:41:264431 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
Ramin Halavati683bcaa92018-02-14 08:42:394432 request_info.traffic_annotation =
4433 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:274434 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:394435 net_log_, CompletionOnceCallback()));
jri231c2972016-03-08 19:50:114436
4437 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:504438 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:114439 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4440 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4441
4442 // Trigger connection migration. Since there is a non-migratable stream,
4443 // this should cause session to be continue without migrating.
4444 session->OnPathDegrading();
4445
4446 // Run the message loop so that data queued in the new socket is read by the
4447 // packet reader.
4448 base::RunLoop().RunUntilIdle();
4449
4450 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4451 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4452 EXPECT_EQ(1u, session->GetNumActiveStreams());
4453
Zhongyi Shi21e99532018-07-17 22:23:074454 // Resume the data to read the connectivity probing response to declare probe
4455 // as successful. Non-migratable streams will be closed.
4456 quic_data1.Resume();
4457 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4458 EXPECT_FALSE(HasActiveSession(host_port_pair_));
4459 EXPECT_EQ(0u, session->GetNumActiveStreams());
jri231c2972016-03-08 19:50:114460
Zhongyi Shi21e99532018-07-17 22:23:074461 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
4462 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
jri231c2972016-03-08 19:50:114463 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4464 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4465}
4466
jri9c541572016-03-29 17:51:484467TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyConnectionMigrationDisabled) {
Zhongyi Shi1a054612018-06-14 04:59:084468 InitializeConnectionMigrationV2Test(
jri9c541572016-03-29 17:51:484469 {kDefaultNetworkForTests, kNewNetworkForTests});
4470 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4471 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4472
rcha00569732016-08-27 11:09:364473 MockQuicData socket_data;
4474 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:434475 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
4476 socket_data.AddWrite(
Fan Yang32c5a112018-12-10 20:06:334477 SYNCHRONOUS, client_maker_.MakeRstPacket(
4478 2, true, GetNthClientInitiatedBidirectionalStreamId(0),
4479 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:174480 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9c541572016-03-29 17:51:484481
4482 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:454483 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:334484 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034485 request.Request(
4486 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4487 SocketTag(),
4488 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4489 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:014490 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:244491 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9c541572016-03-29 17:51:484492 EXPECT_TRUE(stream.get());
4493
4494 // Cause QUIC stream to be created.
4495 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:394496 request_info.traffic_annotation =
4497 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:274498 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:394499 net_log_, CompletionOnceCallback()));
jri9c541572016-03-29 17:51:484500
4501 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:504502 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:484503 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4504 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4505
4506 // Set session config to have connection migration disabled.
Ryan Hamilton8d9ee76e2018-05-29 23:52:524507 quic::test::QuicConfigPeer::SetReceivedDisableConnectionMigration(
4508 session->config());
jri9c541572016-03-29 17:51:484509 EXPECT_TRUE(session->config()->DisableConnectionMigration());
4510
4511 // Trigger connection migration. Since there is a non-migratable stream,
4512 // this should cause session to be continue without migrating.
4513 session->OnPathDegrading();
4514
4515 // Run the message loop so that data queued in the new socket is read by the
4516 // packet reader.
4517 base::RunLoop().RunUntilIdle();
4518
4519 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4520 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4521 EXPECT_EQ(1u, session->GetNumActiveStreams());
4522
4523 stream.reset();
4524
4525 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4526 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4527}
4528
Zhongyi Shi3c4c9e92018-07-02 23:16:234529// Regression test for http://crbug.com/791886.
4530// This test verifies that the old packet writer which encountered an
4531// asynchronous write error will be blocked during migration on write error. New
4532// packets would not be written until the one with write error is rewritten on
4533// the new network.
4534TEST_P(QuicStreamFactoryTest, MigrateSessionOnAysncWriteError) {
4535 InitializeConnectionMigrationV2Test(
4536 {kDefaultNetworkForTests, kNewNetworkForTests});
4537 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4538 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4539 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4540
4541 // Using a testing task runner so that we can control time.
4542 // base::RunLoop() controls mocked socket writes and reads.
4543 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4544 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4545
4546 MockQuicData socket_data;
4547 quic::QuicStreamOffset header_stream_offset = 0;
4548 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4549 socket_data.AddWrite(
4550 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
4551 socket_data.AddWrite(ASYNC, ERR_ADDRESS_UNREACHABLE);
4552 socket_data.AddSocketDataToFactory(socket_factory_.get());
4553
4554 // Set up second socket data provider that is used after
4555 // migration. The request is rewritten to this new socket, and the
4556 // response to the request is read on this new socket.
4557 MockQuicData socket_data1;
Zhongyi Shi3c4c9e92018-07-02 23:16:234558 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:334559 SYNCHRONOUS, ConstructGetRequestPacket(
4560 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
4561 true, &header_stream_offset));
4562 socket_data1.AddWrite(SYNCHRONOUS,
4563 ConstructGetRequestPacket(
4564 3, GetNthClientInitiatedBidirectionalStreamId(1),
4565 GetNthClientInitiatedBidirectionalStreamId(0), true,
4566 true, &header_stream_offset));
4567 socket_data1.AddRead(
4568 ASYNC,
4569 ConstructOkResponsePacket(
4570 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
4571 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4572 socket_data1.AddWrite(
4573 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
4574 4, false, GetNthClientInitiatedBidirectionalStreamId(0),
4575 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
4576 socket_data1.AddWrite(
4577 SYNCHRONOUS, client_maker_.MakeRstPacket(
4578 5, false, GetNthClientInitiatedBidirectionalStreamId(1),
4579 quic::QUIC_STREAM_CANCELLED, 0));
Zhongyi Shi3c4c9e92018-07-02 23:16:234580
4581 socket_data1.AddSocketDataToFactory(socket_factory_.get());
4582
4583 // Create request #1 and QuicHttpStream.
4584 QuicStreamRequest request1(factory_.get());
4585 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034586 request1.Request(
4587 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4588 SocketTag(),
4589 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4590 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi3c4c9e92018-07-02 23:16:234591 EXPECT_THAT(callback_.WaitForResult(), IsOk());
4592 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
4593 EXPECT_TRUE(stream1.get());
4594
4595 HttpRequestInfo request_info1;
4596 request_info1.method = "GET";
4597 request_info1.url = GURL("https://www.example.org/");
4598 request_info1.traffic_annotation =
4599 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
4600 EXPECT_EQ(OK,
4601 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
4602 net_log_, CompletionOnceCallback()));
4603
4604 // Request #2 returns synchronously because it pools to existing session.
4605 TestCompletionCallback callback2;
4606 QuicStreamRequest request2(factory_.get());
4607 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
4608 DEFAULT_PRIORITY, SocketTag(),
4609 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:034610 &net_error_details_,
4611 failed_on_default_network_callback_,
4612 callback2.callback()));
Zhongyi Shi3c4c9e92018-07-02 23:16:234613 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
4614 EXPECT_TRUE(stream2.get());
4615
4616 HttpRequestInfo request_info2;
4617 request_info2.method = "GET";
4618 request_info2.url = GURL("https://www.example.org/");
4619 request_info2.traffic_annotation =
4620 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
4621 EXPECT_EQ(OK,
4622 stream2->InitializeStream(&request_info2, true, DEFAULT_PRIORITY,
4623 net_log_, CompletionOnceCallback()));
4624
4625 // Ensure that session is alive and active.
4626 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4627 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4628 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4629 EXPECT_EQ(2u, session->GetNumActiveStreams());
4630
4631 // Send GET request on stream1. This should cause an async write error.
4632 HttpResponseInfo response;
4633 HttpRequestHeaders request_headers;
4634 EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
4635 callback_.callback()));
4636 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4637
4638 // Run the message loop so that asynchronous write completes and a connection
4639 // migration on write error attempt is posted in QuicStreamFactory's task
4640 // runner.
4641 base::RunLoop().RunUntilIdle();
4642 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4643
4644 // Send GET request on stream. This will cause another write attempt before
4645 // migration on write error is exectued.
4646 HttpResponseInfo response2;
4647 HttpRequestHeaders request_headers2;
4648 EXPECT_EQ(OK, stream2->SendRequest(request_headers2, &response2,
4649 callback2.callback()));
4650
4651 // Run the task runner so that migration on write error is finally executed.
4652 task_runner->RunUntilIdle();
4653
Zhongyi Shia7dd46b2018-07-12 22:59:294654 // Verify the session is still alive and not marked as going away.
Zhongyi Shi3c4c9e92018-07-02 23:16:234655 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:294656 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi3c4c9e92018-07-02 23:16:234657 EXPECT_EQ(2u, session->GetNumActiveStreams());
Zhongyi Shia7dd46b2018-07-12 22:59:294658 // There should be one task posted to migrate back to the default network in
4659 // kMinRetryTimeForDefaultNetworkSecs.
4660 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4661 EXPECT_EQ(base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs),
4662 task_runner->NextPendingTaskDelay());
Zhongyi Shi3c4c9e92018-07-02 23:16:234663
4664 // Verify that response headers on the migrated socket were delivered to the
4665 // stream.
4666 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
4667 EXPECT_EQ(200, response.headers->response_code());
4668
4669 stream1.reset();
4670 stream2.reset();
4671
4672 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4673 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4674 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
4675 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
4676}
4677
Zhongyi Shia7dd46b2018-07-12 22:59:294678// Verify session is not marked as going away after connection migration on
4679// write error and migrate back to default network logic is applied to bring the
4680// migrated session back to the default network. Migration singals delivered
4681// in the following order (alternate network is always availabe):
4682// - session on the default network encountered a write error;
4683// - session successfully migrated to the non-default network;
4684// - session attempts to migrate back to default network post migration;
4685// - migration back to the default network is successful.
4686TEST_P(QuicStreamFactoryTest, MigrateBackToDefaultPostMigrationOnWriteError) {
4687 InitializeConnectionMigrationV2Test(
4688 {kDefaultNetworkForTests, kNewNetworkForTests});
4689 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4690 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4691 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4692
4693 // Using a testing task runner so that we can control time.
4694 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4695 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4696
4697 MockQuicData socket_data;
4698 quic::QuicStreamOffset header_stream_offset = 0;
4699 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4700 socket_data.AddWrite(
4701 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
4702 socket_data.AddWrite(ASYNC, ERR_ADDRESS_UNREACHABLE);
4703 socket_data.AddSocketDataToFactory(socket_factory_.get());
4704
4705 // Set up second socket data provider that is used after
4706 // migration. The request is rewritten to this new socket, and the
4707 // response to the request is read on this new socket.
4708 MockQuicData quic_data2;
Fan Yang32c5a112018-12-10 20:06:334709 quic_data2.AddWrite(
4710 SYNCHRONOUS, ConstructGetRequestPacket(
4711 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
4712 true, &header_stream_offset));
Zhongyi Shia7dd46b2018-07-12 22:59:294713 quic_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:334714 ASYNC,
4715 ConstructOkResponsePacket(
4716 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shia7dd46b2018-07-12 22:59:294717 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4718 quic_data2.AddSocketDataToFactory(socket_factory_.get());
4719
4720 // Create request QuicHttpStream.
4721 QuicStreamRequest request1(factory_.get());
4722 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034723 request1.Request(
4724 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4725 SocketTag(),
4726 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4727 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shia7dd46b2018-07-12 22:59:294728 EXPECT_THAT(callback_.WaitForResult(), IsOk());
4729 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
4730 EXPECT_TRUE(stream1.get());
4731
4732 HttpRequestInfo request_info1;
4733 request_info1.method = "GET";
4734 request_info1.url = GURL("https://www.example.org/");
4735 request_info1.traffic_annotation =
4736 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
4737 EXPECT_EQ(OK,
4738 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
4739 net_log_, CompletionOnceCallback()));
4740
4741 // Ensure that session is alive and active.
4742 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4743 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4744 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4745 EXPECT_EQ(1u, session->GetNumActiveStreams());
4746
4747 // Send GET request. This should cause an async write error.
4748 HttpResponseInfo response;
4749 HttpRequestHeaders request_headers;
4750 EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
4751 callback_.callback()));
4752 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4753
4754 // Run the message loop so that asynchronous write completes and a connection
4755 // migration on write error attempt is posted in QuicStreamFactory's task
4756 // runner.
4757 base::RunLoop().RunUntilIdle();
4758 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4759
4760 // Run the task runner so that migration on write error is finally executed.
4761 task_runner->RunUntilIdle();
4762
4763 // Verify the session is still alive and not marked as going away.
4764 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4765 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4766 EXPECT_EQ(1u, session->GetNumActiveStreams());
4767 // There should be one task posted to migrate back to the default network in
4768 // kMinRetryTimeForDefaultNetworkSecs.
4769 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4770 base::TimeDelta expected_delay =
4771 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs);
4772 EXPECT_EQ(expected_delay, task_runner->NextPendingTaskDelay());
4773
4774 // Verify that response headers on the migrated socket were delivered to the
4775 // stream.
4776 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
4777 EXPECT_EQ(200, response.headers->response_code());
4778
4779 // Set up the third socket data provider for migrate back to default network.
4780 MockQuicData quic_data3;
4781 // Connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:254782 quic_data3.AddWrite(SYNCHRONOUS,
4783 client_maker_.MakeConnectivityProbingPacket(3, false));
Zhongyi Shia7dd46b2018-07-12 22:59:294784 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:254785 quic_data3.AddRead(ASYNC,
4786 server_maker_.MakeConnectivityProbingPacket(2, false));
Zhongyi Shia7dd46b2018-07-12 22:59:294787 quic_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4788 quic_data3.AddWrite(ASYNC, client_maker_.MakeAckPacket(4, 1, 2, 1, 1, true));
4789 quic_data3.AddWrite(
Fan Yang32c5a112018-12-10 20:06:334790 SYNCHRONOUS, client_maker_.MakeRstPacket(
4791 5, false, GetNthClientInitiatedBidirectionalStreamId(0),
4792 quic::QUIC_STREAM_CANCELLED, 0));
Zhongyi Shia7dd46b2018-07-12 22:59:294793 quic_data3.AddSocketDataToFactory(socket_factory_.get());
4794
4795 // Fast forward to fire the migrate back timer and verify the session
4796 // successfully migrates back to the default network.
4797 task_runner->FastForwardBy(expected_delay);
4798
4799 // Verify the session is still alive and not marked as going away.
4800 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4801 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4802 EXPECT_EQ(1u, session->GetNumActiveStreams());
4803
4804 // There should be one task posted to one will resend a connectivity probe and
4805 // the other will retry migrate back, both are cancelled.
4806 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
4807 task_runner->FastForwardBy(
4808 base::TimeDelta::FromSeconds(2 * kMinRetryTimeForDefaultNetworkSecs));
4809 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4810
4811 stream1.reset();
4812 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4813 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4814 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
4815 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
4816 EXPECT_TRUE(quic_data3.AllReadDataConsumed());
4817 EXPECT_TRUE(quic_data3.AllWriteDataConsumed());
4818}
4819
Zhongyi Shic1449372018-08-09 09:58:584820// This test verifies that the connection will not attempt connection migration
4821// (send connectivity probes on alternate path) when path degrading is detected
4822// and handshake is not confirmed.
4823TEST_P(QuicStreamFactoryTest,
4824 NoMigrationOnPathDegradingBeforeHandshakeConfirmed) {
4825 InitializeConnectionMigrationV2Test(
4826 {kDefaultNetworkForTests, kNewNetworkForTests});
4827
4828 // Using a testing task runner.
4829 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4830 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4831
4832 // Use cold start mode to send crypto message for handshake.
4833 crypto_client_stream_factory_.set_handshake_mode(
4834 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
4835
4836 MockQuicData socket_data;
4837 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4838 socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
4839 socket_data.AddSocketDataToFactory(socket_factory_.get());
4840
4841 // Create request and QuicHttpStream.
4842 QuicStreamRequest request(factory_.get());
4843 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034844 request.Request(
4845 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4846 SocketTag(),
4847 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4848 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shic1449372018-08-09 09:58:584849
4850 base::RunLoop().RunUntilIdle();
4851
4852 // Ensure that session is alive but not active.
4853 EXPECT_FALSE(HasActiveSession(host_port_pair_));
4854 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
4855 QuicChromiumClientSession* session = GetPendingSession(host_port_pair_);
4856 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4857 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4858
4859 // Cause the connection to report path degrading to the session.
4860 // Session will ignore the signal as handshake is not completed.
4861 session->connection()->OnPathDegradingTimeout();
4862 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4863
4864 EXPECT_FALSE(HasActiveSession(host_port_pair_));
Zhongyi Shi8de43832018-08-15 23:40:004865 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
Zhongyi Shic1449372018-08-09 09:58:584866 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4867 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4868}
4869
Zhongyi Shi634c1882018-08-16 04:05:594870// This test verifies that if a connection is closed with
4871// QUIC_NETWORK_IDLE_TIMEOUT before handshake is completed and there is no
4872// alternate network, no new connection will be created.
4873TEST_P(QuicStreamFactoryTest, NoAlternateNetworkBeforeHandshakeOnIdleTimeout) {
4874 TestNoAlternateNetworkBeforeHandshake(quic::QUIC_NETWORK_IDLE_TIMEOUT);
4875}
4876
4877// This test verifies that if a connection is closed with QUIC_HANDSHAKE_TIMEOUT
4878// and there is no alternate network, no new connection will be created.
4879TEST_P(QuicStreamFactoryTest, NoAlternateNetworkOnHandshakeTimeout) {
4880 TestNoAlternateNetworkBeforeHandshake(quic::QUIC_HANDSHAKE_TIMEOUT);
4881}
4882
4883void QuicStreamFactoryTestBase::TestNoAlternateNetworkBeforeHandshake(
4884 quic::QuicErrorCode quic_error) {
4885 DCHECK(quic_error == quic::QUIC_NETWORK_IDLE_TIMEOUT ||
4886 quic_error == quic::QUIC_HANDSHAKE_TIMEOUT);
4887 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
4888
4889 // Using a testing task runner.
4890 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4891 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4892
4893 // Use cold start mode to send crypto message for handshake.
4894 crypto_client_stream_factory_.set_handshake_mode(
4895 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
4896
4897 MockQuicData socket_data;
4898 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4899 socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
4900 socket_data.AddSocketDataToFactory(socket_factory_.get());
4901
4902 // Create request.
4903 QuicStreamRequest request(factory_.get());
4904 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034905 request.Request(
4906 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4907 SocketTag(),
4908 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4909 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi634c1882018-08-16 04:05:594910
4911 base::RunLoop().RunUntilIdle();
4912
4913 // Ensure that session is alive but not active.
4914 EXPECT_FALSE(HasActiveSession(host_port_pair_));
4915 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
4916 QuicChromiumClientSession* session = GetPendingSession(host_port_pair_);
4917 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4918 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4919
4920 // Cause the connection to report path degrading to the session.
4921 // Session will ignore the signal as handshake is not completed.
4922 session->connection()->OnPathDegradingTimeout();
4923 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4924 EXPECT_FALSE(HasActiveSession(host_port_pair_));
4925 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
4926
4927 // Cause the connection to close due to |quic_error| before handshake.
4928 quic::QuicString error_details;
4929 if (quic_error == quic::QUIC_NETWORK_IDLE_TIMEOUT) {
4930 error_details = "No recent network activity.";
4931 } else {
4932 error_details = "Handshake timeout expired.";
4933 }
4934 session->connection()->CloseConnection(
4935 quic_error, error_details, quic::ConnectionCloseBehavior::SILENT_CLOSE);
4936
4937 // A task will be posted to clean up the session in the factory.
4938 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4939 task_runner->FastForwardUntilNoTasksRemain();
4940
4941 // No new session should be created as there is no alternate network.
4942 EXPECT_FALSE(HasActiveSession(host_port_pair_));
4943 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
4944 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4945 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4946}
4947
Zhongyi Shi8de43832018-08-15 23:40:004948TEST_P(QuicStreamFactoryTest, NewConnectionBeforeHandshakeAfterIdleTimeout) {
4949 TestNewConnectionOnAlternateNetworkBeforeHandshake(
4950 quic::QUIC_NETWORK_IDLE_TIMEOUT);
4951}
4952
4953TEST_P(QuicStreamFactoryTest, NewConnectionAfterHandshakeTimeout) {
4954 TestNewConnectionOnAlternateNetworkBeforeHandshake(
4955 quic::QUIC_HANDSHAKE_TIMEOUT);
4956}
4957
Zhongyi Shif3fcbbe62018-08-16 22:52:084958// Sets up a test to verify that a new connection will be created on the
4959// alternate network after the initial connection fails before handshake with
4960// signals delivered in the following order (alternate network is available):
4961// - the default network is not able to complete crypto handshake;
4962// - the original connection is closed with |quic_error|;
4963// - a new connection is created on the alternate network and is able to finish
4964// crypto handshake;
4965// - the new session on the alternate network attempts to migrate back to the
4966// default network by sending probes;
4967// - default network being disconnected is delivered: session will stop probing
4968// the original network.
4969// - alternate network is made by default.
Zhongyi Shi8de43832018-08-15 23:40:004970void QuicStreamFactoryTestBase::
4971 TestNewConnectionOnAlternateNetworkBeforeHandshake(
4972 quic::QuicErrorCode quic_error) {
4973 DCHECK(quic_error == quic::QUIC_NETWORK_IDLE_TIMEOUT ||
4974 quic_error == quic::QUIC_HANDSHAKE_TIMEOUT);
Zhongyi Shi967d2f12019-02-08 20:58:534975 test_params_.quic_retry_on_alternate_network_before_handshake = true;
Zhongyi Shi8de43832018-08-15 23:40:004976 InitializeConnectionMigrationV2Test(
4977 {kDefaultNetworkForTests, kNewNetworkForTests});
4978
4979 // Using a testing task runner.
4980 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4981 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4982
4983 // Use cold start mode to send crypto message for handshake.
4984 crypto_client_stream_factory_.set_handshake_mode(
4985 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
4986
4987 // Socket data for connection on the default network.
4988 MockQuicData socket_data;
4989 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4990 socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
4991 socket_data.AddSocketDataToFactory(socket_factory_.get());
4992
4993 // Socket data for connection on the alternate network.
4994 MockQuicData socket_data2;
4995 quic::QuicStreamOffset header_stream_offset = 0;
4996 socket_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeDummyCHLOPacket(1));
4997 socket_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
4998 // Change the encryption level after handshake is confirmed.
4999 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_FORWARD_SECURE);
5000 socket_data2.AddWrite(
5001 ASYNC, ConstructInitialSettingsPacket(2, &header_stream_offset));
5002 socket_data2.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335003 ASYNC, ConstructGetRequestPacket(
5004 3, GetNthClientInitiatedBidirectionalStreamId(0), true, true,
5005 &header_stream_offset));
Zhongyi Shi8de43832018-08-15 23:40:005006 socket_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:335007 ASYNC,
5008 ConstructOkResponsePacket(
5009 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shi8de43832018-08-15 23:40:005010 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:335011 socket_data2.AddWrite(
5012 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
5013 5, false, GetNthClientInitiatedBidirectionalStreamId(0),
5014 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi8de43832018-08-15 23:40:005015 socket_data2.AddSocketDataToFactory(socket_factory_.get());
5016
Zhongyi Shif3fcbbe62018-08-16 22:52:085017 // Socket data for probing on the default network.
5018 MockQuicData probing_data;
5019 probing_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
5020 probing_data.AddWrite(SYNCHRONOUS,
5021 client_maker_.MakeConnectivityProbingPacket(4, false));
5022 probing_data.AddSocketDataToFactory(socket_factory_.get());
5023
Zhongyi Shi8de43832018-08-15 23:40:005024 // Create request and QuicHttpStream.
5025 QuicStreamRequest request(factory_.get());
5026 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035027 request.Request(
5028 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5029 SocketTag(),
5030 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5031 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi8de43832018-08-15 23:40:005032
5033 base::RunLoop().RunUntilIdle();
5034
5035 // Ensure that session is alive but not active.
5036 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5037 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
5038 QuicChromiumClientSession* session = GetPendingSession(host_port_pair_);
5039 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5040 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
Zhongyi Shia6b68d112018-09-24 07:49:035041 EXPECT_FALSE(failed_on_default_network_);
Zhongyi Shi8de43832018-08-15 23:40:005042
5043 quic::QuicString error_details;
5044 if (quic_error == quic::QUIC_NETWORK_IDLE_TIMEOUT) {
5045 error_details = "No recent network activity.";
5046 } else {
5047 error_details = "Handshake timeout expired.";
5048 }
5049 session->connection()->CloseConnection(
5050 quic_error, error_details, quic::ConnectionCloseBehavior::SILENT_CLOSE);
5051
5052 // A task will be posted to clean up the session in the factory.
5053 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
5054 task_runner->FastForwardUntilNoTasksRemain();
5055
5056 // Verify a new session is created on the alternate network.
5057 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
5058 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5059 QuicChromiumClientSession* session2 = GetPendingSession(host_port_pair_);
5060 EXPECT_NE(session, session2);
Zhongyi Shia6b68d112018-09-24 07:49:035061 EXPECT_TRUE(failed_on_default_network_);
Zhongyi Shi8de43832018-08-15 23:40:005062
5063 // Confirm the handshake on the alternate network.
5064 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
5065 quic::QuicSession::HANDSHAKE_CONFIRMED);
5066 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5067 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5068 // Resume the data now so that data can be sent and read.
5069 socket_data2.Resume();
5070
5071 // Create the stream.
5072 std::unique_ptr<HttpStream> stream = CreateStream(&request);
5073 EXPECT_TRUE(stream.get());
5074 HttpRequestInfo request_info;
5075 request_info.method = "GET";
5076 request_info.url = GURL("https://www.example.org/");
5077 request_info.traffic_annotation =
5078 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5079 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
5080 net_log_, CompletionOnceCallback()));
5081 // Send the request.
5082 HttpResponseInfo response;
5083 HttpRequestHeaders request_headers;
5084 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
5085 callback_.callback()));
5086 // Run the message loop to finish asynchronous mock write.
5087 base::RunLoop().RunUntilIdle();
5088 // Read the response.
5089 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
5090 EXPECT_EQ(200, response.headers->response_code());
5091
Zhongyi Shif3fcbbe62018-08-16 22:52:085092 // There should be a new task posted to migrate back to the default network.
5093 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
5094 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
5095 EXPECT_EQ(base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs),
5096 next_task_delay);
5097 task_runner->FastForwardBy(next_task_delay);
5098
5099 // There should be two tasks posted. One will retry probing and the other
5100 // will retry migrate back.
5101 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
5102 next_task_delay = task_runner->NextPendingTaskDelay();
5103 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
5104 next_task_delay);
5105
5106 // Deliver the signal that the default network is disconnected.
5107 scoped_mock_network_change_notifier_->mock_network_change_notifier()
5108 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
5109 // Verify no connectivity probes will be sent as probing will be cancelled.
5110 task_runner->FastForwardUntilNoTasksRemain();
5111 // Deliver the signal that the alternate network is made default.
5112 scoped_mock_network_change_notifier_->mock_network_change_notifier()
5113 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
5114 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
5115
Zhongyi Shi8de43832018-08-15 23:40:005116 stream.reset();
5117 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5118 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5119 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
5120 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
5121}
5122
Zhongyi Shi247d6322018-07-24 07:03:355123// Test that connection will be closed with PACKET_WRITE_ERROR if a write error
5124// is triggered before handshake is confirmed and connection migration is turned
5125// on.
5126TEST_P(QuicStreamFactoryTest, MigrationOnWriteErrorBeforeHandshakeConfirmed) {
Zhongyi Shi967d2f12019-02-08 20:58:535127 DCHECK(!test_params_.quic_retry_on_alternate_network_before_handshake);
Zhongyi Shi247d6322018-07-24 07:03:355128 InitializeConnectionMigrationV2Test(
5129 {kDefaultNetworkForTests, kNewNetworkForTests});
5130
5131 // Use unmocked crypto stream to do crypto connect.
5132 crypto_client_stream_factory_.set_handshake_mode(
Zhongyi Shi879659422018-08-02 17:58:255133 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
Zhongyi Shi247d6322018-07-24 07:03:355134
5135 MockQuicData socket_data;
5136 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5137 // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect.
5138 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
5139 socket_data.AddSocketDataToFactory(socket_factory_.get());
5140
5141 // Create request, should fail after the write of the CHLO fails.
5142 QuicStreamRequest request(factory_.get());
5143 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035144 request.Request(
5145 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5146 SocketTag(),
5147 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5148 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi247d6322018-07-24 07:03:355149 EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, callback_.WaitForResult());
5150 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5151 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
5152
5153 // Verify new requests can be sent normally.
5154 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:275155 MockCryptoClientStream::COLD_START);
Zhongyi Shi247d6322018-07-24 07:03:355156 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5157 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5158 MockQuicData socket_data2;
5159 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5160 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
5161 socket_data2.AddSocketDataToFactory(socket_factory_.get());
5162
5163 QuicStreamRequest request2(factory_.get());
5164 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035165 request2.Request(
5166 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5167 SocketTag(),
5168 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5169 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi247d6322018-07-24 07:03:355170 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5171 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
5172 // Run the message loop to complete host resolution.
5173 base::RunLoop().RunUntilIdle();
5174
5175 // Complete handshake. QuicStreamFactory::Job should complete and succeed.
5176 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
5177 quic::QuicSession::HANDSHAKE_CONFIRMED);
5178 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5179 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5180 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
5181
5182 // Create QuicHttpStream.
5183 std::unique_ptr<HttpStream> stream = CreateStream(&request2);
5184 EXPECT_TRUE(stream.get());
5185 stream.reset();
5186 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5187 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5188 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
5189 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
5190}
5191
Zhongyi Shif2524bf2019-01-27 07:44:035192// Test that if the original connection is closed with QUIC_PACKET_WRITE_ERROR
5193// before handshake is confirmed and new connection before handshake is turned
5194// on, a new connection will be retried on the alternate network.
5195TEST_P(QuicStreamFactoryTest,
5196 RetryConnectionOnWriteErrorBeforeHandshakeConfirmed) {
Zhongyi Shi967d2f12019-02-08 20:58:535197 test_params_.quic_retry_on_alternate_network_before_handshake = true;
Zhongyi Shif2524bf2019-01-27 07:44:035198 InitializeConnectionMigrationV2Test(
5199 {kDefaultNetworkForTests, kNewNetworkForTests});
5200
5201 // Use unmocked crypto stream to do crypto connect.
5202 crypto_client_stream_factory_.set_handshake_mode(
5203 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
5204
5205 // Socket data for connection on the default network.
5206 MockQuicData socket_data;
5207 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5208 // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect.
5209 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
5210 socket_data.AddSocketDataToFactory(socket_factory_.get());
5211
5212 // Socket data for connection on the alternate network.
5213 MockQuicData socket_data2;
5214 quic::QuicStreamOffset header_stream_offset = 0;
5215 socket_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeDummyCHLOPacket(1));
5216 socket_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
5217 // Change the encryption level after handshake is confirmed.
5218 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_FORWARD_SECURE);
5219 socket_data2.AddWrite(
5220 ASYNC, ConstructInitialSettingsPacket(2, &header_stream_offset));
5221 socket_data2.AddWrite(
5222 ASYNC, ConstructGetRequestPacket(
5223 3, GetNthClientInitiatedBidirectionalStreamId(0), true, true,
5224 &header_stream_offset));
5225 socket_data2.AddRead(
5226 ASYNC,
5227 ConstructOkResponsePacket(
5228 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
5229 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5230 socket_data2.AddWrite(
5231 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
5232 4, false, GetNthClientInitiatedBidirectionalStreamId(0),
5233 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
5234 socket_data2.AddSocketDataToFactory(socket_factory_.get());
5235
5236 // Create request, should fail after the write of the CHLO fails.
5237 QuicStreamRequest request(factory_.get());
5238 EXPECT_EQ(ERR_IO_PENDING,
5239 request.Request(
5240 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5241 SocketTag(),
5242 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5243 failed_on_default_network_callback_, callback_.callback()));
5244 // Ensure that the session is alive but not active.
5245 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5246 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
5247 base::RunLoop().RunUntilIdle();
5248 QuicChromiumClientSession* session = GetPendingSession(host_port_pair_);
5249 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5250
5251 // Confirm the handshake on the alternate network.
5252 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
5253 quic::QuicSession::HANDSHAKE_CONFIRMED);
5254 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5255 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5256
5257 // Resume the data now so that data can be sent and read.
5258 socket_data2.Resume();
5259
5260 // Create the stream.
5261 std::unique_ptr<HttpStream> stream = CreateStream(&request);
5262 EXPECT_TRUE(stream.get());
5263 HttpRequestInfo request_info;
5264 request_info.method = "GET";
5265 request_info.url = GURL("https://www.example.org/");
5266 request_info.traffic_annotation =
5267 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5268 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
5269 net_log_, CompletionOnceCallback()));
5270 // Send the request.
5271 HttpResponseInfo response;
5272 HttpRequestHeaders request_headers;
5273 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
5274 callback_.callback()));
5275 // Run the message loop to finish asynchronous mock write.
5276 base::RunLoop().RunUntilIdle();
5277 // Read the response.
5278 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
5279 EXPECT_EQ(200, response.headers->response_code());
5280
5281 stream.reset();
5282 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5283 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5284 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
5285 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
5286}
5287
jri9f303712016-09-13 01:10:225288void QuicStreamFactoryTestBase::TestMigrationOnWriteError(
5289 IoMode write_error_mode) {
Zhongyi Shi1a054612018-06-14 04:59:085290 InitializeConnectionMigrationV2Test(
jri9f303712016-09-13 01:10:225291 {kDefaultNetworkForTests, kNewNetworkForTests});
5292 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5293 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5294 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5295
Zhongyi Shi3c4c9e92018-07-02 23:16:235296 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
5297
jri9f303712016-09-13 01:10:225298 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:525299 quic::QuicStreamOffset header_stream_offset = 0;
jri9f303712016-09-13 01:10:225300 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
rch5cb522462017-04-25 20:18:365301 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:435302 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
jri9f303712016-09-13 01:10:225303 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:175304 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:225305
5306 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:455307 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:335308 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035309 request.Request(
5310 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5311 SocketTag(),
5312 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5313 failed_on_default_network_callback_, callback_.callback()));
jri9f303712016-09-13 01:10:225314 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:245315 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9f303712016-09-13 01:10:225316 EXPECT_TRUE(stream.get());
5317
5318 // Cause QUIC stream to be created.
5319 HttpRequestInfo request_info;
5320 request_info.method = "GET";
5321 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:395322 request_info.traffic_annotation =
5323 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:275324 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:395325 net_log_, CompletionOnceCallback()));
jri9f303712016-09-13 01:10:225326
5327 // Ensure that session is alive and active.
5328 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5329 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5330 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5331
5332 // Set up second socket data provider that is used after
5333 // migration. The request is rewritten to this new socket, and the
5334 // response to the request is read on this new socket.
5335 MockQuicData socket_data1;
Fan Yang32c5a112018-12-10 20:06:335336 socket_data1.AddWrite(
5337 SYNCHRONOUS, ConstructGetRequestPacket(
5338 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
5339 true, &header_stream_offset));
Zhongyi Shi32f2fd02018-04-16 18:23:435340 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:335341 ASYNC,
5342 ConstructOkResponsePacket(
5343 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
jri9f303712016-09-13 01:10:225344 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:335345 socket_data1.AddWrite(
5346 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
5347 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
5348 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:175349 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:225350
5351 // Send GET request on stream. This should cause a write error, which triggers
5352 // a connection migration attempt.
5353 HttpResponseInfo response;
5354 HttpRequestHeaders request_headers;
5355 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
5356 callback_.callback()));
5357
5358 // Run the message loop so that the migration attempt is executed and
5359 // data queued in the new socket is read by the packet reader.
5360 base::RunLoop().RunUntilIdle();
5361
Zhongyi Shia7dd46b2018-07-12 22:59:295362 // Verify that session is alive and not marked as going awya.
jri9f303712016-09-13 01:10:225363 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:295364 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri9f303712016-09-13 01:10:225365 EXPECT_EQ(1u, session->GetNumActiveStreams());
5366
5367 // Verify that response headers on the migrated socket were delivered to the
5368 // stream.
5369 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
5370 EXPECT_EQ(200, response.headers->response_code());
5371
5372 stream.reset();
5373
5374 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5375 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5376 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
5377 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
5378}
5379
5380TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorSynchronous) {
5381 TestMigrationOnWriteError(SYNCHRONOUS);
5382}
5383
5384TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorAsync) {
5385 TestMigrationOnWriteError(ASYNC);
5386}
5387
5388void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorNoNewNetwork(
5389 IoMode write_error_mode) {
Zhongyi Shi1a054612018-06-14 04:59:085390 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jri9f303712016-09-13 01:10:225391 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5392 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5393
jri5b785512016-09-13 04:29:115394 // Use the test task runner, to force the migration alarm timeout later.
5395 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
5396
jri9f303712016-09-13 01:10:225397 MockQuicData socket_data;
5398 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:435399 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
jri9f303712016-09-13 01:10:225400 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:175401 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:225402
5403 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:455404 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:335405 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035406 request.Request(
5407 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5408 SocketTag(),
5409 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5410 failed_on_default_network_callback_, callback_.callback()));
jri9f303712016-09-13 01:10:225411 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:245412 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9f303712016-09-13 01:10:225413 EXPECT_TRUE(stream.get());
5414
5415 // Cause QUIC stream to be created.
5416 HttpRequestInfo request_info;
5417 request_info.method = "GET";
5418 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:395419 request_info.traffic_annotation =
5420 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:275421 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:395422 net_log_, CompletionOnceCallback()));
jri9f303712016-09-13 01:10:225423
5424 // Ensure that session is alive and active.
5425 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5426 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5427 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5428
jri5b785512016-09-13 04:29:115429 // Send GET request on stream. This causes a write error, which triggers
5430 // a connection migration attempt. Since there are no networks
5431 // to migrate to, this causes the session to wait for a new network.
jri9f303712016-09-13 01:10:225432 HttpResponseInfo response;
5433 HttpRequestHeaders request_headers;
5434 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
5435 callback_.callback()));
jri5b785512016-09-13 04:29:115436
5437 // Complete any pending writes. Pending async MockQuicData writes
5438 // are run on the message loop, not on the test runner.
jri9f303712016-09-13 01:10:225439 base::RunLoop().RunUntilIdle();
jri5b785512016-09-13 04:29:115440
5441 // Write error causes migration task to be posted. Spin the loop.
5442 if (write_error_mode == ASYNC)
5443 runner_->RunNextTask();
5444
5445 // Migration has not yet failed. The session should be alive and active.
5446 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5447 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5448 EXPECT_EQ(1u, session->GetNumActiveStreams());
5449 EXPECT_TRUE(session->connection()->writer()->IsWriteBlocked());
5450
5451 // The migration will not fail until the migration alarm timeout.
5452 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5453 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5454 EXPECT_EQ(1u, session->GetNumActiveStreams());
5455 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
5456
5457 // Force migration alarm timeout to run.
5458 RunTestLoopUntilIdle();
5459
5460 // The connection should be closed. A request for response headers
5461 // should fail.
jri9f303712016-09-13 01:10:225462 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5463 EXPECT_FALSE(HasActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:115464 EXPECT_EQ(ERR_NETWORK_CHANGED, callback_.WaitForResult());
5465 EXPECT_EQ(ERR_NETWORK_CHANGED,
5466 stream->ReadResponseHeaders(callback_.callback()));
jri9f303712016-09-13 01:10:225467
Zhongyi Shi59aaf072019-01-17 03:32:135468 NetErrorDetails error_details;
5469 stream->PopulateNetErrorDetails(&error_details);
5470 EXPECT_EQ(error_details.quic_connection_error,
5471 quic::QUIC_CONNECTION_MIGRATION_NO_NEW_NETWORK);
5472
jri9f303712016-09-13 01:10:225473 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5474 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5475}
5476
5477TEST_P(QuicStreamFactoryTest,
5478 MigrateSessionOnWriteErrorNoNewNetworkSynchronous) {
5479 TestMigrationOnWriteErrorNoNewNetwork(SYNCHRONOUS);
5480}
5481
5482TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorNoNewNetworkAsync) {
5483 TestMigrationOnWriteErrorNoNewNetwork(ASYNC);
5484}
5485
Zhongyi Shi0439ecc72018-07-11 04:41:265486TEST_P(QuicStreamFactoryTest,
5487 MigrateSessionOnWriteErrorWithMultipleRequestsSync) {
5488 TestMigrationOnWriteErrorWithMultipleRequests(SYNCHRONOUS);
5489}
5490
5491TEST_P(QuicStreamFactoryTest,
5492 MigrateSessionOnWriteErrorWithMultipleRequestsAsync) {
5493 TestMigrationOnWriteErrorWithMultipleRequests(ASYNC);
5494}
5495
5496// Sets up a test which verifies that connection migration on write error can
5497// eventually succeed and rewrite the packet on the new network with *multiple*
5498// migratable streams.
5499void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorWithMultipleRequests(
5500 IoMode write_error_mode) {
5501 InitializeConnectionMigrationV2Test(
5502 {kDefaultNetworkForTests, kNewNetworkForTests});
5503 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5504 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5505 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5506
5507 MockQuicData socket_data;
5508 quic::QuicStreamOffset header_stream_offset = 0;
5509 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5510 socket_data.AddWrite(
5511 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
5512 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
5513 socket_data.AddSocketDataToFactory(socket_factory_.get());
5514
5515 // Set up second socket data provider that is used after
5516 // migration. The request is rewritten to this new socket, and the
5517 // response to the request is read on this new socket.
5518 MockQuicData socket_data1;
Zhongyi Shi0439ecc72018-07-11 04:41:265519 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335520 SYNCHRONOUS, ConstructGetRequestPacket(
5521 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
5522 true, &header_stream_offset));
5523 socket_data1.AddRead(
5524 ASYNC,
5525 ConstructOkResponsePacket(
5526 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
5527 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5528 socket_data1.AddWrite(
5529 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
5530 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
5531 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
5532 socket_data1.AddWrite(
5533 SYNCHRONOUS, client_maker_.MakeRstPacket(
5534 4, false, GetNthClientInitiatedBidirectionalStreamId(1),
5535 quic::QUIC_STREAM_CANCELLED, 0));
Zhongyi Shi0439ecc72018-07-11 04:41:265536
5537 socket_data1.AddSocketDataToFactory(socket_factory_.get());
5538
5539 // Create request #1 and QuicHttpStream.
5540 QuicStreamRequest request1(factory_.get());
5541 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035542 request1.Request(
5543 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5544 SocketTag(),
5545 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5546 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265547 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5548 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
5549 EXPECT_TRUE(stream1.get());
5550
5551 HttpRequestInfo request_info1;
5552 request_info1.method = "GET";
5553 request_info1.url = GURL("https://www.example.org/");
5554 request_info1.traffic_annotation =
5555 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5556 EXPECT_EQ(OK,
5557 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
5558 net_log_, CompletionOnceCallback()));
5559
5560 // Second request returns synchronously because it pools to existing session.
5561 TestCompletionCallback callback2;
5562 QuicStreamRequest request2(factory_.get());
5563 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
5564 DEFAULT_PRIORITY, SocketTag(),
5565 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:035566 &net_error_details_,
5567 failed_on_default_network_callback_,
5568 callback2.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265569 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
5570 EXPECT_TRUE(stream2.get());
5571 HttpRequestInfo request_info2;
5572 request_info2.method = "GET";
5573 request_info2.url = GURL("https://www.example.org/");
5574 request_info2.traffic_annotation =
5575 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5576 EXPECT_EQ(OK,
5577 stream2->InitializeStream(&request_info2, true, DEFAULT_PRIORITY,
5578 net_log_, CompletionOnceCallback()));
5579
5580 // Ensure that session is alive and active.
5581 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5582 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5583 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5584 EXPECT_EQ(2u, session->GetNumActiveStreams());
5585
5586 // Send GET request on stream. This should cause a write error, which triggers
5587 // a connection migration attempt.
5588 HttpResponseInfo response;
5589 HttpRequestHeaders request_headers;
5590 EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
5591 callback_.callback()));
5592
5593 // Run the message loop so that the migration attempt is executed and
5594 // data queued in the new socket is read by the packet reader.
5595 base::RunLoop().RunUntilIdle();
5596
Zhongyi Shia7dd46b2018-07-12 22:59:295597 // Verify session is still alive and not marked as going away.
Zhongyi Shi0439ecc72018-07-11 04:41:265598 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:295599 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi0439ecc72018-07-11 04:41:265600 EXPECT_EQ(2u, session->GetNumActiveStreams());
5601
5602 // Verify that response headers on the migrated socket were delivered to the
5603 // stream.
5604 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
5605 EXPECT_EQ(200, response.headers->response_code());
5606
5607 stream1.reset();
5608 stream2.reset();
5609
5610 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5611 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5612 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
5613 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
5614}
5615
5616TEST_P(QuicStreamFactoryTest, MigrateOnWriteErrorWithMixedRequestsSync) {
5617 TestMigrationOnWriteErrorMixedStreams(SYNCHRONOUS);
5618}
5619
5620TEST_P(QuicStreamFactoryTest, MigrateOnWriteErrorWithMixedRequestsAsync) {
5621 TestMigrationOnWriteErrorMixedStreams(ASYNC);
5622}
5623
5624// Sets up a test that verifies connection migration manages to migrate to
5625// alternate network after encountering a SYNC/ASYNC write error based on
5626// |write_error_mode| on the original network.
5627// Note there are mixed types of unfinished requests before migration: one
5628// migratable and one non-migratable. The *migratable* one triggers write
5629// error.
5630void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorMixedStreams(
5631 IoMode write_error_mode) {
5632 InitializeConnectionMigrationV2Test(
5633 {kDefaultNetworkForTests, kNewNetworkForTests});
5634 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5635 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5636 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5637
5638 int packet_number = 1;
5639 MockQuicData socket_data;
5640 quic::QuicStreamOffset header_stream_offset = 0;
5641 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5642 socket_data.AddWrite(
5643 SYNCHRONOUS,
5644 ConstructInitialSettingsPacket(packet_number++, &header_stream_offset));
5645 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
5646 socket_data.AddSocketDataToFactory(socket_factory_.get());
5647
5648 // Set up second socket data provider that is used after
5649 // migration. The request is rewritten to this new socket, and the
5650 // response to the request is read on this new socket.
5651 MockQuicData socket_data1;
5652 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335653 SYNCHRONOUS,
5654 ConstructGetRequestPacket(packet_number++,
5655 GetNthClientInitiatedBidirectionalStreamId(0),
5656 true, true, &header_stream_offset));
Zhongyi Shi0439ecc72018-07-11 04:41:265657 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335658 SYNCHRONOUS,
5659 client_maker_.MakeRstPacket(packet_number++, true,
5660 GetNthClientInitiatedBidirectionalStreamId(1),
5661 quic::QUIC_STREAM_CANCELLED, 0));
Zhongyi Shi0439ecc72018-07-11 04:41:265662 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:335663 ASYNC,
5664 ConstructOkResponsePacket(
5665 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shi0439ecc72018-07-11 04:41:265666 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5667 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335668 SYNCHRONOUS,
5669 client_maker_.MakeAckAndRstPacket(
5670 packet_number++, false, GetNthClientInitiatedBidirectionalStreamId(0),
5671 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi0439ecc72018-07-11 04:41:265672 socket_data1.AddSocketDataToFactory(socket_factory_.get());
5673
5674 // Create request #1 and QuicHttpStream.
5675 QuicStreamRequest request1(factory_.get());
5676 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035677 request1.Request(
5678 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5679 SocketTag(),
5680 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5681 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265682 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5683 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
5684 EXPECT_TRUE(stream1.get());
5685
5686 HttpRequestInfo request_info1;
5687 request_info1.method = "GET";
5688 request_info1.url = GURL("https://www.example.org/");
5689 request_info1.traffic_annotation =
5690 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5691 EXPECT_EQ(OK,
5692 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
5693 net_log_, CompletionOnceCallback()));
5694
5695 // Second request returns synchronously because it pools to existing session.
5696 TestCompletionCallback callback2;
5697 QuicStreamRequest request2(factory_.get());
5698 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
5699 DEFAULT_PRIORITY, SocketTag(),
5700 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:035701 &net_error_details_,
5702 failed_on_default_network_callback_,
5703 callback2.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265704 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
5705 EXPECT_TRUE(stream2.get());
5706
5707 HttpRequestInfo request_info2;
5708 request_info2.method = "GET";
Zhongyi Shibb28b1f2018-07-18 02:41:265709 request_info2.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
Zhongyi Shi0439ecc72018-07-11 04:41:265710 request_info2.url = GURL("https://www.example.org/");
5711 request_info2.traffic_annotation =
5712 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5713 EXPECT_EQ(OK,
5714 stream2->InitializeStream(&request_info2, true, DEFAULT_PRIORITY,
5715 net_log_, CompletionOnceCallback()));
5716
5717 // Ensure that session is alive and active.
5718 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5719 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5720 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5721 EXPECT_EQ(2u, session->GetNumActiveStreams());
5722
5723 // Send GET request on stream 1. This should cause a write error, which
5724 // triggers a connection migration attempt.
5725 HttpResponseInfo response;
5726 HttpRequestHeaders request_headers;
5727 EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
5728 callback_.callback()));
5729
5730 // Run the message loop so that the migration attempt is executed and
5731 // data queued in the new socket is read by the packet reader.
5732 base::RunLoop().RunUntilIdle();
5733
Zhongyi Shia7dd46b2018-07-12 22:59:295734 // Verify that the session is still alive and not marked as going away.
5735 // Non-migratable stream should be closed due to migration.
Zhongyi Shi0439ecc72018-07-11 04:41:265736 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:295737 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi0439ecc72018-07-11 04:41:265738 EXPECT_EQ(1u, session->GetNumActiveStreams());
5739
5740 // Verify that response headers on the migrated socket were delivered to the
5741 // stream.
5742 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
5743 EXPECT_EQ(200, response.headers->response_code());
5744
5745 stream1.reset();
5746
5747 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5748 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5749 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
5750 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
5751}
5752
5753TEST_P(QuicStreamFactoryTest, MigrateOnWriteErrorWithMixedRequests2Sync) {
5754 TestMigrationOnWriteErrorMixedStreams2(SYNCHRONOUS);
5755}
5756
5757TEST_P(QuicStreamFactoryTest, MigrateOnWriteErrorWithMixedRequests2Async) {
5758 TestMigrationOnWriteErrorMixedStreams2(ASYNC);
5759}
5760
5761// The one triggers write error is a non-migratable stream.
5762// Sets up a test that verifies connection migration manages to migrate to
5763// alternate network after encountering a SYNC/ASYNC write error based on
5764// |write_error_mode| on the original network.
5765// Note there are mixed types of unfinished requests before migration: one
5766// migratable and one non-migratable. The *non-migratable* one triggers write
5767// error.
5768void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorMixedStreams2(
5769 IoMode write_error_mode) {
5770 InitializeConnectionMigrationV2Test(
5771 {kDefaultNetworkForTests, kNewNetworkForTests});
5772 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5773 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5774 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5775
5776 int packet_number = 1;
5777 MockQuicData socket_data;
5778 quic::QuicStreamOffset header_stream_offset = 0;
5779 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5780 socket_data.AddWrite(
5781 SYNCHRONOUS,
5782 ConstructInitialSettingsPacket(packet_number++, &header_stream_offset));
5783 socket_data.AddWrite(write_error_mode,
5784 ERR_ADDRESS_UNREACHABLE); // Write error.
5785 socket_data.AddSocketDataToFactory(socket_factory_.get());
5786
5787 // Set up second socket data provider that is used after
5788 // migration. The request is rewritten to this new socket, and the
5789 // response to the request is read on this new socket.
5790 MockQuicData socket_data1;
5791 // The packet triggered writer error will be sent anyway even if the stream
5792 // will be cancelled later.
5793 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335794 SYNCHRONOUS,
5795 ConstructGetRequestPacket(packet_number++,
5796 GetNthClientInitiatedBidirectionalStreamId(1),
5797 true, true, &header_stream_offset));
Zhongyi Shi0439ecc72018-07-11 04:41:265798 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335799 SYNCHRONOUS,
5800 client_maker_.MakeRstPacket(packet_number++, true,
5801 GetNthClientInitiatedBidirectionalStreamId(1),
5802 quic::QUIC_STREAM_CANCELLED, 0));
Zhongyi Shi0439ecc72018-07-11 04:41:265803 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335804 SYNCHRONOUS,
5805 ConstructGetRequestPacket(packet_number++,
5806 GetNthClientInitiatedBidirectionalStreamId(0),
5807 true, true, &header_stream_offset));
Zhongyi Shi0439ecc72018-07-11 04:41:265808 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:335809 ASYNC,
5810 ConstructOkResponsePacket(
5811 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shi0439ecc72018-07-11 04:41:265812 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5813 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335814 SYNCHRONOUS,
5815 client_maker_.MakeAckAndRstPacket(
5816 packet_number++, false, GetNthClientInitiatedBidirectionalStreamId(0),
5817 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi0439ecc72018-07-11 04:41:265818 socket_data1.AddSocketDataToFactory(socket_factory_.get());
5819
5820 // Create request #1 and QuicHttpStream.
5821 QuicStreamRequest request1(factory_.get());
5822 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035823 request1.Request(
5824 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5825 SocketTag(),
5826 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5827 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265828 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5829 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
5830 EXPECT_TRUE(stream1.get());
5831
5832 HttpRequestInfo request_info1;
5833 request_info1.method = "GET";
5834 request_info1.url = GURL("https://www.example.org/");
5835 request_info1.traffic_annotation =
5836 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5837 EXPECT_EQ(OK,
5838 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
5839 net_log_, CompletionOnceCallback()));
5840
5841 // Second request returns synchronously because it pools to existing session.
5842 TestCompletionCallback callback2;
5843 QuicStreamRequest request2(factory_.get());
5844 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
5845 DEFAULT_PRIORITY, SocketTag(),
5846 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:035847 &net_error_details_,
5848 failed_on_default_network_callback_,
5849 callback2.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265850 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
5851 EXPECT_TRUE(stream2.get());
5852
5853 HttpRequestInfo request_info2;
5854 request_info2.method = "GET";
Zhongyi Shibb28b1f2018-07-18 02:41:265855 request_info2.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
Zhongyi Shi0439ecc72018-07-11 04:41:265856 request_info2.url = GURL("https://www.example.org/");
5857 request_info2.traffic_annotation =
5858 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5859 EXPECT_EQ(OK,
5860 stream2->InitializeStream(&request_info2, true, DEFAULT_PRIORITY,
5861 net_log_, CompletionOnceCallback()));
5862
5863 // Ensure that session is alive and active.
5864 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5865 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5866 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5867 EXPECT_EQ(2u, session->GetNumActiveStreams());
5868
5869 // Send GET request on stream 2 which is non-migratable. This should cause a
5870 // write error, which triggers a connection migration attempt.
5871 HttpResponseInfo response2;
5872 HttpRequestHeaders request_headers2;
5873 EXPECT_EQ(OK, stream2->SendRequest(request_headers2, &response2,
5874 callback2.callback()));
5875
5876 // Run the message loop so that the migration attempt is executed and
Zhongyi Shia7dd46b2018-07-12 22:59:295877 // data queued in the new socket is read by the packet reader. Session is
5878 // still alive and not marked as going away, non-migratable stream will be
5879 // closed.
Zhongyi Shi0439ecc72018-07-11 04:41:265880 base::RunLoop().RunUntilIdle();
5881 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:295882 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi0439ecc72018-07-11 04:41:265883 EXPECT_EQ(1u, session->GetNumActiveStreams());
5884
5885 // Send GET request on stream 1.
5886 HttpResponseInfo response;
5887 HttpRequestHeaders request_headers;
5888 EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
5889 callback_.callback()));
5890
5891 base::RunLoop().RunUntilIdle();
5892
5893 // Verify that response headers on the migrated socket were delivered to the
5894 // stream.
5895 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
5896 EXPECT_EQ(200, response.headers->response_code());
5897
5898 stream1.reset();
5899
5900 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5901 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5902 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
5903 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
5904}
5905
jri9f303712016-09-13 01:10:225906void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorNonMigratableStream(
5907 IoMode write_error_mode) {
5908 DVLOG(1) << "Mode: "
5909 << ((write_error_mode == SYNCHRONOUS) ? "SYNCHRONOUS" : "ASYNC");
Zhongyi Shi1a054612018-06-14 04:59:085910 InitializeConnectionMigrationV2Test(
jri9f303712016-09-13 01:10:225911 {kDefaultNetworkForTests, kNewNetworkForTests});
5912 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5913 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5914
5915 MockQuicData socket_data;
5916 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:435917 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
jri9f303712016-09-13 01:10:225918 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:175919 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:225920
5921 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:455922 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:335923 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035924 request.Request(
5925 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5926 SocketTag(),
5927 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5928 failed_on_default_network_callback_, callback_.callback()));
jri9f303712016-09-13 01:10:225929 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:245930 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9f303712016-09-13 01:10:225931 EXPECT_TRUE(stream.get());
5932
5933 // Cause QUIC stream to be created, but marked as non-migratable.
5934 HttpRequestInfo request_info;
Zhongyi Shibb28b1f2018-07-18 02:41:265935 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
jri9f303712016-09-13 01:10:225936 request_info.method = "GET";
5937 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:395938 request_info.traffic_annotation =
5939 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:275940 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:395941 net_log_, CompletionOnceCallback()));
jri9f303712016-09-13 01:10:225942
5943 // Ensure that session is alive and active.
5944 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5945 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5946 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5947
5948 // Send GET request on stream. This should cause a write error, which triggers
5949 // a connection migration attempt.
5950 HttpResponseInfo response;
5951 HttpRequestHeaders request_headers;
5952 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
5953 callback_.callback()));
5954
5955 // Run message loop to execute migration attempt.
5956 base::RunLoop().RunUntilIdle();
5957
5958 // Migration fails, and session is closed and deleted.
5959 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5960 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5961
5962 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5963 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5964}
5965
5966TEST_P(QuicStreamFactoryTest,
5967 MigrateSessionOnWriteErrorNonMigratableStreamSynchronous) {
5968 TestMigrationOnWriteErrorNonMigratableStream(SYNCHRONOUS);
5969}
5970
5971TEST_P(QuicStreamFactoryTest,
5972 MigrateSessionOnWriteErrorNonMigratableStreamAsync) {
5973 TestMigrationOnWriteErrorNonMigratableStream(ASYNC);
5974}
5975
5976void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorMigrationDisabled(
5977 IoMode write_error_mode) {
Zhongyi Shi1a054612018-06-14 04:59:085978 InitializeConnectionMigrationV2Test(
jri9f303712016-09-13 01:10:225979 {kDefaultNetworkForTests, kNewNetworkForTests});
5980 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5981 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5982
5983 MockQuicData socket_data;
5984 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:435985 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
jri9f303712016-09-13 01:10:225986 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:175987 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:225988
5989 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:455990 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:335991 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035992 request.Request(
5993 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5994 SocketTag(),
5995 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5996 failed_on_default_network_callback_, callback_.callback()));
jri9f303712016-09-13 01:10:225997 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:245998 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9f303712016-09-13 01:10:225999 EXPECT_TRUE(stream.get());
6000
6001 // Cause QUIC stream to be created.
6002 HttpRequestInfo request_info;
6003 request_info.method = "GET";
6004 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:396005 request_info.traffic_annotation =
6006 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:276007 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:396008 net_log_, CompletionOnceCallback()));
jri9f303712016-09-13 01:10:226009
6010 // Ensure that session is alive and active.
6011 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6012 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6013 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6014
6015 // Set session config to have connection migration disabled.
Ryan Hamilton8d9ee76e2018-05-29 23:52:526016 quic::test::QuicConfigPeer::SetReceivedDisableConnectionMigration(
6017 session->config());
jri9f303712016-09-13 01:10:226018 EXPECT_TRUE(session->config()->DisableConnectionMigration());
6019
6020 // Send GET request on stream. This should cause a write error, which triggers
6021 // a connection migration attempt.
6022 HttpResponseInfo response;
6023 HttpRequestHeaders request_headers;
6024 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6025 callback_.callback()));
6026 // Run message loop to execute migration attempt.
6027 base::RunLoop().RunUntilIdle();
6028 // Migration fails, and session is closed and deleted.
6029 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6030 EXPECT_FALSE(HasActiveSession(host_port_pair_));
6031 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6032 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6033}
6034
6035TEST_P(QuicStreamFactoryTest,
6036 MigrateSessionOnWriteErrorMigrationDisabledSynchronous) {
6037 TestMigrationOnWriteErrorMigrationDisabled(SYNCHRONOUS);
6038}
6039
6040TEST_P(QuicStreamFactoryTest,
6041 MigrateSessionOnWriteErrorMigrationDisabledAsync) {
6042 TestMigrationOnWriteErrorMigrationDisabled(ASYNC);
6043}
6044
Zhongyi Shi7f1d9212018-06-22 23:24:366045// Sets up a test which verifies that connection migration on write error can
6046// eventually succeed and rewrite the packet on the new network with singals
6047// delivered in the following order (alternate network is always availabe):
6048// - original network encounters a SYNC/ASYNC write error based on
6049// |write_error_mode_on_old_network|, the packet failed to be written is
6050// cached, session migrates immediately to the alternate network.
6051// - an immediate SYNC/ASYNC write error based on
6052// |write_error_mode_on_new_network| is encountered after migration to the
6053// alternate network, session migrates immediately to the original network.
6054// - an immediate SYNC/ASYNC write error based on
6055// |write_error_mode_on_old_network| is encountered after migration to the
6056// original network, session migrates immediately to the alternate network.
6057// - finally, session successfully sends the packet and reads the response on
6058// the alternate network.
6059// TODO(zhongyi): once https://crbug.com/855666 is fixed, this test should be
6060// modified to test that session is closed early if hopping between networks
6061// with consecutive write errors is detected.
jri9f303712016-09-13 01:10:226062void QuicStreamFactoryTestBase::TestMigrationOnMultipleWriteErrors(
Zhongyi Shi7f1d9212018-06-22 23:24:366063 IoMode write_error_mode_on_old_network,
6064 IoMode write_error_mode_on_new_network) {
6065 InitializeConnectionMigrationV2Test(
jri9f303712016-09-13 01:10:226066 {kDefaultNetworkForTests, kNewNetworkForTests});
6067 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6068 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6069 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6070
Zhongyi Shi7f1d9212018-06-22 23:24:366071 // Set up the socket data used by the original network, which encounters a
6072 // write erorr.
6073 MockQuicData socket_data1;
6074 quic::QuicStreamOffset header_stream_offset = 0;
6075 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
6076 socket_data1.AddWrite(
6077 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
6078 socket_data1.AddWrite(write_error_mode_on_old_network,
6079 ERR_ADDRESS_UNREACHABLE); // Write Error
6080 socket_data1.AddSocketDataToFactory(socket_factory_.get());
6081
6082 // Set up the socket data used by the alternate network, which also
6083 // encounters a write error.
6084 MockQuicData failed_quic_data2;
6085 failed_quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
6086 failed_quic_data2.AddWrite(write_error_mode_on_new_network, ERR_FAILED);
6087 failed_quic_data2.AddSocketDataToFactory(socket_factory_.get());
6088
6089 // Set up the third socket data used by original network, which encounters a
6090 // write error again.
6091 MockQuicData failed_quic_data1;
6092 failed_quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
6093 failed_quic_data1.AddWrite(write_error_mode_on_old_network, ERR_FAILED);
6094 failed_quic_data1.AddSocketDataToFactory(socket_factory_.get());
6095
6096 // Set up the last socket data used by the alternate network, which will
6097 // finish migration successfully. The request is rewritten to this new socket,
6098 // and the response to the request is read on this socket.
6099 MockQuicData socket_data2;
Fan Yang32c5a112018-12-10 20:06:336100 socket_data2.AddWrite(
6101 SYNCHRONOUS, ConstructGetRequestPacket(
6102 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
6103 true, &header_stream_offset));
Zhongyi Shi7f1d9212018-06-22 23:24:366104 socket_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:336105 ASYNC,
6106 ConstructOkResponsePacket(
6107 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shi7f1d9212018-06-22 23:24:366108 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:336109 socket_data2.AddWrite(
6110 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
6111 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
6112 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi7f1d9212018-06-22 23:24:366113 socket_data2.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:226114
6115 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:456116 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:336117 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036118 request.Request(
6119 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6120 SocketTag(),
6121 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6122 failed_on_default_network_callback_, callback_.callback()));
jri9f303712016-09-13 01:10:226123 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:246124 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9f303712016-09-13 01:10:226125 EXPECT_TRUE(stream.get());
6126
6127 // Cause QUIC stream to be created.
6128 HttpRequestInfo request_info;
6129 request_info.method = "GET";
6130 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:396131 request_info.traffic_annotation =
6132 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:276133 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:396134 net_log_, CompletionOnceCallback()));
jri9f303712016-09-13 01:10:226135
6136 // Ensure that session is alive and active.
6137 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6138 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6139 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6140
Zhongyi Shi7f1d9212018-06-22 23:24:366141 // Send GET request on stream.
6142 // This should encounter a write error on network 1,
6143 // then migrate to network 2, which encounters another write error,
6144 // and migrate again to network 1, which encoutners one more write error.
6145 // Finally the session migrates to network 2 successfully.
jri9f303712016-09-13 01:10:226146 HttpResponseInfo response;
6147 HttpRequestHeaders request_headers;
6148 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6149 callback_.callback()));
jri9f303712016-09-13 01:10:226150
jri9f303712016-09-13 01:10:226151 base::RunLoop().RunUntilIdle();
Zhongyi Shi7f1d9212018-06-22 23:24:366152 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6153 EXPECT_EQ(1u, session->GetNumActiveStreams());
jri9f303712016-09-13 01:10:226154
Zhongyi Shi7f1d9212018-06-22 23:24:366155 // Verify that response headers on the migrated socket were delivered to the
6156 // stream.
6157 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
6158 EXPECT_EQ(200, response.headers->response_code());
jri9f303712016-09-13 01:10:226159
6160 stream.reset();
Zhongyi Shi7f1d9212018-06-22 23:24:366161 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6162 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
6163 EXPECT_TRUE(failed_quic_data2.AllReadDataConsumed());
6164 EXPECT_TRUE(failed_quic_data2.AllWriteDataConsumed());
6165 EXPECT_TRUE(failed_quic_data1.AllReadDataConsumed());
6166 EXPECT_TRUE(failed_quic_data1.AllWriteDataConsumed());
6167 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
6168 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri9f303712016-09-13 01:10:226169}
6170
6171TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsSyncSync) {
Zhongyi Shi7f1d9212018-06-22 23:24:366172 TestMigrationOnMultipleWriteErrors(
6173 /*write_error_mode_on_old_network*/ SYNCHRONOUS,
6174 /*write_error_mode_on_new_network*/ SYNCHRONOUS);
jri9f303712016-09-13 01:10:226175}
6176
6177TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsSyncAsync) {
Zhongyi Shi7f1d9212018-06-22 23:24:366178 TestMigrationOnMultipleWriteErrors(
6179 /*write_error_mode_on_old_network*/ SYNCHRONOUS,
6180 /*write_error_mode_on_new_network*/ ASYNC);
jri9f303712016-09-13 01:10:226181}
6182
6183TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsAsyncSync) {
Zhongyi Shi7f1d9212018-06-22 23:24:366184 TestMigrationOnMultipleWriteErrors(
6185 /*write_error_mode_on_old_network*/ ASYNC,
6186 /*write_error_mode_on_new_network*/ SYNCHRONOUS);
jri9f303712016-09-13 01:10:226187}
6188
6189TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsAsyncAsync) {
Zhongyi Shi7f1d9212018-06-22 23:24:366190 TestMigrationOnMultipleWriteErrors(
6191 /*write_error_mode_on_old_network*/ ASYNC,
6192 /*write_error_mode_on_new_network*/ ASYNC);
jri9f303712016-09-13 01:10:226193}
6194
Zhongyi Shi6abe33812018-07-24 19:43:116195// Verifies that a connection is closed when connection migration is triggered
6196// on network being disconnected and the handshake is not confirmed.
6197TEST_P(QuicStreamFactoryTest, NoMigrationBeforeHandshakeOnNetworkDisconnected) {
6198 InitializeConnectionMigrationV2Test(
6199 {kDefaultNetworkForTests, kNewNetworkForTests});
6200
Zhongyi Shi879659422018-08-02 17:58:256201 // Use cold start mode to do crypto connect, and send CHLO packet on wire.
Zhongyi Shi6abe33812018-07-24 19:43:116202 crypto_client_stream_factory_.set_handshake_mode(
Zhongyi Shi879659422018-08-02 17:58:256203 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
Zhongyi Shi6abe33812018-07-24 19:43:116204
Zhongyi Shi6abe33812018-07-24 19:43:116205 MockQuicData socket_data;
Zhongyi Shi879659422018-08-02 17:58:256206 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5068bb02018-08-03 02:44:096207 socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
Zhongyi Shi6abe33812018-07-24 19:43:116208 socket_data.AddSocketDataToFactory(socket_factory_.get());
6209
6210 // Create request and QuicHttpStream.
6211 QuicStreamRequest request(factory_.get());
6212 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036213 request.Request(
6214 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6215 SocketTag(),
6216 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6217 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi6abe33812018-07-24 19:43:116218 // Deliver the network notification, which should cause the connection to be
6219 // closed.
6220 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6221 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
6222 EXPECT_EQ(ERR_NETWORK_CHANGED, callback_.WaitForResult());
Zhongyi Shi4293b142018-07-25 00:33:576223
Zhongyi Shi6abe33812018-07-24 19:43:116224 EXPECT_FALSE(HasActiveSession(host_port_pair_));
6225 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
Zhongyi Shi4293b142018-07-25 00:33:576226 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6227 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
Zhongyi Shi6abe33812018-07-24 19:43:116228}
6229
Zhongyi Shib24001c02018-06-18 20:01:526230// Sets up the connection migration test where network change notification is
6231// queued BEFORE connection migration attempt on write error is posted.
6232void QuicStreamFactoryTestBase::
6233 TestMigrationOnNetworkNotificationWithWriteErrorQueuedLater(
6234 bool disconnected) {
6235 InitializeConnectionMigrationV2Test(
jried79618b2016-07-02 03:18:526236 {kDefaultNetworkForTests, kNewNetworkForTests});
6237 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6238 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6239 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6240
rcha00569732016-08-27 11:09:366241 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:526242 quic::QuicStreamOffset header_stream_offset = 0;
rcha00569732016-08-27 11:09:366243 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
rch5cb522462017-04-25 20:18:366244 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:436245 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
rcha00569732016-08-27 11:09:366246 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:176247 socket_data.AddSocketDataToFactory(socket_factory_.get());
jried79618b2016-07-02 03:18:526248
6249 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:456250 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:336251 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036252 request.Request(
6253 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6254 SocketTag(),
6255 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6256 failed_on_default_network_callback_, callback_.callback()));
jried79618b2016-07-02 03:18:526257 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:246258 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jried79618b2016-07-02 03:18:526259 EXPECT_TRUE(stream.get());
6260
6261 // Cause QUIC stream to be created.
6262 HttpRequestInfo request_info;
6263 request_info.method = "GET";
6264 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:396265 request_info.traffic_annotation =
6266 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:276267 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:396268 net_log_, CompletionOnceCallback()));
jried79618b2016-07-02 03:18:526269
6270 // Ensure that session is alive and active.
6271 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6272 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6273 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6274
6275 // Set up second socket data provider that is used after
6276 // migration. The request is rewritten to this new socket, and the
6277 // response to the request is read on this new socket.
rcha00569732016-08-27 11:09:366278 MockQuicData socket_data1;
Fan Yang32c5a112018-12-10 20:06:336279 socket_data1.AddWrite(
6280 SYNCHRONOUS, ConstructGetRequestPacket(
6281 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
6282 true, &header_stream_offset));
Zhongyi Shi32f2fd02018-04-16 18:23:436283 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:336284 ASYNC,
6285 ConstructOkResponsePacket(
6286 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
rcha00569732016-08-27 11:09:366287 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:336288 socket_data1.AddWrite(
6289 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
6290 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
6291 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:176292 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jried79618b2016-07-02 03:18:526293
jri9f303712016-09-13 01:10:226294 // First queue a network change notification in the message loop.
6295 if (disconnected) {
6296 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6297 ->QueueNetworkDisconnected(kDefaultNetworkForTests);
6298 } else {
6299 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6300 ->QueueNetworkMadeDefault(kNewNetworkForTests);
6301 }
6302 // Send GET request on stream. This should cause a write error,
6303 // which triggers a connection migration attempt. This will queue a
6304 // migration attempt behind the notification in the message loop.
jried79618b2016-07-02 03:18:526305 HttpResponseInfo response;
6306 HttpRequestHeaders request_headers;
6307 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6308 callback_.callback()));
6309
jried79618b2016-07-02 03:18:526310 base::RunLoop().RunUntilIdle();
Zhongyi Shia7dd46b2018-07-12 22:59:296311 // Verify the session is still alive and not marked as going away post
6312 // migration.
jried79618b2016-07-02 03:18:526313 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:296314 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jried79618b2016-07-02 03:18:526315 EXPECT_EQ(1u, session->GetNumActiveStreams());
6316
6317 // Verify that response headers on the migrated socket were delivered to the
6318 // stream.
6319 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
6320 EXPECT_EQ(200, response.headers->response_code());
6321
6322 stream.reset();
6323
6324 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6325 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6326 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6327 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
6328}
6329
Zhongyi Shib24001c02018-06-18 20:01:526330// This test verifies that session attempts connection migration successfully
6331// with signals delivered in the following order (alternate network is always
6332// available):
6333// - a notification that default network is disconnected is queued.
6334// - write error is triggered: session posts a task to attempt connection
6335// migration, |migration_pending_| set to true.
6336// - default network disconnected is delivered: session immediately migrates to
6337// the alternate network, |migration_pending_| set to false.
Zhongyi Shif3d6cddb2018-07-11 03:30:026338// - connection migration on write error attempt aborts: writer encountered
6339// error is no longer in active use.
jri9f303712016-09-13 01:10:226340TEST_P(QuicStreamFactoryTest,
Zhongyi Shib24001c02018-06-18 20:01:526341 MigrateOnNetworkDisconnectedWithWriteErrorQueuedLater) {
6342 TestMigrationOnNetworkNotificationWithWriteErrorQueuedLater(
6343 /*disconnected=*/true);
jri9f303712016-09-13 01:10:226344}
6345
Zhongyi Shib24001c02018-06-18 20:01:526346// This test verifies that session attempts connection migration successfully
6347// with signals delivered in the following order (alternate network is always
6348// available):
6349// - a notification that alternate network is made default is queued.
6350// - write error is triggered: session posts a task to attempt connection
6351// migration, block future migrations.
6352// - new default notification is delivered: migrate back timer spins and task is
6353// posted to migrate to the new default network.
6354// - connection migration on write error attempt proceeds successfully: session
6355// is
6356// marked as going away, future migrations unblocked.
6357// - migrate back to default network task executed: session is already on the
6358// default network, no-op.
jri9f303712016-09-13 01:10:226359TEST_P(QuicStreamFactoryTest,
Zhongyi Shib24001c02018-06-18 20:01:526360 MigrateOnWriteErrorWithNetworkMadeDefaultQueuedEarlier) {
6361 TestMigrationOnNetworkNotificationWithWriteErrorQueuedLater(
6362 /*disconnected=*/false);
jri9f303712016-09-13 01:10:226363}
6364
Zhongyi Shi1e2bc742018-06-16 02:06:076365// Sets up the connection migration test where network change notification is
6366// queued AFTER connection migration attempt on write error is posted.
6367void QuicStreamFactoryTestBase::
6368 TestMigrationOnWriteErrorWithNotificationQueuedLater(bool disconnected) {
Zhongyi Shi1a054612018-06-14 04:59:086369 InitializeConnectionMigrationV2Test(
jri9f303712016-09-13 01:10:226370 {kDefaultNetworkForTests, kNewNetworkForTests});
jried79618b2016-07-02 03:18:526371 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6372 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri9f303712016-09-13 01:10:226373 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jried79618b2016-07-02 03:18:526374
rcha00569732016-08-27 11:09:366375 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:526376 quic::QuicStreamOffset header_stream_offset = 0;
rcha00569732016-08-27 11:09:366377 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
rch5cb522462017-04-25 20:18:366378 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:436379 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
rcha00569732016-08-27 11:09:366380 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:176381 socket_data.AddSocketDataToFactory(socket_factory_.get());
jried79618b2016-07-02 03:18:526382
6383 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:456384 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:336385 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036386 request.Request(
6387 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6388 SocketTag(),
6389 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6390 failed_on_default_network_callback_, callback_.callback()));
jried79618b2016-07-02 03:18:526391 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:246392 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jried79618b2016-07-02 03:18:526393 EXPECT_TRUE(stream.get());
6394
6395 // Cause QUIC stream to be created.
6396 HttpRequestInfo request_info;
6397 request_info.method = "GET";
6398 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:396399 request_info.traffic_annotation =
6400 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:276401 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:396402 net_log_, CompletionOnceCallback()));
jried79618b2016-07-02 03:18:526403
6404 // Ensure that session is alive and active.
6405 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6406 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6407 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6408
jri9f303712016-09-13 01:10:226409 // Set up second socket data provider that is used after
6410 // migration. The request is rewritten to this new socket, and the
6411 // response to the request is read on this new socket.
6412 MockQuicData socket_data1;
Fan Yang32c5a112018-12-10 20:06:336413 socket_data1.AddWrite(
6414 SYNCHRONOUS, ConstructGetRequestPacket(
6415 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
6416 true, &header_stream_offset));
Zhongyi Shi32f2fd02018-04-16 18:23:436417 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:336418 ASYNC,
6419 ConstructOkResponsePacket(
6420 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
jri9f303712016-09-13 01:10:226421 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:336422 socket_data1.AddWrite(
6423 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
6424 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
6425 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:176426 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:226427
6428 // Send GET request on stream. This should cause a write error,
6429 // which triggers a connection migration attempt. This will queue a
6430 // migration attempt in the message loop.
jried79618b2016-07-02 03:18:526431 HttpResponseInfo response;
6432 HttpRequestHeaders request_headers;
jri9f303712016-09-13 01:10:226433 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6434 callback_.callback()));
jried79618b2016-07-02 03:18:526435
jri9f303712016-09-13 01:10:226436 // Now queue a network change notification in the message loop behind
6437 // the migration attempt.
6438 if (disconnected) {
6439 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6440 ->QueueNetworkDisconnected(kDefaultNetworkForTests);
6441 } else {
6442 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6443 ->QueueNetworkMadeDefault(kNewNetworkForTests);
6444 }
6445
6446 base::RunLoop().RunUntilIdle();
Zhongyi Shia7dd46b2018-07-12 22:59:296447 // Verify session is still alive and not marked as going away.
jri9f303712016-09-13 01:10:226448 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:296449 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri9f303712016-09-13 01:10:226450 EXPECT_EQ(1u, session->GetNumActiveStreams());
6451
6452 // Verify that response headers on the migrated socket were delivered to the
6453 // stream.
6454 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
6455 EXPECT_EQ(200, response.headers->response_code());
6456
6457 stream.reset();
jried79618b2016-07-02 03:18:526458
6459 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6460 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
jri9f303712016-09-13 01:10:226461 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6462 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
jried79618b2016-07-02 03:18:526463}
6464
Zhongyi Shi1e2bc742018-06-16 02:06:076465// This test verifies that session attempts connection migration successfully
6466// with signals delivered in the following order (alternate network is always
6467// available):
6468// - write error is triggered: session posts a task to complete connection
6469// migration.
6470// - a notification that alternate network is made default is queued.
6471// - connection migration attempt proceeds successfully, session is marked as
6472// going away.
6473// - new default notification is delivered after connection migration has been
6474// completed.
jri9f303712016-09-13 01:10:226475TEST_P(QuicStreamFactoryTest,
Zhongyi Shi1e2bc742018-06-16 02:06:076476 MigrateOnWriteErrorWithNetworkMadeDefaultQueuedLater) {
6477 TestMigrationOnWriteErrorWithNotificationQueuedLater(/*disconnected=*/false);
jried79618b2016-07-02 03:18:526478}
6479
Zhongyi Shi1e2bc742018-06-16 02:06:076480// This test verifies that session attempts connection migration successfully
6481// with signals delivered in the following order (alternate network is always
6482// available):
6483// - write error is triggered: session posts a task to complete connection
6484// migration.
6485// - a notification that default network is diconnected is queued.
6486// - connection migration attempt proceeds successfully, session is marked as
6487// going away.
6488// - disconnect notification is delivered after connection migration has been
6489// completed.
jri9f303712016-09-13 01:10:226490TEST_P(QuicStreamFactoryTest,
Zhongyi Shi1e2bc742018-06-16 02:06:076491 MigrateOnWriteErrorWithNetworkDisconnectedQueuedLater) {
6492 TestMigrationOnWriteErrorWithNotificationQueuedLater(/*disconnected=*/true);
jried79618b2016-07-02 03:18:526493}
6494
Zhongyi Shia3810c52018-06-15 23:07:196495// This tests connection migration on write error with signals delivered in the
6496// following order:
6497// - a synchronous/asynchronous write error is triggered base on
Zhongyi Shif3d6cddb2018-07-11 03:30:026498// |write_error_mode|: connection migration attempt is posted.
6499// - old default network disconnects, migration waits for a new network.
Zhongyi Shia3810c52018-06-15 23:07:196500// - after a pause, new network is connected: session will migrate to new
6501// network immediately.
Zhongyi Shif3d6cddb2018-07-11 03:30:026502// - migration on writer error is exectued and aborts as writer passed in is no
6503// longer active in use.
Zhongyi Shia3810c52018-06-15 23:07:196504// - new network is made default.
jri5b785512016-09-13 04:29:116505void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorPauseBeforeConnected(
6506 IoMode write_error_mode) {
Zhongyi Shia3810c52018-06-15 23:07:196507 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jri5b785512016-09-13 04:29:116508 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6509 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6510 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6511
Zhongyi Shia3810c52018-06-15 23:07:196512 // Use the test task runner.
6513 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
6514
jri5b785512016-09-13 04:29:116515 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:526516 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shia3810c52018-06-15 23:07:196517 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
rch5cb522462017-04-25 20:18:366518 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:436519 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
Zhongyi Shia3810c52018-06-15 23:07:196520 socket_data.AddWrite(write_error_mode, ERR_FAILED);
Zhongyi Shi5f587cc2017-11-21 23:24:176521 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri5b785512016-09-13 04:29:116522
6523 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:456524 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:336525 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036526 request.Request(
6527 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6528 SocketTag(),
6529 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6530 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shia3810c52018-06-15 23:07:196531 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:246532 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri5b785512016-09-13 04:29:116533 EXPECT_TRUE(stream.get());
6534
6535 // Cause QUIC stream to be created.
6536 HttpRequestInfo request_info;
6537 request_info.method = "GET";
Zhongyi Shia3810c52018-06-15 23:07:196538 request_info.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:396539 request_info.traffic_annotation =
6540 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:276541 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:396542 net_log_, CompletionOnceCallback()));
jri5b785512016-09-13 04:29:116543
6544 // Ensure that session is alive and active.
6545 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6546 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6547 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6548
Zhongyi Shia3810c52018-06-15 23:07:196549 // Send GET request on stream.
jri5b785512016-09-13 04:29:116550 HttpResponseInfo response;
6551 HttpRequestHeaders request_headers;
6552 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6553 callback_.callback()));
6554
Zhongyi Shia3810c52018-06-15 23:07:196555 // The connection should still be alive, not marked as going away.
jri5b785512016-09-13 04:29:116556 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6557 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6558 EXPECT_EQ(1u, session->GetNumActiveStreams());
6559 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
6560
Zhongyi Shia3810c52018-06-15 23:07:196561 // Set up second socket data provider that is used after migration.
6562 // The response to the earlier request is read on this new socket.
jri5b785512016-09-13 04:29:116563 MockQuicData socket_data1;
Fan Yang32c5a112018-12-10 20:06:336564 socket_data1.AddWrite(
6565 SYNCHRONOUS, ConstructGetRequestPacket(
6566 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
6567 true, &header_stream_offset));
Zhongyi Shi32f2fd02018-04-16 18:23:436568 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:336569 ASYNC,
6570 ConstructOkResponsePacket(
6571 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
jri5b785512016-09-13 04:29:116572 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:336573 socket_data1.AddWrite(
6574 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
6575 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
6576 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:176577 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri5b785512016-09-13 04:29:116578
Zhongyi Shia3810c52018-06-15 23:07:196579 // On a DISCONNECTED notification, nothing happens.
6580 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6581 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
6582 // Add a new network and notify the stream factory of a new connected network.
6583 // This causes a PING packet to be sent over the new network.
jri5b785512016-09-13 04:29:116584 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6585 ->SetConnectedNetworksList({kNewNetworkForTests});
6586 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6587 ->NotifyNetworkConnected(kNewNetworkForTests);
6588
Zhongyi Shia3810c52018-06-15 23:07:196589 // Ensure that the session is still alive.
jri5b785512016-09-13 04:29:116590 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia3810c52018-06-15 23:07:196591 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:116592 EXPECT_EQ(1u, session->GetNumActiveStreams());
6593
Zhongyi Shia3810c52018-06-15 23:07:196594 // Run the message loop migration for write error can finish.
6595 runner_->RunUntilIdle();
6596
6597 // Response headers are received over the new network.
jri5b785512016-09-13 04:29:116598 EXPECT_THAT(callback_.WaitForResult(), IsOk());
6599 EXPECT_EQ(200, response.headers->response_code());
6600
Zhongyi Shia3810c52018-06-15 23:07:196601 // Check that the session is still alive.
6602 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
jri5b785512016-09-13 04:29:116603 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shia3810c52018-06-15 23:07:196604
6605 // There should be no posted tasks not executed, no way to migrate back to
6606 // default network.
6607 EXPECT_TRUE(runner_->GetPostedTasks().empty());
6608
6609 // Receive signal to mark new network as default.
6610 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6611 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
jri5b785512016-09-13 04:29:116612
6613 stream.reset();
jri5b785512016-09-13 04:29:116614 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6615 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6616 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6617 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
jri5b785512016-09-13 04:29:116618}
6619
6620TEST_P(QuicStreamFactoryTest,
Zhongyi Shia3810c52018-06-15 23:07:196621 MigrateSessionOnSyncWriteErrorPauseBeforeConnected) {
jri5b785512016-09-13 04:29:116622 TestMigrationOnWriteErrorPauseBeforeConnected(SYNCHRONOUS);
6623}
6624
6625TEST_P(QuicStreamFactoryTest,
Zhongyi Shia3810c52018-06-15 23:07:196626 MigrateSessionOnAsyncWriteErrorPauseBeforeConnected) {
jri5b785512016-09-13 04:29:116627 TestMigrationOnWriteErrorPauseBeforeConnected(ASYNC);
6628}
6629
Zhongyi Shif3d6cddb2018-07-11 03:30:026630// This test verifies that when session successfully migrate to the alternate
6631// network, packet write error on the old writer will be ignored and will not
6632// trigger connection migration on write error.
6633TEST_P(QuicStreamFactoryTest, IgnoreWriteErrorFromOldWriterAfterMigration) {
6634 InitializeConnectionMigrationV2Test(
6635 {kDefaultNetworkForTests, kNewNetworkForTests});
6636 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6637 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6638 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6639
6640 // Using a testing task runner so that we can verify whether the migrate on
6641 // write error task is posted.
6642 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
6643 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
6644
6645 MockQuicData socket_data;
6646 quic::QuicStreamOffset header_stream_offset = 0;
6647 socket_data.AddWrite(
6648 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
6649 socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
6650 socket_data.AddWrite(ASYNC, ERR_ADDRESS_UNREACHABLE);
6651 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
6652 socket_data.AddSocketDataToFactory(socket_factory_.get());
6653
6654 // Create request and QuicHttpStream.
6655 QuicStreamRequest request(factory_.get());
6656 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036657 request.Request(
6658 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6659 SocketTag(),
6660 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6661 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shif3d6cddb2018-07-11 03:30:026662 EXPECT_EQ(OK, callback_.WaitForResult());
6663 std::unique_ptr<HttpStream> stream = CreateStream(&request);
6664 EXPECT_TRUE(stream.get());
6665
6666 // Cause QUIC stream to be created.
6667 HttpRequestInfo request_info;
6668 request_info.method = "GET";
6669 request_info.url = GURL("https://www.example.org/");
6670 request_info.traffic_annotation =
6671 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
6672 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
6673 net_log_, CompletionOnceCallback()));
6674
6675 // Ensure that session is alive and active.
6676 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6677 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6678 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6679
6680 // Set up second socket data provider that is used after
6681 // migration. The response to the request is read on this new socket.
6682 MockQuicData socket_data1;
6683 socket_data1.AddWrite(
6684 SYNCHRONOUS, client_maker_.MakePingPacket(3, /*include_version=*/true));
6685 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:336686 ASYNC,
6687 ConstructOkResponsePacket(
6688 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shif3d6cddb2018-07-11 03:30:026689 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:336690 socket_data1.AddWrite(
6691 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
6692 4, false, GetNthClientInitiatedBidirectionalStreamId(0),
6693 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shif3d6cddb2018-07-11 03:30:026694 socket_data1.AddSocketDataToFactory(socket_factory_.get());
6695
6696 // Send GET request on stream.
6697 HttpResponseInfo response;
6698 HttpRequestHeaders request_headers;
6699 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6700 callback_.callback()));
6701
6702 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
6703 // Now notify network is disconnected, cause the migration to complete
6704 // immediately.
6705 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6706 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
6707 // There will be two pending task, one will complete migration with no delay
6708 // and the other will attempt to migrate back to the default network with
6709 // delay.
6710 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
6711
6712 // Complete migration.
6713 task_runner->RunUntilIdle();
6714 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
6715
6716 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6717 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6718 EXPECT_EQ(1u, session->GetNumActiveStreams());
6719
6720 // Verify that response headers on the migrated socket were delivered to the
6721 // stream.
6722 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
6723 EXPECT_EQ(200, response.headers->response_code());
6724
6725 // Resume the old socket data, a write error will be delivered to the old
6726 // packet writer. Verify no additional task is posted.
6727 socket_data.Resume();
6728 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
6729
6730 stream.reset();
6731 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6732 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6733 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
6734}
6735
6736// This test verifies that when session successfully migrate to the alternate
6737// network, packet read error on the old reader will be ignored and will not
6738// close the connection.
6739TEST_P(QuicStreamFactoryTest, IgnoreReadErrorFromOldReaderAfterMigration) {
6740 InitializeConnectionMigrationV2Test(
6741 {kDefaultNetworkForTests, kNewNetworkForTests});
6742 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6743 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6744 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6745
6746 // Using a testing task runner.
6747 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
6748 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
6749
6750 MockQuicData socket_data;
6751 quic::QuicStreamOffset header_stream_offset = 0;
6752 socket_data.AddWrite(
6753 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
6754 socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
6755 socket_data.AddRead(ASYNC, ERR_ADDRESS_UNREACHABLE);
6756 socket_data.AddSocketDataToFactory(socket_factory_.get());
6757
6758 // Create request and QuicHttpStream.
6759 QuicStreamRequest request(factory_.get());
6760 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036761 request.Request(
6762 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6763 SocketTag(),
6764 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6765 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shif3d6cddb2018-07-11 03:30:026766 EXPECT_EQ(OK, callback_.WaitForResult());
6767 std::unique_ptr<HttpStream> stream = CreateStream(&request);
6768 EXPECT_TRUE(stream.get());
6769
6770 // Cause QUIC stream to be created.
6771 HttpRequestInfo request_info;
6772 request_info.method = "GET";
6773 request_info.url = GURL("https://www.example.org/");
6774 request_info.traffic_annotation =
6775 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
6776 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
6777 net_log_, CompletionOnceCallback()));
6778
6779 // Ensure that session is alive and active.
6780 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6781 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6782 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6783
6784 // Set up second socket data provider that is used after
6785 // migration. The request is written to this new socket, and the
6786 // response to the request is read on this new socket.
6787 MockQuicData socket_data1;
6788 socket_data1.AddWrite(
6789 SYNCHRONOUS, client_maker_.MakePingPacket(2, /*include_version=*/true));
Fan Yang32c5a112018-12-10 20:06:336790 socket_data1.AddWrite(
6791 SYNCHRONOUS, ConstructGetRequestPacket(
6792 3, GetNthClientInitiatedBidirectionalStreamId(0), true,
6793 true, &header_stream_offset));
Zhongyi Shif3d6cddb2018-07-11 03:30:026794 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:336795 ASYNC,
6796 ConstructOkResponsePacket(
6797 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shif3d6cddb2018-07-11 03:30:026798 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:336799 socket_data1.AddWrite(
6800 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
6801 4, false, GetNthClientInitiatedBidirectionalStreamId(0),
6802 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shif3d6cddb2018-07-11 03:30:026803 socket_data1.AddSocketDataToFactory(socket_factory_.get());
6804
6805 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
6806 // Now notify network is disconnected, cause the migration to complete
6807 // immediately.
6808 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6809 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
6810 // There will be two pending task, one will complete migration with no delay
6811 // and the other will attempt to migrate back to the default network with
6812 // delay.
6813 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
6814
6815 // Complete migration.
6816 task_runner->RunUntilIdle();
6817 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
6818
6819 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6820 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6821 EXPECT_EQ(1u, session->GetNumActiveStreams());
6822
6823 // Send GET request on stream.
6824 HttpResponseInfo response;
6825 HttpRequestHeaders request_headers;
6826 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6827 callback_.callback()));
6828
6829 // Verify that response headers on the migrated socket were delivered to the
6830 // stream.
6831 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
6832 EXPECT_EQ(OK, callback_.WaitForResult());
6833 EXPECT_EQ(200, response.headers->response_code());
6834
6835 // Resume the old socket data, a read error will be delivered to the old
6836 // packet reader. Verify that the session is not affected.
6837 socket_data.Resume();
6838 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
6839 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6840 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6841 EXPECT_EQ(1u, session->GetNumActiveStreams());
6842
6843 stream.reset();
6844 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6845 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6846 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6847 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
6848}
6849
6850// This test verifies that after migration on network is executed, packet
6851// read error on the old reader will be ignored and will not close the
6852// connection.
6853TEST_P(QuicStreamFactoryTest, IgnoreReadErrorOnOldReaderDuringMigration) {
6854 InitializeConnectionMigrationV2Test(
6855 {kDefaultNetworkForTests, kNewNetworkForTests});
6856 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6857 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6858 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6859
6860 // Using a testing task runner.
6861 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
6862 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
6863
6864 MockQuicData socket_data;
6865 quic::QuicStreamOffset header_stream_offset = 0;
6866 socket_data.AddWrite(
6867 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
6868 socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
6869 socket_data.AddRead(ASYNC, ERR_ADDRESS_UNREACHABLE);
6870 socket_data.AddSocketDataToFactory(socket_factory_.get());
6871
6872 // Create request and QuicHttpStream.
6873 QuicStreamRequest request(factory_.get());
6874 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036875 request.Request(
6876 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6877 SocketTag(),
6878 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6879 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shif3d6cddb2018-07-11 03:30:026880 EXPECT_EQ(OK, callback_.WaitForResult());
6881 std::unique_ptr<HttpStream> stream = CreateStream(&request);
6882 EXPECT_TRUE(stream.get());
6883
6884 // Cause QUIC stream to be created.
6885 HttpRequestInfo request_info;
6886 request_info.method = "GET";
6887 request_info.url = GURL("https://www.example.org/");
6888 request_info.traffic_annotation =
6889 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
6890 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
6891 net_log_, CompletionOnceCallback()));
6892
6893 // Ensure that session is alive and active.
6894 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6895 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6896 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6897
6898 // Set up second socket data provider that is used after
6899 // migration. The request is written to this new socket, and the
6900 // response to the request is read on this new socket.
6901 MockQuicData socket_data1;
6902 socket_data1.AddWrite(
6903 SYNCHRONOUS, client_maker_.MakePingPacket(2, /*include_version=*/true));
Fan Yang32c5a112018-12-10 20:06:336904 socket_data1.AddWrite(
6905 SYNCHRONOUS, ConstructGetRequestPacket(
6906 3, GetNthClientInitiatedBidirectionalStreamId(0), true,
6907 true, &header_stream_offset));
Zhongyi Shif3d6cddb2018-07-11 03:30:026908 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:336909 ASYNC,
6910 ConstructOkResponsePacket(
6911 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shif3d6cddb2018-07-11 03:30:026912 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:336913 socket_data1.AddWrite(
6914 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
6915 4, false, GetNthClientInitiatedBidirectionalStreamId(0),
6916 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shif3d6cddb2018-07-11 03:30:026917 socket_data1.AddSocketDataToFactory(socket_factory_.get());
6918
6919 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
6920 // Now notify network is disconnected, cause the migration to complete
6921 // immediately.
6922 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6923 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
6924 // There will be two pending task, one will complete migration with no delay
6925 // and the other will attempt to migrate back to the default network with
6926 // delay.
6927 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
6928
6929 // Resume the old socket data, a read error will be delivered to the old
6930 // packet reader. Verify that the session is not affected.
6931 socket_data.Resume();
6932 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
6933 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6934 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6935 EXPECT_EQ(1u, session->GetNumActiveStreams());
6936
6937 // Complete migration.
6938 task_runner->RunUntilIdle();
6939 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
6940
6941 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6942 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6943 EXPECT_EQ(1u, session->GetNumActiveStreams());
6944
6945 // Send GET request on stream.
6946 HttpResponseInfo response;
6947 HttpRequestHeaders request_headers;
6948 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6949 callback_.callback()));
6950
6951 // Verify that response headers on the migrated socket were delivered to the
6952 // stream.
6953 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
6954 EXPECT_EQ(OK, callback_.WaitForResult());
6955 EXPECT_EQ(200, response.headers->response_code());
6956
6957 stream.reset();
6958 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6959 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6960 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6961 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
6962}
6963
6964// This test verifies that after migration on write error is posted, packet
6965// read error on the old reader will be ignored and will not close the
6966// connection.
6967TEST_P(QuicStreamFactoryTest,
6968 IgnoreReadErrorOnOldReaderDuringPendingMigrationOnWriteError) {
6969 InitializeConnectionMigrationV2Test(
6970 {kDefaultNetworkForTests, kNewNetworkForTests});
6971 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6972 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6973 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6974
6975 // Using a testing task runner.
6976 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
6977 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
6978
6979 MockQuicData socket_data;
6980 quic::QuicStreamOffset header_stream_offset = 0;
6981 socket_data.AddWrite(
6982 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
6983 socket_data.AddWrite(ASYNC, ERR_FAILED); // Write error.
6984 socket_data.AddRead(ASYNC, ERR_ADDRESS_UNREACHABLE); // Read error.
6985 socket_data.AddSocketDataToFactory(socket_factory_.get());
6986
6987 // Create request and QuicHttpStream.
6988 QuicStreamRequest request(factory_.get());
6989 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036990 request.Request(
6991 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6992 SocketTag(),
6993 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6994 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shif3d6cddb2018-07-11 03:30:026995 EXPECT_EQ(OK, callback_.WaitForResult());
6996 std::unique_ptr<HttpStream> stream = CreateStream(&request);
6997 EXPECT_TRUE(stream.get());
6998
6999 // Cause QUIC stream to be created.
7000 HttpRequestInfo request_info;
7001 request_info.method = "GET";
7002 request_info.url = GURL("https://www.example.org/");
7003 request_info.traffic_annotation =
7004 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
7005 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
7006 net_log_, CompletionOnceCallback()));
7007
7008 // Ensure that session is alive and active.
7009 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
7010 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7011 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7012
7013 // Set up second socket data provider that is used after
7014 // migration. The request is written to this new socket, and the
7015 // response to the request is read on this new socket.
7016 MockQuicData socket_data1;
Fan Yang32c5a112018-12-10 20:06:337017 socket_data1.AddWrite(
7018 SYNCHRONOUS, ConstructGetRequestPacket(
7019 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
7020 true, &header_stream_offset));
Zhongyi Shif3d6cddb2018-07-11 03:30:027021 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:337022 ASYNC,
7023 ConstructOkResponsePacket(
7024 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shif3d6cddb2018-07-11 03:30:027025
7026 socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
7027 socket_data1.AddRead(ASYNC, ERR_FAILED); // Read error to close connection.
7028 socket_data1.AddSocketDataToFactory(socket_factory_.get());
7029
7030 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
7031 // Send GET request on stream.
7032 HttpResponseInfo response;
7033 HttpRequestHeaders request_headers;
7034 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
7035 callback_.callback()));
7036 // Run the message loop to complete asynchronous write and read with errors.
7037 base::RunLoop().RunUntilIdle();
7038 // There will be one pending task to complete migration on write error.
7039 // Verify session is not closed with read error.
7040 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
7041 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7042 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7043 EXPECT_EQ(1u, session->GetNumActiveStreams());
7044
7045 // Complete migration.
7046 task_runner->RunUntilIdle();
Zhongyi Shia7dd46b2018-07-12 22:59:297047 // There will be one more task posted attempting to migrate back to the
7048 // default network.
7049 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
Zhongyi Shif3d6cddb2018-07-11 03:30:027050 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:297051 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shif3d6cddb2018-07-11 03:30:027052 EXPECT_EQ(1u, session->GetNumActiveStreams());
7053
7054 // Verify that response headers on the migrated socket were delivered to the
7055 // stream.
7056 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
7057 EXPECT_EQ(200, response.headers->response_code());
7058
7059 // Resume to consume the read error on new socket, which will close
7060 // the connection.
7061 socket_data1.Resume();
7062
7063 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7064 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7065 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
7066 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
7067}
7068
Zhongyi Shi4ac9e1f2018-06-21 05:21:477069// Migrate on asynchronous write error, old network disconnects after alternate
7070// network connects.
7071TEST_P(QuicStreamFactoryTest,
7072 MigrateSessionOnWriteErrorWithDisconnectAfterConnectAysnc) {
7073 TestMigrationOnWriteErrorWithMultipleNotifications(
7074 ASYNC, /*disconnect_before_connect*/ false);
7075}
7076
7077// Migrate on synchronous write error, old network disconnects after alternate
7078// network connects.
7079TEST_P(QuicStreamFactoryTest,
7080 MigrateSessionOnWriteErrorWithDisconnectAfterConnectSync) {
7081 TestMigrationOnWriteErrorWithMultipleNotifications(
7082 SYNCHRONOUS, /*disconnect_before_connect*/ false);
7083}
7084
7085// Migrate on asynchronous write error, old network disconnects before alternate
7086// network connects.
7087TEST_P(QuicStreamFactoryTest,
7088 MigrateSessionOnWriteErrorWithDisconnectBeforeConnectAysnc) {
7089 TestMigrationOnWriteErrorWithMultipleNotifications(
7090 ASYNC, /*disconnect_before_connect*/ true);
7091}
7092
7093// Migrate on synchronous write error, old network disconnects before alternate
7094// network connects.
7095TEST_P(QuicStreamFactoryTest,
7096 MigrateSessionOnWriteErrorWithDisconnectBeforeConnectSync) {
7097 TestMigrationOnWriteErrorWithMultipleNotifications(
7098 SYNCHRONOUS, /*disconnect_before_connect*/ true);
7099}
7100
7101// Setps up test which verifies that session successfully migrate to alternate
7102// network with signals delivered in the following order:
7103// *NOTE* Signal (A) and (B) can reverse order based on
7104// |disconnect_before_connect|.
7105// - (No alternate network is connected) session connects to
7106// kDefaultNetworkForTests.
7107// - An async/sync write error is encountered based on |write_error_mode|:
7108// session posted task to migrate session on write error.
7109// - Posted task is executed, miration moves to pending state due to lack of
7110// alternate network.
7111// - (A) An alternate network is connected, pending migration completes.
7112// - (B) Old default network disconnects, no migration will be attempted as
Zhongyi Shi329f5cbd2018-06-22 23:51:187113// session has already migrate to the alternate network.
Zhongyi Shi4ac9e1f2018-06-21 05:21:477114// - The alternate network is made default.
jri5b785512016-09-13 04:29:117115void QuicStreamFactoryTestBase::
Zhongyi Shi4ac9e1f2018-06-21 05:21:477116 TestMigrationOnWriteErrorWithMultipleNotifications(
jri5b785512016-09-13 04:29:117117 IoMode write_error_mode,
Zhongyi Shi4ac9e1f2018-06-21 05:21:477118 bool disconnect_before_connect) {
Zhongyi Shi329f5cbd2018-06-22 23:51:187119 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jri5b785512016-09-13 04:29:117120 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7121 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7122 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7123
7124 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:527125 quic::QuicStreamOffset header_stream_offset = 0;
jri5b785512016-09-13 04:29:117126 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
rch5cb522462017-04-25 20:18:367127 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:437128 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
Zhongyi Shi4ac9e1f2018-06-21 05:21:477129 socket_data.AddWrite(write_error_mode, ERR_FAILED); // Write error.
Zhongyi Shi5f587cc2017-11-21 23:24:177130 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri5b785512016-09-13 04:29:117131
7132 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:457133 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337134 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037135 request.Request(
7136 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7137 SocketTag(),
7138 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7139 failed_on_default_network_callback_, callback_.callback()));
jri5b785512016-09-13 04:29:117140 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:247141 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri5b785512016-09-13 04:29:117142 EXPECT_TRUE(stream.get());
7143
7144 // Cause QUIC stream to be created.
7145 HttpRequestInfo request_info;
7146 request_info.method = "GET";
7147 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:397148 request_info.traffic_annotation =
7149 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:277150 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:397151 net_log_, CompletionOnceCallback()));
jri5b785512016-09-13 04:29:117152
7153 // Ensure that session is alive and active.
7154 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
7155 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7156 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7157
7158 // Send GET request on stream. This should cause a write error, which triggers
7159 // a connection migration attempt.
7160 HttpResponseInfo response;
7161 HttpRequestHeaders request_headers;
7162 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
7163 callback_.callback()));
Zhongyi Shi4ac9e1f2018-06-21 05:21:477164 // Run the message loop so that posted task to migrate to socket will be
7165 // executed. A new task will be posted to wait for a new network.
jri5b785512016-09-13 04:29:117166 base::RunLoop().RunUntilIdle();
7167
7168 // In this particular code path, the network will not yet be marked
7169 // as going away and the session will still be alive.
7170 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7171 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7172 EXPECT_EQ(1u, session->GetNumActiveStreams());
7173 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
7174
7175 // Set up second socket data provider that is used after
7176 // migration. The request is rewritten to this new socket, and the
7177 // response to the request is read on this new socket.
7178 MockQuicData socket_data1;
Fan Yang32c5a112018-12-10 20:06:337179 socket_data1.AddWrite(
7180 SYNCHRONOUS, ConstructGetRequestPacket(
7181 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
7182 true, &header_stream_offset));
Zhongyi Shi32f2fd02018-04-16 18:23:437183 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:337184 ASYNC,
7185 ConstructOkResponsePacket(
7186 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
jri5b785512016-09-13 04:29:117187 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:337188 socket_data1.AddWrite(
7189 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
7190 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
7191 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:177192 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri5b785512016-09-13 04:29:117193
7194 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7195 ->SetConnectedNetworksList(
7196 {kDefaultNetworkForTests, kNewNetworkForTests});
Zhongyi Shi4ac9e1f2018-06-21 05:21:477197 if (disconnect_before_connect) {
7198 // Now deliver a DISCONNECT notification.
jri5b785512016-09-13 04:29:117199 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7200 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
Zhongyi Shi4ac9e1f2018-06-21 05:21:477201
7202 // Now deliver a CONNECTED notification and completes migration.
jri5b785512016-09-13 04:29:117203 scoped_mock_network_change_notifier_->mock_network_change_notifier()
Zhongyi Shi4ac9e1f2018-06-21 05:21:477204 ->NotifyNetworkConnected(kNewNetworkForTests);
7205 } else {
7206 // Now deliver a CONNECTED notification and completes migration.
7207 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7208 ->NotifyNetworkConnected(kNewNetworkForTests);
7209
7210 // Now deliver a DISCONNECT notification.
7211 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7212 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
jri5b785512016-09-13 04:29:117213 }
jri5b785512016-09-13 04:29:117214 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shi329f5cbd2018-06-22 23:51:187215 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:117216 EXPECT_EQ(1u, session->GetNumActiveStreams());
7217
7218 // This is the callback for the response headers that returned
7219 // pending previously, because no result was available. Check that
7220 // the result is now available due to the successful migration.
7221 EXPECT_THAT(callback_.WaitForResult(), IsOk());
7222 EXPECT_EQ(200, response.headers->response_code());
7223
Zhongyi Shi4ac9e1f2018-06-21 05:21:477224 // Deliver a MADEDEFAULT notification.
jri5b785512016-09-13 04:29:117225 scoped_mock_network_change_notifier_->mock_network_change_notifier()
Zhongyi Shi4ac9e1f2018-06-21 05:21:477226 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
jri5b785512016-09-13 04:29:117227
zhongyi98d6a9262017-05-19 02:47:457228 QuicStreamRequest request2(factory_.get());
Zhongyi Shi329f5cbd2018-06-22 23:51:187229 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
7230 DEFAULT_PRIORITY, SocketTag(),
7231 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:037232 &net_error_details_,
7233 failed_on_default_network_callback_,
7234 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:247235 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
jri5b785512016-09-13 04:29:117236 EXPECT_TRUE(stream2.get());
7237
7238 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi329f5cbd2018-06-22 23:51:187239 EXPECT_EQ(session, GetActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:117240
7241 stream.reset();
7242 stream2.reset();
7243
7244 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7245 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7246 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
7247 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
jri5b785512016-09-13 04:29:117248}
7249
jri217455a12016-07-13 20:15:097250TEST_P(QuicStreamFactoryTest, ServerMigration) {
Zhongyi Shi967d2f12019-02-08 20:58:537251 test_params_.quic_allow_server_migration = true;
jri217455a12016-07-13 20:15:097252 Initialize();
7253
7254 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7255 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7256 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7257
rcha00569732016-08-27 11:09:367258 MockQuicData socket_data1;
Ryan Hamilton8d9ee76e2018-05-29 23:52:527259 quic::QuicStreamOffset header_stream_offset = 0;
rcha00569732016-08-27 11:09:367260 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
rch5cb522462017-04-25 20:18:367261 socket_data1.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:437262 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
Fan Yang32c5a112018-12-10 20:06:337263 socket_data1.AddWrite(
7264 SYNCHRONOUS, ConstructGetRequestPacket(
7265 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
7266 true, &header_stream_offset));
Zhongyi Shi5f587cc2017-11-21 23:24:177267 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri217455a12016-07-13 20:15:097268
7269 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:457270 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337271 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037272 request.Request(
7273 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7274 SocketTag(),
7275 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7276 failed_on_default_network_callback_, callback_.callback()));
jri217455a12016-07-13 20:15:097277 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:247278 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri217455a12016-07-13 20:15:097279 EXPECT_TRUE(stream.get());
7280
7281 // Cause QUIC stream to be created.
7282 HttpRequestInfo request_info;
7283 request_info.method = "GET";
7284 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:397285 request_info.traffic_annotation =
7286 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:277287 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:397288 net_log_, CompletionOnceCallback()));
jri217455a12016-07-13 20:15:097289
7290 // Ensure that session is alive and active.
7291 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
7292 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7293 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7294
7295 // Send GET request on stream.
7296 HttpResponseInfo response;
7297 HttpRequestHeaders request_headers;
7298 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
7299 callback_.callback()));
7300
7301 IPEndPoint ip;
7302 session->GetDefaultSocket()->GetPeerAddress(&ip);
7303 DVLOG(1) << "Socket connected to: " << ip.address().ToString() << " "
7304 << ip.port();
7305
7306 // Set up second socket data provider that is used after
7307 // migration. The request is rewritten to this new socket, and the
7308 // response to the request is read on this new socket.
rcha00569732016-08-27 11:09:367309 MockQuicData socket_data2;
7310 socket_data2.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:437311 SYNCHRONOUS, client_maker_.MakePingPacket(3, /*include_version=*/true));
7312 socket_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:337313 ASYNC,
7314 ConstructOkResponsePacket(
7315 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
rcha00569732016-08-27 11:09:367316 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:337317 socket_data2.AddWrite(
7318 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
7319 4, false, GetNthClientInitiatedBidirectionalStreamId(0),
7320 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:177321 socket_data2.AddSocketDataToFactory(socket_factory_.get());
jri217455a12016-07-13 20:15:097322
7323 const uint8_t kTestIpAddress[] = {1, 2, 3, 4};
7324 const uint16_t kTestPort = 123;
Zhongyi Shif124a582017-11-02 00:15:047325 session->Migrate(NetworkChangeNotifier::kInvalidNetworkHandle,
7326 IPEndPoint(IPAddress(kTestIpAddress), kTestPort), true,
7327 net_log_);
jri217455a12016-07-13 20:15:097328
7329 session->GetDefaultSocket()->GetPeerAddress(&ip);
7330 DVLOG(1) << "Socket migrated to: " << ip.address().ToString() << " "
7331 << ip.port();
7332
7333 // The session should be alive and active.
7334 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7335 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7336 EXPECT_EQ(1u, session->GetNumActiveStreams());
7337
7338 // Run the message loop so that data queued in the new socket is read by the
7339 // packet reader.
7340 base::RunLoop().RunUntilIdle();
7341
7342 // Verify that response headers on the migrated socket were delivered to the
7343 // stream.
7344 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
7345 EXPECT_EQ(200, response.headers->response_code());
7346
7347 stream.reset();
7348
7349 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
7350 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
7351 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
7352 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
7353}
7354
jri053fdbd2016-08-19 02:33:057355TEST_P(QuicStreamFactoryTest, ServerMigrationIPv4ToIPv4) {
7356 // Add alternate IPv4 server address to config.
7357 IPEndPoint alt_address = IPEndPoint(IPAddress(1, 2, 3, 4), 123);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527358 quic::QuicConfig config;
fayang91ca2012016-11-22 07:42:467359 config.SetAlternateServerAddressToSend(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527360 quic::QuicSocketAddress(quic::QuicSocketAddressImpl(alt_address)));
jri053fdbd2016-08-19 02:33:057361 VerifyServerMigration(config, alt_address);
7362}
7363
7364TEST_P(QuicStreamFactoryTest, ServerMigrationIPv6ToIPv6) {
7365 // Add a resolver rule to make initial connection to an IPv6 address.
Renjiea0cb4a2c2018-09-26 23:37:307366 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
7367 "fe80::aebc:32ff:febb:1e33", "");
jri053fdbd2016-08-19 02:33:057368 // Add alternate IPv6 server address to config.
7369 IPEndPoint alt_address = IPEndPoint(
7370 IPAddress(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16), 123);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527371 quic::QuicConfig config;
fayang91ca2012016-11-22 07:42:467372 config.SetAlternateServerAddressToSend(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527373 quic::QuicSocketAddress(quic::QuicSocketAddressImpl(alt_address)));
jri053fdbd2016-08-19 02:33:057374 VerifyServerMigration(config, alt_address);
7375}
7376
7377TEST_P(QuicStreamFactoryTest, ServerMigrationIPv6ToIPv4) {
7378 // Add a resolver rule to make initial connection to an IPv6 address.
Renjiea0cb4a2c2018-09-26 23:37:307379 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
7380 "fe80::aebc:32ff:febb:1e33", "");
jri053fdbd2016-08-19 02:33:057381 // Add alternate IPv4 server address to config.
7382 IPEndPoint alt_address = IPEndPoint(IPAddress(1, 2, 3, 4), 123);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527383 quic::QuicConfig config;
fayang91ca2012016-11-22 07:42:467384 config.SetAlternateServerAddressToSend(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527385 quic::QuicSocketAddress(quic::QuicSocketAddressImpl(alt_address)));
jri053fdbd2016-08-19 02:33:057386 IPEndPoint expected_address(
7387 ConvertIPv4ToIPv4MappedIPv6(alt_address.address()), alt_address.port());
7388 VerifyServerMigration(config, expected_address);
7389}
7390
7391TEST_P(QuicStreamFactoryTest, ServerMigrationIPv4ToIPv6Fails) {
Zhongyi Shi967d2f12019-02-08 20:58:537392 test_params_.quic_allow_server_migration = true;
jri053fdbd2016-08-19 02:33:057393 Initialize();
7394
7395 // Add a resolver rule to make initial connection to an IPv4 address.
Renjiea0cb4a2c2018-09-26 23:37:307396 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(), "1.2.3.4",
7397 "");
jri053fdbd2016-08-19 02:33:057398 // Add alternate IPv6 server address to config.
7399 IPEndPoint alt_address = IPEndPoint(
7400 IPAddress(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16), 123);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527401 quic::QuicConfig config;
fayang91ca2012016-11-22 07:42:467402 config.SetAlternateServerAddressToSend(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527403 quic::QuicSocketAddress(quic::QuicSocketAddressImpl(alt_address)));
jri053fdbd2016-08-19 02:33:057404
7405 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7406 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7407 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7408
7409 crypto_client_stream_factory_.SetConfig(config);
7410
7411 // Set up only socket data provider.
rcha00569732016-08-27 11:09:367412 MockQuicData socket_data1;
7413 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437414 socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
7415 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:337416 SYNCHRONOUS, client_maker_.MakeRstPacket(
7417 2, true, GetNthClientInitiatedBidirectionalStreamId(0),
7418 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:177419 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri053fdbd2016-08-19 02:33:057420
7421 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:457422 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337423 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037424 request.Request(
7425 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7426 SocketTag(),
7427 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7428 failed_on_default_network_callback_, callback_.callback()));
jri053fdbd2016-08-19 02:33:057429 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:247430 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri053fdbd2016-08-19 02:33:057431 EXPECT_TRUE(stream.get());
7432
7433 // Cause QUIC stream to be created.
7434 HttpRequestInfo request_info;
7435 request_info.method = "GET";
7436 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:397437 request_info.traffic_annotation =
7438 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:277439 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:397440 net_log_, CompletionOnceCallback()));
jri053fdbd2016-08-19 02:33:057441
7442 // Ensure that session is alive and active.
7443 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
7444 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7445 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7446
7447 IPEndPoint actual_address;
7448 session->GetDefaultSocket()->GetPeerAddress(&actual_address);
7449 // No migration should have happened.
7450 IPEndPoint expected_address =
7451 IPEndPoint(IPAddress(1, 2, 3, 4), kDefaultServerPort);
7452 EXPECT_EQ(actual_address, expected_address);
7453 DVLOG(1) << "Socket connected to: " << actual_address.address().ToString()
7454 << " " << actual_address.port();
7455 DVLOG(1) << "Expected address: " << expected_address.address().ToString()
7456 << " " << expected_address.port();
7457
7458 stream.reset();
7459 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
7460 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
7461}
7462
rsleevi17784692016-10-12 01:36:207463TEST_P(QuicStreamFactoryTest, OnCertDBChanged) {
jri7046038f2015-10-22 00:29:267464 Initialize();
rch6faa4d42016-01-05 20:48:437465 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7466 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7467 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7468
rcha00569732016-08-27 11:09:367469 MockQuicData socket_data;
7470 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437471 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:177472 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]d7d1e50b2013-11-25 22:08:097473
rcha00569732016-08-27 11:09:367474 MockQuicData socket_data2;
7475 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437476 socket_data2.AddWrite(SYNCHRONOUS,
7477 ConstructInitialSettingsPacket(1, nullptr));
Zhongyi Shi5f587cc2017-11-21 23:24:177478 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]d7d1e50b2013-11-25 22:08:097479
zhongyi98d6a9262017-05-19 02:47:457480 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337481 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037482 request.Request(
7483 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7484 SocketTag(),
7485 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7486 failed_on_default_network_callback_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:097487
robpercival214763f2016-07-01 23:27:017488 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:247489 std::unique_ptr<HttpStream> stream = CreateStream(&request);
Charles 'Buck' Krasic71763c9f2018-02-16 02:37:287490 EXPECT_TRUE(stream);
7491 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
[email protected]d7d1e50b2013-11-25 22:08:097492
7493 // Change the CA cert and verify that stream saw the event.
mattmfd05a1f2017-02-18 06:18:447494 factory_->OnCertDBChanged();
Charles 'Buck' Krasic71763c9f2018-02-16 02:37:287495
jri7046038f2015-10-22 00:29:267496 EXPECT_FALSE(factory_->require_confirmation());
Charles 'Buck' Krasic71763c9f2018-02-16 02:37:287497 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7498 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]d7d1e50b2013-11-25 22:08:097499
7500 // Now attempting to request a stream to the same origin should create
7501 // a new session.
7502
zhongyi98d6a9262017-05-19 02:47:457503 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337504 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037505 request2.Request(
7506 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7507 SocketTag(),
7508 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7509 failed_on_default_network_callback_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:097510
robpercival214763f2016-07-01 23:27:017511 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Charles 'Buck' Krasic71763c9f2018-02-16 02:37:287512 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
7513 EXPECT_TRUE(stream2);
7514 QuicChromiumClientSession* session2 = GetActiveSession(host_port_pair_);
7515 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7516 EXPECT_NE(session, session2);
7517 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7518 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
7519
7520 stream2.reset();
7521 stream.reset();
[email protected]d7d1e50b2013-11-25 22:08:097522
rch37de576c2015-05-17 20:28:177523 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7524 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7525 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
7526 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:097527}
7528
[email protected]1e960032013-12-20 19:00:207529TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
jri7046038f2015-10-22 00:29:267530 Initialize();
rch6faa4d42016-01-05 20:48:437531
rch872e00e2016-12-02 02:48:187532 std::vector<string> cannoncial_suffixes;
[email protected]6e12d702013-11-13 00:17:177533 cannoncial_suffixes.push_back(string(".c.youtube.com"));
7534 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]c49ff182013-09-28 08:33:267535
[email protected]6e12d702013-11-13 00:17:177536 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
7537 string r1_host_name("r1");
7538 string r2_host_name("r2");
7539 r1_host_name.append(cannoncial_suffixes[i]);
7540 r2_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:147541
[email protected]bf4ea2f2014-03-10 22:57:537542 HostPortPair host_port_pair1(r1_host_name, 80);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527543 quic::QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:267544 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
Ryan Hamilton4f0b26e2018-06-27 23:52:327545 quic::QuicServerId server_id1(host_port_pair1.host(),
7546 host_port_pair1.port(), privacy_mode_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527547 quic::QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:377548 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:177549 EXPECT_FALSE(cached1->proof_valid());
7550 EXPECT_TRUE(cached1->source_address_token().empty());
7551
7552 // Mutate the cached1 to have different data.
7553 // TODO(rtenneti): mutate other members of CachedState.
7554 cached1->set_source_address_token(r1_host_name);
7555 cached1->SetProofValid();
7556
[email protected]bf4ea2f2014-03-10 22:57:537557 HostPortPair host_port_pair2(r2_host_name, 80);
Ryan Hamilton4f0b26e2018-06-27 23:52:327558 quic::QuicServerId server_id2(host_port_pair2.host(),
7559 host_port_pair2.port(), privacy_mode_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527560 quic::QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:377561 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:177562 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
7563 EXPECT_TRUE(cached2->proof_valid());
7564 }
[email protected]b70fdb792013-10-25 19:04:147565}
7566
[email protected]1e960032013-12-20 19:00:207567TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
jri7046038f2015-10-22 00:29:267568 Initialize();
rch872e00e2016-12-02 02:48:187569 std::vector<string> cannoncial_suffixes;
[email protected]6e12d702013-11-13 00:17:177570 cannoncial_suffixes.push_back(string(".c.youtube.com"));
7571 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]b70fdb792013-10-25 19:04:147572
[email protected]6e12d702013-11-13 00:17:177573 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
7574 string r3_host_name("r3");
7575 string r4_host_name("r4");
7576 r3_host_name.append(cannoncial_suffixes[i]);
7577 r4_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:147578
[email protected]bf4ea2f2014-03-10 22:57:537579 HostPortPair host_port_pair1(r3_host_name, 80);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527580 quic::QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:267581 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
Ryan Hamilton4f0b26e2018-06-27 23:52:327582 quic::QuicServerId server_id1(host_port_pair1.host(),
7583 host_port_pair1.port(), privacy_mode_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527584 quic::QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:377585 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:177586 EXPECT_FALSE(cached1->proof_valid());
7587 EXPECT_TRUE(cached1->source_address_token().empty());
7588
7589 // Mutate the cached1 to have different data.
7590 // TODO(rtenneti): mutate other members of CachedState.
7591 cached1->set_source_address_token(r3_host_name);
7592 cached1->SetProofInvalid();
7593
[email protected]bf4ea2f2014-03-10 22:57:537594 HostPortPair host_port_pair2(r4_host_name, 80);
Ryan Hamilton4f0b26e2018-06-27 23:52:327595 quic::QuicServerId server_id2(host_port_pair2.host(),
7596 host_port_pair2.port(), privacy_mode_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527597 quic::QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:377598 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:177599 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
7600 EXPECT_TRUE(cached2->source_address_token().empty());
7601 EXPECT_FALSE(cached2->proof_valid());
7602 }
[email protected]c49ff182013-09-28 08:33:267603}
7604
rtenneti34dffe752015-02-24 23:27:327605TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) {
jri7046038f2015-10-22 00:29:267606 Initialize();
Ryan Hamiltona12722b2017-08-12 02:23:207607 factory_->set_require_confirmation(false);
rch6faa4d42016-01-05 20:48:437608 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7609 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7610
jri7046038f2015-10-22 00:29:267611 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti34dffe752015-02-24 23:27:327612
rcha00569732016-08-27 11:09:367613 MockQuicData socket_data;
7614 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:177615 socket_data.AddSocketDataToFactory(socket_factory_.get());
rtenneti34dffe752015-02-24 23:27:327616
7617 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:277618 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:307619 host_resolver_->set_synchronous_mode(true);
7620 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
7621 "192.168.0.1", "");
rtenneti34dffe752015-02-24 23:27:327622
zhongyi98d6a9262017-05-19 02:47:457623 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337624 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
7625 DEFAULT_PRIORITY, SocketTag(),
7626 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:037627 &net_error_details_,
7628 failed_on_default_network_callback_,
7629 callback_.callback()));
rtenneti34dffe752015-02-24 23:27:327630
7631 // If we are waiting for disk cache, we would have posted a task. Verify that
7632 // the CancelWaitForDataReady task hasn't been posted.
7633 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
7634
Yixin Wang7891a39d2017-11-08 20:59:247635 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rtenneti34dffe752015-02-24 23:27:327636 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:177637 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7638 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti34dffe752015-02-24 23:27:327639}
7640
dmurph44ca4f42016-09-09 20:39:097641TEST_P(QuicStreamFactoryTest, ReducePingTimeoutOnConnectionTimeOutOpenStreams) {
Zhongyi Shi967d2f12019-02-08 20:58:537642 test_params_.quic_reduced_ping_timeout_seconds = 10;
dmurph44ca4f42016-09-09 20:39:097643 Initialize();
7644 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7645 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7646 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7647
7648 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
zhongyidd1439f62016-09-02 02:02:267649
7650 MockQuicData socket_data;
7651 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437652 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:177653 socket_data.AddSocketDataToFactory(socket_factory_.get());
zhongyidd1439f62016-09-02 02:02:267654
7655 MockQuicData socket_data2;
7656 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437657 socket_data2.AddWrite(SYNCHRONOUS,
7658 ConstructInitialSettingsPacket(1, nullptr));
Zhongyi Shi5f587cc2017-11-21 23:24:177659 socket_data2.AddSocketDataToFactory(socket_factory_.get());
zhongyidd1439f62016-09-02 02:02:267660
7661 HostPortPair server2(kServer2HostName, kDefaultServerPort);
7662
7663 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:277664 MockCryptoClientStream::CONFIRM_HANDSHAKE);
Renjiea0cb4a2c2018-09-26 23:37:307665 host_resolver_->set_synchronous_mode(true);
7666 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
7667 "192.168.0.1", "");
7668 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
zhongyidd1439f62016-09-02 02:02:267669
7670 // Quic should use default PING timeout when no previous connection times out
7671 // with open stream.
Ryan Hamilton8d9ee76e2018-05-29 23:52:527672 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(quic::kPingTimeoutSecs),
zhongyidd1439f62016-09-02 02:02:267673 QuicStreamFactoryPeer::GetPingTimeout(factory_.get()));
zhongyi98d6a9262017-05-19 02:47:457674 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337675 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
7676 DEFAULT_PRIORITY, SocketTag(),
7677 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:037678 &net_error_details_,
7679 failed_on_default_network_callback_,
7680 callback_.callback()));
zhongyidd1439f62016-09-02 02:02:267681
7682 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527683 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(quic::kPingTimeoutSecs),
zhongyidd1439f62016-09-02 02:02:267684 session->connection()->ping_timeout());
7685
Yixin Wang7891a39d2017-11-08 20:59:247686 std::unique_ptr<HttpStream> stream = CreateStream(&request);
zhongyidd1439f62016-09-02 02:02:267687 EXPECT_TRUE(stream.get());
7688 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:397689 request_info.traffic_annotation =
7690 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:277691 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:397692 net_log_, CompletionOnceCallback()));
zhongyidd1439f62016-09-02 02:02:267693
7694 DVLOG(1)
7695 << "Created 1st session and initialized a stream. Now trigger timeout";
Ryan Hamilton8d9ee76e2018-05-29 23:52:527696 session->connection()->CloseConnection(
7697 quic::QUIC_NETWORK_IDLE_TIMEOUT, "test",
7698 quic::ConnectionCloseBehavior::SILENT_CLOSE);
zhongyidd1439f62016-09-02 02:02:267699 // Need to spin the loop now to ensure that
7700 // QuicStreamFactory::OnSessionClosed() runs.
7701 base::RunLoop run_loop;
7702 run_loop.RunUntilIdle();
7703
zhongyidd1439f62016-09-02 02:02:267704 // The first connection times out with open stream, QUIC should reduce initial
7705 // PING time for subsequent connections.
Ryan Hamilton8d9ee76e2018-05-29 23:52:527706 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(10),
zhongyidd1439f62016-09-02 02:02:267707 QuicStreamFactoryPeer::GetPingTimeout(factory_.get()));
7708
7709 // Test two-in-a-row timeouts with open streams.
7710 DVLOG(1) << "Create 2nd session and timeout with open stream";
7711 TestCompletionCallback callback2;
zhongyi98d6a9262017-05-19 02:47:457712 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:037713 EXPECT_EQ(OK,
7714 request2.Request(
7715 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
7716 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
7717 failed_on_default_network_callback_, callback2.callback()));
zhongyidd1439f62016-09-02 02:02:267718 QuicChromiumClientSession* session2 = GetActiveSession(server2);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527719 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(10),
zhongyidd1439f62016-09-02 02:02:267720 session2->connection()->ping_timeout());
7721
Yixin Wang7891a39d2017-11-08 20:59:247722 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
zhongyidd1439f62016-09-02 02:02:267723 EXPECT_TRUE(stream2.get());
Steven Valdezb4ff0412018-01-18 22:39:277724 EXPECT_EQ(OK,
7725 stream2->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:397726 net_log_, CompletionOnceCallback()));
zhongyidd1439f62016-09-02 02:02:267727 session2->connection()->CloseConnection(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527728 quic::QUIC_NETWORK_IDLE_TIMEOUT, "test",
7729 quic::ConnectionCloseBehavior::SILENT_CLOSE);
zhongyidd1439f62016-09-02 02:02:267730 // Need to spin the loop now to ensure that
7731 // QuicStreamFactory::OnSessionClosed() runs.
7732 base::RunLoop run_loop2;
7733 run_loop2.RunUntilIdle();
zhongyidd1439f62016-09-02 02:02:267734
7735 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7736 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7737 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
7738 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
7739}
7740
tbansal3b966952016-10-25 23:25:147741// Verifies that the QUIC stream factory is initialized correctly.
rtenneticd2aaa15b2015-10-10 20:29:337742TEST_P(QuicStreamFactoryTest, MaybeInitialize) {
tbansal9b1cdf32017-05-10 17:28:397743 VerifyInitialization();
rtenneti8a80a6dc2015-09-21 19:51:137744}
7745
rtennetid073dd22016-08-04 01:58:337746TEST_P(QuicStreamFactoryTest, StartCertVerifyJob) {
7747 Initialize();
7748
rcha00569732016-08-27 11:09:367749 MockQuicData socket_data;
7750 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437751 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:177752 socket_data.AddSocketDataToFactory(socket_factory_.get());
rtennetid073dd22016-08-04 01:58:337753
7754 // Save current state of |race_cert_verification|.
7755 bool race_cert_verification =
7756 QuicStreamFactoryPeer::GetRaceCertVerification(factory_.get());
7757
7758 // Load server config.
7759 HostPortPair host_port_pair(kDefaultServerHostName, kDefaultServerPort);
Ryan Hamilton4f0b26e2018-06-27 23:52:327760 quic::QuicServerId quic_server_id(host_port_pair_.host(),
7761 host_port_pair_.port(),
7762 privacy_mode_ == PRIVACY_MODE_ENABLED);
rtennetid073dd22016-08-04 01:58:337763 QuicStreamFactoryPeer::CacheDummyServerConfig(factory_.get(), quic_server_id);
7764
7765 QuicStreamFactoryPeer::SetRaceCertVerification(factory_.get(), true);
7766 EXPECT_FALSE(HasActiveCertVerifierJob(quic_server_id));
7767
7768 // Start CertVerifyJob.
Ryan Hamilton8d9ee76e2018-05-29 23:52:527769 quic::QuicAsyncStatus status = QuicStreamFactoryPeer::StartCertVerifyJob(
rtennetid073dd22016-08-04 01:58:337770 factory_.get(), quic_server_id, /*cert_verify_flags=*/0, net_log_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527771 if (status == quic::QUIC_PENDING) {
rtennetid073dd22016-08-04 01:58:337772 // Verify CertVerifierJob has started.
7773 EXPECT_TRUE(HasActiveCertVerifierJob(quic_server_id));
7774
7775 while (HasActiveCertVerifierJob(quic_server_id)) {
7776 base::RunLoop().RunUntilIdle();
7777 }
7778 }
7779 // Verify CertVerifierJob has finished.
7780 EXPECT_FALSE(HasActiveCertVerifierJob(quic_server_id));
7781
7782 // Start a QUIC request.
zhongyi98d6a9262017-05-19 02:47:457783 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337784 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037785 request.Request(
7786 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7787 SocketTag(),
7788 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7789 failed_on_default_network_callback_, callback_.callback()));
rtennetid073dd22016-08-04 01:58:337790
7791 EXPECT_EQ(OK, callback_.WaitForResult());
7792
Yixin Wang7891a39d2017-11-08 20:59:247793 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rtennetid073dd22016-08-04 01:58:337794 EXPECT_TRUE(stream.get());
7795
7796 // Restore |race_cert_verification|.
7797 QuicStreamFactoryPeer::SetRaceCertVerification(factory_.get(),
7798 race_cert_verification);
7799
7800 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7801 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7802
7803 // Verify there are no outstanding CertVerifierJobs after request has
7804 // finished.
7805 EXPECT_FALSE(HasActiveCertVerifierJob(quic_server_id));
7806}
7807
rtenneti1cd3b162015-09-29 02:58:287808TEST_P(QuicStreamFactoryTest, YieldAfterPackets) {
jri7046038f2015-10-22 00:29:267809 Initialize();
Ryan Hamiltona12722b2017-08-12 02:23:207810 factory_->set_require_confirmation(false);
rch6faa4d42016-01-05 20:48:437811 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7812 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:267813 QuicStreamFactoryPeer::SetYieldAfterPackets(factory_.get(), 0);
rtenneti1cd3b162015-09-29 02:58:287814
rcha00569732016-08-27 11:09:367815 MockQuicData socket_data;
Fan Yangac867502019-01-28 21:10:237816 socket_data.AddRead(SYNCHRONOUS, ConstructClientConnectionClosePacket(1));
rcha00569732016-08-27 11:09:367817 socket_data.AddRead(ASYNC, OK);
Zhongyi Shi5f587cc2017-11-21 23:24:177818 socket_data.AddSocketDataToFactory(socket_factory_.get());
rtenneti1cd3b162015-09-29 02:58:287819
7820 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:277821 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:307822 host_resolver_->set_synchronous_mode(true);
7823 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
7824 "192.168.0.1", "");
rtenneti1cd3b162015-09-29 02:58:287825
rcha02807b42016-01-29 21:56:157826 // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
7827 // posts a task.
rtenneti1cd3b162015-09-29 02:58:287828 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
rcha02807b42016-01-29 21:56:157829 SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
7830 "StartReading");
rtenneti1cd3b162015-09-29 02:58:287831
zhongyi98d6a9262017-05-19 02:47:457832 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337833 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
7834 DEFAULT_PRIORITY, SocketTag(),
7835 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:037836 &net_error_details_,
7837 failed_on_default_network_callback_,
7838 callback_.callback()));
rtenneti1cd3b162015-09-29 02:58:287839
rcha02807b42016-01-29 21:56:157840 // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
7841 // called.
rtenneti1cd3b162015-09-29 02:58:287842 base::RunLoop run_loop;
7843 run_loop.RunUntilIdle();
7844
7845 // Verify task that the observer's executed_count is 1, which indicates
rcha02807b42016-01-29 21:56:157846 // QuicChromiumPacketReader::StartReading() has posted only one task and
7847 // yielded the read.
rtenneti1cd3b162015-09-29 02:58:287848 EXPECT_EQ(1u, observer.executed_count());
7849
Yixin Wang7891a39d2017-11-08 20:59:247850 std::unique_ptr<HttpStream> stream = CreateStream(&request);
xunjieli2608f9b2016-03-14 13:39:237851 EXPECT_FALSE(stream.get()); // Session is already closed.
rtenneti1cd3b162015-09-29 02:58:287852 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7853 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7854}
7855
7856TEST_P(QuicStreamFactoryTest, YieldAfterDuration) {
jri7046038f2015-10-22 00:29:267857 Initialize();
Ryan Hamiltona12722b2017-08-12 02:23:207858 factory_->set_require_confirmation(false);
rch6faa4d42016-01-05 20:48:437859 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7860 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rtenneti1cd3b162015-09-29 02:58:287861 QuicStreamFactoryPeer::SetYieldAfterDuration(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527862 factory_.get(), quic::QuicTime::Delta::FromMilliseconds(-1));
rtenneti1cd3b162015-09-29 02:58:287863
rcha00569732016-08-27 11:09:367864 MockQuicData socket_data;
Fan Yangac867502019-01-28 21:10:237865 socket_data.AddRead(SYNCHRONOUS, ConstructClientConnectionClosePacket(1));
rcha00569732016-08-27 11:09:367866 socket_data.AddRead(ASYNC, OK);
Zhongyi Shi5f587cc2017-11-21 23:24:177867 socket_data.AddSocketDataToFactory(socket_factory_.get());
rtenneti1cd3b162015-09-29 02:58:287868
7869 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:277870 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:307871 host_resolver_->set_synchronous_mode(true);
7872 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
7873 "192.168.0.1", "");
rtenneti1cd3b162015-09-29 02:58:287874
rcha02807b42016-01-29 21:56:157875 // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
7876 // posts a task.
rtenneti1cd3b162015-09-29 02:58:287877 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
rcha02807b42016-01-29 21:56:157878 SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
7879 "StartReading");
rtenneti1cd3b162015-09-29 02:58:287880
zhongyi98d6a9262017-05-19 02:47:457881 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337882 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
7883 DEFAULT_PRIORITY, SocketTag(),
7884 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:037885 &net_error_details_,
7886 failed_on_default_network_callback_,
7887 callback_.callback()));
rtenneti1cd3b162015-09-29 02:58:287888
rcha02807b42016-01-29 21:56:157889 // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
7890 // called.
rtenneti1cd3b162015-09-29 02:58:287891 base::RunLoop run_loop;
7892 run_loop.RunUntilIdle();
7893
7894 // Verify task that the observer's executed_count is 1, which indicates
rcha02807b42016-01-29 21:56:157895 // QuicChromiumPacketReader::StartReading() has posted only one task and
7896 // yielded the read.
rtenneti1cd3b162015-09-29 02:58:287897 EXPECT_EQ(1u, observer.executed_count());
7898
Yixin Wang7891a39d2017-11-08 20:59:247899 std::unique_ptr<HttpStream> stream = CreateStream(&request);
xunjieli2608f9b2016-03-14 13:39:237900 EXPECT_FALSE(stream.get()); // Session is already closed.
rtenneti1cd3b162015-09-29 02:58:287901 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7902 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7903}
7904
ckrasic3865ee0f2016-02-29 22:04:567905TEST_P(QuicStreamFactoryTest, ServerPushSessionAffinity) {
7906 Initialize();
7907 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7908 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7909
rcha00569732016-08-27 11:09:367910 MockQuicData socket_data;
7911 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437912 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:177913 socket_data.AddSocketDataToFactory(socket_factory_.get());
ckrasic3865ee0f2016-02-29 22:04:567914
zhongyi98d6a9262017-05-19 02:47:457915 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337916 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037917 request.Request(
7918 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7919 SocketTag(),
7920 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7921 failed_on_default_network_callback_, callback_.callback()));
ckrasic3865ee0f2016-02-29 22:04:567922
robpercival214763f2016-07-01 23:27:017923 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:247924 std::unique_ptr<HttpStream> stream = CreateStream(&request);
ckrasic3865ee0f2016-02-29 22:04:567925 EXPECT_TRUE(stream.get());
7926
7927 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
7928
bnc5fdc07162016-05-23 17:36:037929 string url = "https://www.example.org/";
ckrasic3865ee0f2016-02-29 22:04:567930
bnc912a04b2016-04-20 14:19:507931 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic3865ee0f2016-02-29 22:04:567932
Ryan Hamilton8d9ee76e2018-05-29 23:52:527933 quic::QuicClientPromisedInfo promised(
Fan Yang32c5a112018-12-10 20:06:337934 session, GetNthServerInitiatedUnidirectionalStreamId(0), kDefaultUrl);
ckrasic3865ee0f2016-02-29 22:04:567935 (*QuicStreamFactoryPeer::GetPushPromiseIndex(factory_.get())
bnc3d9035b32016-06-30 18:18:487936 ->promised_by_url())[kDefaultUrl] = &promised;
ckrasic3865ee0f2016-02-29 22:04:567937
zhongyi98d6a9262017-05-19 02:47:457938 QuicStreamRequest request2(factory_.get());
zhongyia00ca012017-07-06 23:36:397939 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:337940 DEFAULT_PRIORITY, SocketTag(),
7941 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:037942 &net_error_details_,
7943 failed_on_default_network_callback_,
7944 callback_.callback()));
ckrasic3865ee0f2016-02-29 22:04:567945
7946 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
7947}
7948
7949TEST_P(QuicStreamFactoryTest, ServerPushPrivacyModeMismatch) {
7950 Initialize();
7951 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7952 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7953 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7954
rcha00569732016-08-27 11:09:367955 MockQuicData socket_data1;
7956 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437957 socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
7958 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:337959 SYNCHRONOUS, client_maker_.MakeRstPacket(
7960 2, true, GetNthServerInitiatedUnidirectionalStreamId(0),
7961 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:177962 socket_data1.AddSocketDataToFactory(socket_factory_.get());
ckrasic3865ee0f2016-02-29 22:04:567963
rcha00569732016-08-27 11:09:367964 MockQuicData socket_data2;
7965 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437966 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:177967 socket_data2.AddSocketDataToFactory(socket_factory_.get());
ckrasic3865ee0f2016-02-29 22:04:567968
zhongyi98d6a9262017-05-19 02:47:457969 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337970 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037971 request.Request(
7972 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7973 SocketTag(),
7974 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7975 failed_on_default_network_callback_, callback_.callback()));
ckrasic3865ee0f2016-02-29 22:04:567976
robpercival214763f2016-07-01 23:27:017977 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:247978 std::unique_ptr<HttpStream> stream = CreateStream(&request);
ckrasic3865ee0f2016-02-29 22:04:567979 EXPECT_TRUE(stream.get());
7980
7981 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
7982
bnc5fdc07162016-05-23 17:36:037983 string url = "https://www.example.org/";
bnc912a04b2016-04-20 14:19:507984 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic3865ee0f2016-02-29 22:04:567985
Ryan Hamilton8d9ee76e2018-05-29 23:52:527986 quic::QuicClientPromisedInfo promised(
Fan Yang32c5a112018-12-10 20:06:337987 session, GetNthServerInitiatedUnidirectionalStreamId(0), kDefaultUrl);
ckrasic3865ee0f2016-02-29 22:04:567988
Ryan Hamilton8d9ee76e2018-05-29 23:52:527989 quic::QuicClientPushPromiseIndex* index =
ckrasic3865ee0f2016-02-29 22:04:567990 QuicStreamFactoryPeer::GetPushPromiseIndex(factory_.get());
7991
bnc3d9035b32016-06-30 18:18:487992 (*index->promised_by_url())[kDefaultUrl] = &promised;
7993 EXPECT_EQ(index->GetPromised(kDefaultUrl), &promised);
ckrasic3865ee0f2016-02-29 22:04:567994
7995 // Doing the request should not use the push stream, but rather
7996 // cancel it because the privacy modes do not match.
zhongyi98d6a9262017-05-19 02:47:457997 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337998 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037999 request2.Request(
8000 host_port_pair_, version_, PRIVACY_MODE_ENABLED,
8001 DEFAULT_PRIORITY, SocketTag(),
8002 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8003 failed_on_default_network_callback_, callback_.callback()));
ckrasic3865ee0f2016-02-29 22:04:568004
8005 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
bnc3d9035b32016-06-30 18:18:488006 EXPECT_EQ(index->GetPromised(kDefaultUrl), nullptr);
ckrasic3865ee0f2016-02-29 22:04:568007
robpercival214763f2016-07-01 23:27:018008 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:248009 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
ckrasic3865ee0f2016-02-29 22:04:568010 EXPECT_TRUE(stream2.get());
8011
8012 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
8013 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
8014 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
8015 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
8016}
8017
Ryan Hamilton8d9ee76e2018-05-29 23:52:528018// Pool to existing session with matching quic::QuicServerId
bnc359ed2a2016-04-29 20:43:458019// even if destination is different.
8020TEST_P(QuicStreamFactoryTest, PoolByOrigin) {
8021 Initialize();
8022
8023 HostPortPair destination1("first.example.com", 443);
8024 HostPortPair destination2("second.example.com", 443);
8025
8026 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8027 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8028
rcha00569732016-08-27 11:09:368029 MockQuicData socket_data;
8030 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:438031 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:178032 socket_data.AddSocketDataToFactory(socket_factory_.get());
bnc359ed2a2016-04-29 20:43:458033
zhongyi98d6a9262017-05-19 02:47:458034 QuicStreamRequest request1(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:038035 EXPECT_EQ(
8036 ERR_IO_PENDING,
8037 request1.Request(
8038 destination1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
8039 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8040 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:018041 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:248042 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
bnc359ed2a2016-04-29 20:43:458043 EXPECT_TRUE(stream1.get());
8044 EXPECT_TRUE(HasActiveSession(host_port_pair_));
8045
8046 // Second request returns synchronously because it pools to existing session.
8047 TestCompletionCallback callback2;
zhongyi98d6a9262017-05-19 02:47:458048 QuicStreamRequest request2(factory_.get());
zhongyia00ca012017-07-06 23:36:398049 EXPECT_EQ(OK, request2.Request(destination2, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:338050 DEFAULT_PRIORITY, SocketTag(),
8051 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:038052 &net_error_details_,
8053 failed_on_default_network_callback_,
8054 callback2.callback()));
Yixin Wang7891a39d2017-11-08 20:59:248055 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
bnc359ed2a2016-04-29 20:43:458056 EXPECT_TRUE(stream2.get());
8057
rchf0b18c8a2017-05-05 19:31:578058 QuicChromiumClientSession::Handle* session1 =
8059 QuicHttpStreamPeer::GetSessionHandle(stream1.get());
8060 QuicChromiumClientSession::Handle* session2 =
8061 QuicHttpStreamPeer::GetSessionHandle(stream2.get());
8062 EXPECT_TRUE(session1->SharesSameSession(*session2));
Ryan Hamilton4f0b26e2018-06-27 23:52:328063 EXPECT_EQ(quic::QuicServerId(host_port_pair_.host(), host_port_pair_.port(),
8064 privacy_mode_ == PRIVACY_MODE_ENABLED),
bnc359ed2a2016-04-29 20:43:458065 session1->server_id());
8066
8067 EXPECT_TRUE(socket_data.AllReadDataConsumed());
8068 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
8069}
8070
8071class QuicStreamFactoryWithDestinationTest
8072 : public QuicStreamFactoryTestBase,
8073 public ::testing::TestWithParam<PoolingTestParams> {
8074 protected:
8075 QuicStreamFactoryWithDestinationTest()
Yixin Wang079ad542018-01-11 04:06:058076 : QuicStreamFactoryTestBase(
8077 GetParam().version,
8078 GetParam().client_headers_include_h2_stream_dependency),
bnc359ed2a2016-04-29 20:43:458079 destination_type_(GetParam().destination_type),
8080 hanging_read_(SYNCHRONOUS, ERR_IO_PENDING, 0) {}
8081
8082 HostPortPair GetDestination() {
8083 switch (destination_type_) {
8084 case SAME_AS_FIRST:
8085 return origin1_;
8086 case SAME_AS_SECOND:
8087 return origin2_;
8088 case DIFFERENT:
8089 return HostPortPair(kDifferentHostname, 443);
8090 default:
8091 NOTREACHED();
8092 return HostPortPair();
8093 }
8094 }
8095
8096 void AddHangingSocketData() {
8097 std::unique_ptr<SequencedSocketData> sequenced_socket_data(
Ryan Sleevib8d7ea02018-05-07 20:01:018098 new SequencedSocketData(base::make_span(&hanging_read_, 1),
8099 base::span<MockWrite>()));
Zhongyi Shi5f587cc2017-11-21 23:24:178100 socket_factory_->AddSocketDataProvider(sequenced_socket_data.get());
bnc359ed2a2016-04-29 20:43:458101 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
8102 }
8103
8104 bool AllDataConsumed() {
8105 for (const auto& socket_data_ptr : sequenced_socket_data_vector_) {
8106 if (!socket_data_ptr->AllReadDataConsumed() ||
8107 !socket_data_ptr->AllWriteDataConsumed()) {
8108 return false;
8109 }
8110 }
8111 return true;
8112 }
8113
8114 DestinationType destination_type_;
8115 HostPortPair origin1_;
8116 HostPortPair origin2_;
8117 MockRead hanging_read_;
rch872e00e2016-12-02 02:48:188118 std::vector<std::unique_ptr<SequencedSocketData>>
8119 sequenced_socket_data_vector_;
bnc359ed2a2016-04-29 20:43:458120};
8121
Victor Costane635086f2019-01-27 05:20:308122INSTANTIATE_TEST_SUITE_P(VersionIncludeStreamDependencySequence,
8123 QuicStreamFactoryWithDestinationTest,
8124 ::testing::ValuesIn(GetPoolingTestParams()));
bnc359ed2a2016-04-29 20:43:458125
8126// A single QUIC request fails because the certificate does not match the origin
8127// hostname, regardless of whether it matches the alternative service hostname.
8128TEST_P(QuicStreamFactoryWithDestinationTest, InvalidCertificate) {
8129 if (destination_type_ == DIFFERENT)
8130 return;
8131
8132 Initialize();
8133
8134 GURL url("https://mail.example.com/");
8135 origin1_ = HostPortPair::FromURL(url);
8136
8137 // Not used for requests, but this provides a test case where the certificate
8138 // is valid for the hostname of the alternative service.
8139 origin2_ = HostPortPair("mail.example.org", 433);
8140
8141 HostPortPair destination = GetDestination();
8142
8143 scoped_refptr<X509Certificate> cert(
8144 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
Ryan Sleevidef35f62018-01-23 21:12:248145 ASSERT_FALSE(cert->VerifyNameMatch(origin1_.host()));
8146 ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host()));
bnc359ed2a2016-04-29 20:43:458147
8148 ProofVerifyDetailsChromium verify_details;
8149 verify_details.cert_verify_result.verified_cert = cert;
8150 verify_details.cert_verify_result.is_issued_by_known_root = true;
8151 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8152
8153 AddHangingSocketData();
8154
zhongyi98d6a9262017-05-19 02:47:458155 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:038156 EXPECT_EQ(
8157 ERR_IO_PENDING,
8158 request.Request(
8159 destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
8160 /*cert_verify_flags=*/0, url, net_log_, &net_error_details_,
8161 failed_on_default_network_callback_, callback_.callback()));
bnc359ed2a2016-04-29 20:43:458162
robpercival214763f2016-07-01 23:27:018163 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_QUIC_HANDSHAKE_FAILED));
bnc359ed2a2016-04-29 20:43:458164
8165 EXPECT_TRUE(AllDataConsumed());
8166}
8167
8168// QuicStreamRequest is pooled based on |destination| if certificate matches.
8169TEST_P(QuicStreamFactoryWithDestinationTest, SharedCertificate) {
8170 Initialize();
8171
8172 GURL url1("https://www.example.org/");
8173 GURL url2("https://mail.example.org/");
8174 origin1_ = HostPortPair::FromURL(url1);
8175 origin2_ = HostPortPair::FromURL(url2);
8176
8177 HostPortPair destination = GetDestination();
8178
8179 scoped_refptr<X509Certificate> cert(
8180 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
Ryan Sleevidef35f62018-01-23 21:12:248181 ASSERT_TRUE(cert->VerifyNameMatch(origin1_.host()));
8182 ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host()));
8183 ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname));
bnc359ed2a2016-04-29 20:43:458184
8185 ProofVerifyDetailsChromium verify_details;
8186 verify_details.cert_verify_result.verified_cert = cert;
8187 verify_details.cert_verify_result.is_issued_by_known_root = true;
8188 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8189
fayang3bcb8b502016-12-07 21:44:378190 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
Ryan Hamilton8d9ee76e2018-05-29 23:52:528191 std::unique_ptr<quic::QuicEncryptedPacket> settings_packet(
rch5cb522462017-04-25 20:18:368192 client_maker_.MakeInitialSettingsPacket(1, nullptr));
bnceb9aa7112017-01-05 01:03:468193 MockWrite writes[] = {MockWrite(SYNCHRONOUS, settings_packet->data(),
8194 settings_packet->length(), 1)};
fayang3bcb8b502016-12-07 21:44:378195 std::unique_ptr<SequencedSocketData> sequenced_socket_data(
Ryan Sleevib8d7ea02018-05-07 20:01:018196 new SequencedSocketData(reads, writes));
Zhongyi Shi5f587cc2017-11-21 23:24:178197 socket_factory_->AddSocketDataProvider(sequenced_socket_data.get());
fayang3bcb8b502016-12-07 21:44:378198 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
bnc359ed2a2016-04-29 20:43:458199
zhongyi98d6a9262017-05-19 02:47:458200 QuicStreamRequest request1(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:038201 EXPECT_EQ(
8202 ERR_IO_PENDING,
8203 request1.Request(
8204 destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
8205 /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
8206 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:018207 EXPECT_THAT(callback_.WaitForResult(), IsOk());
fayang3bcb8b502016-12-07 21:44:378208
Yixin Wang7891a39d2017-11-08 20:59:248209 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
bnc359ed2a2016-04-29 20:43:458210 EXPECT_TRUE(stream1.get());
8211 EXPECT_TRUE(HasActiveSession(origin1_));
8212
8213 // Second request returns synchronously because it pools to existing session.
8214 TestCompletionCallback callback2;
zhongyi98d6a9262017-05-19 02:47:458215 QuicStreamRequest request2(factory_.get());
zhongyia00ca012017-07-06 23:36:398216 EXPECT_EQ(OK, request2.Request(destination, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:338217 DEFAULT_PRIORITY, SocketTag(),
8218 /*cert_verify_flags=*/0, url2, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:038219 &net_error_details_,
8220 failed_on_default_network_callback_,
8221 callback2.callback()));
Yixin Wang7891a39d2017-11-08 20:59:248222 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
bnc359ed2a2016-04-29 20:43:458223 EXPECT_TRUE(stream2.get());
8224
rchf0b18c8a2017-05-05 19:31:578225 QuicChromiumClientSession::Handle* session1 =
8226 QuicHttpStreamPeer::GetSessionHandle(stream1.get());
8227 QuicChromiumClientSession::Handle* session2 =
8228 QuicHttpStreamPeer::GetSessionHandle(stream2.get());
8229 EXPECT_TRUE(session1->SharesSameSession(*session2));
bnc359ed2a2016-04-29 20:43:458230
Ryan Hamilton4f0b26e2018-06-27 23:52:328231 EXPECT_EQ(quic::QuicServerId(origin1_.host(), origin1_.port(),
8232 privacy_mode_ == PRIVACY_MODE_ENABLED),
8233 session1->server_id());
bnc359ed2a2016-04-29 20:43:458234
8235 EXPECT_TRUE(AllDataConsumed());
8236}
8237
bnc47eba7d2016-07-01 00:43:388238// QuicStreamRequest is not pooled if PrivacyMode differs.
8239TEST_P(QuicStreamFactoryWithDestinationTest, DifferentPrivacyMode) {
8240 Initialize();
8241
8242 GURL url1("https://www.example.org/");
8243 GURL url2("https://mail.example.org/");
8244 origin1_ = HostPortPair::FromURL(url1);
8245 origin2_ = HostPortPair::FromURL(url2);
8246
8247 HostPortPair destination = GetDestination();
8248
8249 scoped_refptr<X509Certificate> cert(
8250 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
Ryan Sleevidef35f62018-01-23 21:12:248251 ASSERT_TRUE(cert->VerifyNameMatch(origin1_.host()));
8252 ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host()));
8253 ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname));
bnc47eba7d2016-07-01 00:43:388254
8255 ProofVerifyDetailsChromium verify_details1;
8256 verify_details1.cert_verify_result.verified_cert = cert;
8257 verify_details1.cert_verify_result.is_issued_by_known_root = true;
8258 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
8259
8260 ProofVerifyDetailsChromium verify_details2;
8261 verify_details2.cert_verify_result.verified_cert = cert;
8262 verify_details2.cert_verify_result.is_issued_by_known_root = true;
8263 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
8264
fayang3bcb8b502016-12-07 21:44:378265 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
Ryan Hamilton8d9ee76e2018-05-29 23:52:528266 std::unique_ptr<quic::QuicEncryptedPacket> settings_packet(
rch5cb522462017-04-25 20:18:368267 client_maker_.MakeInitialSettingsPacket(1, nullptr));
bnceb9aa7112017-01-05 01:03:468268 MockWrite writes[] = {MockWrite(SYNCHRONOUS, settings_packet->data(),
8269 settings_packet->length(), 1)};
fayang3bcb8b502016-12-07 21:44:378270 std::unique_ptr<SequencedSocketData> sequenced_socket_data(
Ryan Sleevib8d7ea02018-05-07 20:01:018271 new SequencedSocketData(reads, writes));
Zhongyi Shi5f587cc2017-11-21 23:24:178272 socket_factory_->AddSocketDataProvider(sequenced_socket_data.get());
fayang3bcb8b502016-12-07 21:44:378273 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
8274 std::unique_ptr<SequencedSocketData> sequenced_socket_data1(
Ryan Sleevib8d7ea02018-05-07 20:01:018275 new SequencedSocketData(reads, writes));
Zhongyi Shi5f587cc2017-11-21 23:24:178276 socket_factory_->AddSocketDataProvider(sequenced_socket_data1.get());
fayang3bcb8b502016-12-07 21:44:378277 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data1));
bnc47eba7d2016-07-01 00:43:388278
zhongyi98d6a9262017-05-19 02:47:458279 QuicStreamRequest request1(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338280 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038281 request1.Request(
8282 destination, version_, PRIVACY_MODE_DISABLED, DEFAULT_PRIORITY,
8283 SocketTag(),
8284 /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
8285 failed_on_default_network_callback_, callback_.callback()));
bnc47eba7d2016-07-01 00:43:388286 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:248287 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
bnc47eba7d2016-07-01 00:43:388288 EXPECT_TRUE(stream1.get());
8289 EXPECT_TRUE(HasActiveSession(origin1_));
8290
8291 TestCompletionCallback callback2;
zhongyi98d6a9262017-05-19 02:47:458292 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338293 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038294 request2.Request(
8295 destination, version_, PRIVACY_MODE_ENABLED, DEFAULT_PRIORITY,
8296 SocketTag(),
8297 /*cert_verify_flags=*/0, url2, net_log_, &net_error_details_,
8298 failed_on_default_network_callback_, callback2.callback()));
bnc47eba7d2016-07-01 00:43:388299 EXPECT_EQ(OK, callback2.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:248300 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
bnc47eba7d2016-07-01 00:43:388301 EXPECT_TRUE(stream2.get());
8302
8303 // |request2| does not pool to the first session, because PrivacyMode does not
8304 // match. Instead, another session is opened to the same destination, but
Ryan Hamilton8d9ee76e2018-05-29 23:52:528305 // with a different quic::QuicServerId.
rchf0b18c8a2017-05-05 19:31:578306 QuicChromiumClientSession::Handle* session1 =
8307 QuicHttpStreamPeer::GetSessionHandle(stream1.get());
8308 QuicChromiumClientSession::Handle* session2 =
8309 QuicHttpStreamPeer::GetSessionHandle(stream2.get());
8310 EXPECT_FALSE(session1->SharesSameSession(*session2));
bnc47eba7d2016-07-01 00:43:388311
Ryan Hamilton4f0b26e2018-06-27 23:52:328312 EXPECT_EQ(quic::QuicServerId(origin1_.host(), origin1_.port(), false),
bnc47eba7d2016-07-01 00:43:388313 session1->server_id());
Ryan Hamilton4f0b26e2018-06-27 23:52:328314 EXPECT_EQ(quic::QuicServerId(origin2_.host(), origin2_.port(), true),
bnc47eba7d2016-07-01 00:43:388315 session2->server_id());
8316
8317 EXPECT_TRUE(AllDataConsumed());
8318}
8319
bnc359ed2a2016-04-29 20:43:458320// QuicStreamRequest is not pooled if certificate does not match its origin.
8321TEST_P(QuicStreamFactoryWithDestinationTest, DisjointCertificate) {
8322 Initialize();
8323
8324 GURL url1("https://news.example.org/");
8325 GURL url2("https://mail.example.com/");
8326 origin1_ = HostPortPair::FromURL(url1);
8327 origin2_ = HostPortPair::FromURL(url2);
8328
8329 HostPortPair destination = GetDestination();
8330
8331 scoped_refptr<X509Certificate> cert1(
8332 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
Ryan Sleevidef35f62018-01-23 21:12:248333 ASSERT_TRUE(cert1->VerifyNameMatch(origin1_.host()));
8334 ASSERT_FALSE(cert1->VerifyNameMatch(origin2_.host()));
8335 ASSERT_FALSE(cert1->VerifyNameMatch(kDifferentHostname));
bnc359ed2a2016-04-29 20:43:458336
8337 ProofVerifyDetailsChromium verify_details1;
8338 verify_details1.cert_verify_result.verified_cert = cert1;
8339 verify_details1.cert_verify_result.is_issued_by_known_root = true;
8340 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
8341
8342 scoped_refptr<X509Certificate> cert2(
8343 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
Ryan Sleevidef35f62018-01-23 21:12:248344 ASSERT_TRUE(cert2->VerifyNameMatch(origin2_.host()));
8345 ASSERT_FALSE(cert2->VerifyNameMatch(kDifferentHostname));
bnc359ed2a2016-04-29 20:43:458346
8347 ProofVerifyDetailsChromium verify_details2;
8348 verify_details2.cert_verify_result.verified_cert = cert2;
8349 verify_details2.cert_verify_result.is_issued_by_known_root = true;
8350 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
8351
fayang3bcb8b502016-12-07 21:44:378352 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
Ryan Hamilton8d9ee76e2018-05-29 23:52:528353 std::unique_ptr<quic::QuicEncryptedPacket> settings_packet(
rch5cb522462017-04-25 20:18:368354 client_maker_.MakeInitialSettingsPacket(1, nullptr));
bnceb9aa7112017-01-05 01:03:468355 MockWrite writes[] = {MockWrite(SYNCHRONOUS, settings_packet->data(),
8356 settings_packet->length(), 1)};
fayang3bcb8b502016-12-07 21:44:378357 std::unique_ptr<SequencedSocketData> sequenced_socket_data(
Ryan Sleevib8d7ea02018-05-07 20:01:018358 new SequencedSocketData(reads, writes));
Zhongyi Shi5f587cc2017-11-21 23:24:178359 socket_factory_->AddSocketDataProvider(sequenced_socket_data.get());
fayang3bcb8b502016-12-07 21:44:378360 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
8361 std::unique_ptr<SequencedSocketData> sequenced_socket_data1(
Ryan Sleevib8d7ea02018-05-07 20:01:018362 new SequencedSocketData(reads, writes));
Zhongyi Shi5f587cc2017-11-21 23:24:178363 socket_factory_->AddSocketDataProvider(sequenced_socket_data1.get());
fayang3bcb8b502016-12-07 21:44:378364 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data1));
bnc359ed2a2016-04-29 20:43:458365
zhongyi98d6a9262017-05-19 02:47:458366 QuicStreamRequest request1(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:038367 EXPECT_EQ(
8368 ERR_IO_PENDING,
8369 request1.Request(
8370 destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
8371 /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
8372 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:018373 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:248374 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
bnc359ed2a2016-04-29 20:43:458375 EXPECT_TRUE(stream1.get());
8376 EXPECT_TRUE(HasActiveSession(origin1_));
8377
8378 TestCompletionCallback callback2;
zhongyi98d6a9262017-05-19 02:47:458379 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:038380 EXPECT_EQ(
8381 ERR_IO_PENDING,
8382 request2.Request(
8383 destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
8384 /*cert_verify_flags=*/0, url2, net_log_, &net_error_details_,
8385 failed_on_default_network_callback_, callback2.callback()));
robpercival214763f2016-07-01 23:27:018386 EXPECT_THAT(callback2.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:248387 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
bnc359ed2a2016-04-29 20:43:458388 EXPECT_TRUE(stream2.get());
8389
8390 // |request2| does not pool to the first session, because the certificate does
8391 // not match. Instead, another session is opened to the same destination, but
Ryan Hamilton8d9ee76e2018-05-29 23:52:528392 // with a different quic::QuicServerId.
rchf0b18c8a2017-05-05 19:31:578393 QuicChromiumClientSession::Handle* session1 =
8394 QuicHttpStreamPeer::GetSessionHandle(stream1.get());
8395 QuicChromiumClientSession::Handle* session2 =
8396 QuicHttpStreamPeer::GetSessionHandle(stream2.get());
8397 EXPECT_FALSE(session1->SharesSameSession(*session2));
bnc359ed2a2016-04-29 20:43:458398
Ryan Hamilton4f0b26e2018-06-27 23:52:328399 EXPECT_EQ(quic::QuicServerId(origin1_.host(), origin1_.port(),
8400 privacy_mode_ == PRIVACY_MODE_ENABLED),
8401 session1->server_id());
8402 EXPECT_EQ(quic::QuicServerId(origin2_.host(), origin2_.port(),
8403 privacy_mode_ == PRIVACY_MODE_ENABLED),
8404 session2->server_id());
bnc359ed2a2016-04-29 20:43:458405
8406 EXPECT_TRUE(AllDataConsumed());
8407}
8408
msramek992625ec2016-08-04 18:33:588409// This test verifies that QuicStreamFactory::ClearCachedStatesInCryptoConfig
8410// correctly transform an origin filter to a ServerIdFilter. Whether the
8411// deletion itself works correctly is tested in QuicCryptoClientConfigTest.
8412TEST_P(QuicStreamFactoryTest, ClearCachedStatesInCryptoConfig) {
8413 Initialize();
Ryan Hamilton8d9ee76e2018-05-29 23:52:528414 quic::QuicCryptoClientConfig* crypto_config =
msramek992625ec2016-08-04 18:33:588415 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
8416
8417 struct TestCase {
8418 TestCase(const std::string& host,
8419 int port,
8420 PrivacyMode privacy_mode,
Ryan Hamilton8d9ee76e2018-05-29 23:52:528421 quic::QuicCryptoClientConfig* crypto_config)
msramek992625ec2016-08-04 18:33:588422 : server_id(host, port, privacy_mode),
8423 state(crypto_config->LookupOrCreate(server_id)) {
rch872e00e2016-12-02 02:48:188424 std::vector<string> certs(1);
msramek992625ec2016-08-04 18:33:588425 certs[0] = "cert";
8426 state->SetProof(certs, "cert_sct", "chlo_hash", "signature");
8427 state->set_source_address_token("TOKEN");
8428 state->SetProofValid();
8429
8430 EXPECT_FALSE(state->certs().empty());
8431 }
8432
Ryan Hamilton8d9ee76e2018-05-29 23:52:528433 quic::QuicServerId server_id;
8434 quic::QuicCryptoClientConfig::CachedState* state;
msramek992625ec2016-08-04 18:33:588435 } test_cases[] = {
8436 TestCase("www.google.com", 443, privacy_mode_, crypto_config),
8437 TestCase("www.example.com", 443, privacy_mode_, crypto_config),
8438 TestCase("www.example.com", 4433, privacy_mode_, crypto_config)};
8439
8440 // Clear cached states for the origin https://www.example.com:4433.
8441 GURL origin("https://www.example.com:4433");
csharrisonebeca8e2016-10-18 02:35:368442 factory_->ClearCachedStatesInCryptoConfig(base::Bind(
8443 static_cast<bool (*)(const GURL&, const GURL&)>(::operator==), origin));
msramek992625ec2016-08-04 18:33:588444 EXPECT_FALSE(test_cases[0].state->certs().empty());
8445 EXPECT_FALSE(test_cases[1].state->certs().empty());
8446 EXPECT_TRUE(test_cases[2].state->certs().empty());
8447
8448 // Clear all cached states.
8449 factory_->ClearCachedStatesInCryptoConfig(
8450 base::Callback<bool(const GURL&)>());
8451 EXPECT_TRUE(test_cases[0].state->certs().empty());
8452 EXPECT_TRUE(test_cases[1].state->certs().empty());
8453 EXPECT_TRUE(test_cases[2].state->certs().empty());
8454}
8455
Yixin Wang46a425f2017-08-10 23:02:208456// Passes connection options and client connection options to QuicStreamFactory,
Ryan Hamilton8d9ee76e2018-05-29 23:52:528457// then checks that its internal quic::QuicConfig is correct.
Yixin Wang46a425f2017-08-10 23:02:208458TEST_P(QuicStreamFactoryTest, ConfigConnectionOptions) {
Zhongyi Shi967d2f12019-02-08 20:58:538459 test_params_.quic_connection_options.push_back(quic::kTIME);
8460 test_params_.quic_connection_options.push_back(quic::kTBBR);
8461 test_params_.quic_connection_options.push_back(quic::kREJ);
Yixin Wang46a425f2017-08-10 23:02:208462
Zhongyi Shi967d2f12019-02-08 20:58:538463 test_params_.quic_client_connection_options.push_back(quic::kTBBR);
8464 test_params_.quic_client_connection_options.push_back(quic::k1RTT);
Yixin Wang46a425f2017-08-10 23:02:208465
8466 Initialize();
8467
Ryan Hamilton8d9ee76e2018-05-29 23:52:528468 const quic::QuicConfig* config =
8469 QuicStreamFactoryPeer::GetConfig(factory_.get());
Zhongyi Shi967d2f12019-02-08 20:58:538470 EXPECT_EQ(test_params_.quic_connection_options,
8471 config->SendConnectionOptions());
Yixin Wang46a425f2017-08-10 23:02:208472 EXPECT_TRUE(config->HasClientRequestedIndependentOption(
Ryan Hamilton8d9ee76e2018-05-29 23:52:528473 quic::kTBBR, quic::Perspective::IS_CLIENT));
Yixin Wang46a425f2017-08-10 23:02:208474 EXPECT_TRUE(config->HasClientRequestedIndependentOption(
Ryan Hamilton8d9ee76e2018-05-29 23:52:528475 quic::k1RTT, quic::Perspective::IS_CLIENT));
Yixin Wang46a425f2017-08-10 23:02:208476}
8477
Yixin Wang247ea642017-11-15 01:15:508478// Verifies that the host resolver uses the request priority passed to
8479// QuicStreamRequest::Request().
8480TEST_P(QuicStreamFactoryTest, HostResolverUsesRequestPriority) {
8481 Initialize();
8482 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8483 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8484
8485 MockQuicData socket_data;
8486 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:438487 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:178488 socket_data.AddSocketDataToFactory(socket_factory_.get());
Yixin Wang247ea642017-11-15 01:15:508489
8490 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338491 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038492 request.Request(
8493 host_port_pair_, version_, privacy_mode_, MAXIMUM_PRIORITY,
8494 SocketTag(),
8495 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8496 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang247ea642017-11-15 01:15:508497
8498 EXPECT_THAT(callback_.WaitForResult(), IsOk());
8499 std::unique_ptr<HttpStream> stream = CreateStream(&request);
8500 EXPECT_TRUE(stream.get());
8501
Renjiea0cb4a2c2018-09-26 23:37:308502 EXPECT_EQ(MAXIMUM_PRIORITY, host_resolver_->last_request_priority());
Yixin Wang247ea642017-11-15 01:15:508503
8504 EXPECT_TRUE(socket_data.AllReadDataConsumed());
8505 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
8506}
8507
Lily Chenf11e1292018-11-29 16:42:098508TEST_P(QuicStreamFactoryTest, HostResolverRequestReprioritizedOnSetPriority) {
8509 Initialize();
8510 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8511 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8512
8513 MockQuicData socket_data;
8514 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
8515 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
8516 socket_data.AddSocketDataToFactory(socket_factory_.get());
8517
8518 QuicStreamRequest request(factory_.get());
8519 EXPECT_EQ(ERR_IO_PENDING,
8520 request.Request(
8521 host_port_pair_, version_, privacy_mode_, MAXIMUM_PRIORITY,
8522 SocketTag(),
8523 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8524 failed_on_default_network_callback_, callback_.callback()));
8525
8526 EXPECT_EQ(MAXIMUM_PRIORITY, host_resolver_->last_request_priority());
8527 EXPECT_EQ(MAXIMUM_PRIORITY, host_resolver_->request_priority(1));
8528
8529 QuicStreamRequest request2(factory_.get());
8530 EXPECT_EQ(ERR_IO_PENDING,
8531 request2.Request(
8532 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8533 SocketTag(),
8534 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
8535 failed_on_default_network_callback_, callback_.callback()));
8536 EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->last_request_priority());
8537 EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->request_priority(2));
8538
8539 request.SetPriority(LOWEST);
8540 EXPECT_EQ(LOWEST, host_resolver_->request_priority(1));
8541 EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->request_priority(2));
8542}
8543
Zhongyi Shi967d2f12019-02-08 20:58:538544// Passes |quic_max_time_before_crypto_handshake_seconds| and
8545// |quic_max_idle_time_before_crypto_handshake_seconds| to QuicStreamFactory,
Ryan Hamilton8d9ee76e2018-05-29 23:52:528546// checks that its internal quic::QuicConfig is correct.
Yixin Wang469da562017-11-15 21:34:588547TEST_P(QuicStreamFactoryTest, ConfigMaxTimeBeforeCryptoHandshake) {
Zhongyi Shi967d2f12019-02-08 20:58:538548 test_params_.quic_max_time_before_crypto_handshake_seconds = 11;
8549 test_params_.quic_max_idle_time_before_crypto_handshake_seconds = 13;
Yixin Wang469da562017-11-15 21:34:588550 Initialize();
8551
Ryan Hamilton8d9ee76e2018-05-29 23:52:528552 const quic::QuicConfig* config =
8553 QuicStreamFactoryPeer::GetConfig(factory_.get());
8554 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(11),
Yixin Wang469da562017-11-15 21:34:588555 config->max_time_before_crypto_handshake());
Ryan Hamilton8d9ee76e2018-05-29 23:52:528556 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(13),
Yixin Wang469da562017-11-15 21:34:588557 config->max_idle_time_before_crypto_handshake());
8558}
8559
Yixin Wang7c5d11a82017-12-21 02:40:008560// Verify ResultAfterHostResolutionCallback behavior when host resolution
8561// succeeds asynchronously, then crypto handshake fails synchronously.
8562TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackAsyncSync) {
8563 Initialize();
8564 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8565 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8566
Renjiea0cb4a2c2018-09-26 23:37:308567 host_resolver_->set_ondemand_mode(true);
Yixin Wang7c5d11a82017-12-21 02:40:008568
8569 MockQuicData socket_data;
8570 socket_data.AddRead(SYNCHRONOUS, ERR_FAILED);
8571 socket_data.AddWrite(SYNCHRONOUS, ERR_FAILED);
8572 socket_data.AddSocketDataToFactory(socket_factory_.get());
8573
8574 QuicStreamRequest request(factory_.get());
8575 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038576 request.Request(
8577 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8578 SocketTag(),
8579 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8580 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:008581
8582 TestCompletionCallback host_resolution_callback;
8583 EXPECT_TRUE(
8584 request.WaitForHostResolution(host_resolution_callback.callback()));
8585
8586 // |host_resolver_| has not finished host resolution at this point, so
8587 // |host_resolution_callback| should not have a result.
8588 base::RunLoop().RunUntilIdle();
8589 EXPECT_FALSE(host_resolution_callback.have_result());
8590
8591 // Allow |host_resolver_| to finish host resolution.
8592 // Since the request fails immediately after host resolution (getting
8593 // ERR_FAILED from socket reads/writes), |host_resolution_callback| should be
8594 // called with ERR_QUIC_PROTOCOL_ERROR since that's the next result in
8595 // forming the connection.
Renjiea0cb4a2c2018-09-26 23:37:308596 host_resolver_->ResolveAllPending();
Yixin Wang7c5d11a82017-12-21 02:40:008597 base::RunLoop().RunUntilIdle();
8598 EXPECT_TRUE(host_resolution_callback.have_result());
8599 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, host_resolution_callback.WaitForResult());
8600
8601 // Calling WaitForHostResolution() a second time should return
8602 // false since host resolution has finished already.
8603 EXPECT_FALSE(
8604 request.WaitForHostResolution(host_resolution_callback.callback()));
8605
8606 EXPECT_TRUE(callback_.have_result());
8607 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback_.WaitForResult());
8608}
8609
8610// Verify ResultAfterHostResolutionCallback behavior when host resolution
8611// succeeds asynchronously, then crypto handshake fails asynchronously.
8612TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackAsyncAsync) {
8613 Initialize();
8614 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8615 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8616
Renjiea0cb4a2c2018-09-26 23:37:308617 host_resolver_->set_ondemand_mode(true);
Yixin Wang7c5d11a82017-12-21 02:40:008618 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:278619 MockCryptoClientStream::ZERO_RTT);
Yixin Wang7c5d11a82017-12-21 02:40:008620 factory_->set_require_confirmation(true);
8621
8622 MockQuicData socket_data;
8623 socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
8624 socket_data.AddRead(ASYNC, ERR_FAILED);
8625 socket_data.AddWrite(ASYNC, ERR_FAILED);
8626 socket_data.AddSocketDataToFactory(socket_factory_.get());
8627
8628 QuicStreamRequest request(factory_.get());
8629 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038630 request.Request(
8631 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8632 SocketTag(),
8633 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8634 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:008635
8636 TestCompletionCallback host_resolution_callback;
8637 EXPECT_TRUE(
8638 request.WaitForHostResolution(host_resolution_callback.callback()));
8639
8640 // |host_resolver_| has not finished host resolution at this point, so
8641 // |host_resolution_callback| should not have a result.
8642 base::RunLoop().RunUntilIdle();
8643 EXPECT_FALSE(host_resolution_callback.have_result());
8644
8645 // Allow |host_resolver_| to finish host resolution. Since crypto handshake
8646 // will hang after host resolution, |host_resolution_callback| should run with
8647 // ERR_IO_PENDING since that's the next result in forming the connection.
Renjiea0cb4a2c2018-09-26 23:37:308648 host_resolver_->ResolveAllPending();
Yixin Wang7c5d11a82017-12-21 02:40:008649 base::RunLoop().RunUntilIdle();
8650 EXPECT_TRUE(host_resolution_callback.have_result());
8651 EXPECT_EQ(ERR_IO_PENDING, host_resolution_callback.WaitForResult());
8652
8653 // Calling WaitForHostResolution() a second time should return
8654 // false since host resolution has finished already.
8655 EXPECT_FALSE(
8656 request.WaitForHostResolution(host_resolution_callback.callback()));
8657
8658 EXPECT_FALSE(callback_.have_result());
8659 socket_data.GetSequencedSocketData()->Resume();
8660 base::RunLoop().RunUntilIdle();
8661 EXPECT_TRUE(callback_.have_result());
8662 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback_.WaitForResult());
8663}
8664
8665// Verify ResultAfterHostResolutionCallback behavior when host resolution
8666// succeeds synchronously, then crypto handshake fails synchronously.
8667TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackSyncSync) {
8668 Initialize();
8669 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8670 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8671
Renjiea0cb4a2c2018-09-26 23:37:308672 host_resolver_->set_synchronous_mode(true);
Yixin Wang7c5d11a82017-12-21 02:40:008673
8674 MockQuicData socket_data;
8675 socket_data.AddRead(SYNCHRONOUS, ERR_FAILED);
8676 socket_data.AddWrite(SYNCHRONOUS, ERR_FAILED);
8677 socket_data.AddSocketDataToFactory(socket_factory_.get());
8678
8679 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338680 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR,
Zhongyi Shia6b68d112018-09-24 07:49:038681 request.Request(
8682 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8683 SocketTag(),
8684 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8685 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:008686
8687 // WaitForHostResolution() should return false since host
8688 // resolution has finished already.
8689 TestCompletionCallback host_resolution_callback;
8690 EXPECT_FALSE(
8691 request.WaitForHostResolution(host_resolution_callback.callback()));
8692 base::RunLoop().RunUntilIdle();
8693 EXPECT_FALSE(host_resolution_callback.have_result());
8694 EXPECT_FALSE(callback_.have_result());
8695}
8696
8697// Verify ResultAfterHostResolutionCallback behavior when host resolution
8698// succeeds synchronously, then crypto handshake fails asynchronously.
8699TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackSyncAsync) {
8700 Initialize();
8701 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8702 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8703
8704 // Host resolution will succeed synchronously, but Request() as a whole
8705 // will fail asynchronously.
Renjiea0cb4a2c2018-09-26 23:37:308706 host_resolver_->set_synchronous_mode(true);
Yixin Wang7c5d11a82017-12-21 02:40:008707 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:278708 MockCryptoClientStream::ZERO_RTT);
Yixin Wang7c5d11a82017-12-21 02:40:008709 factory_->set_require_confirmation(true);
8710
8711 MockQuicData socket_data;
8712 socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
8713 socket_data.AddRead(ASYNC, ERR_FAILED);
8714 socket_data.AddWrite(ASYNC, ERR_FAILED);
8715 socket_data.AddSocketDataToFactory(socket_factory_.get());
8716
8717 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338718 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038719 request.Request(
8720 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8721 SocketTag(),
8722 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8723 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:008724
8725 // WaitForHostResolution() should return false since host
8726 // resolution has finished already.
8727 TestCompletionCallback host_resolution_callback;
8728 EXPECT_FALSE(
8729 request.WaitForHostResolution(host_resolution_callback.callback()));
8730 base::RunLoop().RunUntilIdle();
8731 EXPECT_FALSE(host_resolution_callback.have_result());
8732
8733 EXPECT_FALSE(callback_.have_result());
8734 socket_data.GetSequencedSocketData()->Resume();
8735 base::RunLoop().RunUntilIdle();
8736 EXPECT_TRUE(callback_.have_result());
8737 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback_.WaitForResult());
8738}
8739
8740// Verify ResultAfterHostResolutionCallback behavior when host resolution fails
8741// synchronously.
8742TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackFailSync) {
8743 Initialize();
8744 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8745 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8746
8747 // Host resolution will fail synchronously.
Renjiea0cb4a2c2018-09-26 23:37:308748 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
8749 host_resolver_->set_synchronous_mode(true);
Yixin Wang7c5d11a82017-12-21 02:40:008750
8751 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338752 EXPECT_EQ(ERR_NAME_NOT_RESOLVED,
Zhongyi Shia6b68d112018-09-24 07:49:038753 request.Request(
8754 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8755 SocketTag(),
8756 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8757 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:008758
8759 // WaitForHostResolution() should return false since host
8760 // resolution has failed already.
8761 TestCompletionCallback host_resolution_callback;
8762 EXPECT_FALSE(
8763 request.WaitForHostResolution(host_resolution_callback.callback()));
8764 base::RunLoop().RunUntilIdle();
8765 EXPECT_FALSE(host_resolution_callback.have_result());
8766}
8767
8768// Verify ResultAfterHostResolutionCallback behavior when host resolution fails
8769// asynchronously.
8770TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackFailAsync) {
8771 Initialize();
8772 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8773 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8774
Renjiea0cb4a2c2018-09-26 23:37:308775 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
Yixin Wang7c5d11a82017-12-21 02:40:008776
8777 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338778 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038779 request.Request(
8780 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8781 SocketTag(),
8782 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8783 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:008784
8785 TestCompletionCallback host_resolution_callback;
8786 EXPECT_TRUE(
8787 request.WaitForHostResolution(host_resolution_callback.callback()));
8788
8789 // Allow |host_resolver_| to fail host resolution. |host_resolution_callback|
8790 // Should run with ERR_NAME_NOT_RESOLVED since that's the error host
8791 // resolution failed with.
8792 base::RunLoop().RunUntilIdle();
8793 EXPECT_TRUE(host_resolution_callback.have_result());
8794 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, host_resolution_callback.WaitForResult());
8795
8796 EXPECT_TRUE(callback_.have_result());
8797 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
8798}
8799
Renjiea0cb4a2c2018-09-26 23:37:308800// With dns race experiment turned on, and DNS resolve succeeds synchronously,
8801// the final connection is established through the resolved DNS. No racing
8802// connection.
8803TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceAndHostResolutionSync) {
Zhongyi Shi967d2f12019-02-08 20:58:538804 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:308805 host_resolver_ = std::make_unique<MockCachingHostResolver>();
8806 Initialize();
8807 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8808 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8809
8810 // Set an address in resolver for synchronous return.
8811 host_resolver_->set_synchronous_mode(true);
8812 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
8813 kNonCachedIPAddress, "");
8814
8815 // Set up a different address in stale resolver cache.
8816 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
8817 HostCache::Entry entry(OK,
8818 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
8819 HostCache::Entry::SOURCE_DNS);
8820 base::TimeDelta zero;
8821 HostCache* cache = host_resolver_->GetHostCache();
8822 cache->Set(key, entry, base::TimeTicks::Now(), zero);
8823 // Expire the cache
8824 cache->OnNetworkChange();
Renjie8d2d8d91b2018-09-29 00:29:038825
Renjiea0cb4a2c2018-09-26 23:37:308826 MockQuicData quic_data;
8827 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
8828 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
8829 quic_data.AddSocketDataToFactory(socket_factory_.get());
8830
8831 QuicStreamRequest request(factory_.get());
8832 EXPECT_THAT(request.Request(
8833 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8834 SocketTag(),
8835 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8836 failed_on_default_network_callback_, callback_.callback()),
8837 IsOk());
8838 std::unique_ptr<HttpStream> stream = CreateStream(&request);
8839 EXPECT_TRUE(stream.get());
8840 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
8841 EXPECT_EQ(
8842 session->peer_address().impl().socket_address().ToStringWithoutPort(),
8843 kNonCachedIPAddress);
8844
8845 EXPECT_TRUE(quic_data.AllReadDataConsumed());
8846 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
8847}
8848
8849// With dns race experiment on, DNS resolve returns async, no matching cache in
8850// host resolver, connection should be successful and through resolved DNS. No
8851// racing connection.
8852TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceAndHostResolutionAsync) {
Renjiea0cb4a2c2018-09-26 23:37:308853 host_resolver_ = std::make_unique<MockCachingHostResolver>();
8854 Initialize();
8855 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8856 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8857
8858 // Set an address in resolver for asynchronous return.
8859 host_resolver_->set_ondemand_mode(true);
8860 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
8861 kNonCachedIPAddress, "");
8862
8863 MockQuicData quic_data;
8864 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
8865 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
8866 quic_data.AddSocketDataToFactory(socket_factory_.get());
8867
8868 QuicStreamRequest request(factory_.get());
8869 EXPECT_EQ(ERR_IO_PENDING,
8870 request.Request(
8871 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8872 SocketTag(),
8873 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8874 failed_on_default_network_callback_, callback_.callback()));
8875 TestCompletionCallback host_resolution_callback;
8876 EXPECT_TRUE(
8877 request.WaitForHostResolution(host_resolution_callback.callback()));
8878 base::RunLoop().RunUntilIdle();
8879 EXPECT_FALSE(host_resolution_callback.have_result());
8880
8881 // Cause the host resolution to return.
8882 host_resolver_->ResolveAllPending();
8883 EXPECT_THAT(host_resolution_callback.WaitForResult(), IsOk());
8884 EXPECT_THAT(callback_.WaitForResult(), IsOk());
8885
8886 std::unique_ptr<HttpStream> stream = CreateStream(&request);
8887 EXPECT_TRUE(stream.get());
8888 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
8889
8890 EXPECT_EQ(
8891 session->peer_address().impl().socket_address().ToStringWithoutPort(),
8892 kNonCachedIPAddress);
8893
8894 EXPECT_TRUE(quic_data.AllReadDataConsumed());
8895 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
8896}
8897
8898// With dns race experiment on, DNS resolve returns async, stale dns used,
8899// connects synchrounously, and then the resolved DNS matches.
8900TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsyncStaleMatch) {
Zhongyi Shi967d2f12019-02-08 20:58:538901 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:308902 host_resolver_ = std::make_unique<MockCachingHostResolver>();
8903 Initialize();
8904 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8905 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8906
8907 // Set an address in resolver for asynchronous return.
8908 host_resolver_->set_ondemand_mode(true);
8909 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
8910 kCachedIPAddress.ToString(), "");
8911
8912 // Set up the same address in the stale resolver cache.
8913 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
8914 HostCache::Entry entry(OK,
8915 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
8916 HostCache::Entry::SOURCE_DNS);
8917 base::TimeDelta zero;
8918 HostCache* cache = host_resolver_->GetHostCache();
8919 cache->Set(key, entry, base::TimeTicks::Now(), zero);
8920 // Expire the cache
8921 cache->OnNetworkChange();
8922
8923 MockQuicData quic_data;
8924 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
8925 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
8926 quic_data.AddSocketDataToFactory(socket_factory_.get());
8927
8928 QuicStreamRequest request(factory_.get());
8929 EXPECT_EQ(ERR_IO_PENDING,
8930 request.Request(
8931 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8932 SocketTag(),
8933 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8934 failed_on_default_network_callback_, callback_.callback()));
8935
8936 // Check that the racing job is running.
8937 EXPECT_TRUE(HasLiveSession(host_port_pair_));
8938 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
8939
8940 // Resolve dns and return.
8941 host_resolver_->ResolveAllPending();
8942 EXPECT_THAT(callback_.WaitForResult(), IsOk());
8943 std::unique_ptr<HttpStream> stream = CreateStream(&request);
8944 EXPECT_TRUE(stream.get());
8945
8946 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
8947
8948 EXPECT_EQ(
8949 session->peer_address().impl().socket_address().ToStringWithoutPort(),
8950 kCachedIPAddress.ToString());
8951
8952 EXPECT_TRUE(quic_data.AllReadDataConsumed());
8953 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
8954}
8955
8956// With dns race experiment on, dns resolve async, stale dns used, connect
8957// async, and then the result matches.
8958TEST_P(QuicStreamFactoryTest,
8959 ResultAfterDNSRaceHostResolveAsyncConnectAsyncStaleMatch) {
Zhongyi Shi967d2f12019-02-08 20:58:538960 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:308961 host_resolver_ = std::make_unique<MockCachingHostResolver>();
8962 Initialize();
8963 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8964 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8965
8966 // Set an address in resolver for asynchronous return.
8967 host_resolver_->set_ondemand_mode(true);
8968 factory_->set_require_confirmation(true);
8969 crypto_client_stream_factory_.set_handshake_mode(
8970 MockCryptoClientStream::ZERO_RTT);
8971 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
8972 kCachedIPAddress.ToString(), "");
8973
8974 // Set up the same address in the stale resolver cache.
8975 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
8976 HostCache::Entry entry(OK,
8977 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
8978 HostCache::Entry::SOURCE_DNS);
8979 base::TimeDelta zero;
8980 HostCache* cache = host_resolver_->GetHostCache();
8981 cache->Set(key, entry, base::TimeTicks::Now(), zero);
8982 // Expire the cache
8983 cache->OnNetworkChange();
8984
8985 MockQuicData quic_data;
8986 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
8987 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
8988 quic_data.AddSocketDataToFactory(socket_factory_.get());
8989
8990 QuicStreamRequest request(factory_.get());
8991 EXPECT_EQ(ERR_IO_PENDING,
8992 request.Request(
8993 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8994 SocketTag(),
8995 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8996 failed_on_default_network_callback_, callback_.callback()));
8997
8998 // Send Crypto handshake so connect will call back.
8999 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
9000 quic::QuicSession::HANDSHAKE_CONFIRMED);
9001 base::RunLoop().RunUntilIdle();
9002
9003 // Check that the racing job is running.
9004 EXPECT_TRUE(HasLiveSession(host_port_pair_));
9005 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9006
9007 // Resolve dns and call back, make sure job finishes.
9008 host_resolver_->ResolveAllPending();
9009 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9010
9011 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9012 EXPECT_TRUE(stream.get());
9013
9014 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9015
9016 EXPECT_EQ(
9017 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9018 kCachedIPAddress.ToString());
9019
9020 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9021 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9022}
9023
9024// With dns race experiment on, dns resolve async, stale dns used, dns resolve
9025// return, then connection finishes and matches with the result.
9026TEST_P(QuicStreamFactoryTest,
9027 ResultAfterDNSRaceHostResolveAsyncStaleMatchConnectAsync) {
Zhongyi Shi967d2f12019-02-08 20:58:539028 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309029 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9030 Initialize();
9031 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9032 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9033
9034 // Set an address in resolver for asynchronous return.
9035 host_resolver_->set_ondemand_mode(true);
9036 factory_->set_require_confirmation(true);
9037 crypto_client_stream_factory_.set_handshake_mode(
9038 MockCryptoClientStream::ZERO_RTT);
9039 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9040 kCachedIPAddress.ToString(), "");
9041
9042 // Set up the same address in the stale resolver cache.
9043 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9044 HostCache::Entry entry(OK,
9045 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9046 HostCache::Entry::SOURCE_DNS);
9047 base::TimeDelta zero;
9048 HostCache* cache = host_resolver_->GetHostCache();
9049 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9050 // Expire the cache
9051 cache->OnNetworkChange();
9052
9053 MockQuicData quic_data;
9054 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9055 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9056 quic_data.AddSocketDataToFactory(socket_factory_.get());
9057
9058 QuicStreamRequest request(factory_.get());
9059 EXPECT_EQ(ERR_IO_PENDING,
9060 request.Request(
9061 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9062 SocketTag(),
9063 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9064 failed_on_default_network_callback_, callback_.callback()));
9065
9066 // Finish dns async, check we still need to wait for stale connection async.
9067 host_resolver_->ResolveAllPending();
9068 base::RunLoop().RunUntilIdle();
9069 EXPECT_FALSE(callback_.have_result());
9070
9071 // Finish stale connection async, and the stale connection should pass dns
9072 // validation.
9073 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
9074 quic::QuicSession::HANDSHAKE_CONFIRMED);
9075 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9076 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9077 EXPECT_TRUE(stream.get());
9078
9079 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9080 EXPECT_EQ(
9081 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9082 kCachedIPAddress.ToString());
9083
9084 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9085 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9086}
9087
9088// With dns race experiment on, dns resolve async, stale used and connects
9089// sync, but dns no match
9090TEST_P(QuicStreamFactoryTest,
9091 ResultAfterDNSRaceHostResolveAsyncStaleSyncNoMatch) {
Zhongyi Shi967d2f12019-02-08 20:58:539092 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309093 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9094 Initialize();
9095 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9096 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9097
9098 // Set an address in resolver for asynchronous return.
9099 host_resolver_->set_ondemand_mode(true);
9100 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9101 kNonCachedIPAddress, "");
9102
9103 // Set up a different address in the stale resolver cache.
9104 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9105 HostCache::Entry entry(OK,
9106 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9107 HostCache::Entry::SOURCE_DNS);
9108 base::TimeDelta zero;
9109 HostCache* cache = host_resolver_->GetHostCache();
9110 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9111 // Expire the cache
9112 cache->OnNetworkChange();
9113
9114 // Socket for the stale connection which will invoke connection closure.
9115 MockQuicData quic_data;
9116 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9117 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9118 quic_data.AddWrite(
Renjief5fcb172019-02-05 01:59:339119 SYNCHRONOUS,
9120 client_maker_.MakeConnectionClosePacket(
9121 2, true, quic::QUIC_STALE_CONNECTION_CANCELLED, "net error"));
Renjiea0cb4a2c2018-09-26 23:37:309122 quic_data.AddSocketDataToFactory(socket_factory_.get());
9123
9124 // Socket for the new connection.
9125 MockQuicData quic_data2;
9126 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9127 quic_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9128 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9129
9130 QuicStreamRequest request(factory_.get());
9131 EXPECT_EQ(ERR_IO_PENDING,
9132 request.Request(
9133 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9134 SocketTag(),
9135 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9136 failed_on_default_network_callback_, callback_.callback()));
9137
9138 // Check the stale connection is running.
9139 EXPECT_TRUE(HasLiveSession(host_port_pair_));
9140 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9141
9142 // Finish dns resolution and check the job has finished.
9143 host_resolver_->ResolveAllPending();
9144 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9145
9146 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9147 EXPECT_TRUE(stream.get());
9148
9149 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9150
9151 EXPECT_EQ(
9152 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9153 kNonCachedIPAddress);
9154
9155 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9156 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9157 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
9158 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
9159}
9160
9161// With dns race experiment on, dns resolve async, stale used and connects
9162// async, finishes before dns, but no match
9163TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleAsyncResolveAsyncNoMatch) {
Zhongyi Shi967d2f12019-02-08 20:58:539164 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309165 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9166 Initialize();
9167 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9168 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9169
9170 // Set an address in resolver for asynchronous return.
9171 host_resolver_->set_ondemand_mode(true);
9172 factory_->set_require_confirmation(true);
9173 crypto_client_stream_factory_.set_handshake_mode(
9174 MockCryptoClientStream::ZERO_RTT);
9175 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9176 kNonCachedIPAddress, "");
9177
9178 // Set up a different address in the stale resolvercache.
9179 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9180 HostCache::Entry entry(OK,
9181 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9182 HostCache::Entry::SOURCE_DNS);
9183 base::TimeDelta zero;
9184 HostCache* cache = host_resolver_->GetHostCache();
9185 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9186 // Expire the cache
9187 cache->OnNetworkChange();
9188
9189 MockQuicData quic_data;
9190 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9191 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9192 quic_data.AddWrite(
Renjief5fcb172019-02-05 01:59:339193 SYNCHRONOUS,
9194 client_maker_.MakeConnectionClosePacket(
9195 2, true, quic::QUIC_STALE_CONNECTION_CANCELLED, "net error"));
Renjiea0cb4a2c2018-09-26 23:37:309196 quic_data.AddSocketDataToFactory(socket_factory_.get());
9197
9198 MockQuicData quic_data2;
9199 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9200 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9201
9202 QuicStreamRequest request(factory_.get());
9203 EXPECT_EQ(ERR_IO_PENDING,
9204 request.Request(
9205 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9206 SocketTag(),
9207 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9208 failed_on_default_network_callback_, callback_.callback()));
9209
9210 // Finish the stale connection.
9211 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
9212 quic::QuicSession::HANDSHAKE_CONFIRMED);
9213 base::RunLoop().RunUntilIdle();
9214 EXPECT_TRUE(HasLiveSession(host_port_pair_));
9215 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9216
9217 // Finish host resolution and check the job is done.
9218 host_resolver_->ResolveAllPending();
9219 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9220
9221 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9222 EXPECT_TRUE(stream.get());
9223
9224 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9225 EXPECT_EQ(
9226 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9227 kNonCachedIPAddress);
9228
9229 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9230 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9231 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
9232 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
9233}
9234
9235// With dns race experiment on, dns resolve async, stale used and connects
9236// async, dns finishes first, but no match
9237TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceResolveAsyncStaleAsyncNoMatch) {
Zhongyi Shi967d2f12019-02-08 20:58:539238 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309239 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9240 Initialize();
9241 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9242 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9243
9244 // Set an address in resolver for asynchronous return.
9245 host_resolver_->set_ondemand_mode(true);
9246 factory_->set_require_confirmation(true);
9247 crypto_client_stream_factory_.set_handshake_mode(
9248 MockCryptoClientStream::ZERO_RTT);
9249 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9250 kNonCachedIPAddress, "");
9251
9252 // Set up a different address in the stale resolver cache.
9253 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9254 HostCache::Entry entry(OK,
9255 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9256 HostCache::Entry::SOURCE_DNS);
9257 base::TimeDelta zero;
9258 HostCache* cache = host_resolver_->GetHostCache();
9259 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9260 // Expire the cache
9261 cache->OnNetworkChange();
9262
9263 MockQuicData quic_data;
9264 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Renjie8d2d8d91b2018-09-29 00:29:039265 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_INITIAL);
Renjiea0cb4a2c2018-09-26 23:37:309266 quic_data.AddWrite(
Renjief5fcb172019-02-05 01:59:339267 SYNCHRONOUS,
9268 client_maker_.MakeConnectionClosePacket(
9269 1, true, quic::QUIC_STALE_CONNECTION_CANCELLED, "net error"));
Renjiea0cb4a2c2018-09-26 23:37:309270 quic_data.AddSocketDataToFactory(socket_factory_.get());
9271
9272 MockQuicData quic_data2;
9273 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Renjie8d2d8d91b2018-09-29 00:29:039274 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_FORWARD_SECURE);
9275 quic_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Renjiea0cb4a2c2018-09-26 23:37:309276 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9277
9278 QuicStreamRequest request(factory_.get());
9279 EXPECT_EQ(ERR_IO_PENDING,
9280 request.Request(
9281 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9282 SocketTag(),
9283 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9284 failed_on_default_network_callback_, callback_.callback()));
9285 // Finish dns resolution, but need to wait for stale connection.
9286 host_resolver_->ResolveAllPending();
Renjie8d2d8d91b2018-09-29 00:29:039287 base::RunLoop().RunUntilIdle();
Renjiea0cb4a2c2018-09-26 23:37:309288 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
9289 quic::QuicSession::HANDSHAKE_CONFIRMED);
9290 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9291
9292 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9293 EXPECT_TRUE(stream.get());
9294
9295 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9296 EXPECT_EQ(
9297 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9298 kNonCachedIPAddress);
9299
9300 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9301 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9302 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
9303 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
9304}
9305
9306// With dns race experiment on, dns resolve returns error sync, same behavior
9307// as experiment is not on
9308TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveError) {
Zhongyi Shi967d2f12019-02-08 20:58:539309 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309310 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9311 Initialize();
9312 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9313 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9314
9315 // Set synchronous failure in resolver.
9316 host_resolver_->set_synchronous_mode(true);
9317 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
9318
9319 MockQuicData quic_data;
9320 quic_data.AddSocketDataToFactory(socket_factory_.get());
9321 QuicStreamRequest request(factory_.get());
9322
9323 EXPECT_EQ(ERR_NAME_NOT_RESOLVED,
9324 request.Request(
9325 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9326 SocketTag(),
9327 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9328 failed_on_default_network_callback_, callback_.callback()));
9329}
9330
9331// With dns race experiment on, no cache available, dns resolve returns error
9332// async
9333TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsyncError) {
Zhongyi Shi967d2f12019-02-08 20:58:539334 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309335 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9336 Initialize();
9337 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9338 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9339
9340 // Set asynchronous failure in resolver.
9341 host_resolver_->set_ondemand_mode(true);
9342 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
9343
9344 MockQuicData quic_data;
9345 quic_data.AddSocketDataToFactory(socket_factory_.get());
9346 QuicStreamRequest request(factory_.get());
9347
9348 EXPECT_EQ(ERR_IO_PENDING,
9349 request.Request(
9350 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9351 SocketTag(),
9352 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9353 failed_on_default_network_callback_, callback_.callback()));
9354
9355 // Resolve and expect result that shows the resolution error.
9356 host_resolver_->ResolveAllPending();
9357 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
9358}
9359
9360// With dns race experiment on, dns resolve async, staled used and connects
9361// sync, dns returns error and no connection is established.
9362TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleSyncHostResolveError) {
Zhongyi Shi967d2f12019-02-08 20:58:539363 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309364 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9365 Initialize();
9366 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9367 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9368
9369 // Set asynchronous failure in resolver.
9370 host_resolver_->set_ondemand_mode(true);
9371 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
9372
9373 // Set up an address in the stale cache.
9374 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9375 HostCache::Entry entry(OK,
9376 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9377 HostCache::Entry::SOURCE_DNS);
9378 base::TimeDelta zero;
9379 HostCache* cache = host_resolver_->GetHostCache();
9380 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9381 // Expire the cache
9382 cache->OnNetworkChange();
9383
9384 // Socket for the stale connection which is supposed to disconnect.
9385 MockQuicData quic_data;
9386 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9387 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9388 quic_data.AddWrite(
Renjief5fcb172019-02-05 01:59:339389 SYNCHRONOUS,
9390 client_maker_.MakeConnectionClosePacket(
9391 2, true, quic::QUIC_STALE_CONNECTION_CANCELLED, "net error"));
Renjiea0cb4a2c2018-09-26 23:37:309392 quic_data.AddSocketDataToFactory(socket_factory_.get());
9393
9394 QuicStreamRequest request(factory_.get());
9395 EXPECT_EQ(ERR_IO_PENDING,
9396 request.Request(
9397 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9398 SocketTag(),
9399 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9400 failed_on_default_network_callback_, callback_.callback()));
9401
9402 // Check that the stale connection is running.
9403 EXPECT_TRUE(HasLiveSession(host_port_pair_));
9404 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9405
9406 // Finish host resolution.
9407 host_resolver_->ResolveAllPending();
9408 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
9409
Renjiea0cb4a2c2018-09-26 23:37:309410 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9411 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9412}
9413
9414// With dns race experiment on, dns resolve async, stale used and connection
9415// return error, then dns matches
9416TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSMatches) {
Zhongyi Shi967d2f12019-02-08 20:58:539417 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309418 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9419 Initialize();
9420 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9421 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9422
9423 // Set an address in host resolver for asynchronous return.
9424 host_resolver_->set_ondemand_mode(true);
9425 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9426 kCachedIPAddress.ToString(), "");
9427
9428 // Set up the same address in the stale resolver cache.
9429 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9430 HostCache::Entry entry(OK,
9431 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9432 HostCache::Entry::SOURCE_DNS);
9433 base::TimeDelta zero;
9434 HostCache* cache = host_resolver_->GetHostCache();
9435 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9436 // Expire the cache
9437 cache->OnNetworkChange();
9438
9439 // Simulate synchronous connect failure.
9440 MockQuicData quic_data;
9441 quic_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
9442 quic_data.AddSocketDataToFactory(socket_factory_.get());
9443
9444 MockQuicData quic_data2;
9445 quic_data2.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
9446 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9447
9448 QuicStreamRequest request(factory_.get());
9449 EXPECT_EQ(ERR_IO_PENDING,
9450 request.Request(
9451 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9452 SocketTag(),
9453 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9454 failed_on_default_network_callback_, callback_.callback()));
9455 EXPECT_FALSE(HasLiveSession(host_port_pair_));
9456 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9457
9458 host_resolver_->ResolveAllPending();
9459 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_ADDRESS_IN_USE));
9460}
9461
9462// With dns race experiment on, dns resolve async, stale used and connection
9463// returns error, dns no match, new connection is established
9464TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSNoMatch) {
Zhongyi Shi967d2f12019-02-08 20:58:539465 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309466 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9467 Initialize();
9468 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9469 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9470
9471 // Set an address in host resolver.
9472 host_resolver_->set_ondemand_mode(true);
9473 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9474 kNonCachedIPAddress, "");
9475
9476 // Set up a different address in stale resolver cache.
9477 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9478 HostCache::Entry entry(OK,
9479 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9480 HostCache::Entry::SOURCE_DNS);
9481 base::TimeDelta zero;
9482 HostCache* cache = host_resolver_->GetHostCache();
9483 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9484 // Expire the cache
9485 cache->OnNetworkChange();
9486
9487 // Add failure for the stale connection.
9488 MockQuicData quic_data;
9489 quic_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
9490 quic_data.AddSocketDataToFactory(socket_factory_.get());
9491
9492 MockQuicData quic_data2;
9493 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9494 quic_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9495 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9496
9497 QuicStreamRequest request(factory_.get());
9498 EXPECT_EQ(ERR_IO_PENDING,
9499 request.Request(
9500 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9501 SocketTag(),
9502 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9503 failed_on_default_network_callback_, callback_.callback()));
9504
9505 // Check that the stale connection fails.
9506 EXPECT_FALSE(HasLiveSession(host_port_pair_));
9507 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9508
9509 // Finish host resolution and check the job finishes ok.
9510 host_resolver_->ResolveAllPending();
9511 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9512
9513 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9514 EXPECT_TRUE(stream.get());
9515
9516 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9517
9518 EXPECT_EQ(
9519 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9520 kNonCachedIPAddress);
9521
9522 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
9523 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
9524}
9525
9526// With dns race experiment on, dns resolve async, stale used and connection
9527// returns error, dns no match, new connection error
9528TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSNoMatchError) {
Zhongyi Shi967d2f12019-02-08 20:58:539529 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309530 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9531 Initialize();
9532 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9533 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9534
9535 // Set an address in host resolver asynchronously.
9536 host_resolver_->set_ondemand_mode(true);
9537 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9538 kNonCachedIPAddress, "");
9539
9540 // Set up a different address in the stale cache.
9541 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9542 HostCache::Entry entry(OK,
9543 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9544 HostCache::Entry::SOURCE_DNS);
9545 base::TimeDelta zero;
9546 HostCache* cache = host_resolver_->GetHostCache();
9547 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9548 // Expire the cache
9549 cache->OnNetworkChange();
9550
9551 // Add failure for stale connection.
9552 MockQuicData quic_data;
9553 quic_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
9554 quic_data.AddSocketDataToFactory(socket_factory_.get());
9555
9556 // Add failure for resolved dns connection.
9557 MockQuicData quic_data2;
9558 quic_data2.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
9559 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9560
9561 QuicStreamRequest request(factory_.get());
9562 EXPECT_EQ(ERR_IO_PENDING,
9563 request.Request(
9564 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9565 SocketTag(),
9566 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9567 failed_on_default_network_callback_, callback_.callback()));
9568
9569 // Check the stale connection fails.
9570 EXPECT_FALSE(HasLiveSession(host_port_pair_));
9571 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9572
9573 // Check the resolved dns connection fails.
9574 host_resolver_->ResolveAllPending();
9575 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_ADDRESS_IN_USE));
9576}
9577
9578// With dns race experiment on, dns resolve async and stale connect async, dns
9579// resolve returns error and then preconnect finishes
9580TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceResolveAsyncErrorStaleAsync) {
Zhongyi Shi967d2f12019-02-08 20:58:539581 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309582 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9583 Initialize();
9584 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9585 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9586
9587 // Add asynchronous failure in host resolver.
9588 host_resolver_->set_ondemand_mode(true);
9589 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
9590 factory_->set_require_confirmation(true);
9591 crypto_client_stream_factory_.set_handshake_mode(
9592 MockCryptoClientStream::ZERO_RTT);
9593
9594 // Set up an address in stale resolver cache.
9595 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9596 HostCache::Entry entry(OK,
9597 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9598 HostCache::Entry::SOURCE_DNS);
9599 base::TimeDelta zero;
9600 HostCache* cache = host_resolver_->GetHostCache();
9601 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9602 // Expire the cache
9603 cache->OnNetworkChange();
9604
9605 // Socket data for stale connection which is supposed to disconnect.
9606 MockQuicData quic_data;
9607 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9608 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_INITIAL);
9609 quic_data.AddWrite(
Renjief5fcb172019-02-05 01:59:339610 SYNCHRONOUS,
9611 client_maker_.MakeConnectionClosePacket(
9612 1, true, quic::QUIC_STALE_CONNECTION_CANCELLED, "net error"));
Renjiea0cb4a2c2018-09-26 23:37:309613 quic_data.AddSocketDataToFactory(socket_factory_.get());
9614
9615 QuicStreamRequest request(factory_.get());
9616 EXPECT_EQ(ERR_IO_PENDING,
9617 request.Request(
9618 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9619 SocketTag(),
9620 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9621 failed_on_default_network_callback_, callback_.callback()));
9622
9623 // host resolution returned but stale connection hasn't finished yet.
9624 host_resolver_->ResolveAllPending();
9625 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
9626
9627 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9628 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9629}
9630
9631// With dns race experiment on, dns resolve async and stale connect async, dns
Renjiea0cb4a2c2018-09-26 23:37:309632// resolve returns error and then preconnect fails.
9633TEST_P(QuicStreamFactoryTest,
9634 ResultAfterDNSRaceResolveAsyncErrorStaleAsyncError) {
Zhongyi Shi967d2f12019-02-08 20:58:539635 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309636 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9637 Initialize();
9638 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9639 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9640
9641 // Add asynchronous failure to host resolver.
9642 host_resolver_->set_ondemand_mode(true);
9643 factory_->set_require_confirmation(true);
9644 crypto_client_stream_factory_.set_handshake_mode(
9645 MockCryptoClientStream::ZERO_RTT);
9646 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
9647
9648 // Set up an address in stale resolver cache.
9649 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9650 HostCache::Entry entry(OK,
9651 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9652 HostCache::Entry::SOURCE_DNS);
9653 base::TimeDelta zero;
9654 HostCache* cache = host_resolver_->GetHostCache();
9655 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9656 // Expire the cache
9657 cache->OnNetworkChange();
9658
9659 MockQuicData quic_data;
9660 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9661 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_INITIAL);
9662 quic_data.AddWrite(
Renjief5fcb172019-02-05 01:59:339663 SYNCHRONOUS,
9664 client_maker_.MakeConnectionClosePacket(
9665 1, true, quic::QUIC_STALE_CONNECTION_CANCELLED, "net error"));
Renjiea0cb4a2c2018-09-26 23:37:309666 quic_data.AddSocketDataToFactory(socket_factory_.get());
9667
9668 QuicStreamRequest request(factory_.get());
9669 EXPECT_EQ(ERR_IO_PENDING,
9670 request.Request(
9671 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9672 SocketTag(),
9673 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9674 failed_on_default_network_callback_, callback_.callback()));
9675
9676 // Host Resolution returns failure but stale connection hasn't finished.
9677 host_resolver_->ResolveAllPending();
9678
9679 // Check that the final error is on resolution failure.
9680 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
9681
9682 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9683}
9684
9685// With dns race experiment on, test that host resolution callback behaves
9686// normal as experiment is not on
9687TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsync) {
Zhongyi Shi967d2f12019-02-08 20:58:539688 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309689 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9690 Initialize();
9691 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9692 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9693
9694 host_resolver_->set_ondemand_mode(true);
9695 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9696 kNonCachedIPAddress, "");
9697
9698 MockQuicData quic_data;
9699 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9700 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9701 quic_data.AddSocketDataToFactory(socket_factory_.get());
9702
9703 QuicStreamRequest request(factory_.get());
9704 EXPECT_EQ(ERR_IO_PENDING,
9705 request.Request(
9706 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9707 SocketTag(),
9708 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9709 failed_on_default_network_callback_, callback_.callback()));
9710
9711 // Check that expect_on_host_resolution_ is properlly set.
9712 TestCompletionCallback host_resolution_callback;
9713 EXPECT_TRUE(
9714 request.WaitForHostResolution(host_resolution_callback.callback()));
9715 base::RunLoop().RunUntilIdle();
9716 EXPECT_FALSE(host_resolution_callback.have_result());
9717
9718 host_resolver_->ResolveAllPending();
9719 EXPECT_THAT(host_resolution_callback.WaitForResult(), IsOk());
9720
9721 // Check that expect_on_host_resolution_ is flipped back.
9722 EXPECT_FALSE(
9723 request.WaitForHostResolution(host_resolution_callback.callback()));
9724
9725 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9726 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9727}
9728
Paul Jensen8e3c5d32018-02-19 17:06:339729// Test that QuicStreamRequests with similar and different tags results in
9730// reused and unique QUIC streams using appropriately tagged sockets.
9731TEST_P(QuicStreamFactoryTest, Tag) {
9732 MockTaggingClientSocketFactory* socket_factory =
9733 new MockTaggingClientSocketFactory();
9734 socket_factory_.reset(socket_factory);
9735 Initialize();
9736 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9737 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9738
9739 // Prepare to establish two QUIC sessions.
9740 MockQuicData socket_data;
9741 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:439742 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Paul Jensen8e3c5d32018-02-19 17:06:339743 socket_data.AddSocketDataToFactory(socket_factory_.get());
9744 MockQuicData socket_data2;
9745 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:439746 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Paul Jensen8e3c5d32018-02-19 17:06:339747 socket_data2.AddSocketDataToFactory(socket_factory_.get());
9748
9749#if defined(OS_ANDROID)
9750 SocketTag tag1(SocketTag::UNSET_UID, 0x12345678);
9751 SocketTag tag2(getuid(), 0x87654321);
9752#else
9753 // On non-Android platforms we can only use the default constructor.
9754 SocketTag tag1, tag2;
9755#endif
9756
9757 // Request a stream with |tag1|.
9758 QuicStreamRequest request1(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:039759 int rv = request1.Request(
9760 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, tag1,
9761 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9762 failed_on_default_network_callback_, callback_.callback());
Paul Jensen8e3c5d32018-02-19 17:06:339763 EXPECT_THAT(callback_.GetResult(rv), IsOk());
9764 EXPECT_EQ(socket_factory->GetLastProducedUDPSocket()->tag(), tag1);
9765 EXPECT_TRUE(socket_factory->GetLastProducedUDPSocket()
9766 ->tagged_before_data_transferred());
9767 std::unique_ptr<QuicChromiumClientSession::Handle> stream1 =
9768 request1.ReleaseSessionHandle();
9769 EXPECT_TRUE(stream1);
9770 EXPECT_TRUE(stream1->IsConnected());
9771
9772 // Request a stream with |tag1| and verify underlying session is reused.
9773 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:039774 rv = request2.Request(
9775 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, tag1,
9776 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9777 failed_on_default_network_callback_, callback_.callback());
Paul Jensen8e3c5d32018-02-19 17:06:339778 EXPECT_THAT(callback_.GetResult(rv), IsOk());
9779 std::unique_ptr<QuicChromiumClientSession::Handle> stream2 =
9780 request2.ReleaseSessionHandle();
9781 EXPECT_TRUE(stream2);
9782 EXPECT_TRUE(stream2->IsConnected());
9783 EXPECT_TRUE(stream2->SharesSameSession(*stream1));
9784
9785 // Request a stream with |tag2| and verify a new session is created.
9786 QuicStreamRequest request3(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:039787 rv = request3.Request(
9788 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, tag2,
9789 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9790 failed_on_default_network_callback_, callback_.callback());
Paul Jensen8e3c5d32018-02-19 17:06:339791 EXPECT_THAT(callback_.GetResult(rv), IsOk());
9792 EXPECT_EQ(socket_factory->GetLastProducedUDPSocket()->tag(), tag2);
9793 EXPECT_TRUE(socket_factory->GetLastProducedUDPSocket()
9794 ->tagged_before_data_transferred());
9795 std::unique_ptr<QuicChromiumClientSession::Handle> stream3 =
9796 request3.ReleaseSessionHandle();
9797 EXPECT_TRUE(stream3);
9798 EXPECT_TRUE(stream3->IsConnected());
9799#if defined(OS_ANDROID)
9800 EXPECT_FALSE(stream3->SharesSameSession(*stream1));
9801#else
9802 // Same tag should reuse session.
9803 EXPECT_TRUE(stream3->SharesSameSession(*stream1));
9804#endif
9805}
9806
[email protected]e13201d82012-12-12 05:00:329807} // namespace test
[email protected]e13201d82012-12-12 05:00:329808} // namespace net