blob: f5d083358eb0488c18df11a46e36d61f8c348901 [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"
Ryan Hamiltona3ee93a72018-08-01 22:03:0828#include "net/quic/crypto/proof_verifier_chromium.h"
29#include "net/quic/mock_crypto_client_stream_factory.h"
30#include "net/quic/mock_quic_data.h"
31#include "net/quic/properties_based_quic_server_info.h"
32#include "net/quic/quic_http_stream.h"
33#include "net/quic/quic_http_utils.h"
34#include "net/quic/quic_server_info.h"
35#include "net/quic/quic_stream_factory_peer.h"
36#include "net/quic/quic_test_packet_maker.h"
37#include "net/quic/test_task_runner.h"
bnc3472afd2016-11-17 15:27:2138#include "net/socket/next_proto.h"
[email protected]e13201d82012-12-12 05:00:3239#include "net/socket/socket_test_util.h"
Bence Béky94658bf2018-05-11 19:22:5840#include "net/spdy/spdy_session_test_util.h"
41#include "net/spdy/spdy_test_util_common.h"
[email protected]6b8a3c742014-07-25 00:25:3542#include "net/ssl/channel_id_service.h"
43#include "net/ssl/default_channel_id_store.h"
[email protected]eed749f92013-12-23 18:57:3844#include "net/test/cert_test_util.h"
robpercival214763f2016-07-01 23:27:0145#include "net/test/gtest_util.h"
rsleevia69c79a2016-06-22 03:28:4346#include "net/test/test_data_directory.h"
Bence Béky98447b12018-05-08 03:14:0147#include "net/test/test_with_scoped_task_environment.h"
Ryan Hamilton56b10c5d2018-05-11 13:40:1648#include "net/third_party/quic/core/crypto/crypto_handshake.h"
49#include "net/third_party/quic/core/crypto/quic_crypto_client_config.h"
50#include "net/third_party/quic/core/crypto/quic_decrypter.h"
51#include "net/third_party/quic/core/crypto/quic_encrypter.h"
Victor Vasilievc5b409c22018-07-24 12:23:4652#include "net/third_party/quic/core/http/quic_client_promised_info.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"
Ryan Hamilton2e003eea2018-05-02 00:24:2959#include "net/third_party/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),
Yixin Wang079ad542018-01-11 04:06:05228 client_headers_include_h2_stream_dependency_(
229 client_headers_include_h2_stream_dependency),
alyssar2adf3ac2016-05-03 17:12:58230 client_maker_(version_,
231 0,
rchbf4c26d2017-04-16 23:17:55232 &clock_,
alyssar2adf3ac2016-05-03 17:12:58233 kDefaultServerHostName,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52234 quic::Perspective::IS_CLIENT,
Yixin Wang079ad542018-01-11 04:06:05235 client_headers_include_h2_stream_dependency_),
alyssar2adf3ac2016-05-03 17:12:58236 server_maker_(version_,
237 0,
rchbf4c26d2017-04-16 23:17:55238 &clock_,
alyssar2adf3ac2016-05-03 17:12:58239 kDefaultServerHostName,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52240 quic::Perspective::IS_SERVER,
Yixin Wang079ad542018-01-11 04:06:05241 false),
Ryan Sleevi987d2d92017-12-19 19:22:14242 cert_verifier_(std::make_unique<MockCertVerifier>()),
jri2b966f22014-09-02 22:25:36243 channel_id_service_(
fdoraya89e673c2017-01-31 21:44:21244 new ChannelIDService(new DefaultChannelIDStore(nullptr))),
Ryan Sleevi987d2d92017-12-19 19:22:14245 cert_transparency_verifier_(std::make_unique<DoNothingCTVerifier>()),
jri7e636642016-01-14 06:57:08246 scoped_mock_network_change_notifier_(nullptr),
jri7046038f2015-10-22 00:29:26247 factory_(nullptr),
[email protected]bf4ea2f2014-03-10 22:57:53248 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
ckrasic3865ee0f2016-02-29 22:04:56249 url_(kDefaultUrl),
250 url2_(kServer2Url),
251 url3_(kServer3Url),
252 url4_(kServer4Url),
jri7046038f2015-10-22 00:29:26253 privacy_mode_(PRIVACY_MODE_DISABLED),
Zhongyi Shia6b68d112018-09-24 07:49:03254 failed_on_default_network_callback_(base::BindRepeating(
255 &QuicStreamFactoryTestBase::OnFailedOnDefaultNetwork,
256 base::Unretained(this))),
257 failed_on_default_network_(false),
rch431dd4452017-04-19 15:22:35258 store_server_configs_in_properties_(false),
Jana Iyengar903dec22017-11-28 00:44:23259 close_sessions_on_ip_change_(false),
Zhongyi Shi63574b72018-06-01 20:22:25260 goaway_sessions_on_ip_change_(false),
jri7e636642016-01-14 06:57:08261 idle_connection_timeout_seconds_(kIdleConnectionTimeoutSeconds),
Ryan Hamilton8d9ee76e2018-05-29 23:52:52262 reduced_ping_timeout_seconds_(quic::kPingTimeoutSecs),
Yixin Wang469da562017-11-15 21:34:58263 max_time_before_crypto_handshake_seconds_(
Ryan Hamilton8d9ee76e2018-05-29 23:52:52264 quic::kMaxTimeForCryptoHandshakeSecs),
265 max_idle_time_before_crypto_handshake_seconds_(
266 quic::kInitialIdleTimeoutSecs),
Zhongyi Shif4683a32017-12-01 00:03:28267 migrate_sessions_on_network_change_v2_(false),
268 migrate_sessions_early_v2_(false),
Zhongyi Shi8de43832018-08-15 23:40:00269 retry_on_alternate_network_before_handshake_(false),
Renjiea0cb4a2c2018-09-26 23:37:30270 race_stale_dns_on_connection_(false),
Renjiea5722ccf2018-08-10 00:18:49271 go_away_on_path_degrading_(false),
jri217455a12016-07-13 20:15:09272 allow_server_migration_(false),
rchd6163f32017-01-30 23:50:38273 race_cert_verification_(false),
274 estimate_initial_rtt_(false) {
Ryan Hamilton8d9ee76e2018-05-29 23:52:52275 clock_.AdvanceTime(quic::QuicTime::Delta::FromSeconds(1));
bnc359ed2a2016-04-29 20:43:45276 }
277
jri7046038f2015-10-22 00:29:26278 void Initialize() {
bnc359ed2a2016-04-29 20:43:45279 DCHECK(!factory_);
jri7046038f2015-10-22 00:29:26280 factory_.reset(new QuicStreamFactory(
Renjiea0cb4a2c2018-09-26 23:37:30281 net_log_.net_log(), host_resolver_.get(), ssl_config_service_.get(),
Zhongyi Shi5f587cc2017-11-21 23:24:17282 socket_factory_.get(), &http_server_properties_, cert_verifier_.get(),
tbansal9b1cdf32017-05-10 17:28:39283 &ct_policy_enforcer_, channel_id_service_.get(),
nharper642ae4b2016-06-30 00:40:36284 &transport_security_state_, cert_transparency_verifier_.get(),
jri7046038f2015-10-22 00:29:26285 /*SocketPerformanceWatcherFactory*/ nullptr,
rchbf4c26d2017-04-16 23:17:55286 &crypto_client_stream_factory_, &random_generator_, &clock_,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52287 quic::kDefaultMaxPacketSize, string(),
288 store_server_configs_in_properties_, close_sessions_on_ip_change_,
Zhongyi Shi63574b72018-06-01 20:22:25289 goaway_sessions_on_ip_change_,
rch9ecde09b2017-04-08 00:18:23290 /*mark_quic_broken_when_network_blackholes*/ false,
zhongyidd1439f62016-09-02 02:02:26291 idle_connection_timeout_seconds_, reduced_ping_timeout_seconds_,
Yixin Wang469da562017-11-15 21:34:58292 max_time_before_crypto_handshake_seconds_,
293 max_idle_time_before_crypto_handshake_seconds_,
Zhongyi Shif4683a32017-12-01 00:03:28294 migrate_sessions_on_network_change_v2_, migrate_sessions_early_v2_,
Zhongyi Shi8de43832018-08-15 23:40:00295 retry_on_alternate_network_before_handshake_,
Renjiea0cb4a2c2018-09-26 23:37:30296 race_stale_dns_on_connection_, go_away_on_path_degrading_,
Zhongyi Shi73f23ca872017-12-13 18:37:13297 base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs),
Zhongyi Shiee760762018-08-01 00:54:29298 kMaxMigrationsToNonDefaultNetworkOnWriteError,
Zhongyi Shi8b1e43f2017-12-13 20:46:30299 kMaxMigrationsToNonDefaultNetworkOnPathDegrading,
Charles 'Buck' Krasic0c346c92017-09-14 18:17:37300 allow_server_migration_, race_cert_verification_, estimate_initial_rtt_,
Yixin Wang079ad542018-01-11 04:06:05301 client_headers_include_h2_stream_dependency_, connection_options_,
Nick Harper2243e8002018-09-28 20:33:26302 client_connection_options_,
Nick Harper1e5757d42018-05-02 23:08:57303 /*enable_channel_id*/ false,
kapishnikov7f8dd1e2018-01-24 06:10:49304 /*enable_socket_recv_optimization*/ false));
[email protected]e13201d82012-12-12 05:00:32305 }
306
Zhongyi Shi5f587cc2017-11-21 23:24:17307 void InitializeConnectionMigrationV2Test(
308 NetworkChangeNotifier::NetworkList connected_networks) {
309 scoped_mock_network_change_notifier_.reset(
310 new ScopedMockNetworkChangeNotifier());
311 MockNetworkChangeNotifier* mock_ncn =
312 scoped_mock_network_change_notifier_->mock_network_change_notifier();
313 mock_ncn->ForceNetworkHandlesSupported();
314 mock_ncn->SetConnectedNetworksList(connected_networks);
315 migrate_sessions_on_network_change_v2_ = true;
Zhongyi Shif4683a32017-12-01 00:03:28316 migrate_sessions_early_v2_ = true;
Zhongyi Shi8de43832018-08-15 23:40:00317 retry_on_alternate_network_before_handshake_ = true;
Zhongyi Shi5f587cc2017-11-21 23:24:17318 socket_factory_.reset(new TestConnectionMigrationSocketFactory);
319 Initialize();
320 }
321
Yixin Wang7891a39d2017-11-08 20:59:24322 std::unique_ptr<HttpStream> CreateStream(QuicStreamRequest* request) {
323 std::unique_ptr<QuicChromiumClientSession::Handle> session =
324 request->ReleaseSessionHandle();
325 if (!session || !session->IsConnected())
326 return nullptr;
327
328 return std::make_unique<QuicHttpStream>(std::move(session));
329 }
330
bnccb7ff3c2015-05-21 20:51:55331 bool HasActiveSession(const HostPortPair& host_port_pair) {
Ryan Hamilton4f0b26e2018-06-27 23:52:32332 quic::QuicServerId server_id(host_port_pair.host(), host_port_pair.port(),
333 false);
bnc5fdc07162016-05-23 17:36:03334 return QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server_id);
bnccb7ff3c2015-05-21 20:51:55335 }
336
Renjiea0cb4a2c2018-09-26 23:37:30337 bool HasLiveSession(const HostPortPair& host_port_pair) {
338 quic::QuicServerId server_id(host_port_pair.host(), host_port_pair.port(),
339 false);
340 return QuicStreamFactoryPeer::HasLiveSession(factory_.get(), host_port_pair,
341 server_id);
342 }
343
zhongyi363c91c2017-03-23 23:16:08344 bool HasActiveJob(const HostPortPair& host_port_pair,
345 const PrivacyMode privacy_mode) {
Ryan Hamilton4f0b26e2018-06-27 23:52:32346 quic::QuicServerId server_id(host_port_pair.host(), host_port_pair.port(),
347 privacy_mode == PRIVACY_MODE_ENABLED);
zhongyi363c91c2017-03-23 23:16:08348 return QuicStreamFactoryPeer::HasActiveJob(factory_.get(), server_id);
349 }
350
Ryan Hamilton8d9ee76e2018-05-29 23:52:52351 bool HasActiveCertVerifierJob(const quic::QuicServerId& server_id) {
rtennetid073dd22016-08-04 01:58:33352 return QuicStreamFactoryPeer::HasActiveCertVerifierJob(factory_.get(),
353 server_id);
354 }
355
Zhongyi Shic1449372018-08-09 09:58:58356 // Get the pending, not activated session, if there is only one session alive.
357 QuicChromiumClientSession* GetPendingSession(
358 const HostPortPair& host_port_pair) {
359 quic::QuicServerId server_id(host_port_pair.host(), host_port_pair.port(),
360 false);
361 return QuicStreamFactoryPeer::GetPendingSession(factory_.get(), server_id,
362 host_port_pair);
363 }
364
bnc912a04b2016-04-20 14:19:50365 QuicChromiumClientSession* GetActiveSession(
366 const HostPortPair& host_port_pair) {
Ryan Hamilton4f0b26e2018-06-27 23:52:32367 quic::QuicServerId server_id(host_port_pair.host(), host_port_pair.port(),
368 false);
bnc5fdc07162016-05-23 17:36:03369 return QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server_id);
bnc912a04b2016-04-20 14:19:50370 }
371
[email protected]bf4ea2f2014-03-10 22:57:53372 int GetSourcePortForNewSession(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10373 return GetSourcePortForNewSessionInner(destination, false);
374 }
375
rjshaded5ced072015-12-18 19:26:02376 int GetSourcePortForNewSessionAndGoAway(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10377 return GetSourcePortForNewSessionInner(destination, true);
378 }
379
[email protected]bf4ea2f2014-03-10 22:57:53380 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
[email protected]d8e2abf82014-03-06 10:30:10381 bool goaway_received) {
[email protected]3c772402013-12-18 21:38:11382 // Should only be called if there is no active session for this destination.
bnccb7ff3c2015-05-21 20:51:55383 EXPECT_FALSE(HasActiveSession(destination));
Zhongyi Shi5f587cc2017-11-21 23:24:17384 size_t socket_count = socket_factory_->udp_client_socket_ports().size();
[email protected]3c772402013-12-18 21:38:11385
rcha00569732016-08-27 11:09:36386 MockQuicData socket_data;
387 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:43388 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:17389 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]3c772402013-12-18 21:38:11390
zhongyi98d6a9262017-05-19 02:47:45391 QuicStreamRequest request(factory_.get());
ckrasic3865ee0f2016-02-29 22:04:56392 GURL url("https://" + destination.host() + "/");
Zhongyi Shia6b68d112018-09-24 07:49:03393 EXPECT_EQ(
394 ERR_IO_PENDING,
395 request.Request(
396 destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
397 /*cert_verify_flags=*/0, url, net_log_, &net_error_details_,
398 failed_on_default_network_callback_, callback_.callback()));
[email protected]3c772402013-12-18 21:38:11399
robpercival214763f2016-07-01 23:27:01400 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:24401 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]3c772402013-12-18 21:38:11402 EXPECT_TRUE(stream.get());
403 stream.reset();
404
bnc912a04b2016-04-20 14:19:50405 QuicChromiumClientSession* session = GetActiveSession(destination);
[email protected]3c772402013-12-18 21:38:11406
Zhongyi Shi5f587cc2017-11-21 23:24:17407 if (socket_count + 1 != socket_factory_->udp_client_socket_ports().size()) {
mmenke651bae7f2015-12-18 21:26:45408 ADD_FAILURE();
[email protected]3c772402013-12-18 21:38:11409 return 0;
410 }
411
[email protected]d8e2abf82014-03-06 10:30:10412 if (goaway_received) {
Ryan Hamilton8d9ee76e2018-05-29 23:52:52413 quic::QuicGoAwayFrame goaway(quic::kInvalidControlFrameId,
414 quic::QUIC_NO_ERROR, 1, "");
rtenneti9bd5d4b2015-08-21 05:44:52415 session->connection()->OnGoAwayFrame(goaway);
[email protected]d8e2abf82014-03-06 10:30:10416 }
[email protected]3c772402013-12-18 21:38:11417
jri7046038f2015-10-22 00:29:26418 factory_->OnSessionClosed(session);
bnccb7ff3c2015-05-21 20:51:55419 EXPECT_FALSE(HasActiveSession(destination));
rch37de576c2015-05-17 20:28:17420 EXPECT_TRUE(socket_data.AllReadDataConsumed());
421 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
Zhongyi Shi5f587cc2017-11-21 23:24:17422 return socket_factory_->udp_client_socket_ports()[socket_count];
[email protected]3c772402013-12-18 21:38:11423 }
424
Ryan Hamilton8d9ee76e2018-05-29 23:52:52425 std::unique_ptr<quic::QuicEncryptedPacket>
426 ConstructClientConnectionClosePacket(quic::QuicPacketNumber num) {
Bin Wu5311aca2018-01-22 01:19:03427 return client_maker_.MakeConnectionClosePacket(
Ryan Hamilton8d9ee76e2018-05-29 23:52:52428 num, false, quic::QUIC_CRYPTO_VERSION_NOT_SUPPORTED, "Time to panic!");
rtenneti1cd3b162015-09-29 02:58:28429 }
430
Ryan Hamilton8d9ee76e2018-05-29 23:52:52431 std::unique_ptr<quic::QuicEncryptedPacket> ConstructClientRstPacket(
432 quic::QuicPacketNumber packet_number,
433 quic::QuicRstStreamErrorCode error_code) {
434 quic::QuicStreamId stream_id = GetNthClientInitiatedStreamId(0);
fayang3bcb8b502016-12-07 21:44:37435 return client_maker_.MakeRstPacket(packet_number, true, stream_id,
Jana Iyengarba355772017-09-21 22:03:21436 error_code);
fayang3bcb8b502016-12-07 21:44:37437 }
438
bncf8bf0722015-05-19 20:04:13439 static ProofVerifyDetailsChromium DefaultProofVerifyDetails() {
rch6faa4d42016-01-05 20:48:43440 // Load a certificate that is valid for *.example.org
bncf8bf0722015-05-19 20:04:13441 scoped_refptr<X509Certificate> test_cert(
rch6faa4d42016-01-05 20:48:43442 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bncf8bf0722015-05-19 20:04:13443 EXPECT_TRUE(test_cert.get());
444 ProofVerifyDetailsChromium verify_details;
445 verify_details.cert_verify_result.verified_cert = test_cert;
446 verify_details.cert_verify_result.is_issued_by_known_root = true;
447 return verify_details;
448 }
449
jri8c44d692015-10-23 23:53:41450 void NotifyIPAddressChanged() {
451 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
jri7e636642016-01-14 06:57:08452 // Spin the message loop so the notification is delivered.
fdoray92e35a72016-06-10 15:54:55453 base::RunLoop().RunUntilIdle();
jri8c44d692015-10-23 23:53:41454 }
455
Ryan Hamilton8d9ee76e2018-05-29 23:52:52456 std::unique_ptr<quic::QuicEncryptedPacket> ConstructGetRequestPacket(
457 quic::QuicPacketNumber packet_number,
458 quic::QuicStreamId stream_id,
jri7e636642016-01-14 06:57:08459 bool should_include_version,
460 bool fin) {
Ryan Hamilton0239aac2018-05-19 00:03:13461 spdy::SpdyHeaderBlock headers =
alyssar2adf3ac2016-05-03 17:12:58462 client_maker_.GetRequestHeaders("GET", "https", "/");
Ryan Hamilton0239aac2018-05-19 00:03:13463 spdy::SpdyPriority priority =
jri7e636642016-01-14 06:57:08464 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
465 size_t spdy_headers_frame_len;
alyssar2adf3ac2016-05-03 17:12:58466 return client_maker_.MakeRequestHeadersPacket(
jri7e636642016-01-14 06:57:08467 packet_number, stream_id, should_include_version, fin, priority,
Yixin Wang7a3f1b8d2018-01-17 21:40:48468 std::move(headers), 0, &spdy_headers_frame_len);
jri7e636642016-01-14 06:57:08469 }
470
Ryan Hamilton8d9ee76e2018-05-29 23:52:52471 std::unique_ptr<quic::QuicEncryptedPacket> ConstructGetRequestPacket(
472 quic::QuicPacketNumber packet_number,
473 quic::QuicStreamId stream_id,
Zhongyi Shi3c4c9e92018-07-02 23:16:23474 quic::QuicStreamId parent_stream_id,
fayang3bcb8b502016-12-07 21:44:37475 bool should_include_version,
476 bool fin,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52477 quic::QuicStreamOffset* offset) {
Ryan Hamilton0239aac2018-05-19 00:03:13478 spdy::SpdyHeaderBlock headers =
fayang3bcb8b502016-12-07 21:44:37479 client_maker_.GetRequestHeaders("GET", "https", "/");
Ryan Hamilton0239aac2018-05-19 00:03:13480 spdy::SpdyPriority priority =
fayang3bcb8b502016-12-07 21:44:37481 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
482 size_t spdy_headers_frame_len;
483 return client_maker_.MakeRequestHeadersPacket(
484 packet_number, stream_id, should_include_version, fin, priority,
Zhongyi Shi3c4c9e92018-07-02 23:16:23485 std::move(headers), parent_stream_id, &spdy_headers_frame_len, offset);
486 }
487
488 std::unique_ptr<quic::QuicEncryptedPacket> ConstructGetRequestPacket(
489 quic::QuicPacketNumber packet_number,
490 quic::QuicStreamId stream_id,
491 bool should_include_version,
492 bool fin,
493 quic::QuicStreamOffset* offset) {
494 return ConstructGetRequestPacket(packet_number, stream_id,
495 /*parent_stream_id=*/0,
496 should_include_version, fin, offset);
fayang3bcb8b502016-12-07 21:44:37497 }
498
Ryan Hamilton8d9ee76e2018-05-29 23:52:52499 std::unique_ptr<quic::QuicEncryptedPacket> ConstructOkResponsePacket(
500 quic::QuicPacketNumber packet_number,
501 quic::QuicStreamId stream_id,
jri7e636642016-01-14 06:57:08502 bool should_include_version,
503 bool fin) {
Ryan Hamilton0239aac2018-05-19 00:03:13504 spdy::SpdyHeaderBlock headers = server_maker_.GetResponseHeaders("200 OK");
jri7e636642016-01-14 06:57:08505 size_t spdy_headers_frame_len;
alyssar2adf3ac2016-05-03 17:12:58506 return server_maker_.MakeResponseHeadersPacket(
bnc086b39e12016-06-24 13:05:26507 packet_number, stream_id, should_include_version, fin,
508 std::move(headers), &spdy_headers_frame_len);
jri7e636642016-01-14 06:57:08509 }
510
Ryan Hamilton8d9ee76e2018-05-29 23:52:52511 std::unique_ptr<quic::QuicReceivedPacket> ConstructInitialSettingsPacket() {
rch5cb522462017-04-25 20:18:36512 return client_maker_.MakeInitialSettingsPacket(1, nullptr);
513 }
514
Ryan Hamilton8d9ee76e2018-05-29 23:52:52515 std::unique_ptr<quic::QuicReceivedPacket> ConstructInitialSettingsPacket(
516 quic::QuicPacketNumber packet_number,
517 quic::QuicStreamOffset* offset) {
rch5cb522462017-04-25 20:18:36518 return client_maker_.MakeInitialSettingsPacket(packet_number, offset);
fayang3bcb8b502016-12-07 21:44:37519 }
520
jri053fdbd2016-08-19 02:33:05521 // Helper method for server migration tests.
Ryan Hamilton8d9ee76e2018-05-29 23:52:52522 void VerifyServerMigration(const quic::QuicConfig& config,
bnc6a0348c2017-05-22 18:56:19523 IPEndPoint expected_address) {
jri053fdbd2016-08-19 02:33:05524 allow_server_migration_ = true;
525 Initialize();
526
527 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
528 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri053fdbd2016-08-19 02:33:05529 crypto_client_stream_factory_.SetConfig(config);
530
531 // Set up first socket data provider.
rcha00569732016-08-27 11:09:36532 MockQuicData socket_data1;
533 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:17534 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri053fdbd2016-08-19 02:33:05535
rcha00569732016-08-27 11:09:36536 // Set up second socket data provider that is used after
537 // migration.
538 MockQuicData socket_data2;
539 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:43540 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
fayang3bcb8b502016-12-07 21:44:37541 socket_data2.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:43542 SYNCHRONOUS, client_maker_.MakePingPacket(2, /*include_version=*/true));
543 socket_data2.AddWrite(
544 SYNCHRONOUS,
545 client_maker_.MakeRstPacket(3, true, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:52546 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:17547 socket_data2.AddSocketDataToFactory(socket_factory_.get());
jri053fdbd2016-08-19 02:33:05548
549 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:45550 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:33551 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:03552 request.Request(
553 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
554 SocketTag(),
555 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
556 failed_on_default_network_callback_, callback_.callback()));
jri053fdbd2016-08-19 02:33:05557 EXPECT_EQ(OK, callback_.WaitForResult());
bnceb9aa7112017-01-05 01:03:46558
559 // Run QuicChromiumClientSession::WriteToNewSocket()
560 // posted by QuicChromiumClientSession::MigrateToSocket().
561 base::RunLoop().RunUntilIdle();
562
Yixin Wang7891a39d2017-11-08 20:59:24563 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri053fdbd2016-08-19 02:33:05564 EXPECT_TRUE(stream.get());
565
566 // Cause QUIC stream to be created.
567 HttpRequestInfo request_info;
568 request_info.method = "GET";
569 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:39570 request_info.traffic_annotation =
571 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:27572 EXPECT_EQ(OK,
573 stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:39574 net_log_, CompletionOnceCallback()));
jri053fdbd2016-08-19 02:33:05575 // Ensure that session is alive and active.
576 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
577 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
578 EXPECT_TRUE(HasActiveSession(host_port_pair_));
579
580 IPEndPoint actual_address;
581 session->GetDefaultSocket()->GetPeerAddress(&actual_address);
582 EXPECT_EQ(actual_address, expected_address);
583 DVLOG(1) << "Socket connected to: " << actual_address.address().ToString()
584 << " " << actual_address.port();
585 DVLOG(1) << "Expected address: " << expected_address.address().ToString()
586 << " " << expected_address.port();
587
588 stream.reset();
589 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
590 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
591 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
592 }
593
tbansal3b966952016-10-25 23:25:14594 // Verifies that the QUIC stream factory is initialized correctly.
tbansal9b1cdf32017-05-10 17:28:39595 void VerifyInitialization() {
rch431dd4452017-04-19 15:22:35596 store_server_configs_in_properties_ = true;
tbansal3b966952016-10-25 23:25:14597 idle_connection_timeout_seconds_ = 500;
598 Initialize();
Ryan Hamiltona12722b2017-08-12 02:23:20599 factory_->set_require_confirmation(false);
tbansal3b966952016-10-25 23:25:14600 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
601 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rch431dd4452017-04-19 15:22:35602 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
603 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:27604 MockCryptoClientStream::ZERO_RTT);
Ryan Hamilton8d9ee76e2018-05-29 23:52:52605 const quic::QuicConfig* config =
606 QuicStreamFactoryPeer::GetConfig(factory_.get());
ckrasic32b17dcd2016-10-31 06:15:35607 EXPECT_EQ(500, config->IdleNetworkTimeout().ToSeconds());
tbansal3b966952016-10-25 23:25:14608
609 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
610
bnc3472afd2016-11-17 15:27:21611 const AlternativeService alternative_service1(
612 kProtoQUIC, host_port_pair_.host(), host_port_pair_.port());
tbansal3b966952016-10-25 23:25:14613 AlternativeServiceInfoVector alternative_service_info_vector;
614 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
615 alternative_service_info_vector.push_back(
zhongyie537a002017-06-27 16:48:21616 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
617 alternative_service1, expiration, {version_}));
tbansal3b966952016-10-25 23:25:14618 http_server_properties_.SetAlternativeServices(
619 url::SchemeHostPort(url_), alternative_service_info_vector);
620
621 HostPortPair host_port_pair2(kServer2HostName, kDefaultServerPort);
622 url::SchemeHostPort server2("https", kServer2HostName, kDefaultServerPort);
bnc3472afd2016-11-17 15:27:21623 const AlternativeService alternative_service2(
624 kProtoQUIC, host_port_pair2.host(), host_port_pair2.port());
tbansal3b966952016-10-25 23:25:14625 AlternativeServiceInfoVector alternative_service_info_vector2;
626 alternative_service_info_vector2.push_back(
zhongyie537a002017-06-27 16:48:21627 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
628 alternative_service2, expiration, {version_}));
tbansal9b1cdf32017-05-10 17:28:39629
630 http_server_properties_.SetAlternativeServices(
631 server2, alternative_service_info_vector2);
632 // Verify that the properties of both QUIC servers are stored in the
633 // HTTP properties map.
634 EXPECT_EQ(2U, http_server_properties_.alternative_service_map().size());
tbansal3b966952016-10-25 23:25:14635
636 http_server_properties_.SetMaxServerConfigsStoredInProperties(
Yixin Wang4a227aa22017-11-30 21:33:01637 kDefaultMaxQuicServerEntries);
tbansal3b966952016-10-25 23:25:14638
Ryan Hamilton8d9ee76e2018-05-29 23:52:52639 quic::QuicServerId quic_server_id(kDefaultServerHostName, 443,
640 PRIVACY_MODE_DISABLED);
rch431dd4452017-04-19 15:22:35641 std::unique_ptr<QuicServerInfo> quic_server_info =
Jeremy Roman0579ed62017-08-29 15:56:19642 std::make_unique<PropertiesBasedQuicServerInfo>(
rch431dd4452017-04-19 15:22:35643 quic_server_id, &http_server_properties_);
tbansal3b966952016-10-25 23:25:14644
645 // Update quic_server_info's server_config and persist it.
646 QuicServerInfo::State* state = quic_server_info->mutable_state();
647 // Minimum SCFG that passes config validation checks.
648 const char scfg[] = {// SCFG
649 0x53, 0x43, 0x46, 0x47,
650 // num entries
651 0x01, 0x00,
652 // padding
653 0x00, 0x00,
654 // EXPY
655 0x45, 0x58, 0x50, 0x59,
656 // EXPY end offset
657 0x08, 0x00, 0x00, 0x00,
658 // Value
659 '1', '2', '3', '4', '5', '6', '7', '8'};
660
661 // Create temporary strings becasue Persist() clears string data in |state|.
662 string server_config(reinterpret_cast<const char*>(&scfg), sizeof(scfg));
663 string source_address_token("test_source_address_token");
664 string cert_sct("test_cert_sct");
665 string chlo_hash("test_chlo_hash");
666 string signature("test_signature");
667 string test_cert("test_cert");
rch872e00e2016-12-02 02:48:18668 std::vector<string> certs;
tbansal3b966952016-10-25 23:25:14669 certs.push_back(test_cert);
670 state->server_config = server_config;
671 state->source_address_token = source_address_token;
672 state->cert_sct = cert_sct;
673 state->chlo_hash = chlo_hash;
674 state->server_config_sig = signature;
675 state->certs = certs;
676
677 quic_server_info->Persist();
678
Ryan Hamilton8d9ee76e2018-05-29 23:52:52679 quic::QuicServerId quic_server_id2(kServer2HostName, 443,
680 PRIVACY_MODE_DISABLED);
rch431dd4452017-04-19 15:22:35681 std::unique_ptr<QuicServerInfo> quic_server_info2 =
Jeremy Roman0579ed62017-08-29 15:56:19682 std::make_unique<PropertiesBasedQuicServerInfo>(
rch431dd4452017-04-19 15:22:35683 quic_server_id2, &http_server_properties_);
tbansal3b966952016-10-25 23:25:14684 // Update quic_server_info2's server_config and persist it.
685 QuicServerInfo::State* state2 = quic_server_info2->mutable_state();
686
687 // Minimum SCFG that passes config validation checks.
688 const char scfg2[] = {// SCFG
689 0x53, 0x43, 0x46, 0x47,
690 // num entries
691 0x01, 0x00,
692 // padding
693 0x00, 0x00,
694 // EXPY
695 0x45, 0x58, 0x50, 0x59,
696 // EXPY end offset
697 0x08, 0x00, 0x00, 0x00,
698 // Value
699 '8', '7', '3', '4', '5', '6', '2', '1'};
700
701 // Create temporary strings becasue Persist() clears string data in
702 // |state2|.
703 string server_config2(reinterpret_cast<const char*>(&scfg2), sizeof(scfg2));
704 string source_address_token2("test_source_address_token2");
705 string cert_sct2("test_cert_sct2");
706 string chlo_hash2("test_chlo_hash2");
707 string signature2("test_signature2");
708 string test_cert2("test_cert2");
rch872e00e2016-12-02 02:48:18709 std::vector<string> certs2;
tbansal3b966952016-10-25 23:25:14710 certs2.push_back(test_cert2);
711 state2->server_config = server_config2;
712 state2->source_address_token = source_address_token2;
713 state2->cert_sct = cert_sct2;
714 state2->chlo_hash = chlo_hash2;
715 state2->server_config_sig = signature2;
716 state2->certs = certs2;
717
718 quic_server_info2->Persist();
719
tbansal3b966952016-10-25 23:25:14720 // Verify the MRU order is maintained.
721 const QuicServerInfoMap& quic_server_info_map =
722 http_server_properties_.quic_server_info_map();
723 EXPECT_EQ(2u, quic_server_info_map.size());
724 QuicServerInfoMap::const_iterator quic_server_info_map_it =
725 quic_server_info_map.begin();
726 EXPECT_EQ(quic_server_info_map_it->first, quic_server_id2);
727 ++quic_server_info_map_it;
728 EXPECT_EQ(quic_server_info_map_it->first, quic_server_id);
729
Renjiea0cb4a2c2018-09-26 23:37:30730 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
731 "192.168.0.1", "");
rch431dd4452017-04-19 15:22:35732
733 // Create a session and verify that the cached state is loaded.
734 MockQuicData socket_data;
735 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:17736 socket_data.AddSocketDataToFactory(socket_factory_.get());
rch431dd4452017-04-19 15:22:35737
zhongyi98d6a9262017-05-19 02:47:45738 QuicStreamRequest request(factory_.get());
Yixin Wang247ea642017-11-15 01:15:50739 EXPECT_EQ(ERR_IO_PENDING,
Ryan Hamilton4f0b26e2018-06-27 23:52:32740 request.Request(
741 HostPortPair(quic_server_id.host(), quic_server_id.port()),
742 version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
743 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
Zhongyi Shia6b68d112018-09-24 07:49:03744 failed_on_default_network_callback_, callback_.callback()));
rch431dd4452017-04-19 15:22:35745 EXPECT_THAT(callback_.WaitForResult(), IsOk());
746
tbansal3b966952016-10-25 23:25:14747 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(
748 factory_.get(), quic_server_id));
Ryan Hamilton8d9ee76e2018-05-29 23:52:52749 quic::QuicCryptoClientConfig* crypto_config =
tbansal3b966952016-10-25 23:25:14750 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
Ryan Hamilton8d9ee76e2018-05-29 23:52:52751 quic::QuicCryptoClientConfig::CachedState* cached =
tbansal3b966952016-10-25 23:25:14752 crypto_config->LookupOrCreate(quic_server_id);
753 EXPECT_FALSE(cached->server_config().empty());
754 EXPECT_TRUE(cached->GetServerConfig());
755 EXPECT_EQ(server_config, cached->server_config());
756 EXPECT_EQ(source_address_token, cached->source_address_token());
757 EXPECT_EQ(cert_sct, cached->cert_sct());
758 EXPECT_EQ(chlo_hash, cached->chlo_hash());
759 EXPECT_EQ(signature, cached->signature());
760 ASSERT_EQ(1U, cached->certs().size());
761 EXPECT_EQ(test_cert, cached->certs()[0]);
762
rch431dd4452017-04-19 15:22:35763 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
764
765 // Create a session and verify that the cached state is loaded.
766 MockQuicData socket_data2;
767 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:17768 socket_data2.AddSocketDataToFactory(socket_factory_.get());
rch431dd4452017-04-19 15:22:35769
Renjiea0cb4a2c2018-09-26 23:37:30770 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
771 "192.168.0.2", "");
rch431dd4452017-04-19 15:22:35772
zhongyi98d6a9262017-05-19 02:47:45773 QuicStreamRequest request2(factory_.get());
rch431dd4452017-04-19 15:22:35774 EXPECT_EQ(ERR_IO_PENDING,
Ryan Hamilton4f0b26e2018-06-27 23:52:32775 request2.Request(
776 HostPortPair(quic_server_id2.host(), quic_server_id2.port()),
777 version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
778 /*cert_verify_flags=*/0, GURL("https://mail.example.org/"),
Zhongyi Shia6b68d112018-09-24 07:49:03779 net_log_, &net_error_details_,
780 failed_on_default_network_callback_, callback_.callback()));
rch431dd4452017-04-19 15:22:35781 EXPECT_THAT(callback_.WaitForResult(), IsOk());
782
tbansal3b966952016-10-25 23:25:14783 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(
784 factory_.get(), quic_server_id2));
Ryan Hamilton8d9ee76e2018-05-29 23:52:52785 quic::QuicCryptoClientConfig::CachedState* cached2 =
tbansal3b966952016-10-25 23:25:14786 crypto_config->LookupOrCreate(quic_server_id2);
787 EXPECT_FALSE(cached2->server_config().empty());
788 EXPECT_TRUE(cached2->GetServerConfig());
789 EXPECT_EQ(server_config2, cached2->server_config());
790 EXPECT_EQ(source_address_token2, cached2->source_address_token());
791 EXPECT_EQ(cert_sct2, cached2->cert_sct());
792 EXPECT_EQ(chlo_hash2, cached2->chlo_hash());
793 EXPECT_EQ(signature2, cached2->signature());
794 ASSERT_EQ(1U, cached->certs().size());
795 EXPECT_EQ(test_cert2, cached2->certs()[0]);
796 }
797
jri5b785512016-09-13 04:29:11798 void RunTestLoopUntilIdle() {
799 while (!runner_->GetPostedTasks().empty())
800 runner_->RunNextTask();
801 }
802
Ryan Hamilton8d9ee76e2018-05-29 23:52:52803 quic::QuicStreamId GetNthClientInitiatedStreamId(int n) {
804 return quic::test::GetNthClientInitiatedStreamId(version_, n);
ckrasicbf2f59c2017-05-04 23:54:36805 }
806
Ryan Hamilton8d9ee76e2018-05-29 23:52:52807 quic::QuicStreamId GetNthServerInitiatedStreamId(int n) {
808 return quic::test::GetNthServerInitiatedStreamId(version_, n);
ckrasicbf2f59c2017-05-04 23:54:36809 }
810
Zhongyi Shia6b68d112018-09-24 07:49:03811 void OnFailedOnDefaultNetwork(int rv) { failed_on_default_network_ = true; }
812
jri9f303712016-09-13 01:10:22813 // Helper methods for tests of connection migration on write error.
814 void TestMigrationOnWriteErrorNonMigratableStream(IoMode write_error_mode);
Zhongyi Shi0439ecc72018-07-11 04:41:26815 // Migratable stream triggers write error.
816 void TestMigrationOnWriteErrorMixedStreams(IoMode write_error_mode);
817 // Non-migratable stream triggers write error.
818 void TestMigrationOnWriteErrorMixedStreams2(IoMode write_error_mode);
jri9f303712016-09-13 01:10:22819 void TestMigrationOnWriteErrorMigrationDisabled(IoMode write_error_mode);
820 void TestMigrationOnWriteError(IoMode write_error_mode);
Zhongyi Shi0439ecc72018-07-11 04:41:26821 void TestMigrationOnWriteErrorWithMultipleRequests(IoMode write_error_mode);
jri9f303712016-09-13 01:10:22822 void TestMigrationOnWriteErrorNoNewNetwork(IoMode write_error_mode);
Zhongyi Shi7f1d9212018-06-22 23:24:36823 void TestMigrationOnMultipleWriteErrors(
824 IoMode write_error_mode_on_old_network,
825 IoMode write_error_mode_on_new_network);
Zhongyi Shib24001c02018-06-18 20:01:52826 void TestMigrationOnNetworkNotificationWithWriteErrorQueuedLater(
827 bool disconnected);
Zhongyi Shi1e2bc742018-06-16 02:06:07828 void TestMigrationOnWriteErrorWithNotificationQueuedLater(bool disconnected);
Zhongyi Shi9f316b262018-06-18 22:01:16829 void TestMigrationOnNetworkDisconnected(bool async_write_before);
Zhongyi Shia0644e32018-06-21 05:19:52830 void TestMigrationOnNetworkMadeDefault(IoMode write_mode);
Zhongyi Shi22fd5f52018-06-20 17:39:09831 void TestMigrationOnPathDegrading(bool async_write_before);
Zhongyi Shib3bc982c2018-07-10 19:59:24832 void TestMigrateSessionWithDrainingStream(
833 IoMode write_mode_for_queued_packet);
jri5b785512016-09-13 04:29:11834 void TestMigrationOnWriteErrorPauseBeforeConnected(IoMode write_error_mode);
Zhongyi Shi4ac9e1f2018-06-21 05:21:47835 void TestMigrationOnWriteErrorWithMultipleNotifications(
jri5b785512016-09-13 04:29:11836 IoMode write_error_mode,
Zhongyi Shi4ac9e1f2018-06-21 05:21:47837 bool disconnect_before_connect);
Zhongyi Shi634c1882018-08-16 04:05:59838 void TestNoAlternateNetworkBeforeHandshake(quic::QuicErrorCode error);
Zhongyi Shi8de43832018-08-15 23:40:00839 void TestNewConnectionOnAlternateNetworkBeforeHandshake(
840 quic::QuicErrorCode error);
jri9f303712016-09-13 01:10:22841
Jana Iyengarf6b13d82017-09-04 02:09:10842 QuicFlagSaver flags_; // Save/restore all QUIC flag values.
Renjiea0cb4a2c2018-09-26 23:37:30843 std::unique_ptr<MockHostResolverBase> host_resolver_;
Ryan Sleevib8449e02018-07-15 04:31:07844 std::unique_ptr<SSLConfigService> ssl_config_service_;
Zhongyi Shi5f587cc2017-11-21 23:24:17845 std::unique_ptr<MockClientSocketFactory> socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05846 MockCryptoClientStreamFactory crypto_client_stream_factory_;
Ryan Hamilton8d9ee76e2018-05-29 23:52:52847 quic::test::MockRandom random_generator_;
848 quic::MockClock clock_;
rtenneti38f5cd52014-10-28 20:28:28849 scoped_refptr<TestTaskRunner> runner_;
Ryan Hamilton8d9ee76e2018-05-29 23:52:52850 const quic::QuicTransportVersion version_;
Yixin Wang079ad542018-01-11 04:06:05851 const bool client_headers_include_h2_stream_dependency_;
alyssar2adf3ac2016-05-03 17:12:58852 QuicTestPacketMaker client_maker_;
853 QuicTestPacketMaker server_maker_;
rtenneticcab42b2015-10-09 06:38:16854 HttpServerPropertiesImpl http_server_properties_;
danakjad1777e2016-04-16 00:56:42855 std::unique_ptr<CertVerifier> cert_verifier_;
856 std::unique_ptr<ChannelIDService> channel_id_service_;
[email protected]080b77932014-08-04 01:22:46857 TransportSecurityState transport_security_state_;
danakjad1777e2016-04-16 00:56:42858 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
Ryan Sleevi8a9c9c12018-05-09 02:36:23859 DefaultCTPolicyEnforcer ct_policy_enforcer_;
danakjad1777e2016-04-16 00:56:42860 std::unique_ptr<ScopedMockNetworkChangeNotifier>
jri7e636642016-01-14 06:57:08861 scoped_mock_network_change_notifier_;
danakjad1777e2016-04-16 00:56:42862 std::unique_ptr<QuicStreamFactory> factory_;
[email protected]bf4ea2f2014-03-10 22:57:53863 HostPortPair host_port_pair_;
ckrasic3865ee0f2016-02-29 22:04:56864 GURL url_;
865 GURL url2_;
866 GURL url3_;
867 GURL url4_;
868
[email protected]9dd3ff0f2014-03-26 09:51:28869 PrivacyMode privacy_mode_;
tfarina42834112016-09-22 13:38:20870 NetLogWithSource net_log_;
[email protected]e13201d82012-12-12 05:00:32871 TestCompletionCallback callback_;
Zhongyi Shia6b68d112018-09-24 07:49:03872 const CompletionRepeatingCallback failed_on_default_network_callback_;
873 bool failed_on_default_network_;
Ryan Hamilton75f197262017-08-17 14:00:07874 NetErrorDetails net_error_details_;
jri7046038f2015-10-22 00:29:26875
876 // Variables to configure QuicStreamFactory.
rch431dd4452017-04-19 15:22:35877 bool store_server_configs_in_properties_;
Jana Iyengar903dec22017-11-28 00:44:23878 bool close_sessions_on_ip_change_;
Zhongyi Shi63574b72018-06-01 20:22:25879 bool goaway_sessions_on_ip_change_;
rtenneti41c09992015-11-30 18:24:01880 int idle_connection_timeout_seconds_;
zhongyidd1439f62016-09-02 02:02:26881 int reduced_ping_timeout_seconds_;
Yixin Wang469da562017-11-15 21:34:58882 int max_time_before_crypto_handshake_seconds_;
883 int max_idle_time_before_crypto_handshake_seconds_;
Zhongyi Shif4683a32017-12-01 00:03:28884 bool migrate_sessions_on_network_change_v2_;
885 bool migrate_sessions_early_v2_;
Zhongyi Shi8de43832018-08-15 23:40:00886 bool retry_on_alternate_network_before_handshake_;
Renjiea0cb4a2c2018-09-26 23:37:30887 bool race_stale_dns_on_connection_;
Renjiea5722ccf2018-08-10 00:18:49888 bool go_away_on_path_degrading_;
jri217455a12016-07-13 20:15:09889 bool allow_server_migration_;
rtennetid073dd22016-08-04 01:58:33890 bool race_cert_verification_;
rchd6163f32017-01-30 23:50:38891 bool estimate_initial_rtt_;
Ryan Hamilton8d9ee76e2018-05-29 23:52:52892 quic::QuicTagVector connection_options_;
893 quic::QuicTagVector client_connection_options_;
[email protected]e13201d82012-12-12 05:00:32894};
895
bnc359ed2a2016-04-29 20:43:45896class QuicStreamFactoryTest : public QuicStreamFactoryTestBase,
897 public ::testing::TestWithParam<TestParams> {
898 protected:
Yixin Wang079ad542018-01-11 04:06:05899 QuicStreamFactoryTest()
900 : QuicStreamFactoryTestBase(
901 GetParam().version,
902 GetParam().client_headers_include_h2_stream_dependency) {}
bnc359ed2a2016-04-29 20:43:45903};
904
Bence Békyce380cb2018-04-26 23:39:55905INSTANTIATE_TEST_CASE_P(VersionIncludeStreamDependencySequence,
rtenneti14abd312015-02-06 21:56:01906 QuicStreamFactoryTest,
907 ::testing::ValuesIn(GetTestParams()));
[email protected]1e960032013-12-20 19:00:20908
[email protected]1e960032013-12-20 19:00:20909TEST_P(QuicStreamFactoryTest, Create) {
jri7046038f2015-10-22 00:29:26910 Initialize();
rch6faa4d42016-01-05 20:48:43911 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
912 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26913
rcha00569732016-08-27 11:09:36914 MockQuicData socket_data;
915 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:43916 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:17917 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]e13201d82012-12-12 05:00:32918
zhongyi98d6a9262017-05-19 02:47:45919 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:33920 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:03921 request.Request(
922 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
923 SocketTag(),
924 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
925 failed_on_default_network_callback_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32926
robpercival214763f2016-07-01 23:27:01927 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:24928 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]0edce6a2013-05-08 18:02:40929 EXPECT_TRUE(stream.get());
[email protected]e13201d82012-12-12 05:00:32930
Renjiea0cb4a2c2018-09-26 23:37:30931 EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->last_request_priority());
Yixin Wang247ea642017-11-15 01:15:50932
zhongyi98d6a9262017-05-19 02:47:45933 QuicStreamRequest request2(factory_.get());
zhongyia00ca012017-07-06 23:36:39934 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:33935 DEFAULT_PRIORITY, SocketTag(),
936 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:03937 &net_error_details_,
938 failed_on_default_network_callback_,
939 callback_.callback()));
rch68a80eb2017-04-25 05:24:24940 // Will reset stream 3.
Yixin Wang7891a39d2017-11-08 20:59:24941 stream = CreateStream(&request2);
rch68a80eb2017-04-25 05:24:24942
943 EXPECT_TRUE(stream.get());
944
945 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
946 // in streams on different sessions.
zhongyi98d6a9262017-05-19 02:47:45947 QuicStreamRequest request3(factory_.get());
zhongyia00ca012017-07-06 23:36:39948 EXPECT_EQ(OK, request3.Request(host_port_pair_, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:33949 DEFAULT_PRIORITY, SocketTag(),
950 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:03951 &net_error_details_,
952 failed_on_default_network_callback_,
953 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:24954 stream = CreateStream(&request3); // Will reset stream 5.
Ryan Hamiltona12722b2017-08-12 02:23:20955 stream.reset(); // Will reset stream 7.
[email protected]e13201d82012-12-12 05:00:32956
rch37de576c2015-05-17 20:28:17957 EXPECT_TRUE(socket_data.AllReadDataConsumed());
958 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:32959}
960
[email protected]8bd2b812014-03-26 04:01:17961TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
jri7046038f2015-10-22 00:29:26962 Initialize();
Ryan Hamiltona12722b2017-08-12 02:23:20963 factory_->set_require_confirmation(false);
rch6faa4d42016-01-05 20:48:43964 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
965 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26966
rcha00569732016-08-27 11:09:36967 MockQuicData socket_data;
968 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:17969 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]8bd2b812014-03-26 04:01:17970
971 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:27972 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:30973 host_resolver_->set_synchronous_mode(true);
974 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
975 "192.168.0.1", "");
[email protected]8bd2b812014-03-26 04:01:17976
zhongyi98d6a9262017-05-19 02:47:45977 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:33978 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
979 DEFAULT_PRIORITY, SocketTag(),
980 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:03981 &net_error_details_,
982 failed_on_default_network_callback_,
983 callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17984
Yixin Wang7891a39d2017-11-08 20:59:24985 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]8bd2b812014-03-26 04:01:17986 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17987 EXPECT_TRUE(socket_data.AllReadDataConsumed());
988 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17989}
990
rchd6163f32017-01-30 23:50:38991TEST_P(QuicStreamFactoryTest, DefaultInitialRtt) {
992 Initialize();
993 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
994 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
995
996 MockQuicData socket_data;
997 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:43998 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:17999 socket_data.AddSocketDataToFactory(socket_factory_.get());
rchd6163f32017-01-30 23:50:381000
zhongyi98d6a9262017-05-19 02:47:451001 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331002 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031003 request.Request(
1004 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1005 SocketTag(),
1006 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1007 failed_on_default_network_callback_, callback_.callback()));
rchd6163f32017-01-30 23:50:381008
1009 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241010 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rchd6163f32017-01-30 23:50:381011 EXPECT_TRUE(stream.get());
1012
1013 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
Ryan Hamiltona12722b2017-08-12 02:23:201014 EXPECT_TRUE(session->require_confirmation());
rchd6163f32017-01-30 23:50:381015 EXPECT_EQ(100000u, session->connection()->GetStats().srtt_us);
1016 ASSERT_FALSE(session->config()->HasInitialRoundTripTimeUsToSend());
1017}
1018
Helen Li0e823912017-09-25 19:48:301019TEST_P(QuicStreamFactoryTest, FactoryDestroyedWhenJobPending) {
1020 Initialize();
1021 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1022 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1023
1024 MockQuicData socket_data;
1025 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431026 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171027 socket_data.AddSocketDataToFactory(socket_factory_.get());
Helen Li0e823912017-09-25 19:48:301028
1029 auto request = std::make_unique<QuicStreamRequest>(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331030 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031031 request->Request(
1032 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1033 SocketTag(),
1034 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1035 failed_on_default_network_callback_, callback_.callback()));
Helen Li0e823912017-09-25 19:48:301036 request.reset();
1037 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
1038 // Tearing down a QuicStreamFactory with a pending Job should not cause any
1039 // crash. crbug.com/768343.
1040 factory_.reset();
1041}
1042
Ryan Hamiltona12722b2017-08-12 02:23:201043TEST_P(QuicStreamFactoryTest, RequireConfirmation) {
1044 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:271045 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:301046 host_resolver_->set_synchronous_mode(true);
1047 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1048 "192.168.0.1", "");
Ryan Hamiltona12722b2017-08-12 02:23:201049 Initialize();
1050 factory_->set_require_confirmation(true);
1051 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1052 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1053
1054 MockQuicData socket_data;
1055 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431056 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171057 socket_data.AddSocketDataToFactory(socket_factory_.get());
Ryan Hamiltona12722b2017-08-12 02:23:201058
1059 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331060 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031061 request.Request(
1062 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1063 SocketTag(),
1064 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1065 failed_on_default_network_callback_, callback_.callback()));
Ryan Hamiltona12722b2017-08-12 02:23:201066
Ryan Hamilton8e32a2b2017-08-28 20:06:521067 IPAddress last_address;
1068 EXPECT_FALSE(http_server_properties_.GetSupportsQuic(&last_address));
1069
Ryan Hamiltona12722b2017-08-12 02:23:201070 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521071 quic::QuicSession::HANDSHAKE_CONFIRMED);
Ryan Hamiltona12722b2017-08-12 02:23:201072
Ryan Hamilton8e32a2b2017-08-28 20:06:521073 EXPECT_TRUE(http_server_properties_.GetSupportsQuic(&last_address));
1074
Ryan Hamiltona12722b2017-08-12 02:23:201075 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241076 std::unique_ptr<HttpStream> stream = CreateStream(&request);
Ryan Hamiltona12722b2017-08-12 02:23:201077 EXPECT_TRUE(stream.get());
1078
1079 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1080 EXPECT_TRUE(session->require_confirmation());
1081}
1082
1083TEST_P(QuicStreamFactoryTest, DontRequireConfirmationFromSameIP) {
1084 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:271085 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:301086 host_resolver_->set_synchronous_mode(true);
1087 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1088 "192.168.0.1", "");
Ryan Hamiltona12722b2017-08-12 02:23:201089 Initialize();
1090 factory_->set_require_confirmation(true);
1091 http_server_properties_.SetSupportsQuic(IPAddress(192, 0, 2, 33));
1092
1093 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1094 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1095
1096 MockQuicData socket_data;
1097 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431098 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171099 socket_data.AddSocketDataToFactory(socket_factory_.get());
Ryan Hamiltona12722b2017-08-12 02:23:201100
1101 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031102 EXPECT_THAT(request.Request(
1103 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1104 SocketTag(),
1105 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1106 failed_on_default_network_callback_, callback_.callback()),
Paul Jensen8e3c5d32018-02-19 17:06:331107 IsOk());
Ryan Hamiltona12722b2017-08-12 02:23:201108
Ryan Hamilton8e32a2b2017-08-28 20:06:521109 IPAddress last_address;
1110 EXPECT_FALSE(http_server_properties_.GetSupportsQuic(&last_address));
1111
Yixin Wang7891a39d2017-11-08 20:59:241112 std::unique_ptr<HttpStream> stream = CreateStream(&request);
Ryan Hamiltona12722b2017-08-12 02:23:201113 EXPECT_TRUE(stream.get());
1114
1115 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1116 EXPECT_FALSE(session->require_confirmation());
Ryan Hamilton8e32a2b2017-08-28 20:06:521117
1118 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521119 quic::QuicSession::HANDSHAKE_CONFIRMED);
Ryan Hamilton8e32a2b2017-08-28 20:06:521120
1121 EXPECT_TRUE(http_server_properties_.GetSupportsQuic(&last_address));
Ryan Hamiltona12722b2017-08-12 02:23:201122}
1123
rchd6163f32017-01-30 23:50:381124TEST_P(QuicStreamFactoryTest, CachedInitialRtt) {
1125 ServerNetworkStats stats;
1126 stats.srtt = base::TimeDelta::FromMilliseconds(10);
1127 http_server_properties_.SetServerNetworkStats(url::SchemeHostPort(url_),
1128 stats);
1129 estimate_initial_rtt_ = true;
1130
1131 Initialize();
1132 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1133 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1134
1135 MockQuicData socket_data;
1136 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431137 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171138 socket_data.AddSocketDataToFactory(socket_factory_.get());
rchd6163f32017-01-30 23:50:381139
zhongyi98d6a9262017-05-19 02:47:451140 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331141 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031142 request.Request(
1143 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1144 SocketTag(),
1145 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1146 failed_on_default_network_callback_, callback_.callback()));
rchd6163f32017-01-30 23:50:381147
1148 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241149 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rchd6163f32017-01-30 23:50:381150 EXPECT_TRUE(stream.get());
1151
1152 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1153 EXPECT_EQ(10000u, session->connection()->GetStats().srtt_us);
1154 ASSERT_TRUE(session->config()->HasInitialRoundTripTimeUsToSend());
1155 EXPECT_EQ(10000u, session->config()->GetInitialRoundTripTimeUsToSend());
1156}
1157
1158TEST_P(QuicStreamFactoryTest, 2gInitialRtt) {
1159 ScopedMockNetworkChangeNotifier notifier;
1160 notifier.mock_network_change_notifier()->SetConnectionType(
1161 NetworkChangeNotifier::CONNECTION_2G);
1162 estimate_initial_rtt_ = true;
1163
1164 Initialize();
1165 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1166 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1167
1168 MockQuicData socket_data;
1169 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431170 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171171 socket_data.AddSocketDataToFactory(socket_factory_.get());
rchd6163f32017-01-30 23:50:381172
zhongyi98d6a9262017-05-19 02:47:451173 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331174 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031175 request.Request(
1176 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1177 SocketTag(),
1178 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1179 failed_on_default_network_callback_, callback_.callback()));
rchd6163f32017-01-30 23:50:381180
1181 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241182 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rchd6163f32017-01-30 23:50:381183 EXPECT_TRUE(stream.get());
1184
1185 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1186 EXPECT_EQ(1200000u, session->connection()->GetStats().srtt_us);
1187 ASSERT_TRUE(session->config()->HasInitialRoundTripTimeUsToSend());
1188 EXPECT_EQ(1200000u, session->config()->GetInitialRoundTripTimeUsToSend());
1189}
1190
1191TEST_P(QuicStreamFactoryTest, 3gInitialRtt) {
1192 ScopedMockNetworkChangeNotifier notifier;
1193 notifier.mock_network_change_notifier()->SetConnectionType(
1194 NetworkChangeNotifier::CONNECTION_3G);
1195 estimate_initial_rtt_ = true;
1196
1197 Initialize();
1198 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1199 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1200
1201 MockQuicData socket_data;
1202 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431203 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171204 socket_data.AddSocketDataToFactory(socket_factory_.get());
rchd6163f32017-01-30 23:50:381205
zhongyi98d6a9262017-05-19 02:47:451206 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331207 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031208 request.Request(
1209 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1210 SocketTag(),
1211 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1212 failed_on_default_network_callback_, callback_.callback()));
rchd6163f32017-01-30 23:50:381213
1214 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241215 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rchd6163f32017-01-30 23:50:381216 EXPECT_TRUE(stream.get());
1217
1218 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1219 EXPECT_EQ(400000u, session->connection()->GetStats().srtt_us);
1220 ASSERT_TRUE(session->config()->HasInitialRoundTripTimeUsToSend());
1221 EXPECT_EQ(400000u, session->config()->GetInitialRoundTripTimeUsToSend());
1222}
1223
rch68955482015-09-24 00:14:391224TEST_P(QuicStreamFactoryTest, GoAway) {
jri7046038f2015-10-22 00:29:261225 Initialize();
rch6faa4d42016-01-05 20:48:431226 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1227 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261228
rcha00569732016-08-27 11:09:361229 MockQuicData socket_data;
1230 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431231 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171232 socket_data.AddSocketDataToFactory(socket_factory_.get());
rch68955482015-09-24 00:14:391233
zhongyi98d6a9262017-05-19 02:47:451234 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331235 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031236 request.Request(
1237 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1238 SocketTag(),
1239 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1240 failed_on_default_network_callback_, callback_.callback()));
rch68955482015-09-24 00:14:391241
robpercival214763f2016-07-01 23:27:011242 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241243 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rch68955482015-09-24 00:14:391244 EXPECT_TRUE(stream.get());
1245
bnc912a04b2016-04-20 14:19:501246 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
rch68955482015-09-24 00:14:391247
Ryan Hamilton8d9ee76e2018-05-29 23:52:521248 session->OnGoAway(quic::QuicGoAwayFrame());
rch68955482015-09-24 00:14:391249
bnc912a04b2016-04-20 14:19:501250 EXPECT_FALSE(HasActiveSession(host_port_pair_));
rch68955482015-09-24 00:14:391251
1252 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1253 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1254}
1255
zhongyi6b5a3892016-03-12 04:46:201256TEST_P(QuicStreamFactoryTest, GoAwayForConnectionMigrationWithPortOnly) {
1257 Initialize();
1258 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1259 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1260
rcha00569732016-08-27 11:09:361261 MockQuicData socket_data;
1262 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431263 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171264 socket_data.AddSocketDataToFactory(socket_factory_.get());
zhongyi6b5a3892016-03-12 04:46:201265
zhongyi98d6a9262017-05-19 02:47:451266 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331267 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031268 request.Request(
1269 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1270 SocketTag(),
1271 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1272 failed_on_default_network_callback_, callback_.callback()));
zhongyi6b5a3892016-03-12 04:46:201273
robpercival214763f2016-07-01 23:27:011274 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241275 std::unique_ptr<HttpStream> stream = CreateStream(&request);
zhongyi6b5a3892016-03-12 04:46:201276 EXPECT_TRUE(stream.get());
1277
bnc912a04b2016-04-20 14:19:501278 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
zhongyi6b5a3892016-03-12 04:46:201279
Ryan Hamilton8d9ee76e2018-05-29 23:52:521280 session->OnGoAway(quic::QuicGoAwayFrame(
1281 quic::kInvalidControlFrameId, quic::QUIC_ERROR_MIGRATING_PORT, 0,
1282 "peer connection migration due to port change only"));
zhongyi6b5a3892016-03-12 04:46:201283 NetErrorDetails details;
1284 EXPECT_FALSE(details.quic_port_migration_detected);
1285 session->PopulateNetErrorDetails(&details);
1286 EXPECT_TRUE(details.quic_port_migration_detected);
1287 details.quic_port_migration_detected = false;
1288 stream->PopulateNetErrorDetails(&details);
1289 EXPECT_TRUE(details.quic_port_migration_detected);
1290
bnc912a04b2016-04-20 14:19:501291 EXPECT_FALSE(HasActiveSession(host_port_pair_));
zhongyi6b5a3892016-03-12 04:46:201292
1293 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1294 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1295}
1296
[email protected]5db452202014-08-19 05:22:151297TEST_P(QuicStreamFactoryTest, Pooling) {
jri7046038f2015-10-22 00:29:261298 Initialize();
rch6faa4d42016-01-05 20:48:431299 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1300 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261301
rcha00569732016-08-27 11:09:361302 MockQuicData socket_data;
1303 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431304 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171305 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]eed749f92013-12-23 18:57:381306
rch6faa4d42016-01-05 20:48:431307 HostPortPair server2(kServer2HostName, kDefaultServerPort);
Renjiea0cb4a2c2018-09-26 23:37:301308 host_resolver_->set_synchronous_mode(true);
1309 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1310 "192.168.0.1", "");
1311 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:381312
zhongyi98d6a9262017-05-19 02:47:451313 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331314 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
1315 DEFAULT_PRIORITY, SocketTag(),
1316 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:031317 &net_error_details_,
1318 failed_on_default_network_callback_,
1319 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241320 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]eed749f92013-12-23 18:57:381321 EXPECT_TRUE(stream.get());
1322
1323 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451324 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031325 EXPECT_EQ(OK,
1326 request2.Request(
1327 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1328 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1329 failed_on_default_network_callback_, callback.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241330 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]eed749f92013-12-23 18:57:381331 EXPECT_TRUE(stream2.get());
1332
bnc912a04b2016-04-20 14:19:501333 EXPECT_EQ(GetActiveSession(host_port_pair_), GetActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:381334
rch37de576c2015-05-17 20:28:171335 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1336 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:381337}
1338
jri94ddc3142016-08-26 01:32:431339TEST_P(QuicStreamFactoryTest, PoolingWithServerMigration) {
1340 // Set up session to migrate.
Renjiea0cb4a2c2018-09-26 23:37:301341 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1342 "192.168.0.1", "");
jri94ddc3142016-08-26 01:32:431343 IPEndPoint alt_address = IPEndPoint(IPAddress(1, 2, 3, 4), 443);
Ryan Hamilton8d9ee76e2018-05-29 23:52:521344 quic::QuicConfig config;
fayang91ca2012016-11-22 07:42:461345 config.SetAlternateServerAddressToSend(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521346 quic::QuicSocketAddress(quic::QuicSocketAddressImpl(alt_address)));
jri94ddc3142016-08-26 01:32:431347
1348 VerifyServerMigration(config, alt_address);
1349
1350 // Close server-migrated session.
1351 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
Renjieba55fae2018-09-20 03:05:161352 session->CloseSessionOnError(0u, quic::QUIC_NO_ERROR,
1353 quic::ConnectionCloseBehavior::SILENT_CLOSE);
jri94ddc3142016-08-26 01:32:431354
1355 // Set up server IP, socket, proof, and config for new session.
1356 HostPortPair server2(kServer2HostName, kDefaultServerPort);
Renjiea0cb4a2c2018-09-26 23:37:301357 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
jri94ddc3142016-08-26 01:32:431358
1359 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
Ryan Hamilton8d9ee76e2018-05-29 23:52:521360 std::unique_ptr<quic::QuicEncryptedPacket> settings_packet(
rch5cb522462017-04-25 20:18:361361 client_maker_.MakeInitialSettingsPacket(1, nullptr));
bnceb9aa7112017-01-05 01:03:461362 MockWrite writes[] = {MockWrite(SYNCHRONOUS, settings_packet->data(),
1363 settings_packet->length(), 1)};
fayang3bcb8b502016-12-07 21:44:371364
Ryan Sleevib8d7ea02018-05-07 20:01:011365 SequencedSocketData socket_data(reads, writes);
Zhongyi Shi5f587cc2017-11-21 23:24:171366 socket_factory_->AddSocketDataProvider(&socket_data);
jri94ddc3142016-08-26 01:32:431367
1368 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1369 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
Ryan Hamilton8d9ee76e2018-05-29 23:52:521370 quic::QuicConfig config2;
jri94ddc3142016-08-26 01:32:431371 crypto_client_stream_factory_.SetConfig(config2);
1372
1373 // Create new request to cause new session creation.
1374 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451375 QuicStreamRequest request2(factory_.get());
jri94ddc3142016-08-26 01:32:431376 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031377 request2.Request(
1378 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1379 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1380 failed_on_default_network_callback_, callback.callback()));
jri94ddc3142016-08-26 01:32:431381 EXPECT_EQ(OK, callback.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:241382 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
jri94ddc3142016-08-26 01:32:431383 EXPECT_TRUE(stream2.get());
1384
1385 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1386 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1387 // EXPECT_EQ(GetActiveSession(host_port_pair_), GetActiveSession(server2));
1388}
1389
[email protected]eed749f92013-12-23 18:57:381390TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
jri7046038f2015-10-22 00:29:261391 Initialize();
rch6faa4d42016-01-05 20:48:431392 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1393 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1394 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261395
rcha00569732016-08-27 11:09:361396 MockQuicData socket_data1;
1397 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431398 socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171399 socket_data1.AddSocketDataToFactory(socket_factory_.get());
rcha00569732016-08-27 11:09:361400 MockQuicData socket_data2;
1401 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431402 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171403 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]eed749f92013-12-23 18:57:381404
rch6faa4d42016-01-05 20:48:431405 HostPortPair server2(kServer2HostName, kDefaultServerPort);
Renjiea0cb4a2c2018-09-26 23:37:301406 host_resolver_->set_synchronous_mode(true);
1407 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1408 "192.168.0.1", "");
1409 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:381410
zhongyi98d6a9262017-05-19 02:47:451411 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331412 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
1413 DEFAULT_PRIORITY, SocketTag(),
1414 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:031415 &net_error_details_,
1416 failed_on_default_network_callback_,
1417 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241418 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]eed749f92013-12-23 18:57:381419 EXPECT_TRUE(stream.get());
1420
1421 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451422 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031423 EXPECT_EQ(OK,
1424 request2.Request(
1425 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1426 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1427 failed_on_default_network_callback_, callback.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241428 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]eed749f92013-12-23 18:57:381429 EXPECT_TRUE(stream2.get());
1430
bnc912a04b2016-04-20 14:19:501431 factory_->OnSessionGoingAway(GetActiveSession(host_port_pair_));
1432 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1433 EXPECT_FALSE(HasActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:381434
1435 TestCompletionCallback callback3;
zhongyi98d6a9262017-05-19 02:47:451436 QuicStreamRequest request3(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031437 EXPECT_EQ(OK,
1438 request3.Request(
1439 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1440 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1441 failed_on_default_network_callback_, callback3.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241442 std::unique_ptr<HttpStream> stream3 = CreateStream(&request3);
[email protected]eed749f92013-12-23 18:57:381443 EXPECT_TRUE(stream3.get());
1444
bnc912a04b2016-04-20 14:19:501445 EXPECT_TRUE(HasActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:381446
rch37de576c2015-05-17 20:28:171447 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1448 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1449 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1450 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:381451}
1452
[email protected]5db452202014-08-19 05:22:151453TEST_P(QuicStreamFactoryTest, HttpsPooling) {
jri7046038f2015-10-22 00:29:261454 Initialize();
rch6faa4d42016-01-05 20:48:431455
rcha00569732016-08-27 11:09:361456 MockQuicData socket_data;
1457 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431458 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171459 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]eed749f92013-12-23 18:57:381460
rch6faa4d42016-01-05 20:48:431461 HostPortPair server1(kDefaultServerHostName, 443);
1462 HostPortPair server2(kServer2HostName, 443);
[email protected]eed749f92013-12-23 18:57:381463
bncf8bf0722015-05-19 20:04:131464 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011465 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:381466
Renjiea0cb4a2c2018-09-26 23:37:301467 host_resolver_->set_synchronous_mode(true);
1468 host_resolver_->rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1469 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:381470
zhongyi98d6a9262017-05-19 02:47:451471 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031472 EXPECT_EQ(OK,
1473 request.Request(
1474 server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1475 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1476 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241477 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]eed749f92013-12-23 18:57:381478 EXPECT_TRUE(stream.get());
1479
1480 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451481 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031482 EXPECT_EQ(OK,
1483 request2.Request(
1484 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1485 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1486 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241487 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]eed749f92013-12-23 18:57:381488 EXPECT_TRUE(stream2.get());
1489
bnc912a04b2016-04-20 14:19:501490 EXPECT_EQ(GetActiveSession(server1), GetActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:381491
rch37de576c2015-05-17 20:28:171492 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1493 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:381494}
1495
[email protected]5db452202014-08-19 05:22:151496TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
jri7046038f2015-10-22 00:29:261497 Initialize();
rcha00569732016-08-27 11:09:361498 MockQuicData socket_data;
1499 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431500 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171501 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]5db452202014-08-19 05:22:151502
rch6faa4d42016-01-05 20:48:431503 HostPortPair server1(kDefaultServerHostName, 443);
1504 HostPortPair server2(kServer2HostName, 443);
Avi Drissman13fc8932015-12-20 04:40:461505 uint8_t primary_pin = 1;
1506 uint8_t backup_pin = 2;
rch6faa4d42016-01-05 20:48:431507 test::AddPin(&transport_security_state_, kServer2HostName, primary_pin,
[email protected]5db452202014-08-19 05:22:151508 backup_pin);
1509
bncf8bf0722015-05-19 20:04:131510 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
[email protected]5db452202014-08-19 05:22:151511 verify_details.cert_verify_result.public_key_hashes.push_back(
1512 test::GetTestHashValue(primary_pin));
bnc20daf9a2015-05-15 17:11:011513 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]5db452202014-08-19 05:22:151514
Renjiea0cb4a2c2018-09-26 23:37:301515 host_resolver_->set_synchronous_mode(true);
1516 host_resolver_->rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1517 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]5db452202014-08-19 05:22:151518
zhongyi98d6a9262017-05-19 02:47:451519 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031520 EXPECT_EQ(OK,
1521 request.Request(
1522 server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1523 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1524 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241525 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]5db452202014-08-19 05:22:151526 EXPECT_TRUE(stream.get());
1527
1528 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451529 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031530 EXPECT_EQ(OK,
1531 request2.Request(
1532 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1533 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1534 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241535 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]5db452202014-08-19 05:22:151536 EXPECT_TRUE(stream2.get());
1537
bnc912a04b2016-04-20 14:19:501538 EXPECT_EQ(GetActiveSession(server1), GetActiveSession(server2));
[email protected]5db452202014-08-19 05:22:151539
rch37de576c2015-05-17 20:28:171540 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1541 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:151542}
1543
1544TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
jri7046038f2015-10-22 00:29:261545 Initialize();
rcha00569732016-08-27 11:09:361546
1547 MockQuicData socket_data1;
1548 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431549 socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171550 socket_data1.AddSocketDataToFactory(socket_factory_.get());
rcha00569732016-08-27 11:09:361551 MockQuicData socket_data2;
1552 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431553 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171554 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]5db452202014-08-19 05:22:151555
rch6faa4d42016-01-05 20:48:431556 HostPortPair server1(kDefaultServerHostName, 443);
1557 HostPortPair server2(kServer2HostName, 443);
Avi Drissman13fc8932015-12-20 04:40:461558 uint8_t primary_pin = 1;
1559 uint8_t backup_pin = 2;
1560 uint8_t bad_pin = 3;
rch6faa4d42016-01-05 20:48:431561 test::AddPin(&transport_security_state_, kServer2HostName, primary_pin,
[email protected]5db452202014-08-19 05:22:151562 backup_pin);
1563
bncf8bf0722015-05-19 20:04:131564 ProofVerifyDetailsChromium verify_details1 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011565 verify_details1.cert_verify_result.public_key_hashes.push_back(
1566 test::GetTestHashValue(bad_pin));
1567 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
1568
bncf8bf0722015-05-19 20:04:131569 ProofVerifyDetailsChromium verify_details2 = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011570 verify_details2.cert_verify_result.public_key_hashes.push_back(
1571 test::GetTestHashValue(primary_pin));
1572 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
[email protected]5db452202014-08-19 05:22:151573
Renjiea0cb4a2c2018-09-26 23:37:301574 host_resolver_->set_synchronous_mode(true);
1575 host_resolver_->rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1576 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]5db452202014-08-19 05:22:151577
zhongyi98d6a9262017-05-19 02:47:451578 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031579 EXPECT_EQ(OK,
1580 request.Request(
1581 server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1582 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1583 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241584 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]5db452202014-08-19 05:22:151585 EXPECT_TRUE(stream.get());
1586
1587 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451588 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031589 EXPECT_EQ(OK,
1590 request2.Request(
1591 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1592 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1593 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241594 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]5db452202014-08-19 05:22:151595 EXPECT_TRUE(stream2.get());
1596
bnc912a04b2016-04-20 14:19:501597 EXPECT_NE(GetActiveSession(server1), GetActiveSession(server2));
[email protected]5db452202014-08-19 05:22:151598
rch37de576c2015-05-17 20:28:171599 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1600 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1601 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1602 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:151603}
1604
[email protected]1e960032013-12-20 19:00:201605TEST_P(QuicStreamFactoryTest, Goaway) {
jri7046038f2015-10-22 00:29:261606 Initialize();
rch6faa4d42016-01-05 20:48:431607 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1608 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1609 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1610
rcha00569732016-08-27 11:09:361611 MockQuicData socket_data;
1612 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431613 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171614 socket_data.AddSocketDataToFactory(socket_factory_.get());
rcha00569732016-08-27 11:09:361615 MockQuicData socket_data2;
1616 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431617 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171618 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]4d283b32013-10-17 12:57:271619
zhongyi98d6a9262017-05-19 02:47:451620 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331621 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031622 request.Request(
1623 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1624 SocketTag(),
1625 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1626 failed_on_default_network_callback_, callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271627
robpercival214763f2016-07-01 23:27:011628 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241629 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]4d283b32013-10-17 12:57:271630 EXPECT_TRUE(stream.get());
1631
1632 // Mark the session as going away. Ensure that while it is still alive
1633 // that it is no longer active.
bnc912a04b2016-04-20 14:19:501634 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7046038f2015-10-22 00:29:261635 factory_->OnSessionGoingAway(session);
1636 EXPECT_EQ(true,
1637 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
bnc912a04b2016-04-20 14:19:501638 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]4d283b32013-10-17 12:57:271639
1640 // Create a new request for the same destination and verify that a
1641 // new session is created.
zhongyi98d6a9262017-05-19 02:47:451642 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331643 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031644 request2.Request(
1645 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1646 SocketTag(),
1647 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1648 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:011649 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241650 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]4d283b32013-10-17 12:57:271651 EXPECT_TRUE(stream2.get());
1652
bnc912a04b2016-04-20 14:19:501653 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1654 EXPECT_NE(session, GetActiveSession(host_port_pair_));
jri7046038f2015-10-22 00:29:261655 EXPECT_EQ(true,
1656 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
[email protected]4d283b32013-10-17 12:57:271657
1658 stream2.reset();
1659 stream.reset();
1660
rch37de576c2015-05-17 20:28:171661 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1662 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1663 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1664 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]4d283b32013-10-17 12:57:271665}
1666
[email protected]1e960032013-12-20 19:00:201667TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
jri7046038f2015-10-22 00:29:261668 Initialize();
rch6faa4d42016-01-05 20:48:431669 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1670 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1671
Ryan Hamilton8d9ee76e2018-05-29 23:52:521672 quic::QuicStreamId stream_id = GetNthClientInitiatedStreamId(0);
rcha00569732016-08-27 11:09:361673 MockQuicData socket_data;
Zhongyi Shi32f2fd02018-04-16 18:23:431674 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
fayang3bcb8b502016-12-07 21:44:371675 socket_data.AddWrite(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521676 SYNCHRONOUS, client_maker_.MakeRstPacket(2, true, stream_id,
1677 quic::QUIC_STREAM_CANCELLED));
1678 socket_data.AddRead(ASYNC,
1679 server_maker_.MakeRstPacket(1, false, stream_id,
1680 quic::QUIC_STREAM_CANCELLED));
rcha00569732016-08-27 11:09:361681 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:171682 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]0b2294d32013-08-02 00:46:361683
1684 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:391685 request_info.traffic_annotation =
1686 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
1687
xunjieli1d2b4272017-04-25 22:37:171688 std::vector<std::unique_ptr<HttpStream>> streams;
Ryan Hamilton9835e662018-08-02 05:36:271689 // The MockCryptoClientStream sets max_open_streams to be
Ryan Hamilton8d9ee76e2018-05-29 23:52:521690 // quic::kDefaultMaxStreamsPerConnection / 2.
1691 for (size_t i = 0; i < quic::kDefaultMaxStreamsPerConnection / 2; i++) {
zhongyi98d6a9262017-05-19 02:47:451692 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031693 int rv = request.Request(
1694 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1695 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1696 failed_on_default_network_callback_, callback_.callback());
[email protected]0b2294d32013-08-02 00:46:361697 if (i == 0) {
robpercival214763f2016-07-01 23:27:011698 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1699 EXPECT_THAT(callback_.WaitForResult(), IsOk());
[email protected]0b2294d32013-08-02 00:46:361700 } else {
robpercival214763f2016-07-01 23:27:011701 EXPECT_THAT(rv, IsOk());
[email protected]0b2294d32013-08-02 00:46:361702 }
Yixin Wang7891a39d2017-11-08 20:59:241703 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]0b2294d32013-08-02 00:46:361704 EXPECT_TRUE(stream);
Steven Valdezb4ff0412018-01-18 22:39:271705 EXPECT_EQ(OK,
1706 stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:391707 net_log_, CompletionOnceCallback()));
avib3635452016-10-21 18:33:531708 streams.push_back(std::move(stream));
[email protected]0b2294d32013-08-02 00:46:361709 }
1710
zhongyi98d6a9262017-05-19 02:47:451711 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331712 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
1713 DEFAULT_PRIORITY, SocketTag(),
1714 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:031715 &net_error_details_,
1716 failed_on_default_network_callback_,
1717 CompletionOnceCallback()));
Yixin Wang7891a39d2017-11-08 20:59:241718 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]0b2294d32013-08-02 00:46:361719 EXPECT_TRUE(stream);
rjshaded5ced072015-12-18 19:26:021720 EXPECT_EQ(ERR_IO_PENDING,
Steven Valdezb4ff0412018-01-18 22:39:271721 stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
1722 net_log_, callback_.callback()));
[email protected]0b2294d32013-08-02 00:46:361723
1724 // Close the first stream.
1725 streams.front()->Close(false);
ckrasicea295fe2015-10-31 05:03:271726 // Trigger exchange of RSTs that in turn allow progress for the last
1727 // stream.
robpercival214763f2016-07-01 23:27:011728 EXPECT_THAT(callback_.WaitForResult(), IsOk());
[email protected]0b2294d32013-08-02 00:46:361729
rch37de576c2015-05-17 20:28:171730 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1731 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
ckrasicea295fe2015-10-31 05:03:271732
1733 // Force close of the connection to suppress the generation of RST
1734 // packets when streams are torn down, which wouldn't be relevant to
1735 // this test anyway.
bnc912a04b2016-04-20 14:19:501736 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:521737 session->connection()->CloseConnection(
1738 quic::QUIC_PUBLIC_RESET, "test",
1739 quic::ConnectionCloseBehavior::SILENT_CLOSE);
[email protected]0b2294d32013-08-02 00:46:361740}
1741
[email protected]1e960032013-12-20 19:00:201742TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
jri7046038f2015-10-22 00:29:261743 Initialize();
rcha00569732016-08-27 11:09:361744 MockQuicData socket_data;
Zhongyi Shi5f587cc2017-11-21 23:24:171745 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]e13201d82012-12-12 05:00:321746
Renjiea0cb4a2c2018-09-26 23:37:301747 host_resolver_->rules()->AddSimulatedFailure(kDefaultServerHostName);
[email protected]e13201d82012-12-12 05:00:321748
zhongyi98d6a9262017-05-19 02:47:451749 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331750 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031751 request.Request(
1752 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1753 SocketTag(),
1754 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1755 failed_on_default_network_callback_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321756
robpercival214763f2016-07-01 23:27:011757 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
[email protected]e13201d82012-12-12 05:00:321758
rch37de576c2015-05-17 20:28:171759 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1760 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321761}
1762
[email protected]1e960032013-12-20 19:00:201763TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
jri7046038f2015-10-22 00:29:261764 Initialize();
rcha00569732016-08-27 11:09:361765
1766 MockQuicData socket_data;
1767 socket_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
Zhongyi Shi5f587cc2017-11-21 23:24:171768 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]3c772402013-12-18 21:38:111769
zhongyi98d6a9262017-05-19 02:47:451770 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331771 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031772 request.Request(
1773 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1774 SocketTag(),
1775 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1776 failed_on_default_network_callback_, callback_.callback()));
[email protected]3c772402013-12-18 21:38:111777
robpercival214763f2016-07-01 23:27:011778 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_ADDRESS_IN_USE));
[email protected]3c772402013-12-18 21:38:111779
rch37de576c2015-05-17 20:28:171780 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1781 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:111782}
1783
[email protected]1e960032013-12-20 19:00:201784TEST_P(QuicStreamFactoryTest, CancelCreate) {
jri7046038f2015-10-22 00:29:261785 Initialize();
rcha00569732016-08-27 11:09:361786 MockQuicData socket_data;
1787 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431788 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171789 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]e13201d82012-12-12 05:00:321790 {
zhongyi98d6a9262017-05-19 02:47:451791 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331792 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031793 request.Request(
1794 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1795 SocketTag(),
1796 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1797 failed_on_default_network_callback_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321798 }
1799
mmenke651bae7f2015-12-18 21:26:451800 base::RunLoop().RunUntilIdle();
[email protected]e13201d82012-12-12 05:00:321801
zhongyi98d6a9262017-05-19 02:47:451802 QuicStreamRequest request2(factory_.get());
zhongyia00ca012017-07-06 23:36:391803 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:331804 DEFAULT_PRIORITY, SocketTag(),
1805 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:031806 &net_error_details_,
1807 failed_on_default_network_callback_,
1808 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241809 std::unique_ptr<HttpStream> stream = CreateStream(&request2);
rch68a80eb2017-04-25 05:24:241810
[email protected]e13201d82012-12-12 05:00:321811 EXPECT_TRUE(stream.get());
1812 stream.reset();
1813
rch37de576c2015-05-17 20:28:171814 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1815 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321816}
1817
[email protected]1e960032013-12-20 19:00:201818TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
jri7046038f2015-10-22 00:29:261819 Initialize();
rch6faa4d42016-01-05 20:48:431820 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1821 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1822 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1823
rcha00569732016-08-27 11:09:361824 MockQuicData socket_data;
1825 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431826 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Ryan Hamilton8d9ee76e2018-05-29 23:52:521827 socket_data.AddWrite(
1828 SYNCHRONOUS, ConstructClientRstPacket(2, quic::QUIC_RST_ACKNOWLEDGEMENT));
Renjieba55fae2018-09-20 03:05:161829 socket_data.AddWrite(SYNCHRONOUS,
1830 client_maker_.MakeConnectionClosePacket(
1831 3, true, quic::QUIC_INTERNAL_ERROR, "net error"));
Zhongyi Shi5f587cc2017-11-21 23:24:171832 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]56dfb902013-01-03 23:17:551833
rcha00569732016-08-27 11:09:361834 MockQuicData socket_data2;
1835 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431836 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171837 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]56dfb902013-01-03 23:17:551838
zhongyi98d6a9262017-05-19 02:47:451839 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331840 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031841 request.Request(
1842 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1843 SocketTag(),
1844 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1845 failed_on_default_network_callback_, callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551846
robpercival214763f2016-07-01 23:27:011847 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241848 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]0b2294d32013-08-02 00:46:361849 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:391850 request_info.traffic_annotation =
1851 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:271852 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:391853 net_log_, CompletionOnceCallback()));
[email protected]56dfb902013-01-03 23:17:551854
1855 // Close the session and verify that stream saw the error.
Ryan Hamilton8d9ee76e2018-05-29 23:52:521856 factory_->CloseAllSessions(ERR_INTERNET_DISCONNECTED,
1857 quic::QUIC_INTERNAL_ERROR);
[email protected]56dfb902013-01-03 23:17:551858 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1859 stream->ReadResponseHeaders(callback_.callback()));
1860
1861 // Now attempting to request a stream to the same origin should create
1862 // a new session.
1863
zhongyi98d6a9262017-05-19 02:47:451864 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331865 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031866 request2.Request(
1867 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1868 SocketTag(),
1869 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1870 failed_on_default_network_callback_, callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551871
robpercival214763f2016-07-01 23:27:011872 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241873 stream = CreateStream(&request2);
[email protected]56dfb902013-01-03 23:17:551874 stream.reset(); // Will reset stream 3.
1875
rch37de576c2015-05-17 20:28:171876 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1877 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1878 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1879 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]56dfb902013-01-03 23:17:551880}
1881
zhongyi363c91c2017-03-23 23:16:081882// Regression test for crbug.com/700617. Test a write error during the
1883// crypto handshake will not hang QuicStreamFactory::Job and should
1884// report QUIC_HANDSHAKE_FAILED to upper layers. Subsequent
1885// QuicStreamRequest should succeed without hanging.
1886TEST_P(QuicStreamFactoryTest,
1887 WriteErrorInCryptoConnectWithAsyncHostResolution) {
1888 Initialize();
1889 // Use unmocked crypto stream to do crypto connect.
1890 crypto_client_stream_factory_.set_handshake_mode(
Zhongyi Shi879659422018-08-02 17:58:251891 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
zhongyi363c91c2017-03-23 23:16:081892
1893 MockQuicData socket_data;
1894 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1895 // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect.
1896 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:171897 socket_data.AddSocketDataToFactory(socket_factory_.get());
zhongyi363c91c2017-03-23 23:16:081898
1899 // Create request, should fail after the write of the CHLO fails.
zhongyi98d6a9262017-05-19 02:47:451900 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331901 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031902 request.Request(
1903 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1904 SocketTag(),
1905 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1906 failed_on_default_network_callback_, callback_.callback()));
zhongyi363c91c2017-03-23 23:16:081907 EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, callback_.WaitForResult());
1908 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1909 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
1910
1911 // Verify new requests can be sent normally without hanging.
1912 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:271913 MockCryptoClientStream::COLD_START);
zhongyi363c91c2017-03-23 23:16:081914 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1915 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1916 MockQuicData socket_data2;
1917 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431918 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171919 socket_data2.AddSocketDataToFactory(socket_factory_.get());
zhongyi363c91c2017-03-23 23:16:081920
zhongyi98d6a9262017-05-19 02:47:451921 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331922 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031923 request2.Request(
1924 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1925 SocketTag(),
1926 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1927 failed_on_default_network_callback_, callback_.callback()));
zhongyi363c91c2017-03-23 23:16:081928 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1929 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
1930 // Run the message loop to complete host resolution.
1931 base::RunLoop().RunUntilIdle();
1932
1933 // Complete handshake. QuicStreamFactory::Job should complete and succeed.
1934 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521935 quic::QuicSession::HANDSHAKE_CONFIRMED);
zhongyi363c91c2017-03-23 23:16:081936 EXPECT_THAT(callback_.WaitForResult(), IsOk());
1937 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1938 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
1939
1940 // Create QuicHttpStream.
Yixin Wang7891a39d2017-11-08 20:59:241941 std::unique_ptr<HttpStream> stream = CreateStream(&request2);
zhongyi363c91c2017-03-23 23:16:081942 EXPECT_TRUE(stream.get());
1943 stream.reset();
1944 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1945 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1946 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1947 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1948}
1949
1950TEST_P(QuicStreamFactoryTest, WriteErrorInCryptoConnectWithSyncHostResolution) {
1951 Initialize();
1952 // Use unmocked crypto stream to do crypto connect.
1953 crypto_client_stream_factory_.set_handshake_mode(
Zhongyi Shi879659422018-08-02 17:58:251954 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
Renjiea0cb4a2c2018-09-26 23:37:301955 host_resolver_->set_synchronous_mode(true);
1956 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1957 "192.168.0.1", "");
zhongyi363c91c2017-03-23 23:16:081958
1959 MockQuicData socket_data;
1960 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1961 // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect.
1962 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:171963 socket_data.AddSocketDataToFactory(socket_factory_.get());
zhongyi363c91c2017-03-23 23:16:081964
1965 // Create request, should fail immediately.
zhongyi98d6a9262017-05-19 02:47:451966 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331967 EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED,
Zhongyi Shia6b68d112018-09-24 07:49:031968 request.Request(
1969 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1970 SocketTag(),
1971 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1972 failed_on_default_network_callback_, callback_.callback()));
zhongyi363c91c2017-03-23 23:16:081973 // Check no active session, or active jobs left for this server.
1974 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1975 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
1976
1977 // Verify new requests can be sent normally without hanging.
1978 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:271979 MockCryptoClientStream::COLD_START);
zhongyi363c91c2017-03-23 23:16:081980 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1981 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1982 MockQuicData socket_data2;
1983 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431984 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171985 socket_data2.AddSocketDataToFactory(socket_factory_.get());
zhongyi363c91c2017-03-23 23:16:081986
zhongyi98d6a9262017-05-19 02:47:451987 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331988 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031989 request2.Request(
1990 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1991 SocketTag(),
1992 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1993 failed_on_default_network_callback_, callback_.callback()));
zhongyi363c91c2017-03-23 23:16:081994 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1995 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
1996
1997 // Complete handshake.
1998 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521999 quic::QuicSession::HANDSHAKE_CONFIRMED);
zhongyi363c91c2017-03-23 23:16:082000 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2001 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2002 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
2003
2004 // Create QuicHttpStream.
Yixin Wang7891a39d2017-11-08 20:59:242005 std::unique_ptr<HttpStream> stream = CreateStream(&request2);
zhongyi363c91c2017-03-23 23:16:082006 EXPECT_TRUE(stream.get());
2007 stream.reset();
2008 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2009 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2010 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2011 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2012}
2013
Zhongyi Shi63574b72018-06-01 20:22:252014TEST_P(QuicStreamFactoryTest, CloseSessionsOnIPAddressChanged) {
Jana Iyengar903dec22017-11-28 00:44:232015 close_sessions_on_ip_change_ = true;
jri7046038f2015-10-22 00:29:262016 Initialize();
rch6faa4d42016-01-05 20:48:432017 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2018 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2019 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri8c44d692015-10-23 23:53:412020
rcha00569732016-08-27 11:09:362021 MockQuicData socket_data;
2022 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432023 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Ryan Hamilton8d9ee76e2018-05-29 23:52:522024 socket_data.AddWrite(
2025 SYNCHRONOUS, ConstructClientRstPacket(2, quic::QUIC_RST_ACKNOWLEDGEMENT));
Renjieba55fae2018-09-20 03:05:162026 socket_data.AddWrite(
2027 SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
2028 3, true, quic::QUIC_IP_ADDRESS_CHANGED, "net error"));
Zhongyi Shi5f587cc2017-11-21 23:24:172029 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]f698a012013-05-06 20:18:592030
rcha00569732016-08-27 11:09:362031 MockQuicData socket_data2;
2032 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432033 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:172034 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]f698a012013-05-06 20:18:592035
zhongyi98d6a9262017-05-19 02:47:452036 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332037 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032038 request.Request(
2039 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2040 SocketTag(),
2041 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2042 failed_on_default_network_callback_, callback_.callback()));
[email protected]f698a012013-05-06 20:18:592043
robpercival214763f2016-07-01 23:27:012044 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242045 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]0b2294d32013-08-02 00:46:362046 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:392047 request_info.traffic_annotation =
2048 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272049 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392050 net_log_, CompletionOnceCallback()));
[email protected]f698a012013-05-06 20:18:592051
Zhongyi Shi63574b72018-06-01 20:22:252052 // Check an active session exisits for the destination.
2053 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2054 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2055 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2056
Ryan Hamilton8e32a2b2017-08-28 20:06:522057 IPAddress last_address;
2058 EXPECT_TRUE(http_server_properties_.GetSupportsQuic(&last_address));
Zhongyi Shi63574b72018-06-01 20:22:252059 // Change the IP address and verify that stream saw the error and the active
2060 // session is closed.
jri8c44d692015-10-23 23:53:412061 NotifyIPAddressChanged();
[email protected]f698a012013-05-06 20:18:592062 EXPECT_EQ(ERR_NETWORK_CHANGED,
2063 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262064 EXPECT_TRUE(factory_->require_confirmation());
Ryan Hamilton8e32a2b2017-08-28 20:06:522065 EXPECT_FALSE(http_server_properties_.GetSupportsQuic(&last_address));
Zhongyi Shi63574b72018-06-01 20:22:252066 // Check no active session exists for the destination.
2067 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]f698a012013-05-06 20:18:592068
2069 // Now attempting to request a stream to the same origin should create
2070 // a new session.
zhongyi98d6a9262017-05-19 02:47:452071 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332072 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032073 request2.Request(
2074 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2075 SocketTag(),
2076 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2077 failed_on_default_network_callback_, callback_.callback()));
[email protected]f698a012013-05-06 20:18:592078
robpercival214763f2016-07-01 23:27:012079 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242080 stream = CreateStream(&request2);
[email protected]f698a012013-05-06 20:18:592081
Zhongyi Shi63574b72018-06-01 20:22:252082 // Check a new active session exisits for the destination and the old session
2083 // is no longer live.
2084 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2085 QuicChromiumClientSession* session2 = GetActiveSession(host_port_pair_);
2086 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
2087
2088 stream.reset(); // Will reset stream 3.
rch37de576c2015-05-17 20:28:172089 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2090 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2091 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2092 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]f698a012013-05-06 20:18:592093}
2094
Zhongyi Shi63574b72018-06-01 20:22:252095// Test that if goaway_session_on_ip_change is set, old sessions will be marked
2096// as going away on IP address change instead of being closed. New requests will
2097// go to a new connection.
2098TEST_P(QuicStreamFactoryTest, GoAwaySessionsOnIPAddressChanged) {
2099 goaway_sessions_on_ip_change_ = true;
2100 Initialize();
2101 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2102 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2103 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2104
2105 MockQuicData quic_data1;
2106 quic::QuicStreamOffset header_stream_offset = 0;
2107 quic_data1.AddWrite(SYNCHRONOUS,
2108 ConstructInitialSettingsPacket(1, &header_stream_offset));
2109 quic_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
2110 2, GetNthClientInitiatedStreamId(0),
2111 true, true, &header_stream_offset));
2112 quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
2113 quic_data1.AddRead(
2114 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
2115 false, true));
2116 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
2117 quic_data1.AddSocketDataToFactory(socket_factory_.get());
2118
2119 MockQuicData quic_data2;
2120 quic::QuicStreamOffset header_stream_offset2 = 0;
2121 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
2122 quic_data2.AddWrite(
2123 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset2));
2124 quic_data2.AddSocketDataToFactory(socket_factory_.get());
2125
2126 // Create request and QuicHttpStream.
2127 QuicStreamRequest request(factory_.get());
2128 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032129 request.Request(
2130 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2131 SocketTag(),
2132 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2133 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi63574b72018-06-01 20:22:252134 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2135 std::unique_ptr<HttpStream> stream = CreateStream(&request);
2136 EXPECT_TRUE(stream.get());
2137
2138 // Cause QUIC stream to be created.
2139 HttpRequestInfo request_info;
2140 request_info.method = "GET";
2141 request_info.url = url_;
2142 request_info.traffic_annotation =
2143 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
2144 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
2145 net_log_, CompletionOnceCallback()));
2146
2147 // Ensure that session is alive and active.
2148 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2149 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2150 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2151
2152 // Send GET request on stream.
2153 HttpResponseInfo response;
2154 HttpRequestHeaders request_headers;
2155 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2156 callback_.callback()));
2157
2158 // Receive an IP address change notification.
2159 NotifyIPAddressChanged();
2160
2161 // The connection should still be alive, but marked as going away.
2162 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2163 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2164 EXPECT_EQ(1u, session->GetNumActiveStreams());
2165
2166 // Resume the data, response should be read from the original connection.
2167 quic_data1.Resume();
2168 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
2169 EXPECT_EQ(200, response.headers->response_code());
2170 EXPECT_EQ(0u, session->GetNumActiveStreams());
2171
2172 // Second request should be sent on a new connection.
2173 QuicStreamRequest request2(factory_.get());
2174 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032175 request2.Request(
2176 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2177 SocketTag(),
2178 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2179 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi63574b72018-06-01 20:22:252180 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2181 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
2182 EXPECT_TRUE(stream2.get());
2183
2184 // Check an active session exisits for the destination.
2185 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2186 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2187 QuicChromiumClientSession* session2 = GetActiveSession(host_port_pair_);
2188 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
2189
2190 stream.reset();
2191 stream2.reset();
2192 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
2193 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
2194 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
2195 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
2196}
2197
Jana Iyengarba355772017-09-21 22:03:212198TEST_P(QuicStreamFactoryTest, OnIPAddressChangedWithConnectionMigration) {
Zhongyi Shi1a054612018-06-14 04:59:082199 InitializeConnectionMigrationV2Test(
Jana Iyengarba355772017-09-21 22:03:212200 {kDefaultNetworkForTests, kNewNetworkForTests});
2201 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2202 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2203 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2204
2205 MockQuicData socket_data;
2206 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432207 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Ryan Hamilton8d9ee76e2018-05-29 23:52:522208 socket_data.AddWrite(
2209 SYNCHRONOUS, ConstructClientRstPacket(2, quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:172210 socket_data.AddSocketDataToFactory(socket_factory_.get());
Jana Iyengarba355772017-09-21 22:03:212211
2212 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332213 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032214 request.Request(
2215 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2216 SocketTag(),
2217 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2218 failed_on_default_network_callback_, callback_.callback()));
Jana Iyengarba355772017-09-21 22:03:212219
2220 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242221 std::unique_ptr<HttpStream> stream = CreateStream(&request);
Jana Iyengarba355772017-09-21 22:03:212222 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:392223 request_info.traffic_annotation =
2224 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272225 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392226 net_log_, CompletionOnceCallback()));
Jana Iyengarba355772017-09-21 22:03:212227
2228 IPAddress last_address;
2229 EXPECT_TRUE(http_server_properties_.GetSupportsQuic(&last_address));
2230
2231 // Change the IP address and verify that the connection is unaffected.
2232 NotifyIPAddressChanged();
2233 EXPECT_FALSE(factory_->require_confirmation());
2234 EXPECT_TRUE(http_server_properties_.GetSupportsQuic(&last_address));
2235
2236 // Attempting a new request to the same origin uses the same connection.
2237 QuicStreamRequest request2(factory_.get());
2238 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:332239 DEFAULT_PRIORITY, SocketTag(),
2240 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:032241 &net_error_details_,
2242 failed_on_default_network_callback_,
2243 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:242244 stream = CreateStream(&request2);
Jana Iyengarba355772017-09-21 22:03:212245
2246 stream.reset();
2247 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2248 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2249}
2250
Zhongyi Shia0644e32018-06-21 05:19:522251TEST_P(QuicStreamFactoryTest, MigrateOnNetworkMadeDefaultWithSynchronousWrite) {
2252 TestMigrationOnNetworkMadeDefault(SYNCHRONOUS);
jri9f303712016-09-13 01:10:222253}
2254
Zhongyi Shia0644e32018-06-21 05:19:522255TEST_P(QuicStreamFactoryTest, MigrateOnNetworkMadeDefaultWithAsyncWrite) {
2256 TestMigrationOnNetworkMadeDefault(ASYNC);
jri9f303712016-09-13 01:10:222257}
2258
Zhongyi Shia0644e32018-06-21 05:19:522259// Sets up a test which attempts connection migration successfully after probing
2260// when a new network is made as default and the old default is still available.
2261// |write_mode| specifies the write mode for the last write before
2262// OnNetworkMadeDefault is delivered to session.
2263void QuicStreamFactoryTestBase::TestMigrationOnNetworkMadeDefault(
2264 IoMode write_mode) {
2265 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jri7e636642016-01-14 06:57:082266 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2267 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2268 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2269
Zhongyi Shia0644e32018-06-21 05:19:522270 // Using a testing task runner so that we can control time.
2271 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2272 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
2273
2274 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2275 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
2276
2277 MockQuicData quic_data1;
Ryan Hamilton8d9ee76e2018-05-29 23:52:522278 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shia0644e32018-06-21 05:19:522279 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
2280 quic_data1.AddWrite(SYNCHRONOUS,
2281 ConstructInitialSettingsPacket(1, &header_stream_offset));
2282 quic_data1.AddWrite(
2283 write_mode, ConstructGetRequestPacket(2, GetNthClientInitiatedStreamId(0),
2284 true, true, &header_stream_offset));
2285 quic_data1.AddSocketDataToFactory(socket_factory_.get());
2286
2287 // Set up the second socket data provider that is used after migration.
2288 // The response to the earlier request is read on the new socket.
2289 MockQuicData quic_data2;
2290 // Connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:252291 quic_data2.AddWrite(SYNCHRONOUS,
2292 client_maker_.MakeConnectivityProbingPacket(3, true));
Zhongyi Shia0644e32018-06-21 05:19:522293 quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
2294 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:252295 quic_data2.AddRead(ASYNC,
2296 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shia0644e32018-06-21 05:19:522297 // Ping packet to send after migration is completed.
2298 quic_data2.AddWrite(ASYNC,
2299 client_maker_.MakeAckAndPingPacket(4, false, 1, 1, 1));
2300 quic_data2.AddRead(
2301 ASYNC, ConstructOkResponsePacket(2, GetNthClientInitiatedStreamId(0),
2302 false, false));
2303 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
2304 quic_data2.AddWrite(SYNCHRONOUS,
2305 client_maker_.MakeAckAndRstPacket(
2306 5, false, GetNthClientInitiatedStreamId(0),
2307 quic::QUIC_STREAM_CANCELLED, 2, 2, 1, true));
2308 quic_data2.AddSocketDataToFactory(socket_factory_.get());
jri7e636642016-01-14 06:57:082309
2310 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452311 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332312 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032313 request.Request(
2314 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2315 SocketTag(),
2316 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2317 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012318 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242319 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri7e636642016-01-14 06:57:082320 EXPECT_TRUE(stream.get());
2321
2322 // Cause QUIC stream to be created.
2323 HttpRequestInfo request_info;
2324 request_info.method = "GET";
bnc3d9035b32016-06-30 18:18:482325 request_info.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:392326 request_info.traffic_annotation =
2327 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272328 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392329 net_log_, CompletionOnceCallback()));
jri7e636642016-01-14 06:57:082330
2331 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502332 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:082333 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2334 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2335
2336 // Send GET request on stream.
2337 HttpResponseInfo response;
2338 HttpRequestHeaders request_headers;
2339 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2340 callback_.callback()));
2341
Zhongyi Shia0644e32018-06-21 05:19:522342 // Deliver a signal that a alternate network is connected now, this should
2343 // cause the connection to start early migration on path degrading.
2344 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2345 ->SetConnectedNetworksList(
2346 {kDefaultNetworkForTests, kNewNetworkForTests});
2347 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2348 ->NotifyNetworkConnected(kNewNetworkForTests);
jri9f303712016-09-13 01:10:222349
Zhongyi Shia0644e32018-06-21 05:19:522350 // Cause the connection to report path degrading to the session.
2351 // Due to lack of alternate network, session will not mgirate connection.
2352 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
jri7e636642016-01-14 06:57:082353 scoped_mock_network_change_notifier_->mock_network_change_notifier()
jrie2661982016-08-20 08:24:342354 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
jri7e636642016-01-14 06:57:082355
Zhongyi Shia0644e32018-06-21 05:19:522356 // A task will be posted to migrate to the new default network.
2357 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
2358 EXPECT_EQ(base::TimeDelta(), task_runner->NextPendingTaskDelay());
2359
2360 // Execute the posted task to migrate back to the default network.
2361 task_runner->RunUntilIdle();
2362 // Another task to try send a new connectivity probe is posted. And a task to
2363 // retry migrate back to default network is scheduled.
2364 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
2365 // Next connectivity probe is scheduled to be sent in 2 *
2366 // kDefaultRTTMilliSecs.
2367 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
2368 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
2369 next_task_delay);
2370
2371 // The connection should still be alive, and not marked as going away.
jri7e636642016-01-14 06:57:082372 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia0644e32018-06-21 05:19:522373 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2374 EXPECT_EQ(1u, session->GetNumActiveStreams());
2375 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
2376
2377 // Resume quic data and a connectivity probe response will be read on the new
2378 // socket, declare probing as successful. And a new task to WriteToNewSocket
2379 // will be posted to complete migration.
2380 quic_data2.Resume();
2381
2382 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2383 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri7e636642016-01-14 06:57:082384 EXPECT_EQ(1u, session->GetNumActiveStreams());
2385
Zhongyi Shia0644e32018-06-21 05:19:522386 // There should be three pending tasks, the nearest one will complete
2387 // migration to the new network.
2388 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
2389 next_task_delay = task_runner->NextPendingTaskDelay();
2390 EXPECT_EQ(base::TimeDelta(), next_task_delay);
2391 task_runner->FastForwardBy(next_task_delay);
2392
2393 // Response headers are received over the new network.
2394 EXPECT_THAT(callback_.WaitForResult(), IsOk());
jri7e636642016-01-14 06:57:082395 EXPECT_EQ(200, response.headers->response_code());
2396
Zhongyi Shia0644e32018-06-21 05:19:522397 // Now there are two pending tasks, the nearest one was to send connectivity
2398 // probe and has been cancelled due to successful migration.
2399 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
2400 next_task_delay = task_runner->NextPendingTaskDelay();
2401 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
2402 next_task_delay);
2403 task_runner->FastForwardBy(next_task_delay);
jri7e636642016-01-14 06:57:082404
Zhongyi Shia0644e32018-06-21 05:19:522405 // There's one more task to mgirate back to the default network in 0.4s, which
2406 // is also cancelled due to the success migration on the previous trial.
2407 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
2408 next_task_delay = task_runner->NextPendingTaskDelay();
2409 base::TimeDelta expected_delay =
2410 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
2411 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
2412 EXPECT_EQ(expected_delay, next_task_delay);
2413 task_runner->FastForwardBy(next_task_delay);
2414 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
jri7e636642016-01-14 06:57:082415
Zhongyi Shia0644e32018-06-21 05:19:522416 // Verify that the session is still alive.
jri7e636642016-01-14 06:57:082417 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia0644e32018-06-21 05:19:522418 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri7e636642016-01-14 06:57:082419
Zhongyi Shia0644e32018-06-21 05:19:522420 stream.reset();
2421 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
2422 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
2423 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
2424 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
jri7e636642016-01-14 06:57:082425}
2426
Zhongyi Shib3bc982c2018-07-10 19:59:242427// Regression test for http://859674.
2428// This test veries that a writer will not attempt to write packets until being
2429// unblocked on both socket level and network level. In this test, a probing
2430// writer is used to send two connectivity probes to the peer: where the first
2431// one completes successfully, while a connectivity response is received before
2432// completes sending the second one. The connection migration attempt will
2433// proceed while the probing writer is blocked at the socket level, which will
2434// block the writer on the network level. Once connection migration completes
2435// successfully, the probing writer will be unblocked on the network level, it
2436// will not attempt to write new packets until the socket level is unblocked.
2437TEST_P(QuicStreamFactoryTest, MigratedToBlockedSocketAfterProbing) {
2438 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
2439 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2440 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2441 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2442
2443 // Using a testing task runner so that we can control time.
2444 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2445 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
2446
2447 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2448 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
2449
2450 MockQuicData quic_data1;
2451 quic::QuicStreamOffset header_stream_offset = 0;
2452 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
2453 quic_data1.AddWrite(SYNCHRONOUS,
2454 ConstructInitialSettingsPacket(1, &header_stream_offset));
2455 quic_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
2456 2, GetNthClientInitiatedStreamId(0),
2457 true, true, &header_stream_offset));
2458 quic_data1.AddSocketDataToFactory(socket_factory_.get());
2459
2460 // Set up the second socket data provider that is used after migration.
2461 // The response to the earlier request is read on the new socket.
2462 MockQuicData quic_data2;
2463 // First connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:252464 quic_data2.AddWrite(SYNCHRONOUS,
2465 client_maker_.MakeConnectivityProbingPacket(3, true));
Zhongyi Shib3bc982c2018-07-10 19:59:242466 quic_data2.AddRead(ASYNC,
2467 ERR_IO_PENDING); // Pause so that we can control time.
2468 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:252469 quic_data2.AddRead(ASYNC,
2470 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shib3bc982c2018-07-10 19:59:242471 // Second connectivity probe which will complete asynchronously.
Zhongyi Shi879659422018-08-02 17:58:252472 quic_data2.AddWrite(ASYNC,
2473 client_maker_.MakeConnectivityProbingPacket(4, true));
Zhongyi Shib3bc982c2018-07-10 19:59:242474 quic_data2.AddRead(
2475 ASYNC, ConstructOkResponsePacket(2, GetNthClientInitiatedStreamId(0),
2476 false, false));
2477 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
2478 quic_data2.AddWrite(ASYNC,
2479 client_maker_.MakeAckAndPingPacket(5, false, 1, 1, 1));
2480 quic_data2.AddWrite(SYNCHRONOUS,
2481 client_maker_.MakeAckAndRstPacket(
2482 6, false, GetNthClientInitiatedStreamId(0),
2483 quic::QUIC_STREAM_CANCELLED, 2, 2, 1, true));
2484
2485 quic_data2.AddSocketDataToFactory(socket_factory_.get());
2486
2487 // Create request and QuicHttpStream.
2488 QuicStreamRequest request(factory_.get());
2489 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032490 request.Request(
2491 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2492 SocketTag(),
2493 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2494 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shib3bc982c2018-07-10 19:59:242495 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2496 std::unique_ptr<HttpStream> stream = CreateStream(&request);
2497 EXPECT_TRUE(stream.get());
2498
2499 // Cause QUIC stream to be created.
2500 HttpRequestInfo request_info;
2501 request_info.method = "GET";
2502 request_info.url = url_;
2503 request_info.traffic_annotation =
2504 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
2505 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
2506 net_log_, CompletionOnceCallback()));
2507
2508 // Ensure that session is alive and active.
2509 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2510 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2511 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2512
2513 // Send GET request on stream.
2514 HttpResponseInfo response;
2515 HttpRequestHeaders request_headers;
2516 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2517 callback_.callback()));
2518
2519 // Deliver a signal that a alternate network is connected now, this should
2520 // cause the connection to start early migration on path degrading.
2521 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2522 ->SetConnectedNetworksList(
2523 {kDefaultNetworkForTests, kNewNetworkForTests});
2524 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2525 ->NotifyNetworkConnected(kNewNetworkForTests);
2526
2527 // Cause the connection to report path degrading to the session.
2528 // Due to lack of alternate network, session will not mgirate connection.
2529 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
2530 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2531 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
2532
2533 // A task will be posted to migrate to the new default network.
2534 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
2535 EXPECT_EQ(base::TimeDelta(), task_runner->NextPendingTaskDelay());
2536
2537 // Execute the posted task to migrate back to the default network.
2538 task_runner->RunUntilIdle();
2539 // Another task to resend a new connectivity probe is posted. And a task to
2540 // retry migrate back to default network is scheduled.
2541 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
2542 // Next connectivity probe is scheduled to be sent in 2 *
2543 // kDefaultRTTMilliSecs.
2544 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
2545 base::TimeDelta expected_delay =
2546 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
2547 EXPECT_EQ(expected_delay, next_task_delay);
2548
2549 // Fast forward to send the second connectivity probe. The write will be
2550 // asynchronous and complete after the read completes.
2551 task_runner->FastForwardBy(next_task_delay);
2552
2553 // Resume quic data and a connectivity probe response will be read on the new
2554 // socket, declare probing as successful.
2555 quic_data2.Resume();
2556
2557 // The connection should still be alive, and not marked as going away.
2558 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2559 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2560 EXPECT_EQ(1u, session->GetNumActiveStreams());
2561 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
2562
2563 // There should be three pending tasks, the nearest one will complete
2564 // migration to the new network. Second task will retry migrate back to
2565 // default but cancelled, and the third task will retry send connectivity
2566 // probe but also cancelled.
2567 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
2568 EXPECT_EQ(base::TimeDelta(), task_runner->NextPendingTaskDelay());
2569 task_runner->RunUntilIdle();
2570
2571 // Response headers are received over the new network.
2572 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2573 EXPECT_EQ(200, response.headers->response_code());
2574
2575 // Run the message loop to complete the asynchronous write of ack and ping.
2576 base::RunLoop().RunUntilIdle();
2577
2578 // Now there are two pending tasks, the nearest one was to retry migrate back
2579 // to default network and has been cancelled due to successful migration.
2580 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
2581 expected_delay =
2582 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
2583 expected_delay;
2584 next_task_delay = task_runner->NextPendingTaskDelay();
2585 EXPECT_EQ(expected_delay, next_task_delay);
2586 task_runner->FastForwardBy(next_task_delay);
2587
2588 // There's one more task to retry sending connectivity probe in 0.4s and has
2589 // also been cancelled due to the successful probing.
2590 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
2591 next_task_delay = task_runner->NextPendingTaskDelay();
2592 expected_delay =
2593 base::TimeDelta::FromMilliseconds(3 * 2 * kDefaultRTTMilliSecs) -
2594 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs);
2595 EXPECT_EQ(expected_delay, next_task_delay);
2596 task_runner->FastForwardBy(next_task_delay);
2597 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
2598
2599 // Verify that the session is still alive.
2600 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2601 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2602
2603 stream.reset();
2604 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
2605 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
2606 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
2607 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
2608}
2609
Zhongyi Shib1b1fa42018-06-19 23:13:472610// This test verifies that session times out connection migration attempt
2611// with signals delivered in the following order (no alternate network is
2612// available):
2613// - default network disconnected is delivered: session attempts connection
2614// migration but found not alternate network. Session waits for a new network
2615// comes up in the next kWaitTimeForNewNetworkSecs seonds.
2616// - no new network is connected, migration times out. Session is closed.
2617TEST_P(QuicStreamFactoryTest, MigrationTimeoutWithNoNewNetwork) {
2618 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jri7e636642016-01-14 06:57:082619 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2620 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2621
Zhongyi Shib1b1fa42018-06-19 23:13:472622 // Using a testing task runner so that we can control time.
2623 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2624 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
jri5b785512016-09-13 04:29:112625
rcha00569732016-08-27 11:09:362626 MockQuicData socket_data;
2627 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432628 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:172629 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri7e636642016-01-14 06:57:082630
2631 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452632 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332633 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032634 request.Request(
2635 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2636 SocketTag(),
2637 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2638 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012639 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242640 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri7e636642016-01-14 06:57:082641 EXPECT_TRUE(stream.get());
2642
2643 // Cause QUIC stream to be created.
2644 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:392645 request_info.traffic_annotation =
2646 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272647 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392648 net_log_, CompletionOnceCallback()));
jri7e636642016-01-14 06:57:082649
2650 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502651 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:082652 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2653 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2654
2655 // Trigger connection migration. Since there are no networks
jri5b785512016-09-13 04:29:112656 // to migrate to, this should cause the session to wait for a new network.
jri7e636642016-01-14 06:57:082657 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2658 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2659
jri5b785512016-09-13 04:29:112660 // The migration will not fail until the migration alarm timeout.
2661 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shib1b1fa42018-06-19 23:13:472662 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:112663 EXPECT_EQ(1u, session->GetNumActiveStreams());
2664 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
2665 EXPECT_EQ(true, session->connection()->writer()->IsWriteBlocked());
2666
Zhongyi Shib1b1fa42018-06-19 23:13:472667 // Migration will be timed out after kWaitTimeForNewNetwokSecs.
2668 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
2669 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
2670 EXPECT_EQ(base::TimeDelta::FromSeconds(kWaitTimeForNewNetworkSecs),
2671 next_task_delay);
2672 task_runner->FastForwardBy(next_task_delay);
jri5b785512016-09-13 04:29:112673
2674 // The connection should now be closed. A request for response
2675 // headers should fail.
jri7e636642016-01-14 06:57:082676 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2677 EXPECT_FALSE(HasActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:112678 EXPECT_EQ(ERR_NETWORK_CHANGED, callback_.WaitForResult());
jri7e636642016-01-14 06:57:082679
2680 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2681 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2682}
2683
Zhongyi Shi21e99532018-07-17 22:23:072684// This test verifies that connectivity probes will be sent even if there is
2685// a non-migratable stream. However, when connection migrates to the
2686// successfully probed path, any non-migratable stream will be reset. And if
2687// the connection becomes idle then, close the connection.
jri9f303712016-09-13 01:10:222688TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultNonMigratableStream) {
Zhongyi Shi5f587cc2017-11-21 23:24:172689 InitializeConnectionMigrationV2Test(
2690 {kDefaultNetworkForTests, kNewNetworkForTests});
2691 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2692 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2693
2694 MockQuicData socket_data;
2695 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432696 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Renjieba55fae2018-09-20 03:05:162697 socket_data.AddWrite(
2698 SYNCHRONOUS,
2699 client_maker_.MakeRstAckAndConnectionClosePacket(
2700 3, false, 5, quic::QUIC_STREAM_CANCELLED,
2701 quic::QuicTime::Delta::FromMilliseconds(0), 1, 1, 1,
2702 quic::QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS, "net error"));
2703
Zhongyi Shi5f587cc2017-11-21 23:24:172704 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri231c2972016-03-08 19:50:112705
Zhongyi Shi21e99532018-07-17 22:23:072706 // Set up the second socket data provider that is used for probing.
2707 MockQuicData quic_data1;
2708 // Connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:252709 quic_data1.AddWrite(SYNCHRONOUS,
2710 client_maker_.MakeConnectivityProbingPacket(2, true));
Zhongyi Shi21e99532018-07-17 22:23:072711 quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
2712 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:252713 quic_data1.AddRead(ASYNC,
2714 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shi21e99532018-07-17 22:23:072715 quic_data1.AddSocketDataToFactory(socket_factory_.get());
2716
jri231c2972016-03-08 19:50:112717 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452718 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332719 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032720 request.Request(
2721 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2722 SocketTag(),
2723 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2724 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012725 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242726 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri231c2972016-03-08 19:50:112727 EXPECT_TRUE(stream.get());
2728
2729 // Cause QUIC stream to be created, but marked as non-migratable.
2730 HttpRequestInfo request_info;
Zhongyi Shibb28b1f2018-07-18 02:41:262731 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
Ramin Halavati683bcaa92018-02-14 08:42:392732 request_info.traffic_annotation =
2733 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272734 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392735 net_log_, CompletionOnceCallback()));
jri231c2972016-03-08 19:50:112736
2737 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502738 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:112739 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2740 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2741
Zhongyi Shi21e99532018-07-17 22:23:072742 // Trigger connection migration. Session will start to probe the alternative
2743 // network. Although there is a non-migratable stream, session will still be
2744 // active until probing is declared as successful.
jri231c2972016-03-08 19:50:112745 scoped_mock_network_change_notifier_->mock_network_change_notifier()
jrie2661982016-08-20 08:24:342746 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
jri231c2972016-03-08 19:50:112747
2748 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shi21e99532018-07-17 22:23:072749 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri231c2972016-03-08 19:50:112750 EXPECT_EQ(1u, session->GetNumActiveStreams());
2751
Zhongyi Shi21e99532018-07-17 22:23:072752 // Resume data to read a connectivity probing response, which will cause
2753 // non-migtable streams to be closed. As session becomes idle, connection will
2754 // be closed.
2755 quic_data1.Resume();
2756 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2757 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2758 EXPECT_EQ(0u, session->GetNumActiveStreams());
jri231c2972016-03-08 19:50:112759
Zhongyi Shi21e99532018-07-17 22:23:072760 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
2761 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
jri231c2972016-03-08 19:50:112762 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2763 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2764}
2765
jri9f303712016-09-13 01:10:222766TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultConnectionMigrationDisabled) {
Zhongyi Shi5f587cc2017-11-21 23:24:172767 InitializeConnectionMigrationV2Test(
2768 {kDefaultNetworkForTests, kNewNetworkForTests});
2769 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2770 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2771
2772 MockQuicData socket_data;
2773 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432774 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
2775 socket_data.AddWrite(
2776 SYNCHRONOUS,
2777 client_maker_.MakeRstPacket(2, true, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:522778 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:172779 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9c541572016-03-29 17:51:482780
2781 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452782 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332783 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032784 request.Request(
2785 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2786 SocketTag(),
2787 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2788 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012789 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242790 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9c541572016-03-29 17:51:482791 EXPECT_TRUE(stream.get());
2792
2793 // Cause QUIC stream to be created.
2794 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:392795 request_info.traffic_annotation =
2796 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272797 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392798 net_log_, CompletionOnceCallback()));
jri9c541572016-03-29 17:51:482799
2800 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502801 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:482802 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2803 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2804
2805 // Set session config to have connection migration disabled.
Ryan Hamilton8d9ee76e2018-05-29 23:52:522806 quic::test::QuicConfigPeer::SetReceivedDisableConnectionMigration(
2807 session->config());
jri9c541572016-03-29 17:51:482808 EXPECT_TRUE(session->config()->DisableConnectionMigration());
2809
2810 // Trigger connection migration. Since there is a non-migratable stream,
2811 // this should cause session to continue but be marked as going away.
2812 scoped_mock_network_change_notifier_->mock_network_change_notifier()
jrie2661982016-08-20 08:24:342813 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
jri9c541572016-03-29 17:51:482814
2815 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2816 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2817 EXPECT_EQ(1u, session->GetNumActiveStreams());
2818
2819 stream.reset();
2820
2821 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2822 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2823}
2824
jri9f303712016-09-13 01:10:222825TEST_P(QuicStreamFactoryTest, OnNetworkDisconnectedNonMigratableStream) {
Zhongyi Shi5f587cc2017-11-21 23:24:172826 InitializeConnectionMigrationV2Test(
2827 {kDefaultNetworkForTests, kNewNetworkForTests});
2828 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2829 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2830
2831 MockQuicData socket_data;
2832 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432833 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
2834 socket_data.AddWrite(
2835 SYNCHRONOUS,
2836 client_maker_.MakeRstPacket(2, true, GetNthClientInitiatedStreamId(0),
Zhongyi Shi0439ecc72018-07-11 04:41:262837 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:172838 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri231c2972016-03-08 19:50:112839
2840 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452841 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332842 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032843 request.Request(
2844 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2845 SocketTag(),
2846 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2847 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012848 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242849 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri231c2972016-03-08 19:50:112850 EXPECT_TRUE(stream.get());
2851
2852 // Cause QUIC stream to be created, but marked as non-migratable.
2853 HttpRequestInfo request_info;
Zhongyi Shibb28b1f2018-07-18 02:41:262854 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
Ramin Halavati683bcaa92018-02-14 08:42:392855 request_info.traffic_annotation =
2856 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272857 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392858 net_log_, CompletionOnceCallback()));
jri231c2972016-03-08 19:50:112859
2860 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502861 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:112862 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2863 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2864
2865 // Trigger connection migration. Since there is a non-migratable stream,
2866 // this should cause a RST_STREAM frame to be emitted with
Zhongyi Shi0439ecc72018-07-11 04:41:262867 // quic::QUIC_STREAM_CANCELLED error code, and the session will be closed.
jri231c2972016-03-08 19:50:112868 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2869 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2870
2871 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2872 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2873
2874 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2875 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2876}
2877
jri9c541572016-03-29 17:51:482878TEST_P(QuicStreamFactoryTest,
jri9f303712016-09-13 01:10:222879 OnNetworkDisconnectedConnectionMigrationDisabled) {
Zhongyi Shi5f587cc2017-11-21 23:24:172880 InitializeConnectionMigrationV2Test(
2881 {kDefaultNetworkForTests, kNewNetworkForTests});
2882 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2883 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2884
2885 MockQuicData socket_data;
2886 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432887 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
2888 socket_data.AddWrite(
2889 SYNCHRONOUS,
2890 client_maker_.MakeRstPacket(2, true, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:522891 quic::QUIC_RST_ACKNOWLEDGEMENT));
Zhongyi Shi5f587cc2017-11-21 23:24:172892 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9c541572016-03-29 17:51:482893
2894 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452895 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332896 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032897 request.Request(
2898 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2899 SocketTag(),
2900 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2901 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012902 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242903 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9c541572016-03-29 17:51:482904 EXPECT_TRUE(stream.get());
2905
2906 // Cause QUIC stream to be created.
2907 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:392908 request_info.traffic_annotation =
2909 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272910 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392911 net_log_, CompletionOnceCallback()));
jri9c541572016-03-29 17:51:482912
2913 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502914 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:482915 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2916 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2917
2918 // Set session config to have connection migration disabled.
Ryan Hamilton8d9ee76e2018-05-29 23:52:522919 quic::test::QuicConfigPeer::SetReceivedDisableConnectionMigration(
2920 session->config());
jri9c541572016-03-29 17:51:482921 EXPECT_TRUE(session->config()->DisableConnectionMigration());
2922
2923 // Trigger connection migration. Since there is a non-migratable stream,
2924 // this should cause a RST_STREAM frame to be emitted with
Ryan Hamilton8d9ee76e2018-05-29 23:52:522925 // quic::QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed.
jri9c541572016-03-29 17:51:482926 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2927 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2928
2929 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2930 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2931
2932 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2933 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2934}
2935
jri9f303712016-09-13 01:10:222936TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultNoOpenStreams) {
Zhongyi Shi5f587cc2017-11-21 23:24:172937 InitializeConnectionMigrationV2Test(
2938 {kDefaultNetworkForTests, kNewNetworkForTests});
2939 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2940 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2941
2942 MockQuicData socket_data;
2943 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432944 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Renjieba55fae2018-09-20 03:05:162945 socket_data.AddWrite(
2946 SYNCHRONOUS,
2947 client_maker_.MakeConnectionClosePacket(
2948 2, true, quic::QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS,
2949 "net error"));
Zhongyi Shi5f587cc2017-11-21 23:24:172950 socket_data.AddSocketDataToFactory(socket_factory_.get());
2951
2952 // Create request and QuicHttpStream.
2953 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332954 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032955 request.Request(
2956 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2957 SocketTag(),
2958 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2959 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi5f587cc2017-11-21 23:24:172960 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2961 std::unique_ptr<HttpStream> stream = CreateStream(&request);
2962 EXPECT_TRUE(stream.get());
2963
2964 // Ensure that session is alive and active.
2965 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2966 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2967 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2968
2969 // Trigger connection migration.
2970 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2971 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
2972
2973 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2974 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2975
2976 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2977 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2978}
2979
jri9f303712016-09-13 01:10:222980TEST_P(QuicStreamFactoryTest, OnNetworkDisconnectedNoOpenStreams) {
Zhongyi Shi5f587cc2017-11-21 23:24:172981 InitializeConnectionMigrationV2Test(
2982 {kDefaultNetworkForTests, kNewNetworkForTests});
2983 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2984 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2985
2986 MockQuicData socket_data;
2987 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432988 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:172989 socket_data.AddSocketDataToFactory(socket_factory_.get());
2990
2991 // Create request and QuicHttpStream.
2992 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332993 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032994 request.Request(
2995 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2996 SocketTag(),
2997 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2998 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi5f587cc2017-11-21 23:24:172999 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3000 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3001 EXPECT_TRUE(stream.get());
3002
3003 // Ensure that session is alive and active.
3004 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3005 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3006 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3007
3008 // Trigger connection migration. Since there are no active streams,
3009 // the session will be closed.
3010 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3011 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
3012
3013 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3014 EXPECT_FALSE(HasActiveSession(host_port_pair_));
3015
3016 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3017 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3018}
3019
Zhongyi Shi9f316b262018-06-18 22:01:163020// This test verifies session migrates to the alternate network immediately when
3021// default network disconnects with a synchronous write before migration.
3022TEST_P(QuicStreamFactoryTest, MigrateOnDefaultNetworkDisconnectedSync) {
3023 TestMigrationOnNetworkDisconnected(/*async_write_before*/ false);
3024}
3025
3026// This test verifies session migrates to the alternate network immediately when
3027// default network disconnects with an asynchronously write before migration.
3028TEST_P(QuicStreamFactoryTest, MigrateOnDefaultNetworkDisconnectedAsync) {
3029 TestMigrationOnNetworkDisconnected(/*async_write_before*/ true);
3030}
3031
3032void QuicStreamFactoryTestBase::TestMigrationOnNetworkDisconnected(
3033 bool async_write_before) {
3034 InitializeConnectionMigrationV2Test(
3035 {kDefaultNetworkForTests, kNewNetworkForTests});
3036 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3037 ->NotifyNetworkMadeDefault(kDefaultNetworkForTests);
3038 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3039 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3040 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3041
3042 // Use the test task runner.
3043 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3044
3045 int packet_number = 1;
3046 MockQuicData socket_data;
3047 quic::QuicStreamOffset header_stream_offset = 0;
3048 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3049 socket_data.AddWrite(
3050 SYNCHRONOUS,
3051 ConstructInitialSettingsPacket(packet_number++, &header_stream_offset));
3052 socket_data.AddWrite(
3053 SYNCHRONOUS, ConstructGetRequestPacket(
3054 packet_number++, GetNthClientInitiatedStreamId(0), true,
3055 true, &header_stream_offset));
3056 if (async_write_before) {
3057 socket_data.AddWrite(ASYNC, OK);
3058 packet_number++;
3059 }
3060 socket_data.AddSocketDataToFactory(socket_factory_.get());
3061
3062 // Create request and QuicHttpStream.
3063 QuicStreamRequest request(factory_.get());
3064 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033065 request.Request(
3066 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3067 SocketTag(),
3068 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3069 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi9f316b262018-06-18 22:01:163070 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3071 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3072 EXPECT_TRUE(stream.get());
3073
3074 // Cause QUIC stream to be created.
3075 HttpRequestInfo request_info;
3076 request_info.method = "GET";
3077 request_info.url = url_;
3078 request_info.traffic_annotation =
3079 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3080 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3081 net_log_, CompletionOnceCallback()));
3082
3083 // Ensure that session is alive and active.
3084 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3085 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3086 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3087
3088 // Send GET request on stream.
3089 HttpResponseInfo response;
3090 HttpRequestHeaders request_headers;
3091 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3092 callback_.callback()));
3093
Zhongyi Shi22fd5f52018-06-20 17:39:093094 if (async_write_before)
Zhongyi Shi9f316b262018-06-18 22:01:163095 session->SendPing();
Zhongyi Shi9f316b262018-06-18 22:01:163096
3097 // Set up second socket data provider that is used after migration.
3098 // The response to the earlier request is read on this new socket.
3099 MockQuicData socket_data1;
3100 socket_data1.AddWrite(
3101 SYNCHRONOUS,
3102 client_maker_.MakePingPacket(packet_number++, /*include_version=*/true));
3103 socket_data1.AddRead(
3104 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
3105 false, false));
3106 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3107 socket_data1.AddWrite(
3108 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
3109 packet_number++, false, GetNthClientInitiatedStreamId(0),
3110 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
3111 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));
3173 socket_data.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
3174 2, GetNthClientInitiatedStreamId(0),
3175 true, true, &header_stream_offset));
Zhongyi Shi5f587cc2017-11-21 23:24:173176 socket_data.AddSocketDataToFactory(socket_factory_.get());
3177
3178 // Create request and QuicHttpStream.
3179 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:333180 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033181 request.Request(
3182 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3183 SocketTag(),
3184 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3185 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi5f587cc2017-11-21 23:24:173186 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3187 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3188 EXPECT_TRUE(stream.get());
3189
3190 // Cause QUIC stream to be created.
3191 HttpRequestInfo request_info;
3192 request_info.method = "GET";
3193 request_info.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:393194 request_info.traffic_annotation =
3195 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:273196 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:393197 net_log_, CompletionOnceCallback()));
Zhongyi Shi5f587cc2017-11-21 23:24:173198
3199 // Ensure that session is alive and active.
3200 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3201 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3202 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3203
3204 // Send GET request on stream.
3205 HttpResponseInfo response;
3206 HttpRequestHeaders request_headers;
3207 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3208 callback_.callback()));
3209
3210 // Trigger connection migration. Since there are no networks
3211 // to migrate to, this should cause the session to wait for a new network.
3212 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3213 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
3214
3215 // The connection should still be alive, not marked as going away.
3216 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3217 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3218 EXPECT_EQ(1u, session->GetNumActiveStreams());
3219 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
3220
3221 // Set up second socket data provider that is used after migration.
3222 // The response to the earlier request is read on this new socket.
3223 MockQuicData socket_data1;
3224 socket_data1.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:433225 SYNCHRONOUS, client_maker_.MakePingPacket(3, /*include_version=*/true));
3226 socket_data1.AddRead(
3227 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
3228 false, false));
Zhongyi Shi5f587cc2017-11-21 23:24:173229 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:433230 socket_data1.AddWrite(SYNCHRONOUS,
3231 client_maker_.MakeAckAndRstPacket(
3232 4, false, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:523233 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:173234 socket_data1.AddSocketDataToFactory(socket_factory_.get());
3235
3236 // Add a new network and notify the stream factory of a new connected network.
3237 // This causes a PING packet to be sent over the new network.
3238 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3239 ->SetConnectedNetworksList({kNewNetworkForTests});
3240 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3241 ->NotifyNetworkConnected(kNewNetworkForTests);
3242
3243 // Ensure that the session is still alive.
3244 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3245 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3246 EXPECT_EQ(1u, session->GetNumActiveStreams());
3247
3248 // Run the message loop so that data queued in the new socket is read by the
3249 // packet reader.
3250 runner_->RunNextTask();
3251
3252 // Response headers are received over the new network.
3253 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3254 EXPECT_EQ(200, response.headers->response_code());
3255
3256 // Check that the session is still alive.
3257 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3258 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3259
3260 // There should posted tasks not executed, which is to migrate back to default
3261 // network.
3262 EXPECT_FALSE(runner_->GetPostedTasks().empty());
3263
3264 // Receive signal to mark new network as default.
3265 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3266 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
3267
3268 stream.reset();
3269 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3270 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3271 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
3272 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
3273}
3274
Zhongyi Shid3d5f502018-08-10 00:22:223275// Regression test for http://crbug.com/872011.
3276// This test verifies that migrate to the probing socket will not trigger
3277// new packets being read synchronously and generate ACK frame while
3278// processing the initial connectivity probe response, which may cause a
3279// connection being closed with INTERNAL_ERROR as pending ACK frame is not
3280// allowed when processing a new packet.
3281TEST_P(QuicStreamFactoryTest, MigrateToProbingSocket) {
3282 InitializeConnectionMigrationV2Test(
3283 {kDefaultNetworkForTests, kNewNetworkForTests});
3284 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3285 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3286 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3287
3288 // Using a testing task runner so that we can control time.
3289 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
3290 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
3291
3292 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3293 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
3294
3295 int packet_number = 1;
3296 MockQuicData quic_data1;
3297 quic::QuicStreamOffset header_stream_offset = 0;
3298 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
3299 quic_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket(
3300 packet_number++, &header_stream_offset));
3301 quic_data1.AddWrite(
3302 SYNCHRONOUS, ConstructGetRequestPacket(
3303 packet_number++, GetNthClientInitiatedStreamId(0), true,
3304 true, &header_stream_offset));
3305 quic_data1.AddSocketDataToFactory(socket_factory_.get());
3306
3307 // Set up the second socket data provider that is used for probing on the
3308 // alternate network.
3309 MockQuicData quic_data2;
3310 // Connectivity probe to be sent on the new path.
3311 quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
3312 packet_number++, true));
3313 quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
3314 // First connectivity probe to receive from the server, which will complete
3315 // connection migraiton on path degrading.
3316 quic_data2.AddRead(ASYNC,
3317 server_maker_.MakeConnectivityProbingPacket(1, false));
3318 // Read multiple connectivity probes synchronously.
3319 quic_data2.AddRead(SYNCHRONOUS,
3320 server_maker_.MakeConnectivityProbingPacket(2, false));
3321 quic_data2.AddRead(SYNCHRONOUS,
3322 server_maker_.MakeConnectivityProbingPacket(3, false));
3323 quic_data2.AddRead(SYNCHRONOUS,
3324 server_maker_.MakeConnectivityProbingPacket(4, false));
3325 quic_data2.AddWrite(
3326 ASYNC, client_maker_.MakeAckPacket(packet_number++, 1, 4, 1, 1, true));
3327 quic_data2.AddRead(
3328 ASYNC, ConstructOkResponsePacket(5, GetNthClientInitiatedStreamId(0),
3329 false, false));
3330 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3331 quic_data2.AddWrite(
3332 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
3333 packet_number++, false, GetNthClientInitiatedStreamId(0),
3334 quic::QUIC_STREAM_CANCELLED, 5, 1, 1, true));
3335 quic_data2.AddSocketDataToFactory(socket_factory_.get());
3336
3337 // Create request and QuicHttpStream.
3338 QuicStreamRequest request(factory_.get());
3339 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033340 request.Request(
3341 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3342 SocketTag(),
3343 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3344 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shid3d5f502018-08-10 00:22:223345 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3346 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3347 EXPECT_TRUE(stream.get());
3348
3349 // Cause QUIC stream to be created.
3350 HttpRequestInfo request_info;
3351 request_info.method = "GET";
3352 request_info.url = url_;
3353 request_info.traffic_annotation =
3354 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3355 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3356 net_log_, CompletionOnceCallback()));
3357
3358 // Ensure that session is alive and active.
3359 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3360 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3361 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3362
3363 // Send GET request on stream.
3364 HttpResponseInfo response;
3365 HttpRequestHeaders request_headers;
3366 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3367 callback_.callback()));
3368
3369 // Cause the connection to report path degrading to the session.
3370 // Session will start to probe the alternate network.
3371 session->connection()->OnPathDegradingTimeout();
3372
3373 // Next connectivity probe is scheduled to be sent in 2 *
3374 // kDefaultRTTMilliSecs.
3375 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3376 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
3377 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3378 next_task_delay);
3379
3380 // The connection should still be alive, and not marked as going away.
3381 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3382 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3383 EXPECT_EQ(1u, session->GetNumActiveStreams());
3384 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
3385
3386 // Resume quic data and a connectivity probe response will be read on the new
3387 // socket.
3388 quic_data2.Resume();
3389
3390 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3391 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3392 EXPECT_EQ(1u, session->GetNumActiveStreams());
3393
3394 // There should be three pending tasks, the nearest one will complete
3395 // migration to the new network.
3396 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
3397 next_task_delay = task_runner->NextPendingTaskDelay();
3398 EXPECT_EQ(base::TimeDelta(), next_task_delay);
3399 task_runner->FastForwardBy(next_task_delay);
3400
3401 // Response headers are received over the new network.
3402 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3403 EXPECT_EQ(200, response.headers->response_code());
3404
3405 // Now there are two pending tasks, the nearest one was to send connectivity
3406 // probe and has been cancelled due to successful migration.
3407 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
3408 next_task_delay = task_runner->NextPendingTaskDelay();
3409 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3410 next_task_delay);
3411 task_runner->FastForwardBy(next_task_delay);
3412
3413 // There's one more task to mgirate back to the default network in 0.4s.
3414 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3415 next_task_delay = task_runner->NextPendingTaskDelay();
3416 base::TimeDelta expected_delay =
3417 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
3418 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
3419 EXPECT_EQ(expected_delay, next_task_delay);
3420
3421 // Deliver a signal that the alternate network now becomes default to session,
3422 // this will cancel mgirate back to default network timer.
3423 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3424 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
3425
3426 task_runner->FastForwardBy(next_task_delay);
3427 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
3428
3429 // Verify that the session is still alive.
3430 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3431 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3432
3433 stream.reset();
3434 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
3435 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
3436 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
3437 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
3438}
3439
Zhongyi Shic4823bd2018-04-27 00:49:193440// This test verifies that the connection migrates to the alternate network
Zhongyi Shi22fd5f52018-06-20 17:39:093441// early when path degrading is detected with an ASYNCHRONOUS write before
3442// migration.
3443TEST_P(QuicStreamFactoryTest, MigrateEarlyOnPathDegradingAysnc) {
3444 TestMigrationOnPathDegrading(/*async_write_before_migration*/ true);
3445}
3446
3447// This test verifies that the connection migrates to the alternate network
3448// early when path degrading is detected with a SYNCHRONOUS write before
3449// migration.
3450TEST_P(QuicStreamFactoryTest, MigrateEarlyOnPathDegradingSync) {
3451 TestMigrationOnPathDegrading(/*async_write_before_migration*/ false);
3452}
3453
3454void QuicStreamFactoryTestBase::TestMigrationOnPathDegrading(
3455 bool async_write_before) {
Zhongyi Shic4823bd2018-04-27 00:49:193456 InitializeConnectionMigrationV2Test(
3457 {kDefaultNetworkForTests, kNewNetworkForTests});
3458 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3459 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3460 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3461
3462 // Using a testing task runner so that we can control time.
3463 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
3464 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
3465
3466 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3467 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
3468
Zhongyi Shi22fd5f52018-06-20 17:39:093469 int packet_number = 1;
Zhongyi Shic4823bd2018-04-27 00:49:193470 MockQuicData quic_data1;
Ryan Hamilton8d9ee76e2018-05-29 23:52:523471 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shic4823bd2018-04-27 00:49:193472 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
Zhongyi Shi22fd5f52018-06-20 17:39:093473 quic_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket(
3474 packet_number++, &header_stream_offset));
3475 quic_data1.AddWrite(
3476 SYNCHRONOUS, ConstructGetRequestPacket(
3477 packet_number++, GetNthClientInitiatedStreamId(0), true,
3478 true, &header_stream_offset));
3479 if (async_write_before) {
3480 quic_data1.AddWrite(ASYNC, OK);
3481 packet_number++;
3482 }
Zhongyi Shic4823bd2018-04-27 00:49:193483 quic_data1.AddSocketDataToFactory(socket_factory_.get());
3484
3485 // Set up the second socket data provider that is used after migration.
3486 // The response to the earlier request is read on the new socket.
3487 MockQuicData quic_data2;
3488 // Connectivity probe to be sent on the new path.
Zhongyi Shi22fd5f52018-06-20 17:39:093489 quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
Zhongyi Shi879659422018-08-02 17:58:253490 packet_number++, true));
Zhongyi Shic4823bd2018-04-27 00:49:193491 quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
3492 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:253493 quic_data2.AddRead(ASYNC,
3494 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shic4823bd2018-04-27 00:49:193495 // Ping packet to send after migration is completed.
Zhongyi Shi22fd5f52018-06-20 17:39:093496 quic_data2.AddWrite(ASYNC, client_maker_.MakeAckAndPingPacket(
3497 packet_number++, false, 1, 1, 1));
Ryan Hamiltona3ee93a72018-08-01 22:03:083498 quic_data2.AddRead(
3499 ASYNC, ConstructOkResponsePacket(2, GetNthClientInitiatedStreamId(0),
3500 false, false));
Zhongyi Shic4823bd2018-04-27 00:49:193501 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi22fd5f52018-06-20 17:39:093502 quic_data2.AddWrite(
3503 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
3504 packet_number++, false, GetNthClientInitiatedStreamId(0),
3505 quic::QUIC_STREAM_CANCELLED, 2, 2, 1, true));
Zhongyi Shic4823bd2018-04-27 00:49:193506 quic_data2.AddSocketDataToFactory(socket_factory_.get());
3507
3508 // Create request and QuicHttpStream.
3509 QuicStreamRequest request(factory_.get());
3510 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033511 request.Request(
3512 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3513 SocketTag(),
3514 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3515 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shic4823bd2018-04-27 00:49:193516 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3517 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3518 EXPECT_TRUE(stream.get());
3519
3520 // Cause QUIC stream to be created.
3521 HttpRequestInfo request_info;
3522 request_info.method = "GET";
3523 request_info.url = url_;
3524 request_info.traffic_annotation =
3525 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3526 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3527 net_log_, CompletionOnceCallback()));
3528
3529 // Ensure that session is alive and active.
3530 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3531 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3532 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3533
3534 // Send GET request on stream.
3535 HttpResponseInfo response;
3536 HttpRequestHeaders request_headers;
3537 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3538 callback_.callback()));
3539
Zhongyi Shi22fd5f52018-06-20 17:39:093540 if (async_write_before)
3541 session->SendPing();
3542
Zhongyi Shiaba4a832018-04-30 20:29:083543 // Cause the connection to report path degrading to the session.
3544 // Session will start to probe the alternate network.
3545 session->connection()->OnPathDegradingTimeout();
3546
3547 // Next connectivity probe is scheduled to be sent in 2 *
3548 // kDefaultRTTMilliSecs.
3549 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3550 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
3551 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3552 next_task_delay);
3553
3554 // The connection should still be alive, and not marked as going away.
3555 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3556 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3557 EXPECT_EQ(1u, session->GetNumActiveStreams());
3558 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
3559
3560 // Resume quic data and a connectivity probe response will be read on the new
3561 // socket.
3562 quic_data2.Resume();
3563
3564 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3565 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3566 EXPECT_EQ(1u, session->GetNumActiveStreams());
3567
3568 // There should be three pending tasks, the nearest one will complete
3569 // migration to the new network.
3570 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
3571 next_task_delay = task_runner->NextPendingTaskDelay();
3572 EXPECT_EQ(base::TimeDelta(), next_task_delay);
3573 task_runner->FastForwardBy(next_task_delay);
3574
3575 // Response headers are received over the new network.
3576 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3577 EXPECT_EQ(200, response.headers->response_code());
3578
3579 // Now there are two pending tasks, the nearest one was to send connectivity
3580 // probe and has been cancelled due to successful migration.
3581 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
3582 next_task_delay = task_runner->NextPendingTaskDelay();
3583 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3584 next_task_delay);
3585 task_runner->FastForwardBy(next_task_delay);
3586
3587 // There's one more task to mgirate back to the default network in 0.4s.
3588 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3589 next_task_delay = task_runner->NextPendingTaskDelay();
3590 base::TimeDelta expected_delay =
3591 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
3592 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
3593 EXPECT_EQ(expected_delay, next_task_delay);
3594
3595 // Deliver a signal that the alternate network now becomes default to session,
3596 // this will cancel mgirate back to default network timer.
3597 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3598 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
3599
3600 task_runner->FastForwardBy(next_task_delay);
3601 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
3602
3603 // Verify that the session is still alive.
3604 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3605 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3606
3607 stream.reset();
3608 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
3609 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
3610 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
3611 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
3612}
3613
Renjiea5722ccf2018-08-10 00:18:493614// This test verifies that the session marks itself GOAWAY on path degrading
3615// and it does not receive any new request
3616TEST_P(QuicStreamFactoryTest, GoawayOnPathDegrading) {
3617 go_away_on_path_degrading_ = true;
3618 Initialize();
3619 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3620 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3621 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3622
3623 MockQuicData quic_data1;
3624 quic::QuicStreamOffset header_stream_offset = 0;
3625 quic_data1.AddWrite(SYNCHRONOUS,
3626 ConstructInitialSettingsPacket(1, &header_stream_offset));
3627 quic_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
3628 2, GetNthClientInitiatedStreamId(0),
3629 true, true, &header_stream_offset));
3630 quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
3631 quic_data1.AddRead(
3632 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
3633 false, true));
3634 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
3635 quic_data1.AddSocketDataToFactory(socket_factory_.get());
3636
3637 MockQuicData quic_data2;
3638 quic::QuicStreamOffset header_stream_offset2 = 0;
3639 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
3640 quic_data2.AddWrite(
3641 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset2));
3642 quic_data2.AddSocketDataToFactory(socket_factory_.get());
3643
3644 // Creat request and QuicHttpStream.
3645 QuicStreamRequest request(factory_.get());
3646 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033647 request.Request(
3648 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3649 SocketTag(),
3650 /*cerf_verify_flags=*/0, url_, net_log_, &net_error_details_,
3651 failed_on_default_network_callback_, callback_.callback()));
Renjiea5722ccf2018-08-10 00:18:493652 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3653 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3654 EXPECT_TRUE(stream.get());
3655
3656 // Cause QUIC stream to be created.
3657 HttpRequestInfo request_info;
3658 request_info.method = "GET";
3659 request_info.url = url_;
3660 request_info.traffic_annotation =
3661 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3662 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3663 net_log_, CompletionOnceCallback()));
3664
3665 // Ensure that session is alive and active.
3666 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3667 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3668 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3669
3670 // Send GET request on stream.
3671 HttpResponseInfo response;
3672 HttpRequestHeaders request_headers;
3673 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3674 callback_.callback()));
3675
3676 // Trigger the connection to report path degrading to the session.
3677 // Session will mark itself GOAWAY.
3678 session->connection()->OnPathDegradingTimeout();
3679
3680 // The connection should still be alive, but marked as going away.
3681 EXPECT_FALSE(HasActiveSession(host_port_pair_));
3682 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3683 EXPECT_EQ(1u, session->GetNumActiveStreams());
3684
3685 // Second request should be sent on a new connection.
3686 QuicStreamRequest request2(factory_.get());
3687 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033688 request2.Request(
3689 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3690 SocketTag(),
3691 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3692 failed_on_default_network_callback_, callback_.callback()));
Renjiea5722ccf2018-08-10 00:18:493693 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3694 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
3695 EXPECT_TRUE(stream2.get());
3696
3697 // Resume the data, verify old request can read response on the old session
3698 // successfully.
3699 quic_data1.Resume();
3700 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
3701 EXPECT_EQ(200, response.headers->response_code());
3702 EXPECT_EQ(0U, session->GetNumActiveStreams());
3703
3704 // Check an active session exists for the destination.
3705 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3706 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3707 QuicChromiumClientSession* session2 = GetActiveSession(host_port_pair_);
3708 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
3709 EXPECT_NE(session, session2);
3710
3711 stream.reset();
3712 stream2.reset();
3713 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
3714 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
3715 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
3716 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
3717}
3718
Zhongyi Shibb770d92018-06-16 02:07:003719// This test verifies that the connection will not migrate to a bad socket
3720// when path degrading is detected.
3721TEST_P(QuicStreamFactoryTest, DoNotMigrateToBadSocketOnPathDegrading) {
3722 InitializeConnectionMigrationV2Test(
3723 {kDefaultNetworkForTests, kNewNetworkForTests});
3724 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3725 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3726 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3727
3728 // Using a testing task runner so that we can control time.
3729 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
3730 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
3731
3732 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3733 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
3734
3735 MockQuicData quic_data;
3736 quic::QuicStreamOffset header_stream_offset = 0;
3737 quic_data.AddWrite(SYNCHRONOUS,
3738 ConstructInitialSettingsPacket(1, &header_stream_offset));
3739 quic_data.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
3740 2, GetNthClientInitiatedStreamId(0), true,
3741 true, &header_stream_offset));
3742 quic_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
3743 quic_data.AddRead(
3744 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
3745 false, false));
3746 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3747 quic_data.AddWrite(SYNCHRONOUS,
3748 client_maker_.MakeAckAndRstPacket(
3749 3, false, GetNthClientInitiatedStreamId(0),
3750 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
3751 quic_data.AddSocketDataToFactory(socket_factory_.get());
3752
3753 // Set up second socket that will immediately return disconnected.
3754 // The stream factory will abort probe the alternate network.
3755 MockConnect bad_connect = MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED);
3756 SequencedSocketData socket_data(bad_connect, base::span<MockRead>(),
3757 base::span<MockWrite>());
3758 socket_factory_->AddSocketDataProvider(&socket_data);
3759
3760 // Create request and QuicHttpStream.
3761 QuicStreamRequest request(factory_.get());
3762 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033763 request.Request(
3764 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3765 SocketTag(),
3766 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3767 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shibb770d92018-06-16 02:07:003768 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3769 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3770 EXPECT_TRUE(stream.get());
3771
3772 // Cause QUIC stream to be created.
3773 HttpRequestInfo request_info;
3774 request_info.method = "GET";
3775 request_info.url = url_;
3776 request_info.traffic_annotation =
3777 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3778 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3779 net_log_, CompletionOnceCallback()));
3780
3781 // Ensure that session is alive and active.
3782 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3783 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3784 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3785
3786 // Send GET request on stream.
3787 HttpResponseInfo response;
3788 HttpRequestHeaders request_headers;
3789 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3790 callback_.callback()));
3791
3792 // Cause the connection to report path degrading to the session.
3793 // Session will start to probe the alternate network.
3794 session->connection()->OnPathDegradingTimeout();
3795
3796 // The connection should still be alive, and not marked as going away.
3797 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3798 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3799 EXPECT_EQ(1u, session->GetNumActiveStreams());
3800 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
3801
3802 // Resume the data, and response header is received over the original network.
3803 quic_data.Resume();
3804 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3805 EXPECT_EQ(200, response.headers->response_code());
3806
3807 // Verify there is no pending task as probing alternate network is halted.
3808 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
3809
3810 // Verify that the session is still alive.
3811 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3812 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3813
3814 stream.reset();
3815 EXPECT_TRUE(quic_data.AllReadDataConsumed());
3816 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
3817}
3818
Zhongyi Shif5cc30392018-05-30 18:25:153819// Regression test for http://crbug.com/847569.
3820// This test verifies that the connection migrates to the alternate network
3821// early when there is no active stream but a draining stream.
Zhongyi Shib3bc982c2018-07-10 19:59:243822// The first packet being written after migration is a synchrnous write, which
3823// will cause a PING packet being sent.
3824TEST_P(QuicStreamFactoryTest, MigrateSessionWithDrainingStreamSync) {
3825 TestMigrateSessionWithDrainingStream(SYNCHRONOUS);
3826}
3827
3828// Regression test for http://crbug.com/847569.
3829// This test verifies that the connection migrates to the alternate network
3830// early when there is no active stream but a draining stream.
3831// The first packet being written after migration is an asynchronous write, no
3832// PING packet will be sent.
3833TEST_P(QuicStreamFactoryTest, MigrateSessionWithDrainingStreamAsync) {
3834 TestMigrateSessionWithDrainingStream(ASYNC);
3835}
3836
3837void QuicStreamFactoryTestBase::TestMigrateSessionWithDrainingStream(
3838 IoMode write_mode_for_queued_packet) {
Zhongyi Shif5cc30392018-05-30 18:25:153839 InitializeConnectionMigrationV2Test(
3840 {kDefaultNetworkForTests, kNewNetworkForTests});
3841 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3842 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3843 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3844
3845 // Using a testing task runner so that we can control time.
3846 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
3847 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
3848
3849 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3850 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
3851
Zhongyi Shib3bc982c2018-07-10 19:59:243852 int packet_number = 1;
Zhongyi Shif5cc30392018-05-30 18:25:153853 MockQuicData quic_data1;
3854 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shib3bc982c2018-07-10 19:59:243855 quic_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket(
3856 packet_number++, &header_stream_offset));
3857 quic_data1.AddWrite(
3858 SYNCHRONOUS, ConstructGetRequestPacket(
3859 packet_number++, GetNthClientInitiatedStreamId(0), true,
3860 true, &header_stream_offset));
Zhongyi Shif5cc30392018-05-30 18:25:153861 // Read an out of order packet with FIN to drain the stream.
3862 quic_data1.AddRead(
3863 ASYNC, ConstructOkResponsePacket(2, GetNthClientInitiatedStreamId(0),
3864 false, true)); // keep sending version.
Zhongyi Shib3bc982c2018-07-10 19:59:243865 quic_data1.AddWrite(SYNCHRONOUS, client_maker_.MakeAckPacket(
3866 packet_number++, 2, 2, 2, 1, true));
Zhongyi Shif5cc30392018-05-30 18:25:153867 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3868 quic_data1.AddSocketDataToFactory(socket_factory_.get());
3869
3870 // Set up the second socket data provider that is used after migration.
3871 MockQuicData quic_data2;
3872 // Connectivity probe to be sent on the new path.
Zhongyi Shib3bc982c2018-07-10 19:59:243873 quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
Zhongyi Shi879659422018-08-02 17:58:253874 packet_number++, false));
Zhongyi Shif5cc30392018-05-30 18:25:153875 quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
3876 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:253877 quic_data2.AddRead(ASYNC,
3878 server_maker_.MakeConnectivityProbingPacket(3, false));
Zhongyi Shif5cc30392018-05-30 18:25:153879 // Ping packet to send after migration is completed.
Zhongyi Shib3bc982c2018-07-10 19:59:243880 quic_data2.AddWrite(
3881 write_mode_for_queued_packet,
3882 client_maker_.MakeAckPacket(packet_number++, 2, 3, 3, 1, true));
3883 if (write_mode_for_queued_packet == SYNCHRONOUS) {
3884 quic_data2.AddWrite(ASYNC,
3885 client_maker_.MakePingPacket(packet_number++, false));
3886 }
Zhongyi Shif5cc30392018-05-30 18:25:153887 quic_data2.AddRead(
3888 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
3889 false, false));
Zhongyi Shib3bc982c2018-07-10 19:59:243890 quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeAckPacket(
3891 packet_number++, 1, 3, 1, 1, true));
Zhongyi Shif5cc30392018-05-30 18:25:153892 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3893 quic_data2.AddSocketDataToFactory(socket_factory_.get());
3894
3895 // Create request and QuicHttpStream.
3896 QuicStreamRequest request(factory_.get());
3897 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033898 request.Request(
3899 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3900 SocketTag(),
3901 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3902 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shif5cc30392018-05-30 18:25:153903 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3904 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3905 EXPECT_TRUE(stream.get());
3906
3907 // Cause QUIC stream to be created.
3908 HttpRequestInfo request_info;
3909 request_info.method = "GET";
3910 request_info.url = url_;
3911 request_info.traffic_annotation =
3912 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3913 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3914 net_log_, CompletionOnceCallback()));
3915
3916 // Ensure that session is alive and active.
3917 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3918 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3919 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3920
3921 // Send GET request on stream.
3922 HttpResponseInfo response;
3923 HttpRequestHeaders request_headers;
3924 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3925 callback_.callback()));
3926
3927 // Run the message loop to receive the out of order packet which contains a
3928 // FIN and drains the stream.
3929 base::RunLoop().RunUntilIdle();
3930 EXPECT_EQ(0u, session->GetNumActiveStreams());
3931
3932 // Cause the connection to report path degrading to the session.
3933 // Session should still start to probe the alternate network.
3934 session->connection()->OnPathDegradingTimeout();
3935 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3936
3937 // Next connectivity probe is scheduled to be sent in 2 *
3938 // kDefaultRTTMilliSecs.
3939 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3940 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
3941 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3942 next_task_delay);
3943
3944 // The connection should still be alive, and not marked as going away.
3945 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shif5cc30392018-05-30 18:25:153946
3947 // Resume quic data and a connectivity probe response will be read on the new
3948 // socket.
3949 quic_data2.Resume();
3950
3951 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3952 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi0439ecc72018-07-11 04:41:263953 EXPECT_EQ(0u, session->GetNumActiveStreams());
3954 EXPECT_EQ(1u, session->GetNumDrainingStreams());
Zhongyi Shif5cc30392018-05-30 18:25:153955
3956 // There should be three pending tasks, the nearest one will complete
3957 // migration to the new network.
3958 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
3959 next_task_delay = task_runner->NextPendingTaskDelay();
3960 EXPECT_EQ(base::TimeDelta(), next_task_delay);
3961 task_runner->FastForwardBy(next_task_delay);
3962
3963 // Now there are two pending tasks, the nearest one was to send connectivity
3964 // probe and has been cancelled due to successful migration.
3965 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
3966 next_task_delay = task_runner->NextPendingTaskDelay();
3967 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3968 next_task_delay);
3969 task_runner->FastForwardBy(next_task_delay);
3970
3971 // There's one more task to mgirate back to the default network in 0.4s.
3972 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3973 next_task_delay = task_runner->NextPendingTaskDelay();
3974 base::TimeDelta expected_delay =
3975 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
3976 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
3977 EXPECT_EQ(expected_delay, next_task_delay);
3978
Zhongyi Shib3bc982c2018-07-10 19:59:243979 base::RunLoop().RunUntilIdle();
3980
Zhongyi Shif5cc30392018-05-30 18:25:153981 // Deliver a signal that the alternate network now becomes default to session,
3982 // this will cancel mgirate back to default network timer.
3983 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3984 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
3985
3986 task_runner->FastForwardBy(next_task_delay);
3987 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
3988
3989 // Verify that the session is still alive.
3990 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3991 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi0439ecc72018-07-11 04:41:263992 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
Zhongyi Shif5cc30392018-05-30 18:25:153993
3994 stream.reset();
3995 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
3996 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
3997 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
3998 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
3999}
4000
Zhongyi Shiaba4a832018-04-30 20:29:084001// Regression test for http://crbug.com/835444.
4002// This test verifies that the connection migrates to the alternate network
4003// when the alternate network is connected after path has been degrading.
4004TEST_P(QuicStreamFactoryTest, MigrateOnNewNetworkConnectAfterPathDegrading) {
4005 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
4006 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4007 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4008 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4009
4010 // Using a testing task runner so that we can control time.
4011 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4012 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4013
4014 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4015 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
4016
4017 MockQuicData quic_data1;
Ryan Hamilton8d9ee76e2018-05-29 23:52:524018 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shiaba4a832018-04-30 20:29:084019 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
4020 quic_data1.AddWrite(SYNCHRONOUS,
4021 ConstructInitialSettingsPacket(1, &header_stream_offset));
4022 quic_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
4023 2, GetNthClientInitiatedStreamId(0),
4024 true, true, &header_stream_offset));
4025 quic_data1.AddSocketDataToFactory(socket_factory_.get());
4026
4027 // Set up the second socket data provider that is used after migration.
4028 // The response to the earlier request is read on the new socket.
4029 MockQuicData quic_data2;
4030 // Connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:254031 quic_data2.AddWrite(SYNCHRONOUS,
4032 client_maker_.MakeConnectivityProbingPacket(3, true));
Zhongyi Shiaba4a832018-04-30 20:29:084033 quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
4034 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:254035 quic_data2.AddRead(ASYNC,
4036 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shiaba4a832018-04-30 20:29:084037 // Ping packet to send after migration is completed.
4038 quic_data2.AddWrite(ASYNC,
4039 client_maker_.MakeAckAndPingPacket(4, false, 1, 1, 1));
4040 quic_data2.AddRead(
4041 ASYNC, ConstructOkResponsePacket(2, GetNthClientInitiatedStreamId(0),
4042 false, false));
4043 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4044 quic_data2.AddWrite(SYNCHRONOUS,
4045 client_maker_.MakeAckAndRstPacket(
4046 5, false, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:524047 quic::QUIC_STREAM_CANCELLED, 2, 2, 1, true));
Zhongyi Shiaba4a832018-04-30 20:29:084048 quic_data2.AddSocketDataToFactory(socket_factory_.get());
4049
4050 // Create request and QuicHttpStream.
4051 QuicStreamRequest request(factory_.get());
4052 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034053 request.Request(
4054 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4055 SocketTag(),
4056 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4057 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shiaba4a832018-04-30 20:29:084058 EXPECT_THAT(callback_.WaitForResult(), IsOk());
4059 std::unique_ptr<HttpStream> stream = CreateStream(&request);
4060 EXPECT_TRUE(stream.get());
4061
4062 // Cause QUIC stream to be created.
4063 HttpRequestInfo request_info;
4064 request_info.method = "GET";
4065 request_info.url = url_;
4066 request_info.traffic_annotation =
4067 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
4068 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
4069 net_log_, CompletionOnceCallback()));
4070
4071 // Ensure that session is alive and active.
4072 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4073 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4074 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4075
4076 // Send GET request on stream.
4077 HttpResponseInfo response;
4078 HttpRequestHeaders request_headers;
4079 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
4080 callback_.callback()));
4081
4082 // Cause the connection to report path degrading to the session.
4083 // Due to lack of alternate network, session will not mgirate connection.
4084 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4085 session->connection()->OnPathDegradingTimeout();
4086 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4087
4088 // Deliver a signal that a alternate network is connected now, this should
4089 // cause the connection to start early migration on path degrading.
4090 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4091 ->SetConnectedNetworksList(
4092 {kDefaultNetworkForTests, kNewNetworkForTests});
4093 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4094 ->NotifyNetworkConnected(kNewNetworkForTests);
Zhongyi Shic4823bd2018-04-27 00:49:194095
4096 // Next connectivity probe is scheduled to be sent in 2 *
4097 // kDefaultRTTMilliSecs.
4098 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4099 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
4100 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
4101 next_task_delay);
4102
4103 // The connection should still be alive, and not marked as going away.
4104 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4105 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4106 EXPECT_EQ(1u, session->GetNumActiveStreams());
4107 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
4108
4109 // Resume quic data and a connectivity probe response will be read on the new
4110 // socket.
4111 quic_data2.Resume();
4112
4113 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4114 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4115 EXPECT_EQ(1u, session->GetNumActiveStreams());
4116
4117 // There should be three pending tasks, the nearest one will complete
4118 // migration to the new network.
4119 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
4120 next_task_delay = task_runner->NextPendingTaskDelay();
4121 EXPECT_EQ(base::TimeDelta(), next_task_delay);
4122 task_runner->FastForwardBy(next_task_delay);
4123
4124 // Response headers are received over the new network.
4125 EXPECT_THAT(callback_.WaitForResult(), IsOk());
4126 EXPECT_EQ(200, response.headers->response_code());
4127
4128 // Now there are two pending tasks, the nearest one was to send connectivity
4129 // probe and has been cancelled due to successful migration.
4130 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
4131 next_task_delay = task_runner->NextPendingTaskDelay();
4132 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
4133 next_task_delay);
4134 task_runner->FastForwardBy(next_task_delay);
4135
4136 // There's one more task to mgirate back to the default network in 0.4s.
4137 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4138 next_task_delay = task_runner->NextPendingTaskDelay();
4139 base::TimeDelta expected_delay =
4140 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
4141 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
4142 EXPECT_EQ(expected_delay, next_task_delay);
4143
4144 // Deliver a signal that the alternate network now becomes default to session,
4145 // this will cancel mgirate back to default network timer.
4146 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4147 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
4148
4149 task_runner->FastForwardBy(next_task_delay);
4150 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4151
4152 // Verify that the session is still alive.
4153 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4154 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4155
4156 stream.reset();
4157 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
4158 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
4159 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
4160 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
4161}
4162
Zhongyi Shi28f6e352018-06-20 21:15:434163// This test verifies that multiple sessions are migrated on connection
4164// migration signal.
jrie3d187c2016-09-16 14:29:174165TEST_P(QuicStreamFactoryTest,
Zhongyi Shi28f6e352018-06-20 21:15:434166 MigrateMultipleSessionsToBadSocketsAfterDisconnected) {
4167 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jrie3d187c2016-09-16 14:29:174168
4169 MockQuicData socket_data1;
4170 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:434171 socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
jrie3d187c2016-09-16 14:29:174172 socket_data1.AddWrite(ASYNC, OK);
Zhongyi Shi5f587cc2017-11-21 23:24:174173 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jrie3d187c2016-09-16 14:29:174174 MockQuicData socket_data2;
4175 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:434176 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
jrie3d187c2016-09-16 14:29:174177 socket_data2.AddWrite(ASYNC, OK);
Zhongyi Shi5f587cc2017-11-21 23:24:174178 socket_data2.AddSocketDataToFactory(socket_factory_.get());
jrie3d187c2016-09-16 14:29:174179
4180 HostPortPair server1(kDefaultServerHostName, 443);
4181 HostPortPair server2(kServer2HostName, 443);
4182
4183 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4184 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4185 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4186
Renjiea0cb4a2c2018-09-26 23:37:304187 host_resolver_->set_synchronous_mode(true);
4188 host_resolver_->rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
4189 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.2", "");
jrie3d187c2016-09-16 14:29:174190
4191 // Create request and QuicHttpStream to create session1.
zhongyi98d6a9262017-05-19 02:47:454192 QuicStreamRequest request1(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:034193 EXPECT_EQ(OK,
4194 request1.Request(
4195 server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
4196 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4197 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:244198 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
jrie3d187c2016-09-16 14:29:174199 EXPECT_TRUE(stream1.get());
4200
4201 // Create request and QuicHttpStream to create session2.
zhongyi98d6a9262017-05-19 02:47:454202 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:034203 EXPECT_EQ(OK,
4204 request2.Request(
4205 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
4206 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
4207 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:244208 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
jrie3d187c2016-09-16 14:29:174209 EXPECT_TRUE(stream2.get());
4210
4211 QuicChromiumClientSession* session1 = GetActiveSession(server1);
4212 QuicChromiumClientSession* session2 = GetActiveSession(server2);
4213 EXPECT_NE(session1, session2);
4214
4215 // Cause QUIC stream to be created and send GET so session1 has an open
4216 // stream.
4217 HttpRequestInfo request_info1;
4218 request_info1.method = "GET";
4219 request_info1.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:394220 request_info1.traffic_annotation =
4221 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:274222 EXPECT_EQ(OK,
4223 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:394224 net_log_, CompletionOnceCallback()));
jrie3d187c2016-09-16 14:29:174225 HttpResponseInfo response1;
4226 HttpRequestHeaders request_headers1;
4227 EXPECT_EQ(OK, stream1->SendRequest(request_headers1, &response1,
4228 callback_.callback()));
4229
4230 // Cause QUIC stream to be created and send GET so session2 has an open
4231 // stream.
4232 HttpRequestInfo request_info2;
4233 request_info2.method = "GET";
4234 request_info2.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:394235 request_info2.traffic_annotation =
4236 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:274237 EXPECT_EQ(OK,
4238 stream2->InitializeStream(&request_info2, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:394239 net_log_, CompletionOnceCallback()));
jrie3d187c2016-09-16 14:29:174240 HttpResponseInfo response2;
4241 HttpRequestHeaders request_headers2;
4242 EXPECT_EQ(OK, stream2->SendRequest(request_headers2, &response2,
4243 callback_.callback()));
4244
4245 // Cause both sessions to be paused due to DISCONNECTED.
4246 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4247 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
4248
4249 // Ensure that both sessions are paused but alive.
4250 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session1));
4251 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
4252
Zhongyi Shi28f6e352018-06-20 21:15:434253 // Add new sockets to use post migration. Those are bad sockets and will cause
4254 // migration to fail.
jrie3d187c2016-09-16 14:29:174255 MockConnect connect_result =
4256 MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED);
Ryan Sleevib8d7ea02018-05-07 20:01:014257 SequencedSocketData socket_data3(connect_result, base::span<MockRead>(),
4258 base::span<MockWrite>());
Zhongyi Shi5f587cc2017-11-21 23:24:174259 socket_factory_->AddSocketDataProvider(&socket_data3);
Ryan Sleevib8d7ea02018-05-07 20:01:014260 SequencedSocketData socket_data4(connect_result, base::span<MockRead>(),
4261 base::span<MockWrite>());
Zhongyi Shi5f587cc2017-11-21 23:24:174262 socket_factory_->AddSocketDataProvider(&socket_data4);
jrie3d187c2016-09-16 14:29:174263
Zhongyi Shi28f6e352018-06-20 21:15:434264 // Connect the new network and cause migration to bad sockets, causing
4265 // sessions to close.
jrie3d187c2016-09-16 14:29:174266 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4267 ->SetConnectedNetworksList({kNewNetworkForTests});
4268 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4269 ->NotifyNetworkConnected(kNewNetworkForTests);
4270
4271 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session1));
4272 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
4273
4274 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
4275 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
4276 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
4277 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
4278}
4279
Zhongyi Shi6ec9b36e2018-06-20 20:32:544280// This test verifies that session attempts connection migration with signals
4281// delivered in the following order (no alternate network is available):
4282// - path degrading is detected: session attempts connection migration but no
4283// alternate network is available, session caches path degrading signal in
4284// connection and stays on the original network.
4285// - original network backs up, request is served in the orignal network,
4286// session is not marked as going away.
4287TEST_P(QuicStreamFactoryTest, MigrateOnPathDegradingWithNoNewNetwork) {
4288 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jrid36ada62016-02-06 02:42:084289 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4290 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4291
Zhongyi Shi6ec9b36e2018-06-20 20:32:544292 MockQuicData quic_data;
4293 quic::QuicStreamOffset header_stream_offset = 0;
4294 quic_data.AddWrite(SYNCHRONOUS,
4295 ConstructInitialSettingsPacket(1, &header_stream_offset));
4296 quic_data.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
4297 2, GetNthClientInitiatedStreamId(0), true,
4298 true, &header_stream_offset));
4299 quic_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause for path degrading signal.
4300
4301 // The rest of the data will still flow in the original socket as there is no
4302 // new network after path degrading.
4303 quic_data.AddRead(
4304 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
4305 false, false));
4306 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4307 quic_data.AddWrite(SYNCHRONOUS,
4308 client_maker_.MakeAckAndRstPacket(
4309 3, false, GetNthClientInitiatedStreamId(0),
4310 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
4311 quic_data.AddSocketDataToFactory(socket_factory_.get());
jrid36ada62016-02-06 02:42:084312
4313 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:454314 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:334315 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034316 request.Request(
4317 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4318 SocketTag(),
4319 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4320 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:014321 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:244322 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jrid36ada62016-02-06 02:42:084323 EXPECT_TRUE(stream.get());
4324
4325 // Cause QUIC stream to be created.
4326 HttpRequestInfo request_info;
Zhongyi Shi6ec9b36e2018-06-20 20:32:544327 request_info.method = "GET";
4328 request_info.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:394329 request_info.traffic_annotation =
4330 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Zhongyi Shi6ec9b36e2018-06-20 20:32:544331 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:394332 net_log_, CompletionOnceCallback()));
jrid36ada62016-02-06 02:42:084333
4334 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:504335 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jrid36ada62016-02-06 02:42:084336 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4337 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4338
Zhongyi Shi6ec9b36e2018-06-20 20:32:544339 // Send GET request on stream.
4340 HttpResponseInfo response;
4341 HttpRequestHeaders request_headers;
4342 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
4343 callback_.callback()));
jrid36ada62016-02-06 02:42:084344
Zhongyi Shi6ec9b36e2018-06-20 20:32:544345 // Trigger connection migration on path degrading. Since there are no networks
4346 // to migrate to, the session will remain on the original network, not marked
4347 // as going away.
4348 session->connection()->OnPathDegradingTimeout();
4349 EXPECT_TRUE(session->connection()->IsPathDegrading());
4350
4351 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4352 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4353 EXPECT_EQ(1u, session->GetNumActiveStreams());
4354 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
4355
4356 // Resume so that rest of the data will flow in the original socket.
4357 quic_data.Resume();
jrid36ada62016-02-06 02:42:084358
4359 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4360 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4361 EXPECT_EQ(1u, session->GetNumActiveStreams());
4362
4363 stream.reset();
Zhongyi Shi6ec9b36e2018-06-20 20:32:544364 EXPECT_TRUE(quic_data.AllReadDataConsumed());
4365 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
jrid36ada62016-02-06 02:42:084366}
4367
Zhongyi Shi21e99532018-07-17 22:23:074368// This test verifies that session with non-migratable stream will probe the
4369// alternate network on path degrading, and close the non-migratable streams
4370// when probe is successful.
jri231c2972016-03-08 19:50:114371TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyNonMigratableStream) {
Zhongyi Shi1a054612018-06-14 04:59:084372 InitializeConnectionMigrationV2Test(
jri231c2972016-03-08 19:50:114373 {kDefaultNetworkForTests, kNewNetworkForTests});
4374 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4375 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4376
rcha00569732016-08-27 11:09:364377 MockQuicData socket_data;
4378 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:434379 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Renjieba55fae2018-09-20 03:05:164380 socket_data.AddWrite(
4381 SYNCHRONOUS,
4382 client_maker_.MakeRstAckAndConnectionClosePacket(
4383 3, false, 5, quic::QUIC_STREAM_CANCELLED,
4384 quic::QuicTime::Delta::FromMilliseconds(0), 1, 1, 1,
4385 quic::QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS, "net error"));
Zhongyi Shi5f587cc2017-11-21 23:24:174386 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri231c2972016-03-08 19:50:114387
Zhongyi Shi21e99532018-07-17 22:23:074388 // Set up the second socket data provider that is used for probing.
4389 MockQuicData quic_data1;
4390 // Connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:254391 quic_data1.AddWrite(SYNCHRONOUS,
4392 client_maker_.MakeConnectivityProbingPacket(2, true));
Zhongyi Shi21e99532018-07-17 22:23:074393 quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
4394 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:254395 quic_data1.AddRead(ASYNC,
4396 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shi21e99532018-07-17 22:23:074397 quic_data1.AddSocketDataToFactory(socket_factory_.get());
4398
jri231c2972016-03-08 19:50:114399 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:454400 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:334401 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034402 request.Request(
4403 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4404 SocketTag(),
4405 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4406 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:014407 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:244408 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri231c2972016-03-08 19:50:114409 EXPECT_TRUE(stream.get());
4410
4411 // Cause QUIC stream to be created, but marked as non-migratable.
4412 HttpRequestInfo request_info;
Zhongyi Shibb28b1f2018-07-18 02:41:264413 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
Ramin Halavati683bcaa92018-02-14 08:42:394414 request_info.traffic_annotation =
4415 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:274416 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:394417 net_log_, CompletionOnceCallback()));
jri231c2972016-03-08 19:50:114418
4419 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:504420 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:114421 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4422 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4423
4424 // Trigger connection migration. Since there is a non-migratable stream,
4425 // this should cause session to be continue without migrating.
4426 session->OnPathDegrading();
4427
4428 // Run the message loop so that data queued in the new socket is read by the
4429 // packet reader.
4430 base::RunLoop().RunUntilIdle();
4431
4432 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4433 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4434 EXPECT_EQ(1u, session->GetNumActiveStreams());
4435
Zhongyi Shi21e99532018-07-17 22:23:074436 // Resume the data to read the connectivity probing response to declare probe
4437 // as successful. Non-migratable streams will be closed.
4438 quic_data1.Resume();
4439 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4440 EXPECT_FALSE(HasActiveSession(host_port_pair_));
4441 EXPECT_EQ(0u, session->GetNumActiveStreams());
jri231c2972016-03-08 19:50:114442
Zhongyi Shi21e99532018-07-17 22:23:074443 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
4444 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
jri231c2972016-03-08 19:50:114445 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4446 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4447}
4448
jri9c541572016-03-29 17:51:484449TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyConnectionMigrationDisabled) {
Zhongyi Shi1a054612018-06-14 04:59:084450 InitializeConnectionMigrationV2Test(
jri9c541572016-03-29 17:51:484451 {kDefaultNetworkForTests, kNewNetworkForTests});
4452 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4453 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4454
rcha00569732016-08-27 11:09:364455 MockQuicData socket_data;
4456 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:434457 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
4458 socket_data.AddWrite(
4459 SYNCHRONOUS,
4460 client_maker_.MakeRstPacket(2, true, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:524461 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:174462 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9c541572016-03-29 17:51:484463
4464 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:454465 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:334466 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034467 request.Request(
4468 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4469 SocketTag(),
4470 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4471 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:014472 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:244473 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9c541572016-03-29 17:51:484474 EXPECT_TRUE(stream.get());
4475
4476 // Cause QUIC stream to be created.
4477 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:394478 request_info.traffic_annotation =
4479 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:274480 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:394481 net_log_, CompletionOnceCallback()));
jri9c541572016-03-29 17:51:484482
4483 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:504484 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:484485 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4486 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4487
4488 // Set session config to have connection migration disabled.
Ryan Hamilton8d9ee76e2018-05-29 23:52:524489 quic::test::QuicConfigPeer::SetReceivedDisableConnectionMigration(
4490 session->config());
jri9c541572016-03-29 17:51:484491 EXPECT_TRUE(session->config()->DisableConnectionMigration());
4492
4493 // Trigger connection migration. Since there is a non-migratable stream,
4494 // this should cause session to be continue without migrating.
4495 session->OnPathDegrading();
4496
4497 // Run the message loop so that data queued in the new socket is read by the
4498 // packet reader.
4499 base::RunLoop().RunUntilIdle();
4500
4501 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4502 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4503 EXPECT_EQ(1u, session->GetNumActiveStreams());
4504
4505 stream.reset();
4506
4507 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4508 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4509}
4510
Zhongyi Shi3c4c9e92018-07-02 23:16:234511// Regression test for http://crbug.com/791886.
4512// This test verifies that the old packet writer which encountered an
4513// asynchronous write error will be blocked during migration on write error. New
4514// packets would not be written until the one with write error is rewritten on
4515// the new network.
4516TEST_P(QuicStreamFactoryTest, MigrateSessionOnAysncWriteError) {
4517 InitializeConnectionMigrationV2Test(
4518 {kDefaultNetworkForTests, kNewNetworkForTests});
4519 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4520 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4521 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4522
4523 // Using a testing task runner so that we can control time.
4524 // base::RunLoop() controls mocked socket writes and reads.
4525 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4526 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4527
4528 MockQuicData socket_data;
4529 quic::QuicStreamOffset header_stream_offset = 0;
4530 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4531 socket_data.AddWrite(
4532 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
4533 socket_data.AddWrite(ASYNC, ERR_ADDRESS_UNREACHABLE);
4534 socket_data.AddSocketDataToFactory(socket_factory_.get());
4535
4536 // Set up second socket data provider that is used after
4537 // migration. The request is rewritten to this new socket, and the
4538 // response to the request is read on this new socket.
4539 MockQuicData socket_data1;
4540 socket_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
4541 2, GetNthClientInitiatedStreamId(0),
4542 true, true, &header_stream_offset));
4543 socket_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
4544 3, GetNthClientInitiatedStreamId(1),
4545 GetNthClientInitiatedStreamId(0), true,
4546 true, &header_stream_offset));
4547 socket_data1.AddRead(
4548 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
4549 false, false));
4550 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4551 socket_data1.AddWrite(SYNCHRONOUS,
4552 client_maker_.MakeAckAndRstPacket(
4553 4, false, GetNthClientInitiatedStreamId(0),
4554 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
4555 socket_data1.AddWrite(
4556 SYNCHRONOUS,
4557 client_maker_.MakeRstPacket(5, false, GetNthClientInitiatedStreamId(1),
4558 quic::QUIC_STREAM_CANCELLED, 0));
4559
4560 socket_data1.AddSocketDataToFactory(socket_factory_.get());
4561
4562 // Create request #1 and QuicHttpStream.
4563 QuicStreamRequest request1(factory_.get());
4564 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034565 request1.Request(
4566 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4567 SocketTag(),
4568 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4569 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi3c4c9e92018-07-02 23:16:234570 EXPECT_THAT(callback_.WaitForResult(), IsOk());
4571 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
4572 EXPECT_TRUE(stream1.get());
4573
4574 HttpRequestInfo request_info1;
4575 request_info1.method = "GET";
4576 request_info1.url = GURL("https://www.example.org/");
4577 request_info1.traffic_annotation =
4578 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
4579 EXPECT_EQ(OK,
4580 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
4581 net_log_, CompletionOnceCallback()));
4582
4583 // Request #2 returns synchronously because it pools to existing session.
4584 TestCompletionCallback callback2;
4585 QuicStreamRequest request2(factory_.get());
4586 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
4587 DEFAULT_PRIORITY, SocketTag(),
4588 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:034589 &net_error_details_,
4590 failed_on_default_network_callback_,
4591 callback2.callback()));
Zhongyi Shi3c4c9e92018-07-02 23:16:234592 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
4593 EXPECT_TRUE(stream2.get());
4594
4595 HttpRequestInfo request_info2;
4596 request_info2.method = "GET";
4597 request_info2.url = GURL("https://www.example.org/");
4598 request_info2.traffic_annotation =
4599 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
4600 EXPECT_EQ(OK,
4601 stream2->InitializeStream(&request_info2, true, DEFAULT_PRIORITY,
4602 net_log_, CompletionOnceCallback()));
4603
4604 // Ensure that session is alive and active.
4605 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4606 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4607 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4608 EXPECT_EQ(2u, session->GetNumActiveStreams());
4609
4610 // Send GET request on stream1. This should cause an async write error.
4611 HttpResponseInfo response;
4612 HttpRequestHeaders request_headers;
4613 EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
4614 callback_.callback()));
4615 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4616
4617 // Run the message loop so that asynchronous write completes and a connection
4618 // migration on write error attempt is posted in QuicStreamFactory's task
4619 // runner.
4620 base::RunLoop().RunUntilIdle();
4621 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4622
4623 // Send GET request on stream. This will cause another write attempt before
4624 // migration on write error is exectued.
4625 HttpResponseInfo response2;
4626 HttpRequestHeaders request_headers2;
4627 EXPECT_EQ(OK, stream2->SendRequest(request_headers2, &response2,
4628 callback2.callback()));
4629
4630 // Run the task runner so that migration on write error is finally executed.
4631 task_runner->RunUntilIdle();
4632
Zhongyi Shia7dd46b2018-07-12 22:59:294633 // Verify the session is still alive and not marked as going away.
Zhongyi Shi3c4c9e92018-07-02 23:16:234634 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:294635 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi3c4c9e92018-07-02 23:16:234636 EXPECT_EQ(2u, session->GetNumActiveStreams());
Zhongyi Shia7dd46b2018-07-12 22:59:294637 // There should be one task posted to migrate back to the default network in
4638 // kMinRetryTimeForDefaultNetworkSecs.
4639 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4640 EXPECT_EQ(base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs),
4641 task_runner->NextPendingTaskDelay());
Zhongyi Shi3c4c9e92018-07-02 23:16:234642
4643 // Verify that response headers on the migrated socket were delivered to the
4644 // stream.
4645 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
4646 EXPECT_EQ(200, response.headers->response_code());
4647
4648 stream1.reset();
4649 stream2.reset();
4650
4651 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4652 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4653 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
4654 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
4655}
4656
Zhongyi Shia7dd46b2018-07-12 22:59:294657// Verify session is not marked as going away after connection migration on
4658// write error and migrate back to default network logic is applied to bring the
4659// migrated session back to the default network. Migration singals delivered
4660// in the following order (alternate network is always availabe):
4661// - session on the default network encountered a write error;
4662// - session successfully migrated to the non-default network;
4663// - session attempts to migrate back to default network post migration;
4664// - migration back to the default network is successful.
4665TEST_P(QuicStreamFactoryTest, MigrateBackToDefaultPostMigrationOnWriteError) {
4666 InitializeConnectionMigrationV2Test(
4667 {kDefaultNetworkForTests, kNewNetworkForTests});
4668 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4669 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4670 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4671
4672 // Using a testing task runner so that we can control time.
4673 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4674 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4675
4676 MockQuicData socket_data;
4677 quic::QuicStreamOffset header_stream_offset = 0;
4678 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4679 socket_data.AddWrite(
4680 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
4681 socket_data.AddWrite(ASYNC, ERR_ADDRESS_UNREACHABLE);
4682 socket_data.AddSocketDataToFactory(socket_factory_.get());
4683
4684 // Set up second socket data provider that is used after
4685 // migration. The request is rewritten to this new socket, and the
4686 // response to the request is read on this new socket.
4687 MockQuicData quic_data2;
4688 quic_data2.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
4689 2, GetNthClientInitiatedStreamId(0),
4690 true, true, &header_stream_offset));
4691 quic_data2.AddRead(
4692 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
4693 false, false));
4694 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4695 quic_data2.AddSocketDataToFactory(socket_factory_.get());
4696
4697 // Create request QuicHttpStream.
4698 QuicStreamRequest request1(factory_.get());
4699 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034700 request1.Request(
4701 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4702 SocketTag(),
4703 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4704 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shia7dd46b2018-07-12 22:59:294705 EXPECT_THAT(callback_.WaitForResult(), IsOk());
4706 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
4707 EXPECT_TRUE(stream1.get());
4708
4709 HttpRequestInfo request_info1;
4710 request_info1.method = "GET";
4711 request_info1.url = GURL("https://www.example.org/");
4712 request_info1.traffic_annotation =
4713 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
4714 EXPECT_EQ(OK,
4715 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
4716 net_log_, CompletionOnceCallback()));
4717
4718 // Ensure that session is alive and active.
4719 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4720 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4721 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4722 EXPECT_EQ(1u, session->GetNumActiveStreams());
4723
4724 // Send GET request. This should cause an async write error.
4725 HttpResponseInfo response;
4726 HttpRequestHeaders request_headers;
4727 EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
4728 callback_.callback()));
4729 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4730
4731 // Run the message loop so that asynchronous write completes and a connection
4732 // migration on write error attempt is posted in QuicStreamFactory's task
4733 // runner.
4734 base::RunLoop().RunUntilIdle();
4735 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4736
4737 // Run the task runner so that migration on write error is finally executed.
4738 task_runner->RunUntilIdle();
4739
4740 // Verify the session is still alive and not marked as going away.
4741 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4742 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4743 EXPECT_EQ(1u, session->GetNumActiveStreams());
4744 // There should be one task posted to migrate back to the default network in
4745 // kMinRetryTimeForDefaultNetworkSecs.
4746 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4747 base::TimeDelta expected_delay =
4748 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs);
4749 EXPECT_EQ(expected_delay, task_runner->NextPendingTaskDelay());
4750
4751 // Verify that response headers on the migrated socket were delivered to the
4752 // stream.
4753 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
4754 EXPECT_EQ(200, response.headers->response_code());
4755
4756 // Set up the third socket data provider for migrate back to default network.
4757 MockQuicData quic_data3;
4758 // Connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:254759 quic_data3.AddWrite(SYNCHRONOUS,
4760 client_maker_.MakeConnectivityProbingPacket(3, false));
Zhongyi Shia7dd46b2018-07-12 22:59:294761 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:254762 quic_data3.AddRead(ASYNC,
4763 server_maker_.MakeConnectivityProbingPacket(2, false));
Zhongyi Shia7dd46b2018-07-12 22:59:294764 quic_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4765 quic_data3.AddWrite(ASYNC, client_maker_.MakeAckPacket(4, 1, 2, 1, 1, true));
4766 quic_data3.AddWrite(
4767 SYNCHRONOUS,
4768 client_maker_.MakeRstPacket(5, false, GetNthClientInitiatedStreamId(0),
4769 quic::QUIC_STREAM_CANCELLED, 0));
4770 quic_data3.AddSocketDataToFactory(socket_factory_.get());
4771
4772 // Fast forward to fire the migrate back timer and verify the session
4773 // successfully migrates back to the default network.
4774 task_runner->FastForwardBy(expected_delay);
4775
4776 // Verify the session is still alive and not marked as going away.
4777 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4778 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4779 EXPECT_EQ(1u, session->GetNumActiveStreams());
4780
4781 // There should be one task posted to one will resend a connectivity probe and
4782 // the other will retry migrate back, both are cancelled.
4783 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
4784 task_runner->FastForwardBy(
4785 base::TimeDelta::FromSeconds(2 * kMinRetryTimeForDefaultNetworkSecs));
4786 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4787
4788 stream1.reset();
4789 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4790 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4791 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
4792 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
4793 EXPECT_TRUE(quic_data3.AllReadDataConsumed());
4794 EXPECT_TRUE(quic_data3.AllWriteDataConsumed());
4795}
4796
Zhongyi Shic1449372018-08-09 09:58:584797// This test verifies that the connection will not attempt connection migration
4798// (send connectivity probes on alternate path) when path degrading is detected
4799// and handshake is not confirmed.
4800TEST_P(QuicStreamFactoryTest,
4801 NoMigrationOnPathDegradingBeforeHandshakeConfirmed) {
4802 InitializeConnectionMigrationV2Test(
4803 {kDefaultNetworkForTests, kNewNetworkForTests});
4804
4805 // Using a testing task runner.
4806 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4807 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4808
4809 // Use cold start mode to send crypto message for handshake.
4810 crypto_client_stream_factory_.set_handshake_mode(
4811 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
4812
4813 MockQuicData socket_data;
4814 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4815 socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
4816 socket_data.AddSocketDataToFactory(socket_factory_.get());
4817
4818 // Create request and QuicHttpStream.
4819 QuicStreamRequest request(factory_.get());
4820 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034821 request.Request(
4822 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4823 SocketTag(),
4824 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4825 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shic1449372018-08-09 09:58:584826
4827 base::RunLoop().RunUntilIdle();
4828
4829 // Ensure that session is alive but not active.
4830 EXPECT_FALSE(HasActiveSession(host_port_pair_));
4831 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
4832 QuicChromiumClientSession* session = GetPendingSession(host_port_pair_);
4833 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4834 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4835
4836 // Cause the connection to report path degrading to the session.
4837 // Session will ignore the signal as handshake is not completed.
4838 session->connection()->OnPathDegradingTimeout();
4839 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4840
4841 EXPECT_FALSE(HasActiveSession(host_port_pair_));
Zhongyi Shi8de43832018-08-15 23:40:004842 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
Zhongyi Shic1449372018-08-09 09:58:584843 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4844 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4845}
4846
Zhongyi Shi634c1882018-08-16 04:05:594847// This test verifies that if a connection is closed with
4848// QUIC_NETWORK_IDLE_TIMEOUT before handshake is completed and there is no
4849// alternate network, no new connection will be created.
4850TEST_P(QuicStreamFactoryTest, NoAlternateNetworkBeforeHandshakeOnIdleTimeout) {
4851 TestNoAlternateNetworkBeforeHandshake(quic::QUIC_NETWORK_IDLE_TIMEOUT);
4852}
4853
4854// This test verifies that if a connection is closed with QUIC_HANDSHAKE_TIMEOUT
4855// and there is no alternate network, no new connection will be created.
4856TEST_P(QuicStreamFactoryTest, NoAlternateNetworkOnHandshakeTimeout) {
4857 TestNoAlternateNetworkBeforeHandshake(quic::QUIC_HANDSHAKE_TIMEOUT);
4858}
4859
4860void QuicStreamFactoryTestBase::TestNoAlternateNetworkBeforeHandshake(
4861 quic::QuicErrorCode quic_error) {
4862 DCHECK(quic_error == quic::QUIC_NETWORK_IDLE_TIMEOUT ||
4863 quic_error == quic::QUIC_HANDSHAKE_TIMEOUT);
4864 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
4865
4866 // Using a testing task runner.
4867 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4868 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4869
4870 // Use cold start mode to send crypto message for handshake.
4871 crypto_client_stream_factory_.set_handshake_mode(
4872 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
4873
4874 MockQuicData socket_data;
4875 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4876 socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
4877 socket_data.AddSocketDataToFactory(socket_factory_.get());
4878
4879 // Create request.
4880 QuicStreamRequest request(factory_.get());
4881 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034882 request.Request(
4883 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4884 SocketTag(),
4885 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4886 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi634c1882018-08-16 04:05:594887
4888 base::RunLoop().RunUntilIdle();
4889
4890 // Ensure that session is alive but not active.
4891 EXPECT_FALSE(HasActiveSession(host_port_pair_));
4892 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
4893 QuicChromiumClientSession* session = GetPendingSession(host_port_pair_);
4894 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4895 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4896
4897 // Cause the connection to report path degrading to the session.
4898 // Session will ignore the signal as handshake is not completed.
4899 session->connection()->OnPathDegradingTimeout();
4900 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4901 EXPECT_FALSE(HasActiveSession(host_port_pair_));
4902 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
4903
4904 // Cause the connection to close due to |quic_error| before handshake.
4905 quic::QuicString error_details;
4906 if (quic_error == quic::QUIC_NETWORK_IDLE_TIMEOUT) {
4907 error_details = "No recent network activity.";
4908 } else {
4909 error_details = "Handshake timeout expired.";
4910 }
4911 session->connection()->CloseConnection(
4912 quic_error, error_details, quic::ConnectionCloseBehavior::SILENT_CLOSE);
4913
4914 // A task will be posted to clean up the session in the factory.
4915 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4916 task_runner->FastForwardUntilNoTasksRemain();
4917
4918 // No new session should be created as there is no alternate network.
4919 EXPECT_FALSE(HasActiveSession(host_port_pair_));
4920 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
4921 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4922 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4923}
4924
Zhongyi Shi8de43832018-08-15 23:40:004925TEST_P(QuicStreamFactoryTest, NewConnectionBeforeHandshakeAfterIdleTimeout) {
4926 TestNewConnectionOnAlternateNetworkBeforeHandshake(
4927 quic::QUIC_NETWORK_IDLE_TIMEOUT);
4928}
4929
4930TEST_P(QuicStreamFactoryTest, NewConnectionAfterHandshakeTimeout) {
4931 TestNewConnectionOnAlternateNetworkBeforeHandshake(
4932 quic::QUIC_HANDSHAKE_TIMEOUT);
4933}
4934
Zhongyi Shif3fcbbe62018-08-16 22:52:084935// Sets up a test to verify that a new connection will be created on the
4936// alternate network after the initial connection fails before handshake with
4937// signals delivered in the following order (alternate network is available):
4938// - the default network is not able to complete crypto handshake;
4939// - the original connection is closed with |quic_error|;
4940// - a new connection is created on the alternate network and is able to finish
4941// crypto handshake;
4942// - the new session on the alternate network attempts to migrate back to the
4943// default network by sending probes;
4944// - default network being disconnected is delivered: session will stop probing
4945// the original network.
4946// - alternate network is made by default.
Zhongyi Shi8de43832018-08-15 23:40:004947void QuicStreamFactoryTestBase::
4948 TestNewConnectionOnAlternateNetworkBeforeHandshake(
4949 quic::QuicErrorCode quic_error) {
4950 DCHECK(quic_error == quic::QUIC_NETWORK_IDLE_TIMEOUT ||
4951 quic_error == quic::QUIC_HANDSHAKE_TIMEOUT);
4952 InitializeConnectionMigrationV2Test(
4953 {kDefaultNetworkForTests, kNewNetworkForTests});
4954
4955 // Using a testing task runner.
4956 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4957 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4958
4959 // Use cold start mode to send crypto message for handshake.
4960 crypto_client_stream_factory_.set_handshake_mode(
4961 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
4962
4963 // Socket data for connection on the default network.
4964 MockQuicData socket_data;
4965 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4966 socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
4967 socket_data.AddSocketDataToFactory(socket_factory_.get());
4968
4969 // Socket data for connection on the alternate network.
4970 MockQuicData socket_data2;
4971 quic::QuicStreamOffset header_stream_offset = 0;
4972 socket_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeDummyCHLOPacket(1));
4973 socket_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
4974 // Change the encryption level after handshake is confirmed.
4975 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_FORWARD_SECURE);
4976 socket_data2.AddWrite(
4977 ASYNC, ConstructInitialSettingsPacket(2, &header_stream_offset));
4978 socket_data2.AddWrite(
4979 ASYNC, ConstructGetRequestPacket(3, GetNthClientInitiatedStreamId(0),
4980 true, true, &header_stream_offset));
4981 socket_data2.AddRead(
4982 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
4983 false, false));
4984 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4985 socket_data2.AddWrite(SYNCHRONOUS,
4986 client_maker_.MakeAckAndRstPacket(
Zhongyi Shif3fcbbe62018-08-16 22:52:084987 5, false, GetNthClientInitiatedStreamId(0),
Zhongyi Shi8de43832018-08-15 23:40:004988 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
4989 socket_data2.AddSocketDataToFactory(socket_factory_.get());
4990
Zhongyi Shif3fcbbe62018-08-16 22:52:084991 // Socket data for probing on the default network.
4992 MockQuicData probing_data;
4993 probing_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
4994 probing_data.AddWrite(SYNCHRONOUS,
4995 client_maker_.MakeConnectivityProbingPacket(4, false));
4996 probing_data.AddSocketDataToFactory(socket_factory_.get());
4997
Zhongyi Shi8de43832018-08-15 23:40:004998 // Create request and QuicHttpStream.
4999 QuicStreamRequest request(factory_.get());
5000 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035001 request.Request(
5002 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5003 SocketTag(),
5004 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5005 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi8de43832018-08-15 23:40:005006
5007 base::RunLoop().RunUntilIdle();
5008
5009 // Ensure that session is alive but not active.
5010 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5011 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
5012 QuicChromiumClientSession* session = GetPendingSession(host_port_pair_);
5013 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5014 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
Zhongyi Shia6b68d112018-09-24 07:49:035015 EXPECT_FALSE(failed_on_default_network_);
Zhongyi Shi8de43832018-08-15 23:40:005016
5017 quic::QuicString error_details;
5018 if (quic_error == quic::QUIC_NETWORK_IDLE_TIMEOUT) {
5019 error_details = "No recent network activity.";
5020 } else {
5021 error_details = "Handshake timeout expired.";
5022 }
5023 session->connection()->CloseConnection(
5024 quic_error, error_details, quic::ConnectionCloseBehavior::SILENT_CLOSE);
5025
5026 // A task will be posted to clean up the session in the factory.
5027 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
5028 task_runner->FastForwardUntilNoTasksRemain();
5029
5030 // Verify a new session is created on the alternate network.
5031 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
5032 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5033 QuicChromiumClientSession* session2 = GetPendingSession(host_port_pair_);
5034 EXPECT_NE(session, session2);
Zhongyi Shia6b68d112018-09-24 07:49:035035 EXPECT_TRUE(failed_on_default_network_);
Zhongyi Shi8de43832018-08-15 23:40:005036
5037 // Confirm the handshake on the alternate network.
5038 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
5039 quic::QuicSession::HANDSHAKE_CONFIRMED);
5040 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5041 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5042 // Resume the data now so that data can be sent and read.
5043 socket_data2.Resume();
5044
5045 // Create the stream.
5046 std::unique_ptr<HttpStream> stream = CreateStream(&request);
5047 EXPECT_TRUE(stream.get());
5048 HttpRequestInfo request_info;
5049 request_info.method = "GET";
5050 request_info.url = GURL("https://www.example.org/");
5051 request_info.traffic_annotation =
5052 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5053 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
5054 net_log_, CompletionOnceCallback()));
5055 // Send the request.
5056 HttpResponseInfo response;
5057 HttpRequestHeaders request_headers;
5058 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
5059 callback_.callback()));
5060 // Run the message loop to finish asynchronous mock write.
5061 base::RunLoop().RunUntilIdle();
5062 // Read the response.
5063 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
5064 EXPECT_EQ(200, response.headers->response_code());
5065
Zhongyi Shif3fcbbe62018-08-16 22:52:085066 // There should be a new task posted to migrate back to the default network.
5067 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
5068 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
5069 EXPECT_EQ(base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs),
5070 next_task_delay);
5071 task_runner->FastForwardBy(next_task_delay);
5072
5073 // There should be two tasks posted. One will retry probing and the other
5074 // will retry migrate back.
5075 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
5076 next_task_delay = task_runner->NextPendingTaskDelay();
5077 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
5078 next_task_delay);
5079
5080 // Deliver the signal that the default network is disconnected.
5081 scoped_mock_network_change_notifier_->mock_network_change_notifier()
5082 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
5083 // Verify no connectivity probes will be sent as probing will be cancelled.
5084 task_runner->FastForwardUntilNoTasksRemain();
5085 // Deliver the signal that the alternate network is made default.
5086 scoped_mock_network_change_notifier_->mock_network_change_notifier()
5087 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
5088 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
5089
Zhongyi Shi8de43832018-08-15 23:40:005090 stream.reset();
5091 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5092 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5093 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
5094 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
5095}
5096
Zhongyi Shi247d6322018-07-24 07:03:355097// Test that connection will be closed with PACKET_WRITE_ERROR if a write error
5098// is triggered before handshake is confirmed and connection migration is turned
5099// on.
5100TEST_P(QuicStreamFactoryTest, MigrationOnWriteErrorBeforeHandshakeConfirmed) {
5101 InitializeConnectionMigrationV2Test(
5102 {kDefaultNetworkForTests, kNewNetworkForTests});
5103
5104 // Use unmocked crypto stream to do crypto connect.
5105 crypto_client_stream_factory_.set_handshake_mode(
Zhongyi Shi879659422018-08-02 17:58:255106 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
Zhongyi Shi247d6322018-07-24 07:03:355107
5108 MockQuicData socket_data;
5109 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5110 // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect.
5111 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
5112 socket_data.AddSocketDataToFactory(socket_factory_.get());
5113
5114 // Create request, should fail after the write of the CHLO fails.
5115 QuicStreamRequest request(factory_.get());
5116 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035117 request.Request(
5118 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5119 SocketTag(),
5120 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5121 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi247d6322018-07-24 07:03:355122 EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, callback_.WaitForResult());
5123 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5124 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
5125
5126 // Verify new requests can be sent normally.
5127 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:275128 MockCryptoClientStream::COLD_START);
Zhongyi Shi247d6322018-07-24 07:03:355129 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5130 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5131 MockQuicData socket_data2;
5132 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5133 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
5134 socket_data2.AddSocketDataToFactory(socket_factory_.get());
5135
5136 QuicStreamRequest request2(factory_.get());
5137 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035138 request2.Request(
5139 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5140 SocketTag(),
5141 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5142 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi247d6322018-07-24 07:03:355143 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5144 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
5145 // Run the message loop to complete host resolution.
5146 base::RunLoop().RunUntilIdle();
5147
5148 // Complete handshake. QuicStreamFactory::Job should complete and succeed.
5149 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
5150 quic::QuicSession::HANDSHAKE_CONFIRMED);
5151 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5152 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5153 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
5154
5155 // Create QuicHttpStream.
5156 std::unique_ptr<HttpStream> stream = CreateStream(&request2);
5157 EXPECT_TRUE(stream.get());
5158 stream.reset();
5159 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5160 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5161 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
5162 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
5163}
5164
jri9f303712016-09-13 01:10:225165void QuicStreamFactoryTestBase::TestMigrationOnWriteError(
5166 IoMode write_error_mode) {
Zhongyi Shi1a054612018-06-14 04:59:085167 InitializeConnectionMigrationV2Test(
jri9f303712016-09-13 01:10:225168 {kDefaultNetworkForTests, kNewNetworkForTests});
5169 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5170 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5171 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5172
Zhongyi Shi3c4c9e92018-07-02 23:16:235173 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
5174
jri9f303712016-09-13 01:10:225175 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:525176 quic::QuicStreamOffset header_stream_offset = 0;
jri9f303712016-09-13 01:10:225177 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
rch5cb522462017-04-25 20:18:365178 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:435179 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
jri9f303712016-09-13 01:10:225180 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:175181 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:225182
5183 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:455184 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:335185 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035186 request.Request(
5187 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5188 SocketTag(),
5189 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5190 failed_on_default_network_callback_, callback_.callback()));
jri9f303712016-09-13 01:10:225191 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:245192 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9f303712016-09-13 01:10:225193 EXPECT_TRUE(stream.get());
5194
5195 // Cause QUIC stream to be created.
5196 HttpRequestInfo request_info;
5197 request_info.method = "GET";
5198 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:395199 request_info.traffic_annotation =
5200 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:275201 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:395202 net_log_, CompletionOnceCallback()));
jri9f303712016-09-13 01:10:225203
5204 // Ensure that session is alive and active.
5205 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5206 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5207 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5208
5209 // Set up second socket data provider that is used after
5210 // migration. The request is rewritten to this new socket, and the
5211 // response to the request is read on this new socket.
5212 MockQuicData socket_data1;
Zhongyi Shi32f2fd02018-04-16 18:23:435213 socket_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
5214 2, GetNthClientInitiatedStreamId(0),
5215 true, true, &header_stream_offset));
5216 socket_data1.AddRead(
5217 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
5218 false, false));
jri9f303712016-09-13 01:10:225219 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:435220 socket_data1.AddWrite(SYNCHRONOUS,
5221 client_maker_.MakeAckAndRstPacket(
5222 3, false, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:525223 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:175224 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:225225
5226 // Send GET request on stream. This should cause a write error, which triggers
5227 // a connection migration attempt.
5228 HttpResponseInfo response;
5229 HttpRequestHeaders request_headers;
5230 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
5231 callback_.callback()));
5232
5233 // Run the message loop so that the migration attempt is executed and
5234 // data queued in the new socket is read by the packet reader.
5235 base::RunLoop().RunUntilIdle();
5236
Zhongyi Shia7dd46b2018-07-12 22:59:295237 // Verify that session is alive and not marked as going awya.
jri9f303712016-09-13 01:10:225238 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:295239 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri9f303712016-09-13 01:10:225240 EXPECT_EQ(1u, session->GetNumActiveStreams());
5241
5242 // Verify that response headers on the migrated socket were delivered to the
5243 // stream.
5244 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
5245 EXPECT_EQ(200, response.headers->response_code());
5246
5247 stream.reset();
5248
5249 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5250 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5251 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
5252 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
5253}
5254
5255TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorSynchronous) {
5256 TestMigrationOnWriteError(SYNCHRONOUS);
5257}
5258
5259TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorAsync) {
5260 TestMigrationOnWriteError(ASYNC);
5261}
5262
5263void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorNoNewNetwork(
5264 IoMode write_error_mode) {
Zhongyi Shi1a054612018-06-14 04:59:085265 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jri9f303712016-09-13 01:10:225266 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5267 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5268
jri5b785512016-09-13 04:29:115269 // Use the test task runner, to force the migration alarm timeout later.
5270 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
5271
jri9f303712016-09-13 01:10:225272 MockQuicData socket_data;
5273 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:435274 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
jri9f303712016-09-13 01:10:225275 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:175276 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:225277
5278 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:455279 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:335280 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035281 request.Request(
5282 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5283 SocketTag(),
5284 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5285 failed_on_default_network_callback_, callback_.callback()));
jri9f303712016-09-13 01:10:225286 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:245287 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9f303712016-09-13 01:10:225288 EXPECT_TRUE(stream.get());
5289
5290 // Cause QUIC stream to be created.
5291 HttpRequestInfo request_info;
5292 request_info.method = "GET";
5293 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:395294 request_info.traffic_annotation =
5295 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:275296 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:395297 net_log_, CompletionOnceCallback()));
jri9f303712016-09-13 01:10:225298
5299 // Ensure that session is alive and active.
5300 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5301 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5302 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5303
jri5b785512016-09-13 04:29:115304 // Send GET request on stream. This causes a write error, which triggers
5305 // a connection migration attempt. Since there are no networks
5306 // to migrate to, this causes the session to wait for a new network.
jri9f303712016-09-13 01:10:225307 HttpResponseInfo response;
5308 HttpRequestHeaders request_headers;
5309 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
5310 callback_.callback()));
jri5b785512016-09-13 04:29:115311
5312 // Complete any pending writes. Pending async MockQuicData writes
5313 // are run on the message loop, not on the test runner.
jri9f303712016-09-13 01:10:225314 base::RunLoop().RunUntilIdle();
jri5b785512016-09-13 04:29:115315
5316 // Write error causes migration task to be posted. Spin the loop.
5317 if (write_error_mode == ASYNC)
5318 runner_->RunNextTask();
5319
5320 // Migration has not yet failed. The session should be alive and active.
5321 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5322 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5323 EXPECT_EQ(1u, session->GetNumActiveStreams());
5324 EXPECT_TRUE(session->connection()->writer()->IsWriteBlocked());
5325
5326 // The migration will not fail until the migration alarm timeout.
5327 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5328 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5329 EXPECT_EQ(1u, session->GetNumActiveStreams());
5330 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
5331
5332 // Force migration alarm timeout to run.
5333 RunTestLoopUntilIdle();
5334
5335 // The connection should be closed. A request for response headers
5336 // should fail.
jri9f303712016-09-13 01:10:225337 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5338 EXPECT_FALSE(HasActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:115339 EXPECT_EQ(ERR_NETWORK_CHANGED, callback_.WaitForResult());
5340 EXPECT_EQ(ERR_NETWORK_CHANGED,
5341 stream->ReadResponseHeaders(callback_.callback()));
jri9f303712016-09-13 01:10:225342
5343 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5344 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5345}
5346
5347TEST_P(QuicStreamFactoryTest,
5348 MigrateSessionOnWriteErrorNoNewNetworkSynchronous) {
5349 TestMigrationOnWriteErrorNoNewNetwork(SYNCHRONOUS);
5350}
5351
5352TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorNoNewNetworkAsync) {
5353 TestMigrationOnWriteErrorNoNewNetwork(ASYNC);
5354}
5355
Zhongyi Shi0439ecc72018-07-11 04:41:265356TEST_P(QuicStreamFactoryTest,
5357 MigrateSessionOnWriteErrorWithMultipleRequestsSync) {
5358 TestMigrationOnWriteErrorWithMultipleRequests(SYNCHRONOUS);
5359}
5360
5361TEST_P(QuicStreamFactoryTest,
5362 MigrateSessionOnWriteErrorWithMultipleRequestsAsync) {
5363 TestMigrationOnWriteErrorWithMultipleRequests(ASYNC);
5364}
5365
5366// Sets up a test which verifies that connection migration on write error can
5367// eventually succeed and rewrite the packet on the new network with *multiple*
5368// migratable streams.
5369void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorWithMultipleRequests(
5370 IoMode write_error_mode) {
5371 InitializeConnectionMigrationV2Test(
5372 {kDefaultNetworkForTests, kNewNetworkForTests});
5373 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5374 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5375 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5376
5377 MockQuicData socket_data;
5378 quic::QuicStreamOffset header_stream_offset = 0;
5379 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5380 socket_data.AddWrite(
5381 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
5382 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
5383 socket_data.AddSocketDataToFactory(socket_factory_.get());
5384
5385 // Set up second socket data provider that is used after
5386 // migration. The request is rewritten to this new socket, and the
5387 // response to the request is read on this new socket.
5388 MockQuicData socket_data1;
5389 socket_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
5390 2, GetNthClientInitiatedStreamId(0),
5391 true, true, &header_stream_offset));
5392 socket_data1.AddRead(
5393 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
5394 false, false));
5395 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5396 socket_data1.AddWrite(SYNCHRONOUS,
5397 client_maker_.MakeAckAndRstPacket(
5398 3, false, GetNthClientInitiatedStreamId(0),
5399 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
5400 socket_data1.AddWrite(
5401 SYNCHRONOUS,
5402 client_maker_.MakeRstPacket(4, false, GetNthClientInitiatedStreamId(1),
5403 quic::QUIC_STREAM_CANCELLED, 0));
5404
5405 socket_data1.AddSocketDataToFactory(socket_factory_.get());
5406
5407 // Create request #1 and QuicHttpStream.
5408 QuicStreamRequest request1(factory_.get());
5409 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035410 request1.Request(
5411 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5412 SocketTag(),
5413 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5414 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265415 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5416 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
5417 EXPECT_TRUE(stream1.get());
5418
5419 HttpRequestInfo request_info1;
5420 request_info1.method = "GET";
5421 request_info1.url = GURL("https://www.example.org/");
5422 request_info1.traffic_annotation =
5423 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5424 EXPECT_EQ(OK,
5425 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
5426 net_log_, CompletionOnceCallback()));
5427
5428 // Second request returns synchronously because it pools to existing session.
5429 TestCompletionCallback callback2;
5430 QuicStreamRequest request2(factory_.get());
5431 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
5432 DEFAULT_PRIORITY, SocketTag(),
5433 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:035434 &net_error_details_,
5435 failed_on_default_network_callback_,
5436 callback2.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265437 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
5438 EXPECT_TRUE(stream2.get());
5439 HttpRequestInfo request_info2;
5440 request_info2.method = "GET";
5441 request_info2.url = GURL("https://www.example.org/");
5442 request_info2.traffic_annotation =
5443 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5444 EXPECT_EQ(OK,
5445 stream2->InitializeStream(&request_info2, true, DEFAULT_PRIORITY,
5446 net_log_, CompletionOnceCallback()));
5447
5448 // Ensure that session is alive and active.
5449 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5450 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5451 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5452 EXPECT_EQ(2u, session->GetNumActiveStreams());
5453
5454 // Send GET request on stream. This should cause a write error, which triggers
5455 // a connection migration attempt.
5456 HttpResponseInfo response;
5457 HttpRequestHeaders request_headers;
5458 EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
5459 callback_.callback()));
5460
5461 // Run the message loop so that the migration attempt is executed and
5462 // data queued in the new socket is read by the packet reader.
5463 base::RunLoop().RunUntilIdle();
5464
Zhongyi Shia7dd46b2018-07-12 22:59:295465 // Verify session is still alive and not marked as going away.
Zhongyi Shi0439ecc72018-07-11 04:41:265466 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:295467 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi0439ecc72018-07-11 04:41:265468 EXPECT_EQ(2u, session->GetNumActiveStreams());
5469
5470 // Verify that response headers on the migrated socket were delivered to the
5471 // stream.
5472 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
5473 EXPECT_EQ(200, response.headers->response_code());
5474
5475 stream1.reset();
5476 stream2.reset();
5477
5478 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5479 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5480 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
5481 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
5482}
5483
5484TEST_P(QuicStreamFactoryTest, MigrateOnWriteErrorWithMixedRequestsSync) {
5485 TestMigrationOnWriteErrorMixedStreams(SYNCHRONOUS);
5486}
5487
5488TEST_P(QuicStreamFactoryTest, MigrateOnWriteErrorWithMixedRequestsAsync) {
5489 TestMigrationOnWriteErrorMixedStreams(ASYNC);
5490}
5491
5492// Sets up a test that verifies connection migration manages to migrate to
5493// alternate network after encountering a SYNC/ASYNC write error based on
5494// |write_error_mode| on the original network.
5495// Note there are mixed types of unfinished requests before migration: one
5496// migratable and one non-migratable. The *migratable* one triggers write
5497// error.
5498void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorMixedStreams(
5499 IoMode write_error_mode) {
5500 InitializeConnectionMigrationV2Test(
5501 {kDefaultNetworkForTests, kNewNetworkForTests});
5502 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5503 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5504 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5505
5506 int packet_number = 1;
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,
5512 ConstructInitialSettingsPacket(packet_number++, &header_stream_offset));
5513 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
5514 socket_data.AddSocketDataToFactory(socket_factory_.get());
5515
5516 // Set up second socket data provider that is used after
5517 // migration. The request is rewritten to this new socket, and the
5518 // response to the request is read on this new socket.
5519 MockQuicData socket_data1;
5520 socket_data1.AddWrite(
5521 SYNCHRONOUS, ConstructGetRequestPacket(
5522 packet_number++, GetNthClientInitiatedStreamId(0), true,
5523 true, &header_stream_offset));
5524 socket_data1.AddWrite(
5525 SYNCHRONOUS, client_maker_.MakeRstPacket(packet_number++, true,
5526 GetNthClientInitiatedStreamId(1),
5527 quic::QUIC_STREAM_CANCELLED, 0));
5528 socket_data1.AddRead(
5529 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
5530 false, false));
5531 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5532 socket_data1.AddWrite(
5533 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
5534 packet_number++, false, GetNthClientInitiatedStreamId(0),
5535 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
5536 socket_data1.AddSocketDataToFactory(socket_factory_.get());
5537
5538 // Create request #1 and QuicHttpStream.
5539 QuicStreamRequest request1(factory_.get());
5540 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035541 request1.Request(
5542 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5543 SocketTag(),
5544 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5545 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265546 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5547 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
5548 EXPECT_TRUE(stream1.get());
5549
5550 HttpRequestInfo request_info1;
5551 request_info1.method = "GET";
5552 request_info1.url = GURL("https://www.example.org/");
5553 request_info1.traffic_annotation =
5554 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5555 EXPECT_EQ(OK,
5556 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
5557 net_log_, CompletionOnceCallback()));
5558
5559 // Second request returns synchronously because it pools to existing session.
5560 TestCompletionCallback callback2;
5561 QuicStreamRequest request2(factory_.get());
5562 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
5563 DEFAULT_PRIORITY, SocketTag(),
5564 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:035565 &net_error_details_,
5566 failed_on_default_network_callback_,
5567 callback2.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265568 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
5569 EXPECT_TRUE(stream2.get());
5570
5571 HttpRequestInfo request_info2;
5572 request_info2.method = "GET";
Zhongyi Shibb28b1f2018-07-18 02:41:265573 request_info2.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
Zhongyi Shi0439ecc72018-07-11 04:41:265574 request_info2.url = GURL("https://www.example.org/");
5575 request_info2.traffic_annotation =
5576 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5577 EXPECT_EQ(OK,
5578 stream2->InitializeStream(&request_info2, true, DEFAULT_PRIORITY,
5579 net_log_, CompletionOnceCallback()));
5580
5581 // Ensure that session is alive and active.
5582 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5583 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5584 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5585 EXPECT_EQ(2u, session->GetNumActiveStreams());
5586
5587 // Send GET request on stream 1. This should cause a write error, which
5588 // triggers a connection migration attempt.
5589 HttpResponseInfo response;
5590 HttpRequestHeaders request_headers;
5591 EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
5592 callback_.callback()));
5593
5594 // Run the message loop so that the migration attempt is executed and
5595 // data queued in the new socket is read by the packet reader.
5596 base::RunLoop().RunUntilIdle();
5597
Zhongyi Shia7dd46b2018-07-12 22:59:295598 // Verify that the session is still alive and not marked as going away.
5599 // Non-migratable stream should be closed due to migration.
Zhongyi Shi0439ecc72018-07-11 04:41:265600 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:295601 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi0439ecc72018-07-11 04:41:265602 EXPECT_EQ(1u, session->GetNumActiveStreams());
5603
5604 // Verify that response headers on the migrated socket were delivered to the
5605 // stream.
5606 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
5607 EXPECT_EQ(200, response.headers->response_code());
5608
5609 stream1.reset();
5610
5611 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5612 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5613 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
5614 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
5615}
5616
5617TEST_P(QuicStreamFactoryTest, MigrateOnWriteErrorWithMixedRequests2Sync) {
5618 TestMigrationOnWriteErrorMixedStreams2(SYNCHRONOUS);
5619}
5620
5621TEST_P(QuicStreamFactoryTest, MigrateOnWriteErrorWithMixedRequests2Async) {
5622 TestMigrationOnWriteErrorMixedStreams2(ASYNC);
5623}
5624
5625// The one triggers write error is a non-migratable stream.
5626// Sets up a test that verifies connection migration manages to migrate to
5627// alternate network after encountering a SYNC/ASYNC write error based on
5628// |write_error_mode| on the original network.
5629// Note there are mixed types of unfinished requests before migration: one
5630// migratable and one non-migratable. The *non-migratable* one triggers write
5631// error.
5632void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorMixedStreams2(
5633 IoMode write_error_mode) {
5634 InitializeConnectionMigrationV2Test(
5635 {kDefaultNetworkForTests, kNewNetworkForTests});
5636 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5637 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5638 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5639
5640 int packet_number = 1;
5641 MockQuicData socket_data;
5642 quic::QuicStreamOffset header_stream_offset = 0;
5643 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5644 socket_data.AddWrite(
5645 SYNCHRONOUS,
5646 ConstructInitialSettingsPacket(packet_number++, &header_stream_offset));
5647 socket_data.AddWrite(write_error_mode,
5648 ERR_ADDRESS_UNREACHABLE); // Write error.
5649 socket_data.AddSocketDataToFactory(socket_factory_.get());
5650
5651 // Set up second socket data provider that is used after
5652 // migration. The request is rewritten to this new socket, and the
5653 // response to the request is read on this new socket.
5654 MockQuicData socket_data1;
5655 // The packet triggered writer error will be sent anyway even if the stream
5656 // will be cancelled later.
5657 socket_data1.AddWrite(
5658 SYNCHRONOUS, ConstructGetRequestPacket(
5659 packet_number++, GetNthClientInitiatedStreamId(1), true,
5660 true, &header_stream_offset));
5661 socket_data1.AddWrite(
5662 SYNCHRONOUS, client_maker_.MakeRstPacket(packet_number++, true,
5663 GetNthClientInitiatedStreamId(1),
5664 quic::QUIC_STREAM_CANCELLED, 0));
5665 socket_data1.AddWrite(
5666 SYNCHRONOUS, ConstructGetRequestPacket(
5667 packet_number++, GetNthClientInitiatedStreamId(0), true,
5668 true, &header_stream_offset));
5669 socket_data1.AddRead(
5670 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
5671 false, false));
5672 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5673 socket_data1.AddWrite(
5674 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
5675 packet_number++, false, GetNthClientInitiatedStreamId(0),
5676 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
5677 socket_data1.AddSocketDataToFactory(socket_factory_.get());
5678
5679 // Create request #1 and QuicHttpStream.
5680 QuicStreamRequest request1(factory_.get());
5681 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035682 request1.Request(
5683 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5684 SocketTag(),
5685 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5686 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265687 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5688 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
5689 EXPECT_TRUE(stream1.get());
5690
5691 HttpRequestInfo request_info1;
5692 request_info1.method = "GET";
5693 request_info1.url = GURL("https://www.example.org/");
5694 request_info1.traffic_annotation =
5695 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5696 EXPECT_EQ(OK,
5697 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
5698 net_log_, CompletionOnceCallback()));
5699
5700 // Second request returns synchronously because it pools to existing session.
5701 TestCompletionCallback callback2;
5702 QuicStreamRequest request2(factory_.get());
5703 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
5704 DEFAULT_PRIORITY, SocketTag(),
5705 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:035706 &net_error_details_,
5707 failed_on_default_network_callback_,
5708 callback2.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265709 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
5710 EXPECT_TRUE(stream2.get());
5711
5712 HttpRequestInfo request_info2;
5713 request_info2.method = "GET";
Zhongyi Shibb28b1f2018-07-18 02:41:265714 request_info2.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
Zhongyi Shi0439ecc72018-07-11 04:41:265715 request_info2.url = GURL("https://www.example.org/");
5716 request_info2.traffic_annotation =
5717 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5718 EXPECT_EQ(OK,
5719 stream2->InitializeStream(&request_info2, true, DEFAULT_PRIORITY,
5720 net_log_, CompletionOnceCallback()));
5721
5722 // Ensure that session is alive and active.
5723 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5724 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5725 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5726 EXPECT_EQ(2u, session->GetNumActiveStreams());
5727
5728 // Send GET request on stream 2 which is non-migratable. This should cause a
5729 // write error, which triggers a connection migration attempt.
5730 HttpResponseInfo response2;
5731 HttpRequestHeaders request_headers2;
5732 EXPECT_EQ(OK, stream2->SendRequest(request_headers2, &response2,
5733 callback2.callback()));
5734
5735 // Run the message loop so that the migration attempt is executed and
Zhongyi Shia7dd46b2018-07-12 22:59:295736 // data queued in the new socket is read by the packet reader. Session is
5737 // still alive and not marked as going away, non-migratable stream will be
5738 // closed.
Zhongyi Shi0439ecc72018-07-11 04:41:265739 base::RunLoop().RunUntilIdle();
5740 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:295741 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi0439ecc72018-07-11 04:41:265742 EXPECT_EQ(1u, session->GetNumActiveStreams());
5743
5744 // Send GET request on stream 1.
5745 HttpResponseInfo response;
5746 HttpRequestHeaders request_headers;
5747 EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
5748 callback_.callback()));
5749
5750 base::RunLoop().RunUntilIdle();
5751
5752 // Verify that response headers on the migrated socket were delivered to the
5753 // stream.
5754 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
5755 EXPECT_EQ(200, response.headers->response_code());
5756
5757 stream1.reset();
5758
5759 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5760 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5761 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
5762 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
5763}
5764
jri9f303712016-09-13 01:10:225765void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorNonMigratableStream(
5766 IoMode write_error_mode) {
5767 DVLOG(1) << "Mode: "
5768 << ((write_error_mode == SYNCHRONOUS) ? "SYNCHRONOUS" : "ASYNC");
Zhongyi Shi1a054612018-06-14 04:59:085769 InitializeConnectionMigrationV2Test(
jri9f303712016-09-13 01:10:225770 {kDefaultNetworkForTests, kNewNetworkForTests});
5771 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5772 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5773
5774 MockQuicData socket_data;
5775 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:435776 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
jri9f303712016-09-13 01:10:225777 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:175778 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:225779
5780 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:455781 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:335782 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035783 request.Request(
5784 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5785 SocketTag(),
5786 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5787 failed_on_default_network_callback_, callback_.callback()));
jri9f303712016-09-13 01:10:225788 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:245789 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9f303712016-09-13 01:10:225790 EXPECT_TRUE(stream.get());
5791
5792 // Cause QUIC stream to be created, but marked as non-migratable.
5793 HttpRequestInfo request_info;
Zhongyi Shibb28b1f2018-07-18 02:41:265794 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
jri9f303712016-09-13 01:10:225795 request_info.method = "GET";
5796 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:395797 request_info.traffic_annotation =
5798 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:275799 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:395800 net_log_, CompletionOnceCallback()));
jri9f303712016-09-13 01:10:225801
5802 // Ensure that session is alive and active.
5803 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5804 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5805 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5806
5807 // Send GET request on stream. This should cause a write error, which triggers
5808 // a connection migration attempt.
5809 HttpResponseInfo response;
5810 HttpRequestHeaders request_headers;
5811 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
5812 callback_.callback()));
5813
5814 // Run message loop to execute migration attempt.
5815 base::RunLoop().RunUntilIdle();
5816
5817 // Migration fails, and session is closed and deleted.
5818 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5819 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5820
5821 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5822 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5823}
5824
5825TEST_P(QuicStreamFactoryTest,
5826 MigrateSessionOnWriteErrorNonMigratableStreamSynchronous) {
5827 TestMigrationOnWriteErrorNonMigratableStream(SYNCHRONOUS);
5828}
5829
5830TEST_P(QuicStreamFactoryTest,
5831 MigrateSessionOnWriteErrorNonMigratableStreamAsync) {
5832 TestMigrationOnWriteErrorNonMigratableStream(ASYNC);
5833}
5834
5835void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorMigrationDisabled(
5836 IoMode write_error_mode) {
Zhongyi Shi1a054612018-06-14 04:59:085837 InitializeConnectionMigrationV2Test(
jri9f303712016-09-13 01:10:225838 {kDefaultNetworkForTests, kNewNetworkForTests});
5839 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5840 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5841
5842 MockQuicData socket_data;
5843 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:435844 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
jri9f303712016-09-13 01:10:225845 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:175846 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:225847
5848 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:455849 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:335850 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035851 request.Request(
5852 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5853 SocketTag(),
5854 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5855 failed_on_default_network_callback_, callback_.callback()));
jri9f303712016-09-13 01:10:225856 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:245857 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9f303712016-09-13 01:10:225858 EXPECT_TRUE(stream.get());
5859
5860 // Cause QUIC stream to be created.
5861 HttpRequestInfo request_info;
5862 request_info.method = "GET";
5863 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:395864 request_info.traffic_annotation =
5865 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:275866 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:395867 net_log_, CompletionOnceCallback()));
jri9f303712016-09-13 01:10:225868
5869 // Ensure that session is alive and active.
5870 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5871 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5872 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5873
5874 // Set session config to have connection migration disabled.
Ryan Hamilton8d9ee76e2018-05-29 23:52:525875 quic::test::QuicConfigPeer::SetReceivedDisableConnectionMigration(
5876 session->config());
jri9f303712016-09-13 01:10:225877 EXPECT_TRUE(session->config()->DisableConnectionMigration());
5878
5879 // Send GET request on stream. This should cause a write error, which triggers
5880 // a connection migration attempt.
5881 HttpResponseInfo response;
5882 HttpRequestHeaders request_headers;
5883 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
5884 callback_.callback()));
5885 // Run message loop to execute migration attempt.
5886 base::RunLoop().RunUntilIdle();
5887 // Migration fails, and session is closed and deleted.
5888 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5889 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5890 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5891 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5892}
5893
5894TEST_P(QuicStreamFactoryTest,
5895 MigrateSessionOnWriteErrorMigrationDisabledSynchronous) {
5896 TestMigrationOnWriteErrorMigrationDisabled(SYNCHRONOUS);
5897}
5898
5899TEST_P(QuicStreamFactoryTest,
5900 MigrateSessionOnWriteErrorMigrationDisabledAsync) {
5901 TestMigrationOnWriteErrorMigrationDisabled(ASYNC);
5902}
5903
Zhongyi Shi7f1d9212018-06-22 23:24:365904// Sets up a test which verifies that connection migration on write error can
5905// eventually succeed and rewrite the packet on the new network with singals
5906// delivered in the following order (alternate network is always availabe):
5907// - original network encounters a SYNC/ASYNC write error based on
5908// |write_error_mode_on_old_network|, the packet failed to be written is
5909// cached, session migrates immediately to the alternate network.
5910// - an immediate SYNC/ASYNC write error based on
5911// |write_error_mode_on_new_network| is encountered after migration to the
5912// alternate network, session migrates immediately to the original network.
5913// - an immediate SYNC/ASYNC write error based on
5914// |write_error_mode_on_old_network| is encountered after migration to the
5915// original network, session migrates immediately to the alternate network.
5916// - finally, session successfully sends the packet and reads the response on
5917// the alternate network.
5918// TODO(zhongyi): once https://crbug.com/855666 is fixed, this test should be
5919// modified to test that session is closed early if hopping between networks
5920// with consecutive write errors is detected.
jri9f303712016-09-13 01:10:225921void QuicStreamFactoryTestBase::TestMigrationOnMultipleWriteErrors(
Zhongyi Shi7f1d9212018-06-22 23:24:365922 IoMode write_error_mode_on_old_network,
5923 IoMode write_error_mode_on_new_network) {
5924 InitializeConnectionMigrationV2Test(
jri9f303712016-09-13 01:10:225925 {kDefaultNetworkForTests, kNewNetworkForTests});
5926 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5927 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5928 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5929
Zhongyi Shi7f1d9212018-06-22 23:24:365930 // Set up the socket data used by the original network, which encounters a
5931 // write erorr.
5932 MockQuicData socket_data1;
5933 quic::QuicStreamOffset header_stream_offset = 0;
5934 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5935 socket_data1.AddWrite(
5936 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
5937 socket_data1.AddWrite(write_error_mode_on_old_network,
5938 ERR_ADDRESS_UNREACHABLE); // Write Error
5939 socket_data1.AddSocketDataToFactory(socket_factory_.get());
5940
5941 // Set up the socket data used by the alternate network, which also
5942 // encounters a write error.
5943 MockQuicData failed_quic_data2;
5944 failed_quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5945 failed_quic_data2.AddWrite(write_error_mode_on_new_network, ERR_FAILED);
5946 failed_quic_data2.AddSocketDataToFactory(socket_factory_.get());
5947
5948 // Set up the third socket data used by original network, which encounters a
5949 // write error again.
5950 MockQuicData failed_quic_data1;
5951 failed_quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5952 failed_quic_data1.AddWrite(write_error_mode_on_old_network, ERR_FAILED);
5953 failed_quic_data1.AddSocketDataToFactory(socket_factory_.get());
5954
5955 // Set up the last socket data used by the alternate network, which will
5956 // finish migration successfully. The request is rewritten to this new socket,
5957 // and the response to the request is read on this socket.
5958 MockQuicData socket_data2;
5959 socket_data2.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
5960 2, GetNthClientInitiatedStreamId(0),
5961 true, true, &header_stream_offset));
5962 socket_data2.AddRead(
5963 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
5964 false, false));
5965 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5966 socket_data2.AddWrite(SYNCHRONOUS,
5967 client_maker_.MakeAckAndRstPacket(
5968 3, false, GetNthClientInitiatedStreamId(0),
5969 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
5970 socket_data2.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:225971
5972 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:455973 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:335974 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035975 request.Request(
5976 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5977 SocketTag(),
5978 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5979 failed_on_default_network_callback_, callback_.callback()));
jri9f303712016-09-13 01:10:225980 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:245981 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9f303712016-09-13 01:10:225982 EXPECT_TRUE(stream.get());
5983
5984 // Cause QUIC stream to be created.
5985 HttpRequestInfo request_info;
5986 request_info.method = "GET";
5987 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:395988 request_info.traffic_annotation =
5989 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:275990 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:395991 net_log_, CompletionOnceCallback()));
jri9f303712016-09-13 01:10:225992
5993 // Ensure that session is alive and active.
5994 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5995 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5996 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5997
Zhongyi Shi7f1d9212018-06-22 23:24:365998 // Send GET request on stream.
5999 // This should encounter a write error on network 1,
6000 // then migrate to network 2, which encounters another write error,
6001 // and migrate again to network 1, which encoutners one more write error.
6002 // Finally the session migrates to network 2 successfully.
jri9f303712016-09-13 01:10:226003 HttpResponseInfo response;
6004 HttpRequestHeaders request_headers;
6005 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6006 callback_.callback()));
jri9f303712016-09-13 01:10:226007
jri9f303712016-09-13 01:10:226008 base::RunLoop().RunUntilIdle();
Zhongyi Shi7f1d9212018-06-22 23:24:366009 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6010 EXPECT_EQ(1u, session->GetNumActiveStreams());
jri9f303712016-09-13 01:10:226011
Zhongyi Shi7f1d9212018-06-22 23:24:366012 // Verify that response headers on the migrated socket were delivered to the
6013 // stream.
6014 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
6015 EXPECT_EQ(200, response.headers->response_code());
jri9f303712016-09-13 01:10:226016
6017 stream.reset();
Zhongyi Shi7f1d9212018-06-22 23:24:366018 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6019 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
6020 EXPECT_TRUE(failed_quic_data2.AllReadDataConsumed());
6021 EXPECT_TRUE(failed_quic_data2.AllWriteDataConsumed());
6022 EXPECT_TRUE(failed_quic_data1.AllReadDataConsumed());
6023 EXPECT_TRUE(failed_quic_data1.AllWriteDataConsumed());
6024 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
6025 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri9f303712016-09-13 01:10:226026}
6027
6028TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsSyncSync) {
Zhongyi Shi7f1d9212018-06-22 23:24:366029 TestMigrationOnMultipleWriteErrors(
6030 /*write_error_mode_on_old_network*/ SYNCHRONOUS,
6031 /*write_error_mode_on_new_network*/ SYNCHRONOUS);
jri9f303712016-09-13 01:10:226032}
6033
6034TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsSyncAsync) {
Zhongyi Shi7f1d9212018-06-22 23:24:366035 TestMigrationOnMultipleWriteErrors(
6036 /*write_error_mode_on_old_network*/ SYNCHRONOUS,
6037 /*write_error_mode_on_new_network*/ ASYNC);
jri9f303712016-09-13 01:10:226038}
6039
6040TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsAsyncSync) {
Zhongyi Shi7f1d9212018-06-22 23:24:366041 TestMigrationOnMultipleWriteErrors(
6042 /*write_error_mode_on_old_network*/ ASYNC,
6043 /*write_error_mode_on_new_network*/ SYNCHRONOUS);
jri9f303712016-09-13 01:10:226044}
6045
6046TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsAsyncAsync) {
Zhongyi Shi7f1d9212018-06-22 23:24:366047 TestMigrationOnMultipleWriteErrors(
6048 /*write_error_mode_on_old_network*/ ASYNC,
6049 /*write_error_mode_on_new_network*/ ASYNC);
jri9f303712016-09-13 01:10:226050}
6051
Zhongyi Shi6abe33812018-07-24 19:43:116052// Verifies that a connection is closed when connection migration is triggered
6053// on network being disconnected and the handshake is not confirmed.
6054TEST_P(QuicStreamFactoryTest, NoMigrationBeforeHandshakeOnNetworkDisconnected) {
6055 InitializeConnectionMigrationV2Test(
6056 {kDefaultNetworkForTests, kNewNetworkForTests});
6057
Zhongyi Shi879659422018-08-02 17:58:256058 // Use cold start mode to do crypto connect, and send CHLO packet on wire.
Zhongyi Shi6abe33812018-07-24 19:43:116059 crypto_client_stream_factory_.set_handshake_mode(
Zhongyi Shi879659422018-08-02 17:58:256060 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
Zhongyi Shi6abe33812018-07-24 19:43:116061
Zhongyi Shi6abe33812018-07-24 19:43:116062 MockQuicData socket_data;
Zhongyi Shi879659422018-08-02 17:58:256063 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5068bb02018-08-03 02:44:096064 socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
Zhongyi Shi6abe33812018-07-24 19:43:116065 socket_data.AddSocketDataToFactory(socket_factory_.get());
6066
6067 // Create request and QuicHttpStream.
6068 QuicStreamRequest request(factory_.get());
6069 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036070 request.Request(
6071 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6072 SocketTag(),
6073 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6074 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi6abe33812018-07-24 19:43:116075 // Deliver the network notification, which should cause the connection to be
6076 // closed.
6077 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6078 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
6079 EXPECT_EQ(ERR_NETWORK_CHANGED, callback_.WaitForResult());
Zhongyi Shi4293b142018-07-25 00:33:576080
Zhongyi Shi6abe33812018-07-24 19:43:116081 EXPECT_FALSE(HasActiveSession(host_port_pair_));
6082 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
Zhongyi Shi4293b142018-07-25 00:33:576083 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6084 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
Zhongyi Shi6abe33812018-07-24 19:43:116085}
6086
Zhongyi Shib24001c02018-06-18 20:01:526087// Sets up the connection migration test where network change notification is
6088// queued BEFORE connection migration attempt on write error is posted.
6089void QuicStreamFactoryTestBase::
6090 TestMigrationOnNetworkNotificationWithWriteErrorQueuedLater(
6091 bool disconnected) {
6092 InitializeConnectionMigrationV2Test(
jried79618b2016-07-02 03:18:526093 {kDefaultNetworkForTests, kNewNetworkForTests});
6094 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6095 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6096 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6097
rcha00569732016-08-27 11:09:366098 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:526099 quic::QuicStreamOffset header_stream_offset = 0;
rcha00569732016-08-27 11:09:366100 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
rch5cb522462017-04-25 20:18:366101 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:436102 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
rcha00569732016-08-27 11:09:366103 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:176104 socket_data.AddSocketDataToFactory(socket_factory_.get());
jried79618b2016-07-02 03:18:526105
6106 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:456107 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:336108 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036109 request.Request(
6110 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6111 SocketTag(),
6112 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6113 failed_on_default_network_callback_, callback_.callback()));
jried79618b2016-07-02 03:18:526114 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:246115 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jried79618b2016-07-02 03:18:526116 EXPECT_TRUE(stream.get());
6117
6118 // Cause QUIC stream to be created.
6119 HttpRequestInfo request_info;
6120 request_info.method = "GET";
6121 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:396122 request_info.traffic_annotation =
6123 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:276124 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:396125 net_log_, CompletionOnceCallback()));
jried79618b2016-07-02 03:18:526126
6127 // Ensure that session is alive and active.
6128 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6129 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6130 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6131
6132 // Set up second socket data provider that is used after
6133 // migration. The request is rewritten to this new socket, and the
6134 // response to the request is read on this new socket.
rcha00569732016-08-27 11:09:366135 MockQuicData socket_data1;
Zhongyi Shi32f2fd02018-04-16 18:23:436136 socket_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
6137 2, GetNthClientInitiatedStreamId(0),
6138 true, true, &header_stream_offset));
6139 socket_data1.AddRead(
6140 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
6141 false, false));
rcha00569732016-08-27 11:09:366142 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:436143 socket_data1.AddWrite(SYNCHRONOUS,
6144 client_maker_.MakeAckAndRstPacket(
6145 3, false, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:526146 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:176147 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jried79618b2016-07-02 03:18:526148
jri9f303712016-09-13 01:10:226149 // First queue a network change notification in the message loop.
6150 if (disconnected) {
6151 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6152 ->QueueNetworkDisconnected(kDefaultNetworkForTests);
6153 } else {
6154 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6155 ->QueueNetworkMadeDefault(kNewNetworkForTests);
6156 }
6157 // Send GET request on stream. This should cause a write error,
6158 // which triggers a connection migration attempt. This will queue a
6159 // migration attempt behind the notification in the message loop.
jried79618b2016-07-02 03:18:526160 HttpResponseInfo response;
6161 HttpRequestHeaders request_headers;
6162 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6163 callback_.callback()));
6164
jried79618b2016-07-02 03:18:526165 base::RunLoop().RunUntilIdle();
Zhongyi Shia7dd46b2018-07-12 22:59:296166 // Verify the session is still alive and not marked as going away post
6167 // migration.
jried79618b2016-07-02 03:18:526168 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:296169 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jried79618b2016-07-02 03:18:526170 EXPECT_EQ(1u, session->GetNumActiveStreams());
6171
6172 // Verify that response headers on the migrated socket were delivered to the
6173 // stream.
6174 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
6175 EXPECT_EQ(200, response.headers->response_code());
6176
6177 stream.reset();
6178
6179 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6180 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6181 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6182 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
6183}
6184
Zhongyi Shib24001c02018-06-18 20:01:526185// This test verifies that session attempts connection migration successfully
6186// with signals delivered in the following order (alternate network is always
6187// available):
6188// - a notification that default network is disconnected is queued.
6189// - write error is triggered: session posts a task to attempt connection
6190// migration, |migration_pending_| set to true.
6191// - default network disconnected is delivered: session immediately migrates to
6192// the alternate network, |migration_pending_| set to false.
Zhongyi Shif3d6cddb2018-07-11 03:30:026193// - connection migration on write error attempt aborts: writer encountered
6194// error is no longer in active use.
jri9f303712016-09-13 01:10:226195TEST_P(QuicStreamFactoryTest,
Zhongyi Shib24001c02018-06-18 20:01:526196 MigrateOnNetworkDisconnectedWithWriteErrorQueuedLater) {
6197 TestMigrationOnNetworkNotificationWithWriteErrorQueuedLater(
6198 /*disconnected=*/true);
jri9f303712016-09-13 01:10:226199}
6200
Zhongyi Shib24001c02018-06-18 20:01:526201// This test verifies that session attempts connection migration successfully
6202// with signals delivered in the following order (alternate network is always
6203// available):
6204// - a notification that alternate network is made default is queued.
6205// - write error is triggered: session posts a task to attempt connection
6206// migration, block future migrations.
6207// - new default notification is delivered: migrate back timer spins and task is
6208// posted to migrate to the new default network.
6209// - connection migration on write error attempt proceeds successfully: session
6210// is
6211// marked as going away, future migrations unblocked.
6212// - migrate back to default network task executed: session is already on the
6213// default network, no-op.
jri9f303712016-09-13 01:10:226214TEST_P(QuicStreamFactoryTest,
Zhongyi Shib24001c02018-06-18 20:01:526215 MigrateOnWriteErrorWithNetworkMadeDefaultQueuedEarlier) {
6216 TestMigrationOnNetworkNotificationWithWriteErrorQueuedLater(
6217 /*disconnected=*/false);
jri9f303712016-09-13 01:10:226218}
6219
Zhongyi Shi1e2bc742018-06-16 02:06:076220// Sets up the connection migration test where network change notification is
6221// queued AFTER connection migration attempt on write error is posted.
6222void QuicStreamFactoryTestBase::
6223 TestMigrationOnWriteErrorWithNotificationQueuedLater(bool disconnected) {
Zhongyi Shi1a054612018-06-14 04:59:086224 InitializeConnectionMigrationV2Test(
jri9f303712016-09-13 01:10:226225 {kDefaultNetworkForTests, kNewNetworkForTests});
jried79618b2016-07-02 03:18:526226 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6227 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri9f303712016-09-13 01:10:226228 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jried79618b2016-07-02 03:18:526229
rcha00569732016-08-27 11:09:366230 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:526231 quic::QuicStreamOffset header_stream_offset = 0;
rcha00569732016-08-27 11:09:366232 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
rch5cb522462017-04-25 20:18:366233 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:436234 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
rcha00569732016-08-27 11:09:366235 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:176236 socket_data.AddSocketDataToFactory(socket_factory_.get());
jried79618b2016-07-02 03:18:526237
6238 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:456239 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:336240 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036241 request.Request(
6242 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6243 SocketTag(),
6244 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6245 failed_on_default_network_callback_, callback_.callback()));
jried79618b2016-07-02 03:18:526246 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:246247 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jried79618b2016-07-02 03:18:526248 EXPECT_TRUE(stream.get());
6249
6250 // Cause QUIC stream to be created.
6251 HttpRequestInfo request_info;
6252 request_info.method = "GET";
6253 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:396254 request_info.traffic_annotation =
6255 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:276256 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:396257 net_log_, CompletionOnceCallback()));
jried79618b2016-07-02 03:18:526258
6259 // Ensure that session is alive and active.
6260 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6261 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6262 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6263
jri9f303712016-09-13 01:10:226264 // Set up second socket data provider that is used after
6265 // migration. The request is rewritten to this new socket, and the
6266 // response to the request is read on this new socket.
6267 MockQuicData socket_data1;
Zhongyi Shi32f2fd02018-04-16 18:23:436268 socket_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
6269 2, GetNthClientInitiatedStreamId(0),
6270 true, true, &header_stream_offset));
6271 socket_data1.AddRead(
6272 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
6273 false, false));
jri9f303712016-09-13 01:10:226274 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:436275 socket_data1.AddWrite(SYNCHRONOUS,
6276 client_maker_.MakeAckAndRstPacket(
6277 3, false, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:526278 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:176279 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:226280
6281 // Send GET request on stream. This should cause a write error,
6282 // which triggers a connection migration attempt. This will queue a
6283 // migration attempt in the message loop.
jried79618b2016-07-02 03:18:526284 HttpResponseInfo response;
6285 HttpRequestHeaders request_headers;
jri9f303712016-09-13 01:10:226286 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6287 callback_.callback()));
jried79618b2016-07-02 03:18:526288
jri9f303712016-09-13 01:10:226289 // Now queue a network change notification in the message loop behind
6290 // the migration attempt.
6291 if (disconnected) {
6292 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6293 ->QueueNetworkDisconnected(kDefaultNetworkForTests);
6294 } else {
6295 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6296 ->QueueNetworkMadeDefault(kNewNetworkForTests);
6297 }
6298
6299 base::RunLoop().RunUntilIdle();
Zhongyi Shia7dd46b2018-07-12 22:59:296300 // Verify session is still alive and not marked as going away.
jri9f303712016-09-13 01:10:226301 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:296302 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri9f303712016-09-13 01:10:226303 EXPECT_EQ(1u, session->GetNumActiveStreams());
6304
6305 // Verify that response headers on the migrated socket were delivered to the
6306 // stream.
6307 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
6308 EXPECT_EQ(200, response.headers->response_code());
6309
6310 stream.reset();
jried79618b2016-07-02 03:18:526311
6312 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6313 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
jri9f303712016-09-13 01:10:226314 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6315 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
jried79618b2016-07-02 03:18:526316}
6317
Zhongyi Shi1e2bc742018-06-16 02:06:076318// This test verifies that session attempts connection migration successfully
6319// with signals delivered in the following order (alternate network is always
6320// available):
6321// - write error is triggered: session posts a task to complete connection
6322// migration.
6323// - a notification that alternate network is made default is queued.
6324// - connection migration attempt proceeds successfully, session is marked as
6325// going away.
6326// - new default notification is delivered after connection migration has been
6327// completed.
jri9f303712016-09-13 01:10:226328TEST_P(QuicStreamFactoryTest,
Zhongyi Shi1e2bc742018-06-16 02:06:076329 MigrateOnWriteErrorWithNetworkMadeDefaultQueuedLater) {
6330 TestMigrationOnWriteErrorWithNotificationQueuedLater(/*disconnected=*/false);
jried79618b2016-07-02 03:18:526331}
6332
Zhongyi Shi1e2bc742018-06-16 02:06:076333// This test verifies that session attempts connection migration successfully
6334// with signals delivered in the following order (alternate network is always
6335// available):
6336// - write error is triggered: session posts a task to complete connection
6337// migration.
6338// - a notification that default network is diconnected is queued.
6339// - connection migration attempt proceeds successfully, session is marked as
6340// going away.
6341// - disconnect notification is delivered after connection migration has been
6342// completed.
jri9f303712016-09-13 01:10:226343TEST_P(QuicStreamFactoryTest,
Zhongyi Shi1e2bc742018-06-16 02:06:076344 MigrateOnWriteErrorWithNetworkDisconnectedQueuedLater) {
6345 TestMigrationOnWriteErrorWithNotificationQueuedLater(/*disconnected=*/true);
jried79618b2016-07-02 03:18:526346}
6347
Zhongyi Shia3810c52018-06-15 23:07:196348// This tests connection migration on write error with signals delivered in the
6349// following order:
6350// - a synchronous/asynchronous write error is triggered base on
Zhongyi Shif3d6cddb2018-07-11 03:30:026351// |write_error_mode|: connection migration attempt is posted.
6352// - old default network disconnects, migration waits for a new network.
Zhongyi Shia3810c52018-06-15 23:07:196353// - after a pause, new network is connected: session will migrate to new
6354// network immediately.
Zhongyi Shif3d6cddb2018-07-11 03:30:026355// - migration on writer error is exectued and aborts as writer passed in is no
6356// longer active in use.
Zhongyi Shia3810c52018-06-15 23:07:196357// - new network is made default.
jri5b785512016-09-13 04:29:116358void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorPauseBeforeConnected(
6359 IoMode write_error_mode) {
Zhongyi Shia3810c52018-06-15 23:07:196360 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jri5b785512016-09-13 04:29:116361 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6362 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6363 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6364
Zhongyi Shia3810c52018-06-15 23:07:196365 // Use the test task runner.
6366 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
6367
jri5b785512016-09-13 04:29:116368 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:526369 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shia3810c52018-06-15 23:07:196370 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
rch5cb522462017-04-25 20:18:366371 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:436372 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
Zhongyi Shia3810c52018-06-15 23:07:196373 socket_data.AddWrite(write_error_mode, ERR_FAILED);
Zhongyi Shi5f587cc2017-11-21 23:24:176374 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri5b785512016-09-13 04:29:116375
6376 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:456377 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:336378 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036379 request.Request(
6380 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6381 SocketTag(),
6382 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6383 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shia3810c52018-06-15 23:07:196384 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:246385 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri5b785512016-09-13 04:29:116386 EXPECT_TRUE(stream.get());
6387
6388 // Cause QUIC stream to be created.
6389 HttpRequestInfo request_info;
6390 request_info.method = "GET";
Zhongyi Shia3810c52018-06-15 23:07:196391 request_info.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:396392 request_info.traffic_annotation =
6393 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:276394 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:396395 net_log_, CompletionOnceCallback()));
jri5b785512016-09-13 04:29:116396
6397 // Ensure that session is alive and active.
6398 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6399 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6400 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6401
Zhongyi Shia3810c52018-06-15 23:07:196402 // Send GET request on stream.
jri5b785512016-09-13 04:29:116403 HttpResponseInfo response;
6404 HttpRequestHeaders request_headers;
6405 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6406 callback_.callback()));
6407
Zhongyi Shia3810c52018-06-15 23:07:196408 // The connection should still be alive, not marked as going away.
jri5b785512016-09-13 04:29:116409 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6410 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6411 EXPECT_EQ(1u, session->GetNumActiveStreams());
6412 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
6413
Zhongyi Shia3810c52018-06-15 23:07:196414 // Set up second socket data provider that is used after migration.
6415 // The response to the earlier request is read on this new socket.
jri5b785512016-09-13 04:29:116416 MockQuicData socket_data1;
Zhongyi Shi32f2fd02018-04-16 18:23:436417 socket_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
6418 2, GetNthClientInitiatedStreamId(0),
6419 true, true, &header_stream_offset));
6420 socket_data1.AddRead(
6421 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
6422 false, false));
jri5b785512016-09-13 04:29:116423 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:436424 socket_data1.AddWrite(SYNCHRONOUS,
6425 client_maker_.MakeAckAndRstPacket(
6426 3, false, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:526427 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:176428 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri5b785512016-09-13 04:29:116429
Zhongyi Shia3810c52018-06-15 23:07:196430 // On a DISCONNECTED notification, nothing happens.
6431 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6432 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
6433 // Add a new network and notify the stream factory of a new connected network.
6434 // This causes a PING packet to be sent over the new network.
jri5b785512016-09-13 04:29:116435 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6436 ->SetConnectedNetworksList({kNewNetworkForTests});
6437 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6438 ->NotifyNetworkConnected(kNewNetworkForTests);
6439
Zhongyi Shia3810c52018-06-15 23:07:196440 // Ensure that the session is still alive.
jri5b785512016-09-13 04:29:116441 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia3810c52018-06-15 23:07:196442 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:116443 EXPECT_EQ(1u, session->GetNumActiveStreams());
6444
Zhongyi Shia3810c52018-06-15 23:07:196445 // Run the message loop migration for write error can finish.
6446 runner_->RunUntilIdle();
6447
6448 // Response headers are received over the new network.
jri5b785512016-09-13 04:29:116449 EXPECT_THAT(callback_.WaitForResult(), IsOk());
6450 EXPECT_EQ(200, response.headers->response_code());
6451
Zhongyi Shia3810c52018-06-15 23:07:196452 // Check that the session is still alive.
6453 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
jri5b785512016-09-13 04:29:116454 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shia3810c52018-06-15 23:07:196455
6456 // There should be no posted tasks not executed, no way to migrate back to
6457 // default network.
6458 EXPECT_TRUE(runner_->GetPostedTasks().empty());
6459
6460 // Receive signal to mark new network as default.
6461 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6462 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
jri5b785512016-09-13 04:29:116463
6464 stream.reset();
jri5b785512016-09-13 04:29:116465 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6466 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6467 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6468 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
jri5b785512016-09-13 04:29:116469}
6470
6471TEST_P(QuicStreamFactoryTest,
Zhongyi Shia3810c52018-06-15 23:07:196472 MigrateSessionOnSyncWriteErrorPauseBeforeConnected) {
jri5b785512016-09-13 04:29:116473 TestMigrationOnWriteErrorPauseBeforeConnected(SYNCHRONOUS);
6474}
6475
6476TEST_P(QuicStreamFactoryTest,
Zhongyi Shia3810c52018-06-15 23:07:196477 MigrateSessionOnAsyncWriteErrorPauseBeforeConnected) {
jri5b785512016-09-13 04:29:116478 TestMigrationOnWriteErrorPauseBeforeConnected(ASYNC);
6479}
6480
Zhongyi Shif3d6cddb2018-07-11 03:30:026481// This test verifies that when session successfully migrate to the alternate
6482// network, packet write error on the old writer will be ignored and will not
6483// trigger connection migration on write error.
6484TEST_P(QuicStreamFactoryTest, IgnoreWriteErrorFromOldWriterAfterMigration) {
6485 InitializeConnectionMigrationV2Test(
6486 {kDefaultNetworkForTests, kNewNetworkForTests});
6487 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6488 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6489 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6490
6491 // Using a testing task runner so that we can verify whether the migrate on
6492 // write error task is posted.
6493 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
6494 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
6495
6496 MockQuicData socket_data;
6497 quic::QuicStreamOffset header_stream_offset = 0;
6498 socket_data.AddWrite(
6499 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
6500 socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
6501 socket_data.AddWrite(ASYNC, ERR_ADDRESS_UNREACHABLE);
6502 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
6503 socket_data.AddSocketDataToFactory(socket_factory_.get());
6504
6505 // Create request and QuicHttpStream.
6506 QuicStreamRequest request(factory_.get());
6507 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036508 request.Request(
6509 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6510 SocketTag(),
6511 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6512 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shif3d6cddb2018-07-11 03:30:026513 EXPECT_EQ(OK, callback_.WaitForResult());
6514 std::unique_ptr<HttpStream> stream = CreateStream(&request);
6515 EXPECT_TRUE(stream.get());
6516
6517 // Cause QUIC stream to be created.
6518 HttpRequestInfo request_info;
6519 request_info.method = "GET";
6520 request_info.url = GURL("https://www.example.org/");
6521 request_info.traffic_annotation =
6522 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
6523 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
6524 net_log_, CompletionOnceCallback()));
6525
6526 // Ensure that session is alive and active.
6527 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6528 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6529 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6530
6531 // Set up second socket data provider that is used after
6532 // migration. The response to the request is read on this new socket.
6533 MockQuicData socket_data1;
6534 socket_data1.AddWrite(
6535 SYNCHRONOUS, client_maker_.MakePingPacket(3, /*include_version=*/true));
6536 socket_data1.AddRead(
6537 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
6538 false, false));
6539 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
6540 socket_data1.AddWrite(SYNCHRONOUS,
6541 client_maker_.MakeAckAndRstPacket(
6542 4, false, GetNthClientInitiatedStreamId(0),
6543 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
6544 socket_data1.AddSocketDataToFactory(socket_factory_.get());
6545
6546 // Send GET request on stream.
6547 HttpResponseInfo response;
6548 HttpRequestHeaders request_headers;
6549 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6550 callback_.callback()));
6551
6552 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
6553 // Now notify network is disconnected, cause the migration to complete
6554 // immediately.
6555 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6556 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
6557 // There will be two pending task, one will complete migration with no delay
6558 // and the other will attempt to migrate back to the default network with
6559 // delay.
6560 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
6561
6562 // Complete migration.
6563 task_runner->RunUntilIdle();
6564 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
6565
6566 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6567 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6568 EXPECT_EQ(1u, session->GetNumActiveStreams());
6569
6570 // Verify that response headers on the migrated socket were delivered to the
6571 // stream.
6572 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
6573 EXPECT_EQ(200, response.headers->response_code());
6574
6575 // Resume the old socket data, a write error will be delivered to the old
6576 // packet writer. Verify no additional task is posted.
6577 socket_data.Resume();
6578 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
6579
6580 stream.reset();
6581 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6582 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6583 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
6584}
6585
6586// This test verifies that when session successfully migrate to the alternate
6587// network, packet read error on the old reader will be ignored and will not
6588// close the connection.
6589TEST_P(QuicStreamFactoryTest, IgnoreReadErrorFromOldReaderAfterMigration) {
6590 InitializeConnectionMigrationV2Test(
6591 {kDefaultNetworkForTests, kNewNetworkForTests});
6592 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6593 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6594 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6595
6596 // Using a testing task runner.
6597 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
6598 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
6599
6600 MockQuicData socket_data;
6601 quic::QuicStreamOffset header_stream_offset = 0;
6602 socket_data.AddWrite(
6603 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
6604 socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
6605 socket_data.AddRead(ASYNC, ERR_ADDRESS_UNREACHABLE);
6606 socket_data.AddSocketDataToFactory(socket_factory_.get());
6607
6608 // Create request and QuicHttpStream.
6609 QuicStreamRequest request(factory_.get());
6610 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036611 request.Request(
6612 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6613 SocketTag(),
6614 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6615 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shif3d6cddb2018-07-11 03:30:026616 EXPECT_EQ(OK, callback_.WaitForResult());
6617 std::unique_ptr<HttpStream> stream = CreateStream(&request);
6618 EXPECT_TRUE(stream.get());
6619
6620 // Cause QUIC stream to be created.
6621 HttpRequestInfo request_info;
6622 request_info.method = "GET";
6623 request_info.url = GURL("https://www.example.org/");
6624 request_info.traffic_annotation =
6625 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
6626 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
6627 net_log_, CompletionOnceCallback()));
6628
6629 // Ensure that session is alive and active.
6630 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6631 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6632 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6633
6634 // Set up second socket data provider that is used after
6635 // migration. The request is written to this new socket, and the
6636 // response to the request is read on this new socket.
6637 MockQuicData socket_data1;
6638 socket_data1.AddWrite(
6639 SYNCHRONOUS, client_maker_.MakePingPacket(2, /*include_version=*/true));
6640 socket_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
6641 3, GetNthClientInitiatedStreamId(0),
6642 true, true, &header_stream_offset));
6643 socket_data1.AddRead(
6644 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
6645 false, false));
6646 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
6647 socket_data1.AddWrite(SYNCHRONOUS,
6648 client_maker_.MakeAckAndRstPacket(
6649 4, false, GetNthClientInitiatedStreamId(0),
6650 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
6651 socket_data1.AddSocketDataToFactory(socket_factory_.get());
6652
6653 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
6654 // Now notify network is disconnected, cause the migration to complete
6655 // immediately.
6656 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6657 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
6658 // There will be two pending task, one will complete migration with no delay
6659 // and the other will attempt to migrate back to the default network with
6660 // delay.
6661 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
6662
6663 // Complete migration.
6664 task_runner->RunUntilIdle();
6665 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
6666
6667 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6668 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6669 EXPECT_EQ(1u, session->GetNumActiveStreams());
6670
6671 // Send GET request on stream.
6672 HttpResponseInfo response;
6673 HttpRequestHeaders request_headers;
6674 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6675 callback_.callback()));
6676
6677 // Verify that response headers on the migrated socket were delivered to the
6678 // stream.
6679 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
6680 EXPECT_EQ(OK, callback_.WaitForResult());
6681 EXPECT_EQ(200, response.headers->response_code());
6682
6683 // Resume the old socket data, a read error will be delivered to the old
6684 // packet reader. Verify that the session is not affected.
6685 socket_data.Resume();
6686 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
6687 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6688 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6689 EXPECT_EQ(1u, session->GetNumActiveStreams());
6690
6691 stream.reset();
6692 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6693 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6694 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6695 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
6696}
6697
6698// This test verifies that after migration on network is executed, packet
6699// read error on the old reader will be ignored and will not close the
6700// connection.
6701TEST_P(QuicStreamFactoryTest, IgnoreReadErrorOnOldReaderDuringMigration) {
6702 InitializeConnectionMigrationV2Test(
6703 {kDefaultNetworkForTests, kNewNetworkForTests});
6704 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6705 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6706 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6707
6708 // Using a testing task runner.
6709 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
6710 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
6711
6712 MockQuicData socket_data;
6713 quic::QuicStreamOffset header_stream_offset = 0;
6714 socket_data.AddWrite(
6715 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
6716 socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
6717 socket_data.AddRead(ASYNC, ERR_ADDRESS_UNREACHABLE);
6718 socket_data.AddSocketDataToFactory(socket_factory_.get());
6719
6720 // Create request and QuicHttpStream.
6721 QuicStreamRequest request(factory_.get());
6722 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036723 request.Request(
6724 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6725 SocketTag(),
6726 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6727 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shif3d6cddb2018-07-11 03:30:026728 EXPECT_EQ(OK, callback_.WaitForResult());
6729 std::unique_ptr<HttpStream> stream = CreateStream(&request);
6730 EXPECT_TRUE(stream.get());
6731
6732 // Cause QUIC stream to be created.
6733 HttpRequestInfo request_info;
6734 request_info.method = "GET";
6735 request_info.url = GURL("https://www.example.org/");
6736 request_info.traffic_annotation =
6737 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
6738 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
6739 net_log_, CompletionOnceCallback()));
6740
6741 // Ensure that session is alive and active.
6742 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6743 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6744 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6745
6746 // Set up second socket data provider that is used after
6747 // migration. The request is written to this new socket, and the
6748 // response to the request is read on this new socket.
6749 MockQuicData socket_data1;
6750 socket_data1.AddWrite(
6751 SYNCHRONOUS, client_maker_.MakePingPacket(2, /*include_version=*/true));
6752 socket_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
6753 3, GetNthClientInitiatedStreamId(0),
6754 true, true, &header_stream_offset));
6755 socket_data1.AddRead(
6756 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
6757 false, false));
6758 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
6759 socket_data1.AddWrite(SYNCHRONOUS,
6760 client_maker_.MakeAckAndRstPacket(
6761 4, false, GetNthClientInitiatedStreamId(0),
6762 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
6763 socket_data1.AddSocketDataToFactory(socket_factory_.get());
6764
6765 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
6766 // Now notify network is disconnected, cause the migration to complete
6767 // immediately.
6768 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6769 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
6770 // There will be two pending task, one will complete migration with no delay
6771 // and the other will attempt to migrate back to the default network with
6772 // delay.
6773 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
6774
6775 // Resume the old socket data, a read error will be delivered to the old
6776 // packet reader. Verify that the session is not affected.
6777 socket_data.Resume();
6778 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
6779 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6780 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6781 EXPECT_EQ(1u, session->GetNumActiveStreams());
6782
6783 // Complete migration.
6784 task_runner->RunUntilIdle();
6785 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
6786
6787 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6788 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6789 EXPECT_EQ(1u, session->GetNumActiveStreams());
6790
6791 // Send GET request on stream.
6792 HttpResponseInfo response;
6793 HttpRequestHeaders request_headers;
6794 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6795 callback_.callback()));
6796
6797 // Verify that response headers on the migrated socket were delivered to the
6798 // stream.
6799 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
6800 EXPECT_EQ(OK, callback_.WaitForResult());
6801 EXPECT_EQ(200, response.headers->response_code());
6802
6803 stream.reset();
6804 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6805 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6806 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6807 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
6808}
6809
6810// This test verifies that after migration on write error is posted, packet
6811// read error on the old reader will be ignored and will not close the
6812// connection.
6813TEST_P(QuicStreamFactoryTest,
6814 IgnoreReadErrorOnOldReaderDuringPendingMigrationOnWriteError) {
6815 InitializeConnectionMigrationV2Test(
6816 {kDefaultNetworkForTests, kNewNetworkForTests});
6817 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6818 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6819 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6820
6821 // Using a testing task runner.
6822 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
6823 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
6824
6825 MockQuicData socket_data;
6826 quic::QuicStreamOffset header_stream_offset = 0;
6827 socket_data.AddWrite(
6828 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
6829 socket_data.AddWrite(ASYNC, ERR_FAILED); // Write error.
6830 socket_data.AddRead(ASYNC, ERR_ADDRESS_UNREACHABLE); // Read error.
6831 socket_data.AddSocketDataToFactory(socket_factory_.get());
6832
6833 // Create request and QuicHttpStream.
6834 QuicStreamRequest request(factory_.get());
6835 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036836 request.Request(
6837 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6838 SocketTag(),
6839 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6840 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shif3d6cddb2018-07-11 03:30:026841 EXPECT_EQ(OK, callback_.WaitForResult());
6842 std::unique_ptr<HttpStream> stream = CreateStream(&request);
6843 EXPECT_TRUE(stream.get());
6844
6845 // Cause QUIC stream to be created.
6846 HttpRequestInfo request_info;
6847 request_info.method = "GET";
6848 request_info.url = GURL("https://www.example.org/");
6849 request_info.traffic_annotation =
6850 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
6851 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
6852 net_log_, CompletionOnceCallback()));
6853
6854 // Ensure that session is alive and active.
6855 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6856 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6857 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6858
6859 // Set up second socket data provider that is used after
6860 // migration. The request is written to this new socket, and the
6861 // response to the request is read on this new socket.
6862 MockQuicData socket_data1;
6863 socket_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
6864 2, GetNthClientInitiatedStreamId(0),
6865 true, true, &header_stream_offset));
6866 socket_data1.AddRead(
6867 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
6868 false, false));
6869
6870 socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
6871 socket_data1.AddRead(ASYNC, ERR_FAILED); // Read error to close connection.
6872 socket_data1.AddSocketDataToFactory(socket_factory_.get());
6873
6874 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
6875 // Send GET request on stream.
6876 HttpResponseInfo response;
6877 HttpRequestHeaders request_headers;
6878 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6879 callback_.callback()));
6880 // Run the message loop to complete asynchronous write and read with errors.
6881 base::RunLoop().RunUntilIdle();
6882 // There will be one pending task to complete migration on write error.
6883 // Verify session is not closed with read error.
6884 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
6885 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6886 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6887 EXPECT_EQ(1u, session->GetNumActiveStreams());
6888
6889 // Complete migration.
6890 task_runner->RunUntilIdle();
Zhongyi Shia7dd46b2018-07-12 22:59:296891 // There will be one more task posted attempting to migrate back to the
6892 // default network.
6893 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
Zhongyi Shif3d6cddb2018-07-11 03:30:026894 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:296895 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shif3d6cddb2018-07-11 03:30:026896 EXPECT_EQ(1u, session->GetNumActiveStreams());
6897
6898 // Verify that response headers on the migrated socket were delivered to the
6899 // stream.
6900 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
6901 EXPECT_EQ(200, response.headers->response_code());
6902
6903 // Resume to consume the read error on new socket, which will close
6904 // the connection.
6905 socket_data1.Resume();
6906
6907 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6908 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6909 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6910 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
6911}
6912
Zhongyi Shi4ac9e1f2018-06-21 05:21:476913// Migrate on asynchronous write error, old network disconnects after alternate
6914// network connects.
6915TEST_P(QuicStreamFactoryTest,
6916 MigrateSessionOnWriteErrorWithDisconnectAfterConnectAysnc) {
6917 TestMigrationOnWriteErrorWithMultipleNotifications(
6918 ASYNC, /*disconnect_before_connect*/ false);
6919}
6920
6921// Migrate on synchronous write error, old network disconnects after alternate
6922// network connects.
6923TEST_P(QuicStreamFactoryTest,
6924 MigrateSessionOnWriteErrorWithDisconnectAfterConnectSync) {
6925 TestMigrationOnWriteErrorWithMultipleNotifications(
6926 SYNCHRONOUS, /*disconnect_before_connect*/ false);
6927}
6928
6929// Migrate on asynchronous write error, old network disconnects before alternate
6930// network connects.
6931TEST_P(QuicStreamFactoryTest,
6932 MigrateSessionOnWriteErrorWithDisconnectBeforeConnectAysnc) {
6933 TestMigrationOnWriteErrorWithMultipleNotifications(
6934 ASYNC, /*disconnect_before_connect*/ true);
6935}
6936
6937// Migrate on synchronous write error, old network disconnects before alternate
6938// network connects.
6939TEST_P(QuicStreamFactoryTest,
6940 MigrateSessionOnWriteErrorWithDisconnectBeforeConnectSync) {
6941 TestMigrationOnWriteErrorWithMultipleNotifications(
6942 SYNCHRONOUS, /*disconnect_before_connect*/ true);
6943}
6944
6945// Setps up test which verifies that session successfully migrate to alternate
6946// network with signals delivered in the following order:
6947// *NOTE* Signal (A) and (B) can reverse order based on
6948// |disconnect_before_connect|.
6949// - (No alternate network is connected) session connects to
6950// kDefaultNetworkForTests.
6951// - An async/sync write error is encountered based on |write_error_mode|:
6952// session posted task to migrate session on write error.
6953// - Posted task is executed, miration moves to pending state due to lack of
6954// alternate network.
6955// - (A) An alternate network is connected, pending migration completes.
6956// - (B) Old default network disconnects, no migration will be attempted as
Zhongyi Shi329f5cbd2018-06-22 23:51:186957// session has already migrate to the alternate network.
Zhongyi Shi4ac9e1f2018-06-21 05:21:476958// - The alternate network is made default.
jri5b785512016-09-13 04:29:116959void QuicStreamFactoryTestBase::
Zhongyi Shi4ac9e1f2018-06-21 05:21:476960 TestMigrationOnWriteErrorWithMultipleNotifications(
jri5b785512016-09-13 04:29:116961 IoMode write_error_mode,
Zhongyi Shi4ac9e1f2018-06-21 05:21:476962 bool disconnect_before_connect) {
Zhongyi Shi329f5cbd2018-06-22 23:51:186963 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jri5b785512016-09-13 04:29:116964 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6965 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6966 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6967
6968 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:526969 quic::QuicStreamOffset header_stream_offset = 0;
jri5b785512016-09-13 04:29:116970 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
rch5cb522462017-04-25 20:18:366971 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:436972 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
Zhongyi Shi4ac9e1f2018-06-21 05:21:476973 socket_data.AddWrite(write_error_mode, ERR_FAILED); // Write error.
Zhongyi Shi5f587cc2017-11-21 23:24:176974 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri5b785512016-09-13 04:29:116975
6976 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:456977 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:336978 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036979 request.Request(
6980 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6981 SocketTag(),
6982 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6983 failed_on_default_network_callback_, callback_.callback()));
jri5b785512016-09-13 04:29:116984 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:246985 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri5b785512016-09-13 04:29:116986 EXPECT_TRUE(stream.get());
6987
6988 // Cause QUIC stream to be created.
6989 HttpRequestInfo request_info;
6990 request_info.method = "GET";
6991 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:396992 request_info.traffic_annotation =
6993 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:276994 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:396995 net_log_, CompletionOnceCallback()));
jri5b785512016-09-13 04:29:116996
6997 // Ensure that session is alive and active.
6998 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6999 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7000 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7001
7002 // Send GET request on stream. This should cause a write error, which triggers
7003 // a connection migration attempt.
7004 HttpResponseInfo response;
7005 HttpRequestHeaders request_headers;
7006 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
7007 callback_.callback()));
Zhongyi Shi4ac9e1f2018-06-21 05:21:477008 // Run the message loop so that posted task to migrate to socket will be
7009 // executed. A new task will be posted to wait for a new network.
jri5b785512016-09-13 04:29:117010 base::RunLoop().RunUntilIdle();
7011
7012 // In this particular code path, the network will not yet be marked
7013 // as going away and the session will still be alive.
7014 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7015 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7016 EXPECT_EQ(1u, session->GetNumActiveStreams());
7017 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
7018
7019 // Set up second socket data provider that is used after
7020 // migration. The request is rewritten to this new socket, and the
7021 // response to the request is read on this new socket.
7022 MockQuicData socket_data1;
Zhongyi Shi32f2fd02018-04-16 18:23:437023 socket_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
7024 2, GetNthClientInitiatedStreamId(0),
7025 true, true, &header_stream_offset));
7026 socket_data1.AddRead(
7027 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
7028 false, false));
jri5b785512016-09-13 04:29:117029 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437030 socket_data1.AddWrite(SYNCHRONOUS,
7031 client_maker_.MakeAckAndRstPacket(
7032 3, false, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:527033 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:177034 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri5b785512016-09-13 04:29:117035
7036 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7037 ->SetConnectedNetworksList(
7038 {kDefaultNetworkForTests, kNewNetworkForTests});
Zhongyi Shi4ac9e1f2018-06-21 05:21:477039 if (disconnect_before_connect) {
7040 // Now deliver a DISCONNECT notification.
jri5b785512016-09-13 04:29:117041 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7042 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
Zhongyi Shi4ac9e1f2018-06-21 05:21:477043
7044 // Now deliver a CONNECTED notification and completes migration.
jri5b785512016-09-13 04:29:117045 scoped_mock_network_change_notifier_->mock_network_change_notifier()
Zhongyi Shi4ac9e1f2018-06-21 05:21:477046 ->NotifyNetworkConnected(kNewNetworkForTests);
7047 } else {
7048 // Now deliver a CONNECTED notification and completes migration.
7049 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7050 ->NotifyNetworkConnected(kNewNetworkForTests);
7051
7052 // Now deliver a DISCONNECT notification.
7053 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7054 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
jri5b785512016-09-13 04:29:117055 }
jri5b785512016-09-13 04:29:117056 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shi329f5cbd2018-06-22 23:51:187057 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:117058 EXPECT_EQ(1u, session->GetNumActiveStreams());
7059
7060 // This is the callback for the response headers that returned
7061 // pending previously, because no result was available. Check that
7062 // the result is now available due to the successful migration.
7063 EXPECT_THAT(callback_.WaitForResult(), IsOk());
7064 EXPECT_EQ(200, response.headers->response_code());
7065
Zhongyi Shi4ac9e1f2018-06-21 05:21:477066 // Deliver a MADEDEFAULT notification.
jri5b785512016-09-13 04:29:117067 scoped_mock_network_change_notifier_->mock_network_change_notifier()
Zhongyi Shi4ac9e1f2018-06-21 05:21:477068 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
jri5b785512016-09-13 04:29:117069
zhongyi98d6a9262017-05-19 02:47:457070 QuicStreamRequest request2(factory_.get());
Zhongyi Shi329f5cbd2018-06-22 23:51:187071 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
7072 DEFAULT_PRIORITY, SocketTag(),
7073 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:037074 &net_error_details_,
7075 failed_on_default_network_callback_,
7076 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:247077 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
jri5b785512016-09-13 04:29:117078 EXPECT_TRUE(stream2.get());
7079
7080 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi329f5cbd2018-06-22 23:51:187081 EXPECT_EQ(session, GetActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:117082
7083 stream.reset();
7084 stream2.reset();
7085
7086 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7087 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7088 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
7089 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
jri5b785512016-09-13 04:29:117090}
7091
jri217455a12016-07-13 20:15:097092TEST_P(QuicStreamFactoryTest, ServerMigration) {
7093 allow_server_migration_ = true;
7094 Initialize();
7095
7096 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7097 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7098 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7099
rcha00569732016-08-27 11:09:367100 MockQuicData socket_data1;
Ryan Hamilton8d9ee76e2018-05-29 23:52:527101 quic::QuicStreamOffset header_stream_offset = 0;
rcha00569732016-08-27 11:09:367102 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
rch5cb522462017-04-25 20:18:367103 socket_data1.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:437104 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
7105 socket_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
7106 2, GetNthClientInitiatedStreamId(0),
7107 true, true, &header_stream_offset));
Zhongyi Shi5f587cc2017-11-21 23:24:177108 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri217455a12016-07-13 20:15:097109
7110 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:457111 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337112 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037113 request.Request(
7114 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7115 SocketTag(),
7116 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7117 failed_on_default_network_callback_, callback_.callback()));
jri217455a12016-07-13 20:15:097118 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:247119 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri217455a12016-07-13 20:15:097120 EXPECT_TRUE(stream.get());
7121
7122 // Cause QUIC stream to be created.
7123 HttpRequestInfo request_info;
7124 request_info.method = "GET";
7125 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:397126 request_info.traffic_annotation =
7127 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:277128 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:397129 net_log_, CompletionOnceCallback()));
jri217455a12016-07-13 20:15:097130
7131 // Ensure that session is alive and active.
7132 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
7133 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7134 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7135
7136 // Send GET request on stream.
7137 HttpResponseInfo response;
7138 HttpRequestHeaders request_headers;
7139 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
7140 callback_.callback()));
7141
7142 IPEndPoint ip;
7143 session->GetDefaultSocket()->GetPeerAddress(&ip);
7144 DVLOG(1) << "Socket connected to: " << ip.address().ToString() << " "
7145 << ip.port();
7146
7147 // Set up second socket data provider that is used after
7148 // migration. The request is rewritten to this new socket, and the
7149 // response to the request is read on this new socket.
rcha00569732016-08-27 11:09:367150 MockQuicData socket_data2;
7151 socket_data2.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:437152 SYNCHRONOUS, client_maker_.MakePingPacket(3, /*include_version=*/true));
7153 socket_data2.AddRead(
7154 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
7155 false, false));
rcha00569732016-08-27 11:09:367156 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437157 socket_data2.AddWrite(SYNCHRONOUS,
7158 client_maker_.MakeAckAndRstPacket(
7159 4, false, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:527160 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:177161 socket_data2.AddSocketDataToFactory(socket_factory_.get());
jri217455a12016-07-13 20:15:097162
7163 const uint8_t kTestIpAddress[] = {1, 2, 3, 4};
7164 const uint16_t kTestPort = 123;
Zhongyi Shif124a582017-11-02 00:15:047165 session->Migrate(NetworkChangeNotifier::kInvalidNetworkHandle,
7166 IPEndPoint(IPAddress(kTestIpAddress), kTestPort), true,
7167 net_log_);
jri217455a12016-07-13 20:15:097168
7169 session->GetDefaultSocket()->GetPeerAddress(&ip);
7170 DVLOG(1) << "Socket migrated to: " << ip.address().ToString() << " "
7171 << ip.port();
7172
7173 // The session should be alive and active.
7174 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7175 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7176 EXPECT_EQ(1u, session->GetNumActiveStreams());
7177
7178 // Run the message loop so that data queued in the new socket is read by the
7179 // packet reader.
7180 base::RunLoop().RunUntilIdle();
7181
7182 // Verify that response headers on the migrated socket were delivered to the
7183 // stream.
7184 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
7185 EXPECT_EQ(200, response.headers->response_code());
7186
7187 stream.reset();
7188
7189 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
7190 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
7191 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
7192 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
7193}
7194
jri053fdbd2016-08-19 02:33:057195TEST_P(QuicStreamFactoryTest, ServerMigrationIPv4ToIPv4) {
7196 // Add alternate IPv4 server address to config.
7197 IPEndPoint alt_address = IPEndPoint(IPAddress(1, 2, 3, 4), 123);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527198 quic::QuicConfig config;
fayang91ca2012016-11-22 07:42:467199 config.SetAlternateServerAddressToSend(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527200 quic::QuicSocketAddress(quic::QuicSocketAddressImpl(alt_address)));
jri053fdbd2016-08-19 02:33:057201 VerifyServerMigration(config, alt_address);
7202}
7203
7204TEST_P(QuicStreamFactoryTest, ServerMigrationIPv6ToIPv6) {
7205 // Add a resolver rule to make initial connection to an IPv6 address.
Renjiea0cb4a2c2018-09-26 23:37:307206 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
7207 "fe80::aebc:32ff:febb:1e33", "");
jri053fdbd2016-08-19 02:33:057208 // Add alternate IPv6 server address to config.
7209 IPEndPoint alt_address = IPEndPoint(
7210 IPAddress(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16), 123);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527211 quic::QuicConfig config;
fayang91ca2012016-11-22 07:42:467212 config.SetAlternateServerAddressToSend(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527213 quic::QuicSocketAddress(quic::QuicSocketAddressImpl(alt_address)));
jri053fdbd2016-08-19 02:33:057214 VerifyServerMigration(config, alt_address);
7215}
7216
7217TEST_P(QuicStreamFactoryTest, ServerMigrationIPv6ToIPv4) {
7218 // Add a resolver rule to make initial connection to an IPv6 address.
Renjiea0cb4a2c2018-09-26 23:37:307219 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
7220 "fe80::aebc:32ff:febb:1e33", "");
jri053fdbd2016-08-19 02:33:057221 // Add alternate IPv4 server address to config.
7222 IPEndPoint alt_address = IPEndPoint(IPAddress(1, 2, 3, 4), 123);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527223 quic::QuicConfig config;
fayang91ca2012016-11-22 07:42:467224 config.SetAlternateServerAddressToSend(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527225 quic::QuicSocketAddress(quic::QuicSocketAddressImpl(alt_address)));
jri053fdbd2016-08-19 02:33:057226 IPEndPoint expected_address(
7227 ConvertIPv4ToIPv4MappedIPv6(alt_address.address()), alt_address.port());
7228 VerifyServerMigration(config, expected_address);
7229}
7230
7231TEST_P(QuicStreamFactoryTest, ServerMigrationIPv4ToIPv6Fails) {
7232 allow_server_migration_ = true;
7233 Initialize();
7234
7235 // Add a resolver rule to make initial connection to an IPv4 address.
Renjiea0cb4a2c2018-09-26 23:37:307236 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(), "1.2.3.4",
7237 "");
jri053fdbd2016-08-19 02:33:057238 // Add alternate IPv6 server address to config.
7239 IPEndPoint alt_address = IPEndPoint(
7240 IPAddress(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16), 123);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527241 quic::QuicConfig config;
fayang91ca2012016-11-22 07:42:467242 config.SetAlternateServerAddressToSend(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527243 quic::QuicSocketAddress(quic::QuicSocketAddressImpl(alt_address)));
jri053fdbd2016-08-19 02:33:057244
7245 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7246 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7247 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7248
7249 crypto_client_stream_factory_.SetConfig(config);
7250
7251 // Set up only socket data provider.
rcha00569732016-08-27 11:09:367252 MockQuicData socket_data1;
7253 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437254 socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
7255 socket_data1.AddWrite(
7256 SYNCHRONOUS,
7257 client_maker_.MakeRstPacket(2, true, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:527258 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:177259 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri053fdbd2016-08-19 02:33:057260
7261 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:457262 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337263 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037264 request.Request(
7265 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7266 SocketTag(),
7267 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7268 failed_on_default_network_callback_, callback_.callback()));
jri053fdbd2016-08-19 02:33:057269 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:247270 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri053fdbd2016-08-19 02:33:057271 EXPECT_TRUE(stream.get());
7272
7273 // Cause QUIC stream to be created.
7274 HttpRequestInfo request_info;
7275 request_info.method = "GET";
7276 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:397277 request_info.traffic_annotation =
7278 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:277279 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:397280 net_log_, CompletionOnceCallback()));
jri053fdbd2016-08-19 02:33:057281
7282 // Ensure that session is alive and active.
7283 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
7284 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7285 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7286
7287 IPEndPoint actual_address;
7288 session->GetDefaultSocket()->GetPeerAddress(&actual_address);
7289 // No migration should have happened.
7290 IPEndPoint expected_address =
7291 IPEndPoint(IPAddress(1, 2, 3, 4), kDefaultServerPort);
7292 EXPECT_EQ(actual_address, expected_address);
7293 DVLOG(1) << "Socket connected to: " << actual_address.address().ToString()
7294 << " " << actual_address.port();
7295 DVLOG(1) << "Expected address: " << expected_address.address().ToString()
7296 << " " << expected_address.port();
7297
7298 stream.reset();
7299 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
7300 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
7301}
7302
rch02d87792015-09-09 09:05:537303TEST_P(QuicStreamFactoryTest, OnSSLConfigChanged) {
jri7046038f2015-10-22 00:29:267304 Initialize();
rch6faa4d42016-01-05 20:48:437305 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7306 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7307 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7308
rcha00569732016-08-27 11:09:367309 MockQuicData socket_data;
7310 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437311 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Ryan Hamilton8d9ee76e2018-05-29 23:52:527312 socket_data.AddWrite(
7313 SYNCHRONOUS, ConstructClientRstPacket(2, quic::QUIC_RST_ACKNOWLEDGEMENT));
Renjieba55fae2018-09-20 03:05:167314 socket_data.AddWrite(
7315 SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
7316 3, true, quic::QUIC_CONNECTION_CANCELLED, "net error"));
Zhongyi Shi5f587cc2017-11-21 23:24:177317 socket_data.AddSocketDataToFactory(socket_factory_.get());
rch02d87792015-09-09 09:05:537318
rcha00569732016-08-27 11:09:367319 MockQuicData socket_data2;
7320 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437321 socket_data2.AddWrite(SYNCHRONOUS,
7322 ConstructInitialSettingsPacket(1, nullptr));
Zhongyi Shi5f587cc2017-11-21 23:24:177323 socket_data2.AddSocketDataToFactory(socket_factory_.get());
rch02d87792015-09-09 09:05:537324
zhongyi98d6a9262017-05-19 02:47:457325 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337326 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037327 request.Request(
7328 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7329 SocketTag(),
7330 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7331 failed_on_default_network_callback_, callback_.callback()));
rch02d87792015-09-09 09:05:537332
robpercival214763f2016-07-01 23:27:017333 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:247334 std::unique_ptr<HttpStream> stream = CreateStream(&request);
Cherie Shie615a0842018-02-28 02:01:137335 HttpRequestInfo request_info;
7336 request_info.traffic_annotation =
7337 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
7338 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békyd8a21fc32018-06-27 18:29:587339 net_log_, CompletionOnceCallback()));
rch02d87792015-09-09 09:05:537340
nharper642ae4b2016-06-30 00:40:367341 ssl_config_service_->NotifySSLConfigChange();
Cherie Shie615a0842018-02-28 02:01:137342 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
7343 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:267344 EXPECT_FALSE(factory_->require_confirmation());
rch02d87792015-09-09 09:05:537345
7346 // Now attempting to request a stream to the same origin should create
7347 // a new session.
Cherie Shie615a0842018-02-28 02:01:137348
zhongyi98d6a9262017-05-19 02:47:457349 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337350 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037351 request2.Request(
7352 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7353 SocketTag(),
7354 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7355 failed_on_default_network_callback_, callback_.callback()));
rch02d87792015-09-09 09:05:537356
robpercival214763f2016-07-01 23:27:017357 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Cherie Shie615a0842018-02-28 02:01:137358 stream = CreateStream(&request2);
7359 stream.reset(); // Will reset stream 3.
rch02d87792015-09-09 09:05:537360
7361 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7362 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7363 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
7364 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
7365}
7366
rsleevi17784692016-10-12 01:36:207367TEST_P(QuicStreamFactoryTest, OnCertDBChanged) {
jri7046038f2015-10-22 00:29:267368 Initialize();
rch6faa4d42016-01-05 20:48:437369 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7370 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7371 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7372
rcha00569732016-08-27 11:09:367373 MockQuicData socket_data;
7374 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437375 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:177376 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]d7d1e50b2013-11-25 22:08:097377
rcha00569732016-08-27 11:09:367378 MockQuicData socket_data2;
7379 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437380 socket_data2.AddWrite(SYNCHRONOUS,
7381 ConstructInitialSettingsPacket(1, nullptr));
Zhongyi Shi5f587cc2017-11-21 23:24:177382 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]d7d1e50b2013-11-25 22:08:097383
zhongyi98d6a9262017-05-19 02:47:457384 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337385 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037386 request.Request(
7387 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7388 SocketTag(),
7389 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7390 failed_on_default_network_callback_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:097391
robpercival214763f2016-07-01 23:27:017392 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:247393 std::unique_ptr<HttpStream> stream = CreateStream(&request);
Charles 'Buck' Krasic71763c9f2018-02-16 02:37:287394 EXPECT_TRUE(stream);
7395 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
[email protected]d7d1e50b2013-11-25 22:08:097396
7397 // Change the CA cert and verify that stream saw the event.
mattmfd05a1f2017-02-18 06:18:447398 factory_->OnCertDBChanged();
Charles 'Buck' Krasic71763c9f2018-02-16 02:37:287399
jri7046038f2015-10-22 00:29:267400 EXPECT_FALSE(factory_->require_confirmation());
Charles 'Buck' Krasic71763c9f2018-02-16 02:37:287401 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7402 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]d7d1e50b2013-11-25 22:08:097403
7404 // Now attempting to request a stream to the same origin should create
7405 // a new session.
7406
zhongyi98d6a9262017-05-19 02:47:457407 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337408 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037409 request2.Request(
7410 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7411 SocketTag(),
7412 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7413 failed_on_default_network_callback_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:097414
robpercival214763f2016-07-01 23:27:017415 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Charles 'Buck' Krasic71763c9f2018-02-16 02:37:287416 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
7417 EXPECT_TRUE(stream2);
7418 QuicChromiumClientSession* session2 = GetActiveSession(host_port_pair_);
7419 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7420 EXPECT_NE(session, session2);
7421 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7422 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
7423
7424 stream2.reset();
7425 stream.reset();
[email protected]d7d1e50b2013-11-25 22:08:097426
rch37de576c2015-05-17 20:28:177427 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7428 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7429 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
7430 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:097431}
7432
[email protected]1e960032013-12-20 19:00:207433TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
jri7046038f2015-10-22 00:29:267434 Initialize();
rch6faa4d42016-01-05 20:48:437435
rch872e00e2016-12-02 02:48:187436 std::vector<string> cannoncial_suffixes;
[email protected]6e12d702013-11-13 00:17:177437 cannoncial_suffixes.push_back(string(".c.youtube.com"));
7438 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]c49ff182013-09-28 08:33:267439
[email protected]6e12d702013-11-13 00:17:177440 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
7441 string r1_host_name("r1");
7442 string r2_host_name("r2");
7443 r1_host_name.append(cannoncial_suffixes[i]);
7444 r2_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:147445
[email protected]bf4ea2f2014-03-10 22:57:537446 HostPortPair host_port_pair1(r1_host_name, 80);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527447 quic::QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:267448 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
Ryan Hamilton4f0b26e2018-06-27 23:52:327449 quic::QuicServerId server_id1(host_port_pair1.host(),
7450 host_port_pair1.port(), privacy_mode_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527451 quic::QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:377452 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:177453 EXPECT_FALSE(cached1->proof_valid());
7454 EXPECT_TRUE(cached1->source_address_token().empty());
7455
7456 // Mutate the cached1 to have different data.
7457 // TODO(rtenneti): mutate other members of CachedState.
7458 cached1->set_source_address_token(r1_host_name);
7459 cached1->SetProofValid();
7460
[email protected]bf4ea2f2014-03-10 22:57:537461 HostPortPair host_port_pair2(r2_host_name, 80);
Ryan Hamilton4f0b26e2018-06-27 23:52:327462 quic::QuicServerId server_id2(host_port_pair2.host(),
7463 host_port_pair2.port(), privacy_mode_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527464 quic::QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:377465 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:177466 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
7467 EXPECT_TRUE(cached2->proof_valid());
7468 }
[email protected]b70fdb792013-10-25 19:04:147469}
7470
[email protected]1e960032013-12-20 19:00:207471TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
jri7046038f2015-10-22 00:29:267472 Initialize();
rch872e00e2016-12-02 02:48:187473 std::vector<string> cannoncial_suffixes;
[email protected]6e12d702013-11-13 00:17:177474 cannoncial_suffixes.push_back(string(".c.youtube.com"));
7475 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]b70fdb792013-10-25 19:04:147476
[email protected]6e12d702013-11-13 00:17:177477 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
7478 string r3_host_name("r3");
7479 string r4_host_name("r4");
7480 r3_host_name.append(cannoncial_suffixes[i]);
7481 r4_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:147482
[email protected]bf4ea2f2014-03-10 22:57:537483 HostPortPair host_port_pair1(r3_host_name, 80);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527484 quic::QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:267485 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
Ryan Hamilton4f0b26e2018-06-27 23:52:327486 quic::QuicServerId server_id1(host_port_pair1.host(),
7487 host_port_pair1.port(), privacy_mode_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527488 quic::QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:377489 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:177490 EXPECT_FALSE(cached1->proof_valid());
7491 EXPECT_TRUE(cached1->source_address_token().empty());
7492
7493 // Mutate the cached1 to have different data.
7494 // TODO(rtenneti): mutate other members of CachedState.
7495 cached1->set_source_address_token(r3_host_name);
7496 cached1->SetProofInvalid();
7497
[email protected]bf4ea2f2014-03-10 22:57:537498 HostPortPair host_port_pair2(r4_host_name, 80);
Ryan Hamilton4f0b26e2018-06-27 23:52:327499 quic::QuicServerId server_id2(host_port_pair2.host(),
7500 host_port_pair2.port(), privacy_mode_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527501 quic::QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:377502 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:177503 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
7504 EXPECT_TRUE(cached2->source_address_token().empty());
7505 EXPECT_FALSE(cached2->proof_valid());
7506 }
[email protected]c49ff182013-09-28 08:33:267507}
7508
rtenneti34dffe752015-02-24 23:27:327509TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) {
jri7046038f2015-10-22 00:29:267510 Initialize();
Ryan Hamiltona12722b2017-08-12 02:23:207511 factory_->set_require_confirmation(false);
rch6faa4d42016-01-05 20:48:437512 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7513 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7514
jri7046038f2015-10-22 00:29:267515 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti34dffe752015-02-24 23:27:327516
rcha00569732016-08-27 11:09:367517 MockQuicData socket_data;
7518 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:177519 socket_data.AddSocketDataToFactory(socket_factory_.get());
rtenneti34dffe752015-02-24 23:27:327520
7521 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:277522 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:307523 host_resolver_->set_synchronous_mode(true);
7524 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
7525 "192.168.0.1", "");
rtenneti34dffe752015-02-24 23:27:327526
zhongyi98d6a9262017-05-19 02:47:457527 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337528 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
7529 DEFAULT_PRIORITY, SocketTag(),
7530 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:037531 &net_error_details_,
7532 failed_on_default_network_callback_,
7533 callback_.callback()));
rtenneti34dffe752015-02-24 23:27:327534
7535 // If we are waiting for disk cache, we would have posted a task. Verify that
7536 // the CancelWaitForDataReady task hasn't been posted.
7537 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
7538
Yixin Wang7891a39d2017-11-08 20:59:247539 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rtenneti34dffe752015-02-24 23:27:327540 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:177541 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7542 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti34dffe752015-02-24 23:27:327543}
7544
dmurph44ca4f42016-09-09 20:39:097545TEST_P(QuicStreamFactoryTest, ReducePingTimeoutOnConnectionTimeOutOpenStreams) {
7546 reduced_ping_timeout_seconds_ = 10;
dmurph44ca4f42016-09-09 20:39:097547 Initialize();
7548 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7549 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7550 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7551
7552 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
zhongyidd1439f62016-09-02 02:02:267553
7554 MockQuicData socket_data;
7555 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437556 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:177557 socket_data.AddSocketDataToFactory(socket_factory_.get());
zhongyidd1439f62016-09-02 02:02:267558
7559 MockQuicData socket_data2;
7560 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437561 socket_data2.AddWrite(SYNCHRONOUS,
7562 ConstructInitialSettingsPacket(1, nullptr));
Zhongyi Shi5f587cc2017-11-21 23:24:177563 socket_data2.AddSocketDataToFactory(socket_factory_.get());
zhongyidd1439f62016-09-02 02:02:267564
7565 HostPortPair server2(kServer2HostName, kDefaultServerPort);
7566
7567 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:277568 MockCryptoClientStream::CONFIRM_HANDSHAKE);
Renjiea0cb4a2c2018-09-26 23:37:307569 host_resolver_->set_synchronous_mode(true);
7570 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
7571 "192.168.0.1", "");
7572 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
zhongyidd1439f62016-09-02 02:02:267573
7574 // Quic should use default PING timeout when no previous connection times out
7575 // with open stream.
Ryan Hamilton8d9ee76e2018-05-29 23:52:527576 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(quic::kPingTimeoutSecs),
zhongyidd1439f62016-09-02 02:02:267577 QuicStreamFactoryPeer::GetPingTimeout(factory_.get()));
zhongyi98d6a9262017-05-19 02:47:457578 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337579 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
7580 DEFAULT_PRIORITY, SocketTag(),
7581 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:037582 &net_error_details_,
7583 failed_on_default_network_callback_,
7584 callback_.callback()));
zhongyidd1439f62016-09-02 02:02:267585
7586 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527587 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(quic::kPingTimeoutSecs),
zhongyidd1439f62016-09-02 02:02:267588 session->connection()->ping_timeout());
7589
Yixin Wang7891a39d2017-11-08 20:59:247590 std::unique_ptr<HttpStream> stream = CreateStream(&request);
zhongyidd1439f62016-09-02 02:02:267591 EXPECT_TRUE(stream.get());
7592 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:397593 request_info.traffic_annotation =
7594 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:277595 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:397596 net_log_, CompletionOnceCallback()));
zhongyidd1439f62016-09-02 02:02:267597
7598 DVLOG(1)
7599 << "Created 1st session and initialized a stream. Now trigger timeout";
Ryan Hamilton8d9ee76e2018-05-29 23:52:527600 session->connection()->CloseConnection(
7601 quic::QUIC_NETWORK_IDLE_TIMEOUT, "test",
7602 quic::ConnectionCloseBehavior::SILENT_CLOSE);
zhongyidd1439f62016-09-02 02:02:267603 // Need to spin the loop now to ensure that
7604 // QuicStreamFactory::OnSessionClosed() runs.
7605 base::RunLoop run_loop;
7606 run_loop.RunUntilIdle();
7607
zhongyidd1439f62016-09-02 02:02:267608 // The first connection times out with open stream, QUIC should reduce initial
7609 // PING time for subsequent connections.
Ryan Hamilton8d9ee76e2018-05-29 23:52:527610 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(10),
zhongyidd1439f62016-09-02 02:02:267611 QuicStreamFactoryPeer::GetPingTimeout(factory_.get()));
7612
7613 // Test two-in-a-row timeouts with open streams.
7614 DVLOG(1) << "Create 2nd session and timeout with open stream";
7615 TestCompletionCallback callback2;
zhongyi98d6a9262017-05-19 02:47:457616 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:037617 EXPECT_EQ(OK,
7618 request2.Request(
7619 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
7620 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
7621 failed_on_default_network_callback_, callback2.callback()));
zhongyidd1439f62016-09-02 02:02:267622 QuicChromiumClientSession* session2 = GetActiveSession(server2);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527623 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(10),
zhongyidd1439f62016-09-02 02:02:267624 session2->connection()->ping_timeout());
7625
Yixin Wang7891a39d2017-11-08 20:59:247626 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
zhongyidd1439f62016-09-02 02:02:267627 EXPECT_TRUE(stream2.get());
Steven Valdezb4ff0412018-01-18 22:39:277628 EXPECT_EQ(OK,
7629 stream2->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:397630 net_log_, CompletionOnceCallback()));
zhongyidd1439f62016-09-02 02:02:267631 session2->connection()->CloseConnection(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527632 quic::QUIC_NETWORK_IDLE_TIMEOUT, "test",
7633 quic::ConnectionCloseBehavior::SILENT_CLOSE);
zhongyidd1439f62016-09-02 02:02:267634 // Need to spin the loop now to ensure that
7635 // QuicStreamFactory::OnSessionClosed() runs.
7636 base::RunLoop run_loop2;
7637 run_loop2.RunUntilIdle();
zhongyidd1439f62016-09-02 02:02:267638
7639 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7640 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7641 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
7642 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
7643}
7644
tbansal3b966952016-10-25 23:25:147645// Verifies that the QUIC stream factory is initialized correctly.
rtenneticd2aaa15b2015-10-10 20:29:337646TEST_P(QuicStreamFactoryTest, MaybeInitialize) {
tbansal9b1cdf32017-05-10 17:28:397647 VerifyInitialization();
rtenneti8a80a6dc2015-09-21 19:51:137648}
7649
rtennetid073dd22016-08-04 01:58:337650TEST_P(QuicStreamFactoryTest, StartCertVerifyJob) {
7651 Initialize();
7652
rcha00569732016-08-27 11:09:367653 MockQuicData socket_data;
7654 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437655 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:177656 socket_data.AddSocketDataToFactory(socket_factory_.get());
rtennetid073dd22016-08-04 01:58:337657
7658 // Save current state of |race_cert_verification|.
7659 bool race_cert_verification =
7660 QuicStreamFactoryPeer::GetRaceCertVerification(factory_.get());
7661
7662 // Load server config.
7663 HostPortPair host_port_pair(kDefaultServerHostName, kDefaultServerPort);
Ryan Hamilton4f0b26e2018-06-27 23:52:327664 quic::QuicServerId quic_server_id(host_port_pair_.host(),
7665 host_port_pair_.port(),
7666 privacy_mode_ == PRIVACY_MODE_ENABLED);
rtennetid073dd22016-08-04 01:58:337667 QuicStreamFactoryPeer::CacheDummyServerConfig(factory_.get(), quic_server_id);
7668
7669 QuicStreamFactoryPeer::SetRaceCertVerification(factory_.get(), true);
7670 EXPECT_FALSE(HasActiveCertVerifierJob(quic_server_id));
7671
7672 // Start CertVerifyJob.
Ryan Hamilton8d9ee76e2018-05-29 23:52:527673 quic::QuicAsyncStatus status = QuicStreamFactoryPeer::StartCertVerifyJob(
rtennetid073dd22016-08-04 01:58:337674 factory_.get(), quic_server_id, /*cert_verify_flags=*/0, net_log_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527675 if (status == quic::QUIC_PENDING) {
rtennetid073dd22016-08-04 01:58:337676 // Verify CertVerifierJob has started.
7677 EXPECT_TRUE(HasActiveCertVerifierJob(quic_server_id));
7678
7679 while (HasActiveCertVerifierJob(quic_server_id)) {
7680 base::RunLoop().RunUntilIdle();
7681 }
7682 }
7683 // Verify CertVerifierJob has finished.
7684 EXPECT_FALSE(HasActiveCertVerifierJob(quic_server_id));
7685
7686 // Start a QUIC request.
zhongyi98d6a9262017-05-19 02:47:457687 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337688 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037689 request.Request(
7690 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7691 SocketTag(),
7692 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7693 failed_on_default_network_callback_, callback_.callback()));
rtennetid073dd22016-08-04 01:58:337694
7695 EXPECT_EQ(OK, callback_.WaitForResult());
7696
Yixin Wang7891a39d2017-11-08 20:59:247697 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rtennetid073dd22016-08-04 01:58:337698 EXPECT_TRUE(stream.get());
7699
7700 // Restore |race_cert_verification|.
7701 QuicStreamFactoryPeer::SetRaceCertVerification(factory_.get(),
7702 race_cert_verification);
7703
7704 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7705 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7706
7707 // Verify there are no outstanding CertVerifierJobs after request has
7708 // finished.
7709 EXPECT_FALSE(HasActiveCertVerifierJob(quic_server_id));
7710}
7711
rtenneti1cd3b162015-09-29 02:58:287712TEST_P(QuicStreamFactoryTest, YieldAfterPackets) {
jri7046038f2015-10-22 00:29:267713 Initialize();
Ryan Hamiltona12722b2017-08-12 02:23:207714 factory_->set_require_confirmation(false);
rch6faa4d42016-01-05 20:48:437715 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7716 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:267717 QuicStreamFactoryPeer::SetYieldAfterPackets(factory_.get(), 0);
rtenneti1cd3b162015-09-29 02:58:287718
rcha00569732016-08-27 11:09:367719 MockQuicData socket_data;
Zhongyi Shi32f2fd02018-04-16 18:23:437720 socket_data.AddRead(SYNCHRONOUS, ConstructClientConnectionClosePacket(0));
rcha00569732016-08-27 11:09:367721 socket_data.AddRead(ASYNC, OK);
Zhongyi Shi5f587cc2017-11-21 23:24:177722 socket_data.AddSocketDataToFactory(socket_factory_.get());
rtenneti1cd3b162015-09-29 02:58:287723
7724 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:277725 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:307726 host_resolver_->set_synchronous_mode(true);
7727 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
7728 "192.168.0.1", "");
rtenneti1cd3b162015-09-29 02:58:287729
rcha02807b42016-01-29 21:56:157730 // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
7731 // posts a task.
rtenneti1cd3b162015-09-29 02:58:287732 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
rcha02807b42016-01-29 21:56:157733 SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
7734 "StartReading");
rtenneti1cd3b162015-09-29 02:58:287735
zhongyi98d6a9262017-05-19 02:47:457736 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337737 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
7738 DEFAULT_PRIORITY, SocketTag(),
7739 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:037740 &net_error_details_,
7741 failed_on_default_network_callback_,
7742 callback_.callback()));
rtenneti1cd3b162015-09-29 02:58:287743
rcha02807b42016-01-29 21:56:157744 // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
7745 // called.
rtenneti1cd3b162015-09-29 02:58:287746 base::RunLoop run_loop;
7747 run_loop.RunUntilIdle();
7748
7749 // Verify task that the observer's executed_count is 1, which indicates
rcha02807b42016-01-29 21:56:157750 // QuicChromiumPacketReader::StartReading() has posted only one task and
7751 // yielded the read.
rtenneti1cd3b162015-09-29 02:58:287752 EXPECT_EQ(1u, observer.executed_count());
7753
Yixin Wang7891a39d2017-11-08 20:59:247754 std::unique_ptr<HttpStream> stream = CreateStream(&request);
xunjieli2608f9b2016-03-14 13:39:237755 EXPECT_FALSE(stream.get()); // Session is already closed.
rtenneti1cd3b162015-09-29 02:58:287756 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7757 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7758}
7759
7760TEST_P(QuicStreamFactoryTest, YieldAfterDuration) {
jri7046038f2015-10-22 00:29:267761 Initialize();
Ryan Hamiltona12722b2017-08-12 02:23:207762 factory_->set_require_confirmation(false);
rch6faa4d42016-01-05 20:48:437763 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7764 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rtenneti1cd3b162015-09-29 02:58:287765 QuicStreamFactoryPeer::SetYieldAfterDuration(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527766 factory_.get(), quic::QuicTime::Delta::FromMilliseconds(-1));
rtenneti1cd3b162015-09-29 02:58:287767
rcha00569732016-08-27 11:09:367768 MockQuicData socket_data;
Zhongyi Shi32f2fd02018-04-16 18:23:437769 socket_data.AddRead(SYNCHRONOUS, ConstructClientConnectionClosePacket(0));
rcha00569732016-08-27 11:09:367770 socket_data.AddRead(ASYNC, OK);
Zhongyi Shi5f587cc2017-11-21 23:24:177771 socket_data.AddSocketDataToFactory(socket_factory_.get());
rtenneti1cd3b162015-09-29 02:58:287772
7773 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:277774 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:307775 host_resolver_->set_synchronous_mode(true);
7776 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
7777 "192.168.0.1", "");
rtenneti1cd3b162015-09-29 02:58:287778
rcha02807b42016-01-29 21:56:157779 // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
7780 // posts a task.
rtenneti1cd3b162015-09-29 02:58:287781 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
rcha02807b42016-01-29 21:56:157782 SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
7783 "StartReading");
rtenneti1cd3b162015-09-29 02:58:287784
zhongyi98d6a9262017-05-19 02:47:457785 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337786 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
7787 DEFAULT_PRIORITY, SocketTag(),
7788 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:037789 &net_error_details_,
7790 failed_on_default_network_callback_,
7791 callback_.callback()));
rtenneti1cd3b162015-09-29 02:58:287792
rcha02807b42016-01-29 21:56:157793 // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
7794 // called.
rtenneti1cd3b162015-09-29 02:58:287795 base::RunLoop run_loop;
7796 run_loop.RunUntilIdle();
7797
7798 // Verify task that the observer's executed_count is 1, which indicates
rcha02807b42016-01-29 21:56:157799 // QuicChromiumPacketReader::StartReading() has posted only one task and
7800 // yielded the read.
rtenneti1cd3b162015-09-29 02:58:287801 EXPECT_EQ(1u, observer.executed_count());
7802
Yixin Wang7891a39d2017-11-08 20:59:247803 std::unique_ptr<HttpStream> stream = CreateStream(&request);
xunjieli2608f9b2016-03-14 13:39:237804 EXPECT_FALSE(stream.get()); // Session is already closed.
rtenneti1cd3b162015-09-29 02:58:287805 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7806 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7807}
7808
ckrasic3865ee0f2016-02-29 22:04:567809TEST_P(QuicStreamFactoryTest, ServerPushSessionAffinity) {
7810 Initialize();
7811 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7812 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7813
rcha00569732016-08-27 11:09:367814 MockQuicData socket_data;
7815 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437816 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:177817 socket_data.AddSocketDataToFactory(socket_factory_.get());
ckrasic3865ee0f2016-02-29 22:04:567818
zhongyi98d6a9262017-05-19 02:47:457819 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337820 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037821 request.Request(
7822 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7823 SocketTag(),
7824 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7825 failed_on_default_network_callback_, callback_.callback()));
ckrasic3865ee0f2016-02-29 22:04:567826
robpercival214763f2016-07-01 23:27:017827 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:247828 std::unique_ptr<HttpStream> stream = CreateStream(&request);
ckrasic3865ee0f2016-02-29 22:04:567829 EXPECT_TRUE(stream.get());
7830
7831 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
7832
bnc5fdc07162016-05-23 17:36:037833 string url = "https://www.example.org/";
ckrasic3865ee0f2016-02-29 22:04:567834
bnc912a04b2016-04-20 14:19:507835 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic3865ee0f2016-02-29 22:04:567836
Ryan Hamilton8d9ee76e2018-05-29 23:52:527837 quic::QuicClientPromisedInfo promised(
7838 session, GetNthServerInitiatedStreamId(0), kDefaultUrl);
ckrasic3865ee0f2016-02-29 22:04:567839 (*QuicStreamFactoryPeer::GetPushPromiseIndex(factory_.get())
bnc3d9035b32016-06-30 18:18:487840 ->promised_by_url())[kDefaultUrl] = &promised;
ckrasic3865ee0f2016-02-29 22:04:567841
zhongyi98d6a9262017-05-19 02:47:457842 QuicStreamRequest request2(factory_.get());
zhongyia00ca012017-07-06 23:36:397843 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:337844 DEFAULT_PRIORITY, SocketTag(),
7845 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:037846 &net_error_details_,
7847 failed_on_default_network_callback_,
7848 callback_.callback()));
ckrasic3865ee0f2016-02-29 22:04:567849
7850 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
7851}
7852
7853TEST_P(QuicStreamFactoryTest, ServerPushPrivacyModeMismatch) {
7854 Initialize();
7855 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7856 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7857 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7858
rcha00569732016-08-27 11:09:367859 MockQuicData socket_data1;
7860 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437861 socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
7862 socket_data1.AddWrite(
7863 SYNCHRONOUS,
7864 client_maker_.MakeRstPacket(2, true, GetNthServerInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:527865 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:177866 socket_data1.AddSocketDataToFactory(socket_factory_.get());
ckrasic3865ee0f2016-02-29 22:04:567867
rcha00569732016-08-27 11:09:367868 MockQuicData socket_data2;
7869 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437870 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:177871 socket_data2.AddSocketDataToFactory(socket_factory_.get());
ckrasic3865ee0f2016-02-29 22:04:567872
zhongyi98d6a9262017-05-19 02:47:457873 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337874 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037875 request.Request(
7876 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7877 SocketTag(),
7878 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7879 failed_on_default_network_callback_, callback_.callback()));
ckrasic3865ee0f2016-02-29 22:04:567880
robpercival214763f2016-07-01 23:27:017881 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:247882 std::unique_ptr<HttpStream> stream = CreateStream(&request);
ckrasic3865ee0f2016-02-29 22:04:567883 EXPECT_TRUE(stream.get());
7884
7885 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
7886
bnc5fdc07162016-05-23 17:36:037887 string url = "https://www.example.org/";
bnc912a04b2016-04-20 14:19:507888 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic3865ee0f2016-02-29 22:04:567889
Ryan Hamilton8d9ee76e2018-05-29 23:52:527890 quic::QuicClientPromisedInfo promised(
7891 session, GetNthServerInitiatedStreamId(0), kDefaultUrl);
ckrasic3865ee0f2016-02-29 22:04:567892
Ryan Hamilton8d9ee76e2018-05-29 23:52:527893 quic::QuicClientPushPromiseIndex* index =
ckrasic3865ee0f2016-02-29 22:04:567894 QuicStreamFactoryPeer::GetPushPromiseIndex(factory_.get());
7895
bnc3d9035b32016-06-30 18:18:487896 (*index->promised_by_url())[kDefaultUrl] = &promised;
7897 EXPECT_EQ(index->GetPromised(kDefaultUrl), &promised);
ckrasic3865ee0f2016-02-29 22:04:567898
7899 // Doing the request should not use the push stream, but rather
7900 // cancel it because the privacy modes do not match.
zhongyi98d6a9262017-05-19 02:47:457901 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337902 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037903 request2.Request(
7904 host_port_pair_, version_, PRIVACY_MODE_ENABLED,
7905 DEFAULT_PRIORITY, SocketTag(),
7906 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7907 failed_on_default_network_callback_, callback_.callback()));
ckrasic3865ee0f2016-02-29 22:04:567908
7909 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
bnc3d9035b32016-06-30 18:18:487910 EXPECT_EQ(index->GetPromised(kDefaultUrl), nullptr);
ckrasic3865ee0f2016-02-29 22:04:567911
robpercival214763f2016-07-01 23:27:017912 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:247913 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
ckrasic3865ee0f2016-02-29 22:04:567914 EXPECT_TRUE(stream2.get());
7915
7916 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
7917 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
7918 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
7919 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
7920}
7921
Ryan Hamilton8d9ee76e2018-05-29 23:52:527922// Pool to existing session with matching quic::QuicServerId
bnc359ed2a2016-04-29 20:43:457923// even if destination is different.
7924TEST_P(QuicStreamFactoryTest, PoolByOrigin) {
7925 Initialize();
7926
7927 HostPortPair destination1("first.example.com", 443);
7928 HostPortPair destination2("second.example.com", 443);
7929
7930 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7931 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7932
rcha00569732016-08-27 11:09:367933 MockQuicData socket_data;
7934 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437935 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:177936 socket_data.AddSocketDataToFactory(socket_factory_.get());
bnc359ed2a2016-04-29 20:43:457937
zhongyi98d6a9262017-05-19 02:47:457938 QuicStreamRequest request1(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:037939 EXPECT_EQ(
7940 ERR_IO_PENDING,
7941 request1.Request(
7942 destination1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
7943 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7944 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:017945 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:247946 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
bnc359ed2a2016-04-29 20:43:457947 EXPECT_TRUE(stream1.get());
7948 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7949
7950 // Second request returns synchronously because it pools to existing session.
7951 TestCompletionCallback callback2;
zhongyi98d6a9262017-05-19 02:47:457952 QuicStreamRequest request2(factory_.get());
zhongyia00ca012017-07-06 23:36:397953 EXPECT_EQ(OK, request2.Request(destination2, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:337954 DEFAULT_PRIORITY, SocketTag(),
7955 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:037956 &net_error_details_,
7957 failed_on_default_network_callback_,
7958 callback2.callback()));
Yixin Wang7891a39d2017-11-08 20:59:247959 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
bnc359ed2a2016-04-29 20:43:457960 EXPECT_TRUE(stream2.get());
7961
rchf0b18c8a2017-05-05 19:31:577962 QuicChromiumClientSession::Handle* session1 =
7963 QuicHttpStreamPeer::GetSessionHandle(stream1.get());
7964 QuicChromiumClientSession::Handle* session2 =
7965 QuicHttpStreamPeer::GetSessionHandle(stream2.get());
7966 EXPECT_TRUE(session1->SharesSameSession(*session2));
Ryan Hamilton4f0b26e2018-06-27 23:52:327967 EXPECT_EQ(quic::QuicServerId(host_port_pair_.host(), host_port_pair_.port(),
7968 privacy_mode_ == PRIVACY_MODE_ENABLED),
bnc359ed2a2016-04-29 20:43:457969 session1->server_id());
7970
7971 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7972 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7973}
7974
7975class QuicStreamFactoryWithDestinationTest
7976 : public QuicStreamFactoryTestBase,
7977 public ::testing::TestWithParam<PoolingTestParams> {
7978 protected:
7979 QuicStreamFactoryWithDestinationTest()
Yixin Wang079ad542018-01-11 04:06:057980 : QuicStreamFactoryTestBase(
7981 GetParam().version,
7982 GetParam().client_headers_include_h2_stream_dependency),
bnc359ed2a2016-04-29 20:43:457983 destination_type_(GetParam().destination_type),
7984 hanging_read_(SYNCHRONOUS, ERR_IO_PENDING, 0) {}
7985
7986 HostPortPair GetDestination() {
7987 switch (destination_type_) {
7988 case SAME_AS_FIRST:
7989 return origin1_;
7990 case SAME_AS_SECOND:
7991 return origin2_;
7992 case DIFFERENT:
7993 return HostPortPair(kDifferentHostname, 443);
7994 default:
7995 NOTREACHED();
7996 return HostPortPair();
7997 }
7998 }
7999
8000 void AddHangingSocketData() {
8001 std::unique_ptr<SequencedSocketData> sequenced_socket_data(
Ryan Sleevib8d7ea02018-05-07 20:01:018002 new SequencedSocketData(base::make_span(&hanging_read_, 1),
8003 base::span<MockWrite>()));
Zhongyi Shi5f587cc2017-11-21 23:24:178004 socket_factory_->AddSocketDataProvider(sequenced_socket_data.get());
bnc359ed2a2016-04-29 20:43:458005 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
8006 }
8007
8008 bool AllDataConsumed() {
8009 for (const auto& socket_data_ptr : sequenced_socket_data_vector_) {
8010 if (!socket_data_ptr->AllReadDataConsumed() ||
8011 !socket_data_ptr->AllWriteDataConsumed()) {
8012 return false;
8013 }
8014 }
8015 return true;
8016 }
8017
8018 DestinationType destination_type_;
8019 HostPortPair origin1_;
8020 HostPortPair origin2_;
8021 MockRead hanging_read_;
rch872e00e2016-12-02 02:48:188022 std::vector<std::unique_ptr<SequencedSocketData>>
8023 sequenced_socket_data_vector_;
bnc359ed2a2016-04-29 20:43:458024};
8025
Bence Békyce380cb2018-04-26 23:39:558026INSTANTIATE_TEST_CASE_P(VersionIncludeStreamDependencySequence,
bnc359ed2a2016-04-29 20:43:458027 QuicStreamFactoryWithDestinationTest,
8028 ::testing::ValuesIn(GetPoolingTestParams()));
8029
8030// A single QUIC request fails because the certificate does not match the origin
8031// hostname, regardless of whether it matches the alternative service hostname.
8032TEST_P(QuicStreamFactoryWithDestinationTest, InvalidCertificate) {
8033 if (destination_type_ == DIFFERENT)
8034 return;
8035
8036 Initialize();
8037
8038 GURL url("https://mail.example.com/");
8039 origin1_ = HostPortPair::FromURL(url);
8040
8041 // Not used for requests, but this provides a test case where the certificate
8042 // is valid for the hostname of the alternative service.
8043 origin2_ = HostPortPair("mail.example.org", 433);
8044
8045 HostPortPair destination = GetDestination();
8046
8047 scoped_refptr<X509Certificate> cert(
8048 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
Ryan Sleevidef35f62018-01-23 21:12:248049 ASSERT_FALSE(cert->VerifyNameMatch(origin1_.host()));
8050 ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host()));
bnc359ed2a2016-04-29 20:43:458051
8052 ProofVerifyDetailsChromium verify_details;
8053 verify_details.cert_verify_result.verified_cert = cert;
8054 verify_details.cert_verify_result.is_issued_by_known_root = true;
8055 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8056
8057 AddHangingSocketData();
8058
zhongyi98d6a9262017-05-19 02:47:458059 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:038060 EXPECT_EQ(
8061 ERR_IO_PENDING,
8062 request.Request(
8063 destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
8064 /*cert_verify_flags=*/0, url, net_log_, &net_error_details_,
8065 failed_on_default_network_callback_, callback_.callback()));
bnc359ed2a2016-04-29 20:43:458066
robpercival214763f2016-07-01 23:27:018067 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_QUIC_HANDSHAKE_FAILED));
bnc359ed2a2016-04-29 20:43:458068
8069 EXPECT_TRUE(AllDataConsumed());
8070}
8071
8072// QuicStreamRequest is pooled based on |destination| if certificate matches.
8073TEST_P(QuicStreamFactoryWithDestinationTest, SharedCertificate) {
8074 Initialize();
8075
8076 GURL url1("https://www.example.org/");
8077 GURL url2("https://mail.example.org/");
8078 origin1_ = HostPortPair::FromURL(url1);
8079 origin2_ = HostPortPair::FromURL(url2);
8080
8081 HostPortPair destination = GetDestination();
8082
8083 scoped_refptr<X509Certificate> cert(
8084 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
Ryan Sleevidef35f62018-01-23 21:12:248085 ASSERT_TRUE(cert->VerifyNameMatch(origin1_.host()));
8086 ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host()));
8087 ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname));
bnc359ed2a2016-04-29 20:43:458088
8089 ProofVerifyDetailsChromium verify_details;
8090 verify_details.cert_verify_result.verified_cert = cert;
8091 verify_details.cert_verify_result.is_issued_by_known_root = true;
8092 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8093
fayang3bcb8b502016-12-07 21:44:378094 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
Ryan Hamilton8d9ee76e2018-05-29 23:52:528095 std::unique_ptr<quic::QuicEncryptedPacket> settings_packet(
rch5cb522462017-04-25 20:18:368096 client_maker_.MakeInitialSettingsPacket(1, nullptr));
bnceb9aa7112017-01-05 01:03:468097 MockWrite writes[] = {MockWrite(SYNCHRONOUS, settings_packet->data(),
8098 settings_packet->length(), 1)};
fayang3bcb8b502016-12-07 21:44:378099 std::unique_ptr<SequencedSocketData> sequenced_socket_data(
Ryan Sleevib8d7ea02018-05-07 20:01:018100 new SequencedSocketData(reads, writes));
Zhongyi Shi5f587cc2017-11-21 23:24:178101 socket_factory_->AddSocketDataProvider(sequenced_socket_data.get());
fayang3bcb8b502016-12-07 21:44:378102 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
bnc359ed2a2016-04-29 20:43:458103
zhongyi98d6a9262017-05-19 02:47:458104 QuicStreamRequest request1(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:038105 EXPECT_EQ(
8106 ERR_IO_PENDING,
8107 request1.Request(
8108 destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
8109 /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
8110 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:018111 EXPECT_THAT(callback_.WaitForResult(), IsOk());
fayang3bcb8b502016-12-07 21:44:378112
Yixin Wang7891a39d2017-11-08 20:59:248113 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
bnc359ed2a2016-04-29 20:43:458114 EXPECT_TRUE(stream1.get());
8115 EXPECT_TRUE(HasActiveSession(origin1_));
8116
8117 // Second request returns synchronously because it pools to existing session.
8118 TestCompletionCallback callback2;
zhongyi98d6a9262017-05-19 02:47:458119 QuicStreamRequest request2(factory_.get());
zhongyia00ca012017-07-06 23:36:398120 EXPECT_EQ(OK, request2.Request(destination, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:338121 DEFAULT_PRIORITY, SocketTag(),
8122 /*cert_verify_flags=*/0, url2, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:038123 &net_error_details_,
8124 failed_on_default_network_callback_,
8125 callback2.callback()));
Yixin Wang7891a39d2017-11-08 20:59:248126 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
bnc359ed2a2016-04-29 20:43:458127 EXPECT_TRUE(stream2.get());
8128
rchf0b18c8a2017-05-05 19:31:578129 QuicChromiumClientSession::Handle* session1 =
8130 QuicHttpStreamPeer::GetSessionHandle(stream1.get());
8131 QuicChromiumClientSession::Handle* session2 =
8132 QuicHttpStreamPeer::GetSessionHandle(stream2.get());
8133 EXPECT_TRUE(session1->SharesSameSession(*session2));
bnc359ed2a2016-04-29 20:43:458134
Ryan Hamilton4f0b26e2018-06-27 23:52:328135 EXPECT_EQ(quic::QuicServerId(origin1_.host(), origin1_.port(),
8136 privacy_mode_ == PRIVACY_MODE_ENABLED),
8137 session1->server_id());
bnc359ed2a2016-04-29 20:43:458138
8139 EXPECT_TRUE(AllDataConsumed());
8140}
8141
bnc47eba7d2016-07-01 00:43:388142// QuicStreamRequest is not pooled if PrivacyMode differs.
8143TEST_P(QuicStreamFactoryWithDestinationTest, DifferentPrivacyMode) {
8144 Initialize();
8145
8146 GURL url1("https://www.example.org/");
8147 GURL url2("https://mail.example.org/");
8148 origin1_ = HostPortPair::FromURL(url1);
8149 origin2_ = HostPortPair::FromURL(url2);
8150
8151 HostPortPair destination = GetDestination();
8152
8153 scoped_refptr<X509Certificate> cert(
8154 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
Ryan Sleevidef35f62018-01-23 21:12:248155 ASSERT_TRUE(cert->VerifyNameMatch(origin1_.host()));
8156 ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host()));
8157 ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname));
bnc47eba7d2016-07-01 00:43:388158
8159 ProofVerifyDetailsChromium verify_details1;
8160 verify_details1.cert_verify_result.verified_cert = cert;
8161 verify_details1.cert_verify_result.is_issued_by_known_root = true;
8162 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
8163
8164 ProofVerifyDetailsChromium verify_details2;
8165 verify_details2.cert_verify_result.verified_cert = cert;
8166 verify_details2.cert_verify_result.is_issued_by_known_root = true;
8167 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
8168
fayang3bcb8b502016-12-07 21:44:378169 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
Ryan Hamilton8d9ee76e2018-05-29 23:52:528170 std::unique_ptr<quic::QuicEncryptedPacket> settings_packet(
rch5cb522462017-04-25 20:18:368171 client_maker_.MakeInitialSettingsPacket(1, nullptr));
bnceb9aa7112017-01-05 01:03:468172 MockWrite writes[] = {MockWrite(SYNCHRONOUS, settings_packet->data(),
8173 settings_packet->length(), 1)};
fayang3bcb8b502016-12-07 21:44:378174 std::unique_ptr<SequencedSocketData> sequenced_socket_data(
Ryan Sleevib8d7ea02018-05-07 20:01:018175 new SequencedSocketData(reads, writes));
Zhongyi Shi5f587cc2017-11-21 23:24:178176 socket_factory_->AddSocketDataProvider(sequenced_socket_data.get());
fayang3bcb8b502016-12-07 21:44:378177 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
8178 std::unique_ptr<SequencedSocketData> sequenced_socket_data1(
Ryan Sleevib8d7ea02018-05-07 20:01:018179 new SequencedSocketData(reads, writes));
Zhongyi Shi5f587cc2017-11-21 23:24:178180 socket_factory_->AddSocketDataProvider(sequenced_socket_data1.get());
fayang3bcb8b502016-12-07 21:44:378181 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data1));
bnc47eba7d2016-07-01 00:43:388182
zhongyi98d6a9262017-05-19 02:47:458183 QuicStreamRequest request1(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338184 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038185 request1.Request(
8186 destination, version_, PRIVACY_MODE_DISABLED, DEFAULT_PRIORITY,
8187 SocketTag(),
8188 /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
8189 failed_on_default_network_callback_, callback_.callback()));
bnc47eba7d2016-07-01 00:43:388190 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:248191 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
bnc47eba7d2016-07-01 00:43:388192 EXPECT_TRUE(stream1.get());
8193 EXPECT_TRUE(HasActiveSession(origin1_));
8194
8195 TestCompletionCallback callback2;
zhongyi98d6a9262017-05-19 02:47:458196 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338197 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038198 request2.Request(
8199 destination, version_, PRIVACY_MODE_ENABLED, DEFAULT_PRIORITY,
8200 SocketTag(),
8201 /*cert_verify_flags=*/0, url2, net_log_, &net_error_details_,
8202 failed_on_default_network_callback_, callback2.callback()));
bnc47eba7d2016-07-01 00:43:388203 EXPECT_EQ(OK, callback2.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:248204 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
bnc47eba7d2016-07-01 00:43:388205 EXPECT_TRUE(stream2.get());
8206
8207 // |request2| does not pool to the first session, because PrivacyMode does not
8208 // match. Instead, another session is opened to the same destination, but
Ryan Hamilton8d9ee76e2018-05-29 23:52:528209 // with a different quic::QuicServerId.
rchf0b18c8a2017-05-05 19:31:578210 QuicChromiumClientSession::Handle* session1 =
8211 QuicHttpStreamPeer::GetSessionHandle(stream1.get());
8212 QuicChromiumClientSession::Handle* session2 =
8213 QuicHttpStreamPeer::GetSessionHandle(stream2.get());
8214 EXPECT_FALSE(session1->SharesSameSession(*session2));
bnc47eba7d2016-07-01 00:43:388215
Ryan Hamilton4f0b26e2018-06-27 23:52:328216 EXPECT_EQ(quic::QuicServerId(origin1_.host(), origin1_.port(), false),
bnc47eba7d2016-07-01 00:43:388217 session1->server_id());
Ryan Hamilton4f0b26e2018-06-27 23:52:328218 EXPECT_EQ(quic::QuicServerId(origin2_.host(), origin2_.port(), true),
bnc47eba7d2016-07-01 00:43:388219 session2->server_id());
8220
8221 EXPECT_TRUE(AllDataConsumed());
8222}
8223
bnc359ed2a2016-04-29 20:43:458224// QuicStreamRequest is not pooled if certificate does not match its origin.
8225TEST_P(QuicStreamFactoryWithDestinationTest, DisjointCertificate) {
8226 Initialize();
8227
8228 GURL url1("https://news.example.org/");
8229 GURL url2("https://mail.example.com/");
8230 origin1_ = HostPortPair::FromURL(url1);
8231 origin2_ = HostPortPair::FromURL(url2);
8232
8233 HostPortPair destination = GetDestination();
8234
8235 scoped_refptr<X509Certificate> cert1(
8236 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
Ryan Sleevidef35f62018-01-23 21:12:248237 ASSERT_TRUE(cert1->VerifyNameMatch(origin1_.host()));
8238 ASSERT_FALSE(cert1->VerifyNameMatch(origin2_.host()));
8239 ASSERT_FALSE(cert1->VerifyNameMatch(kDifferentHostname));
bnc359ed2a2016-04-29 20:43:458240
8241 ProofVerifyDetailsChromium verify_details1;
8242 verify_details1.cert_verify_result.verified_cert = cert1;
8243 verify_details1.cert_verify_result.is_issued_by_known_root = true;
8244 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
8245
8246 scoped_refptr<X509Certificate> cert2(
8247 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
Ryan Sleevidef35f62018-01-23 21:12:248248 ASSERT_TRUE(cert2->VerifyNameMatch(origin2_.host()));
8249 ASSERT_FALSE(cert2->VerifyNameMatch(kDifferentHostname));
bnc359ed2a2016-04-29 20:43:458250
8251 ProofVerifyDetailsChromium verify_details2;
8252 verify_details2.cert_verify_result.verified_cert = cert2;
8253 verify_details2.cert_verify_result.is_issued_by_known_root = true;
8254 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
8255
fayang3bcb8b502016-12-07 21:44:378256 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
Ryan Hamilton8d9ee76e2018-05-29 23:52:528257 std::unique_ptr<quic::QuicEncryptedPacket> settings_packet(
rch5cb522462017-04-25 20:18:368258 client_maker_.MakeInitialSettingsPacket(1, nullptr));
bnceb9aa7112017-01-05 01:03:468259 MockWrite writes[] = {MockWrite(SYNCHRONOUS, settings_packet->data(),
8260 settings_packet->length(), 1)};
fayang3bcb8b502016-12-07 21:44:378261 std::unique_ptr<SequencedSocketData> sequenced_socket_data(
Ryan Sleevib8d7ea02018-05-07 20:01:018262 new SequencedSocketData(reads, writes));
Zhongyi Shi5f587cc2017-11-21 23:24:178263 socket_factory_->AddSocketDataProvider(sequenced_socket_data.get());
fayang3bcb8b502016-12-07 21:44:378264 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
8265 std::unique_ptr<SequencedSocketData> sequenced_socket_data1(
Ryan Sleevib8d7ea02018-05-07 20:01:018266 new SequencedSocketData(reads, writes));
Zhongyi Shi5f587cc2017-11-21 23:24:178267 socket_factory_->AddSocketDataProvider(sequenced_socket_data1.get());
fayang3bcb8b502016-12-07 21:44:378268 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data1));
bnc359ed2a2016-04-29 20:43:458269
zhongyi98d6a9262017-05-19 02:47:458270 QuicStreamRequest request1(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:038271 EXPECT_EQ(
8272 ERR_IO_PENDING,
8273 request1.Request(
8274 destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
8275 /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
8276 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:018277 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:248278 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
bnc359ed2a2016-04-29 20:43:458279 EXPECT_TRUE(stream1.get());
8280 EXPECT_TRUE(HasActiveSession(origin1_));
8281
8282 TestCompletionCallback callback2;
zhongyi98d6a9262017-05-19 02:47:458283 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:038284 EXPECT_EQ(
8285 ERR_IO_PENDING,
8286 request2.Request(
8287 destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
8288 /*cert_verify_flags=*/0, url2, net_log_, &net_error_details_,
8289 failed_on_default_network_callback_, callback2.callback()));
robpercival214763f2016-07-01 23:27:018290 EXPECT_THAT(callback2.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:248291 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
bnc359ed2a2016-04-29 20:43:458292 EXPECT_TRUE(stream2.get());
8293
8294 // |request2| does not pool to the first session, because the certificate does
8295 // not match. Instead, another session is opened to the same destination, but
Ryan Hamilton8d9ee76e2018-05-29 23:52:528296 // with a different quic::QuicServerId.
rchf0b18c8a2017-05-05 19:31:578297 QuicChromiumClientSession::Handle* session1 =
8298 QuicHttpStreamPeer::GetSessionHandle(stream1.get());
8299 QuicChromiumClientSession::Handle* session2 =
8300 QuicHttpStreamPeer::GetSessionHandle(stream2.get());
8301 EXPECT_FALSE(session1->SharesSameSession(*session2));
bnc359ed2a2016-04-29 20:43:458302
Ryan Hamilton4f0b26e2018-06-27 23:52:328303 EXPECT_EQ(quic::QuicServerId(origin1_.host(), origin1_.port(),
8304 privacy_mode_ == PRIVACY_MODE_ENABLED),
8305 session1->server_id());
8306 EXPECT_EQ(quic::QuicServerId(origin2_.host(), origin2_.port(),
8307 privacy_mode_ == PRIVACY_MODE_ENABLED),
8308 session2->server_id());
bnc359ed2a2016-04-29 20:43:458309
8310 EXPECT_TRUE(AllDataConsumed());
8311}
8312
msramek992625ec2016-08-04 18:33:588313// This test verifies that QuicStreamFactory::ClearCachedStatesInCryptoConfig
8314// correctly transform an origin filter to a ServerIdFilter. Whether the
8315// deletion itself works correctly is tested in QuicCryptoClientConfigTest.
8316TEST_P(QuicStreamFactoryTest, ClearCachedStatesInCryptoConfig) {
8317 Initialize();
Ryan Hamilton8d9ee76e2018-05-29 23:52:528318 quic::QuicCryptoClientConfig* crypto_config =
msramek992625ec2016-08-04 18:33:588319 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
8320
8321 struct TestCase {
8322 TestCase(const std::string& host,
8323 int port,
8324 PrivacyMode privacy_mode,
Ryan Hamilton8d9ee76e2018-05-29 23:52:528325 quic::QuicCryptoClientConfig* crypto_config)
msramek992625ec2016-08-04 18:33:588326 : server_id(host, port, privacy_mode),
8327 state(crypto_config->LookupOrCreate(server_id)) {
rch872e00e2016-12-02 02:48:188328 std::vector<string> certs(1);
msramek992625ec2016-08-04 18:33:588329 certs[0] = "cert";
8330 state->SetProof(certs, "cert_sct", "chlo_hash", "signature");
8331 state->set_source_address_token("TOKEN");
8332 state->SetProofValid();
8333
8334 EXPECT_FALSE(state->certs().empty());
8335 }
8336
Ryan Hamilton8d9ee76e2018-05-29 23:52:528337 quic::QuicServerId server_id;
8338 quic::QuicCryptoClientConfig::CachedState* state;
msramek992625ec2016-08-04 18:33:588339 } test_cases[] = {
8340 TestCase("www.google.com", 443, privacy_mode_, crypto_config),
8341 TestCase("www.example.com", 443, privacy_mode_, crypto_config),
8342 TestCase("www.example.com", 4433, privacy_mode_, crypto_config)};
8343
8344 // Clear cached states for the origin https://www.example.com:4433.
8345 GURL origin("https://www.example.com:4433");
csharrisonebeca8e2016-10-18 02:35:368346 factory_->ClearCachedStatesInCryptoConfig(base::Bind(
8347 static_cast<bool (*)(const GURL&, const GURL&)>(::operator==), origin));
msramek992625ec2016-08-04 18:33:588348 EXPECT_FALSE(test_cases[0].state->certs().empty());
8349 EXPECT_FALSE(test_cases[1].state->certs().empty());
8350 EXPECT_TRUE(test_cases[2].state->certs().empty());
8351
8352 // Clear all cached states.
8353 factory_->ClearCachedStatesInCryptoConfig(
8354 base::Callback<bool(const GURL&)>());
8355 EXPECT_TRUE(test_cases[0].state->certs().empty());
8356 EXPECT_TRUE(test_cases[1].state->certs().empty());
8357 EXPECT_TRUE(test_cases[2].state->certs().empty());
8358}
8359
Yixin Wang46a425f2017-08-10 23:02:208360// Passes connection options and client connection options to QuicStreamFactory,
Ryan Hamilton8d9ee76e2018-05-29 23:52:528361// then checks that its internal quic::QuicConfig is correct.
Yixin Wang46a425f2017-08-10 23:02:208362TEST_P(QuicStreamFactoryTest, ConfigConnectionOptions) {
Ryan Hamilton8d9ee76e2018-05-29 23:52:528363 connection_options_.push_back(quic::kTIME);
8364 connection_options_.push_back(quic::kTBBR);
8365 connection_options_.push_back(quic::kREJ);
Yixin Wang46a425f2017-08-10 23:02:208366
Ryan Hamilton8d9ee76e2018-05-29 23:52:528367 client_connection_options_.push_back(quic::kTBBR);
8368 client_connection_options_.push_back(quic::k1RTT);
Yixin Wang46a425f2017-08-10 23:02:208369
8370 Initialize();
8371
Ryan Hamilton8d9ee76e2018-05-29 23:52:528372 const quic::QuicConfig* config =
8373 QuicStreamFactoryPeer::GetConfig(factory_.get());
Yixin Wang46a425f2017-08-10 23:02:208374 EXPECT_EQ(connection_options_, config->SendConnectionOptions());
8375 EXPECT_TRUE(config->HasClientRequestedIndependentOption(
Ryan Hamilton8d9ee76e2018-05-29 23:52:528376 quic::kTBBR, quic::Perspective::IS_CLIENT));
Yixin Wang46a425f2017-08-10 23:02:208377 EXPECT_TRUE(config->HasClientRequestedIndependentOption(
Ryan Hamilton8d9ee76e2018-05-29 23:52:528378 quic::k1RTT, quic::Perspective::IS_CLIENT));
Yixin Wang46a425f2017-08-10 23:02:208379}
8380
Yixin Wang247ea642017-11-15 01:15:508381// Verifies that the host resolver uses the request priority passed to
8382// QuicStreamRequest::Request().
8383TEST_P(QuicStreamFactoryTest, HostResolverUsesRequestPriority) {
8384 Initialize();
8385 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8386 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8387
8388 MockQuicData socket_data;
8389 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:438390 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:178391 socket_data.AddSocketDataToFactory(socket_factory_.get());
Yixin Wang247ea642017-11-15 01:15:508392
8393 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338394 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038395 request.Request(
8396 host_port_pair_, version_, privacy_mode_, MAXIMUM_PRIORITY,
8397 SocketTag(),
8398 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8399 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang247ea642017-11-15 01:15:508400
8401 EXPECT_THAT(callback_.WaitForResult(), IsOk());
8402 std::unique_ptr<HttpStream> stream = CreateStream(&request);
8403 EXPECT_TRUE(stream.get());
8404
Renjiea0cb4a2c2018-09-26 23:37:308405 EXPECT_EQ(MAXIMUM_PRIORITY, host_resolver_->last_request_priority());
Yixin Wang247ea642017-11-15 01:15:508406
8407 EXPECT_TRUE(socket_data.AllReadDataConsumed());
8408 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
8409}
8410
Yixin Wang469da562017-11-15 21:34:588411// Passes |max_time_before_crypto_handshake_seconds| and
8412// |max_idle_time_before_crypto_handshake_seconds| to QuicStreamFactory, then
Ryan Hamilton8d9ee76e2018-05-29 23:52:528413// checks that its internal quic::QuicConfig is correct.
Yixin Wang469da562017-11-15 21:34:588414TEST_P(QuicStreamFactoryTest, ConfigMaxTimeBeforeCryptoHandshake) {
8415 max_time_before_crypto_handshake_seconds_ = 11;
8416 max_idle_time_before_crypto_handshake_seconds_ = 13;
8417
8418 Initialize();
8419
Ryan Hamilton8d9ee76e2018-05-29 23:52:528420 const quic::QuicConfig* config =
8421 QuicStreamFactoryPeer::GetConfig(factory_.get());
8422 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(11),
Yixin Wang469da562017-11-15 21:34:588423 config->max_time_before_crypto_handshake());
Ryan Hamilton8d9ee76e2018-05-29 23:52:528424 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(13),
Yixin Wang469da562017-11-15 21:34:588425 config->max_idle_time_before_crypto_handshake());
8426}
8427
Yixin Wang7c5d11a82017-12-21 02:40:008428// Verify ResultAfterHostResolutionCallback behavior when host resolution
8429// succeeds asynchronously, then crypto handshake fails synchronously.
8430TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackAsyncSync) {
8431 Initialize();
8432 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8433 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8434
Renjiea0cb4a2c2018-09-26 23:37:308435 host_resolver_->set_ondemand_mode(true);
Yixin Wang7c5d11a82017-12-21 02:40:008436
8437 MockQuicData socket_data;
8438 socket_data.AddRead(SYNCHRONOUS, ERR_FAILED);
8439 socket_data.AddWrite(SYNCHRONOUS, ERR_FAILED);
8440 socket_data.AddSocketDataToFactory(socket_factory_.get());
8441
8442 QuicStreamRequest request(factory_.get());
8443 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038444 request.Request(
8445 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8446 SocketTag(),
8447 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8448 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:008449
8450 TestCompletionCallback host_resolution_callback;
8451 EXPECT_TRUE(
8452 request.WaitForHostResolution(host_resolution_callback.callback()));
8453
8454 // |host_resolver_| has not finished host resolution at this point, so
8455 // |host_resolution_callback| should not have a result.
8456 base::RunLoop().RunUntilIdle();
8457 EXPECT_FALSE(host_resolution_callback.have_result());
8458
8459 // Allow |host_resolver_| to finish host resolution.
8460 // Since the request fails immediately after host resolution (getting
8461 // ERR_FAILED from socket reads/writes), |host_resolution_callback| should be
8462 // called with ERR_QUIC_PROTOCOL_ERROR since that's the next result in
8463 // forming the connection.
Renjiea0cb4a2c2018-09-26 23:37:308464 host_resolver_->ResolveAllPending();
Yixin Wang7c5d11a82017-12-21 02:40:008465 base::RunLoop().RunUntilIdle();
8466 EXPECT_TRUE(host_resolution_callback.have_result());
8467 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, host_resolution_callback.WaitForResult());
8468
8469 // Calling WaitForHostResolution() a second time should return
8470 // false since host resolution has finished already.
8471 EXPECT_FALSE(
8472 request.WaitForHostResolution(host_resolution_callback.callback()));
8473
8474 EXPECT_TRUE(callback_.have_result());
8475 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback_.WaitForResult());
8476}
8477
8478// Verify ResultAfterHostResolutionCallback behavior when host resolution
8479// succeeds asynchronously, then crypto handshake fails asynchronously.
8480TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackAsyncAsync) {
8481 Initialize();
8482 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8483 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8484
Renjiea0cb4a2c2018-09-26 23:37:308485 host_resolver_->set_ondemand_mode(true);
Yixin Wang7c5d11a82017-12-21 02:40:008486 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:278487 MockCryptoClientStream::ZERO_RTT);
Yixin Wang7c5d11a82017-12-21 02:40:008488 factory_->set_require_confirmation(true);
8489
8490 MockQuicData socket_data;
8491 socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
8492 socket_data.AddRead(ASYNC, ERR_FAILED);
8493 socket_data.AddWrite(ASYNC, ERR_FAILED);
8494 socket_data.AddSocketDataToFactory(socket_factory_.get());
8495
8496 QuicStreamRequest request(factory_.get());
8497 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038498 request.Request(
8499 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8500 SocketTag(),
8501 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8502 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:008503
8504 TestCompletionCallback host_resolution_callback;
8505 EXPECT_TRUE(
8506 request.WaitForHostResolution(host_resolution_callback.callback()));
8507
8508 // |host_resolver_| has not finished host resolution at this point, so
8509 // |host_resolution_callback| should not have a result.
8510 base::RunLoop().RunUntilIdle();
8511 EXPECT_FALSE(host_resolution_callback.have_result());
8512
8513 // Allow |host_resolver_| to finish host resolution. Since crypto handshake
8514 // will hang after host resolution, |host_resolution_callback| should run with
8515 // ERR_IO_PENDING since that's the next result in forming the connection.
Renjiea0cb4a2c2018-09-26 23:37:308516 host_resolver_->ResolveAllPending();
Yixin Wang7c5d11a82017-12-21 02:40:008517 base::RunLoop().RunUntilIdle();
8518 EXPECT_TRUE(host_resolution_callback.have_result());
8519 EXPECT_EQ(ERR_IO_PENDING, host_resolution_callback.WaitForResult());
8520
8521 // Calling WaitForHostResolution() a second time should return
8522 // false since host resolution has finished already.
8523 EXPECT_FALSE(
8524 request.WaitForHostResolution(host_resolution_callback.callback()));
8525
8526 EXPECT_FALSE(callback_.have_result());
8527 socket_data.GetSequencedSocketData()->Resume();
8528 base::RunLoop().RunUntilIdle();
8529 EXPECT_TRUE(callback_.have_result());
8530 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback_.WaitForResult());
8531}
8532
8533// Verify ResultAfterHostResolutionCallback behavior when host resolution
8534// succeeds synchronously, then crypto handshake fails synchronously.
8535TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackSyncSync) {
8536 Initialize();
8537 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8538 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8539
Renjiea0cb4a2c2018-09-26 23:37:308540 host_resolver_->set_synchronous_mode(true);
Yixin Wang7c5d11a82017-12-21 02:40:008541
8542 MockQuicData socket_data;
8543 socket_data.AddRead(SYNCHRONOUS, ERR_FAILED);
8544 socket_data.AddWrite(SYNCHRONOUS, ERR_FAILED);
8545 socket_data.AddSocketDataToFactory(socket_factory_.get());
8546
8547 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338548 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR,
Zhongyi Shia6b68d112018-09-24 07:49:038549 request.Request(
8550 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8551 SocketTag(),
8552 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8553 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:008554
8555 // WaitForHostResolution() should return false since host
8556 // resolution has finished already.
8557 TestCompletionCallback host_resolution_callback;
8558 EXPECT_FALSE(
8559 request.WaitForHostResolution(host_resolution_callback.callback()));
8560 base::RunLoop().RunUntilIdle();
8561 EXPECT_FALSE(host_resolution_callback.have_result());
8562 EXPECT_FALSE(callback_.have_result());
8563}
8564
8565// Verify ResultAfterHostResolutionCallback behavior when host resolution
8566// succeeds synchronously, then crypto handshake fails asynchronously.
8567TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackSyncAsync) {
8568 Initialize();
8569 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8570 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8571
8572 // Host resolution will succeed synchronously, but Request() as a whole
8573 // will fail asynchronously.
Renjiea0cb4a2c2018-09-26 23:37:308574 host_resolver_->set_synchronous_mode(true);
Yixin Wang7c5d11a82017-12-21 02:40:008575 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:278576 MockCryptoClientStream::ZERO_RTT);
Yixin Wang7c5d11a82017-12-21 02:40:008577 factory_->set_require_confirmation(true);
8578
8579 MockQuicData socket_data;
8580 socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
8581 socket_data.AddRead(ASYNC, ERR_FAILED);
8582 socket_data.AddWrite(ASYNC, ERR_FAILED);
8583 socket_data.AddSocketDataToFactory(socket_factory_.get());
8584
8585 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338586 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038587 request.Request(
8588 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8589 SocketTag(),
8590 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8591 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:008592
8593 // WaitForHostResolution() should return false since host
8594 // resolution has finished already.
8595 TestCompletionCallback host_resolution_callback;
8596 EXPECT_FALSE(
8597 request.WaitForHostResolution(host_resolution_callback.callback()));
8598 base::RunLoop().RunUntilIdle();
8599 EXPECT_FALSE(host_resolution_callback.have_result());
8600
8601 EXPECT_FALSE(callback_.have_result());
8602 socket_data.GetSequencedSocketData()->Resume();
8603 base::RunLoop().RunUntilIdle();
8604 EXPECT_TRUE(callback_.have_result());
8605 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback_.WaitForResult());
8606}
8607
8608// Verify ResultAfterHostResolutionCallback behavior when host resolution fails
8609// synchronously.
8610TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackFailSync) {
8611 Initialize();
8612 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8613 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8614
8615 // Host resolution will fail synchronously.
Renjiea0cb4a2c2018-09-26 23:37:308616 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
8617 host_resolver_->set_synchronous_mode(true);
Yixin Wang7c5d11a82017-12-21 02:40:008618
8619 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338620 EXPECT_EQ(ERR_NAME_NOT_RESOLVED,
Zhongyi Shia6b68d112018-09-24 07:49:038621 request.Request(
8622 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8623 SocketTag(),
8624 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8625 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:008626
8627 // WaitForHostResolution() should return false since host
8628 // resolution has failed already.
8629 TestCompletionCallback host_resolution_callback;
8630 EXPECT_FALSE(
8631 request.WaitForHostResolution(host_resolution_callback.callback()));
8632 base::RunLoop().RunUntilIdle();
8633 EXPECT_FALSE(host_resolution_callback.have_result());
8634}
8635
8636// Verify ResultAfterHostResolutionCallback behavior when host resolution fails
8637// asynchronously.
8638TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackFailAsync) {
8639 Initialize();
8640 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8641 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8642
Renjiea0cb4a2c2018-09-26 23:37:308643 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
Yixin Wang7c5d11a82017-12-21 02:40:008644
8645 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338646 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038647 request.Request(
8648 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8649 SocketTag(),
8650 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8651 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:008652
8653 TestCompletionCallback host_resolution_callback;
8654 EXPECT_TRUE(
8655 request.WaitForHostResolution(host_resolution_callback.callback()));
8656
8657 // Allow |host_resolver_| to fail host resolution. |host_resolution_callback|
8658 // Should run with ERR_NAME_NOT_RESOLVED since that's the error host
8659 // resolution failed with.
8660 base::RunLoop().RunUntilIdle();
8661 EXPECT_TRUE(host_resolution_callback.have_result());
8662 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, host_resolution_callback.WaitForResult());
8663
8664 EXPECT_TRUE(callback_.have_result());
8665 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
8666}
8667
Renjiea0cb4a2c2018-09-26 23:37:308668// With dns race experiment turned on, and DNS resolve succeeds synchronously,
8669// the final connection is established through the resolved DNS. No racing
8670// connection.
8671TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceAndHostResolutionSync) {
8672 race_stale_dns_on_connection_ = true;
8673 host_resolver_ = std::make_unique<MockCachingHostResolver>();
8674 Initialize();
8675 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8676 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8677
8678 // Set an address in resolver for synchronous return.
8679 host_resolver_->set_synchronous_mode(true);
8680 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
8681 kNonCachedIPAddress, "");
8682
8683 // Set up a different address in stale resolver cache.
8684 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
8685 HostCache::Entry entry(OK,
8686 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
8687 HostCache::Entry::SOURCE_DNS);
8688 base::TimeDelta zero;
8689 HostCache* cache = host_resolver_->GetHostCache();
8690 cache->Set(key, entry, base::TimeTicks::Now(), zero);
8691 // Expire the cache
8692 cache->OnNetworkChange();
8693 MockQuicData quic_data;
8694 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
8695 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
8696 quic_data.AddSocketDataToFactory(socket_factory_.get());
8697
8698 QuicStreamRequest request(factory_.get());
8699 EXPECT_THAT(request.Request(
8700 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8701 SocketTag(),
8702 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8703 failed_on_default_network_callback_, callback_.callback()),
8704 IsOk());
8705 std::unique_ptr<HttpStream> stream = CreateStream(&request);
8706 EXPECT_TRUE(stream.get());
8707 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
8708 EXPECT_EQ(
8709 session->peer_address().impl().socket_address().ToStringWithoutPort(),
8710 kNonCachedIPAddress);
8711
8712 EXPECT_TRUE(quic_data.AllReadDataConsumed());
8713 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
8714}
8715
8716// With dns race experiment on, DNS resolve returns async, no matching cache in
8717// host resolver, connection should be successful and through resolved DNS. No
8718// racing connection.
8719TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceAndHostResolutionAsync) {
8720 race_stale_dns_on_connection_ = true;
8721 host_resolver_ = std::make_unique<MockCachingHostResolver>();
8722 Initialize();
8723 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8724 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8725
8726 // Set an address in resolver for asynchronous return.
8727 host_resolver_->set_ondemand_mode(true);
8728 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
8729 kNonCachedIPAddress, "");
8730
8731 MockQuicData quic_data;
8732 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
8733 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
8734 quic_data.AddSocketDataToFactory(socket_factory_.get());
8735
8736 QuicStreamRequest request(factory_.get());
8737 EXPECT_EQ(ERR_IO_PENDING,
8738 request.Request(
8739 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8740 SocketTag(),
8741 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8742 failed_on_default_network_callback_, callback_.callback()));
8743 TestCompletionCallback host_resolution_callback;
8744 EXPECT_TRUE(
8745 request.WaitForHostResolution(host_resolution_callback.callback()));
8746 base::RunLoop().RunUntilIdle();
8747 EXPECT_FALSE(host_resolution_callback.have_result());
8748
8749 // Cause the host resolution to return.
8750 host_resolver_->ResolveAllPending();
8751 EXPECT_THAT(host_resolution_callback.WaitForResult(), IsOk());
8752 EXPECT_THAT(callback_.WaitForResult(), IsOk());
8753
8754 std::unique_ptr<HttpStream> stream = CreateStream(&request);
8755 EXPECT_TRUE(stream.get());
8756 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
8757
8758 EXPECT_EQ(
8759 session->peer_address().impl().socket_address().ToStringWithoutPort(),
8760 kNonCachedIPAddress);
8761
8762 EXPECT_TRUE(quic_data.AllReadDataConsumed());
8763 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
8764}
8765
8766// With dns race experiment on, DNS resolve returns async, stale dns used,
8767// connects synchrounously, and then the resolved DNS matches.
8768TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsyncStaleMatch) {
8769 race_stale_dns_on_connection_ = true;
8770 host_resolver_ = std::make_unique<MockCachingHostResolver>();
8771 Initialize();
8772 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8773 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8774
8775 // Set an address in resolver for asynchronous return.
8776 host_resolver_->set_ondemand_mode(true);
8777 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
8778 kCachedIPAddress.ToString(), "");
8779
8780 // Set up the same address in the stale resolver cache.
8781 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
8782 HostCache::Entry entry(OK,
8783 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
8784 HostCache::Entry::SOURCE_DNS);
8785 base::TimeDelta zero;
8786 HostCache* cache = host_resolver_->GetHostCache();
8787 cache->Set(key, entry, base::TimeTicks::Now(), zero);
8788 // Expire the cache
8789 cache->OnNetworkChange();
8790
8791 MockQuicData quic_data;
8792 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
8793 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
8794 quic_data.AddSocketDataToFactory(socket_factory_.get());
8795
8796 QuicStreamRequest request(factory_.get());
8797 EXPECT_EQ(ERR_IO_PENDING,
8798 request.Request(
8799 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8800 SocketTag(),
8801 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8802 failed_on_default_network_callback_, callback_.callback()));
8803
8804 // Check that the racing job is running.
8805 EXPECT_TRUE(HasLiveSession(host_port_pair_));
8806 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
8807
8808 // Resolve dns and return.
8809 host_resolver_->ResolveAllPending();
8810 EXPECT_THAT(callback_.WaitForResult(), IsOk());
8811 std::unique_ptr<HttpStream> stream = CreateStream(&request);
8812 EXPECT_TRUE(stream.get());
8813
8814 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
8815
8816 EXPECT_EQ(
8817 session->peer_address().impl().socket_address().ToStringWithoutPort(),
8818 kCachedIPAddress.ToString());
8819
8820 EXPECT_TRUE(quic_data.AllReadDataConsumed());
8821 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
8822}
8823
8824// With dns race experiment on, dns resolve async, stale dns used, connect
8825// async, and then the result matches.
8826TEST_P(QuicStreamFactoryTest,
8827 ResultAfterDNSRaceHostResolveAsyncConnectAsyncStaleMatch) {
8828 race_stale_dns_on_connection_ = true;
8829 host_resolver_ = std::make_unique<MockCachingHostResolver>();
8830 Initialize();
8831 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8832 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8833
8834 // Set an address in resolver for asynchronous return.
8835 host_resolver_->set_ondemand_mode(true);
8836 factory_->set_require_confirmation(true);
8837 crypto_client_stream_factory_.set_handshake_mode(
8838 MockCryptoClientStream::ZERO_RTT);
8839 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
8840 kCachedIPAddress.ToString(), "");
8841
8842 // Set up the same address in the stale resolver cache.
8843 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
8844 HostCache::Entry entry(OK,
8845 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
8846 HostCache::Entry::SOURCE_DNS);
8847 base::TimeDelta zero;
8848 HostCache* cache = host_resolver_->GetHostCache();
8849 cache->Set(key, entry, base::TimeTicks::Now(), zero);
8850 // Expire the cache
8851 cache->OnNetworkChange();
8852
8853 MockQuicData quic_data;
8854 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
8855 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
8856 quic_data.AddSocketDataToFactory(socket_factory_.get());
8857
8858 QuicStreamRequest request(factory_.get());
8859 EXPECT_EQ(ERR_IO_PENDING,
8860 request.Request(
8861 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8862 SocketTag(),
8863 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8864 failed_on_default_network_callback_, callback_.callback()));
8865
8866 // Send Crypto handshake so connect will call back.
8867 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
8868 quic::QuicSession::HANDSHAKE_CONFIRMED);
8869 base::RunLoop().RunUntilIdle();
8870
8871 // Check that the racing job is running.
8872 EXPECT_TRUE(HasLiveSession(host_port_pair_));
8873 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
8874
8875 // Resolve dns and call back, make sure job finishes.
8876 host_resolver_->ResolveAllPending();
8877 EXPECT_THAT(callback_.WaitForResult(), IsOk());
8878
8879 std::unique_ptr<HttpStream> stream = CreateStream(&request);
8880 EXPECT_TRUE(stream.get());
8881
8882 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
8883
8884 EXPECT_EQ(
8885 session->peer_address().impl().socket_address().ToStringWithoutPort(),
8886 kCachedIPAddress.ToString());
8887
8888 EXPECT_TRUE(quic_data.AllReadDataConsumed());
8889 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
8890}
8891
8892// With dns race experiment on, dns resolve async, stale dns used, dns resolve
8893// return, then connection finishes and matches with the result.
8894TEST_P(QuicStreamFactoryTest,
8895 ResultAfterDNSRaceHostResolveAsyncStaleMatchConnectAsync) {
8896 race_stale_dns_on_connection_ = true;
8897 host_resolver_ = std::make_unique<MockCachingHostResolver>();
8898 Initialize();
8899 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8900 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8901
8902 // Set an address in resolver for asynchronous return.
8903 host_resolver_->set_ondemand_mode(true);
8904 factory_->set_require_confirmation(true);
8905 crypto_client_stream_factory_.set_handshake_mode(
8906 MockCryptoClientStream::ZERO_RTT);
8907 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
8908 kCachedIPAddress.ToString(), "");
8909
8910 // Set up the same address in the stale resolver cache.
8911 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
8912 HostCache::Entry entry(OK,
8913 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
8914 HostCache::Entry::SOURCE_DNS);
8915 base::TimeDelta zero;
8916 HostCache* cache = host_resolver_->GetHostCache();
8917 cache->Set(key, entry, base::TimeTicks::Now(), zero);
8918 // Expire the cache
8919 cache->OnNetworkChange();
8920
8921 MockQuicData quic_data;
8922 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
8923 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
8924 quic_data.AddSocketDataToFactory(socket_factory_.get());
8925
8926 QuicStreamRequest request(factory_.get());
8927 EXPECT_EQ(ERR_IO_PENDING,
8928 request.Request(
8929 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8930 SocketTag(),
8931 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8932 failed_on_default_network_callback_, callback_.callback()));
8933
8934 // Finish dns async, check we still need to wait for stale connection async.
8935 host_resolver_->ResolveAllPending();
8936 base::RunLoop().RunUntilIdle();
8937 EXPECT_FALSE(callback_.have_result());
8938
8939 // Finish stale connection async, and the stale connection should pass dns
8940 // validation.
8941 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
8942 quic::QuicSession::HANDSHAKE_CONFIRMED);
8943 EXPECT_THAT(callback_.WaitForResult(), IsOk());
8944 std::unique_ptr<HttpStream> stream = CreateStream(&request);
8945 EXPECT_TRUE(stream.get());
8946
8947 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
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 used and connects
8957// sync, but dns no match
8958TEST_P(QuicStreamFactoryTest,
8959 ResultAfterDNSRaceHostResolveAsyncStaleSyncNoMatch) {
8960 race_stale_dns_on_connection_ = true;
8961 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 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
8969 kNonCachedIPAddress, "");
8970
8971 // Set up a different address in the stale resolver cache.
8972 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
8973 HostCache::Entry entry(OK,
8974 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
8975 HostCache::Entry::SOURCE_DNS);
8976 base::TimeDelta zero;
8977 HostCache* cache = host_resolver_->GetHostCache();
8978 cache->Set(key, entry, base::TimeTicks::Now(), zero);
8979 // Expire the cache
8980 cache->OnNetworkChange();
8981
8982 // Socket for the stale connection which will invoke connection closure.
8983 MockQuicData quic_data;
8984 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
8985 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
8986 quic_data.AddWrite(
8987 SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
8988 2, true, quic::QUIC_CONNECTION_CANCELLED, "net error"));
8989 quic_data.AddSocketDataToFactory(socket_factory_.get());
8990
8991 // Socket for the new connection.
8992 MockQuicData quic_data2;
8993 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
8994 quic_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
8995 quic_data2.AddSocketDataToFactory(socket_factory_.get());
8996
8997 QuicStreamRequest request(factory_.get());
8998 EXPECT_EQ(ERR_IO_PENDING,
8999 request.Request(
9000 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9001 SocketTag(),
9002 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9003 failed_on_default_network_callback_, callback_.callback()));
9004
9005 // Check the stale connection is running.
9006 EXPECT_TRUE(HasLiveSession(host_port_pair_));
9007 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9008
9009 // Finish dns resolution and check the job has finished.
9010 host_resolver_->ResolveAllPending();
9011 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9012
9013 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9014 EXPECT_TRUE(stream.get());
9015
9016 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9017
9018 EXPECT_EQ(
9019 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9020 kNonCachedIPAddress);
9021
9022 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9023 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9024 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
9025 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
9026}
9027
9028// With dns race experiment on, dns resolve async, stale used and connects
9029// async, finishes before dns, but no match
9030TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleAsyncResolveAsyncNoMatch) {
9031 race_stale_dns_on_connection_ = true;
9032 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9033 Initialize();
9034 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9035 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9036
9037 // Set an address in resolver for asynchronous return.
9038 host_resolver_->set_ondemand_mode(true);
9039 factory_->set_require_confirmation(true);
9040 crypto_client_stream_factory_.set_handshake_mode(
9041 MockCryptoClientStream::ZERO_RTT);
9042 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9043 kNonCachedIPAddress, "");
9044
9045 // Set up a different address in the stale resolvercache.
9046 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9047 HostCache::Entry entry(OK,
9048 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9049 HostCache::Entry::SOURCE_DNS);
9050 base::TimeDelta zero;
9051 HostCache* cache = host_resolver_->GetHostCache();
9052 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9053 // Expire the cache
9054 cache->OnNetworkChange();
9055
9056 MockQuicData quic_data;
9057 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9058 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9059 quic_data.AddWrite(
9060 SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
9061 2, true, quic::QUIC_CONNECTION_CANCELLED, "net error"));
9062 quic_data.AddSocketDataToFactory(socket_factory_.get());
9063
9064 MockQuicData quic_data2;
9065 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9066 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9067
9068 QuicStreamRequest request(factory_.get());
9069 EXPECT_EQ(ERR_IO_PENDING,
9070 request.Request(
9071 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9072 SocketTag(),
9073 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9074 failed_on_default_network_callback_, callback_.callback()));
9075
9076 // Finish the stale connection.
9077 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
9078 quic::QuicSession::HANDSHAKE_CONFIRMED);
9079 base::RunLoop().RunUntilIdle();
9080 EXPECT_TRUE(HasLiveSession(host_port_pair_));
9081 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9082
9083 // Finish host resolution and check the job is done.
9084 host_resolver_->ResolveAllPending();
9085 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9086
9087 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9088 EXPECT_TRUE(stream.get());
9089
9090 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9091 EXPECT_EQ(
9092 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9093 kNonCachedIPAddress);
9094
9095 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9096 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9097 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
9098 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
9099}
9100
9101// With dns race experiment on, dns resolve async, stale used and connects
9102// async, dns finishes first, but no match
9103TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceResolveAsyncStaleAsyncNoMatch) {
9104 race_stale_dns_on_connection_ = true;
9105 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9106 Initialize();
9107 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9108 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9109
9110 // Set an address in resolver for asynchronous return.
9111 host_resolver_->set_ondemand_mode(true);
9112 factory_->set_require_confirmation(true);
9113 crypto_client_stream_factory_.set_handshake_mode(
9114 MockCryptoClientStream::ZERO_RTT);
9115 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9116 kNonCachedIPAddress, "");
9117
9118 // Set up a different address in the stale resolver cache.
9119 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9120 HostCache::Entry entry(OK,
9121 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9122 HostCache::Entry::SOURCE_DNS);
9123 base::TimeDelta zero;
9124 HostCache* cache = host_resolver_->GetHostCache();
9125 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9126 // Expire the cache
9127 cache->OnNetworkChange();
9128
9129 MockQuicData quic_data;
9130 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9131 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9132 quic_data.AddWrite(
9133 SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
9134 2, true, quic::QUIC_CONNECTION_CANCELLED, "net error"));
9135 quic_data.AddSocketDataToFactory(socket_factory_.get());
9136
9137 MockQuicData quic_data2;
9138 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9139 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9140
9141 QuicStreamRequest request(factory_.get());
9142 EXPECT_EQ(ERR_IO_PENDING,
9143 request.Request(
9144 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9145 SocketTag(),
9146 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9147 failed_on_default_network_callback_, callback_.callback()));
9148 // Finish dns resolution, but need to wait for stale connection.
9149 host_resolver_->ResolveAllPending();
9150 EXPECT_FALSE(callback_.have_result());
9151
9152 // Finish stale connection and expect the job to be done.
9153 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
9154 quic::QuicSession::HANDSHAKE_CONFIRMED);
9155 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9156
9157 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9158 EXPECT_TRUE(stream.get());
9159
9160 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9161 EXPECT_EQ(
9162 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9163 kNonCachedIPAddress);
9164
9165 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9166 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9167 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
9168 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
9169}
9170
9171// With dns race experiment on, dns resolve returns error sync, same behavior
9172// as experiment is not on
9173TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveError) {
9174 race_stale_dns_on_connection_ = true;
9175 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9176 Initialize();
9177 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9178 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9179
9180 // Set synchronous failure in resolver.
9181 host_resolver_->set_synchronous_mode(true);
9182 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
9183
9184 MockQuicData quic_data;
9185 quic_data.AddSocketDataToFactory(socket_factory_.get());
9186 QuicStreamRequest request(factory_.get());
9187
9188 EXPECT_EQ(ERR_NAME_NOT_RESOLVED,
9189 request.Request(
9190 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9191 SocketTag(),
9192 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9193 failed_on_default_network_callback_, callback_.callback()));
9194}
9195
9196// With dns race experiment on, no cache available, dns resolve returns error
9197// async
9198TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsyncError) {
9199 race_stale_dns_on_connection_ = true;
9200 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9201 Initialize();
9202 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9203 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9204
9205 // Set asynchronous failure in resolver.
9206 host_resolver_->set_ondemand_mode(true);
9207 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
9208
9209 MockQuicData quic_data;
9210 quic_data.AddSocketDataToFactory(socket_factory_.get());
9211 QuicStreamRequest request(factory_.get());
9212
9213 EXPECT_EQ(ERR_IO_PENDING,
9214 request.Request(
9215 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9216 SocketTag(),
9217 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9218 failed_on_default_network_callback_, callback_.callback()));
9219
9220 // Resolve and expect result that shows the resolution error.
9221 host_resolver_->ResolveAllPending();
9222 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
9223}
9224
9225// With dns race experiment on, dns resolve async, staled used and connects
9226// sync, dns returns error and no connection is established.
9227TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleSyncHostResolveError) {
9228 race_stale_dns_on_connection_ = true;
9229 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9230 Initialize();
9231 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9232 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9233
9234 // Set asynchronous failure in resolver.
9235 host_resolver_->set_ondemand_mode(true);
9236 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
9237
9238 // Set up an address in the stale cache.
9239 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9240 HostCache::Entry entry(OK,
9241 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9242 HostCache::Entry::SOURCE_DNS);
9243 base::TimeDelta zero;
9244 HostCache* cache = host_resolver_->GetHostCache();
9245 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9246 // Expire the cache
9247 cache->OnNetworkChange();
9248
9249 // Socket for the stale connection which is supposed to disconnect.
9250 MockQuicData quic_data;
9251 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9252 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9253 quic_data.AddWrite(
9254 SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
9255 2, true, quic::QUIC_CONNECTION_CANCELLED, "net error"));
9256 quic_data.AddSocketDataToFactory(socket_factory_.get());
9257
9258 QuicStreamRequest request(factory_.get());
9259 EXPECT_EQ(ERR_IO_PENDING,
9260 request.Request(
9261 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9262 SocketTag(),
9263 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9264 failed_on_default_network_callback_, callback_.callback()));
9265
9266 // Check that the stale connection is running.
9267 EXPECT_TRUE(HasLiveSession(host_port_pair_));
9268 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9269
9270 // Finish host resolution.
9271 host_resolver_->ResolveAllPending();
9272 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
9273
9274 EXPECT_FALSE(HasLiveSession(host_port_pair_));
9275
9276 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9277 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9278}
9279
9280// With dns race experiment on, dns resolve async, stale used and connection
9281// return error, then dns matches
9282TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSMatches) {
9283 race_stale_dns_on_connection_ = true;
9284 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9285 Initialize();
9286 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9287 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9288
9289 // Set an address in host resolver for asynchronous return.
9290 host_resolver_->set_ondemand_mode(true);
9291 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9292 kCachedIPAddress.ToString(), "");
9293
9294 // Set up the same address in the stale resolver cache.
9295 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9296 HostCache::Entry entry(OK,
9297 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9298 HostCache::Entry::SOURCE_DNS);
9299 base::TimeDelta zero;
9300 HostCache* cache = host_resolver_->GetHostCache();
9301 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9302 // Expire the cache
9303 cache->OnNetworkChange();
9304
9305 // Simulate synchronous connect failure.
9306 MockQuicData quic_data;
9307 quic_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
9308 quic_data.AddSocketDataToFactory(socket_factory_.get());
9309
9310 MockQuicData quic_data2;
9311 quic_data2.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
9312 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9313
9314 QuicStreamRequest request(factory_.get());
9315 EXPECT_EQ(ERR_IO_PENDING,
9316 request.Request(
9317 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9318 SocketTag(),
9319 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9320 failed_on_default_network_callback_, callback_.callback()));
9321 EXPECT_FALSE(HasLiveSession(host_port_pair_));
9322 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9323
9324 host_resolver_->ResolveAllPending();
9325 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_ADDRESS_IN_USE));
9326}
9327
9328// With dns race experiment on, dns resolve async, stale used and connection
9329// returns error, dns no match, new connection is established
9330TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSNoMatch) {
9331 race_stale_dns_on_connection_ = true;
9332 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9333 Initialize();
9334 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9335 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9336
9337 // Set an address in host resolver.
9338 host_resolver_->set_ondemand_mode(true);
9339 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9340 kNonCachedIPAddress, "");
9341
9342 // Set up a different address in stale resolver cache.
9343 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9344 HostCache::Entry entry(OK,
9345 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9346 HostCache::Entry::SOURCE_DNS);
9347 base::TimeDelta zero;
9348 HostCache* cache = host_resolver_->GetHostCache();
9349 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9350 // Expire the cache
9351 cache->OnNetworkChange();
9352
9353 // Add failure for the stale connection.
9354 MockQuicData quic_data;
9355 quic_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
9356 quic_data.AddSocketDataToFactory(socket_factory_.get());
9357
9358 MockQuicData quic_data2;
9359 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9360 quic_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9361 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9362
9363 QuicStreamRequest request(factory_.get());
9364 EXPECT_EQ(ERR_IO_PENDING,
9365 request.Request(
9366 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9367 SocketTag(),
9368 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9369 failed_on_default_network_callback_, callback_.callback()));
9370
9371 // Check that the stale connection fails.
9372 EXPECT_FALSE(HasLiveSession(host_port_pair_));
9373 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9374
9375 // Finish host resolution and check the job finishes ok.
9376 host_resolver_->ResolveAllPending();
9377 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9378
9379 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9380 EXPECT_TRUE(stream.get());
9381
9382 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9383
9384 EXPECT_EQ(
9385 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9386 kNonCachedIPAddress);
9387
9388 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
9389 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
9390}
9391
9392// With dns race experiment on, dns resolve async, stale used and connection
9393// returns error, dns no match, new connection error
9394TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSNoMatchError) {
9395 race_stale_dns_on_connection_ = true;
9396 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9397 Initialize();
9398 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9399 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9400
9401 // Set an address in host resolver asynchronously.
9402 host_resolver_->set_ondemand_mode(true);
9403 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9404 kNonCachedIPAddress, "");
9405
9406 // Set up a different address in the stale cache.
9407 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9408 HostCache::Entry entry(OK,
9409 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9410 HostCache::Entry::SOURCE_DNS);
9411 base::TimeDelta zero;
9412 HostCache* cache = host_resolver_->GetHostCache();
9413 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9414 // Expire the cache
9415 cache->OnNetworkChange();
9416
9417 // Add failure for stale connection.
9418 MockQuicData quic_data;
9419 quic_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
9420 quic_data.AddSocketDataToFactory(socket_factory_.get());
9421
9422 // Add failure for resolved dns connection.
9423 MockQuicData quic_data2;
9424 quic_data2.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
9425 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9426
9427 QuicStreamRequest request(factory_.get());
9428 EXPECT_EQ(ERR_IO_PENDING,
9429 request.Request(
9430 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9431 SocketTag(),
9432 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9433 failed_on_default_network_callback_, callback_.callback()));
9434
9435 // Check the stale connection fails.
9436 EXPECT_FALSE(HasLiveSession(host_port_pair_));
9437 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9438
9439 // Check the resolved dns connection fails.
9440 host_resolver_->ResolveAllPending();
9441 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_ADDRESS_IN_USE));
9442}
9443
9444// With dns race experiment on, dns resolve async and stale connect async, dns
9445// resolve returns error and then preconnect finishes
9446TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceResolveAsyncErrorStaleAsync) {
9447 race_stale_dns_on_connection_ = true;
9448 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9449 Initialize();
9450 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9451 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9452
9453 // Add asynchronous failure in host resolver.
9454 host_resolver_->set_ondemand_mode(true);
9455 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
9456 factory_->set_require_confirmation(true);
9457 crypto_client_stream_factory_.set_handshake_mode(
9458 MockCryptoClientStream::ZERO_RTT);
9459
9460 // Set up an address in stale resolver cache.
9461 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9462 HostCache::Entry entry(OK,
9463 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9464 HostCache::Entry::SOURCE_DNS);
9465 base::TimeDelta zero;
9466 HostCache* cache = host_resolver_->GetHostCache();
9467 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9468 // Expire the cache
9469 cache->OnNetworkChange();
9470
9471 // Socket data for stale connection which is supposed to disconnect.
9472 MockQuicData quic_data;
9473 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9474 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_INITIAL);
9475 quic_data.AddWrite(
9476 SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
9477 1, true, quic::QUIC_CONNECTION_CANCELLED, "net error"));
9478 quic_data.AddSocketDataToFactory(socket_factory_.get());
9479
9480 QuicStreamRequest request(factory_.get());
9481 EXPECT_EQ(ERR_IO_PENDING,
9482 request.Request(
9483 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9484 SocketTag(),
9485 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9486 failed_on_default_network_callback_, callback_.callback()));
9487
9488 // host resolution returned but stale connection hasn't finished yet.
9489 host_resolver_->ResolveAllPending();
9490 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
9491
9492 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9493 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9494}
9495
9496// With dns race experiment on, dns resolve async and stale connect async, dns
9497// resolve returns fine then preconnect fails
9498TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceResolveAsyncStaleAsyncError) {
9499 race_stale_dns_on_connection_ = true;
9500 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9501 Initialize();
9502 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9503 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9504
9505 // Set asynchronous fresh address in host resolver.
9506 host_resolver_->set_ondemand_mode(true);
9507 factory_->set_require_confirmation(true);
9508 crypto_client_stream_factory_.set_handshake_mode(
9509 MockCryptoClientStream::ZERO_RTT);
9510 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9511 kNonCachedIPAddress, "");
9512
9513 // Set up an address in stale resolver cache.
9514 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9515 HostCache::Entry entry(OK,
9516 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9517 HostCache::Entry::SOURCE_DNS);
9518 base::TimeDelta zero;
9519 HostCache* cache = host_resolver_->GetHostCache();
9520 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9521 // Expire the cache
9522 cache->OnNetworkChange();
9523
9524 MockQuicData quic_data;
9525 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9526 quic_data.AddSocketDataToFactory(socket_factory_.get());
9527
9528 MockQuicData quic_data2;
9529 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9530 quic_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9531 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9532
9533 QuicStreamRequest request(factory_.get());
9534 EXPECT_EQ(ERR_IO_PENDING,
9535 request.Request(
9536 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9537 SocketTag(),
9538 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9539 failed_on_default_network_callback_, callback_.callback()));
9540
9541 // Host resolution finishes but stale connection is still running.
9542 host_resolver_->ResolveAllPending();
9543 base::RunLoop().RunUntilIdle();
9544 EXPECT_FALSE(callback_.have_result());
9545
9546 // Kill the session so that crypto connect will return error.
9547 QuicChromiumClientSession* session = GetPendingSession(host_port_pair_);
9548 session->CloseSessionOnError(ERR_ABORTED, quic::QUIC_INTERNAL_ERROR,
9549 quic::ConnectionCloseBehavior::SILENT_CLOSE);
9550 EXPECT_FALSE(callback_.have_result());
9551
9552 // Send crypto handshake for the new connection and check that it finishes.
9553 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
9554 quic::QuicSession::HANDSHAKE_CONFIRMED);
9555 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9556
9557 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9558 EXPECT_TRUE(stream.get());
9559
9560 QuicChromiumClientSession* session2 = GetActiveSession(host_port_pair_);
9561
9562 EXPECT_EQ(
9563 session2->peer_address().impl().socket_address().ToStringWithoutPort(),
9564 kNonCachedIPAddress);
9565
9566 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9567 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9568 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
9569 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
9570}
9571
9572// With dns race experiment on, dns resolve async and stale connect async, dns
9573// resolve returns error and then preconnect fails.
9574TEST_P(QuicStreamFactoryTest,
9575 ResultAfterDNSRaceResolveAsyncErrorStaleAsyncError) {
9576 race_stale_dns_on_connection_ = true;
9577 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9578 Initialize();
9579 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9580 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9581
9582 // Add asynchronous failure to host resolver.
9583 host_resolver_->set_ondemand_mode(true);
9584 factory_->set_require_confirmation(true);
9585 crypto_client_stream_factory_.set_handshake_mode(
9586 MockCryptoClientStream::ZERO_RTT);
9587 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
9588
9589 // Set up an address in stale resolver cache.
9590 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9591 HostCache::Entry entry(OK,
9592 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9593 HostCache::Entry::SOURCE_DNS);
9594 base::TimeDelta zero;
9595 HostCache* cache = host_resolver_->GetHostCache();
9596 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9597 // Expire the cache
9598 cache->OnNetworkChange();
9599
9600 MockQuicData quic_data;
9601 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9602 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_INITIAL);
9603 quic_data.AddWrite(
9604 SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
9605 1, true, quic::QUIC_CONNECTION_CANCELLED, "net error"));
9606 quic_data.AddSocketDataToFactory(socket_factory_.get());
9607
9608 QuicStreamRequest request(factory_.get());
9609 EXPECT_EQ(ERR_IO_PENDING,
9610 request.Request(
9611 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9612 SocketTag(),
9613 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9614 failed_on_default_network_callback_, callback_.callback()));
9615
9616 // Host Resolution returns failure but stale connection hasn't finished.
9617 host_resolver_->ResolveAllPending();
9618
9619 // Check that the final error is on resolution failure.
9620 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
9621
9622 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9623}
9624
9625// With dns race experiment on, test that host resolution callback behaves
9626// normal as experiment is not on
9627TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsync) {
9628 race_stale_dns_on_connection_ = true;
9629 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9630 Initialize();
9631 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9632 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9633
9634 host_resolver_->set_ondemand_mode(true);
9635 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9636 kNonCachedIPAddress, "");
9637
9638 MockQuicData quic_data;
9639 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9640 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9641 quic_data.AddSocketDataToFactory(socket_factory_.get());
9642
9643 QuicStreamRequest request(factory_.get());
9644 EXPECT_EQ(ERR_IO_PENDING,
9645 request.Request(
9646 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9647 SocketTag(),
9648 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9649 failed_on_default_network_callback_, callback_.callback()));
9650
9651 // Check that expect_on_host_resolution_ is properlly set.
9652 TestCompletionCallback host_resolution_callback;
9653 EXPECT_TRUE(
9654 request.WaitForHostResolution(host_resolution_callback.callback()));
9655 base::RunLoop().RunUntilIdle();
9656 EXPECT_FALSE(host_resolution_callback.have_result());
9657
9658 host_resolver_->ResolveAllPending();
9659 EXPECT_THAT(host_resolution_callback.WaitForResult(), IsOk());
9660
9661 // Check that expect_on_host_resolution_ is flipped back.
9662 EXPECT_FALSE(
9663 request.WaitForHostResolution(host_resolution_callback.callback()));
9664
9665 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9666 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9667}
9668
Paul Jensen8e3c5d32018-02-19 17:06:339669// Test that QuicStreamRequests with similar and different tags results in
9670// reused and unique QUIC streams using appropriately tagged sockets.
9671TEST_P(QuicStreamFactoryTest, Tag) {
9672 MockTaggingClientSocketFactory* socket_factory =
9673 new MockTaggingClientSocketFactory();
9674 socket_factory_.reset(socket_factory);
9675 Initialize();
9676 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9677 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9678
9679 // Prepare to establish two QUIC sessions.
9680 MockQuicData socket_data;
9681 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:439682 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Paul Jensen8e3c5d32018-02-19 17:06:339683 socket_data.AddSocketDataToFactory(socket_factory_.get());
9684 MockQuicData socket_data2;
9685 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:439686 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Paul Jensen8e3c5d32018-02-19 17:06:339687 socket_data2.AddSocketDataToFactory(socket_factory_.get());
9688
9689#if defined(OS_ANDROID)
9690 SocketTag tag1(SocketTag::UNSET_UID, 0x12345678);
9691 SocketTag tag2(getuid(), 0x87654321);
9692#else
9693 // On non-Android platforms we can only use the default constructor.
9694 SocketTag tag1, tag2;
9695#endif
9696
9697 // Request a stream with |tag1|.
9698 QuicStreamRequest request1(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:039699 int rv = request1.Request(
9700 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, tag1,
9701 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9702 failed_on_default_network_callback_, callback_.callback());
Paul Jensen8e3c5d32018-02-19 17:06:339703 EXPECT_THAT(callback_.GetResult(rv), IsOk());
9704 EXPECT_EQ(socket_factory->GetLastProducedUDPSocket()->tag(), tag1);
9705 EXPECT_TRUE(socket_factory->GetLastProducedUDPSocket()
9706 ->tagged_before_data_transferred());
9707 std::unique_ptr<QuicChromiumClientSession::Handle> stream1 =
9708 request1.ReleaseSessionHandle();
9709 EXPECT_TRUE(stream1);
9710 EXPECT_TRUE(stream1->IsConnected());
9711
9712 // Request a stream with |tag1| and verify underlying session is reused.
9713 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:039714 rv = request2.Request(
9715 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, tag1,
9716 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9717 failed_on_default_network_callback_, callback_.callback());
Paul Jensen8e3c5d32018-02-19 17:06:339718 EXPECT_THAT(callback_.GetResult(rv), IsOk());
9719 std::unique_ptr<QuicChromiumClientSession::Handle> stream2 =
9720 request2.ReleaseSessionHandle();
9721 EXPECT_TRUE(stream2);
9722 EXPECT_TRUE(stream2->IsConnected());
9723 EXPECT_TRUE(stream2->SharesSameSession(*stream1));
9724
9725 // Request a stream with |tag2| and verify a new session is created.
9726 QuicStreamRequest request3(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:039727 rv = request3.Request(
9728 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, tag2,
9729 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9730 failed_on_default_network_callback_, callback_.callback());
Paul Jensen8e3c5d32018-02-19 17:06:339731 EXPECT_THAT(callback_.GetResult(rv), IsOk());
9732 EXPECT_EQ(socket_factory->GetLastProducedUDPSocket()->tag(), tag2);
9733 EXPECT_TRUE(socket_factory->GetLastProducedUDPSocket()
9734 ->tagged_before_data_transferred());
9735 std::unique_ptr<QuicChromiumClientSession::Handle> stream3 =
9736 request3.ReleaseSessionHandle();
9737 EXPECT_TRUE(stream3);
9738 EXPECT_TRUE(stream3->IsConnected());
9739#if defined(OS_ANDROID)
9740 EXPECT_FALSE(stream3->SharesSameSession(*stream1));
9741#else
9742 // Same tag should reuse session.
9743 EXPECT_TRUE(stream3->SharesSameSession(*stream1));
9744#endif
9745}
9746
[email protected]e13201d82012-12-12 05:00:329747} // namespace test
[email protected]e13201d82012-12-12 05:00:329748} // namespace net