blob: 74dcddaf08afe033b58617c3fe6d17257a15b199 [file] [log] [blame]
[email protected]e13201d82012-12-12 05:00:321// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Ryan Hamiltona3ee93a72018-08-01 22:03:085#include "net/quic/quic_stream_factory.h"
[email protected]e13201d82012-12-12 05:00:326
avib3635452016-10-21 18:33:537#include <memory>
bnc359ed2a2016-04-29 20:43:458#include <ostream>
bnc086b39e12016-06-24 13:05:269#include <utility>
bnc359ed2a2016-04-29 20:43:4510
msramek992625ec2016-08-04 18:33:5811#include "base/bind.h"
12#include "base/callback.h"
xunjieli48e4f102017-04-11 23:06:5313#include "base/macros.h"
[email protected]e13201d82012-12-12 05:00:3214#include "base/run_loop.h"
[email protected]fc9be5802013-06-11 10:56:5115#include "base/strings/string_util.h"
Zhongyi Shic4823bd2018-04-27 00:49:1916#include "base/test/test_mock_time_task_runner.h"
Paul Jensen8e3c5d32018-02-19 17:06:3317#include "build/build_config.h"
mgershaf9a9232017-04-13 20:19:0318#include "net/base/mock_network_change_notifier.h"
rsleevid6de8302016-06-21 01:33:2019#include "net/cert/ct_policy_enforcer.h"
Ryan Sleevi987d2d92017-12-19 19:22:1420#include "net/cert/do_nothing_ct_verifier.h"
21#include "net/cert/mock_cert_verifier.h"
[email protected]f2cb3cf2013-03-21 01:40:5322#include "net/dns/mock_host_resolver.h"
[email protected]e13201d82012-12-12 05:00:3223#include "net/http/http_response_headers.h"
24#include "net/http/http_response_info.h"
rtenneti8332ba52015-09-17 19:33:4125#include "net/http/http_server_properties_impl.h"
[email protected]e13201d82012-12-12 05:00:3226#include "net/http/http_util.h"
[email protected]080b77932014-08-04 01:22:4627#include "net/http/transport_security_state.h"
Matt Mueller230996f12018-10-22 19:39:4428#include "net/http/transport_security_state_test_util.h"
Ryan Hamiltona3ee93a72018-08-01 22:03:0829#include "net/quic/crypto/proof_verifier_chromium.h"
30#include "net/quic/mock_crypto_client_stream_factory.h"
31#include "net/quic/mock_quic_data.h"
32#include "net/quic/properties_based_quic_server_info.h"
33#include "net/quic/quic_http_stream.h"
34#include "net/quic/quic_http_utils.h"
35#include "net/quic/quic_server_info.h"
36#include "net/quic/quic_stream_factory_peer.h"
37#include "net/quic/quic_test_packet_maker.h"
38#include "net/quic/test_task_runner.h"
bnc3472afd2016-11-17 15:27:2139#include "net/socket/next_proto.h"
[email protected]e13201d82012-12-12 05:00:3240#include "net/socket/socket_test_util.h"
Bence Béky94658bf2018-05-11 19:22:5841#include "net/spdy/spdy_session_test_util.h"
42#include "net/spdy/spdy_test_util_common.h"
[email protected]eed749f92013-12-23 18:57:3843#include "net/test/cert_test_util.h"
robpercival214763f2016-07-01 23:27:0144#include "net/test/gtest_util.h"
rsleevia69c79a2016-06-22 03:28:4345#include "net/test/test_data_directory.h"
Bence Béky98447b12018-05-08 03:14:0146#include "net/test/test_with_scoped_task_environment.h"
Ryan Hamilton56b10c5d2018-05-11 13:40:1647#include "net/third_party/quic/core/crypto/crypto_handshake.h"
48#include "net/third_party/quic/core/crypto/quic_crypto_client_config.h"
49#include "net/third_party/quic/core/crypto/quic_decrypter.h"
50#include "net/third_party/quic/core/crypto/quic_encrypter.h"
Victor Vasilievc5b409c22018-07-24 12:23:4651#include "net/third_party/quic/core/http/quic_client_promised_info.h"
Ryan Hamilton56b10c5d2018-05-11 13:40:1652#include "net/third_party/quic/platform/api/quic_test.h"
53#include "net/third_party/quic/test_tools/mock_clock.h"
54#include "net/third_party/quic/test_tools/mock_random.h"
55#include "net/third_party/quic/test_tools/quic_config_peer.h"
56#include "net/third_party/quic/test_tools/quic_spdy_session_peer.h"
57#include "net/third_party/quic/test_tools/quic_test_utils.h"
Ryan Hamilton2e003eea2018-05-02 00:24:2958#include "net/third_party/spdy/core/spdy_test_utils.h"
Ramin Halavati683bcaa92018-02-14 08:42:3959#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
robpercival214763f2016-07-01 23:27:0160#include "testing/gmock/include/gmock/gmock.h"
[email protected]e13201d82012-12-12 05:00:3261#include "testing/gtest/include/gtest/gtest.h"
msramek992625ec2016-08-04 18:33:5862#include "url/gurl.h"
[email protected]e13201d82012-12-12 05:00:3263
[email protected]6e12d702013-11-13 00:17:1764using std::string;
[email protected]6e12d702013-11-13 00:17:1765
[email protected]e13201d82012-12-12 05:00:3266namespace net {
jri7e636642016-01-14 06:57:0867
nharper642ae4b2016-06-30 00:40:3668namespace {
69
70class MockSSLConfigService : public SSLConfigService {
71 public:
72 MockSSLConfigService() {}
Ryan Sleevib8449e02018-07-15 04:31:0773 ~MockSSLConfigService() override {}
nharper642ae4b2016-06-30 00:40:3674
75 void GetSSLConfig(SSLConfig* config) override { *config = config_; }
76
Nick Harper89bc7212018-07-31 19:07:5777 bool CanShareConnectionWithClientCerts(
78 const std::string& hostname) const override {
79 return false;
80 }
81
nharper642ae4b2016-06-30 00:40:3682 private:
nharper642ae4b2016-06-30 00:40:3683 SSLConfig config_;
84};
85
86} // namespace
87
[email protected]e13201d82012-12-12 05:00:3288namespace test {
89
[email protected]3c772402013-12-18 21:38:1190namespace {
bnc359ed2a2016-04-29 20:43:4591
92enum DestinationType {
93 // In pooling tests with two requests for different origins to the same
94 // destination, the destination should be
95 SAME_AS_FIRST, // the same as the first origin,
96 SAME_AS_SECOND, // the same as the second origin, or
97 DIFFERENT, // different from both.
98};
99
rch6faa4d42016-01-05 20:48:43100const char kDefaultServerHostName[] = "www.example.org";
101const char kServer2HostName[] = "mail.example.org";
bnc359ed2a2016-04-29 20:43:45102const char kDifferentHostname[] = "different.example.com";
[email protected]3c772402013-12-18 21:38:11103const int kDefaultServerPort = 443;
ckrasic3865ee0f2016-02-29 22:04:56104const char kDefaultUrl[] = "https://www.example.org/";
105const char kServer2Url[] = "https://mail.example.org/";
106const char kServer3Url[] = "https://docs.example.org/";
107const char kServer4Url[] = "https://images.example.org/";
Zhongyi Shic4823bd2018-04-27 00:49:19108const int kDefaultRTTMilliSecs = 300;
109const size_t kMinRetryTimeForDefaultNetworkSecs = 1;
Zhongyi Shib1b1fa42018-06-19 23:13:47110const size_t kWaitTimeForNewNetworkSecs = 10;
Renjiea0cb4a2c2018-09-26 23:37:30111const IPAddress kCachedIPAddress = IPAddress(192, 168, 0, 2);
112const char kNonCachedIPAddress[] = "192.168.0.1";
rtenneti14abd312015-02-06 21:56:01113
bnc359ed2a2016-04-29 20:43:45114// Run QuicStreamFactoryTest instances with all value combinations of version
115// and enable_connection_racting.
rtenneti14abd312015-02-06 21:56:01116struct TestParams {
bnc359ed2a2016-04-29 20:43:45117 friend std::ostream& operator<<(std::ostream& os, const TestParams& p) {
Yixin Wang079ad542018-01-11 04:06:05118 os << "{ version: " << QuicVersionToString(p.version)
119 << ", client_headers_include_h2_stream_dependency: "
120 << p.client_headers_include_h2_stream_dependency << " }";
rtenneti14abd312015-02-06 21:56:01121 return os;
122 }
123
Ryan Hamilton8d9ee76e2018-05-29 23:52:52124 quic::QuicTransportVersion version;
Yixin Wang079ad542018-01-11 04:06:05125 bool client_headers_include_h2_stream_dependency;
rtenneti14abd312015-02-06 21:56:01126};
127
rch872e00e2016-12-02 02:48:18128std::vector<TestParams> GetTestParams() {
129 std::vector<TestParams> params;
Ryan Hamilton8d9ee76e2018-05-29 23:52:52130 quic::QuicTransportVersionVector all_supported_versions =
131 quic::AllSupportedTransportVersions();
Yixin Wang079ad542018-01-11 04:06:05132 for (const auto& version : all_supported_versions) {
133 params.push_back(TestParams{version, false});
134 params.push_back(TestParams{version, true});
135 }
bnc359ed2a2016-04-29 20:43:45136 return params;
137}
138
139// Run QuicStreamFactoryWithDestinationTest instances with all value
140// combinations of version, enable_connection_racting, and destination_type.
141struct PoolingTestParams {
142 friend std::ostream& operator<<(std::ostream& os,
143 const PoolingTestParams& p) {
144 os << "{ version: " << QuicVersionToString(p.version)
bnc359ed2a2016-04-29 20:43:45145 << ", destination_type: ";
146 switch (p.destination_type) {
147 case SAME_AS_FIRST:
148 os << "SAME_AS_FIRST";
149 break;
150 case SAME_AS_SECOND:
151 os << "SAME_AS_SECOND";
152 break;
153 case DIFFERENT:
154 os << "DIFFERENT";
155 break;
156 }
Yixin Wang079ad542018-01-11 04:06:05157 os << ", client_headers_include_h2_stream_dependency: "
158 << p.client_headers_include_h2_stream_dependency;
bnc359ed2a2016-04-29 20:43:45159 os << " }";
160 return os;
161 }
162
Ryan Hamilton8d9ee76e2018-05-29 23:52:52163 quic::QuicTransportVersion version;
bnc359ed2a2016-04-29 20:43:45164 DestinationType destination_type;
Yixin Wang079ad542018-01-11 04:06:05165 bool client_headers_include_h2_stream_dependency;
bnc359ed2a2016-04-29 20:43:45166};
167
rch872e00e2016-12-02 02:48:18168std::vector<PoolingTestParams> GetPoolingTestParams() {
169 std::vector<PoolingTestParams> params;
Ryan Hamilton8d9ee76e2018-05-29 23:52:52170 quic::QuicTransportVersionVector all_supported_versions =
171 quic::AllSupportedTransportVersions();
172 for (const quic::QuicTransportVersion version : all_supported_versions) {
Yixin Wang079ad542018-01-11 04:06:05173 params.push_back(PoolingTestParams{version, SAME_AS_FIRST, false});
174 params.push_back(PoolingTestParams{version, SAME_AS_FIRST, true});
175 params.push_back(PoolingTestParams{version, SAME_AS_SECOND, false});
176 params.push_back(PoolingTestParams{version, SAME_AS_SECOND, true});
177 params.push_back(PoolingTestParams{version, DIFFERENT, false});
178 params.push_back(PoolingTestParams{version, DIFFERENT, true});
rtenneti14abd312015-02-06 21:56:01179 }
180 return params;
181}
182
bnc912a04b2016-04-20 14:19:50183} // namespace
[email protected]3c772402013-12-18 21:38:11184
bnc359ed2a2016-04-29 20:43:45185class QuicHttpStreamPeer {
186 public:
rchf0b18c8a2017-05-05 19:31:57187 static QuicChromiumClientSession::Handle* GetSessionHandle(
188 HttpStream* stream) {
189 return static_cast<QuicHttpStream*>(stream)->quic_session();
bnc359ed2a2016-04-29 20:43:45190 }
191};
192
Zhongyi Shi5f587cc2017-11-21 23:24:17193// TestConnectionMigrationSocketFactory will vend sockets with incremental port
194// number.
195class TestConnectionMigrationSocketFactory : public MockClientSocketFactory {
196 public:
197 TestConnectionMigrationSocketFactory() : next_source_port_num_(1u) {}
198 ~TestConnectionMigrationSocketFactory() override {}
199
200 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
201 DatagramSocket::BindType bind_type,
Zhongyi Shi5f587cc2017-11-21 23:24:17202 NetLog* net_log,
203 const NetLogSource& source) override {
204 SocketDataProvider* data_provider = mock_data().GetNext();
205 std::unique_ptr<MockUDPClientSocket> socket(
206 new MockUDPClientSocket(data_provider, net_log));
207 socket->set_source_port(next_source_port_num_++);
208 return std::move(socket);
209 }
210
211 private:
212 uint16_t next_source_port_num_;
213
214 DISALLOW_COPY_AND_ASSIGN(TestConnectionMigrationSocketFactory);
215};
216
Bence Béky98447b12018-05-08 03:14:01217class QuicStreamFactoryTestBase : public WithScopedTaskEnvironment {
[email protected]e13201d82012-12-12 05:00:32218 protected:
Ryan Hamilton8d9ee76e2018-05-29 23:52:52219 QuicStreamFactoryTestBase(quic::QuicTransportVersion version,
Yixin Wang079ad542018-01-11 04:06:05220 bool client_headers_include_h2_stream_dependency)
Renjiea0cb4a2c2018-09-26 23:37:30221 : host_resolver_(new MockHostResolver),
222 ssl_config_service_(new MockSSLConfigService),
Zhongyi Shi5f587cc2017-11-21 23:24:17223 socket_factory_(new MockClientSocketFactory),
nharper642ae4b2016-06-30 00:40:36224 random_generator_(0),
rchbf4c26d2017-04-16 23:17:55225 runner_(new TestTaskRunner(&clock_)),
bnc359ed2a2016-04-29 20:43:45226 version_(version),
Yixin Wang079ad542018-01-11 04:06:05227 client_headers_include_h2_stream_dependency_(
228 client_headers_include_h2_stream_dependency),
alyssar2adf3ac2016-05-03 17:12:58229 client_maker_(version_,
230 0,
rchbf4c26d2017-04-16 23:17:55231 &clock_,
alyssar2adf3ac2016-05-03 17:12:58232 kDefaultServerHostName,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52233 quic::Perspective::IS_CLIENT,
Yixin Wang079ad542018-01-11 04:06:05234 client_headers_include_h2_stream_dependency_),
alyssar2adf3ac2016-05-03 17:12:58235 server_maker_(version_,
236 0,
rchbf4c26d2017-04-16 23:17:55237 &clock_,
alyssar2adf3ac2016-05-03 17:12:58238 kDefaultServerHostName,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52239 quic::Perspective::IS_SERVER,
Yixin Wang079ad542018-01-11 04:06:05240 false),
Ryan Sleevi987d2d92017-12-19 19:22:14241 cert_verifier_(std::make_unique<MockCertVerifier>()),
Ryan Sleevi987d2d92017-12-19 19:22:14242 cert_transparency_verifier_(std::make_unique<DoNothingCTVerifier>()),
jri7e636642016-01-14 06:57:08243 scoped_mock_network_change_notifier_(nullptr),
jri7046038f2015-10-22 00:29:26244 factory_(nullptr),
[email protected]bf4ea2f2014-03-10 22:57:53245 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
ckrasic3865ee0f2016-02-29 22:04:56246 url_(kDefaultUrl),
247 url2_(kServer2Url),
248 url3_(kServer3Url),
249 url4_(kServer4Url),
jri7046038f2015-10-22 00:29:26250 privacy_mode_(PRIVACY_MODE_DISABLED),
Zhongyi Shia6b68d112018-09-24 07:49:03251 failed_on_default_network_callback_(base::BindRepeating(
252 &QuicStreamFactoryTestBase::OnFailedOnDefaultNetwork,
253 base::Unretained(this))),
254 failed_on_default_network_(false),
rch431dd4452017-04-19 15:22:35255 store_server_configs_in_properties_(false),
Jana Iyengar903dec22017-11-28 00:44:23256 close_sessions_on_ip_change_(false),
Zhongyi Shi63574b72018-06-01 20:22:25257 goaway_sessions_on_ip_change_(false),
jri7e636642016-01-14 06:57:08258 idle_connection_timeout_seconds_(kIdleConnectionTimeoutSeconds),
Ryan Hamilton8d9ee76e2018-05-29 23:52:52259 reduced_ping_timeout_seconds_(quic::kPingTimeoutSecs),
Yixin Wang469da562017-11-15 21:34:58260 max_time_before_crypto_handshake_seconds_(
Ryan Hamilton8d9ee76e2018-05-29 23:52:52261 quic::kMaxTimeForCryptoHandshakeSecs),
262 max_idle_time_before_crypto_handshake_seconds_(
263 quic::kInitialIdleTimeoutSecs),
Zhongyi Shif4683a32017-12-01 00:03:28264 migrate_sessions_on_network_change_v2_(false),
265 migrate_sessions_early_v2_(false),
Zhongyi Shi8de43832018-08-15 23:40:00266 retry_on_alternate_network_before_handshake_(false),
Renjiea0cb4a2c2018-09-26 23:37:30267 race_stale_dns_on_connection_(false),
Renjiea5722ccf2018-08-10 00:18:49268 go_away_on_path_degrading_(false),
jri217455a12016-07-13 20:15:09269 allow_server_migration_(false),
rchd6163f32017-01-30 23:50:38270 race_cert_verification_(false),
271 estimate_initial_rtt_(false) {
Ryan Hamilton8d9ee76e2018-05-29 23:52:52272 clock_.AdvanceTime(quic::QuicTime::Delta::FromSeconds(1));
bnc359ed2a2016-04-29 20:43:45273 }
274
jri7046038f2015-10-22 00:29:26275 void Initialize() {
bnc359ed2a2016-04-29 20:43:45276 DCHECK(!factory_);
jri7046038f2015-10-22 00:29:26277 factory_.reset(new QuicStreamFactory(
Renjiea0cb4a2c2018-09-26 23:37:30278 net_log_.net_log(), host_resolver_.get(), ssl_config_service_.get(),
Zhongyi Shi5f587cc2017-11-21 23:24:17279 socket_factory_.get(), &http_server_properties_, cert_verifier_.get(),
Nick Harperecf319d2018-10-16 07:58:54280 &ct_policy_enforcer_, &transport_security_state_,
281 cert_transparency_verifier_.get(),
jri7046038f2015-10-22 00:29:26282 /*SocketPerformanceWatcherFactory*/ nullptr,
rchbf4c26d2017-04-16 23:17:55283 &crypto_client_stream_factory_, &random_generator_, &clock_,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52284 quic::kDefaultMaxPacketSize, string(),
285 store_server_configs_in_properties_, close_sessions_on_ip_change_,
Zhongyi Shi63574b72018-06-01 20:22:25286 goaway_sessions_on_ip_change_,
rch9ecde09b2017-04-08 00:18:23287 /*mark_quic_broken_when_network_blackholes*/ false,
zhongyidd1439f62016-09-02 02:02:26288 idle_connection_timeout_seconds_, reduced_ping_timeout_seconds_,
Yixin Wang469da562017-11-15 21:34:58289 max_time_before_crypto_handshake_seconds_,
290 max_idle_time_before_crypto_handshake_seconds_,
Zhongyi Shif4683a32017-12-01 00:03:28291 migrate_sessions_on_network_change_v2_, migrate_sessions_early_v2_,
Zhongyi Shi8de43832018-08-15 23:40:00292 retry_on_alternate_network_before_handshake_,
Renjiea0cb4a2c2018-09-26 23:37:30293 race_stale_dns_on_connection_, go_away_on_path_degrading_,
Zhongyi Shi73f23ca872017-12-13 18:37:13294 base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs),
Zhongyi Shiee760762018-08-01 00:54:29295 kMaxMigrationsToNonDefaultNetworkOnWriteError,
Zhongyi Shi8b1e43f2017-12-13 20:46:30296 kMaxMigrationsToNonDefaultNetworkOnPathDegrading,
Charles 'Buck' Krasic0c346c92017-09-14 18:17:37297 allow_server_migration_, race_cert_verification_, estimate_initial_rtt_,
Yixin Wang079ad542018-01-11 04:06:05298 client_headers_include_h2_stream_dependency_, connection_options_,
Nick Harper2243e8002018-09-28 20:33:26299 client_connection_options_,
kapishnikov7f8dd1e2018-01-24 06:10:49300 /*enable_socket_recv_optimization*/ false));
[email protected]e13201d82012-12-12 05:00:32301 }
302
Zhongyi Shi5f587cc2017-11-21 23:24:17303 void InitializeConnectionMigrationV2Test(
304 NetworkChangeNotifier::NetworkList connected_networks) {
305 scoped_mock_network_change_notifier_.reset(
306 new ScopedMockNetworkChangeNotifier());
307 MockNetworkChangeNotifier* mock_ncn =
308 scoped_mock_network_change_notifier_->mock_network_change_notifier();
309 mock_ncn->ForceNetworkHandlesSupported();
310 mock_ncn->SetConnectedNetworksList(connected_networks);
311 migrate_sessions_on_network_change_v2_ = true;
Zhongyi Shif4683a32017-12-01 00:03:28312 migrate_sessions_early_v2_ = true;
Zhongyi Shi8de43832018-08-15 23:40:00313 retry_on_alternate_network_before_handshake_ = true;
Zhongyi Shi5f587cc2017-11-21 23:24:17314 socket_factory_.reset(new TestConnectionMigrationSocketFactory);
315 Initialize();
316 }
317
Yixin Wang7891a39d2017-11-08 20:59:24318 std::unique_ptr<HttpStream> CreateStream(QuicStreamRequest* request) {
319 std::unique_ptr<QuicChromiumClientSession::Handle> session =
320 request->ReleaseSessionHandle();
321 if (!session || !session->IsConnected())
322 return nullptr;
323
324 return std::make_unique<QuicHttpStream>(std::move(session));
325 }
326
bnccb7ff3c2015-05-21 20:51:55327 bool HasActiveSession(const HostPortPair& host_port_pair) {
Ryan Hamilton4f0b26e2018-06-27 23:52:32328 quic::QuicServerId server_id(host_port_pair.host(), host_port_pair.port(),
329 false);
bnc5fdc07162016-05-23 17:36:03330 return QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server_id);
bnccb7ff3c2015-05-21 20:51:55331 }
332
Renjiea0cb4a2c2018-09-26 23:37:30333 bool HasLiveSession(const HostPortPair& host_port_pair) {
334 quic::QuicServerId server_id(host_port_pair.host(), host_port_pair.port(),
335 false);
336 return QuicStreamFactoryPeer::HasLiveSession(factory_.get(), host_port_pair,
337 server_id);
338 }
339
zhongyi363c91c2017-03-23 23:16:08340 bool HasActiveJob(const HostPortPair& host_port_pair,
341 const PrivacyMode privacy_mode) {
Ryan Hamilton4f0b26e2018-06-27 23:52:32342 quic::QuicServerId server_id(host_port_pair.host(), host_port_pair.port(),
343 privacy_mode == PRIVACY_MODE_ENABLED);
zhongyi363c91c2017-03-23 23:16:08344 return QuicStreamFactoryPeer::HasActiveJob(factory_.get(), server_id);
345 }
346
Ryan Hamilton8d9ee76e2018-05-29 23:52:52347 bool HasActiveCertVerifierJob(const quic::QuicServerId& server_id) {
rtennetid073dd22016-08-04 01:58:33348 return QuicStreamFactoryPeer::HasActiveCertVerifierJob(factory_.get(),
349 server_id);
350 }
351
Zhongyi Shic1449372018-08-09 09:58:58352 // Get the pending, not activated session, if there is only one session alive.
353 QuicChromiumClientSession* GetPendingSession(
354 const HostPortPair& host_port_pair) {
355 quic::QuicServerId server_id(host_port_pair.host(), host_port_pair.port(),
356 false);
357 return QuicStreamFactoryPeer::GetPendingSession(factory_.get(), server_id,
358 host_port_pair);
359 }
360
bnc912a04b2016-04-20 14:19:50361 QuicChromiumClientSession* GetActiveSession(
362 const HostPortPair& host_port_pair) {
Ryan Hamilton4f0b26e2018-06-27 23:52:32363 quic::QuicServerId server_id(host_port_pair.host(), host_port_pair.port(),
364 false);
bnc5fdc07162016-05-23 17:36:03365 return QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server_id);
bnc912a04b2016-04-20 14:19:50366 }
367
[email protected]bf4ea2f2014-03-10 22:57:53368 int GetSourcePortForNewSession(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10369 return GetSourcePortForNewSessionInner(destination, false);
370 }
371
rjshaded5ced072015-12-18 19:26:02372 int GetSourcePortForNewSessionAndGoAway(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10373 return GetSourcePortForNewSessionInner(destination, true);
374 }
375
[email protected]bf4ea2f2014-03-10 22:57:53376 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
[email protected]d8e2abf82014-03-06 10:30:10377 bool goaway_received) {
[email protected]3c772402013-12-18 21:38:11378 // Should only be called if there is no active session for this destination.
bnccb7ff3c2015-05-21 20:51:55379 EXPECT_FALSE(HasActiveSession(destination));
Zhongyi Shi5f587cc2017-11-21 23:24:17380 size_t socket_count = socket_factory_->udp_client_socket_ports().size();
[email protected]3c772402013-12-18 21:38:11381
rcha00569732016-08-27 11:09:36382 MockQuicData socket_data;
383 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:43384 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:17385 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]3c772402013-12-18 21:38:11386
zhongyi98d6a9262017-05-19 02:47:45387 QuicStreamRequest request(factory_.get());
ckrasic3865ee0f2016-02-29 22:04:56388 GURL url("https://" + destination.host() + "/");
Zhongyi Shia6b68d112018-09-24 07:49:03389 EXPECT_EQ(
390 ERR_IO_PENDING,
391 request.Request(
392 destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
393 /*cert_verify_flags=*/0, url, net_log_, &net_error_details_,
394 failed_on_default_network_callback_, callback_.callback()));
[email protected]3c772402013-12-18 21:38:11395
robpercival214763f2016-07-01 23:27:01396 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:24397 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]3c772402013-12-18 21:38:11398 EXPECT_TRUE(stream.get());
399 stream.reset();
400
bnc912a04b2016-04-20 14:19:50401 QuicChromiumClientSession* session = GetActiveSession(destination);
[email protected]3c772402013-12-18 21:38:11402
Zhongyi Shi5f587cc2017-11-21 23:24:17403 if (socket_count + 1 != socket_factory_->udp_client_socket_ports().size()) {
mmenke651bae7f2015-12-18 21:26:45404 ADD_FAILURE();
[email protected]3c772402013-12-18 21:38:11405 return 0;
406 }
407
[email protected]d8e2abf82014-03-06 10:30:10408 if (goaway_received) {
Ryan Hamilton8d9ee76e2018-05-29 23:52:52409 quic::QuicGoAwayFrame goaway(quic::kInvalidControlFrameId,
410 quic::QUIC_NO_ERROR, 1, "");
rtenneti9bd5d4b2015-08-21 05:44:52411 session->connection()->OnGoAwayFrame(goaway);
[email protected]d8e2abf82014-03-06 10:30:10412 }
[email protected]3c772402013-12-18 21:38:11413
jri7046038f2015-10-22 00:29:26414 factory_->OnSessionClosed(session);
bnccb7ff3c2015-05-21 20:51:55415 EXPECT_FALSE(HasActiveSession(destination));
rch37de576c2015-05-17 20:28:17416 EXPECT_TRUE(socket_data.AllReadDataConsumed());
417 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
Zhongyi Shi5f587cc2017-11-21 23:24:17418 return socket_factory_->udp_client_socket_ports()[socket_count];
[email protected]3c772402013-12-18 21:38:11419 }
420
Ryan Hamilton8d9ee76e2018-05-29 23:52:52421 std::unique_ptr<quic::QuicEncryptedPacket>
422 ConstructClientConnectionClosePacket(quic::QuicPacketNumber num) {
Bin Wu5311aca2018-01-22 01:19:03423 return client_maker_.MakeConnectionClosePacket(
Ryan Hamilton8d9ee76e2018-05-29 23:52:52424 num, false, quic::QUIC_CRYPTO_VERSION_NOT_SUPPORTED, "Time to panic!");
rtenneti1cd3b162015-09-29 02:58:28425 }
426
Ryan Hamilton8d9ee76e2018-05-29 23:52:52427 std::unique_ptr<quic::QuicEncryptedPacket> ConstructClientRstPacket(
428 quic::QuicPacketNumber packet_number,
429 quic::QuicRstStreamErrorCode error_code) {
430 quic::QuicStreamId stream_id = GetNthClientInitiatedStreamId(0);
fayang3bcb8b502016-12-07 21:44:37431 return client_maker_.MakeRstPacket(packet_number, true, stream_id,
Jana Iyengarba355772017-09-21 22:03:21432 error_code);
fayang3bcb8b502016-12-07 21:44:37433 }
434
bncf8bf0722015-05-19 20:04:13435 static ProofVerifyDetailsChromium DefaultProofVerifyDetails() {
rch6faa4d42016-01-05 20:48:43436 // Load a certificate that is valid for *.example.org
bncf8bf0722015-05-19 20:04:13437 scoped_refptr<X509Certificate> test_cert(
rch6faa4d42016-01-05 20:48:43438 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bncf8bf0722015-05-19 20:04:13439 EXPECT_TRUE(test_cert.get());
440 ProofVerifyDetailsChromium verify_details;
441 verify_details.cert_verify_result.verified_cert = test_cert;
442 verify_details.cert_verify_result.is_issued_by_known_root = true;
443 return verify_details;
444 }
445
jri8c44d692015-10-23 23:53:41446 void NotifyIPAddressChanged() {
447 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
jri7e636642016-01-14 06:57:08448 // Spin the message loop so the notification is delivered.
fdoray92e35a72016-06-10 15:54:55449 base::RunLoop().RunUntilIdle();
jri8c44d692015-10-23 23:53:41450 }
451
Ryan Hamilton8d9ee76e2018-05-29 23:52:52452 std::unique_ptr<quic::QuicEncryptedPacket> ConstructGetRequestPacket(
453 quic::QuicPacketNumber packet_number,
454 quic::QuicStreamId stream_id,
jri7e636642016-01-14 06:57:08455 bool should_include_version,
456 bool fin) {
Ryan Hamilton0239aac2018-05-19 00:03:13457 spdy::SpdyHeaderBlock headers =
alyssar2adf3ac2016-05-03 17:12:58458 client_maker_.GetRequestHeaders("GET", "https", "/");
Ryan Hamilton0239aac2018-05-19 00:03:13459 spdy::SpdyPriority priority =
jri7e636642016-01-14 06:57:08460 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
461 size_t spdy_headers_frame_len;
alyssar2adf3ac2016-05-03 17:12:58462 return client_maker_.MakeRequestHeadersPacket(
jri7e636642016-01-14 06:57:08463 packet_number, stream_id, should_include_version, fin, priority,
Yixin Wang7a3f1b8d2018-01-17 21:40:48464 std::move(headers), 0, &spdy_headers_frame_len);
jri7e636642016-01-14 06:57:08465 }
466
Ryan Hamilton8d9ee76e2018-05-29 23:52:52467 std::unique_ptr<quic::QuicEncryptedPacket> ConstructGetRequestPacket(
468 quic::QuicPacketNumber packet_number,
469 quic::QuicStreamId stream_id,
Zhongyi Shi3c4c9e92018-07-02 23:16:23470 quic::QuicStreamId parent_stream_id,
fayang3bcb8b502016-12-07 21:44:37471 bool should_include_version,
472 bool fin,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52473 quic::QuicStreamOffset* offset) {
Ryan Hamilton0239aac2018-05-19 00:03:13474 spdy::SpdyHeaderBlock headers =
fayang3bcb8b502016-12-07 21:44:37475 client_maker_.GetRequestHeaders("GET", "https", "/");
Ryan Hamilton0239aac2018-05-19 00:03:13476 spdy::SpdyPriority priority =
fayang3bcb8b502016-12-07 21:44:37477 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
478 size_t spdy_headers_frame_len;
479 return client_maker_.MakeRequestHeadersPacket(
480 packet_number, stream_id, should_include_version, fin, priority,
Zhongyi Shi3c4c9e92018-07-02 23:16:23481 std::move(headers), parent_stream_id, &spdy_headers_frame_len, offset);
482 }
483
484 std::unique_ptr<quic::QuicEncryptedPacket> ConstructGetRequestPacket(
485 quic::QuicPacketNumber packet_number,
486 quic::QuicStreamId stream_id,
487 bool should_include_version,
488 bool fin,
489 quic::QuicStreamOffset* offset) {
490 return ConstructGetRequestPacket(packet_number, stream_id,
491 /*parent_stream_id=*/0,
492 should_include_version, fin, offset);
fayang3bcb8b502016-12-07 21:44:37493 }
494
Ryan Hamilton8d9ee76e2018-05-29 23:52:52495 std::unique_ptr<quic::QuicEncryptedPacket> ConstructOkResponsePacket(
496 quic::QuicPacketNumber packet_number,
497 quic::QuicStreamId stream_id,
jri7e636642016-01-14 06:57:08498 bool should_include_version,
499 bool fin) {
Ryan Hamilton0239aac2018-05-19 00:03:13500 spdy::SpdyHeaderBlock headers = server_maker_.GetResponseHeaders("200 OK");
jri7e636642016-01-14 06:57:08501 size_t spdy_headers_frame_len;
alyssar2adf3ac2016-05-03 17:12:58502 return server_maker_.MakeResponseHeadersPacket(
bnc086b39e12016-06-24 13:05:26503 packet_number, stream_id, should_include_version, fin,
504 std::move(headers), &spdy_headers_frame_len);
jri7e636642016-01-14 06:57:08505 }
506
Ryan Hamilton8d9ee76e2018-05-29 23:52:52507 std::unique_ptr<quic::QuicReceivedPacket> ConstructInitialSettingsPacket() {
rch5cb522462017-04-25 20:18:36508 return client_maker_.MakeInitialSettingsPacket(1, nullptr);
509 }
510
Ryan Hamilton8d9ee76e2018-05-29 23:52:52511 std::unique_ptr<quic::QuicReceivedPacket> ConstructInitialSettingsPacket(
512 quic::QuicPacketNumber packet_number,
513 quic::QuicStreamOffset* offset) {
rch5cb522462017-04-25 20:18:36514 return client_maker_.MakeInitialSettingsPacket(packet_number, offset);
fayang3bcb8b502016-12-07 21:44:37515 }
516
jri053fdbd2016-08-19 02:33:05517 // Helper method for server migration tests.
Ryan Hamilton8d9ee76e2018-05-29 23:52:52518 void VerifyServerMigration(const quic::QuicConfig& config,
bnc6a0348c2017-05-22 18:56:19519 IPEndPoint expected_address) {
jri053fdbd2016-08-19 02:33:05520 allow_server_migration_ = true;
521 Initialize();
522
523 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
524 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri053fdbd2016-08-19 02:33:05525 crypto_client_stream_factory_.SetConfig(config);
526
527 // Set up first socket data provider.
rcha00569732016-08-27 11:09:36528 MockQuicData socket_data1;
529 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:17530 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri053fdbd2016-08-19 02:33:05531
rcha00569732016-08-27 11:09:36532 // Set up second socket data provider that is used after
533 // migration.
534 MockQuicData socket_data2;
535 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:43536 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
fayang3bcb8b502016-12-07 21:44:37537 socket_data2.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:43538 SYNCHRONOUS, client_maker_.MakePingPacket(2, /*include_version=*/true));
539 socket_data2.AddWrite(
540 SYNCHRONOUS,
541 client_maker_.MakeRstPacket(3, true, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:52542 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:17543 socket_data2.AddSocketDataToFactory(socket_factory_.get());
jri053fdbd2016-08-19 02:33:05544
545 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:45546 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:33547 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:03548 request.Request(
549 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
550 SocketTag(),
551 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
552 failed_on_default_network_callback_, callback_.callback()));
jri053fdbd2016-08-19 02:33:05553 EXPECT_EQ(OK, callback_.WaitForResult());
bnceb9aa7112017-01-05 01:03:46554
555 // Run QuicChromiumClientSession::WriteToNewSocket()
556 // posted by QuicChromiumClientSession::MigrateToSocket().
557 base::RunLoop().RunUntilIdle();
558
Yixin Wang7891a39d2017-11-08 20:59:24559 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri053fdbd2016-08-19 02:33:05560 EXPECT_TRUE(stream.get());
561
562 // Cause QUIC stream to be created.
563 HttpRequestInfo request_info;
564 request_info.method = "GET";
565 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:39566 request_info.traffic_annotation =
567 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:27568 EXPECT_EQ(OK,
569 stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:39570 net_log_, CompletionOnceCallback()));
jri053fdbd2016-08-19 02:33:05571 // Ensure that session is alive and active.
572 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
573 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
574 EXPECT_TRUE(HasActiveSession(host_port_pair_));
575
576 IPEndPoint actual_address;
577 session->GetDefaultSocket()->GetPeerAddress(&actual_address);
578 EXPECT_EQ(actual_address, expected_address);
579 DVLOG(1) << "Socket connected to: " << actual_address.address().ToString()
580 << " " << actual_address.port();
581 DVLOG(1) << "Expected address: " << expected_address.address().ToString()
582 << " " << expected_address.port();
583
584 stream.reset();
585 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
586 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
587 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
588 }
589
tbansal3b966952016-10-25 23:25:14590 // Verifies that the QUIC stream factory is initialized correctly.
tbansal9b1cdf32017-05-10 17:28:39591 void VerifyInitialization() {
rch431dd4452017-04-19 15:22:35592 store_server_configs_in_properties_ = true;
tbansal3b966952016-10-25 23:25:14593 idle_connection_timeout_seconds_ = 500;
594 Initialize();
Ryan Hamiltona12722b2017-08-12 02:23:20595 factory_->set_require_confirmation(false);
tbansal3b966952016-10-25 23:25:14596 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
597 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rch431dd4452017-04-19 15:22:35598 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
599 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:27600 MockCryptoClientStream::ZERO_RTT);
Ryan Hamilton8d9ee76e2018-05-29 23:52:52601 const quic::QuicConfig* config =
602 QuicStreamFactoryPeer::GetConfig(factory_.get());
ckrasic32b17dcd2016-10-31 06:15:35603 EXPECT_EQ(500, config->IdleNetworkTimeout().ToSeconds());
tbansal3b966952016-10-25 23:25:14604
605 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
606
bnc3472afd2016-11-17 15:27:21607 const AlternativeService alternative_service1(
608 kProtoQUIC, host_port_pair_.host(), host_port_pair_.port());
tbansal3b966952016-10-25 23:25:14609 AlternativeServiceInfoVector alternative_service_info_vector;
610 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
611 alternative_service_info_vector.push_back(
zhongyie537a002017-06-27 16:48:21612 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
613 alternative_service1, expiration, {version_}));
tbansal3b966952016-10-25 23:25:14614 http_server_properties_.SetAlternativeServices(
615 url::SchemeHostPort(url_), alternative_service_info_vector);
616
617 HostPortPair host_port_pair2(kServer2HostName, kDefaultServerPort);
618 url::SchemeHostPort server2("https", kServer2HostName, kDefaultServerPort);
bnc3472afd2016-11-17 15:27:21619 const AlternativeService alternative_service2(
620 kProtoQUIC, host_port_pair2.host(), host_port_pair2.port());
tbansal3b966952016-10-25 23:25:14621 AlternativeServiceInfoVector alternative_service_info_vector2;
622 alternative_service_info_vector2.push_back(
zhongyie537a002017-06-27 16:48:21623 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
624 alternative_service2, expiration, {version_}));
tbansal9b1cdf32017-05-10 17:28:39625
626 http_server_properties_.SetAlternativeServices(
627 server2, alternative_service_info_vector2);
628 // Verify that the properties of both QUIC servers are stored in the
629 // HTTP properties map.
630 EXPECT_EQ(2U, http_server_properties_.alternative_service_map().size());
tbansal3b966952016-10-25 23:25:14631
632 http_server_properties_.SetMaxServerConfigsStoredInProperties(
Yixin Wang4a227aa22017-11-30 21:33:01633 kDefaultMaxQuicServerEntries);
tbansal3b966952016-10-25 23:25:14634
Ryan Hamilton8d9ee76e2018-05-29 23:52:52635 quic::QuicServerId quic_server_id(kDefaultServerHostName, 443,
636 PRIVACY_MODE_DISABLED);
rch431dd4452017-04-19 15:22:35637 std::unique_ptr<QuicServerInfo> quic_server_info =
Jeremy Roman0579ed62017-08-29 15:56:19638 std::make_unique<PropertiesBasedQuicServerInfo>(
rch431dd4452017-04-19 15:22:35639 quic_server_id, &http_server_properties_);
tbansal3b966952016-10-25 23:25:14640
641 // Update quic_server_info's server_config and persist it.
642 QuicServerInfo::State* state = quic_server_info->mutable_state();
643 // Minimum SCFG that passes config validation checks.
644 const char scfg[] = {// SCFG
645 0x53, 0x43, 0x46, 0x47,
646 // num entries
647 0x01, 0x00,
648 // padding
649 0x00, 0x00,
650 // EXPY
651 0x45, 0x58, 0x50, 0x59,
652 // EXPY end offset
653 0x08, 0x00, 0x00, 0x00,
654 // Value
655 '1', '2', '3', '4', '5', '6', '7', '8'};
656
657 // Create temporary strings becasue Persist() clears string data in |state|.
658 string server_config(reinterpret_cast<const char*>(&scfg), sizeof(scfg));
659 string source_address_token("test_source_address_token");
660 string cert_sct("test_cert_sct");
661 string chlo_hash("test_chlo_hash");
662 string signature("test_signature");
663 string test_cert("test_cert");
rch872e00e2016-12-02 02:48:18664 std::vector<string> certs;
tbansal3b966952016-10-25 23:25:14665 certs.push_back(test_cert);
666 state->server_config = server_config;
667 state->source_address_token = source_address_token;
668 state->cert_sct = cert_sct;
669 state->chlo_hash = chlo_hash;
670 state->server_config_sig = signature;
671 state->certs = certs;
672
673 quic_server_info->Persist();
674
Ryan Hamilton8d9ee76e2018-05-29 23:52:52675 quic::QuicServerId quic_server_id2(kServer2HostName, 443,
676 PRIVACY_MODE_DISABLED);
rch431dd4452017-04-19 15:22:35677 std::unique_ptr<QuicServerInfo> quic_server_info2 =
Jeremy Roman0579ed62017-08-29 15:56:19678 std::make_unique<PropertiesBasedQuicServerInfo>(
rch431dd4452017-04-19 15:22:35679 quic_server_id2, &http_server_properties_);
tbansal3b966952016-10-25 23:25:14680 // Update quic_server_info2's server_config and persist it.
681 QuicServerInfo::State* state2 = quic_server_info2->mutable_state();
682
683 // Minimum SCFG that passes config validation checks.
684 const char scfg2[] = {// SCFG
685 0x53, 0x43, 0x46, 0x47,
686 // num entries
687 0x01, 0x00,
688 // padding
689 0x00, 0x00,
690 // EXPY
691 0x45, 0x58, 0x50, 0x59,
692 // EXPY end offset
693 0x08, 0x00, 0x00, 0x00,
694 // Value
695 '8', '7', '3', '4', '5', '6', '2', '1'};
696
697 // Create temporary strings becasue Persist() clears string data in
698 // |state2|.
699 string server_config2(reinterpret_cast<const char*>(&scfg2), sizeof(scfg2));
700 string source_address_token2("test_source_address_token2");
701 string cert_sct2("test_cert_sct2");
702 string chlo_hash2("test_chlo_hash2");
703 string signature2("test_signature2");
704 string test_cert2("test_cert2");
rch872e00e2016-12-02 02:48:18705 std::vector<string> certs2;
tbansal3b966952016-10-25 23:25:14706 certs2.push_back(test_cert2);
707 state2->server_config = server_config2;
708 state2->source_address_token = source_address_token2;
709 state2->cert_sct = cert_sct2;
710 state2->chlo_hash = chlo_hash2;
711 state2->server_config_sig = signature2;
712 state2->certs = certs2;
713
714 quic_server_info2->Persist();
715
tbansal3b966952016-10-25 23:25:14716 // Verify the MRU order is maintained.
717 const QuicServerInfoMap& quic_server_info_map =
718 http_server_properties_.quic_server_info_map();
719 EXPECT_EQ(2u, quic_server_info_map.size());
jdoerrie22a91d8b92018-10-05 08:43:26720 auto quic_server_info_map_it = quic_server_info_map.begin();
tbansal3b966952016-10-25 23:25:14721 EXPECT_EQ(quic_server_info_map_it->first, quic_server_id2);
722 ++quic_server_info_map_it;
723 EXPECT_EQ(quic_server_info_map_it->first, quic_server_id);
724
Renjiea0cb4a2c2018-09-26 23:37:30725 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
726 "192.168.0.1", "");
rch431dd4452017-04-19 15:22:35727
728 // Create a session and verify that the cached state is loaded.
729 MockQuicData socket_data;
730 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:17731 socket_data.AddSocketDataToFactory(socket_factory_.get());
rch431dd4452017-04-19 15:22:35732
zhongyi98d6a9262017-05-19 02:47:45733 QuicStreamRequest request(factory_.get());
Yixin Wang247ea642017-11-15 01:15:50734 EXPECT_EQ(ERR_IO_PENDING,
Ryan Hamilton4f0b26e2018-06-27 23:52:32735 request.Request(
736 HostPortPair(quic_server_id.host(), quic_server_id.port()),
737 version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
738 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
Zhongyi Shia6b68d112018-09-24 07:49:03739 failed_on_default_network_callback_, callback_.callback()));
rch431dd4452017-04-19 15:22:35740 EXPECT_THAT(callback_.WaitForResult(), IsOk());
741
tbansal3b966952016-10-25 23:25:14742 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(
743 factory_.get(), quic_server_id));
Ryan Hamilton8d9ee76e2018-05-29 23:52:52744 quic::QuicCryptoClientConfig* crypto_config =
tbansal3b966952016-10-25 23:25:14745 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
Ryan Hamilton8d9ee76e2018-05-29 23:52:52746 quic::QuicCryptoClientConfig::CachedState* cached =
tbansal3b966952016-10-25 23:25:14747 crypto_config->LookupOrCreate(quic_server_id);
748 EXPECT_FALSE(cached->server_config().empty());
749 EXPECT_TRUE(cached->GetServerConfig());
750 EXPECT_EQ(server_config, cached->server_config());
751 EXPECT_EQ(source_address_token, cached->source_address_token());
752 EXPECT_EQ(cert_sct, cached->cert_sct());
753 EXPECT_EQ(chlo_hash, cached->chlo_hash());
754 EXPECT_EQ(signature, cached->signature());
755 ASSERT_EQ(1U, cached->certs().size());
756 EXPECT_EQ(test_cert, cached->certs()[0]);
757
rch431dd4452017-04-19 15:22:35758 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
759
760 // Create a session and verify that the cached state is loaded.
761 MockQuicData socket_data2;
762 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:17763 socket_data2.AddSocketDataToFactory(socket_factory_.get());
rch431dd4452017-04-19 15:22:35764
Renjiea0cb4a2c2018-09-26 23:37:30765 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
766 "192.168.0.2", "");
rch431dd4452017-04-19 15:22:35767
zhongyi98d6a9262017-05-19 02:47:45768 QuicStreamRequest request2(factory_.get());
rch431dd4452017-04-19 15:22:35769 EXPECT_EQ(ERR_IO_PENDING,
Ryan Hamilton4f0b26e2018-06-27 23:52:32770 request2.Request(
771 HostPortPair(quic_server_id2.host(), quic_server_id2.port()),
772 version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
773 /*cert_verify_flags=*/0, GURL("https://mail.example.org/"),
Zhongyi Shia6b68d112018-09-24 07:49:03774 net_log_, &net_error_details_,
775 failed_on_default_network_callback_, callback_.callback()));
rch431dd4452017-04-19 15:22:35776 EXPECT_THAT(callback_.WaitForResult(), IsOk());
777
tbansal3b966952016-10-25 23:25:14778 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(
779 factory_.get(), quic_server_id2));
Ryan Hamilton8d9ee76e2018-05-29 23:52:52780 quic::QuicCryptoClientConfig::CachedState* cached2 =
tbansal3b966952016-10-25 23:25:14781 crypto_config->LookupOrCreate(quic_server_id2);
782 EXPECT_FALSE(cached2->server_config().empty());
783 EXPECT_TRUE(cached2->GetServerConfig());
784 EXPECT_EQ(server_config2, cached2->server_config());
785 EXPECT_EQ(source_address_token2, cached2->source_address_token());
786 EXPECT_EQ(cert_sct2, cached2->cert_sct());
787 EXPECT_EQ(chlo_hash2, cached2->chlo_hash());
788 EXPECT_EQ(signature2, cached2->signature());
789 ASSERT_EQ(1U, cached->certs().size());
790 EXPECT_EQ(test_cert2, cached2->certs()[0]);
791 }
792
jri5b785512016-09-13 04:29:11793 void RunTestLoopUntilIdle() {
794 while (!runner_->GetPostedTasks().empty())
795 runner_->RunNextTask();
796 }
797
Ryan Hamilton8d9ee76e2018-05-29 23:52:52798 quic::QuicStreamId GetNthClientInitiatedStreamId(int n) {
799 return quic::test::GetNthClientInitiatedStreamId(version_, n);
ckrasicbf2f59c2017-05-04 23:54:36800 }
801
Ryan Hamilton8d9ee76e2018-05-29 23:52:52802 quic::QuicStreamId GetNthServerInitiatedStreamId(int n) {
803 return quic::test::GetNthServerInitiatedStreamId(version_, n);
ckrasicbf2f59c2017-05-04 23:54:36804 }
805
Zhongyi Shia6b68d112018-09-24 07:49:03806 void OnFailedOnDefaultNetwork(int rv) { failed_on_default_network_ = true; }
807
jri9f303712016-09-13 01:10:22808 // Helper methods for tests of connection migration on write error.
809 void TestMigrationOnWriteErrorNonMigratableStream(IoMode write_error_mode);
Zhongyi Shi0439ecc72018-07-11 04:41:26810 // Migratable stream triggers write error.
811 void TestMigrationOnWriteErrorMixedStreams(IoMode write_error_mode);
812 // Non-migratable stream triggers write error.
813 void TestMigrationOnWriteErrorMixedStreams2(IoMode write_error_mode);
jri9f303712016-09-13 01:10:22814 void TestMigrationOnWriteErrorMigrationDisabled(IoMode write_error_mode);
815 void TestMigrationOnWriteError(IoMode write_error_mode);
Zhongyi Shi0439ecc72018-07-11 04:41:26816 void TestMigrationOnWriteErrorWithMultipleRequests(IoMode write_error_mode);
jri9f303712016-09-13 01:10:22817 void TestMigrationOnWriteErrorNoNewNetwork(IoMode write_error_mode);
Zhongyi Shi7f1d9212018-06-22 23:24:36818 void TestMigrationOnMultipleWriteErrors(
819 IoMode write_error_mode_on_old_network,
820 IoMode write_error_mode_on_new_network);
Zhongyi Shib24001c02018-06-18 20:01:52821 void TestMigrationOnNetworkNotificationWithWriteErrorQueuedLater(
822 bool disconnected);
Zhongyi Shi1e2bc742018-06-16 02:06:07823 void TestMigrationOnWriteErrorWithNotificationQueuedLater(bool disconnected);
Zhongyi Shi9f316b262018-06-18 22:01:16824 void TestMigrationOnNetworkDisconnected(bool async_write_before);
Zhongyi Shia0644e32018-06-21 05:19:52825 void TestMigrationOnNetworkMadeDefault(IoMode write_mode);
Zhongyi Shi22fd5f52018-06-20 17:39:09826 void TestMigrationOnPathDegrading(bool async_write_before);
Zhongyi Shib3bc982c2018-07-10 19:59:24827 void TestMigrateSessionWithDrainingStream(
828 IoMode write_mode_for_queued_packet);
jri5b785512016-09-13 04:29:11829 void TestMigrationOnWriteErrorPauseBeforeConnected(IoMode write_error_mode);
Zhongyi Shi4ac9e1f2018-06-21 05:21:47830 void TestMigrationOnWriteErrorWithMultipleNotifications(
jri5b785512016-09-13 04:29:11831 IoMode write_error_mode,
Zhongyi Shi4ac9e1f2018-06-21 05:21:47832 bool disconnect_before_connect);
Zhongyi Shi634c1882018-08-16 04:05:59833 void TestNoAlternateNetworkBeforeHandshake(quic::QuicErrorCode error);
Zhongyi Shi8de43832018-08-15 23:40:00834 void TestNewConnectionOnAlternateNetworkBeforeHandshake(
835 quic::QuicErrorCode error);
jri9f303712016-09-13 01:10:22836
Jana Iyengarf6b13d82017-09-04 02:09:10837 QuicFlagSaver flags_; // Save/restore all QUIC flag values.
Renjiea0cb4a2c2018-09-26 23:37:30838 std::unique_ptr<MockHostResolverBase> host_resolver_;
Ryan Sleevib8449e02018-07-15 04:31:07839 std::unique_ptr<SSLConfigService> ssl_config_service_;
Zhongyi Shi5f587cc2017-11-21 23:24:17840 std::unique_ptr<MockClientSocketFactory> socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05841 MockCryptoClientStreamFactory crypto_client_stream_factory_;
Ryan Hamilton8d9ee76e2018-05-29 23:52:52842 quic::test::MockRandom random_generator_;
843 quic::MockClock clock_;
rtenneti38f5cd52014-10-28 20:28:28844 scoped_refptr<TestTaskRunner> runner_;
Ryan Hamilton8d9ee76e2018-05-29 23:52:52845 const quic::QuicTransportVersion version_;
Yixin Wang079ad542018-01-11 04:06:05846 const bool client_headers_include_h2_stream_dependency_;
alyssar2adf3ac2016-05-03 17:12:58847 QuicTestPacketMaker client_maker_;
848 QuicTestPacketMaker server_maker_;
rtenneticcab42b2015-10-09 06:38:16849 HttpServerPropertiesImpl http_server_properties_;
danakjad1777e2016-04-16 00:56:42850 std::unique_ptr<CertVerifier> cert_verifier_;
[email protected]080b77932014-08-04 01:22:46851 TransportSecurityState transport_security_state_;
danakjad1777e2016-04-16 00:56:42852 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
Ryan Sleevi8a9c9c12018-05-09 02:36:23853 DefaultCTPolicyEnforcer ct_policy_enforcer_;
danakjad1777e2016-04-16 00:56:42854 std::unique_ptr<ScopedMockNetworkChangeNotifier>
jri7e636642016-01-14 06:57:08855 scoped_mock_network_change_notifier_;
danakjad1777e2016-04-16 00:56:42856 std::unique_ptr<QuicStreamFactory> factory_;
[email protected]bf4ea2f2014-03-10 22:57:53857 HostPortPair host_port_pair_;
ckrasic3865ee0f2016-02-29 22:04:56858 GURL url_;
859 GURL url2_;
860 GURL url3_;
861 GURL url4_;
862
[email protected]9dd3ff0f2014-03-26 09:51:28863 PrivacyMode privacy_mode_;
tfarina42834112016-09-22 13:38:20864 NetLogWithSource net_log_;
[email protected]e13201d82012-12-12 05:00:32865 TestCompletionCallback callback_;
Zhongyi Shia6b68d112018-09-24 07:49:03866 const CompletionRepeatingCallback failed_on_default_network_callback_;
867 bool failed_on_default_network_;
Ryan Hamilton75f197262017-08-17 14:00:07868 NetErrorDetails net_error_details_;
jri7046038f2015-10-22 00:29:26869
870 // Variables to configure QuicStreamFactory.
rch431dd4452017-04-19 15:22:35871 bool store_server_configs_in_properties_;
Jana Iyengar903dec22017-11-28 00:44:23872 bool close_sessions_on_ip_change_;
Zhongyi Shi63574b72018-06-01 20:22:25873 bool goaway_sessions_on_ip_change_;
rtenneti41c09992015-11-30 18:24:01874 int idle_connection_timeout_seconds_;
zhongyidd1439f62016-09-02 02:02:26875 int reduced_ping_timeout_seconds_;
Yixin Wang469da562017-11-15 21:34:58876 int max_time_before_crypto_handshake_seconds_;
877 int max_idle_time_before_crypto_handshake_seconds_;
Zhongyi Shif4683a32017-12-01 00:03:28878 bool migrate_sessions_on_network_change_v2_;
879 bool migrate_sessions_early_v2_;
Zhongyi Shi8de43832018-08-15 23:40:00880 bool retry_on_alternate_network_before_handshake_;
Renjiea0cb4a2c2018-09-26 23:37:30881 bool race_stale_dns_on_connection_;
Renjiea5722ccf2018-08-10 00:18:49882 bool go_away_on_path_degrading_;
jri217455a12016-07-13 20:15:09883 bool allow_server_migration_;
rtennetid073dd22016-08-04 01:58:33884 bool race_cert_verification_;
rchd6163f32017-01-30 23:50:38885 bool estimate_initial_rtt_;
Ryan Hamilton8d9ee76e2018-05-29 23:52:52886 quic::QuicTagVector connection_options_;
887 quic::QuicTagVector client_connection_options_;
[email protected]e13201d82012-12-12 05:00:32888};
889
bnc359ed2a2016-04-29 20:43:45890class QuicStreamFactoryTest : public QuicStreamFactoryTestBase,
891 public ::testing::TestWithParam<TestParams> {
892 protected:
Yixin Wang079ad542018-01-11 04:06:05893 QuicStreamFactoryTest()
894 : QuicStreamFactoryTestBase(
895 GetParam().version,
896 GetParam().client_headers_include_h2_stream_dependency) {}
bnc359ed2a2016-04-29 20:43:45897};
898
Bence Békyce380cb2018-04-26 23:39:55899INSTANTIATE_TEST_CASE_P(VersionIncludeStreamDependencySequence,
rtenneti14abd312015-02-06 21:56:01900 QuicStreamFactoryTest,
901 ::testing::ValuesIn(GetTestParams()));
[email protected]1e960032013-12-20 19:00:20902
[email protected]1e960032013-12-20 19:00:20903TEST_P(QuicStreamFactoryTest, Create) {
jri7046038f2015-10-22 00:29:26904 Initialize();
rch6faa4d42016-01-05 20:48:43905 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
906 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26907
rcha00569732016-08-27 11:09:36908 MockQuicData socket_data;
909 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:43910 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:17911 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]e13201d82012-12-12 05:00:32912
zhongyi98d6a9262017-05-19 02:47:45913 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:33914 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:03915 request.Request(
916 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
917 SocketTag(),
918 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
919 failed_on_default_network_callback_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32920
robpercival214763f2016-07-01 23:27:01921 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:24922 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]0edce6a2013-05-08 18:02:40923 EXPECT_TRUE(stream.get());
[email protected]e13201d82012-12-12 05:00:32924
Renjiea0cb4a2c2018-09-26 23:37:30925 EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->last_request_priority());
Yixin Wang247ea642017-11-15 01:15:50926
zhongyi98d6a9262017-05-19 02:47:45927 QuicStreamRequest request2(factory_.get());
zhongyia00ca012017-07-06 23:36:39928 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:33929 DEFAULT_PRIORITY, SocketTag(),
930 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:03931 &net_error_details_,
932 failed_on_default_network_callback_,
933 callback_.callback()));
rch68a80eb2017-04-25 05:24:24934 // Will reset stream 3.
Yixin Wang7891a39d2017-11-08 20:59:24935 stream = CreateStream(&request2);
rch68a80eb2017-04-25 05:24:24936
937 EXPECT_TRUE(stream.get());
938
939 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
940 // in streams on different sessions.
zhongyi98d6a9262017-05-19 02:47:45941 QuicStreamRequest request3(factory_.get());
zhongyia00ca012017-07-06 23:36:39942 EXPECT_EQ(OK, request3.Request(host_port_pair_, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:33943 DEFAULT_PRIORITY, SocketTag(),
944 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:03945 &net_error_details_,
946 failed_on_default_network_callback_,
947 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:24948 stream = CreateStream(&request3); // Will reset stream 5.
Ryan Hamiltona12722b2017-08-12 02:23:20949 stream.reset(); // Will reset stream 7.
[email protected]e13201d82012-12-12 05:00:32950
rch37de576c2015-05-17 20:28:17951 EXPECT_TRUE(socket_data.AllReadDataConsumed());
952 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:32953}
954
[email protected]8bd2b812014-03-26 04:01:17955TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
jri7046038f2015-10-22 00:29:26956 Initialize();
Ryan Hamiltona12722b2017-08-12 02:23:20957 factory_->set_require_confirmation(false);
rch6faa4d42016-01-05 20:48:43958 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
959 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26960
rcha00569732016-08-27 11:09:36961 MockQuicData socket_data;
962 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:17963 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]8bd2b812014-03-26 04:01:17964
965 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:27966 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:30967 host_resolver_->set_synchronous_mode(true);
968 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
969 "192.168.0.1", "");
[email protected]8bd2b812014-03-26 04:01:17970
zhongyi98d6a9262017-05-19 02:47:45971 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:33972 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
973 DEFAULT_PRIORITY, SocketTag(),
974 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:03975 &net_error_details_,
976 failed_on_default_network_callback_,
977 callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17978
Yixin Wang7891a39d2017-11-08 20:59:24979 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]8bd2b812014-03-26 04:01:17980 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17981 EXPECT_TRUE(socket_data.AllReadDataConsumed());
982 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17983}
984
rchd6163f32017-01-30 23:50:38985TEST_P(QuicStreamFactoryTest, DefaultInitialRtt) {
986 Initialize();
987 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
988 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
989
990 MockQuicData socket_data;
991 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:43992 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:17993 socket_data.AddSocketDataToFactory(socket_factory_.get());
rchd6163f32017-01-30 23:50:38994
zhongyi98d6a9262017-05-19 02:47:45995 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:33996 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:03997 request.Request(
998 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
999 SocketTag(),
1000 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1001 failed_on_default_network_callback_, callback_.callback()));
rchd6163f32017-01-30 23:50:381002
1003 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241004 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rchd6163f32017-01-30 23:50:381005 EXPECT_TRUE(stream.get());
1006
1007 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
Ryan Hamiltona12722b2017-08-12 02:23:201008 EXPECT_TRUE(session->require_confirmation());
rchd6163f32017-01-30 23:50:381009 EXPECT_EQ(100000u, session->connection()->GetStats().srtt_us);
1010 ASSERT_FALSE(session->config()->HasInitialRoundTripTimeUsToSend());
1011}
1012
Helen Li0e823912017-09-25 19:48:301013TEST_P(QuicStreamFactoryTest, FactoryDestroyedWhenJobPending) {
1014 Initialize();
1015 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1016 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1017
1018 MockQuicData socket_data;
1019 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431020 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171021 socket_data.AddSocketDataToFactory(socket_factory_.get());
Helen Li0e823912017-09-25 19:48:301022
1023 auto request = std::make_unique<QuicStreamRequest>(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331024 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031025 request->Request(
1026 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1027 SocketTag(),
1028 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1029 failed_on_default_network_callback_, callback_.callback()));
Helen Li0e823912017-09-25 19:48:301030 request.reset();
1031 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
1032 // Tearing down a QuicStreamFactory with a pending Job should not cause any
1033 // crash. crbug.com/768343.
1034 factory_.reset();
1035}
1036
Ryan Hamiltona12722b2017-08-12 02:23:201037TEST_P(QuicStreamFactoryTest, RequireConfirmation) {
1038 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:271039 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:301040 host_resolver_->set_synchronous_mode(true);
1041 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1042 "192.168.0.1", "");
Ryan Hamiltona12722b2017-08-12 02:23:201043 Initialize();
1044 factory_->set_require_confirmation(true);
1045 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1046 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1047
1048 MockQuicData socket_data;
1049 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431050 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171051 socket_data.AddSocketDataToFactory(socket_factory_.get());
Ryan Hamiltona12722b2017-08-12 02:23:201052
1053 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331054 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031055 request.Request(
1056 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1057 SocketTag(),
1058 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1059 failed_on_default_network_callback_, callback_.callback()));
Ryan Hamiltona12722b2017-08-12 02:23:201060
Ryan Hamilton8e32a2b2017-08-28 20:06:521061 IPAddress last_address;
1062 EXPECT_FALSE(http_server_properties_.GetSupportsQuic(&last_address));
1063
Ryan Hamiltona12722b2017-08-12 02:23:201064 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521065 quic::QuicSession::HANDSHAKE_CONFIRMED);
Ryan Hamiltona12722b2017-08-12 02:23:201066
Ryan Hamilton8e32a2b2017-08-28 20:06:521067 EXPECT_TRUE(http_server_properties_.GetSupportsQuic(&last_address));
1068
Ryan Hamiltona12722b2017-08-12 02:23:201069 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241070 std::unique_ptr<HttpStream> stream = CreateStream(&request);
Ryan Hamiltona12722b2017-08-12 02:23:201071 EXPECT_TRUE(stream.get());
1072
1073 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1074 EXPECT_TRUE(session->require_confirmation());
1075}
1076
1077TEST_P(QuicStreamFactoryTest, DontRequireConfirmationFromSameIP) {
1078 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:271079 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:301080 host_resolver_->set_synchronous_mode(true);
1081 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1082 "192.168.0.1", "");
Ryan Hamiltona12722b2017-08-12 02:23:201083 Initialize();
1084 factory_->set_require_confirmation(true);
1085 http_server_properties_.SetSupportsQuic(IPAddress(192, 0, 2, 33));
1086
1087 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1088 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1089
1090 MockQuicData socket_data;
1091 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431092 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171093 socket_data.AddSocketDataToFactory(socket_factory_.get());
Ryan Hamiltona12722b2017-08-12 02:23:201094
1095 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031096 EXPECT_THAT(request.Request(
1097 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1098 SocketTag(),
1099 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1100 failed_on_default_network_callback_, callback_.callback()),
Paul Jensen8e3c5d32018-02-19 17:06:331101 IsOk());
Ryan Hamiltona12722b2017-08-12 02:23:201102
Ryan Hamilton8e32a2b2017-08-28 20:06:521103 IPAddress last_address;
1104 EXPECT_FALSE(http_server_properties_.GetSupportsQuic(&last_address));
1105
Yixin Wang7891a39d2017-11-08 20:59:241106 std::unique_ptr<HttpStream> stream = CreateStream(&request);
Ryan Hamiltona12722b2017-08-12 02:23:201107 EXPECT_TRUE(stream.get());
1108
1109 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1110 EXPECT_FALSE(session->require_confirmation());
Ryan Hamilton8e32a2b2017-08-28 20:06:521111
1112 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521113 quic::QuicSession::HANDSHAKE_CONFIRMED);
Ryan Hamilton8e32a2b2017-08-28 20:06:521114
1115 EXPECT_TRUE(http_server_properties_.GetSupportsQuic(&last_address));
Ryan Hamiltona12722b2017-08-12 02:23:201116}
1117
rchd6163f32017-01-30 23:50:381118TEST_P(QuicStreamFactoryTest, CachedInitialRtt) {
1119 ServerNetworkStats stats;
1120 stats.srtt = base::TimeDelta::FromMilliseconds(10);
1121 http_server_properties_.SetServerNetworkStats(url::SchemeHostPort(url_),
1122 stats);
1123 estimate_initial_rtt_ = true;
1124
1125 Initialize();
1126 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1127 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1128
1129 MockQuicData socket_data;
1130 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431131 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171132 socket_data.AddSocketDataToFactory(socket_factory_.get());
rchd6163f32017-01-30 23:50:381133
zhongyi98d6a9262017-05-19 02:47:451134 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331135 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031136 request.Request(
1137 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1138 SocketTag(),
1139 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1140 failed_on_default_network_callback_, callback_.callback()));
rchd6163f32017-01-30 23:50:381141
1142 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241143 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rchd6163f32017-01-30 23:50:381144 EXPECT_TRUE(stream.get());
1145
1146 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1147 EXPECT_EQ(10000u, session->connection()->GetStats().srtt_us);
1148 ASSERT_TRUE(session->config()->HasInitialRoundTripTimeUsToSend());
1149 EXPECT_EQ(10000u, session->config()->GetInitialRoundTripTimeUsToSend());
1150}
1151
1152TEST_P(QuicStreamFactoryTest, 2gInitialRtt) {
1153 ScopedMockNetworkChangeNotifier notifier;
1154 notifier.mock_network_change_notifier()->SetConnectionType(
1155 NetworkChangeNotifier::CONNECTION_2G);
1156 estimate_initial_rtt_ = true;
1157
1158 Initialize();
1159 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1160 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1161
1162 MockQuicData socket_data;
1163 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431164 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171165 socket_data.AddSocketDataToFactory(socket_factory_.get());
rchd6163f32017-01-30 23:50:381166
zhongyi98d6a9262017-05-19 02:47:451167 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331168 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031169 request.Request(
1170 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1171 SocketTag(),
1172 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1173 failed_on_default_network_callback_, callback_.callback()));
rchd6163f32017-01-30 23:50:381174
1175 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241176 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rchd6163f32017-01-30 23:50:381177 EXPECT_TRUE(stream.get());
1178
1179 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1180 EXPECT_EQ(1200000u, session->connection()->GetStats().srtt_us);
1181 ASSERT_TRUE(session->config()->HasInitialRoundTripTimeUsToSend());
1182 EXPECT_EQ(1200000u, session->config()->GetInitialRoundTripTimeUsToSend());
1183}
1184
1185TEST_P(QuicStreamFactoryTest, 3gInitialRtt) {
1186 ScopedMockNetworkChangeNotifier notifier;
1187 notifier.mock_network_change_notifier()->SetConnectionType(
1188 NetworkChangeNotifier::CONNECTION_3G);
1189 estimate_initial_rtt_ = true;
1190
1191 Initialize();
1192 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1193 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1194
1195 MockQuicData socket_data;
1196 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431197 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171198 socket_data.AddSocketDataToFactory(socket_factory_.get());
rchd6163f32017-01-30 23:50:381199
zhongyi98d6a9262017-05-19 02:47:451200 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331201 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031202 request.Request(
1203 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1204 SocketTag(),
1205 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1206 failed_on_default_network_callback_, callback_.callback()));
rchd6163f32017-01-30 23:50:381207
1208 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241209 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rchd6163f32017-01-30 23:50:381210 EXPECT_TRUE(stream.get());
1211
1212 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1213 EXPECT_EQ(400000u, session->connection()->GetStats().srtt_us);
1214 ASSERT_TRUE(session->config()->HasInitialRoundTripTimeUsToSend());
1215 EXPECT_EQ(400000u, session->config()->GetInitialRoundTripTimeUsToSend());
1216}
1217
rch68955482015-09-24 00:14:391218TEST_P(QuicStreamFactoryTest, GoAway) {
jri7046038f2015-10-22 00:29:261219 Initialize();
rch6faa4d42016-01-05 20:48:431220 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1221 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261222
rcha00569732016-08-27 11:09:361223 MockQuicData socket_data;
1224 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431225 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171226 socket_data.AddSocketDataToFactory(socket_factory_.get());
rch68955482015-09-24 00:14:391227
zhongyi98d6a9262017-05-19 02:47:451228 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331229 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031230 request.Request(
1231 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1232 SocketTag(),
1233 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1234 failed_on_default_network_callback_, callback_.callback()));
rch68955482015-09-24 00:14:391235
robpercival214763f2016-07-01 23:27:011236 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241237 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rch68955482015-09-24 00:14:391238 EXPECT_TRUE(stream.get());
1239
bnc912a04b2016-04-20 14:19:501240 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
rch68955482015-09-24 00:14:391241
Ryan Hamilton8d9ee76e2018-05-29 23:52:521242 session->OnGoAway(quic::QuicGoAwayFrame());
rch68955482015-09-24 00:14:391243
bnc912a04b2016-04-20 14:19:501244 EXPECT_FALSE(HasActiveSession(host_port_pair_));
rch68955482015-09-24 00:14:391245
1246 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1247 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1248}
1249
zhongyi6b5a3892016-03-12 04:46:201250TEST_P(QuicStreamFactoryTest, GoAwayForConnectionMigrationWithPortOnly) {
1251 Initialize();
1252 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1253 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1254
rcha00569732016-08-27 11:09:361255 MockQuicData socket_data;
1256 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431257 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171258 socket_data.AddSocketDataToFactory(socket_factory_.get());
zhongyi6b5a3892016-03-12 04:46:201259
zhongyi98d6a9262017-05-19 02:47:451260 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331261 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031262 request.Request(
1263 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1264 SocketTag(),
1265 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1266 failed_on_default_network_callback_, callback_.callback()));
zhongyi6b5a3892016-03-12 04:46:201267
robpercival214763f2016-07-01 23:27:011268 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241269 std::unique_ptr<HttpStream> stream = CreateStream(&request);
zhongyi6b5a3892016-03-12 04:46:201270 EXPECT_TRUE(stream.get());
1271
bnc912a04b2016-04-20 14:19:501272 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
zhongyi6b5a3892016-03-12 04:46:201273
Ryan Hamilton8d9ee76e2018-05-29 23:52:521274 session->OnGoAway(quic::QuicGoAwayFrame(
1275 quic::kInvalidControlFrameId, quic::QUIC_ERROR_MIGRATING_PORT, 0,
1276 "peer connection migration due to port change only"));
zhongyi6b5a3892016-03-12 04:46:201277 NetErrorDetails details;
1278 EXPECT_FALSE(details.quic_port_migration_detected);
1279 session->PopulateNetErrorDetails(&details);
1280 EXPECT_TRUE(details.quic_port_migration_detected);
1281 details.quic_port_migration_detected = false;
1282 stream->PopulateNetErrorDetails(&details);
1283 EXPECT_TRUE(details.quic_port_migration_detected);
1284
bnc912a04b2016-04-20 14:19:501285 EXPECT_FALSE(HasActiveSession(host_port_pair_));
zhongyi6b5a3892016-03-12 04:46:201286
1287 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1288 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1289}
1290
[email protected]5db452202014-08-19 05:22:151291TEST_P(QuicStreamFactoryTest, Pooling) {
jri7046038f2015-10-22 00:29:261292 Initialize();
rch6faa4d42016-01-05 20:48:431293 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1294 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261295
rcha00569732016-08-27 11:09:361296 MockQuicData socket_data;
1297 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431298 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171299 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]eed749f92013-12-23 18:57:381300
rch6faa4d42016-01-05 20:48:431301 HostPortPair server2(kServer2HostName, kDefaultServerPort);
Renjiea0cb4a2c2018-09-26 23:37:301302 host_resolver_->set_synchronous_mode(true);
1303 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1304 "192.168.0.1", "");
1305 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:381306
zhongyi98d6a9262017-05-19 02:47:451307 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331308 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
1309 DEFAULT_PRIORITY, SocketTag(),
1310 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:031311 &net_error_details_,
1312 failed_on_default_network_callback_,
1313 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241314 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]eed749f92013-12-23 18:57:381315 EXPECT_TRUE(stream.get());
1316
1317 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451318 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031319 EXPECT_EQ(OK,
1320 request2.Request(
1321 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1322 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1323 failed_on_default_network_callback_, callback.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241324 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]eed749f92013-12-23 18:57:381325 EXPECT_TRUE(stream2.get());
1326
bnc912a04b2016-04-20 14:19:501327 EXPECT_EQ(GetActiveSession(host_port_pair_), GetActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:381328
rch37de576c2015-05-17 20:28:171329 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1330 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:381331}
1332
jri94ddc3142016-08-26 01:32:431333TEST_P(QuicStreamFactoryTest, PoolingWithServerMigration) {
1334 // Set up session to migrate.
Renjiea0cb4a2c2018-09-26 23:37:301335 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1336 "192.168.0.1", "");
jri94ddc3142016-08-26 01:32:431337 IPEndPoint alt_address = IPEndPoint(IPAddress(1, 2, 3, 4), 443);
Ryan Hamilton8d9ee76e2018-05-29 23:52:521338 quic::QuicConfig config;
fayang91ca2012016-11-22 07:42:461339 config.SetAlternateServerAddressToSend(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521340 quic::QuicSocketAddress(quic::QuicSocketAddressImpl(alt_address)));
jri94ddc3142016-08-26 01:32:431341
1342 VerifyServerMigration(config, alt_address);
1343
1344 // Close server-migrated session.
1345 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
Renjieba55fae2018-09-20 03:05:161346 session->CloseSessionOnError(0u, quic::QUIC_NO_ERROR,
1347 quic::ConnectionCloseBehavior::SILENT_CLOSE);
jri94ddc3142016-08-26 01:32:431348
1349 // Set up server IP, socket, proof, and config for new session.
1350 HostPortPair server2(kServer2HostName, kDefaultServerPort);
Renjiea0cb4a2c2018-09-26 23:37:301351 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
jri94ddc3142016-08-26 01:32:431352
1353 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
Ryan Hamilton8d9ee76e2018-05-29 23:52:521354 std::unique_ptr<quic::QuicEncryptedPacket> settings_packet(
rch5cb522462017-04-25 20:18:361355 client_maker_.MakeInitialSettingsPacket(1, nullptr));
bnceb9aa7112017-01-05 01:03:461356 MockWrite writes[] = {MockWrite(SYNCHRONOUS, settings_packet->data(),
1357 settings_packet->length(), 1)};
fayang3bcb8b502016-12-07 21:44:371358
Ryan Sleevib8d7ea02018-05-07 20:01:011359 SequencedSocketData socket_data(reads, writes);
Zhongyi Shi5f587cc2017-11-21 23:24:171360 socket_factory_->AddSocketDataProvider(&socket_data);
jri94ddc3142016-08-26 01:32:431361
1362 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1363 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
Ryan Hamilton8d9ee76e2018-05-29 23:52:521364 quic::QuicConfig config2;
jri94ddc3142016-08-26 01:32:431365 crypto_client_stream_factory_.SetConfig(config2);
1366
1367 // Create new request to cause new session creation.
1368 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451369 QuicStreamRequest request2(factory_.get());
jri94ddc3142016-08-26 01:32:431370 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031371 request2.Request(
1372 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1373 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1374 failed_on_default_network_callback_, callback.callback()));
jri94ddc3142016-08-26 01:32:431375 EXPECT_EQ(OK, callback.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:241376 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
jri94ddc3142016-08-26 01:32:431377 EXPECT_TRUE(stream2.get());
1378
1379 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1380 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1381 // EXPECT_EQ(GetActiveSession(host_port_pair_), GetActiveSession(server2));
1382}
1383
[email protected]eed749f92013-12-23 18:57:381384TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
jri7046038f2015-10-22 00:29:261385 Initialize();
rch6faa4d42016-01-05 20:48:431386 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1387 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1388 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261389
rcha00569732016-08-27 11:09:361390 MockQuicData socket_data1;
1391 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431392 socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171393 socket_data1.AddSocketDataToFactory(socket_factory_.get());
rcha00569732016-08-27 11:09:361394 MockQuicData socket_data2;
1395 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431396 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171397 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]eed749f92013-12-23 18:57:381398
rch6faa4d42016-01-05 20:48:431399 HostPortPair server2(kServer2HostName, kDefaultServerPort);
Renjiea0cb4a2c2018-09-26 23:37:301400 host_resolver_->set_synchronous_mode(true);
1401 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1402 "192.168.0.1", "");
1403 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:381404
zhongyi98d6a9262017-05-19 02:47:451405 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331406 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
1407 DEFAULT_PRIORITY, SocketTag(),
1408 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:031409 &net_error_details_,
1410 failed_on_default_network_callback_,
1411 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241412 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]eed749f92013-12-23 18:57:381413 EXPECT_TRUE(stream.get());
1414
1415 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451416 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031417 EXPECT_EQ(OK,
1418 request2.Request(
1419 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1420 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1421 failed_on_default_network_callback_, callback.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241422 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]eed749f92013-12-23 18:57:381423 EXPECT_TRUE(stream2.get());
1424
bnc912a04b2016-04-20 14:19:501425 factory_->OnSessionGoingAway(GetActiveSession(host_port_pair_));
1426 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1427 EXPECT_FALSE(HasActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:381428
1429 TestCompletionCallback callback3;
zhongyi98d6a9262017-05-19 02:47:451430 QuicStreamRequest request3(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031431 EXPECT_EQ(OK,
1432 request3.Request(
1433 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1434 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1435 failed_on_default_network_callback_, callback3.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241436 std::unique_ptr<HttpStream> stream3 = CreateStream(&request3);
[email protected]eed749f92013-12-23 18:57:381437 EXPECT_TRUE(stream3.get());
1438
bnc912a04b2016-04-20 14:19:501439 EXPECT_TRUE(HasActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:381440
rch37de576c2015-05-17 20:28:171441 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1442 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1443 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1444 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:381445}
1446
[email protected]5db452202014-08-19 05:22:151447TEST_P(QuicStreamFactoryTest, HttpsPooling) {
jri7046038f2015-10-22 00:29:261448 Initialize();
rch6faa4d42016-01-05 20:48:431449
rcha00569732016-08-27 11:09:361450 MockQuicData socket_data;
1451 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431452 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171453 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]eed749f92013-12-23 18:57:381454
rch6faa4d42016-01-05 20:48:431455 HostPortPair server1(kDefaultServerHostName, 443);
1456 HostPortPair server2(kServer2HostName, 443);
[email protected]eed749f92013-12-23 18:57:381457
bncf8bf0722015-05-19 20:04:131458 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011459 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:381460
Renjiea0cb4a2c2018-09-26 23:37:301461 host_resolver_->set_synchronous_mode(true);
1462 host_resolver_->rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1463 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:381464
zhongyi98d6a9262017-05-19 02:47:451465 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031466 EXPECT_EQ(OK,
1467 request.Request(
1468 server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1469 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1470 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241471 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]eed749f92013-12-23 18:57:381472 EXPECT_TRUE(stream.get());
1473
1474 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451475 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031476 EXPECT_EQ(OK,
1477 request2.Request(
1478 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1479 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1480 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241481 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]eed749f92013-12-23 18:57:381482 EXPECT_TRUE(stream2.get());
1483
bnc912a04b2016-04-20 14:19:501484 EXPECT_EQ(GetActiveSession(server1), GetActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:381485
rch37de576c2015-05-17 20:28:171486 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1487 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:381488}
1489
[email protected]5db452202014-08-19 05:22:151490TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
jri7046038f2015-10-22 00:29:261491 Initialize();
rcha00569732016-08-27 11:09:361492 MockQuicData socket_data;
1493 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431494 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171495 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]5db452202014-08-19 05:22:151496
rch6faa4d42016-01-05 20:48:431497 HostPortPair server1(kDefaultServerHostName, 443);
1498 HostPortPair server2(kServer2HostName, 443);
Matt Mueller230996f12018-10-22 19:39:441499 transport_security_state_.EnableStaticPinsForTesting();
1500 ScopedTransportSecurityStateSource scoped_security_state_source;
[email protected]5db452202014-08-19 05:22:151501
Matt Mueller230996f12018-10-22 19:39:441502 HashValue primary_pin(HASH_VALUE_SHA256);
1503 EXPECT_TRUE(primary_pin.FromString(
1504 "sha256/Nn8jk5By4Vkq6BeOVZ7R7AC6XUUBZsWmUbJR1f1Y5FY="));
bncf8bf0722015-05-19 20:04:131505 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
Matt Mueller230996f12018-10-22 19:39:441506 verify_details.cert_verify_result.public_key_hashes.push_back(primary_pin);
bnc20daf9a2015-05-15 17:11:011507 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]5db452202014-08-19 05:22:151508
Renjiea0cb4a2c2018-09-26 23:37:301509 host_resolver_->set_synchronous_mode(true);
1510 host_resolver_->rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1511 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]5db452202014-08-19 05:22:151512
zhongyi98d6a9262017-05-19 02:47:451513 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031514 EXPECT_EQ(OK,
1515 request.Request(
1516 server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1517 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1518 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241519 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]5db452202014-08-19 05:22:151520 EXPECT_TRUE(stream.get());
1521
1522 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451523 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031524 EXPECT_EQ(OK,
1525 request2.Request(
1526 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1527 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1528 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241529 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]5db452202014-08-19 05:22:151530 EXPECT_TRUE(stream2.get());
1531
bnc912a04b2016-04-20 14:19:501532 EXPECT_EQ(GetActiveSession(server1), GetActiveSession(server2));
[email protected]5db452202014-08-19 05:22:151533
rch37de576c2015-05-17 20:28:171534 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1535 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:151536}
1537
1538TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
jri7046038f2015-10-22 00:29:261539 Initialize();
rcha00569732016-08-27 11:09:361540
1541 MockQuicData socket_data1;
1542 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431543 socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171544 socket_data1.AddSocketDataToFactory(socket_factory_.get());
rcha00569732016-08-27 11:09:361545 MockQuicData socket_data2;
1546 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431547 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171548 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]5db452202014-08-19 05:22:151549
rch6faa4d42016-01-05 20:48:431550 HostPortPair server1(kDefaultServerHostName, 443);
1551 HostPortPair server2(kServer2HostName, 443);
Matt Mueller230996f12018-10-22 19:39:441552 transport_security_state_.EnableStaticPinsForTesting();
1553 ScopedTransportSecurityStateSource scoped_security_state_source;
[email protected]5db452202014-08-19 05:22:151554
bncf8bf0722015-05-19 20:04:131555 ProofVerifyDetailsChromium verify_details1 = DefaultProofVerifyDetails();
Matt Mueller230996f12018-10-22 19:39:441556 uint8_t bad_pin = 3;
bnc20daf9a2015-05-15 17:11:011557 verify_details1.cert_verify_result.public_key_hashes.push_back(
1558 test::GetTestHashValue(bad_pin));
1559 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
1560
Matt Mueller230996f12018-10-22 19:39:441561 HashValue primary_pin(HASH_VALUE_SHA256);
1562 EXPECT_TRUE(primary_pin.FromString(
1563 "sha256/Nn8jk5By4Vkq6BeOVZ7R7AC6XUUBZsWmUbJR1f1Y5FY="));
bncf8bf0722015-05-19 20:04:131564 ProofVerifyDetailsChromium verify_details2 = DefaultProofVerifyDetails();
Matt Mueller230996f12018-10-22 19:39:441565 verify_details2.cert_verify_result.public_key_hashes.push_back(primary_pin);
bnc20daf9a2015-05-15 17:11:011566 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
[email protected]5db452202014-08-19 05:22:151567
Renjiea0cb4a2c2018-09-26 23:37:301568 host_resolver_->set_synchronous_mode(true);
1569 host_resolver_->rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1570 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]5db452202014-08-19 05:22:151571
zhongyi98d6a9262017-05-19 02:47:451572 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031573 EXPECT_EQ(OK,
1574 request.Request(
1575 server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1576 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1577 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241578 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]5db452202014-08-19 05:22:151579 EXPECT_TRUE(stream.get());
1580
1581 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451582 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031583 EXPECT_EQ(OK,
1584 request2.Request(
1585 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1586 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1587 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241588 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]5db452202014-08-19 05:22:151589 EXPECT_TRUE(stream2.get());
1590
bnc912a04b2016-04-20 14:19:501591 EXPECT_NE(GetActiveSession(server1), GetActiveSession(server2));
[email protected]5db452202014-08-19 05:22:151592
rch37de576c2015-05-17 20:28:171593 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1594 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1595 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1596 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:151597}
1598
[email protected]1e960032013-12-20 19:00:201599TEST_P(QuicStreamFactoryTest, Goaway) {
jri7046038f2015-10-22 00:29:261600 Initialize();
rch6faa4d42016-01-05 20:48:431601 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1602 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1603 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1604
rcha00569732016-08-27 11:09:361605 MockQuicData socket_data;
1606 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431607 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171608 socket_data.AddSocketDataToFactory(socket_factory_.get());
rcha00569732016-08-27 11:09:361609 MockQuicData socket_data2;
1610 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431611 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171612 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]4d283b32013-10-17 12:57:271613
zhongyi98d6a9262017-05-19 02:47:451614 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331615 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031616 request.Request(
1617 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1618 SocketTag(),
1619 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1620 failed_on_default_network_callback_, callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271621
robpercival214763f2016-07-01 23:27:011622 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241623 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]4d283b32013-10-17 12:57:271624 EXPECT_TRUE(stream.get());
1625
1626 // Mark the session as going away. Ensure that while it is still alive
1627 // that it is no longer active.
bnc912a04b2016-04-20 14:19:501628 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7046038f2015-10-22 00:29:261629 factory_->OnSessionGoingAway(session);
1630 EXPECT_EQ(true,
1631 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
bnc912a04b2016-04-20 14:19:501632 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]4d283b32013-10-17 12:57:271633
1634 // Create a new request for the same destination and verify that a
1635 // new session is created.
zhongyi98d6a9262017-05-19 02:47:451636 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331637 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031638 request2.Request(
1639 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1640 SocketTag(),
1641 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1642 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:011643 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241644 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]4d283b32013-10-17 12:57:271645 EXPECT_TRUE(stream2.get());
1646
bnc912a04b2016-04-20 14:19:501647 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1648 EXPECT_NE(session, GetActiveSession(host_port_pair_));
jri7046038f2015-10-22 00:29:261649 EXPECT_EQ(true,
1650 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
[email protected]4d283b32013-10-17 12:57:271651
1652 stream2.reset();
1653 stream.reset();
1654
rch37de576c2015-05-17 20:28:171655 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1656 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1657 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1658 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]4d283b32013-10-17 12:57:271659}
1660
[email protected]1e960032013-12-20 19:00:201661TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
jri7046038f2015-10-22 00:29:261662 Initialize();
rch6faa4d42016-01-05 20:48:431663 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1664 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1665
Ryan Hamilton8d9ee76e2018-05-29 23:52:521666 quic::QuicStreamId stream_id = GetNthClientInitiatedStreamId(0);
rcha00569732016-08-27 11:09:361667 MockQuicData socket_data;
Zhongyi Shi32f2fd02018-04-16 18:23:431668 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
fayang3bcb8b502016-12-07 21:44:371669 socket_data.AddWrite(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521670 SYNCHRONOUS, client_maker_.MakeRstPacket(2, true, stream_id,
1671 quic::QUIC_STREAM_CANCELLED));
1672 socket_data.AddRead(ASYNC,
1673 server_maker_.MakeRstPacket(1, false, stream_id,
1674 quic::QUIC_STREAM_CANCELLED));
rcha00569732016-08-27 11:09:361675 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:171676 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]0b2294d32013-08-02 00:46:361677
1678 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:391679 request_info.traffic_annotation =
1680 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
1681
xunjieli1d2b4272017-04-25 22:37:171682 std::vector<std::unique_ptr<HttpStream>> streams;
Ryan Hamilton9835e662018-08-02 05:36:271683 // The MockCryptoClientStream sets max_open_streams to be
Ryan Hamilton8d9ee76e2018-05-29 23:52:521684 // quic::kDefaultMaxStreamsPerConnection / 2.
1685 for (size_t i = 0; i < quic::kDefaultMaxStreamsPerConnection / 2; i++) {
zhongyi98d6a9262017-05-19 02:47:451686 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031687 int rv = request.Request(
1688 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1689 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1690 failed_on_default_network_callback_, callback_.callback());
[email protected]0b2294d32013-08-02 00:46:361691 if (i == 0) {
robpercival214763f2016-07-01 23:27:011692 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1693 EXPECT_THAT(callback_.WaitForResult(), IsOk());
[email protected]0b2294d32013-08-02 00:46:361694 } else {
robpercival214763f2016-07-01 23:27:011695 EXPECT_THAT(rv, IsOk());
[email protected]0b2294d32013-08-02 00:46:361696 }
Yixin Wang7891a39d2017-11-08 20:59:241697 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]0b2294d32013-08-02 00:46:361698 EXPECT_TRUE(stream);
Steven Valdezb4ff0412018-01-18 22:39:271699 EXPECT_EQ(OK,
1700 stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:391701 net_log_, CompletionOnceCallback()));
avib3635452016-10-21 18:33:531702 streams.push_back(std::move(stream));
[email protected]0b2294d32013-08-02 00:46:361703 }
1704
zhongyi98d6a9262017-05-19 02:47:451705 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331706 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
1707 DEFAULT_PRIORITY, SocketTag(),
1708 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:031709 &net_error_details_,
1710 failed_on_default_network_callback_,
1711 CompletionOnceCallback()));
Yixin Wang7891a39d2017-11-08 20:59:241712 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]0b2294d32013-08-02 00:46:361713 EXPECT_TRUE(stream);
rjshaded5ced072015-12-18 19:26:021714 EXPECT_EQ(ERR_IO_PENDING,
Steven Valdezb4ff0412018-01-18 22:39:271715 stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
1716 net_log_, callback_.callback()));
[email protected]0b2294d32013-08-02 00:46:361717
1718 // Close the first stream.
1719 streams.front()->Close(false);
ckrasicea295fe2015-10-31 05:03:271720 // Trigger exchange of RSTs that in turn allow progress for the last
1721 // stream.
robpercival214763f2016-07-01 23:27:011722 EXPECT_THAT(callback_.WaitForResult(), IsOk());
[email protected]0b2294d32013-08-02 00:46:361723
rch37de576c2015-05-17 20:28:171724 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1725 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
ckrasicea295fe2015-10-31 05:03:271726
1727 // Force close of the connection to suppress the generation of RST
1728 // packets when streams are torn down, which wouldn't be relevant to
1729 // this test anyway.
bnc912a04b2016-04-20 14:19:501730 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:521731 session->connection()->CloseConnection(
1732 quic::QUIC_PUBLIC_RESET, "test",
1733 quic::ConnectionCloseBehavior::SILENT_CLOSE);
[email protected]0b2294d32013-08-02 00:46:361734}
1735
[email protected]1e960032013-12-20 19:00:201736TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
jri7046038f2015-10-22 00:29:261737 Initialize();
rcha00569732016-08-27 11:09:361738 MockQuicData socket_data;
Zhongyi Shi5f587cc2017-11-21 23:24:171739 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]e13201d82012-12-12 05:00:321740
Renjiea0cb4a2c2018-09-26 23:37:301741 host_resolver_->rules()->AddSimulatedFailure(kDefaultServerHostName);
[email protected]e13201d82012-12-12 05:00:321742
zhongyi98d6a9262017-05-19 02:47:451743 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331744 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031745 request.Request(
1746 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1747 SocketTag(),
1748 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1749 failed_on_default_network_callback_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321750
robpercival214763f2016-07-01 23:27:011751 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
[email protected]e13201d82012-12-12 05:00:321752
rch37de576c2015-05-17 20:28:171753 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1754 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321755}
1756
[email protected]1e960032013-12-20 19:00:201757TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
jri7046038f2015-10-22 00:29:261758 Initialize();
rcha00569732016-08-27 11:09:361759
1760 MockQuicData socket_data;
1761 socket_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
Zhongyi Shi5f587cc2017-11-21 23:24:171762 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]3c772402013-12-18 21:38:111763
zhongyi98d6a9262017-05-19 02:47:451764 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331765 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031766 request.Request(
1767 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1768 SocketTag(),
1769 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1770 failed_on_default_network_callback_, callback_.callback()));
[email protected]3c772402013-12-18 21:38:111771
robpercival214763f2016-07-01 23:27:011772 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_ADDRESS_IN_USE));
[email protected]3c772402013-12-18 21:38:111773
rch37de576c2015-05-17 20:28:171774 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1775 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:111776}
1777
[email protected]1e960032013-12-20 19:00:201778TEST_P(QuicStreamFactoryTest, CancelCreate) {
jri7046038f2015-10-22 00:29:261779 Initialize();
rcha00569732016-08-27 11:09:361780 MockQuicData socket_data;
1781 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431782 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171783 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]e13201d82012-12-12 05:00:321784 {
zhongyi98d6a9262017-05-19 02:47:451785 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331786 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031787 request.Request(
1788 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1789 SocketTag(),
1790 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1791 failed_on_default_network_callback_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321792 }
1793
mmenke651bae7f2015-12-18 21:26:451794 base::RunLoop().RunUntilIdle();
[email protected]e13201d82012-12-12 05:00:321795
zhongyi98d6a9262017-05-19 02:47:451796 QuicStreamRequest request2(factory_.get());
zhongyia00ca012017-07-06 23:36:391797 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:331798 DEFAULT_PRIORITY, SocketTag(),
1799 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:031800 &net_error_details_,
1801 failed_on_default_network_callback_,
1802 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241803 std::unique_ptr<HttpStream> stream = CreateStream(&request2);
rch68a80eb2017-04-25 05:24:241804
[email protected]e13201d82012-12-12 05:00:321805 EXPECT_TRUE(stream.get());
1806 stream.reset();
1807
rch37de576c2015-05-17 20:28:171808 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1809 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321810}
1811
[email protected]1e960032013-12-20 19:00:201812TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
jri7046038f2015-10-22 00:29:261813 Initialize();
rch6faa4d42016-01-05 20:48:431814 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1815 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1816 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1817
rcha00569732016-08-27 11:09:361818 MockQuicData socket_data;
1819 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431820 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Ryan Hamilton8d9ee76e2018-05-29 23:52:521821 socket_data.AddWrite(
1822 SYNCHRONOUS, ConstructClientRstPacket(2, quic::QUIC_RST_ACKNOWLEDGEMENT));
Renjieba55fae2018-09-20 03:05:161823 socket_data.AddWrite(SYNCHRONOUS,
1824 client_maker_.MakeConnectionClosePacket(
1825 3, true, quic::QUIC_INTERNAL_ERROR, "net error"));
Zhongyi Shi5f587cc2017-11-21 23:24:171826 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]56dfb902013-01-03 23:17:551827
rcha00569732016-08-27 11:09:361828 MockQuicData socket_data2;
1829 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431830 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171831 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]56dfb902013-01-03 23:17:551832
zhongyi98d6a9262017-05-19 02:47:451833 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331834 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031835 request.Request(
1836 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1837 SocketTag(),
1838 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1839 failed_on_default_network_callback_, callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551840
robpercival214763f2016-07-01 23:27:011841 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241842 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]0b2294d32013-08-02 00:46:361843 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:391844 request_info.traffic_annotation =
1845 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:271846 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:391847 net_log_, CompletionOnceCallback()));
[email protected]56dfb902013-01-03 23:17:551848
1849 // Close the session and verify that stream saw the error.
Ryan Hamilton8d9ee76e2018-05-29 23:52:521850 factory_->CloseAllSessions(ERR_INTERNET_DISCONNECTED,
1851 quic::QUIC_INTERNAL_ERROR);
[email protected]56dfb902013-01-03 23:17:551852 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1853 stream->ReadResponseHeaders(callback_.callback()));
1854
1855 // Now attempting to request a stream to the same origin should create
1856 // a new session.
1857
zhongyi98d6a9262017-05-19 02:47:451858 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331859 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031860 request2.Request(
1861 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1862 SocketTag(),
1863 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1864 failed_on_default_network_callback_, callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551865
robpercival214763f2016-07-01 23:27:011866 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241867 stream = CreateStream(&request2);
[email protected]56dfb902013-01-03 23:17:551868 stream.reset(); // Will reset stream 3.
1869
rch37de576c2015-05-17 20:28:171870 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1871 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1872 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1873 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]56dfb902013-01-03 23:17:551874}
1875
zhongyi363c91c2017-03-23 23:16:081876// Regression test for crbug.com/700617. Test a write error during the
1877// crypto handshake will not hang QuicStreamFactory::Job and should
1878// report QUIC_HANDSHAKE_FAILED to upper layers. Subsequent
1879// QuicStreamRequest should succeed without hanging.
1880TEST_P(QuicStreamFactoryTest,
1881 WriteErrorInCryptoConnectWithAsyncHostResolution) {
1882 Initialize();
1883 // Use unmocked crypto stream to do crypto connect.
1884 crypto_client_stream_factory_.set_handshake_mode(
Zhongyi Shi879659422018-08-02 17:58:251885 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
zhongyi363c91c2017-03-23 23:16:081886
1887 MockQuicData socket_data;
1888 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1889 // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect.
1890 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:171891 socket_data.AddSocketDataToFactory(socket_factory_.get());
zhongyi363c91c2017-03-23 23:16:081892
1893 // Create request, should fail after the write of the CHLO fails.
zhongyi98d6a9262017-05-19 02:47:451894 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331895 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031896 request.Request(
1897 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1898 SocketTag(),
1899 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1900 failed_on_default_network_callback_, callback_.callback()));
zhongyi363c91c2017-03-23 23:16:081901 EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, callback_.WaitForResult());
1902 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1903 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
1904
1905 // Verify new requests can be sent normally without hanging.
1906 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:271907 MockCryptoClientStream::COLD_START);
zhongyi363c91c2017-03-23 23:16:081908 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1909 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1910 MockQuicData socket_data2;
1911 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431912 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171913 socket_data2.AddSocketDataToFactory(socket_factory_.get());
zhongyi363c91c2017-03-23 23:16:081914
zhongyi98d6a9262017-05-19 02:47:451915 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331916 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031917 request2.Request(
1918 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1919 SocketTag(),
1920 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1921 failed_on_default_network_callback_, callback_.callback()));
zhongyi363c91c2017-03-23 23:16:081922 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1923 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
1924 // Run the message loop to complete host resolution.
1925 base::RunLoop().RunUntilIdle();
1926
1927 // Complete handshake. QuicStreamFactory::Job should complete and succeed.
1928 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521929 quic::QuicSession::HANDSHAKE_CONFIRMED);
zhongyi363c91c2017-03-23 23:16:081930 EXPECT_THAT(callback_.WaitForResult(), IsOk());
1931 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1932 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
1933
1934 // Create QuicHttpStream.
Yixin Wang7891a39d2017-11-08 20:59:241935 std::unique_ptr<HttpStream> stream = CreateStream(&request2);
zhongyi363c91c2017-03-23 23:16:081936 EXPECT_TRUE(stream.get());
1937 stream.reset();
1938 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1939 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1940 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1941 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1942}
1943
1944TEST_P(QuicStreamFactoryTest, WriteErrorInCryptoConnectWithSyncHostResolution) {
1945 Initialize();
1946 // Use unmocked crypto stream to do crypto connect.
1947 crypto_client_stream_factory_.set_handshake_mode(
Zhongyi Shi879659422018-08-02 17:58:251948 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
Renjiea0cb4a2c2018-09-26 23:37:301949 host_resolver_->set_synchronous_mode(true);
1950 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1951 "192.168.0.1", "");
zhongyi363c91c2017-03-23 23:16:081952
1953 MockQuicData socket_data;
1954 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1955 // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect.
1956 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:171957 socket_data.AddSocketDataToFactory(socket_factory_.get());
zhongyi363c91c2017-03-23 23:16:081958
1959 // Create request, should fail immediately.
zhongyi98d6a9262017-05-19 02:47:451960 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331961 EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED,
Zhongyi Shia6b68d112018-09-24 07:49:031962 request.Request(
1963 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1964 SocketTag(),
1965 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1966 failed_on_default_network_callback_, callback_.callback()));
zhongyi363c91c2017-03-23 23:16:081967 // Check no active session, or active jobs left for this server.
1968 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1969 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
1970
1971 // Verify new requests can be sent normally without hanging.
1972 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:271973 MockCryptoClientStream::COLD_START);
zhongyi363c91c2017-03-23 23:16:081974 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1975 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1976 MockQuicData socket_data2;
1977 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431978 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171979 socket_data2.AddSocketDataToFactory(socket_factory_.get());
zhongyi363c91c2017-03-23 23:16:081980
zhongyi98d6a9262017-05-19 02:47:451981 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331982 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031983 request2.Request(
1984 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1985 SocketTag(),
1986 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1987 failed_on_default_network_callback_, callback_.callback()));
zhongyi363c91c2017-03-23 23:16:081988 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1989 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
1990
1991 // Complete handshake.
1992 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521993 quic::QuicSession::HANDSHAKE_CONFIRMED);
zhongyi363c91c2017-03-23 23:16:081994 EXPECT_THAT(callback_.WaitForResult(), IsOk());
1995 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1996 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
1997
1998 // Create QuicHttpStream.
Yixin Wang7891a39d2017-11-08 20:59:241999 std::unique_ptr<HttpStream> stream = CreateStream(&request2);
zhongyi363c91c2017-03-23 23:16:082000 EXPECT_TRUE(stream.get());
2001 stream.reset();
2002 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2003 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2004 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2005 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2006}
2007
Zhongyi Shi63574b72018-06-01 20:22:252008TEST_P(QuicStreamFactoryTest, CloseSessionsOnIPAddressChanged) {
Jana Iyengar903dec22017-11-28 00:44:232009 close_sessions_on_ip_change_ = true;
jri7046038f2015-10-22 00:29:262010 Initialize();
rch6faa4d42016-01-05 20:48:432011 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2012 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2013 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri8c44d692015-10-23 23:53:412014
rcha00569732016-08-27 11:09:362015 MockQuicData socket_data;
2016 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432017 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Ryan Hamilton8d9ee76e2018-05-29 23:52:522018 socket_data.AddWrite(
2019 SYNCHRONOUS, ConstructClientRstPacket(2, quic::QUIC_RST_ACKNOWLEDGEMENT));
Renjieba55fae2018-09-20 03:05:162020 socket_data.AddWrite(
2021 SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
2022 3, true, quic::QUIC_IP_ADDRESS_CHANGED, "net error"));
Zhongyi Shi5f587cc2017-11-21 23:24:172023 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]f698a012013-05-06 20:18:592024
rcha00569732016-08-27 11:09:362025 MockQuicData socket_data2;
2026 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432027 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:172028 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]f698a012013-05-06 20:18:592029
zhongyi98d6a9262017-05-19 02:47:452030 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332031 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032032 request.Request(
2033 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2034 SocketTag(),
2035 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2036 failed_on_default_network_callback_, callback_.callback()));
[email protected]f698a012013-05-06 20:18:592037
robpercival214763f2016-07-01 23:27:012038 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242039 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]0b2294d32013-08-02 00:46:362040 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:392041 request_info.traffic_annotation =
2042 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272043 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392044 net_log_, CompletionOnceCallback()));
[email protected]f698a012013-05-06 20:18:592045
Zhongyi Shi63574b72018-06-01 20:22:252046 // Check an active session exisits for the destination.
2047 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2048 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2049 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2050
Ryan Hamilton8e32a2b2017-08-28 20:06:522051 IPAddress last_address;
2052 EXPECT_TRUE(http_server_properties_.GetSupportsQuic(&last_address));
Zhongyi Shi63574b72018-06-01 20:22:252053 // Change the IP address and verify that stream saw the error and the active
2054 // session is closed.
jri8c44d692015-10-23 23:53:412055 NotifyIPAddressChanged();
[email protected]f698a012013-05-06 20:18:592056 EXPECT_EQ(ERR_NETWORK_CHANGED,
2057 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262058 EXPECT_TRUE(factory_->require_confirmation());
Ryan Hamilton8e32a2b2017-08-28 20:06:522059 EXPECT_FALSE(http_server_properties_.GetSupportsQuic(&last_address));
Zhongyi Shi63574b72018-06-01 20:22:252060 // Check no active session exists for the destination.
2061 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]f698a012013-05-06 20:18:592062
2063 // Now attempting to request a stream to the same origin should create
2064 // a new session.
zhongyi98d6a9262017-05-19 02:47:452065 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332066 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032067 request2.Request(
2068 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2069 SocketTag(),
2070 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2071 failed_on_default_network_callback_, callback_.callback()));
[email protected]f698a012013-05-06 20:18:592072
robpercival214763f2016-07-01 23:27:012073 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242074 stream = CreateStream(&request2);
[email protected]f698a012013-05-06 20:18:592075
Zhongyi Shi63574b72018-06-01 20:22:252076 // Check a new active session exisits for the destination and the old session
2077 // is no longer live.
2078 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2079 QuicChromiumClientSession* session2 = GetActiveSession(host_port_pair_);
2080 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
2081
2082 stream.reset(); // Will reset stream 3.
rch37de576c2015-05-17 20:28:172083 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2084 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2085 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2086 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]f698a012013-05-06 20:18:592087}
2088
Zhongyi Shi63574b72018-06-01 20:22:252089// Test that if goaway_session_on_ip_change is set, old sessions will be marked
2090// as going away on IP address change instead of being closed. New requests will
2091// go to a new connection.
2092TEST_P(QuicStreamFactoryTest, GoAwaySessionsOnIPAddressChanged) {
2093 goaway_sessions_on_ip_change_ = true;
2094 Initialize();
2095 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2096 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2097 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2098
2099 MockQuicData quic_data1;
2100 quic::QuicStreamOffset header_stream_offset = 0;
2101 quic_data1.AddWrite(SYNCHRONOUS,
2102 ConstructInitialSettingsPacket(1, &header_stream_offset));
2103 quic_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
2104 2, GetNthClientInitiatedStreamId(0),
2105 true, true, &header_stream_offset));
2106 quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
2107 quic_data1.AddRead(
2108 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
2109 false, true));
2110 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
2111 quic_data1.AddSocketDataToFactory(socket_factory_.get());
2112
2113 MockQuicData quic_data2;
2114 quic::QuicStreamOffset header_stream_offset2 = 0;
2115 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
2116 quic_data2.AddWrite(
2117 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset2));
2118 quic_data2.AddSocketDataToFactory(socket_factory_.get());
2119
2120 // Create request and QuicHttpStream.
2121 QuicStreamRequest request(factory_.get());
2122 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032123 request.Request(
2124 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2125 SocketTag(),
2126 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2127 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi63574b72018-06-01 20:22:252128 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2129 std::unique_ptr<HttpStream> stream = CreateStream(&request);
2130 EXPECT_TRUE(stream.get());
2131
2132 // Cause QUIC stream to be created.
2133 HttpRequestInfo request_info;
2134 request_info.method = "GET";
2135 request_info.url = url_;
2136 request_info.traffic_annotation =
2137 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
2138 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
2139 net_log_, CompletionOnceCallback()));
2140
2141 // Ensure that session is alive and active.
2142 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2143 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2144 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2145
2146 // Send GET request on stream.
2147 HttpResponseInfo response;
2148 HttpRequestHeaders request_headers;
2149 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2150 callback_.callback()));
2151
2152 // Receive an IP address change notification.
2153 NotifyIPAddressChanged();
2154
2155 // The connection should still be alive, but marked as going away.
2156 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2157 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2158 EXPECT_EQ(1u, session->GetNumActiveStreams());
2159
2160 // Resume the data, response should be read from the original connection.
2161 quic_data1.Resume();
2162 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
2163 EXPECT_EQ(200, response.headers->response_code());
2164 EXPECT_EQ(0u, session->GetNumActiveStreams());
2165
2166 // Second request should be sent on a new connection.
2167 QuicStreamRequest request2(factory_.get());
2168 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032169 request2.Request(
2170 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2171 SocketTag(),
2172 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2173 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi63574b72018-06-01 20:22:252174 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2175 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
2176 EXPECT_TRUE(stream2.get());
2177
2178 // Check an active session exisits for the destination.
2179 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2180 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2181 QuicChromiumClientSession* session2 = GetActiveSession(host_port_pair_);
2182 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
2183
2184 stream.reset();
2185 stream2.reset();
2186 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
2187 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
2188 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
2189 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
2190}
2191
Jana Iyengarba355772017-09-21 22:03:212192TEST_P(QuicStreamFactoryTest, OnIPAddressChangedWithConnectionMigration) {
Zhongyi Shi1a054612018-06-14 04:59:082193 InitializeConnectionMigrationV2Test(
Jana Iyengarba355772017-09-21 22:03:212194 {kDefaultNetworkForTests, kNewNetworkForTests});
2195 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2196 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2197 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2198
2199 MockQuicData socket_data;
2200 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432201 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Ryan Hamilton8d9ee76e2018-05-29 23:52:522202 socket_data.AddWrite(
2203 SYNCHRONOUS, ConstructClientRstPacket(2, quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:172204 socket_data.AddSocketDataToFactory(socket_factory_.get());
Jana Iyengarba355772017-09-21 22:03:212205
2206 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332207 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032208 request.Request(
2209 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2210 SocketTag(),
2211 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2212 failed_on_default_network_callback_, callback_.callback()));
Jana Iyengarba355772017-09-21 22:03:212213
2214 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242215 std::unique_ptr<HttpStream> stream = CreateStream(&request);
Jana Iyengarba355772017-09-21 22:03:212216 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:392217 request_info.traffic_annotation =
2218 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272219 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392220 net_log_, CompletionOnceCallback()));
Jana Iyengarba355772017-09-21 22:03:212221
2222 IPAddress last_address;
2223 EXPECT_TRUE(http_server_properties_.GetSupportsQuic(&last_address));
2224
2225 // Change the IP address and verify that the connection is unaffected.
2226 NotifyIPAddressChanged();
2227 EXPECT_FALSE(factory_->require_confirmation());
2228 EXPECT_TRUE(http_server_properties_.GetSupportsQuic(&last_address));
2229
2230 // Attempting a new request to the same origin uses the same connection.
2231 QuicStreamRequest request2(factory_.get());
2232 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:332233 DEFAULT_PRIORITY, SocketTag(),
2234 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:032235 &net_error_details_,
2236 failed_on_default_network_callback_,
2237 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:242238 stream = CreateStream(&request2);
Jana Iyengarba355772017-09-21 22:03:212239
2240 stream.reset();
2241 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2242 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2243}
2244
Zhongyi Shia0644e32018-06-21 05:19:522245TEST_P(QuicStreamFactoryTest, MigrateOnNetworkMadeDefaultWithSynchronousWrite) {
Ryan Hamilton14d6a892018-10-18 19:03:422246 if (version_ == quic::QUIC_VERSION_99)
2247 return;
Zhongyi Shia0644e32018-06-21 05:19:522248 TestMigrationOnNetworkMadeDefault(SYNCHRONOUS);
jri9f303712016-09-13 01:10:222249}
2250
Zhongyi Shia0644e32018-06-21 05:19:522251TEST_P(QuicStreamFactoryTest, MigrateOnNetworkMadeDefaultWithAsyncWrite) {
Ryan Hamilton14d6a892018-10-18 19:03:422252 if (version_ == quic::QUIC_VERSION_99)
2253 return;
Zhongyi Shia0644e32018-06-21 05:19:522254 TestMigrationOnNetworkMadeDefault(ASYNC);
jri9f303712016-09-13 01:10:222255}
2256
Zhongyi Shia0644e32018-06-21 05:19:522257// Sets up a test which attempts connection migration successfully after probing
2258// when a new network is made as default and the old default is still available.
2259// |write_mode| specifies the write mode for the last write before
2260// OnNetworkMadeDefault is delivered to session.
2261void QuicStreamFactoryTestBase::TestMigrationOnNetworkMadeDefault(
2262 IoMode write_mode) {
2263 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jri7e636642016-01-14 06:57:082264 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2265 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2266 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2267
Zhongyi Shia0644e32018-06-21 05:19:522268 // Using a testing task runner so that we can control time.
2269 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2270 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
2271
2272 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2273 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
2274
2275 MockQuicData quic_data1;
Ryan Hamilton8d9ee76e2018-05-29 23:52:522276 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shia0644e32018-06-21 05:19:522277 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
2278 quic_data1.AddWrite(SYNCHRONOUS,
2279 ConstructInitialSettingsPacket(1, &header_stream_offset));
2280 quic_data1.AddWrite(
2281 write_mode, ConstructGetRequestPacket(2, GetNthClientInitiatedStreamId(0),
2282 true, true, &header_stream_offset));
2283 quic_data1.AddSocketDataToFactory(socket_factory_.get());
2284
2285 // Set up the second socket data provider that is used after migration.
2286 // The response to the earlier request is read on the new socket.
2287 MockQuicData quic_data2;
2288 // Connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:252289 quic_data2.AddWrite(SYNCHRONOUS,
2290 client_maker_.MakeConnectivityProbingPacket(3, true));
Zhongyi Shia0644e32018-06-21 05:19:522291 quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
2292 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:252293 quic_data2.AddRead(ASYNC,
2294 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shia0644e32018-06-21 05:19:522295 // Ping packet to send after migration is completed.
2296 quic_data2.AddWrite(ASYNC,
2297 client_maker_.MakeAckAndPingPacket(4, false, 1, 1, 1));
2298 quic_data2.AddRead(
2299 ASYNC, ConstructOkResponsePacket(2, GetNthClientInitiatedStreamId(0),
2300 false, false));
2301 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
2302 quic_data2.AddWrite(SYNCHRONOUS,
2303 client_maker_.MakeAckAndRstPacket(
2304 5, false, GetNthClientInitiatedStreamId(0),
2305 quic::QUIC_STREAM_CANCELLED, 2, 2, 1, true));
2306 quic_data2.AddSocketDataToFactory(socket_factory_.get());
jri7e636642016-01-14 06:57:082307
2308 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452309 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332310 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032311 request.Request(
2312 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2313 SocketTag(),
2314 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2315 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012316 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242317 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri7e636642016-01-14 06:57:082318 EXPECT_TRUE(stream.get());
2319
2320 // Cause QUIC stream to be created.
2321 HttpRequestInfo request_info;
2322 request_info.method = "GET";
bnc3d9035b32016-06-30 18:18:482323 request_info.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:392324 request_info.traffic_annotation =
2325 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272326 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392327 net_log_, CompletionOnceCallback()));
jri7e636642016-01-14 06:57:082328
2329 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502330 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:082331 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2332 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2333
2334 // Send GET request on stream.
2335 HttpResponseInfo response;
2336 HttpRequestHeaders request_headers;
2337 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2338 callback_.callback()));
2339
Zhongyi Shia0644e32018-06-21 05:19:522340 // Deliver a signal that a alternate network is connected now, this should
2341 // cause the connection to start early migration on path degrading.
2342 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2343 ->SetConnectedNetworksList(
2344 {kDefaultNetworkForTests, kNewNetworkForTests});
2345 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2346 ->NotifyNetworkConnected(kNewNetworkForTests);
jri9f303712016-09-13 01:10:222347
Zhongyi Shia0644e32018-06-21 05:19:522348 // Cause the connection to report path degrading to the session.
2349 // Due to lack of alternate network, session will not mgirate connection.
2350 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
jri7e636642016-01-14 06:57:082351 scoped_mock_network_change_notifier_->mock_network_change_notifier()
jrie2661982016-08-20 08:24:342352 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
jri7e636642016-01-14 06:57:082353
Zhongyi Shia0644e32018-06-21 05:19:522354 // A task will be posted to migrate to the new default network.
2355 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
2356 EXPECT_EQ(base::TimeDelta(), task_runner->NextPendingTaskDelay());
2357
2358 // Execute the posted task to migrate back to the default network.
2359 task_runner->RunUntilIdle();
2360 // Another task to try send a new connectivity probe is posted. And a task to
2361 // retry migrate back to default network is scheduled.
2362 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
2363 // Next connectivity probe is scheduled to be sent in 2 *
2364 // kDefaultRTTMilliSecs.
2365 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
2366 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
2367 next_task_delay);
2368
2369 // The connection should still be alive, and not marked as going away.
jri7e636642016-01-14 06:57:082370 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia0644e32018-06-21 05:19:522371 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2372 EXPECT_EQ(1u, session->GetNumActiveStreams());
2373 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
2374
2375 // Resume quic data and a connectivity probe response will be read on the new
2376 // socket, declare probing as successful. And a new task to WriteToNewSocket
2377 // will be posted to complete migration.
2378 quic_data2.Resume();
2379
2380 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2381 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri7e636642016-01-14 06:57:082382 EXPECT_EQ(1u, session->GetNumActiveStreams());
2383
Zhongyi Shia0644e32018-06-21 05:19:522384 // There should be three pending tasks, the nearest one will complete
2385 // migration to the new network.
2386 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
2387 next_task_delay = task_runner->NextPendingTaskDelay();
2388 EXPECT_EQ(base::TimeDelta(), next_task_delay);
2389 task_runner->FastForwardBy(next_task_delay);
2390
2391 // Response headers are received over the new network.
2392 EXPECT_THAT(callback_.WaitForResult(), IsOk());
jri7e636642016-01-14 06:57:082393 EXPECT_EQ(200, response.headers->response_code());
2394
Zhongyi Shia0644e32018-06-21 05:19:522395 // Now there are two pending tasks, the nearest one was to send connectivity
2396 // probe and has been cancelled due to successful migration.
2397 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
2398 next_task_delay = task_runner->NextPendingTaskDelay();
2399 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
2400 next_task_delay);
2401 task_runner->FastForwardBy(next_task_delay);
jri7e636642016-01-14 06:57:082402
Zhongyi Shia0644e32018-06-21 05:19:522403 // There's one more task to mgirate back to the default network in 0.4s, which
2404 // is also cancelled due to the success migration on the previous trial.
2405 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
2406 next_task_delay = task_runner->NextPendingTaskDelay();
2407 base::TimeDelta expected_delay =
2408 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
2409 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
2410 EXPECT_EQ(expected_delay, next_task_delay);
2411 task_runner->FastForwardBy(next_task_delay);
2412 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
jri7e636642016-01-14 06:57:082413
Zhongyi Shia0644e32018-06-21 05:19:522414 // Verify that the session is still alive.
jri7e636642016-01-14 06:57:082415 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia0644e32018-06-21 05:19:522416 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri7e636642016-01-14 06:57:082417
Zhongyi Shia0644e32018-06-21 05:19:522418 stream.reset();
2419 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
2420 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
2421 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
2422 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
jri7e636642016-01-14 06:57:082423}
2424
Zhongyi Shib3bc982c2018-07-10 19:59:242425// Regression test for http://859674.
2426// This test veries that a writer will not attempt to write packets until being
2427// unblocked on both socket level and network level. In this test, a probing
2428// writer is used to send two connectivity probes to the peer: where the first
2429// one completes successfully, while a connectivity response is received before
2430// completes sending the second one. The connection migration attempt will
2431// proceed while the probing writer is blocked at the socket level, which will
2432// block the writer on the network level. Once connection migration completes
2433// successfully, the probing writer will be unblocked on the network level, it
2434// will not attempt to write new packets until the socket level is unblocked.
2435TEST_P(QuicStreamFactoryTest, MigratedToBlockedSocketAfterProbing) {
Ryan Hamilton14d6a892018-10-18 19:03:422436 if (version_ == quic::QUIC_VERSION_99)
2437 return;
Zhongyi Shib3bc982c2018-07-10 19:59:242438 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) {
Ryan Hamilton14d6a892018-10-18 19:03:422618 if (version_ == quic::QUIC_VERSION_99)
2619 return;
Zhongyi Shib1b1fa42018-06-19 23:13:472620 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jri7e636642016-01-14 06:57:082621 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2622 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2623
Zhongyi Shib1b1fa42018-06-19 23:13:472624 // Using a testing task runner so that we can control time.
2625 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2626 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
jri5b785512016-09-13 04:29:112627
rcha00569732016-08-27 11:09:362628 MockQuicData socket_data;
2629 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432630 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:172631 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri7e636642016-01-14 06:57:082632
2633 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452634 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332635 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032636 request.Request(
2637 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2638 SocketTag(),
2639 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2640 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012641 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242642 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri7e636642016-01-14 06:57:082643 EXPECT_TRUE(stream.get());
2644
2645 // Cause QUIC stream to be created.
2646 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:392647 request_info.traffic_annotation =
2648 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272649 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392650 net_log_, CompletionOnceCallback()));
jri7e636642016-01-14 06:57:082651
2652 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502653 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:082654 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2655 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2656
2657 // Trigger connection migration. Since there are no networks
jri5b785512016-09-13 04:29:112658 // to migrate to, this should cause the session to wait for a new network.
jri7e636642016-01-14 06:57:082659 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2660 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2661
jri5b785512016-09-13 04:29:112662 // The migration will not fail until the migration alarm timeout.
2663 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shib1b1fa42018-06-19 23:13:472664 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:112665 EXPECT_EQ(1u, session->GetNumActiveStreams());
2666 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
2667 EXPECT_EQ(true, session->connection()->writer()->IsWriteBlocked());
2668
Zhongyi Shib1b1fa42018-06-19 23:13:472669 // Migration will be timed out after kWaitTimeForNewNetwokSecs.
2670 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
2671 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
2672 EXPECT_EQ(base::TimeDelta::FromSeconds(kWaitTimeForNewNetworkSecs),
2673 next_task_delay);
2674 task_runner->FastForwardBy(next_task_delay);
jri5b785512016-09-13 04:29:112675
2676 // The connection should now be closed. A request for response
2677 // headers should fail.
jri7e636642016-01-14 06:57:082678 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2679 EXPECT_FALSE(HasActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:112680 EXPECT_EQ(ERR_NETWORK_CHANGED, callback_.WaitForResult());
jri7e636642016-01-14 06:57:082681
2682 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2683 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2684}
2685
Zhongyi Shi21e99532018-07-17 22:23:072686// This test verifies that connectivity probes will be sent even if there is
2687// a non-migratable stream. However, when connection migrates to the
2688// successfully probed path, any non-migratable stream will be reset. And if
2689// the connection becomes idle then, close the connection.
jri9f303712016-09-13 01:10:222690TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultNonMigratableStream) {
Ryan Hamilton14d6a892018-10-18 19:03:422691 if (version_ == quic::QUIC_VERSION_99)
2692 return;
Zhongyi Shi5f587cc2017-11-21 23:24:172693 InitializeConnectionMigrationV2Test(
2694 {kDefaultNetworkForTests, kNewNetworkForTests});
2695 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2696 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2697
2698 MockQuicData socket_data;
2699 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432700 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Renjieba55fae2018-09-20 03:05:162701 socket_data.AddWrite(
2702 SYNCHRONOUS,
2703 client_maker_.MakeRstAckAndConnectionClosePacket(
2704 3, false, 5, quic::QUIC_STREAM_CANCELLED,
2705 quic::QuicTime::Delta::FromMilliseconds(0), 1, 1, 1,
2706 quic::QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS, "net error"));
2707
Zhongyi Shi5f587cc2017-11-21 23:24:172708 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri231c2972016-03-08 19:50:112709
Zhongyi Shi21e99532018-07-17 22:23:072710 // Set up the second socket data provider that is used for probing.
2711 MockQuicData quic_data1;
2712 // Connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:252713 quic_data1.AddWrite(SYNCHRONOUS,
2714 client_maker_.MakeConnectivityProbingPacket(2, true));
Zhongyi Shi21e99532018-07-17 22:23:072715 quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
2716 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:252717 quic_data1.AddRead(ASYNC,
2718 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shi21e99532018-07-17 22:23:072719 quic_data1.AddSocketDataToFactory(socket_factory_.get());
2720
jri231c2972016-03-08 19:50:112721 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452722 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332723 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032724 request.Request(
2725 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2726 SocketTag(),
2727 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2728 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012729 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242730 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri231c2972016-03-08 19:50:112731 EXPECT_TRUE(stream.get());
2732
2733 // Cause QUIC stream to be created, but marked as non-migratable.
2734 HttpRequestInfo request_info;
Zhongyi Shibb28b1f2018-07-18 02:41:262735 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
Ramin Halavati683bcaa92018-02-14 08:42:392736 request_info.traffic_annotation =
2737 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272738 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392739 net_log_, CompletionOnceCallback()));
jri231c2972016-03-08 19:50:112740
2741 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502742 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:112743 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2744 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2745
Zhongyi Shi21e99532018-07-17 22:23:072746 // Trigger connection migration. Session will start to probe the alternative
2747 // network. Although there is a non-migratable stream, session will still be
2748 // active until probing is declared as successful.
jri231c2972016-03-08 19:50:112749 scoped_mock_network_change_notifier_->mock_network_change_notifier()
jrie2661982016-08-20 08:24:342750 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
jri231c2972016-03-08 19:50:112751
2752 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shi21e99532018-07-17 22:23:072753 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri231c2972016-03-08 19:50:112754 EXPECT_EQ(1u, session->GetNumActiveStreams());
2755
Zhongyi Shi21e99532018-07-17 22:23:072756 // Resume data to read a connectivity probing response, which will cause
2757 // non-migtable streams to be closed. As session becomes idle, connection will
2758 // be closed.
2759 quic_data1.Resume();
2760 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2761 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2762 EXPECT_EQ(0u, session->GetNumActiveStreams());
jri231c2972016-03-08 19:50:112763
Zhongyi Shi21e99532018-07-17 22:23:072764 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
2765 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
jri231c2972016-03-08 19:50:112766 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2767 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2768}
2769
jri9f303712016-09-13 01:10:222770TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultConnectionMigrationDisabled) {
Zhongyi Shi5f587cc2017-11-21 23:24:172771 InitializeConnectionMigrationV2Test(
2772 {kDefaultNetworkForTests, kNewNetworkForTests});
2773 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2774 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2775
2776 MockQuicData socket_data;
2777 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432778 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
2779 socket_data.AddWrite(
2780 SYNCHRONOUS,
2781 client_maker_.MakeRstPacket(2, true, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:522782 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:172783 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9c541572016-03-29 17:51:482784
2785 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452786 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332787 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032788 request.Request(
2789 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2790 SocketTag(),
2791 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2792 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012793 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242794 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9c541572016-03-29 17:51:482795 EXPECT_TRUE(stream.get());
2796
2797 // Cause QUIC stream to be created.
2798 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:392799 request_info.traffic_annotation =
2800 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272801 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392802 net_log_, CompletionOnceCallback()));
jri9c541572016-03-29 17:51:482803
2804 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502805 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:482806 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2807 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2808
2809 // Set session config to have connection migration disabled.
Ryan Hamilton8d9ee76e2018-05-29 23:52:522810 quic::test::QuicConfigPeer::SetReceivedDisableConnectionMigration(
2811 session->config());
jri9c541572016-03-29 17:51:482812 EXPECT_TRUE(session->config()->DisableConnectionMigration());
2813
2814 // Trigger connection migration. Since there is a non-migratable stream,
2815 // this should cause session to continue but be marked as going away.
2816 scoped_mock_network_change_notifier_->mock_network_change_notifier()
jrie2661982016-08-20 08:24:342817 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
jri9c541572016-03-29 17:51:482818
2819 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2820 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2821 EXPECT_EQ(1u, session->GetNumActiveStreams());
2822
2823 stream.reset();
2824
2825 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2826 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2827}
2828
jri9f303712016-09-13 01:10:222829TEST_P(QuicStreamFactoryTest, OnNetworkDisconnectedNonMigratableStream) {
Zhongyi Shi5f587cc2017-11-21 23:24:172830 InitializeConnectionMigrationV2Test(
2831 {kDefaultNetworkForTests, kNewNetworkForTests});
2832 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2833 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2834
2835 MockQuicData socket_data;
2836 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432837 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
2838 socket_data.AddWrite(
2839 SYNCHRONOUS,
2840 client_maker_.MakeRstPacket(2, true, GetNthClientInitiatedStreamId(0),
Zhongyi Shi0439ecc72018-07-11 04:41:262841 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:172842 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri231c2972016-03-08 19:50:112843
2844 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452845 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332846 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032847 request.Request(
2848 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2849 SocketTag(),
2850 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2851 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012852 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242853 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri231c2972016-03-08 19:50:112854 EXPECT_TRUE(stream.get());
2855
2856 // Cause QUIC stream to be created, but marked as non-migratable.
2857 HttpRequestInfo request_info;
Zhongyi Shibb28b1f2018-07-18 02:41:262858 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
Ramin Halavati683bcaa92018-02-14 08:42:392859 request_info.traffic_annotation =
2860 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272861 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392862 net_log_, CompletionOnceCallback()));
jri231c2972016-03-08 19:50:112863
2864 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502865 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:112866 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2867 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2868
2869 // Trigger connection migration. Since there is a non-migratable stream,
2870 // this should cause a RST_STREAM frame to be emitted with
Zhongyi Shi0439ecc72018-07-11 04:41:262871 // quic::QUIC_STREAM_CANCELLED error code, and the session will be closed.
jri231c2972016-03-08 19:50:112872 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2873 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2874
2875 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2876 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2877
2878 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2879 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2880}
2881
jri9c541572016-03-29 17:51:482882TEST_P(QuicStreamFactoryTest,
jri9f303712016-09-13 01:10:222883 OnNetworkDisconnectedConnectionMigrationDisabled) {
Zhongyi Shi5f587cc2017-11-21 23:24:172884 InitializeConnectionMigrationV2Test(
2885 {kDefaultNetworkForTests, kNewNetworkForTests});
2886 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2887 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2888
2889 MockQuicData socket_data;
2890 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432891 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
2892 socket_data.AddWrite(
2893 SYNCHRONOUS,
2894 client_maker_.MakeRstPacket(2, true, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:522895 quic::QUIC_RST_ACKNOWLEDGEMENT));
Zhongyi Shi5f587cc2017-11-21 23:24:172896 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9c541572016-03-29 17:51:482897
2898 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452899 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332900 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032901 request.Request(
2902 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2903 SocketTag(),
2904 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2905 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012906 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242907 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9c541572016-03-29 17:51:482908 EXPECT_TRUE(stream.get());
2909
2910 // Cause QUIC stream to be created.
2911 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:392912 request_info.traffic_annotation =
2913 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272914 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392915 net_log_, CompletionOnceCallback()));
jri9c541572016-03-29 17:51:482916
2917 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502918 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:482919 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2920 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2921
2922 // Set session config to have connection migration disabled.
Ryan Hamilton8d9ee76e2018-05-29 23:52:522923 quic::test::QuicConfigPeer::SetReceivedDisableConnectionMigration(
2924 session->config());
jri9c541572016-03-29 17:51:482925 EXPECT_TRUE(session->config()->DisableConnectionMigration());
2926
2927 // Trigger connection migration. Since there is a non-migratable stream,
2928 // this should cause a RST_STREAM frame to be emitted with
Ryan Hamilton8d9ee76e2018-05-29 23:52:522929 // quic::QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed.
jri9c541572016-03-29 17:51:482930 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2931 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2932
2933 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2934 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2935
2936 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2937 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2938}
2939
jri9f303712016-09-13 01:10:222940TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultNoOpenStreams) {
Zhongyi Shi5f587cc2017-11-21 23:24:172941 InitializeConnectionMigrationV2Test(
2942 {kDefaultNetworkForTests, kNewNetworkForTests});
2943 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2944 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2945
2946 MockQuicData socket_data;
2947 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432948 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Renjieba55fae2018-09-20 03:05:162949 socket_data.AddWrite(
2950 SYNCHRONOUS,
2951 client_maker_.MakeConnectionClosePacket(
2952 2, true, quic::QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS,
2953 "net error"));
Zhongyi Shi5f587cc2017-11-21 23:24:172954 socket_data.AddSocketDataToFactory(socket_factory_.get());
2955
2956 // Create request and QuicHttpStream.
2957 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332958 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032959 request.Request(
2960 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2961 SocketTag(),
2962 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2963 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi5f587cc2017-11-21 23:24:172964 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2965 std::unique_ptr<HttpStream> stream = CreateStream(&request);
2966 EXPECT_TRUE(stream.get());
2967
2968 // Ensure that session is alive and active.
2969 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2970 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2971 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2972
2973 // Trigger connection migration.
2974 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2975 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
2976
2977 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2978 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2979
2980 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2981 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2982}
2983
jri9f303712016-09-13 01:10:222984TEST_P(QuicStreamFactoryTest, OnNetworkDisconnectedNoOpenStreams) {
Zhongyi Shi5f587cc2017-11-21 23:24:172985 InitializeConnectionMigrationV2Test(
2986 {kDefaultNetworkForTests, kNewNetworkForTests});
2987 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2988 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2989
2990 MockQuicData socket_data;
2991 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432992 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:172993 socket_data.AddSocketDataToFactory(socket_factory_.get());
2994
2995 // Create request and QuicHttpStream.
2996 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332997 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032998 request.Request(
2999 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3000 SocketTag(),
3001 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3002 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi5f587cc2017-11-21 23:24:173003 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3004 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3005 EXPECT_TRUE(stream.get());
3006
3007 // Ensure that session is alive and active.
3008 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3009 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3010 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3011
3012 // Trigger connection migration. Since there are no active streams,
3013 // the session will be closed.
3014 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3015 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
3016
3017 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3018 EXPECT_FALSE(HasActiveSession(host_port_pair_));
3019
3020 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3021 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3022}
3023
Zhongyi Shi9f316b262018-06-18 22:01:163024// This test verifies session migrates to the alternate network immediately when
3025// default network disconnects with a synchronous write before migration.
3026TEST_P(QuicStreamFactoryTest, MigrateOnDefaultNetworkDisconnectedSync) {
3027 TestMigrationOnNetworkDisconnected(/*async_write_before*/ false);
3028}
3029
3030// This test verifies session migrates to the alternate network immediately when
3031// default network disconnects with an asynchronously write before migration.
3032TEST_P(QuicStreamFactoryTest, MigrateOnDefaultNetworkDisconnectedAsync) {
3033 TestMigrationOnNetworkDisconnected(/*async_write_before*/ true);
3034}
3035
3036void QuicStreamFactoryTestBase::TestMigrationOnNetworkDisconnected(
3037 bool async_write_before) {
3038 InitializeConnectionMigrationV2Test(
3039 {kDefaultNetworkForTests, kNewNetworkForTests});
3040 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3041 ->NotifyNetworkMadeDefault(kDefaultNetworkForTests);
3042 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3043 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3044 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3045
3046 // Use the test task runner.
3047 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3048
3049 int packet_number = 1;
3050 MockQuicData socket_data;
3051 quic::QuicStreamOffset header_stream_offset = 0;
3052 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3053 socket_data.AddWrite(
3054 SYNCHRONOUS,
3055 ConstructInitialSettingsPacket(packet_number++, &header_stream_offset));
3056 socket_data.AddWrite(
3057 SYNCHRONOUS, ConstructGetRequestPacket(
3058 packet_number++, GetNthClientInitiatedStreamId(0), true,
3059 true, &header_stream_offset));
3060 if (async_write_before) {
3061 socket_data.AddWrite(ASYNC, OK);
3062 packet_number++;
3063 }
3064 socket_data.AddSocketDataToFactory(socket_factory_.get());
3065
3066 // Create request and QuicHttpStream.
3067 QuicStreamRequest request(factory_.get());
3068 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033069 request.Request(
3070 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3071 SocketTag(),
3072 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3073 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi9f316b262018-06-18 22:01:163074 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3075 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3076 EXPECT_TRUE(stream.get());
3077
3078 // Cause QUIC stream to be created.
3079 HttpRequestInfo request_info;
3080 request_info.method = "GET";
3081 request_info.url = url_;
3082 request_info.traffic_annotation =
3083 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3084 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3085 net_log_, CompletionOnceCallback()));
3086
3087 // Ensure that session is alive and active.
3088 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3089 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3090 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3091
3092 // Send GET request on stream.
3093 HttpResponseInfo response;
3094 HttpRequestHeaders request_headers;
3095 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3096 callback_.callback()));
3097
Zhongyi Shi22fd5f52018-06-20 17:39:093098 if (async_write_before)
Zhongyi Shi9f316b262018-06-18 22:01:163099 session->SendPing();
Zhongyi Shi9f316b262018-06-18 22:01:163100
3101 // Set up second socket data provider that is used after migration.
3102 // The response to the earlier request is read on this new socket.
3103 MockQuicData socket_data1;
3104 socket_data1.AddWrite(
3105 SYNCHRONOUS,
3106 client_maker_.MakePingPacket(packet_number++, /*include_version=*/true));
3107 socket_data1.AddRead(
3108 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
3109 false, false));
3110 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3111 socket_data1.AddWrite(
3112 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
3113 packet_number++, false, GetNthClientInitiatedStreamId(0),
3114 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
3115 socket_data1.AddSocketDataToFactory(socket_factory_.get());
3116
3117 // Trigger connection migration.
3118 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3119 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
3120
3121 // The connection should still be alive, not marked as going away.
3122 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3123 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3124 EXPECT_EQ(1u, session->GetNumActiveStreams());
3125 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
3126
3127 // Ensure that the session is still alive.
3128 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3129 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3130 EXPECT_EQ(1u, session->GetNumActiveStreams());
3131
3132 // Run the message loop so that data queued in the new socket is read by the
3133 // packet reader.
3134 runner_->RunNextTask();
3135
3136 // Response headers are received over the new network.
3137 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3138 EXPECT_EQ(200, response.headers->response_code());
3139
3140 // Check that the session is still alive.
3141 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3142 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3143
3144 // There should be posted tasks not executed, which is to migrate back to
3145 // default network.
3146 EXPECT_FALSE(runner_->GetPostedTasks().empty());
3147
3148 // Receive signal to mark new network as default.
3149 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3150 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
3151
3152 stream.reset();
3153 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3154 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3155 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
3156 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
3157}
3158
Zhongyi Shi5f587cc2017-11-21 23:24:173159// This test receives NCN signals in the following order:
3160// - default network disconnected
3161// - after a pause, new network is connected.
3162// - new network is made default.
3163TEST_P(QuicStreamFactoryTest, NewNetworkConnectedAfterNoNetwork) {
3164 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
3165 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3166 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3167 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3168
3169 // Use the test task runner.
3170 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3171
3172 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:523173 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shi5f587cc2017-11-21 23:24:173174 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3175 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:433176 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
3177 socket_data.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
3178 2, GetNthClientInitiatedStreamId(0),
3179 true, true, &header_stream_offset));
Zhongyi Shi5f587cc2017-11-21 23:24:173180 socket_data.AddSocketDataToFactory(socket_factory_.get());
3181
3182 // Create request and QuicHttpStream.
3183 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:333184 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033185 request.Request(
3186 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3187 SocketTag(),
3188 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3189 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi5f587cc2017-11-21 23:24:173190 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3191 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3192 EXPECT_TRUE(stream.get());
3193
3194 // Cause QUIC stream to be created.
3195 HttpRequestInfo request_info;
3196 request_info.method = "GET";
3197 request_info.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:393198 request_info.traffic_annotation =
3199 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:273200 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:393201 net_log_, CompletionOnceCallback()));
Zhongyi Shi5f587cc2017-11-21 23:24:173202
3203 // Ensure that session is alive and active.
3204 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3205 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3206 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3207
3208 // Send GET request on stream.
3209 HttpResponseInfo response;
3210 HttpRequestHeaders request_headers;
3211 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3212 callback_.callback()));
3213
3214 // Trigger connection migration. Since there are no networks
3215 // to migrate to, this should cause the session to wait for a new network.
3216 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3217 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
3218
3219 // The connection should still be alive, not marked as going away.
3220 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3221 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3222 EXPECT_EQ(1u, session->GetNumActiveStreams());
3223 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
3224
3225 // Set up second socket data provider that is used after migration.
3226 // The response to the earlier request is read on this new socket.
3227 MockQuicData socket_data1;
3228 socket_data1.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:433229 SYNCHRONOUS, client_maker_.MakePingPacket(3, /*include_version=*/true));
3230 socket_data1.AddRead(
3231 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
3232 false, false));
Zhongyi Shi5f587cc2017-11-21 23:24:173233 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:433234 socket_data1.AddWrite(SYNCHRONOUS,
3235 client_maker_.MakeAckAndRstPacket(
3236 4, false, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:523237 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:173238 socket_data1.AddSocketDataToFactory(socket_factory_.get());
3239
3240 // Add a new network and notify the stream factory of a new connected network.
3241 // This causes a PING packet to be sent over the new network.
3242 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3243 ->SetConnectedNetworksList({kNewNetworkForTests});
3244 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3245 ->NotifyNetworkConnected(kNewNetworkForTests);
3246
3247 // Ensure that the session is still alive.
3248 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3249 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3250 EXPECT_EQ(1u, session->GetNumActiveStreams());
3251
3252 // Run the message loop so that data queued in the new socket is read by the
3253 // packet reader.
3254 runner_->RunNextTask();
3255
3256 // Response headers are received over the new network.
3257 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3258 EXPECT_EQ(200, response.headers->response_code());
3259
3260 // Check that the session is still alive.
3261 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3262 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3263
3264 // There should posted tasks not executed, which is to migrate back to default
3265 // network.
3266 EXPECT_FALSE(runner_->GetPostedTasks().empty());
3267
3268 // Receive signal to mark new network as default.
3269 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3270 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
3271
3272 stream.reset();
3273 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3274 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3275 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
3276 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
3277}
3278
Zhongyi Shid3d5f502018-08-10 00:22:223279// Regression test for http://crbug.com/872011.
3280// This test verifies that migrate to the probing socket will not trigger
3281// new packets being read synchronously and generate ACK frame while
3282// processing the initial connectivity probe response, which may cause a
3283// connection being closed with INTERNAL_ERROR as pending ACK frame is not
3284// allowed when processing a new packet.
3285TEST_P(QuicStreamFactoryTest, MigrateToProbingSocket) {
Ryan Hamilton14d6a892018-10-18 19:03:423286 if (version_ == quic::QUIC_VERSION_99)
3287 return;
Zhongyi Shid3d5f502018-08-10 00:22:223288 InitializeConnectionMigrationV2Test(
3289 {kDefaultNetworkForTests, kNewNetworkForTests});
3290 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3291 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3292 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3293
3294 // Using a testing task runner so that we can control time.
3295 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
3296 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
3297
3298 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3299 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
3300
3301 int packet_number = 1;
3302 MockQuicData quic_data1;
3303 quic::QuicStreamOffset header_stream_offset = 0;
3304 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
3305 quic_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket(
3306 packet_number++, &header_stream_offset));
3307 quic_data1.AddWrite(
3308 SYNCHRONOUS, ConstructGetRequestPacket(
3309 packet_number++, GetNthClientInitiatedStreamId(0), true,
3310 true, &header_stream_offset));
3311 quic_data1.AddSocketDataToFactory(socket_factory_.get());
3312
3313 // Set up the second socket data provider that is used for probing on the
3314 // alternate network.
3315 MockQuicData quic_data2;
3316 // Connectivity probe to be sent on the new path.
3317 quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
3318 packet_number++, true));
3319 quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
3320 // First connectivity probe to receive from the server, which will complete
3321 // connection migraiton on path degrading.
3322 quic_data2.AddRead(ASYNC,
3323 server_maker_.MakeConnectivityProbingPacket(1, false));
3324 // Read multiple connectivity probes synchronously.
3325 quic_data2.AddRead(SYNCHRONOUS,
3326 server_maker_.MakeConnectivityProbingPacket(2, false));
3327 quic_data2.AddRead(SYNCHRONOUS,
3328 server_maker_.MakeConnectivityProbingPacket(3, false));
3329 quic_data2.AddRead(SYNCHRONOUS,
3330 server_maker_.MakeConnectivityProbingPacket(4, false));
3331 quic_data2.AddWrite(
3332 ASYNC, client_maker_.MakeAckPacket(packet_number++, 1, 4, 1, 1, true));
3333 quic_data2.AddRead(
3334 ASYNC, ConstructOkResponsePacket(5, GetNthClientInitiatedStreamId(0),
3335 false, false));
3336 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3337 quic_data2.AddWrite(
3338 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
3339 packet_number++, false, GetNthClientInitiatedStreamId(0),
3340 quic::QUIC_STREAM_CANCELLED, 5, 1, 1, true));
3341 quic_data2.AddSocketDataToFactory(socket_factory_.get());
3342
3343 // Create request and QuicHttpStream.
3344 QuicStreamRequest request(factory_.get());
3345 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033346 request.Request(
3347 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3348 SocketTag(),
3349 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3350 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shid3d5f502018-08-10 00:22:223351 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3352 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3353 EXPECT_TRUE(stream.get());
3354
3355 // Cause QUIC stream to be created.
3356 HttpRequestInfo request_info;
3357 request_info.method = "GET";
3358 request_info.url = url_;
3359 request_info.traffic_annotation =
3360 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3361 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3362 net_log_, CompletionOnceCallback()));
3363
3364 // Ensure that session is alive and active.
3365 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3366 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3367 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3368
3369 // Send GET request on stream.
3370 HttpResponseInfo response;
3371 HttpRequestHeaders request_headers;
3372 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3373 callback_.callback()));
3374
3375 // Cause the connection to report path degrading to the session.
3376 // Session will start to probe the alternate network.
3377 session->connection()->OnPathDegradingTimeout();
3378
3379 // Next connectivity probe is scheduled to be sent in 2 *
3380 // kDefaultRTTMilliSecs.
3381 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3382 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
3383 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3384 next_task_delay);
3385
3386 // The connection should still be alive, and not marked as going away.
3387 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3388 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3389 EXPECT_EQ(1u, session->GetNumActiveStreams());
3390 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
3391
3392 // Resume quic data and a connectivity probe response will be read on the new
3393 // socket.
3394 quic_data2.Resume();
3395
3396 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3397 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3398 EXPECT_EQ(1u, session->GetNumActiveStreams());
3399
3400 // There should be three pending tasks, the nearest one will complete
3401 // migration to the new network.
3402 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
3403 next_task_delay = task_runner->NextPendingTaskDelay();
3404 EXPECT_EQ(base::TimeDelta(), next_task_delay);
3405 task_runner->FastForwardBy(next_task_delay);
3406
3407 // Response headers are received over the new network.
3408 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3409 EXPECT_EQ(200, response.headers->response_code());
3410
3411 // Now there are two pending tasks, the nearest one was to send connectivity
3412 // probe and has been cancelled due to successful migration.
3413 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
3414 next_task_delay = task_runner->NextPendingTaskDelay();
3415 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3416 next_task_delay);
3417 task_runner->FastForwardBy(next_task_delay);
3418
3419 // There's one more task to mgirate back to the default network in 0.4s.
3420 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3421 next_task_delay = task_runner->NextPendingTaskDelay();
3422 base::TimeDelta expected_delay =
3423 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
3424 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
3425 EXPECT_EQ(expected_delay, next_task_delay);
3426
3427 // Deliver a signal that the alternate network now becomes default to session,
3428 // this will cancel mgirate back to default network timer.
3429 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3430 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
3431
3432 task_runner->FastForwardBy(next_task_delay);
3433 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
3434
3435 // Verify that the session is still alive.
3436 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3437 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3438
3439 stream.reset();
3440 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
3441 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
3442 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
3443 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
3444}
3445
Zhongyi Shic4823bd2018-04-27 00:49:193446// This test verifies that the connection migrates to the alternate network
Zhongyi Shi22fd5f52018-06-20 17:39:093447// early when path degrading is detected with an ASYNCHRONOUS write before
3448// migration.
3449TEST_P(QuicStreamFactoryTest, MigrateEarlyOnPathDegradingAysnc) {
Ryan Hamilton14d6a892018-10-18 19:03:423450 if (version_ == quic::QUIC_VERSION_99)
3451 return;
Zhongyi Shi22fd5f52018-06-20 17:39:093452 TestMigrationOnPathDegrading(/*async_write_before_migration*/ true);
3453}
3454
3455// This test verifies that the connection migrates to the alternate network
3456// early when path degrading is detected with a SYNCHRONOUS write before
3457// migration.
3458TEST_P(QuicStreamFactoryTest, MigrateEarlyOnPathDegradingSync) {
Ryan Hamilton14d6a892018-10-18 19:03:423459 if (version_ == quic::QUIC_VERSION_99)
3460 return;
Zhongyi Shi22fd5f52018-06-20 17:39:093461 TestMigrationOnPathDegrading(/*async_write_before_migration*/ false);
3462}
3463
3464void QuicStreamFactoryTestBase::TestMigrationOnPathDegrading(
3465 bool async_write_before) {
Zhongyi Shic4823bd2018-04-27 00:49:193466 InitializeConnectionMigrationV2Test(
3467 {kDefaultNetworkForTests, kNewNetworkForTests});
3468 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3469 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3470 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3471
3472 // Using a testing task runner so that we can control time.
3473 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
3474 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
3475
3476 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3477 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
3478
Zhongyi Shi22fd5f52018-06-20 17:39:093479 int packet_number = 1;
Zhongyi Shic4823bd2018-04-27 00:49:193480 MockQuicData quic_data1;
Ryan Hamilton8d9ee76e2018-05-29 23:52:523481 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shic4823bd2018-04-27 00:49:193482 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
Zhongyi Shi22fd5f52018-06-20 17:39:093483 quic_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket(
3484 packet_number++, &header_stream_offset));
3485 quic_data1.AddWrite(
3486 SYNCHRONOUS, ConstructGetRequestPacket(
3487 packet_number++, GetNthClientInitiatedStreamId(0), true,
3488 true, &header_stream_offset));
3489 if (async_write_before) {
3490 quic_data1.AddWrite(ASYNC, OK);
3491 packet_number++;
3492 }
Zhongyi Shic4823bd2018-04-27 00:49:193493 quic_data1.AddSocketDataToFactory(socket_factory_.get());
3494
3495 // Set up the second socket data provider that is used after migration.
3496 // The response to the earlier request is read on the new socket.
3497 MockQuicData quic_data2;
3498 // Connectivity probe to be sent on the new path.
Zhongyi Shi22fd5f52018-06-20 17:39:093499 quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
Zhongyi Shi879659422018-08-02 17:58:253500 packet_number++, true));
Zhongyi Shic4823bd2018-04-27 00:49:193501 quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
3502 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:253503 quic_data2.AddRead(ASYNC,
3504 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shic4823bd2018-04-27 00:49:193505 // Ping packet to send after migration is completed.
Zhongyi Shi22fd5f52018-06-20 17:39:093506 quic_data2.AddWrite(ASYNC, client_maker_.MakeAckAndPingPacket(
3507 packet_number++, false, 1, 1, 1));
Ryan Hamiltona3ee93a72018-08-01 22:03:083508 quic_data2.AddRead(
3509 ASYNC, ConstructOkResponsePacket(2, GetNthClientInitiatedStreamId(0),
3510 false, false));
Zhongyi Shic4823bd2018-04-27 00:49:193511 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi22fd5f52018-06-20 17:39:093512 quic_data2.AddWrite(
3513 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
3514 packet_number++, false, GetNthClientInitiatedStreamId(0),
3515 quic::QUIC_STREAM_CANCELLED, 2, 2, 1, true));
Zhongyi Shic4823bd2018-04-27 00:49:193516 quic_data2.AddSocketDataToFactory(socket_factory_.get());
3517
3518 // Create request and QuicHttpStream.
3519 QuicStreamRequest request(factory_.get());
3520 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033521 request.Request(
3522 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3523 SocketTag(),
3524 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3525 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shic4823bd2018-04-27 00:49:193526 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3527 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3528 EXPECT_TRUE(stream.get());
3529
3530 // Cause QUIC stream to be created.
3531 HttpRequestInfo request_info;
3532 request_info.method = "GET";
3533 request_info.url = url_;
3534 request_info.traffic_annotation =
3535 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3536 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3537 net_log_, CompletionOnceCallback()));
3538
3539 // Ensure that session is alive and active.
3540 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3541 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3542 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3543
3544 // Send GET request on stream.
3545 HttpResponseInfo response;
3546 HttpRequestHeaders request_headers;
3547 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3548 callback_.callback()));
3549
Zhongyi Shi22fd5f52018-06-20 17:39:093550 if (async_write_before)
3551 session->SendPing();
3552
Zhongyi Shiaba4a832018-04-30 20:29:083553 // Cause the connection to report path degrading to the session.
3554 // Session will start to probe the alternate network.
3555 session->connection()->OnPathDegradingTimeout();
3556
3557 // Next connectivity probe is scheduled to be sent in 2 *
3558 // kDefaultRTTMilliSecs.
3559 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3560 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
3561 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3562 next_task_delay);
3563
3564 // The connection should still be alive, and not marked as going away.
3565 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3566 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3567 EXPECT_EQ(1u, session->GetNumActiveStreams());
3568 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
3569
3570 // Resume quic data and a connectivity probe response will be read on the new
3571 // socket.
3572 quic_data2.Resume();
3573
3574 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3575 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3576 EXPECT_EQ(1u, session->GetNumActiveStreams());
3577
3578 // There should be three pending tasks, the nearest one will complete
3579 // migration to the new network.
3580 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
3581 next_task_delay = task_runner->NextPendingTaskDelay();
3582 EXPECT_EQ(base::TimeDelta(), next_task_delay);
3583 task_runner->FastForwardBy(next_task_delay);
3584
3585 // Response headers are received over the new network.
3586 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3587 EXPECT_EQ(200, response.headers->response_code());
3588
3589 // Now there are two pending tasks, the nearest one was to send connectivity
3590 // probe and has been cancelled due to successful migration.
3591 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
3592 next_task_delay = task_runner->NextPendingTaskDelay();
3593 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3594 next_task_delay);
3595 task_runner->FastForwardBy(next_task_delay);
3596
3597 // There's one more task to mgirate back to the default network in 0.4s.
3598 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3599 next_task_delay = task_runner->NextPendingTaskDelay();
3600 base::TimeDelta expected_delay =
3601 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
3602 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
3603 EXPECT_EQ(expected_delay, next_task_delay);
3604
3605 // Deliver a signal that the alternate network now becomes default to session,
3606 // this will cancel mgirate back to default network timer.
3607 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3608 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
3609
3610 task_runner->FastForwardBy(next_task_delay);
3611 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
3612
3613 // Verify that the session is still alive.
3614 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3615 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3616
3617 stream.reset();
3618 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
3619 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
3620 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
3621 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
3622}
3623
Renjiea5722ccf2018-08-10 00:18:493624// This test verifies that the session marks itself GOAWAY on path degrading
3625// and it does not receive any new request
3626TEST_P(QuicStreamFactoryTest, GoawayOnPathDegrading) {
3627 go_away_on_path_degrading_ = true;
3628 Initialize();
3629 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3630 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3631 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3632
3633 MockQuicData quic_data1;
3634 quic::QuicStreamOffset header_stream_offset = 0;
3635 quic_data1.AddWrite(SYNCHRONOUS,
3636 ConstructInitialSettingsPacket(1, &header_stream_offset));
3637 quic_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
3638 2, GetNthClientInitiatedStreamId(0),
3639 true, true, &header_stream_offset));
3640 quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
3641 quic_data1.AddRead(
3642 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
3643 false, true));
3644 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
3645 quic_data1.AddSocketDataToFactory(socket_factory_.get());
3646
3647 MockQuicData quic_data2;
3648 quic::QuicStreamOffset header_stream_offset2 = 0;
3649 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
3650 quic_data2.AddWrite(
3651 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset2));
3652 quic_data2.AddSocketDataToFactory(socket_factory_.get());
3653
3654 // Creat request and QuicHttpStream.
3655 QuicStreamRequest request(factory_.get());
3656 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033657 request.Request(
3658 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3659 SocketTag(),
3660 /*cerf_verify_flags=*/0, url_, net_log_, &net_error_details_,
3661 failed_on_default_network_callback_, callback_.callback()));
Renjiea5722ccf2018-08-10 00:18:493662 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3663 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3664 EXPECT_TRUE(stream.get());
3665
3666 // Cause QUIC stream to be created.
3667 HttpRequestInfo request_info;
3668 request_info.method = "GET";
3669 request_info.url = url_;
3670 request_info.traffic_annotation =
3671 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3672 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3673 net_log_, CompletionOnceCallback()));
3674
3675 // Ensure that session is alive and active.
3676 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3677 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3678 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3679
3680 // Send GET request on stream.
3681 HttpResponseInfo response;
3682 HttpRequestHeaders request_headers;
3683 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3684 callback_.callback()));
3685
3686 // Trigger the connection to report path degrading to the session.
3687 // Session will mark itself GOAWAY.
3688 session->connection()->OnPathDegradingTimeout();
3689
3690 // The connection should still be alive, but marked as going away.
3691 EXPECT_FALSE(HasActiveSession(host_port_pair_));
3692 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3693 EXPECT_EQ(1u, session->GetNumActiveStreams());
3694
3695 // Second request should be sent on a new connection.
3696 QuicStreamRequest request2(factory_.get());
3697 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033698 request2.Request(
3699 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3700 SocketTag(),
3701 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3702 failed_on_default_network_callback_, callback_.callback()));
Renjiea5722ccf2018-08-10 00:18:493703 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3704 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
3705 EXPECT_TRUE(stream2.get());
3706
3707 // Resume the data, verify old request can read response on the old session
3708 // successfully.
3709 quic_data1.Resume();
3710 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
3711 EXPECT_EQ(200, response.headers->response_code());
3712 EXPECT_EQ(0U, session->GetNumActiveStreams());
3713
3714 // Check an active session exists for the destination.
3715 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3716 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3717 QuicChromiumClientSession* session2 = GetActiveSession(host_port_pair_);
3718 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
3719 EXPECT_NE(session, session2);
3720
3721 stream.reset();
3722 stream2.reset();
3723 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
3724 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
3725 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
3726 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
3727}
3728
Zhongyi Shibb770d92018-06-16 02:07:003729// This test verifies that the connection will not migrate to a bad socket
3730// when path degrading is detected.
3731TEST_P(QuicStreamFactoryTest, DoNotMigrateToBadSocketOnPathDegrading) {
3732 InitializeConnectionMigrationV2Test(
3733 {kDefaultNetworkForTests, kNewNetworkForTests});
3734 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3735 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3736 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3737
3738 // Using a testing task runner so that we can control time.
3739 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
3740 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
3741
3742 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3743 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
3744
3745 MockQuicData quic_data;
3746 quic::QuicStreamOffset header_stream_offset = 0;
3747 quic_data.AddWrite(SYNCHRONOUS,
3748 ConstructInitialSettingsPacket(1, &header_stream_offset));
3749 quic_data.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
3750 2, GetNthClientInitiatedStreamId(0), true,
3751 true, &header_stream_offset));
3752 quic_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
3753 quic_data.AddRead(
3754 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
3755 false, false));
3756 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3757 quic_data.AddWrite(SYNCHRONOUS,
3758 client_maker_.MakeAckAndRstPacket(
3759 3, false, GetNthClientInitiatedStreamId(0),
3760 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
3761 quic_data.AddSocketDataToFactory(socket_factory_.get());
3762
3763 // Set up second socket that will immediately return disconnected.
3764 // The stream factory will abort probe the alternate network.
3765 MockConnect bad_connect = MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED);
3766 SequencedSocketData socket_data(bad_connect, base::span<MockRead>(),
3767 base::span<MockWrite>());
3768 socket_factory_->AddSocketDataProvider(&socket_data);
3769
3770 // Create request and QuicHttpStream.
3771 QuicStreamRequest request(factory_.get());
3772 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033773 request.Request(
3774 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3775 SocketTag(),
3776 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3777 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shibb770d92018-06-16 02:07:003778 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3779 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3780 EXPECT_TRUE(stream.get());
3781
3782 // Cause QUIC stream to be created.
3783 HttpRequestInfo request_info;
3784 request_info.method = "GET";
3785 request_info.url = url_;
3786 request_info.traffic_annotation =
3787 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3788 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3789 net_log_, CompletionOnceCallback()));
3790
3791 // Ensure that session is alive and active.
3792 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3793 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3794 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3795
3796 // Send GET request on stream.
3797 HttpResponseInfo response;
3798 HttpRequestHeaders request_headers;
3799 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3800 callback_.callback()));
3801
3802 // Cause the connection to report path degrading to the session.
3803 // Session will start to probe the alternate network.
3804 session->connection()->OnPathDegradingTimeout();
3805
3806 // The connection should still be alive, and not marked as going away.
3807 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3808 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3809 EXPECT_EQ(1u, session->GetNumActiveStreams());
3810 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
3811
3812 // Resume the data, and response header is received over the original network.
3813 quic_data.Resume();
3814 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3815 EXPECT_EQ(200, response.headers->response_code());
3816
3817 // Verify there is no pending task as probing alternate network is halted.
3818 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
3819
3820 // Verify that the session is still alive.
3821 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3822 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3823
3824 stream.reset();
3825 EXPECT_TRUE(quic_data.AllReadDataConsumed());
3826 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
3827}
3828
Zhongyi Shif5cc30392018-05-30 18:25:153829// Regression test for http://crbug.com/847569.
3830// This test verifies that the connection migrates to the alternate network
3831// early when there is no active stream but a draining stream.
Zhongyi Shib3bc982c2018-07-10 19:59:243832// The first packet being written after migration is a synchrnous write, which
3833// will cause a PING packet being sent.
3834TEST_P(QuicStreamFactoryTest, MigrateSessionWithDrainingStreamSync) {
Ryan Hamilton14d6a892018-10-18 19:03:423835 if (version_ == quic::QUIC_VERSION_99)
3836 return;
Zhongyi Shib3bc982c2018-07-10 19:59:243837 TestMigrateSessionWithDrainingStream(SYNCHRONOUS);
3838}
3839
3840// Regression test for http://crbug.com/847569.
3841// This test verifies that the connection migrates to the alternate network
3842// early when there is no active stream but a draining stream.
3843// The first packet being written after migration is an asynchronous write, no
3844// PING packet will be sent.
3845TEST_P(QuicStreamFactoryTest, MigrateSessionWithDrainingStreamAsync) {
Ryan Hamilton14d6a892018-10-18 19:03:423846 if (version_ == quic::QUIC_VERSION_99)
3847 return;
Zhongyi Shib3bc982c2018-07-10 19:59:243848 TestMigrateSessionWithDrainingStream(ASYNC);
3849}
3850
3851void QuicStreamFactoryTestBase::TestMigrateSessionWithDrainingStream(
3852 IoMode write_mode_for_queued_packet) {
Zhongyi Shif5cc30392018-05-30 18:25:153853 InitializeConnectionMigrationV2Test(
3854 {kDefaultNetworkForTests, kNewNetworkForTests});
3855 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3856 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3857 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3858
3859 // Using a testing task runner so that we can control time.
3860 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
3861 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
3862
3863 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3864 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
3865
Zhongyi Shib3bc982c2018-07-10 19:59:243866 int packet_number = 1;
Zhongyi Shif5cc30392018-05-30 18:25:153867 MockQuicData quic_data1;
3868 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shib3bc982c2018-07-10 19:59:243869 quic_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket(
3870 packet_number++, &header_stream_offset));
3871 quic_data1.AddWrite(
3872 SYNCHRONOUS, ConstructGetRequestPacket(
3873 packet_number++, GetNthClientInitiatedStreamId(0), true,
3874 true, &header_stream_offset));
Zhongyi Shif5cc30392018-05-30 18:25:153875 // Read an out of order packet with FIN to drain the stream.
3876 quic_data1.AddRead(
3877 ASYNC, ConstructOkResponsePacket(2, GetNthClientInitiatedStreamId(0),
3878 false, true)); // keep sending version.
Zhongyi Shib3bc982c2018-07-10 19:59:243879 quic_data1.AddWrite(SYNCHRONOUS, client_maker_.MakeAckPacket(
3880 packet_number++, 2, 2, 2, 1, true));
Zhongyi Shif5cc30392018-05-30 18:25:153881 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3882 quic_data1.AddSocketDataToFactory(socket_factory_.get());
3883
3884 // Set up the second socket data provider that is used after migration.
3885 MockQuicData quic_data2;
3886 // Connectivity probe to be sent on the new path.
Zhongyi Shib3bc982c2018-07-10 19:59:243887 quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
Zhongyi Shi879659422018-08-02 17:58:253888 packet_number++, false));
Zhongyi Shif5cc30392018-05-30 18:25:153889 quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
3890 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:253891 quic_data2.AddRead(ASYNC,
3892 server_maker_.MakeConnectivityProbingPacket(3, false));
Zhongyi Shif5cc30392018-05-30 18:25:153893 // Ping packet to send after migration is completed.
Zhongyi Shib3bc982c2018-07-10 19:59:243894 quic_data2.AddWrite(
3895 write_mode_for_queued_packet,
3896 client_maker_.MakeAckPacket(packet_number++, 2, 3, 3, 1, true));
3897 if (write_mode_for_queued_packet == SYNCHRONOUS) {
3898 quic_data2.AddWrite(ASYNC,
3899 client_maker_.MakePingPacket(packet_number++, false));
3900 }
Zhongyi Shif5cc30392018-05-30 18:25:153901 quic_data2.AddRead(
3902 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
3903 false, false));
Zhongyi Shib3bc982c2018-07-10 19:59:243904 quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeAckPacket(
3905 packet_number++, 1, 3, 1, 1, true));
Zhongyi Shif5cc30392018-05-30 18:25:153906 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3907 quic_data2.AddSocketDataToFactory(socket_factory_.get());
3908
3909 // Create request and QuicHttpStream.
3910 QuicStreamRequest request(factory_.get());
3911 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033912 request.Request(
3913 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3914 SocketTag(),
3915 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3916 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shif5cc30392018-05-30 18:25:153917 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3918 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3919 EXPECT_TRUE(stream.get());
3920
3921 // Cause QUIC stream to be created.
3922 HttpRequestInfo request_info;
3923 request_info.method = "GET";
3924 request_info.url = url_;
3925 request_info.traffic_annotation =
3926 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3927 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3928 net_log_, CompletionOnceCallback()));
3929
3930 // Ensure that session is alive and active.
3931 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3932 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3933 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3934
3935 // Send GET request on stream.
3936 HttpResponseInfo response;
3937 HttpRequestHeaders request_headers;
3938 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3939 callback_.callback()));
3940
3941 // Run the message loop to receive the out of order packet which contains a
3942 // FIN and drains the stream.
3943 base::RunLoop().RunUntilIdle();
3944 EXPECT_EQ(0u, session->GetNumActiveStreams());
3945
3946 // Cause the connection to report path degrading to the session.
3947 // Session should still start to probe the alternate network.
3948 session->connection()->OnPathDegradingTimeout();
3949 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3950
3951 // Next connectivity probe is scheduled to be sent in 2 *
3952 // kDefaultRTTMilliSecs.
3953 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3954 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
3955 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3956 next_task_delay);
3957
3958 // The connection should still be alive, and not marked as going away.
3959 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shif5cc30392018-05-30 18:25:153960
3961 // Resume quic data and a connectivity probe response will be read on the new
3962 // socket.
3963 quic_data2.Resume();
3964
3965 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3966 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi0439ecc72018-07-11 04:41:263967 EXPECT_EQ(0u, session->GetNumActiveStreams());
3968 EXPECT_EQ(1u, session->GetNumDrainingStreams());
Zhongyi Shif5cc30392018-05-30 18:25:153969
3970 // There should be three pending tasks, the nearest one will complete
3971 // migration to the new network.
3972 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
3973 next_task_delay = task_runner->NextPendingTaskDelay();
3974 EXPECT_EQ(base::TimeDelta(), next_task_delay);
3975 task_runner->FastForwardBy(next_task_delay);
3976
3977 // Now there are two pending tasks, the nearest one was to send connectivity
3978 // probe and has been cancelled due to successful migration.
3979 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
3980 next_task_delay = task_runner->NextPendingTaskDelay();
3981 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3982 next_task_delay);
3983 task_runner->FastForwardBy(next_task_delay);
3984
3985 // There's one more task to mgirate back to the default network in 0.4s.
3986 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3987 next_task_delay = task_runner->NextPendingTaskDelay();
3988 base::TimeDelta expected_delay =
3989 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
3990 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
3991 EXPECT_EQ(expected_delay, next_task_delay);
3992
Zhongyi Shib3bc982c2018-07-10 19:59:243993 base::RunLoop().RunUntilIdle();
3994
Zhongyi Shif5cc30392018-05-30 18:25:153995 // Deliver a signal that the alternate network now becomes default to session,
3996 // this will cancel mgirate back to default network timer.
3997 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3998 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
3999
4000 task_runner->FastForwardBy(next_task_delay);
4001 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4002
4003 // Verify that the session is still alive.
4004 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4005 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi0439ecc72018-07-11 04:41:264006 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
Zhongyi Shif5cc30392018-05-30 18:25:154007
4008 stream.reset();
4009 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
4010 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
4011 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
4012 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
4013}
4014
Zhongyi Shiaba4a832018-04-30 20:29:084015// Regression test for http://crbug.com/835444.
4016// This test verifies that the connection migrates to the alternate network
4017// when the alternate network is connected after path has been degrading.
4018TEST_P(QuicStreamFactoryTest, MigrateOnNewNetworkConnectAfterPathDegrading) {
Ryan Hamilton14d6a892018-10-18 19:03:424019 if (version_ == quic::QUIC_VERSION_99)
4020 return;
Zhongyi Shiaba4a832018-04-30 20:29:084021 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
4022 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4023 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4024 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4025
4026 // Using a testing task runner so that we can control time.
4027 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4028 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4029
4030 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4031 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
4032
4033 MockQuicData quic_data1;
Ryan Hamilton8d9ee76e2018-05-29 23:52:524034 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shiaba4a832018-04-30 20:29:084035 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
4036 quic_data1.AddWrite(SYNCHRONOUS,
4037 ConstructInitialSettingsPacket(1, &header_stream_offset));
4038 quic_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
4039 2, GetNthClientInitiatedStreamId(0),
4040 true, true, &header_stream_offset));
4041 quic_data1.AddSocketDataToFactory(socket_factory_.get());
4042
4043 // Set up the second socket data provider that is used after migration.
4044 // The response to the earlier request is read on the new socket.
4045 MockQuicData quic_data2;
4046 // Connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:254047 quic_data2.AddWrite(SYNCHRONOUS,
4048 client_maker_.MakeConnectivityProbingPacket(3, true));
Zhongyi Shiaba4a832018-04-30 20:29:084049 quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
4050 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:254051 quic_data2.AddRead(ASYNC,
4052 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shiaba4a832018-04-30 20:29:084053 // Ping packet to send after migration is completed.
4054 quic_data2.AddWrite(ASYNC,
4055 client_maker_.MakeAckAndPingPacket(4, false, 1, 1, 1));
4056 quic_data2.AddRead(
4057 ASYNC, ConstructOkResponsePacket(2, GetNthClientInitiatedStreamId(0),
4058 false, false));
4059 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4060 quic_data2.AddWrite(SYNCHRONOUS,
4061 client_maker_.MakeAckAndRstPacket(
4062 5, false, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:524063 quic::QUIC_STREAM_CANCELLED, 2, 2, 1, true));
Zhongyi Shiaba4a832018-04-30 20:29:084064 quic_data2.AddSocketDataToFactory(socket_factory_.get());
4065
4066 // Create request and QuicHttpStream.
4067 QuicStreamRequest request(factory_.get());
4068 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034069 request.Request(
4070 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4071 SocketTag(),
4072 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4073 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shiaba4a832018-04-30 20:29:084074 EXPECT_THAT(callback_.WaitForResult(), IsOk());
4075 std::unique_ptr<HttpStream> stream = CreateStream(&request);
4076 EXPECT_TRUE(stream.get());
4077
4078 // Cause QUIC stream to be created.
4079 HttpRequestInfo request_info;
4080 request_info.method = "GET";
4081 request_info.url = url_;
4082 request_info.traffic_annotation =
4083 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
4084 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
4085 net_log_, CompletionOnceCallback()));
4086
4087 // Ensure that session is alive and active.
4088 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4089 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4090 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4091
4092 // Send GET request on stream.
4093 HttpResponseInfo response;
4094 HttpRequestHeaders request_headers;
4095 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
4096 callback_.callback()));
4097
4098 // Cause the connection to report path degrading to the session.
4099 // Due to lack of alternate network, session will not mgirate connection.
4100 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4101 session->connection()->OnPathDegradingTimeout();
4102 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4103
4104 // Deliver a signal that a alternate network is connected now, this should
4105 // cause the connection to start early migration on path degrading.
4106 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4107 ->SetConnectedNetworksList(
4108 {kDefaultNetworkForTests, kNewNetworkForTests});
4109 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4110 ->NotifyNetworkConnected(kNewNetworkForTests);
Zhongyi Shic4823bd2018-04-27 00:49:194111
4112 // Next connectivity probe is scheduled to be sent in 2 *
4113 // kDefaultRTTMilliSecs.
4114 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4115 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
4116 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
4117 next_task_delay);
4118
4119 // The connection should still be alive, and not marked as going away.
4120 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4121 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4122 EXPECT_EQ(1u, session->GetNumActiveStreams());
4123 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
4124
4125 // Resume quic data and a connectivity probe response will be read on the new
4126 // socket.
4127 quic_data2.Resume();
4128
4129 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4130 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4131 EXPECT_EQ(1u, session->GetNumActiveStreams());
4132
4133 // There should be three pending tasks, the nearest one will complete
4134 // migration to the new network.
4135 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
4136 next_task_delay = task_runner->NextPendingTaskDelay();
4137 EXPECT_EQ(base::TimeDelta(), next_task_delay);
4138 task_runner->FastForwardBy(next_task_delay);
4139
4140 // Response headers are received over the new network.
4141 EXPECT_THAT(callback_.WaitForResult(), IsOk());
4142 EXPECT_EQ(200, response.headers->response_code());
4143
4144 // Now there are two pending tasks, the nearest one was to send connectivity
4145 // probe and has been cancelled due to successful migration.
4146 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
4147 next_task_delay = task_runner->NextPendingTaskDelay();
4148 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
4149 next_task_delay);
4150 task_runner->FastForwardBy(next_task_delay);
4151
4152 // There's one more task to mgirate back to the default network in 0.4s.
4153 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4154 next_task_delay = task_runner->NextPendingTaskDelay();
4155 base::TimeDelta expected_delay =
4156 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
4157 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
4158 EXPECT_EQ(expected_delay, next_task_delay);
4159
4160 // Deliver a signal that the alternate network now becomes default to session,
4161 // this will cancel mgirate back to default network timer.
4162 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4163 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
4164
4165 task_runner->FastForwardBy(next_task_delay);
4166 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4167
4168 // Verify that the session is still alive.
4169 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4170 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4171
4172 stream.reset();
4173 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
4174 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
4175 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
4176 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
4177}
4178
Zhongyi Shi28f6e352018-06-20 21:15:434179// This test verifies that multiple sessions are migrated on connection
4180// migration signal.
jrie3d187c2016-09-16 14:29:174181TEST_P(QuicStreamFactoryTest,
Zhongyi Shi28f6e352018-06-20 21:15:434182 MigrateMultipleSessionsToBadSocketsAfterDisconnected) {
4183 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jrie3d187c2016-09-16 14:29:174184
4185 MockQuicData socket_data1;
4186 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:434187 socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
jrie3d187c2016-09-16 14:29:174188 socket_data1.AddWrite(ASYNC, OK);
Zhongyi Shi5f587cc2017-11-21 23:24:174189 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jrie3d187c2016-09-16 14:29:174190 MockQuicData socket_data2;
4191 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:434192 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
jrie3d187c2016-09-16 14:29:174193 socket_data2.AddWrite(ASYNC, OK);
Zhongyi Shi5f587cc2017-11-21 23:24:174194 socket_data2.AddSocketDataToFactory(socket_factory_.get());
jrie3d187c2016-09-16 14:29:174195
4196 HostPortPair server1(kDefaultServerHostName, 443);
4197 HostPortPair server2(kServer2HostName, 443);
4198
4199 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4200 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4201 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4202
Renjiea0cb4a2c2018-09-26 23:37:304203 host_resolver_->set_synchronous_mode(true);
4204 host_resolver_->rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
4205 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.2", "");
jrie3d187c2016-09-16 14:29:174206
4207 // Create request and QuicHttpStream to create session1.
zhongyi98d6a9262017-05-19 02:47:454208 QuicStreamRequest request1(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:034209 EXPECT_EQ(OK,
4210 request1.Request(
4211 server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
4212 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4213 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:244214 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
jrie3d187c2016-09-16 14:29:174215 EXPECT_TRUE(stream1.get());
4216
4217 // Create request and QuicHttpStream to create session2.
zhongyi98d6a9262017-05-19 02:47:454218 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:034219 EXPECT_EQ(OK,
4220 request2.Request(
4221 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
4222 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
4223 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:244224 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
jrie3d187c2016-09-16 14:29:174225 EXPECT_TRUE(stream2.get());
4226
4227 QuicChromiumClientSession* session1 = GetActiveSession(server1);
4228 QuicChromiumClientSession* session2 = GetActiveSession(server2);
4229 EXPECT_NE(session1, session2);
4230
4231 // Cause QUIC stream to be created and send GET so session1 has an open
4232 // stream.
4233 HttpRequestInfo request_info1;
4234 request_info1.method = "GET";
4235 request_info1.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:394236 request_info1.traffic_annotation =
4237 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:274238 EXPECT_EQ(OK,
4239 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:394240 net_log_, CompletionOnceCallback()));
jrie3d187c2016-09-16 14:29:174241 HttpResponseInfo response1;
4242 HttpRequestHeaders request_headers1;
4243 EXPECT_EQ(OK, stream1->SendRequest(request_headers1, &response1,
4244 callback_.callback()));
4245
4246 // Cause QUIC stream to be created and send GET so session2 has an open
4247 // stream.
4248 HttpRequestInfo request_info2;
4249 request_info2.method = "GET";
4250 request_info2.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:394251 request_info2.traffic_annotation =
4252 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:274253 EXPECT_EQ(OK,
4254 stream2->InitializeStream(&request_info2, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:394255 net_log_, CompletionOnceCallback()));
jrie3d187c2016-09-16 14:29:174256 HttpResponseInfo response2;
4257 HttpRequestHeaders request_headers2;
4258 EXPECT_EQ(OK, stream2->SendRequest(request_headers2, &response2,
4259 callback_.callback()));
4260
4261 // Cause both sessions to be paused due to DISCONNECTED.
4262 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4263 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
4264
4265 // Ensure that both sessions are paused but alive.
4266 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session1));
4267 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
4268
Zhongyi Shi28f6e352018-06-20 21:15:434269 // Add new sockets to use post migration. Those are bad sockets and will cause
4270 // migration to fail.
jrie3d187c2016-09-16 14:29:174271 MockConnect connect_result =
4272 MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED);
Ryan Sleevib8d7ea02018-05-07 20:01:014273 SequencedSocketData socket_data3(connect_result, base::span<MockRead>(),
4274 base::span<MockWrite>());
Zhongyi Shi5f587cc2017-11-21 23:24:174275 socket_factory_->AddSocketDataProvider(&socket_data3);
Ryan Sleevib8d7ea02018-05-07 20:01:014276 SequencedSocketData socket_data4(connect_result, base::span<MockRead>(),
4277 base::span<MockWrite>());
Zhongyi Shi5f587cc2017-11-21 23:24:174278 socket_factory_->AddSocketDataProvider(&socket_data4);
jrie3d187c2016-09-16 14:29:174279
Zhongyi Shi28f6e352018-06-20 21:15:434280 // Connect the new network and cause migration to bad sockets, causing
4281 // sessions to close.
jrie3d187c2016-09-16 14:29:174282 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4283 ->SetConnectedNetworksList({kNewNetworkForTests});
4284 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4285 ->NotifyNetworkConnected(kNewNetworkForTests);
4286
4287 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session1));
4288 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
4289
4290 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
4291 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
4292 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
4293 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
4294}
4295
Zhongyi Shi6ec9b36e2018-06-20 20:32:544296// This test verifies that session attempts connection migration with signals
4297// delivered in the following order (no alternate network is available):
4298// - path degrading is detected: session attempts connection migration but no
4299// alternate network is available, session caches path degrading signal in
4300// connection and stays on the original network.
4301// - original network backs up, request is served in the orignal network,
4302// session is not marked as going away.
4303TEST_P(QuicStreamFactoryTest, MigrateOnPathDegradingWithNoNewNetwork) {
4304 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jrid36ada62016-02-06 02:42:084305 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4306 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4307
Zhongyi Shi6ec9b36e2018-06-20 20:32:544308 MockQuicData quic_data;
4309 quic::QuicStreamOffset header_stream_offset = 0;
4310 quic_data.AddWrite(SYNCHRONOUS,
4311 ConstructInitialSettingsPacket(1, &header_stream_offset));
4312 quic_data.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
4313 2, GetNthClientInitiatedStreamId(0), true,
4314 true, &header_stream_offset));
4315 quic_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause for path degrading signal.
4316
4317 // The rest of the data will still flow in the original socket as there is no
4318 // new network after path degrading.
4319 quic_data.AddRead(
4320 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
4321 false, false));
4322 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4323 quic_data.AddWrite(SYNCHRONOUS,
4324 client_maker_.MakeAckAndRstPacket(
4325 3, false, GetNthClientInitiatedStreamId(0),
4326 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
4327 quic_data.AddSocketDataToFactory(socket_factory_.get());
jrid36ada62016-02-06 02:42:084328
4329 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:454330 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:334331 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034332 request.Request(
4333 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4334 SocketTag(),
4335 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4336 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:014337 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:244338 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jrid36ada62016-02-06 02:42:084339 EXPECT_TRUE(stream.get());
4340
4341 // Cause QUIC stream to be created.
4342 HttpRequestInfo request_info;
Zhongyi Shi6ec9b36e2018-06-20 20:32:544343 request_info.method = "GET";
4344 request_info.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:394345 request_info.traffic_annotation =
4346 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Zhongyi Shi6ec9b36e2018-06-20 20:32:544347 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:394348 net_log_, CompletionOnceCallback()));
jrid36ada62016-02-06 02:42:084349
4350 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:504351 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jrid36ada62016-02-06 02:42:084352 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4353 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4354
Zhongyi Shi6ec9b36e2018-06-20 20:32:544355 // Send GET request on stream.
4356 HttpResponseInfo response;
4357 HttpRequestHeaders request_headers;
4358 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
4359 callback_.callback()));
jrid36ada62016-02-06 02:42:084360
Zhongyi Shi6ec9b36e2018-06-20 20:32:544361 // Trigger connection migration on path degrading. Since there are no networks
4362 // to migrate to, the session will remain on the original network, not marked
4363 // as going away.
4364 session->connection()->OnPathDegradingTimeout();
4365 EXPECT_TRUE(session->connection()->IsPathDegrading());
4366
4367 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4368 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4369 EXPECT_EQ(1u, session->GetNumActiveStreams());
4370 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
4371
4372 // Resume so that rest of the data will flow in the original socket.
4373 quic_data.Resume();
jrid36ada62016-02-06 02:42:084374
4375 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4376 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4377 EXPECT_EQ(1u, session->GetNumActiveStreams());
4378
4379 stream.reset();
Zhongyi Shi6ec9b36e2018-06-20 20:32:544380 EXPECT_TRUE(quic_data.AllReadDataConsumed());
4381 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
jrid36ada62016-02-06 02:42:084382}
4383
Zhongyi Shi21e99532018-07-17 22:23:074384// This test verifies that session with non-migratable stream will probe the
4385// alternate network on path degrading, and close the non-migratable streams
4386// when probe is successful.
jri231c2972016-03-08 19:50:114387TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyNonMigratableStream) {
Ryan Hamilton14d6a892018-10-18 19:03:424388 if (version_ == quic::QUIC_VERSION_99)
4389 return;
Zhongyi Shi1a054612018-06-14 04:59:084390 InitializeConnectionMigrationV2Test(
jri231c2972016-03-08 19:50:114391 {kDefaultNetworkForTests, kNewNetworkForTests});
4392 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4393 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4394
rcha00569732016-08-27 11:09:364395 MockQuicData socket_data;
4396 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:434397 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Renjieba55fae2018-09-20 03:05:164398 socket_data.AddWrite(
4399 SYNCHRONOUS,
4400 client_maker_.MakeRstAckAndConnectionClosePacket(
4401 3, false, 5, quic::QUIC_STREAM_CANCELLED,
4402 quic::QuicTime::Delta::FromMilliseconds(0), 1, 1, 1,
4403 quic::QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS, "net error"));
Zhongyi Shi5f587cc2017-11-21 23:24:174404 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri231c2972016-03-08 19:50:114405
Zhongyi Shi21e99532018-07-17 22:23:074406 // Set up the second socket data provider that is used for probing.
4407 MockQuicData quic_data1;
4408 // Connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:254409 quic_data1.AddWrite(SYNCHRONOUS,
4410 client_maker_.MakeConnectivityProbingPacket(2, true));
Zhongyi Shi21e99532018-07-17 22:23:074411 quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
4412 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:254413 quic_data1.AddRead(ASYNC,
4414 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shi21e99532018-07-17 22:23:074415 quic_data1.AddSocketDataToFactory(socket_factory_.get());
4416
jri231c2972016-03-08 19:50:114417 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:454418 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:334419 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034420 request.Request(
4421 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4422 SocketTag(),
4423 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4424 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:014425 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:244426 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri231c2972016-03-08 19:50:114427 EXPECT_TRUE(stream.get());
4428
4429 // Cause QUIC stream to be created, but marked as non-migratable.
4430 HttpRequestInfo request_info;
Zhongyi Shibb28b1f2018-07-18 02:41:264431 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
Ramin Halavati683bcaa92018-02-14 08:42:394432 request_info.traffic_annotation =
4433 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:274434 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:394435 net_log_, CompletionOnceCallback()));
jri231c2972016-03-08 19:50:114436
4437 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:504438 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:114439 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4440 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4441
4442 // Trigger connection migration. Since there is a non-migratable stream,
4443 // this should cause session to be continue without migrating.
4444 session->OnPathDegrading();
4445
4446 // Run the message loop so that data queued in the new socket is read by the
4447 // packet reader.
4448 base::RunLoop().RunUntilIdle();
4449
4450 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4451 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4452 EXPECT_EQ(1u, session->GetNumActiveStreams());
4453
Zhongyi Shi21e99532018-07-17 22:23:074454 // Resume the data to read the connectivity probing response to declare probe
4455 // as successful. Non-migratable streams will be closed.
4456 quic_data1.Resume();
4457 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4458 EXPECT_FALSE(HasActiveSession(host_port_pair_));
4459 EXPECT_EQ(0u, session->GetNumActiveStreams());
jri231c2972016-03-08 19:50:114460
Zhongyi Shi21e99532018-07-17 22:23:074461 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
4462 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
jri231c2972016-03-08 19:50:114463 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4464 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4465}
4466
jri9c541572016-03-29 17:51:484467TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyConnectionMigrationDisabled) {
Zhongyi Shi1a054612018-06-14 04:59:084468 InitializeConnectionMigrationV2Test(
jri9c541572016-03-29 17:51:484469 {kDefaultNetworkForTests, kNewNetworkForTests});
4470 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4471 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4472
rcha00569732016-08-27 11:09:364473 MockQuicData socket_data;
4474 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:434475 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
4476 socket_data.AddWrite(
4477 SYNCHRONOUS,
4478 client_maker_.MakeRstPacket(2, true, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:524479 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:174480 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9c541572016-03-29 17:51:484481
4482 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:454483 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:334484 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034485 request.Request(
4486 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4487 SocketTag(),
4488 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4489 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:014490 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:244491 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9c541572016-03-29 17:51:484492 EXPECT_TRUE(stream.get());
4493
4494 // Cause QUIC stream to be created.
4495 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:394496 request_info.traffic_annotation =
4497 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:274498 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:394499 net_log_, CompletionOnceCallback()));
jri9c541572016-03-29 17:51:484500
4501 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:504502 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:484503 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4504 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4505
4506 // Set session config to have connection migration disabled.
Ryan Hamilton8d9ee76e2018-05-29 23:52:524507 quic::test::QuicConfigPeer::SetReceivedDisableConnectionMigration(
4508 session->config());
jri9c541572016-03-29 17:51:484509 EXPECT_TRUE(session->config()->DisableConnectionMigration());
4510
4511 // Trigger connection migration. Since there is a non-migratable stream,
4512 // this should cause session to be continue without migrating.
4513 session->OnPathDegrading();
4514
4515 // Run the message loop so that data queued in the new socket is read by the
4516 // packet reader.
4517 base::RunLoop().RunUntilIdle();
4518
4519 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4520 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4521 EXPECT_EQ(1u, session->GetNumActiveStreams());
4522
4523 stream.reset();
4524
4525 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4526 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4527}
4528
Zhongyi Shi3c4c9e92018-07-02 23:16:234529// Regression test for http://crbug.com/791886.
4530// This test verifies that the old packet writer which encountered an
4531// asynchronous write error will be blocked during migration on write error. New
4532// packets would not be written until the one with write error is rewritten on
4533// the new network.
4534TEST_P(QuicStreamFactoryTest, MigrateSessionOnAysncWriteError) {
4535 InitializeConnectionMigrationV2Test(
4536 {kDefaultNetworkForTests, kNewNetworkForTests});
4537 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4538 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4539 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4540
4541 // Using a testing task runner so that we can control time.
4542 // base::RunLoop() controls mocked socket writes and reads.
4543 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4544 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4545
4546 MockQuicData socket_data;
4547 quic::QuicStreamOffset header_stream_offset = 0;
4548 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4549 socket_data.AddWrite(
4550 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
4551 socket_data.AddWrite(ASYNC, ERR_ADDRESS_UNREACHABLE);
4552 socket_data.AddSocketDataToFactory(socket_factory_.get());
4553
4554 // Set up second socket data provider that is used after
4555 // migration. The request is rewritten to this new socket, and the
4556 // response to the request is read on this new socket.
4557 MockQuicData socket_data1;
4558 socket_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
4559 2, GetNthClientInitiatedStreamId(0),
4560 true, true, &header_stream_offset));
4561 socket_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
4562 3, GetNthClientInitiatedStreamId(1),
4563 GetNthClientInitiatedStreamId(0), true,
4564 true, &header_stream_offset));
4565 socket_data1.AddRead(
4566 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
4567 false, false));
4568 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4569 socket_data1.AddWrite(SYNCHRONOUS,
4570 client_maker_.MakeAckAndRstPacket(
4571 4, false, GetNthClientInitiatedStreamId(0),
4572 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
4573 socket_data1.AddWrite(
4574 SYNCHRONOUS,
4575 client_maker_.MakeRstPacket(5, false, GetNthClientInitiatedStreamId(1),
4576 quic::QUIC_STREAM_CANCELLED, 0));
4577
4578 socket_data1.AddSocketDataToFactory(socket_factory_.get());
4579
4580 // Create request #1 and QuicHttpStream.
4581 QuicStreamRequest request1(factory_.get());
4582 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034583 request1.Request(
4584 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4585 SocketTag(),
4586 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4587 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi3c4c9e92018-07-02 23:16:234588 EXPECT_THAT(callback_.WaitForResult(), IsOk());
4589 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
4590 EXPECT_TRUE(stream1.get());
4591
4592 HttpRequestInfo request_info1;
4593 request_info1.method = "GET";
4594 request_info1.url = GURL("https://www.example.org/");
4595 request_info1.traffic_annotation =
4596 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
4597 EXPECT_EQ(OK,
4598 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
4599 net_log_, CompletionOnceCallback()));
4600
4601 // Request #2 returns synchronously because it pools to existing session.
4602 TestCompletionCallback callback2;
4603 QuicStreamRequest request2(factory_.get());
4604 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
4605 DEFAULT_PRIORITY, SocketTag(),
4606 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:034607 &net_error_details_,
4608 failed_on_default_network_callback_,
4609 callback2.callback()));
Zhongyi Shi3c4c9e92018-07-02 23:16:234610 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
4611 EXPECT_TRUE(stream2.get());
4612
4613 HttpRequestInfo request_info2;
4614 request_info2.method = "GET";
4615 request_info2.url = GURL("https://www.example.org/");
4616 request_info2.traffic_annotation =
4617 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
4618 EXPECT_EQ(OK,
4619 stream2->InitializeStream(&request_info2, true, DEFAULT_PRIORITY,
4620 net_log_, CompletionOnceCallback()));
4621
4622 // Ensure that session is alive and active.
4623 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4624 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4625 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4626 EXPECT_EQ(2u, session->GetNumActiveStreams());
4627
4628 // Send GET request on stream1. This should cause an async write error.
4629 HttpResponseInfo response;
4630 HttpRequestHeaders request_headers;
4631 EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
4632 callback_.callback()));
4633 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4634
4635 // Run the message loop so that asynchronous write completes and a connection
4636 // migration on write error attempt is posted in QuicStreamFactory's task
4637 // runner.
4638 base::RunLoop().RunUntilIdle();
4639 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4640
4641 // Send GET request on stream. This will cause another write attempt before
4642 // migration on write error is exectued.
4643 HttpResponseInfo response2;
4644 HttpRequestHeaders request_headers2;
4645 EXPECT_EQ(OK, stream2->SendRequest(request_headers2, &response2,
4646 callback2.callback()));
4647
4648 // Run the task runner so that migration on write error is finally executed.
4649 task_runner->RunUntilIdle();
4650
Zhongyi Shia7dd46b2018-07-12 22:59:294651 // Verify the session is still alive and not marked as going away.
Zhongyi Shi3c4c9e92018-07-02 23:16:234652 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:294653 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi3c4c9e92018-07-02 23:16:234654 EXPECT_EQ(2u, session->GetNumActiveStreams());
Zhongyi Shia7dd46b2018-07-12 22:59:294655 // There should be one task posted to migrate back to the default network in
4656 // kMinRetryTimeForDefaultNetworkSecs.
4657 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4658 EXPECT_EQ(base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs),
4659 task_runner->NextPendingTaskDelay());
Zhongyi Shi3c4c9e92018-07-02 23:16:234660
4661 // Verify that response headers on the migrated socket were delivered to the
4662 // stream.
4663 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
4664 EXPECT_EQ(200, response.headers->response_code());
4665
4666 stream1.reset();
4667 stream2.reset();
4668
4669 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4670 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4671 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
4672 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
4673}
4674
Zhongyi Shia7dd46b2018-07-12 22:59:294675// Verify session is not marked as going away after connection migration on
4676// write error and migrate back to default network logic is applied to bring the
4677// migrated session back to the default network. Migration singals delivered
4678// in the following order (alternate network is always availabe):
4679// - session on the default network encountered a write error;
4680// - session successfully migrated to the non-default network;
4681// - session attempts to migrate back to default network post migration;
4682// - migration back to the default network is successful.
4683TEST_P(QuicStreamFactoryTest, MigrateBackToDefaultPostMigrationOnWriteError) {
Ryan Hamilton14d6a892018-10-18 19:03:424684 if (version_ == quic::QUIC_VERSION_99)
4685 return;
Zhongyi Shia7dd46b2018-07-12 22:59:294686 InitializeConnectionMigrationV2Test(
4687 {kDefaultNetworkForTests, kNewNetworkForTests});
4688 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4689 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4690 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4691
4692 // Using a testing task runner so that we can control time.
4693 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4694 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4695
4696 MockQuicData socket_data;
4697 quic::QuicStreamOffset header_stream_offset = 0;
4698 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4699 socket_data.AddWrite(
4700 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
4701 socket_data.AddWrite(ASYNC, ERR_ADDRESS_UNREACHABLE);
4702 socket_data.AddSocketDataToFactory(socket_factory_.get());
4703
4704 // Set up second socket data provider that is used after
4705 // migration. The request is rewritten to this new socket, and the
4706 // response to the request is read on this new socket.
4707 MockQuicData quic_data2;
4708 quic_data2.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
4709 2, GetNthClientInitiatedStreamId(0),
4710 true, true, &header_stream_offset));
4711 quic_data2.AddRead(
4712 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
4713 false, false));
4714 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4715 quic_data2.AddSocketDataToFactory(socket_factory_.get());
4716
4717 // Create request QuicHttpStream.
4718 QuicStreamRequest request1(factory_.get());
4719 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034720 request1.Request(
4721 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4722 SocketTag(),
4723 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4724 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shia7dd46b2018-07-12 22:59:294725 EXPECT_THAT(callback_.WaitForResult(), IsOk());
4726 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
4727 EXPECT_TRUE(stream1.get());
4728
4729 HttpRequestInfo request_info1;
4730 request_info1.method = "GET";
4731 request_info1.url = GURL("https://www.example.org/");
4732 request_info1.traffic_annotation =
4733 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
4734 EXPECT_EQ(OK,
4735 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
4736 net_log_, CompletionOnceCallback()));
4737
4738 // Ensure that session is alive and active.
4739 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4740 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4741 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4742 EXPECT_EQ(1u, session->GetNumActiveStreams());
4743
4744 // Send GET request. This should cause an async write error.
4745 HttpResponseInfo response;
4746 HttpRequestHeaders request_headers;
4747 EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
4748 callback_.callback()));
4749 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4750
4751 // Run the message loop so that asynchronous write completes and a connection
4752 // migration on write error attempt is posted in QuicStreamFactory's task
4753 // runner.
4754 base::RunLoop().RunUntilIdle();
4755 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4756
4757 // Run the task runner so that migration on write error is finally executed.
4758 task_runner->RunUntilIdle();
4759
4760 // Verify the session is still alive and not marked as going away.
4761 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4762 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4763 EXPECT_EQ(1u, session->GetNumActiveStreams());
4764 // There should be one task posted to migrate back to the default network in
4765 // kMinRetryTimeForDefaultNetworkSecs.
4766 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4767 base::TimeDelta expected_delay =
4768 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs);
4769 EXPECT_EQ(expected_delay, task_runner->NextPendingTaskDelay());
4770
4771 // Verify that response headers on the migrated socket were delivered to the
4772 // stream.
4773 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
4774 EXPECT_EQ(200, response.headers->response_code());
4775
4776 // Set up the third socket data provider for migrate back to default network.
4777 MockQuicData quic_data3;
4778 // Connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:254779 quic_data3.AddWrite(SYNCHRONOUS,
4780 client_maker_.MakeConnectivityProbingPacket(3, false));
Zhongyi Shia7dd46b2018-07-12 22:59:294781 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:254782 quic_data3.AddRead(ASYNC,
4783 server_maker_.MakeConnectivityProbingPacket(2, false));
Zhongyi Shia7dd46b2018-07-12 22:59:294784 quic_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4785 quic_data3.AddWrite(ASYNC, client_maker_.MakeAckPacket(4, 1, 2, 1, 1, true));
4786 quic_data3.AddWrite(
4787 SYNCHRONOUS,
4788 client_maker_.MakeRstPacket(5, false, GetNthClientInitiatedStreamId(0),
4789 quic::QUIC_STREAM_CANCELLED, 0));
4790 quic_data3.AddSocketDataToFactory(socket_factory_.get());
4791
4792 // Fast forward to fire the migrate back timer and verify the session
4793 // successfully migrates back to the default network.
4794 task_runner->FastForwardBy(expected_delay);
4795
4796 // Verify the session is still alive and not marked as going away.
4797 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4798 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4799 EXPECT_EQ(1u, session->GetNumActiveStreams());
4800
4801 // There should be one task posted to one will resend a connectivity probe and
4802 // the other will retry migrate back, both are cancelled.
4803 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
4804 task_runner->FastForwardBy(
4805 base::TimeDelta::FromSeconds(2 * kMinRetryTimeForDefaultNetworkSecs));
4806 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4807
4808 stream1.reset();
4809 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4810 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4811 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
4812 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
4813 EXPECT_TRUE(quic_data3.AllReadDataConsumed());
4814 EXPECT_TRUE(quic_data3.AllWriteDataConsumed());
4815}
4816
Zhongyi Shic1449372018-08-09 09:58:584817// This test verifies that the connection will not attempt connection migration
4818// (send connectivity probes on alternate path) when path degrading is detected
4819// and handshake is not confirmed.
4820TEST_P(QuicStreamFactoryTest,
4821 NoMigrationOnPathDegradingBeforeHandshakeConfirmed) {
4822 InitializeConnectionMigrationV2Test(
4823 {kDefaultNetworkForTests, kNewNetworkForTests});
4824
4825 // Using a testing task runner.
4826 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4827 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4828
4829 // Use cold start mode to send crypto message for handshake.
4830 crypto_client_stream_factory_.set_handshake_mode(
4831 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
4832
4833 MockQuicData socket_data;
4834 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4835 socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
4836 socket_data.AddSocketDataToFactory(socket_factory_.get());
4837
4838 // Create request and QuicHttpStream.
4839 QuicStreamRequest request(factory_.get());
4840 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034841 request.Request(
4842 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4843 SocketTag(),
4844 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4845 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shic1449372018-08-09 09:58:584846
4847 base::RunLoop().RunUntilIdle();
4848
4849 // Ensure that session is alive but not active.
4850 EXPECT_FALSE(HasActiveSession(host_port_pair_));
4851 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
4852 QuicChromiumClientSession* session = GetPendingSession(host_port_pair_);
4853 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4854 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4855
4856 // Cause the connection to report path degrading to the session.
4857 // Session will ignore the signal as handshake is not completed.
4858 session->connection()->OnPathDegradingTimeout();
4859 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4860
4861 EXPECT_FALSE(HasActiveSession(host_port_pair_));
Zhongyi Shi8de43832018-08-15 23:40:004862 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
Zhongyi Shic1449372018-08-09 09:58:584863 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4864 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4865}
4866
Zhongyi Shi634c1882018-08-16 04:05:594867// This test verifies that if a connection is closed with
4868// QUIC_NETWORK_IDLE_TIMEOUT before handshake is completed and there is no
4869// alternate network, no new connection will be created.
4870TEST_P(QuicStreamFactoryTest, NoAlternateNetworkBeforeHandshakeOnIdleTimeout) {
4871 TestNoAlternateNetworkBeforeHandshake(quic::QUIC_NETWORK_IDLE_TIMEOUT);
4872}
4873
4874// This test verifies that if a connection is closed with QUIC_HANDSHAKE_TIMEOUT
4875// and there is no alternate network, no new connection will be created.
4876TEST_P(QuicStreamFactoryTest, NoAlternateNetworkOnHandshakeTimeout) {
4877 TestNoAlternateNetworkBeforeHandshake(quic::QUIC_HANDSHAKE_TIMEOUT);
4878}
4879
4880void QuicStreamFactoryTestBase::TestNoAlternateNetworkBeforeHandshake(
4881 quic::QuicErrorCode quic_error) {
4882 DCHECK(quic_error == quic::QUIC_NETWORK_IDLE_TIMEOUT ||
4883 quic_error == quic::QUIC_HANDSHAKE_TIMEOUT);
4884 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
4885
4886 // Using a testing task runner.
4887 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4888 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4889
4890 // Use cold start mode to send crypto message for handshake.
4891 crypto_client_stream_factory_.set_handshake_mode(
4892 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
4893
4894 MockQuicData socket_data;
4895 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4896 socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
4897 socket_data.AddSocketDataToFactory(socket_factory_.get());
4898
4899 // Create request.
4900 QuicStreamRequest request(factory_.get());
4901 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034902 request.Request(
4903 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4904 SocketTag(),
4905 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4906 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi634c1882018-08-16 04:05:594907
4908 base::RunLoop().RunUntilIdle();
4909
4910 // Ensure that session is alive but not active.
4911 EXPECT_FALSE(HasActiveSession(host_port_pair_));
4912 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
4913 QuicChromiumClientSession* session = GetPendingSession(host_port_pair_);
4914 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4915 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4916
4917 // Cause the connection to report path degrading to the session.
4918 // Session will ignore the signal as handshake is not completed.
4919 session->connection()->OnPathDegradingTimeout();
4920 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4921 EXPECT_FALSE(HasActiveSession(host_port_pair_));
4922 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
4923
4924 // Cause the connection to close due to |quic_error| before handshake.
4925 quic::QuicString error_details;
4926 if (quic_error == quic::QUIC_NETWORK_IDLE_TIMEOUT) {
4927 error_details = "No recent network activity.";
4928 } else {
4929 error_details = "Handshake timeout expired.";
4930 }
4931 session->connection()->CloseConnection(
4932 quic_error, error_details, quic::ConnectionCloseBehavior::SILENT_CLOSE);
4933
4934 // A task will be posted to clean up the session in the factory.
4935 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4936 task_runner->FastForwardUntilNoTasksRemain();
4937
4938 // No new session should be created as there is no alternate network.
4939 EXPECT_FALSE(HasActiveSession(host_port_pair_));
4940 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
4941 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4942 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4943}
4944
Zhongyi Shi8de43832018-08-15 23:40:004945TEST_P(QuicStreamFactoryTest, NewConnectionBeforeHandshakeAfterIdleTimeout) {
Ryan Hamilton14d6a892018-10-18 19:03:424946 if (version_ == quic::QUIC_VERSION_99)
4947 return;
Zhongyi Shi8de43832018-08-15 23:40:004948 TestNewConnectionOnAlternateNetworkBeforeHandshake(
4949 quic::QUIC_NETWORK_IDLE_TIMEOUT);
4950}
4951
4952TEST_P(QuicStreamFactoryTest, NewConnectionAfterHandshakeTimeout) {
Ryan Hamilton14d6a892018-10-18 19:03:424953 if (version_ == quic::QUIC_VERSION_99)
4954 return;
Zhongyi Shi8de43832018-08-15 23:40:004955 TestNewConnectionOnAlternateNetworkBeforeHandshake(
4956 quic::QUIC_HANDSHAKE_TIMEOUT);
4957}
4958
Zhongyi Shif3fcbbe62018-08-16 22:52:084959// Sets up a test to verify that a new connection will be created on the
4960// alternate network after the initial connection fails before handshake with
4961// signals delivered in the following order (alternate network is available):
4962// - the default network is not able to complete crypto handshake;
4963// - the original connection is closed with |quic_error|;
4964// - a new connection is created on the alternate network and is able to finish
4965// crypto handshake;
4966// - the new session on the alternate network attempts to migrate back to the
4967// default network by sending probes;
4968// - default network being disconnected is delivered: session will stop probing
4969// the original network.
4970// - alternate network is made by default.
Zhongyi Shi8de43832018-08-15 23:40:004971void QuicStreamFactoryTestBase::
4972 TestNewConnectionOnAlternateNetworkBeforeHandshake(
4973 quic::QuicErrorCode quic_error) {
4974 DCHECK(quic_error == quic::QUIC_NETWORK_IDLE_TIMEOUT ||
4975 quic_error == quic::QUIC_HANDSHAKE_TIMEOUT);
4976 InitializeConnectionMigrationV2Test(
4977 {kDefaultNetworkForTests, kNewNetworkForTests});
4978
4979 // Using a testing task runner.
4980 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4981 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4982
4983 // Use cold start mode to send crypto message for handshake.
4984 crypto_client_stream_factory_.set_handshake_mode(
4985 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
4986
4987 // Socket data for connection on the default network.
4988 MockQuicData socket_data;
4989 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4990 socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
4991 socket_data.AddSocketDataToFactory(socket_factory_.get());
4992
4993 // Socket data for connection on the alternate network.
4994 MockQuicData socket_data2;
4995 quic::QuicStreamOffset header_stream_offset = 0;
4996 socket_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeDummyCHLOPacket(1));
4997 socket_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
4998 // Change the encryption level after handshake is confirmed.
4999 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_FORWARD_SECURE);
5000 socket_data2.AddWrite(
5001 ASYNC, ConstructInitialSettingsPacket(2, &header_stream_offset));
5002 socket_data2.AddWrite(
5003 ASYNC, ConstructGetRequestPacket(3, GetNthClientInitiatedStreamId(0),
5004 true, true, &header_stream_offset));
5005 socket_data2.AddRead(
5006 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
5007 false, false));
5008 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5009 socket_data2.AddWrite(SYNCHRONOUS,
5010 client_maker_.MakeAckAndRstPacket(
Zhongyi Shif3fcbbe62018-08-16 22:52:085011 5, false, GetNthClientInitiatedStreamId(0),
Zhongyi Shi8de43832018-08-15 23:40:005012 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
5013 socket_data2.AddSocketDataToFactory(socket_factory_.get());
5014
Zhongyi Shif3fcbbe62018-08-16 22:52:085015 // Socket data for probing on the default network.
5016 MockQuicData probing_data;
5017 probing_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
5018 probing_data.AddWrite(SYNCHRONOUS,
5019 client_maker_.MakeConnectivityProbingPacket(4, false));
5020 probing_data.AddSocketDataToFactory(socket_factory_.get());
5021
Zhongyi Shi8de43832018-08-15 23:40:005022 // Create request and QuicHttpStream.
5023 QuicStreamRequest request(factory_.get());
5024 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035025 request.Request(
5026 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5027 SocketTag(),
5028 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5029 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi8de43832018-08-15 23:40:005030
5031 base::RunLoop().RunUntilIdle();
5032
5033 // Ensure that session is alive but not active.
5034 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5035 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
5036 QuicChromiumClientSession* session = GetPendingSession(host_port_pair_);
5037 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5038 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
Zhongyi Shia6b68d112018-09-24 07:49:035039 EXPECT_FALSE(failed_on_default_network_);
Zhongyi Shi8de43832018-08-15 23:40:005040
5041 quic::QuicString error_details;
5042 if (quic_error == quic::QUIC_NETWORK_IDLE_TIMEOUT) {
5043 error_details = "No recent network activity.";
5044 } else {
5045 error_details = "Handshake timeout expired.";
5046 }
5047 session->connection()->CloseConnection(
5048 quic_error, error_details, quic::ConnectionCloseBehavior::SILENT_CLOSE);
5049
5050 // A task will be posted to clean up the session in the factory.
5051 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
5052 task_runner->FastForwardUntilNoTasksRemain();
5053
5054 // Verify a new session is created on the alternate network.
5055 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
5056 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5057 QuicChromiumClientSession* session2 = GetPendingSession(host_port_pair_);
5058 EXPECT_NE(session, session2);
Zhongyi Shia6b68d112018-09-24 07:49:035059 EXPECT_TRUE(failed_on_default_network_);
Zhongyi Shi8de43832018-08-15 23:40:005060
5061 // Confirm the handshake on the alternate network.
5062 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
5063 quic::QuicSession::HANDSHAKE_CONFIRMED);
5064 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5065 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5066 // Resume the data now so that data can be sent and read.
5067 socket_data2.Resume();
5068
5069 // Create the stream.
5070 std::unique_ptr<HttpStream> stream = CreateStream(&request);
5071 EXPECT_TRUE(stream.get());
5072 HttpRequestInfo request_info;
5073 request_info.method = "GET";
5074 request_info.url = GURL("https://www.example.org/");
5075 request_info.traffic_annotation =
5076 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5077 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
5078 net_log_, CompletionOnceCallback()));
5079 // Send the request.
5080 HttpResponseInfo response;
5081 HttpRequestHeaders request_headers;
5082 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
5083 callback_.callback()));
5084 // Run the message loop to finish asynchronous mock write.
5085 base::RunLoop().RunUntilIdle();
5086 // Read the response.
5087 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
5088 EXPECT_EQ(200, response.headers->response_code());
5089
Zhongyi Shif3fcbbe62018-08-16 22:52:085090 // There should be a new task posted to migrate back to the default network.
5091 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
5092 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
5093 EXPECT_EQ(base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs),
5094 next_task_delay);
5095 task_runner->FastForwardBy(next_task_delay);
5096
5097 // There should be two tasks posted. One will retry probing and the other
5098 // will retry migrate back.
5099 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
5100 next_task_delay = task_runner->NextPendingTaskDelay();
5101 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
5102 next_task_delay);
5103
5104 // Deliver the signal that the default network is disconnected.
5105 scoped_mock_network_change_notifier_->mock_network_change_notifier()
5106 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
5107 // Verify no connectivity probes will be sent as probing will be cancelled.
5108 task_runner->FastForwardUntilNoTasksRemain();
5109 // Deliver the signal that the alternate network is made default.
5110 scoped_mock_network_change_notifier_->mock_network_change_notifier()
5111 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
5112 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
5113
Zhongyi Shi8de43832018-08-15 23:40:005114 stream.reset();
5115 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5116 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5117 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
5118 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
5119}
5120
Zhongyi Shi247d6322018-07-24 07:03:355121// Test that connection will be closed with PACKET_WRITE_ERROR if a write error
5122// is triggered before handshake is confirmed and connection migration is turned
5123// on.
5124TEST_P(QuicStreamFactoryTest, MigrationOnWriteErrorBeforeHandshakeConfirmed) {
5125 InitializeConnectionMigrationV2Test(
5126 {kDefaultNetworkForTests, kNewNetworkForTests});
5127
5128 // Use unmocked crypto stream to do crypto connect.
5129 crypto_client_stream_factory_.set_handshake_mode(
Zhongyi Shi879659422018-08-02 17:58:255130 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
Zhongyi Shi247d6322018-07-24 07:03:355131
5132 MockQuicData socket_data;
5133 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5134 // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect.
5135 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
5136 socket_data.AddSocketDataToFactory(socket_factory_.get());
5137
5138 // Create request, should fail after the write of the CHLO fails.
5139 QuicStreamRequest request(factory_.get());
5140 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035141 request.Request(
5142 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5143 SocketTag(),
5144 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5145 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi247d6322018-07-24 07:03:355146 EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, callback_.WaitForResult());
5147 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5148 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
5149
5150 // Verify new requests can be sent normally.
5151 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:275152 MockCryptoClientStream::COLD_START);
Zhongyi Shi247d6322018-07-24 07:03:355153 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5154 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5155 MockQuicData socket_data2;
5156 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5157 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
5158 socket_data2.AddSocketDataToFactory(socket_factory_.get());
5159
5160 QuicStreamRequest request2(factory_.get());
5161 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035162 request2.Request(
5163 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5164 SocketTag(),
5165 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5166 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi247d6322018-07-24 07:03:355167 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5168 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
5169 // Run the message loop to complete host resolution.
5170 base::RunLoop().RunUntilIdle();
5171
5172 // Complete handshake. QuicStreamFactory::Job should complete and succeed.
5173 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
5174 quic::QuicSession::HANDSHAKE_CONFIRMED);
5175 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5176 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5177 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
5178
5179 // Create QuicHttpStream.
5180 std::unique_ptr<HttpStream> stream = CreateStream(&request2);
5181 EXPECT_TRUE(stream.get());
5182 stream.reset();
5183 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5184 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5185 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
5186 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
5187}
5188
jri9f303712016-09-13 01:10:225189void QuicStreamFactoryTestBase::TestMigrationOnWriteError(
5190 IoMode write_error_mode) {
Zhongyi Shi1a054612018-06-14 04:59:085191 InitializeConnectionMigrationV2Test(
jri9f303712016-09-13 01:10:225192 {kDefaultNetworkForTests, kNewNetworkForTests});
5193 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5194 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5195 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5196
Zhongyi Shi3c4c9e92018-07-02 23:16:235197 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
5198
jri9f303712016-09-13 01:10:225199 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:525200 quic::QuicStreamOffset header_stream_offset = 0;
jri9f303712016-09-13 01:10:225201 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
rch5cb522462017-04-25 20:18:365202 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:435203 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
jri9f303712016-09-13 01:10:225204 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:175205 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:225206
5207 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:455208 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:335209 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035210 request.Request(
5211 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5212 SocketTag(),
5213 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5214 failed_on_default_network_callback_, callback_.callback()));
jri9f303712016-09-13 01:10:225215 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:245216 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9f303712016-09-13 01:10:225217 EXPECT_TRUE(stream.get());
5218
5219 // Cause QUIC stream to be created.
5220 HttpRequestInfo request_info;
5221 request_info.method = "GET";
5222 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:395223 request_info.traffic_annotation =
5224 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:275225 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:395226 net_log_, CompletionOnceCallback()));
jri9f303712016-09-13 01:10:225227
5228 // Ensure that session is alive and active.
5229 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5230 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5231 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5232
5233 // Set up second socket data provider that is used after
5234 // migration. The request is rewritten to this new socket, and the
5235 // response to the request is read on this new socket.
5236 MockQuicData socket_data1;
Zhongyi Shi32f2fd02018-04-16 18:23:435237 socket_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
5238 2, GetNthClientInitiatedStreamId(0),
5239 true, true, &header_stream_offset));
5240 socket_data1.AddRead(
5241 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
5242 false, false));
jri9f303712016-09-13 01:10:225243 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:435244 socket_data1.AddWrite(SYNCHRONOUS,
5245 client_maker_.MakeAckAndRstPacket(
5246 3, false, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:525247 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:175248 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:225249
5250 // Send GET request on stream. This should cause a write error, which triggers
5251 // a connection migration attempt.
5252 HttpResponseInfo response;
5253 HttpRequestHeaders request_headers;
5254 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
5255 callback_.callback()));
5256
5257 // Run the message loop so that the migration attempt is executed and
5258 // data queued in the new socket is read by the packet reader.
5259 base::RunLoop().RunUntilIdle();
5260
Zhongyi Shia7dd46b2018-07-12 22:59:295261 // Verify that session is alive and not marked as going awya.
jri9f303712016-09-13 01:10:225262 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:295263 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri9f303712016-09-13 01:10:225264 EXPECT_EQ(1u, session->GetNumActiveStreams());
5265
5266 // Verify that response headers on the migrated socket were delivered to the
5267 // stream.
5268 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
5269 EXPECT_EQ(200, response.headers->response_code());
5270
5271 stream.reset();
5272
5273 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5274 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5275 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
5276 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
5277}
5278
5279TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorSynchronous) {
5280 TestMigrationOnWriteError(SYNCHRONOUS);
5281}
5282
5283TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorAsync) {
5284 TestMigrationOnWriteError(ASYNC);
5285}
5286
5287void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorNoNewNetwork(
5288 IoMode write_error_mode) {
Zhongyi Shi1a054612018-06-14 04:59:085289 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jri9f303712016-09-13 01:10:225290 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5291 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5292
jri5b785512016-09-13 04:29:115293 // Use the test task runner, to force the migration alarm timeout later.
5294 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
5295
jri9f303712016-09-13 01:10:225296 MockQuicData socket_data;
5297 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:435298 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
jri9f303712016-09-13 01:10:225299 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:175300 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:225301
5302 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:455303 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:335304 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035305 request.Request(
5306 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5307 SocketTag(),
5308 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5309 failed_on_default_network_callback_, callback_.callback()));
jri9f303712016-09-13 01:10:225310 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:245311 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9f303712016-09-13 01:10:225312 EXPECT_TRUE(stream.get());
5313
5314 // Cause QUIC stream to be created.
5315 HttpRequestInfo request_info;
5316 request_info.method = "GET";
5317 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:395318 request_info.traffic_annotation =
5319 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:275320 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:395321 net_log_, CompletionOnceCallback()));
jri9f303712016-09-13 01:10:225322
5323 // Ensure that session is alive and active.
5324 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5325 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5326 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5327
jri5b785512016-09-13 04:29:115328 // Send GET request on stream. This causes a write error, which triggers
5329 // a connection migration attempt. Since there are no networks
5330 // to migrate to, this causes the session to wait for a new network.
jri9f303712016-09-13 01:10:225331 HttpResponseInfo response;
5332 HttpRequestHeaders request_headers;
5333 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
5334 callback_.callback()));
jri5b785512016-09-13 04:29:115335
5336 // Complete any pending writes. Pending async MockQuicData writes
5337 // are run on the message loop, not on the test runner.
jri9f303712016-09-13 01:10:225338 base::RunLoop().RunUntilIdle();
jri5b785512016-09-13 04:29:115339
5340 // Write error causes migration task to be posted. Spin the loop.
5341 if (write_error_mode == ASYNC)
5342 runner_->RunNextTask();
5343
5344 // Migration has not yet failed. The session should be alive and active.
5345 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5346 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5347 EXPECT_EQ(1u, session->GetNumActiveStreams());
5348 EXPECT_TRUE(session->connection()->writer()->IsWriteBlocked());
5349
5350 // The migration will not fail until the migration alarm timeout.
5351 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5352 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5353 EXPECT_EQ(1u, session->GetNumActiveStreams());
5354 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
5355
5356 // Force migration alarm timeout to run.
5357 RunTestLoopUntilIdle();
5358
5359 // The connection should be closed. A request for response headers
5360 // should fail.
jri9f303712016-09-13 01:10:225361 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5362 EXPECT_FALSE(HasActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:115363 EXPECT_EQ(ERR_NETWORK_CHANGED, callback_.WaitForResult());
5364 EXPECT_EQ(ERR_NETWORK_CHANGED,
5365 stream->ReadResponseHeaders(callback_.callback()));
jri9f303712016-09-13 01:10:225366
5367 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5368 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5369}
5370
5371TEST_P(QuicStreamFactoryTest,
5372 MigrateSessionOnWriteErrorNoNewNetworkSynchronous) {
5373 TestMigrationOnWriteErrorNoNewNetwork(SYNCHRONOUS);
5374}
5375
5376TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorNoNewNetworkAsync) {
5377 TestMigrationOnWriteErrorNoNewNetwork(ASYNC);
5378}
5379
Zhongyi Shi0439ecc72018-07-11 04:41:265380TEST_P(QuicStreamFactoryTest,
5381 MigrateSessionOnWriteErrorWithMultipleRequestsSync) {
5382 TestMigrationOnWriteErrorWithMultipleRequests(SYNCHRONOUS);
5383}
5384
5385TEST_P(QuicStreamFactoryTest,
5386 MigrateSessionOnWriteErrorWithMultipleRequestsAsync) {
5387 TestMigrationOnWriteErrorWithMultipleRequests(ASYNC);
5388}
5389
5390// Sets up a test which verifies that connection migration on write error can
5391// eventually succeed and rewrite the packet on the new network with *multiple*
5392// migratable streams.
5393void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorWithMultipleRequests(
5394 IoMode write_error_mode) {
5395 InitializeConnectionMigrationV2Test(
5396 {kDefaultNetworkForTests, kNewNetworkForTests});
5397 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5398 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5399 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5400
5401 MockQuicData socket_data;
5402 quic::QuicStreamOffset header_stream_offset = 0;
5403 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5404 socket_data.AddWrite(
5405 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
5406 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
5407 socket_data.AddSocketDataToFactory(socket_factory_.get());
5408
5409 // Set up second socket data provider that is used after
5410 // migration. The request is rewritten to this new socket, and the
5411 // response to the request is read on this new socket.
5412 MockQuicData socket_data1;
5413 socket_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
5414 2, GetNthClientInitiatedStreamId(0),
5415 true, true, &header_stream_offset));
5416 socket_data1.AddRead(
5417 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
5418 false, false));
5419 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5420 socket_data1.AddWrite(SYNCHRONOUS,
5421 client_maker_.MakeAckAndRstPacket(
5422 3, false, GetNthClientInitiatedStreamId(0),
5423 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
5424 socket_data1.AddWrite(
5425 SYNCHRONOUS,
5426 client_maker_.MakeRstPacket(4, false, GetNthClientInitiatedStreamId(1),
5427 quic::QUIC_STREAM_CANCELLED, 0));
5428
5429 socket_data1.AddSocketDataToFactory(socket_factory_.get());
5430
5431 // Create request #1 and QuicHttpStream.
5432 QuicStreamRequest request1(factory_.get());
5433 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035434 request1.Request(
5435 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5436 SocketTag(),
5437 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5438 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265439 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5440 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
5441 EXPECT_TRUE(stream1.get());
5442
5443 HttpRequestInfo request_info1;
5444 request_info1.method = "GET";
5445 request_info1.url = GURL("https://www.example.org/");
5446 request_info1.traffic_annotation =
5447 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5448 EXPECT_EQ(OK,
5449 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
5450 net_log_, CompletionOnceCallback()));
5451
5452 // Second request returns synchronously because it pools to existing session.
5453 TestCompletionCallback callback2;
5454 QuicStreamRequest request2(factory_.get());
5455 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
5456 DEFAULT_PRIORITY, SocketTag(),
5457 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:035458 &net_error_details_,
5459 failed_on_default_network_callback_,
5460 callback2.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265461 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
5462 EXPECT_TRUE(stream2.get());
5463 HttpRequestInfo request_info2;
5464 request_info2.method = "GET";
5465 request_info2.url = GURL("https://www.example.org/");
5466 request_info2.traffic_annotation =
5467 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5468 EXPECT_EQ(OK,
5469 stream2->InitializeStream(&request_info2, true, DEFAULT_PRIORITY,
5470 net_log_, CompletionOnceCallback()));
5471
5472 // Ensure that session is alive and active.
5473 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5474 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5475 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5476 EXPECT_EQ(2u, session->GetNumActiveStreams());
5477
5478 // Send GET request on stream. This should cause a write error, which triggers
5479 // a connection migration attempt.
5480 HttpResponseInfo response;
5481 HttpRequestHeaders request_headers;
5482 EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
5483 callback_.callback()));
5484
5485 // Run the message loop so that the migration attempt is executed and
5486 // data queued in the new socket is read by the packet reader.
5487 base::RunLoop().RunUntilIdle();
5488
Zhongyi Shia7dd46b2018-07-12 22:59:295489 // Verify session is still alive and not marked as going away.
Zhongyi Shi0439ecc72018-07-11 04:41:265490 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:295491 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi0439ecc72018-07-11 04:41:265492 EXPECT_EQ(2u, session->GetNumActiveStreams());
5493
5494 // Verify that response headers on the migrated socket were delivered to the
5495 // stream.
5496 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
5497 EXPECT_EQ(200, response.headers->response_code());
5498
5499 stream1.reset();
5500 stream2.reset();
5501
5502 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5503 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5504 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
5505 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
5506}
5507
5508TEST_P(QuicStreamFactoryTest, MigrateOnWriteErrorWithMixedRequestsSync) {
5509 TestMigrationOnWriteErrorMixedStreams(SYNCHRONOUS);
5510}
5511
5512TEST_P(QuicStreamFactoryTest, MigrateOnWriteErrorWithMixedRequestsAsync) {
5513 TestMigrationOnWriteErrorMixedStreams(ASYNC);
5514}
5515
5516// Sets up a test that verifies connection migration manages to migrate to
5517// alternate network after encountering a SYNC/ASYNC write error based on
5518// |write_error_mode| on the original network.
5519// Note there are mixed types of unfinished requests before migration: one
5520// migratable and one non-migratable. The *migratable* one triggers write
5521// error.
5522void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorMixedStreams(
5523 IoMode write_error_mode) {
5524 InitializeConnectionMigrationV2Test(
5525 {kDefaultNetworkForTests, kNewNetworkForTests});
5526 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5527 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5528 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5529
5530 int packet_number = 1;
5531 MockQuicData socket_data;
5532 quic::QuicStreamOffset header_stream_offset = 0;
5533 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5534 socket_data.AddWrite(
5535 SYNCHRONOUS,
5536 ConstructInitialSettingsPacket(packet_number++, &header_stream_offset));
5537 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
5538 socket_data.AddSocketDataToFactory(socket_factory_.get());
5539
5540 // Set up second socket data provider that is used after
5541 // migration. The request is rewritten to this new socket, and the
5542 // response to the request is read on this new socket.
5543 MockQuicData socket_data1;
5544 socket_data1.AddWrite(
5545 SYNCHRONOUS, ConstructGetRequestPacket(
5546 packet_number++, GetNthClientInitiatedStreamId(0), true,
5547 true, &header_stream_offset));
5548 socket_data1.AddWrite(
5549 SYNCHRONOUS, client_maker_.MakeRstPacket(packet_number++, true,
5550 GetNthClientInitiatedStreamId(1),
5551 quic::QUIC_STREAM_CANCELLED, 0));
5552 socket_data1.AddRead(
5553 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
5554 false, false));
5555 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5556 socket_data1.AddWrite(
5557 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
5558 packet_number++, false, GetNthClientInitiatedStreamId(0),
5559 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
5560 socket_data1.AddSocketDataToFactory(socket_factory_.get());
5561
5562 // Create request #1 and QuicHttpStream.
5563 QuicStreamRequest request1(factory_.get());
5564 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035565 request1.Request(
5566 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5567 SocketTag(),
5568 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5569 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265570 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5571 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
5572 EXPECT_TRUE(stream1.get());
5573
5574 HttpRequestInfo request_info1;
5575 request_info1.method = "GET";
5576 request_info1.url = GURL("https://www.example.org/");
5577 request_info1.traffic_annotation =
5578 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5579 EXPECT_EQ(OK,
5580 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
5581 net_log_, CompletionOnceCallback()));
5582
5583 // Second request returns synchronously because it pools to existing session.
5584 TestCompletionCallback callback2;
5585 QuicStreamRequest request2(factory_.get());
5586 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
5587 DEFAULT_PRIORITY, SocketTag(),
5588 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:035589 &net_error_details_,
5590 failed_on_default_network_callback_,
5591 callback2.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265592 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
5593 EXPECT_TRUE(stream2.get());
5594
5595 HttpRequestInfo request_info2;
5596 request_info2.method = "GET";
Zhongyi Shibb28b1f2018-07-18 02:41:265597 request_info2.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
Zhongyi Shi0439ecc72018-07-11 04:41:265598 request_info2.url = GURL("https://www.example.org/");
5599 request_info2.traffic_annotation =
5600 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5601 EXPECT_EQ(OK,
5602 stream2->InitializeStream(&request_info2, true, DEFAULT_PRIORITY,
5603 net_log_, CompletionOnceCallback()));
5604
5605 // Ensure that session is alive and active.
5606 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5607 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5608 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5609 EXPECT_EQ(2u, session->GetNumActiveStreams());
5610
5611 // Send GET request on stream 1. This should cause a write error, which
5612 // triggers a connection migration attempt.
5613 HttpResponseInfo response;
5614 HttpRequestHeaders request_headers;
5615 EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
5616 callback_.callback()));
5617
5618 // Run the message loop so that the migration attempt is executed and
5619 // data queued in the new socket is read by the packet reader.
5620 base::RunLoop().RunUntilIdle();
5621
Zhongyi Shia7dd46b2018-07-12 22:59:295622 // Verify that the session is still alive and not marked as going away.
5623 // Non-migratable stream should be closed due to migration.
Zhongyi Shi0439ecc72018-07-11 04:41:265624 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:295625 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi0439ecc72018-07-11 04:41:265626 EXPECT_EQ(1u, session->GetNumActiveStreams());
5627
5628 // Verify that response headers on the migrated socket were delivered to the
5629 // stream.
5630 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
5631 EXPECT_EQ(200, response.headers->response_code());
5632
5633 stream1.reset();
5634
5635 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5636 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5637 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
5638 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
5639}
5640
5641TEST_P(QuicStreamFactoryTest, MigrateOnWriteErrorWithMixedRequests2Sync) {
5642 TestMigrationOnWriteErrorMixedStreams2(SYNCHRONOUS);
5643}
5644
5645TEST_P(QuicStreamFactoryTest, MigrateOnWriteErrorWithMixedRequests2Async) {
5646 TestMigrationOnWriteErrorMixedStreams2(ASYNC);
5647}
5648
5649// The one triggers write error is a non-migratable stream.
5650// Sets up a test that verifies connection migration manages to migrate to
5651// alternate network after encountering a SYNC/ASYNC write error based on
5652// |write_error_mode| on the original network.
5653// Note there are mixed types of unfinished requests before migration: one
5654// migratable and one non-migratable. The *non-migratable* one triggers write
5655// error.
5656void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorMixedStreams2(
5657 IoMode write_error_mode) {
5658 InitializeConnectionMigrationV2Test(
5659 {kDefaultNetworkForTests, kNewNetworkForTests});
5660 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5661 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5662 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5663
5664 int packet_number = 1;
5665 MockQuicData socket_data;
5666 quic::QuicStreamOffset header_stream_offset = 0;
5667 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5668 socket_data.AddWrite(
5669 SYNCHRONOUS,
5670 ConstructInitialSettingsPacket(packet_number++, &header_stream_offset));
5671 socket_data.AddWrite(write_error_mode,
5672 ERR_ADDRESS_UNREACHABLE); // Write error.
5673 socket_data.AddSocketDataToFactory(socket_factory_.get());
5674
5675 // Set up second socket data provider that is used after
5676 // migration. The request is rewritten to this new socket, and the
5677 // response to the request is read on this new socket.
5678 MockQuicData socket_data1;
5679 // The packet triggered writer error will be sent anyway even if the stream
5680 // will be cancelled later.
5681 socket_data1.AddWrite(
5682 SYNCHRONOUS, ConstructGetRequestPacket(
5683 packet_number++, GetNthClientInitiatedStreamId(1), true,
5684 true, &header_stream_offset));
5685 socket_data1.AddWrite(
5686 SYNCHRONOUS, client_maker_.MakeRstPacket(packet_number++, true,
5687 GetNthClientInitiatedStreamId(1),
5688 quic::QUIC_STREAM_CANCELLED, 0));
5689 socket_data1.AddWrite(
5690 SYNCHRONOUS, ConstructGetRequestPacket(
5691 packet_number++, GetNthClientInitiatedStreamId(0), true,
5692 true, &header_stream_offset));
5693 socket_data1.AddRead(
5694 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
5695 false, false));
5696 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5697 socket_data1.AddWrite(
5698 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
5699 packet_number++, false, GetNthClientInitiatedStreamId(0),
5700 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
5701 socket_data1.AddSocketDataToFactory(socket_factory_.get());
5702
5703 // Create request #1 and QuicHttpStream.
5704 QuicStreamRequest request1(factory_.get());
5705 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035706 request1.Request(
5707 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5708 SocketTag(),
5709 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5710 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265711 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5712 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
5713 EXPECT_TRUE(stream1.get());
5714
5715 HttpRequestInfo request_info1;
5716 request_info1.method = "GET";
5717 request_info1.url = GURL("https://www.example.org/");
5718 request_info1.traffic_annotation =
5719 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5720 EXPECT_EQ(OK,
5721 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
5722 net_log_, CompletionOnceCallback()));
5723
5724 // Second request returns synchronously because it pools to existing session.
5725 TestCompletionCallback callback2;
5726 QuicStreamRequest request2(factory_.get());
5727 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
5728 DEFAULT_PRIORITY, SocketTag(),
5729 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:035730 &net_error_details_,
5731 failed_on_default_network_callback_,
5732 callback2.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265733 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
5734 EXPECT_TRUE(stream2.get());
5735
5736 HttpRequestInfo request_info2;
5737 request_info2.method = "GET";
Zhongyi Shibb28b1f2018-07-18 02:41:265738 request_info2.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
Zhongyi Shi0439ecc72018-07-11 04:41:265739 request_info2.url = GURL("https://www.example.org/");
5740 request_info2.traffic_annotation =
5741 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5742 EXPECT_EQ(OK,
5743 stream2->InitializeStream(&request_info2, true, DEFAULT_PRIORITY,
5744 net_log_, CompletionOnceCallback()));
5745
5746 // Ensure that session is alive and active.
5747 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5748 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5749 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5750 EXPECT_EQ(2u, session->GetNumActiveStreams());
5751
5752 // Send GET request on stream 2 which is non-migratable. This should cause a
5753 // write error, which triggers a connection migration attempt.
5754 HttpResponseInfo response2;
5755 HttpRequestHeaders request_headers2;
5756 EXPECT_EQ(OK, stream2->SendRequest(request_headers2, &response2,
5757 callback2.callback()));
5758
5759 // Run the message loop so that the migration attempt is executed and
Zhongyi Shia7dd46b2018-07-12 22:59:295760 // data queued in the new socket is read by the packet reader. Session is
5761 // still alive and not marked as going away, non-migratable stream will be
5762 // closed.
Zhongyi Shi0439ecc72018-07-11 04:41:265763 base::RunLoop().RunUntilIdle();
5764 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:295765 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi0439ecc72018-07-11 04:41:265766 EXPECT_EQ(1u, session->GetNumActiveStreams());
5767
5768 // Send GET request on stream 1.
5769 HttpResponseInfo response;
5770 HttpRequestHeaders request_headers;
5771 EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
5772 callback_.callback()));
5773
5774 base::RunLoop().RunUntilIdle();
5775
5776 // Verify that response headers on the migrated socket were delivered to the
5777 // stream.
5778 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
5779 EXPECT_EQ(200, response.headers->response_code());
5780
5781 stream1.reset();
5782
5783 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5784 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5785 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
5786 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
5787}
5788
jri9f303712016-09-13 01:10:225789void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorNonMigratableStream(
5790 IoMode write_error_mode) {
5791 DVLOG(1) << "Mode: "
5792 << ((write_error_mode == SYNCHRONOUS) ? "SYNCHRONOUS" : "ASYNC");
Zhongyi Shi1a054612018-06-14 04:59:085793 InitializeConnectionMigrationV2Test(
jri9f303712016-09-13 01:10:225794 {kDefaultNetworkForTests, kNewNetworkForTests});
5795 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5796 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5797
5798 MockQuicData socket_data;
5799 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:435800 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
jri9f303712016-09-13 01:10:225801 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:175802 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:225803
5804 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:455805 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:335806 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035807 request.Request(
5808 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5809 SocketTag(),
5810 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5811 failed_on_default_network_callback_, callback_.callback()));
jri9f303712016-09-13 01:10:225812 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:245813 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9f303712016-09-13 01:10:225814 EXPECT_TRUE(stream.get());
5815
5816 // Cause QUIC stream to be created, but marked as non-migratable.
5817 HttpRequestInfo request_info;
Zhongyi Shibb28b1f2018-07-18 02:41:265818 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
jri9f303712016-09-13 01:10:225819 request_info.method = "GET";
5820 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:395821 request_info.traffic_annotation =
5822 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:275823 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:395824 net_log_, CompletionOnceCallback()));
jri9f303712016-09-13 01:10:225825
5826 // Ensure that session is alive and active.
5827 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5828 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5829 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5830
5831 // Send GET request on stream. This should cause a write error, which triggers
5832 // a connection migration attempt.
5833 HttpResponseInfo response;
5834 HttpRequestHeaders request_headers;
5835 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
5836 callback_.callback()));
5837
5838 // Run message loop to execute migration attempt.
5839 base::RunLoop().RunUntilIdle();
5840
5841 // Migration fails, and session is closed and deleted.
5842 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5843 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5844
5845 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5846 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5847}
5848
5849TEST_P(QuicStreamFactoryTest,
5850 MigrateSessionOnWriteErrorNonMigratableStreamSynchronous) {
5851 TestMigrationOnWriteErrorNonMigratableStream(SYNCHRONOUS);
5852}
5853
5854TEST_P(QuicStreamFactoryTest,
5855 MigrateSessionOnWriteErrorNonMigratableStreamAsync) {
5856 TestMigrationOnWriteErrorNonMigratableStream(ASYNC);
5857}
5858
5859void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorMigrationDisabled(
5860 IoMode write_error_mode) {
Zhongyi Shi1a054612018-06-14 04:59:085861 InitializeConnectionMigrationV2Test(
jri9f303712016-09-13 01:10:225862 {kDefaultNetworkForTests, kNewNetworkForTests});
5863 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5864 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5865
5866 MockQuicData socket_data;
5867 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:435868 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
jri9f303712016-09-13 01:10:225869 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:175870 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:225871
5872 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:455873 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:335874 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035875 request.Request(
5876 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5877 SocketTag(),
5878 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5879 failed_on_default_network_callback_, callback_.callback()));
jri9f303712016-09-13 01:10:225880 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:245881 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9f303712016-09-13 01:10:225882 EXPECT_TRUE(stream.get());
5883
5884 // Cause QUIC stream to be created.
5885 HttpRequestInfo request_info;
5886 request_info.method = "GET";
5887 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:395888 request_info.traffic_annotation =
5889 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:275890 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:395891 net_log_, CompletionOnceCallback()));
jri9f303712016-09-13 01:10:225892
5893 // Ensure that session is alive and active.
5894 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5895 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5896 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5897
5898 // Set session config to have connection migration disabled.
Ryan Hamilton8d9ee76e2018-05-29 23:52:525899 quic::test::QuicConfigPeer::SetReceivedDisableConnectionMigration(
5900 session->config());
jri9f303712016-09-13 01:10:225901 EXPECT_TRUE(session->config()->DisableConnectionMigration());
5902
5903 // Send GET request on stream. This should cause a write error, which triggers
5904 // a connection migration attempt.
5905 HttpResponseInfo response;
5906 HttpRequestHeaders request_headers;
5907 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
5908 callback_.callback()));
5909 // Run message loop to execute migration attempt.
5910 base::RunLoop().RunUntilIdle();
5911 // Migration fails, and session is closed and deleted.
5912 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5913 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5914 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5915 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5916}
5917
5918TEST_P(QuicStreamFactoryTest,
5919 MigrateSessionOnWriteErrorMigrationDisabledSynchronous) {
5920 TestMigrationOnWriteErrorMigrationDisabled(SYNCHRONOUS);
5921}
5922
5923TEST_P(QuicStreamFactoryTest,
5924 MigrateSessionOnWriteErrorMigrationDisabledAsync) {
5925 TestMigrationOnWriteErrorMigrationDisabled(ASYNC);
5926}
5927
Zhongyi Shi7f1d9212018-06-22 23:24:365928// Sets up a test which verifies that connection migration on write error can
5929// eventually succeed and rewrite the packet on the new network with singals
5930// delivered in the following order (alternate network is always availabe):
5931// - original network encounters a SYNC/ASYNC write error based on
5932// |write_error_mode_on_old_network|, the packet failed to be written is
5933// cached, session migrates immediately to the alternate network.
5934// - an immediate SYNC/ASYNC write error based on
5935// |write_error_mode_on_new_network| is encountered after migration to the
5936// alternate network, session migrates immediately to the original network.
5937// - an immediate SYNC/ASYNC write error based on
5938// |write_error_mode_on_old_network| is encountered after migration to the
5939// original network, session migrates immediately to the alternate network.
5940// - finally, session successfully sends the packet and reads the response on
5941// the alternate network.
5942// TODO(zhongyi): once https://crbug.com/855666 is fixed, this test should be
5943// modified to test that session is closed early if hopping between networks
5944// with consecutive write errors is detected.
jri9f303712016-09-13 01:10:225945void QuicStreamFactoryTestBase::TestMigrationOnMultipleWriteErrors(
Zhongyi Shi7f1d9212018-06-22 23:24:365946 IoMode write_error_mode_on_old_network,
5947 IoMode write_error_mode_on_new_network) {
5948 InitializeConnectionMigrationV2Test(
jri9f303712016-09-13 01:10:225949 {kDefaultNetworkForTests, kNewNetworkForTests});
5950 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5951 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5952 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5953
Zhongyi Shi7f1d9212018-06-22 23:24:365954 // Set up the socket data used by the original network, which encounters a
5955 // write erorr.
5956 MockQuicData socket_data1;
5957 quic::QuicStreamOffset header_stream_offset = 0;
5958 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5959 socket_data1.AddWrite(
5960 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
5961 socket_data1.AddWrite(write_error_mode_on_old_network,
5962 ERR_ADDRESS_UNREACHABLE); // Write Error
5963 socket_data1.AddSocketDataToFactory(socket_factory_.get());
5964
5965 // Set up the socket data used by the alternate network, which also
5966 // encounters a write error.
5967 MockQuicData failed_quic_data2;
5968 failed_quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5969 failed_quic_data2.AddWrite(write_error_mode_on_new_network, ERR_FAILED);
5970 failed_quic_data2.AddSocketDataToFactory(socket_factory_.get());
5971
5972 // Set up the third socket data used by original network, which encounters a
5973 // write error again.
5974 MockQuicData failed_quic_data1;
5975 failed_quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5976 failed_quic_data1.AddWrite(write_error_mode_on_old_network, ERR_FAILED);
5977 failed_quic_data1.AddSocketDataToFactory(socket_factory_.get());
5978
5979 // Set up the last socket data used by the alternate network, which will
5980 // finish migration successfully. The request is rewritten to this new socket,
5981 // and the response to the request is read on this socket.
5982 MockQuicData socket_data2;
5983 socket_data2.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
5984 2, GetNthClientInitiatedStreamId(0),
5985 true, true, &header_stream_offset));
5986 socket_data2.AddRead(
5987 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
5988 false, false));
5989 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5990 socket_data2.AddWrite(SYNCHRONOUS,
5991 client_maker_.MakeAckAndRstPacket(
5992 3, false, GetNthClientInitiatedStreamId(0),
5993 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
5994 socket_data2.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:225995
5996 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:455997 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:335998 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035999 request.Request(
6000 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6001 SocketTag(),
6002 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6003 failed_on_default_network_callback_, callback_.callback()));
jri9f303712016-09-13 01:10:226004 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:246005 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9f303712016-09-13 01:10:226006 EXPECT_TRUE(stream.get());
6007
6008 // Cause QUIC stream to be created.
6009 HttpRequestInfo request_info;
6010 request_info.method = "GET";
6011 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:396012 request_info.traffic_annotation =
6013 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:276014 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:396015 net_log_, CompletionOnceCallback()));
jri9f303712016-09-13 01:10:226016
6017 // Ensure that session is alive and active.
6018 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6019 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6020 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6021
Zhongyi Shi7f1d9212018-06-22 23:24:366022 // Send GET request on stream.
6023 // This should encounter a write error on network 1,
6024 // then migrate to network 2, which encounters another write error,
6025 // and migrate again to network 1, which encoutners one more write error.
6026 // Finally the session migrates to network 2 successfully.
jri9f303712016-09-13 01:10:226027 HttpResponseInfo response;
6028 HttpRequestHeaders request_headers;
6029 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6030 callback_.callback()));
jri9f303712016-09-13 01:10:226031
jri9f303712016-09-13 01:10:226032 base::RunLoop().RunUntilIdle();
Zhongyi Shi7f1d9212018-06-22 23:24:366033 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6034 EXPECT_EQ(1u, session->GetNumActiveStreams());
jri9f303712016-09-13 01:10:226035
Zhongyi Shi7f1d9212018-06-22 23:24:366036 // Verify that response headers on the migrated socket were delivered to the
6037 // stream.
6038 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
6039 EXPECT_EQ(200, response.headers->response_code());
jri9f303712016-09-13 01:10:226040
6041 stream.reset();
Zhongyi Shi7f1d9212018-06-22 23:24:366042 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6043 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
6044 EXPECT_TRUE(failed_quic_data2.AllReadDataConsumed());
6045 EXPECT_TRUE(failed_quic_data2.AllWriteDataConsumed());
6046 EXPECT_TRUE(failed_quic_data1.AllReadDataConsumed());
6047 EXPECT_TRUE(failed_quic_data1.AllWriteDataConsumed());
6048 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
6049 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri9f303712016-09-13 01:10:226050}
6051
6052TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsSyncSync) {
Zhongyi Shi7f1d9212018-06-22 23:24:366053 TestMigrationOnMultipleWriteErrors(
6054 /*write_error_mode_on_old_network*/ SYNCHRONOUS,
6055 /*write_error_mode_on_new_network*/ SYNCHRONOUS);
jri9f303712016-09-13 01:10:226056}
6057
6058TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsSyncAsync) {
Zhongyi Shi7f1d9212018-06-22 23:24:366059 TestMigrationOnMultipleWriteErrors(
6060 /*write_error_mode_on_old_network*/ SYNCHRONOUS,
6061 /*write_error_mode_on_new_network*/ ASYNC);
jri9f303712016-09-13 01:10:226062}
6063
6064TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsAsyncSync) {
Zhongyi Shi7f1d9212018-06-22 23:24:366065 TestMigrationOnMultipleWriteErrors(
6066 /*write_error_mode_on_old_network*/ ASYNC,
6067 /*write_error_mode_on_new_network*/ SYNCHRONOUS);
jri9f303712016-09-13 01:10:226068}
6069
6070TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsAsyncAsync) {
Zhongyi Shi7f1d9212018-06-22 23:24:366071 TestMigrationOnMultipleWriteErrors(
6072 /*write_error_mode_on_old_network*/ ASYNC,
6073 /*write_error_mode_on_new_network*/ ASYNC);
jri9f303712016-09-13 01:10:226074}
6075
Zhongyi Shi6abe33812018-07-24 19:43:116076// Verifies that a connection is closed when connection migration is triggered
6077// on network being disconnected and the handshake is not confirmed.
6078TEST_P(QuicStreamFactoryTest, NoMigrationBeforeHandshakeOnNetworkDisconnected) {
6079 InitializeConnectionMigrationV2Test(
6080 {kDefaultNetworkForTests, kNewNetworkForTests});
6081
Zhongyi Shi879659422018-08-02 17:58:256082 // Use cold start mode to do crypto connect, and send CHLO packet on wire.
Zhongyi Shi6abe33812018-07-24 19:43:116083 crypto_client_stream_factory_.set_handshake_mode(
Zhongyi Shi879659422018-08-02 17:58:256084 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
Zhongyi Shi6abe33812018-07-24 19:43:116085
Zhongyi Shi6abe33812018-07-24 19:43:116086 MockQuicData socket_data;
Zhongyi Shi879659422018-08-02 17:58:256087 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5068bb02018-08-03 02:44:096088 socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
Zhongyi Shi6abe33812018-07-24 19:43:116089 socket_data.AddSocketDataToFactory(socket_factory_.get());
6090
6091 // Create request and QuicHttpStream.
6092 QuicStreamRequest request(factory_.get());
6093 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036094 request.Request(
6095 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6096 SocketTag(),
6097 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6098 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi6abe33812018-07-24 19:43:116099 // Deliver the network notification, which should cause the connection to be
6100 // closed.
6101 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6102 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
6103 EXPECT_EQ(ERR_NETWORK_CHANGED, callback_.WaitForResult());
Zhongyi Shi4293b142018-07-25 00:33:576104
Zhongyi Shi6abe33812018-07-24 19:43:116105 EXPECT_FALSE(HasActiveSession(host_port_pair_));
6106 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
Zhongyi Shi4293b142018-07-25 00:33:576107 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6108 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
Zhongyi Shi6abe33812018-07-24 19:43:116109}
6110
Zhongyi Shib24001c02018-06-18 20:01:526111// Sets up the connection migration test where network change notification is
6112// queued BEFORE connection migration attempt on write error is posted.
6113void QuicStreamFactoryTestBase::
6114 TestMigrationOnNetworkNotificationWithWriteErrorQueuedLater(
6115 bool disconnected) {
6116 InitializeConnectionMigrationV2Test(
jried79618b2016-07-02 03:18:526117 {kDefaultNetworkForTests, kNewNetworkForTests});
6118 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6119 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6120 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6121
rcha00569732016-08-27 11:09:366122 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:526123 quic::QuicStreamOffset header_stream_offset = 0;
rcha00569732016-08-27 11:09:366124 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
rch5cb522462017-04-25 20:18:366125 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:436126 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
rcha00569732016-08-27 11:09:366127 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:176128 socket_data.AddSocketDataToFactory(socket_factory_.get());
jried79618b2016-07-02 03:18:526129
6130 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:456131 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:336132 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036133 request.Request(
6134 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6135 SocketTag(),
6136 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6137 failed_on_default_network_callback_, callback_.callback()));
jried79618b2016-07-02 03:18:526138 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:246139 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jried79618b2016-07-02 03:18:526140 EXPECT_TRUE(stream.get());
6141
6142 // Cause QUIC stream to be created.
6143 HttpRequestInfo request_info;
6144 request_info.method = "GET";
6145 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:396146 request_info.traffic_annotation =
6147 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:276148 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:396149 net_log_, CompletionOnceCallback()));
jried79618b2016-07-02 03:18:526150
6151 // Ensure that session is alive and active.
6152 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6153 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6154 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6155
6156 // Set up second socket data provider that is used after
6157 // migration. The request is rewritten to this new socket, and the
6158 // response to the request is read on this new socket.
rcha00569732016-08-27 11:09:366159 MockQuicData socket_data1;
Zhongyi Shi32f2fd02018-04-16 18:23:436160 socket_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
6161 2, GetNthClientInitiatedStreamId(0),
6162 true, true, &header_stream_offset));
6163 socket_data1.AddRead(
6164 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
6165 false, false));
rcha00569732016-08-27 11:09:366166 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:436167 socket_data1.AddWrite(SYNCHRONOUS,
6168 client_maker_.MakeAckAndRstPacket(
6169 3, false, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:526170 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:176171 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jried79618b2016-07-02 03:18:526172
jri9f303712016-09-13 01:10:226173 // First queue a network change notification in the message loop.
6174 if (disconnected) {
6175 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6176 ->QueueNetworkDisconnected(kDefaultNetworkForTests);
6177 } else {
6178 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6179 ->QueueNetworkMadeDefault(kNewNetworkForTests);
6180 }
6181 // Send GET request on stream. This should cause a write error,
6182 // which triggers a connection migration attempt. This will queue a
6183 // migration attempt behind the notification in the message loop.
jried79618b2016-07-02 03:18:526184 HttpResponseInfo response;
6185 HttpRequestHeaders request_headers;
6186 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6187 callback_.callback()));
6188
jried79618b2016-07-02 03:18:526189 base::RunLoop().RunUntilIdle();
Zhongyi Shia7dd46b2018-07-12 22:59:296190 // Verify the session is still alive and not marked as going away post
6191 // migration.
jried79618b2016-07-02 03:18:526192 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:296193 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jried79618b2016-07-02 03:18:526194 EXPECT_EQ(1u, session->GetNumActiveStreams());
6195
6196 // Verify that response headers on the migrated socket were delivered to the
6197 // stream.
6198 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
6199 EXPECT_EQ(200, response.headers->response_code());
6200
6201 stream.reset();
6202
6203 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6204 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6205 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6206 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
6207}
6208
Zhongyi Shib24001c02018-06-18 20:01:526209// This test verifies that session attempts connection migration successfully
6210// with signals delivered in the following order (alternate network is always
6211// available):
6212// - a notification that default network is disconnected is queued.
6213// - write error is triggered: session posts a task to attempt connection
6214// migration, |migration_pending_| set to true.
6215// - default network disconnected is delivered: session immediately migrates to
6216// the alternate network, |migration_pending_| set to false.
Zhongyi Shif3d6cddb2018-07-11 03:30:026217// - connection migration on write error attempt aborts: writer encountered
6218// error is no longer in active use.
jri9f303712016-09-13 01:10:226219TEST_P(QuicStreamFactoryTest,
Zhongyi Shib24001c02018-06-18 20:01:526220 MigrateOnNetworkDisconnectedWithWriteErrorQueuedLater) {
6221 TestMigrationOnNetworkNotificationWithWriteErrorQueuedLater(
6222 /*disconnected=*/true);
jri9f303712016-09-13 01:10:226223}
6224
Zhongyi Shib24001c02018-06-18 20:01:526225// This test verifies that session attempts connection migration successfully
6226// with signals delivered in the following order (alternate network is always
6227// available):
6228// - a notification that alternate network is made default is queued.
6229// - write error is triggered: session posts a task to attempt connection
6230// migration, block future migrations.
6231// - new default notification is delivered: migrate back timer spins and task is
6232// posted to migrate to the new default network.
6233// - connection migration on write error attempt proceeds successfully: session
6234// is
6235// marked as going away, future migrations unblocked.
6236// - migrate back to default network task executed: session is already on the
6237// default network, no-op.
jri9f303712016-09-13 01:10:226238TEST_P(QuicStreamFactoryTest,
Zhongyi Shib24001c02018-06-18 20:01:526239 MigrateOnWriteErrorWithNetworkMadeDefaultQueuedEarlier) {
6240 TestMigrationOnNetworkNotificationWithWriteErrorQueuedLater(
6241 /*disconnected=*/false);
jri9f303712016-09-13 01:10:226242}
6243
Zhongyi Shi1e2bc742018-06-16 02:06:076244// Sets up the connection migration test where network change notification is
6245// queued AFTER connection migration attempt on write error is posted.
6246void QuicStreamFactoryTestBase::
6247 TestMigrationOnWriteErrorWithNotificationQueuedLater(bool disconnected) {
Zhongyi Shi1a054612018-06-14 04:59:086248 InitializeConnectionMigrationV2Test(
jri9f303712016-09-13 01:10:226249 {kDefaultNetworkForTests, kNewNetworkForTests});
jried79618b2016-07-02 03:18:526250 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6251 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri9f303712016-09-13 01:10:226252 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jried79618b2016-07-02 03:18:526253
rcha00569732016-08-27 11:09:366254 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:526255 quic::QuicStreamOffset header_stream_offset = 0;
rcha00569732016-08-27 11:09:366256 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
rch5cb522462017-04-25 20:18:366257 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:436258 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
rcha00569732016-08-27 11:09:366259 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:176260 socket_data.AddSocketDataToFactory(socket_factory_.get());
jried79618b2016-07-02 03:18:526261
6262 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:456263 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:336264 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036265 request.Request(
6266 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6267 SocketTag(),
6268 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6269 failed_on_default_network_callback_, callback_.callback()));
jried79618b2016-07-02 03:18:526270 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:246271 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jried79618b2016-07-02 03:18:526272 EXPECT_TRUE(stream.get());
6273
6274 // Cause QUIC stream to be created.
6275 HttpRequestInfo request_info;
6276 request_info.method = "GET";
6277 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:396278 request_info.traffic_annotation =
6279 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:276280 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:396281 net_log_, CompletionOnceCallback()));
jried79618b2016-07-02 03:18:526282
6283 // Ensure that session is alive and active.
6284 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6285 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6286 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6287
jri9f303712016-09-13 01:10:226288 // Set up second socket data provider that is used after
6289 // migration. The request is rewritten to this new socket, and the
6290 // response to the request is read on this new socket.
6291 MockQuicData socket_data1;
Zhongyi Shi32f2fd02018-04-16 18:23:436292 socket_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
6293 2, GetNthClientInitiatedStreamId(0),
6294 true, true, &header_stream_offset));
6295 socket_data1.AddRead(
6296 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
6297 false, false));
jri9f303712016-09-13 01:10:226298 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:436299 socket_data1.AddWrite(SYNCHRONOUS,
6300 client_maker_.MakeAckAndRstPacket(
6301 3, false, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:526302 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:176303 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:226304
6305 // Send GET request on stream. This should cause a write error,
6306 // which triggers a connection migration attempt. This will queue a
6307 // migration attempt in the message loop.
jried79618b2016-07-02 03:18:526308 HttpResponseInfo response;
6309 HttpRequestHeaders request_headers;
jri9f303712016-09-13 01:10:226310 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6311 callback_.callback()));
jried79618b2016-07-02 03:18:526312
jri9f303712016-09-13 01:10:226313 // Now queue a network change notification in the message loop behind
6314 // the migration attempt.
6315 if (disconnected) {
6316 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6317 ->QueueNetworkDisconnected(kDefaultNetworkForTests);
6318 } else {
6319 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6320 ->QueueNetworkMadeDefault(kNewNetworkForTests);
6321 }
6322
6323 base::RunLoop().RunUntilIdle();
Zhongyi Shia7dd46b2018-07-12 22:59:296324 // Verify session is still alive and not marked as going away.
jri9f303712016-09-13 01:10:226325 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:296326 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri9f303712016-09-13 01:10:226327 EXPECT_EQ(1u, session->GetNumActiveStreams());
6328
6329 // Verify that response headers on the migrated socket were delivered to the
6330 // stream.
6331 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
6332 EXPECT_EQ(200, response.headers->response_code());
6333
6334 stream.reset();
jried79618b2016-07-02 03:18:526335
6336 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6337 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
jri9f303712016-09-13 01:10:226338 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6339 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
jried79618b2016-07-02 03:18:526340}
6341
Zhongyi Shi1e2bc742018-06-16 02:06:076342// This test verifies that session attempts connection migration successfully
6343// with signals delivered in the following order (alternate network is always
6344// available):
6345// - write error is triggered: session posts a task to complete connection
6346// migration.
6347// - a notification that alternate network is made default is queued.
6348// - connection migration attempt proceeds successfully, session is marked as
6349// going away.
6350// - new default notification is delivered after connection migration has been
6351// completed.
jri9f303712016-09-13 01:10:226352TEST_P(QuicStreamFactoryTest,
Zhongyi Shi1e2bc742018-06-16 02:06:076353 MigrateOnWriteErrorWithNetworkMadeDefaultQueuedLater) {
6354 TestMigrationOnWriteErrorWithNotificationQueuedLater(/*disconnected=*/false);
jried79618b2016-07-02 03:18:526355}
6356
Zhongyi Shi1e2bc742018-06-16 02:06:076357// This test verifies that session attempts connection migration successfully
6358// with signals delivered in the following order (alternate network is always
6359// available):
6360// - write error is triggered: session posts a task to complete connection
6361// migration.
6362// - a notification that default network is diconnected is queued.
6363// - connection migration attempt proceeds successfully, session is marked as
6364// going away.
6365// - disconnect notification is delivered after connection migration has been
6366// completed.
jri9f303712016-09-13 01:10:226367TEST_P(QuicStreamFactoryTest,
Zhongyi Shi1e2bc742018-06-16 02:06:076368 MigrateOnWriteErrorWithNetworkDisconnectedQueuedLater) {
6369 TestMigrationOnWriteErrorWithNotificationQueuedLater(/*disconnected=*/true);
jried79618b2016-07-02 03:18:526370}
6371
Zhongyi Shia3810c52018-06-15 23:07:196372// This tests connection migration on write error with signals delivered in the
6373// following order:
6374// - a synchronous/asynchronous write error is triggered base on
Zhongyi Shif3d6cddb2018-07-11 03:30:026375// |write_error_mode|: connection migration attempt is posted.
6376// - old default network disconnects, migration waits for a new network.
Zhongyi Shia3810c52018-06-15 23:07:196377// - after a pause, new network is connected: session will migrate to new
6378// network immediately.
Zhongyi Shif3d6cddb2018-07-11 03:30:026379// - migration on writer error is exectued and aborts as writer passed in is no
6380// longer active in use.
Zhongyi Shia3810c52018-06-15 23:07:196381// - new network is made default.
jri5b785512016-09-13 04:29:116382void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorPauseBeforeConnected(
6383 IoMode write_error_mode) {
Zhongyi Shia3810c52018-06-15 23:07:196384 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jri5b785512016-09-13 04:29:116385 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6386 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6387 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6388
Zhongyi Shia3810c52018-06-15 23:07:196389 // Use the test task runner.
6390 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
6391
jri5b785512016-09-13 04:29:116392 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:526393 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shia3810c52018-06-15 23:07:196394 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
rch5cb522462017-04-25 20:18:366395 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:436396 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
Zhongyi Shia3810c52018-06-15 23:07:196397 socket_data.AddWrite(write_error_mode, ERR_FAILED);
Zhongyi Shi5f587cc2017-11-21 23:24:176398 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri5b785512016-09-13 04:29:116399
6400 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:456401 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:336402 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036403 request.Request(
6404 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6405 SocketTag(),
6406 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6407 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shia3810c52018-06-15 23:07:196408 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:246409 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri5b785512016-09-13 04:29:116410 EXPECT_TRUE(stream.get());
6411
6412 // Cause QUIC stream to be created.
6413 HttpRequestInfo request_info;
6414 request_info.method = "GET";
Zhongyi Shia3810c52018-06-15 23:07:196415 request_info.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:396416 request_info.traffic_annotation =
6417 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:276418 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:396419 net_log_, CompletionOnceCallback()));
jri5b785512016-09-13 04:29:116420
6421 // Ensure that session is alive and active.
6422 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6423 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6424 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6425
Zhongyi Shia3810c52018-06-15 23:07:196426 // Send GET request on stream.
jri5b785512016-09-13 04:29:116427 HttpResponseInfo response;
6428 HttpRequestHeaders request_headers;
6429 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6430 callback_.callback()));
6431
Zhongyi Shia3810c52018-06-15 23:07:196432 // The connection should still be alive, not marked as going away.
jri5b785512016-09-13 04:29:116433 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6434 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6435 EXPECT_EQ(1u, session->GetNumActiveStreams());
6436 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
6437
Zhongyi Shia3810c52018-06-15 23:07:196438 // Set up second socket data provider that is used after migration.
6439 // The response to the earlier request is read on this new socket.
jri5b785512016-09-13 04:29:116440 MockQuicData socket_data1;
Zhongyi Shi32f2fd02018-04-16 18:23:436441 socket_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
6442 2, GetNthClientInitiatedStreamId(0),
6443 true, true, &header_stream_offset));
6444 socket_data1.AddRead(
6445 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
6446 false, false));
jri5b785512016-09-13 04:29:116447 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:436448 socket_data1.AddWrite(SYNCHRONOUS,
6449 client_maker_.MakeAckAndRstPacket(
6450 3, false, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:526451 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:176452 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri5b785512016-09-13 04:29:116453
Zhongyi Shia3810c52018-06-15 23:07:196454 // On a DISCONNECTED notification, nothing happens.
6455 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6456 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
6457 // Add a new network and notify the stream factory of a new connected network.
6458 // This causes a PING packet to be sent over the new network.
jri5b785512016-09-13 04:29:116459 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6460 ->SetConnectedNetworksList({kNewNetworkForTests});
6461 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6462 ->NotifyNetworkConnected(kNewNetworkForTests);
6463
Zhongyi Shia3810c52018-06-15 23:07:196464 // Ensure that the session is still alive.
jri5b785512016-09-13 04:29:116465 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia3810c52018-06-15 23:07:196466 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:116467 EXPECT_EQ(1u, session->GetNumActiveStreams());
6468
Zhongyi Shia3810c52018-06-15 23:07:196469 // Run the message loop migration for write error can finish.
6470 runner_->RunUntilIdle();
6471
6472 // Response headers are received over the new network.
jri5b785512016-09-13 04:29:116473 EXPECT_THAT(callback_.WaitForResult(), IsOk());
6474 EXPECT_EQ(200, response.headers->response_code());
6475
Zhongyi Shia3810c52018-06-15 23:07:196476 // Check that the session is still alive.
6477 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
jri5b785512016-09-13 04:29:116478 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shia3810c52018-06-15 23:07:196479
6480 // There should be no posted tasks not executed, no way to migrate back to
6481 // default network.
6482 EXPECT_TRUE(runner_->GetPostedTasks().empty());
6483
6484 // Receive signal to mark new network as default.
6485 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6486 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
jri5b785512016-09-13 04:29:116487
6488 stream.reset();
jri5b785512016-09-13 04:29:116489 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6490 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6491 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6492 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
jri5b785512016-09-13 04:29:116493}
6494
6495TEST_P(QuicStreamFactoryTest,
Zhongyi Shia3810c52018-06-15 23:07:196496 MigrateSessionOnSyncWriteErrorPauseBeforeConnected) {
jri5b785512016-09-13 04:29:116497 TestMigrationOnWriteErrorPauseBeforeConnected(SYNCHRONOUS);
6498}
6499
6500TEST_P(QuicStreamFactoryTest,
Zhongyi Shia3810c52018-06-15 23:07:196501 MigrateSessionOnAsyncWriteErrorPauseBeforeConnected) {
jri5b785512016-09-13 04:29:116502 TestMigrationOnWriteErrorPauseBeforeConnected(ASYNC);
6503}
6504
Zhongyi Shif3d6cddb2018-07-11 03:30:026505// This test verifies that when session successfully migrate to the alternate
6506// network, packet write error on the old writer will be ignored and will not
6507// trigger connection migration on write error.
6508TEST_P(QuicStreamFactoryTest, IgnoreWriteErrorFromOldWriterAfterMigration) {
6509 InitializeConnectionMigrationV2Test(
6510 {kDefaultNetworkForTests, kNewNetworkForTests});
6511 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6512 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6513 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6514
6515 // Using a testing task runner so that we can verify whether the migrate on
6516 // write error task is posted.
6517 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
6518 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
6519
6520 MockQuicData socket_data;
6521 quic::QuicStreamOffset header_stream_offset = 0;
6522 socket_data.AddWrite(
6523 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
6524 socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
6525 socket_data.AddWrite(ASYNC, ERR_ADDRESS_UNREACHABLE);
6526 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
6527 socket_data.AddSocketDataToFactory(socket_factory_.get());
6528
6529 // Create request and QuicHttpStream.
6530 QuicStreamRequest request(factory_.get());
6531 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036532 request.Request(
6533 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6534 SocketTag(),
6535 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6536 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shif3d6cddb2018-07-11 03:30:026537 EXPECT_EQ(OK, callback_.WaitForResult());
6538 std::unique_ptr<HttpStream> stream = CreateStream(&request);
6539 EXPECT_TRUE(stream.get());
6540
6541 // Cause QUIC stream to be created.
6542 HttpRequestInfo request_info;
6543 request_info.method = "GET";
6544 request_info.url = GURL("https://www.example.org/");
6545 request_info.traffic_annotation =
6546 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
6547 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
6548 net_log_, CompletionOnceCallback()));
6549
6550 // Ensure that session is alive and active.
6551 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6552 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6553 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6554
6555 // Set up second socket data provider that is used after
6556 // migration. The response to the request is read on this new socket.
6557 MockQuicData socket_data1;
6558 socket_data1.AddWrite(
6559 SYNCHRONOUS, client_maker_.MakePingPacket(3, /*include_version=*/true));
6560 socket_data1.AddRead(
6561 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
6562 false, false));
6563 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
6564 socket_data1.AddWrite(SYNCHRONOUS,
6565 client_maker_.MakeAckAndRstPacket(
6566 4, false, GetNthClientInitiatedStreamId(0),
6567 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
6568 socket_data1.AddSocketDataToFactory(socket_factory_.get());
6569
6570 // Send GET request on stream.
6571 HttpResponseInfo response;
6572 HttpRequestHeaders request_headers;
6573 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6574 callback_.callback()));
6575
6576 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
6577 // Now notify network is disconnected, cause the migration to complete
6578 // immediately.
6579 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6580 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
6581 // There will be two pending task, one will complete migration with no delay
6582 // and the other will attempt to migrate back to the default network with
6583 // delay.
6584 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
6585
6586 // Complete migration.
6587 task_runner->RunUntilIdle();
6588 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
6589
6590 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6591 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6592 EXPECT_EQ(1u, session->GetNumActiveStreams());
6593
6594 // Verify that response headers on the migrated socket were delivered to the
6595 // stream.
6596 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
6597 EXPECT_EQ(200, response.headers->response_code());
6598
6599 // Resume the old socket data, a write error will be delivered to the old
6600 // packet writer. Verify no additional task is posted.
6601 socket_data.Resume();
6602 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
6603
6604 stream.reset();
6605 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6606 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6607 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
6608}
6609
6610// This test verifies that when session successfully migrate to the alternate
6611// network, packet read error on the old reader will be ignored and will not
6612// close the connection.
6613TEST_P(QuicStreamFactoryTest, IgnoreReadErrorFromOldReaderAfterMigration) {
6614 InitializeConnectionMigrationV2Test(
6615 {kDefaultNetworkForTests, kNewNetworkForTests});
6616 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6617 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6618 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6619
6620 // Using a testing task runner.
6621 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
6622 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
6623
6624 MockQuicData socket_data;
6625 quic::QuicStreamOffset header_stream_offset = 0;
6626 socket_data.AddWrite(
6627 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
6628 socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
6629 socket_data.AddRead(ASYNC, ERR_ADDRESS_UNREACHABLE);
6630 socket_data.AddSocketDataToFactory(socket_factory_.get());
6631
6632 // Create request and QuicHttpStream.
6633 QuicStreamRequest request(factory_.get());
6634 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036635 request.Request(
6636 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6637 SocketTag(),
6638 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6639 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shif3d6cddb2018-07-11 03:30:026640 EXPECT_EQ(OK, callback_.WaitForResult());
6641 std::unique_ptr<HttpStream> stream = CreateStream(&request);
6642 EXPECT_TRUE(stream.get());
6643
6644 // Cause QUIC stream to be created.
6645 HttpRequestInfo request_info;
6646 request_info.method = "GET";
6647 request_info.url = GURL("https://www.example.org/");
6648 request_info.traffic_annotation =
6649 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
6650 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
6651 net_log_, CompletionOnceCallback()));
6652
6653 // Ensure that session is alive and active.
6654 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6655 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6656 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6657
6658 // Set up second socket data provider that is used after
6659 // migration. The request is written to this new socket, and the
6660 // response to the request is read on this new socket.
6661 MockQuicData socket_data1;
6662 socket_data1.AddWrite(
6663 SYNCHRONOUS, client_maker_.MakePingPacket(2, /*include_version=*/true));
6664 socket_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
6665 3, GetNthClientInitiatedStreamId(0),
6666 true, true, &header_stream_offset));
6667 socket_data1.AddRead(
6668 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
6669 false, false));
6670 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
6671 socket_data1.AddWrite(SYNCHRONOUS,
6672 client_maker_.MakeAckAndRstPacket(
6673 4, false, GetNthClientInitiatedStreamId(0),
6674 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
6675 socket_data1.AddSocketDataToFactory(socket_factory_.get());
6676
6677 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
6678 // Now notify network is disconnected, cause the migration to complete
6679 // immediately.
6680 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6681 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
6682 // There will be two pending task, one will complete migration with no delay
6683 // and the other will attempt to migrate back to the default network with
6684 // delay.
6685 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
6686
6687 // Complete migration.
6688 task_runner->RunUntilIdle();
6689 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
6690
6691 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6692 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6693 EXPECT_EQ(1u, session->GetNumActiveStreams());
6694
6695 // Send GET request on stream.
6696 HttpResponseInfo response;
6697 HttpRequestHeaders request_headers;
6698 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6699 callback_.callback()));
6700
6701 // Verify that response headers on the migrated socket were delivered to the
6702 // stream.
6703 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
6704 EXPECT_EQ(OK, callback_.WaitForResult());
6705 EXPECT_EQ(200, response.headers->response_code());
6706
6707 // Resume the old socket data, a read error will be delivered to the old
6708 // packet reader. Verify that the session is not affected.
6709 socket_data.Resume();
6710 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
6711 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6712 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6713 EXPECT_EQ(1u, session->GetNumActiveStreams());
6714
6715 stream.reset();
6716 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6717 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6718 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6719 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
6720}
6721
6722// This test verifies that after migration on network is executed, packet
6723// read error on the old reader will be ignored and will not close the
6724// connection.
6725TEST_P(QuicStreamFactoryTest, IgnoreReadErrorOnOldReaderDuringMigration) {
6726 InitializeConnectionMigrationV2Test(
6727 {kDefaultNetworkForTests, kNewNetworkForTests});
6728 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6729 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6730 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6731
6732 // Using a testing task runner.
6733 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
6734 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
6735
6736 MockQuicData socket_data;
6737 quic::QuicStreamOffset header_stream_offset = 0;
6738 socket_data.AddWrite(
6739 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
6740 socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
6741 socket_data.AddRead(ASYNC, ERR_ADDRESS_UNREACHABLE);
6742 socket_data.AddSocketDataToFactory(socket_factory_.get());
6743
6744 // Create request and QuicHttpStream.
6745 QuicStreamRequest request(factory_.get());
6746 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036747 request.Request(
6748 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6749 SocketTag(),
6750 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6751 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shif3d6cddb2018-07-11 03:30:026752 EXPECT_EQ(OK, callback_.WaitForResult());
6753 std::unique_ptr<HttpStream> stream = CreateStream(&request);
6754 EXPECT_TRUE(stream.get());
6755
6756 // Cause QUIC stream to be created.
6757 HttpRequestInfo request_info;
6758 request_info.method = "GET";
6759 request_info.url = GURL("https://www.example.org/");
6760 request_info.traffic_annotation =
6761 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
6762 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
6763 net_log_, CompletionOnceCallback()));
6764
6765 // Ensure that session is alive and active.
6766 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6767 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6768 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6769
6770 // Set up second socket data provider that is used after
6771 // migration. The request is written to this new socket, and the
6772 // response to the request is read on this new socket.
6773 MockQuicData socket_data1;
6774 socket_data1.AddWrite(
6775 SYNCHRONOUS, client_maker_.MakePingPacket(2, /*include_version=*/true));
6776 socket_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
6777 3, GetNthClientInitiatedStreamId(0),
6778 true, true, &header_stream_offset));
6779 socket_data1.AddRead(
6780 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
6781 false, false));
6782 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
6783 socket_data1.AddWrite(SYNCHRONOUS,
6784 client_maker_.MakeAckAndRstPacket(
6785 4, false, GetNthClientInitiatedStreamId(0),
6786 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
6787 socket_data1.AddSocketDataToFactory(socket_factory_.get());
6788
6789 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
6790 // Now notify network is disconnected, cause the migration to complete
6791 // immediately.
6792 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6793 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
6794 // There will be two pending task, one will complete migration with no delay
6795 // and the other will attempt to migrate back to the default network with
6796 // delay.
6797 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
6798
6799 // Resume the old socket data, a read error will be delivered to the old
6800 // packet reader. Verify that the session is not affected.
6801 socket_data.Resume();
6802 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
6803 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6804 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6805 EXPECT_EQ(1u, session->GetNumActiveStreams());
6806
6807 // Complete migration.
6808 task_runner->RunUntilIdle();
6809 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
6810
6811 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6812 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6813 EXPECT_EQ(1u, session->GetNumActiveStreams());
6814
6815 // Send GET request on stream.
6816 HttpResponseInfo response;
6817 HttpRequestHeaders request_headers;
6818 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6819 callback_.callback()));
6820
6821 // Verify that response headers on the migrated socket were delivered to the
6822 // stream.
6823 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
6824 EXPECT_EQ(OK, callback_.WaitForResult());
6825 EXPECT_EQ(200, response.headers->response_code());
6826
6827 stream.reset();
6828 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6829 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6830 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6831 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
6832}
6833
6834// This test verifies that after migration on write error is posted, packet
6835// read error on the old reader will be ignored and will not close the
6836// connection.
6837TEST_P(QuicStreamFactoryTest,
6838 IgnoreReadErrorOnOldReaderDuringPendingMigrationOnWriteError) {
6839 InitializeConnectionMigrationV2Test(
6840 {kDefaultNetworkForTests, kNewNetworkForTests});
6841 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6842 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6843 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6844
6845 // Using a testing task runner.
6846 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
6847 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
6848
6849 MockQuicData socket_data;
6850 quic::QuicStreamOffset header_stream_offset = 0;
6851 socket_data.AddWrite(
6852 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
6853 socket_data.AddWrite(ASYNC, ERR_FAILED); // Write error.
6854 socket_data.AddRead(ASYNC, ERR_ADDRESS_UNREACHABLE); // Read error.
6855 socket_data.AddSocketDataToFactory(socket_factory_.get());
6856
6857 // Create request and QuicHttpStream.
6858 QuicStreamRequest request(factory_.get());
6859 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036860 request.Request(
6861 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6862 SocketTag(),
6863 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6864 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shif3d6cddb2018-07-11 03:30:026865 EXPECT_EQ(OK, callback_.WaitForResult());
6866 std::unique_ptr<HttpStream> stream = CreateStream(&request);
6867 EXPECT_TRUE(stream.get());
6868
6869 // Cause QUIC stream to be created.
6870 HttpRequestInfo request_info;
6871 request_info.method = "GET";
6872 request_info.url = GURL("https://www.example.org/");
6873 request_info.traffic_annotation =
6874 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
6875 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
6876 net_log_, CompletionOnceCallback()));
6877
6878 // Ensure that session is alive and active.
6879 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6880 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6881 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6882
6883 // Set up second socket data provider that is used after
6884 // migration. The request is written to this new socket, and the
6885 // response to the request is read on this new socket.
6886 MockQuicData socket_data1;
6887 socket_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
6888 2, GetNthClientInitiatedStreamId(0),
6889 true, true, &header_stream_offset));
6890 socket_data1.AddRead(
6891 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
6892 false, false));
6893
6894 socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
6895 socket_data1.AddRead(ASYNC, ERR_FAILED); // Read error to close connection.
6896 socket_data1.AddSocketDataToFactory(socket_factory_.get());
6897
6898 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
6899 // Send GET request on stream.
6900 HttpResponseInfo response;
6901 HttpRequestHeaders request_headers;
6902 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6903 callback_.callback()));
6904 // Run the message loop to complete asynchronous write and read with errors.
6905 base::RunLoop().RunUntilIdle();
6906 // There will be one pending task to complete migration on write error.
6907 // Verify session is not closed with read error.
6908 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
6909 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6910 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6911 EXPECT_EQ(1u, session->GetNumActiveStreams());
6912
6913 // Complete migration.
6914 task_runner->RunUntilIdle();
Zhongyi Shia7dd46b2018-07-12 22:59:296915 // There will be one more task posted attempting to migrate back to the
6916 // default network.
6917 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
Zhongyi Shif3d6cddb2018-07-11 03:30:026918 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:296919 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shif3d6cddb2018-07-11 03:30:026920 EXPECT_EQ(1u, session->GetNumActiveStreams());
6921
6922 // Verify that response headers on the migrated socket were delivered to the
6923 // stream.
6924 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
6925 EXPECT_EQ(200, response.headers->response_code());
6926
6927 // Resume to consume the read error on new socket, which will close
6928 // the connection.
6929 socket_data1.Resume();
6930
6931 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6932 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6933 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6934 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
6935}
6936
Zhongyi Shi4ac9e1f2018-06-21 05:21:476937// Migrate on asynchronous write error, old network disconnects after alternate
6938// network connects.
6939TEST_P(QuicStreamFactoryTest,
6940 MigrateSessionOnWriteErrorWithDisconnectAfterConnectAysnc) {
6941 TestMigrationOnWriteErrorWithMultipleNotifications(
6942 ASYNC, /*disconnect_before_connect*/ false);
6943}
6944
6945// Migrate on synchronous write error, old network disconnects after alternate
6946// network connects.
6947TEST_P(QuicStreamFactoryTest,
6948 MigrateSessionOnWriteErrorWithDisconnectAfterConnectSync) {
6949 TestMigrationOnWriteErrorWithMultipleNotifications(
6950 SYNCHRONOUS, /*disconnect_before_connect*/ false);
6951}
6952
6953// Migrate on asynchronous write error, old network disconnects before alternate
6954// network connects.
6955TEST_P(QuicStreamFactoryTest,
6956 MigrateSessionOnWriteErrorWithDisconnectBeforeConnectAysnc) {
6957 TestMigrationOnWriteErrorWithMultipleNotifications(
6958 ASYNC, /*disconnect_before_connect*/ true);
6959}
6960
6961// Migrate on synchronous write error, old network disconnects before alternate
6962// network connects.
6963TEST_P(QuicStreamFactoryTest,
6964 MigrateSessionOnWriteErrorWithDisconnectBeforeConnectSync) {
6965 TestMigrationOnWriteErrorWithMultipleNotifications(
6966 SYNCHRONOUS, /*disconnect_before_connect*/ true);
6967}
6968
6969// Setps up test which verifies that session successfully migrate to alternate
6970// network with signals delivered in the following order:
6971// *NOTE* Signal (A) and (B) can reverse order based on
6972// |disconnect_before_connect|.
6973// - (No alternate network is connected) session connects to
6974// kDefaultNetworkForTests.
6975// - An async/sync write error is encountered based on |write_error_mode|:
6976// session posted task to migrate session on write error.
6977// - Posted task is executed, miration moves to pending state due to lack of
6978// alternate network.
6979// - (A) An alternate network is connected, pending migration completes.
6980// - (B) Old default network disconnects, no migration will be attempted as
Zhongyi Shi329f5cbd2018-06-22 23:51:186981// session has already migrate to the alternate network.
Zhongyi Shi4ac9e1f2018-06-21 05:21:476982// - The alternate network is made default.
jri5b785512016-09-13 04:29:116983void QuicStreamFactoryTestBase::
Zhongyi Shi4ac9e1f2018-06-21 05:21:476984 TestMigrationOnWriteErrorWithMultipleNotifications(
jri5b785512016-09-13 04:29:116985 IoMode write_error_mode,
Zhongyi Shi4ac9e1f2018-06-21 05:21:476986 bool disconnect_before_connect) {
Zhongyi Shi329f5cbd2018-06-22 23:51:186987 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jri5b785512016-09-13 04:29:116988 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6989 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6990 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6991
6992 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:526993 quic::QuicStreamOffset header_stream_offset = 0;
jri5b785512016-09-13 04:29:116994 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
rch5cb522462017-04-25 20:18:366995 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:436996 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
Zhongyi Shi4ac9e1f2018-06-21 05:21:476997 socket_data.AddWrite(write_error_mode, ERR_FAILED); // Write error.
Zhongyi Shi5f587cc2017-11-21 23:24:176998 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri5b785512016-09-13 04:29:116999
7000 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:457001 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337002 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037003 request.Request(
7004 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7005 SocketTag(),
7006 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7007 failed_on_default_network_callback_, callback_.callback()));
jri5b785512016-09-13 04:29:117008 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:247009 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri5b785512016-09-13 04:29:117010 EXPECT_TRUE(stream.get());
7011
7012 // Cause QUIC stream to be created.
7013 HttpRequestInfo request_info;
7014 request_info.method = "GET";
7015 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:397016 request_info.traffic_annotation =
7017 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:277018 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:397019 net_log_, CompletionOnceCallback()));
jri5b785512016-09-13 04:29:117020
7021 // Ensure that session is alive and active.
7022 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
7023 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7024 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7025
7026 // Send GET request on stream. This should cause a write error, which triggers
7027 // a connection migration attempt.
7028 HttpResponseInfo response;
7029 HttpRequestHeaders request_headers;
7030 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
7031 callback_.callback()));
Zhongyi Shi4ac9e1f2018-06-21 05:21:477032 // Run the message loop so that posted task to migrate to socket will be
7033 // executed. A new task will be posted to wait for a new network.
jri5b785512016-09-13 04:29:117034 base::RunLoop().RunUntilIdle();
7035
7036 // In this particular code path, the network will not yet be marked
7037 // as going away and the session will still be alive.
7038 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7039 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7040 EXPECT_EQ(1u, session->GetNumActiveStreams());
7041 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
7042
7043 // Set up second socket data provider that is used after
7044 // migration. The request is rewritten to this new socket, and the
7045 // response to the request is read on this new socket.
7046 MockQuicData socket_data1;
Zhongyi Shi32f2fd02018-04-16 18:23:437047 socket_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
7048 2, GetNthClientInitiatedStreamId(0),
7049 true, true, &header_stream_offset));
7050 socket_data1.AddRead(
7051 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
7052 false, false));
jri5b785512016-09-13 04:29:117053 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437054 socket_data1.AddWrite(SYNCHRONOUS,
7055 client_maker_.MakeAckAndRstPacket(
7056 3, false, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:527057 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:177058 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri5b785512016-09-13 04:29:117059
7060 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7061 ->SetConnectedNetworksList(
7062 {kDefaultNetworkForTests, kNewNetworkForTests});
Zhongyi Shi4ac9e1f2018-06-21 05:21:477063 if (disconnect_before_connect) {
7064 // Now deliver a DISCONNECT notification.
jri5b785512016-09-13 04:29:117065 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7066 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
Zhongyi Shi4ac9e1f2018-06-21 05:21:477067
7068 // Now deliver a CONNECTED notification and completes migration.
jri5b785512016-09-13 04:29:117069 scoped_mock_network_change_notifier_->mock_network_change_notifier()
Zhongyi Shi4ac9e1f2018-06-21 05:21:477070 ->NotifyNetworkConnected(kNewNetworkForTests);
7071 } else {
7072 // Now deliver a CONNECTED notification and completes migration.
7073 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7074 ->NotifyNetworkConnected(kNewNetworkForTests);
7075
7076 // Now deliver a DISCONNECT notification.
7077 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7078 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
jri5b785512016-09-13 04:29:117079 }
jri5b785512016-09-13 04:29:117080 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shi329f5cbd2018-06-22 23:51:187081 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:117082 EXPECT_EQ(1u, session->GetNumActiveStreams());
7083
7084 // This is the callback for the response headers that returned
7085 // pending previously, because no result was available. Check that
7086 // the result is now available due to the successful migration.
7087 EXPECT_THAT(callback_.WaitForResult(), IsOk());
7088 EXPECT_EQ(200, response.headers->response_code());
7089
Zhongyi Shi4ac9e1f2018-06-21 05:21:477090 // Deliver a MADEDEFAULT notification.
jri5b785512016-09-13 04:29:117091 scoped_mock_network_change_notifier_->mock_network_change_notifier()
Zhongyi Shi4ac9e1f2018-06-21 05:21:477092 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
jri5b785512016-09-13 04:29:117093
zhongyi98d6a9262017-05-19 02:47:457094 QuicStreamRequest request2(factory_.get());
Zhongyi Shi329f5cbd2018-06-22 23:51:187095 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
7096 DEFAULT_PRIORITY, SocketTag(),
7097 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:037098 &net_error_details_,
7099 failed_on_default_network_callback_,
7100 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:247101 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
jri5b785512016-09-13 04:29:117102 EXPECT_TRUE(stream2.get());
7103
7104 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi329f5cbd2018-06-22 23:51:187105 EXPECT_EQ(session, GetActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:117106
7107 stream.reset();
7108 stream2.reset();
7109
7110 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7111 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7112 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
7113 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
jri5b785512016-09-13 04:29:117114}
7115
jri217455a12016-07-13 20:15:097116TEST_P(QuicStreamFactoryTest, ServerMigration) {
7117 allow_server_migration_ = true;
7118 Initialize();
7119
7120 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7121 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7122 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7123
rcha00569732016-08-27 11:09:367124 MockQuicData socket_data1;
Ryan Hamilton8d9ee76e2018-05-29 23:52:527125 quic::QuicStreamOffset header_stream_offset = 0;
rcha00569732016-08-27 11:09:367126 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
rch5cb522462017-04-25 20:18:367127 socket_data1.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:437128 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
7129 socket_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
7130 2, GetNthClientInitiatedStreamId(0),
7131 true, true, &header_stream_offset));
Zhongyi Shi5f587cc2017-11-21 23:24:177132 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri217455a12016-07-13 20:15:097133
7134 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:457135 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337136 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037137 request.Request(
7138 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7139 SocketTag(),
7140 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7141 failed_on_default_network_callback_, callback_.callback()));
jri217455a12016-07-13 20:15:097142 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:247143 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri217455a12016-07-13 20:15:097144 EXPECT_TRUE(stream.get());
7145
7146 // Cause QUIC stream to be created.
7147 HttpRequestInfo request_info;
7148 request_info.method = "GET";
7149 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:397150 request_info.traffic_annotation =
7151 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:277152 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:397153 net_log_, CompletionOnceCallback()));
jri217455a12016-07-13 20:15:097154
7155 // Ensure that session is alive and active.
7156 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
7157 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7158 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7159
7160 // Send GET request on stream.
7161 HttpResponseInfo response;
7162 HttpRequestHeaders request_headers;
7163 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
7164 callback_.callback()));
7165
7166 IPEndPoint ip;
7167 session->GetDefaultSocket()->GetPeerAddress(&ip);
7168 DVLOG(1) << "Socket connected to: " << ip.address().ToString() << " "
7169 << ip.port();
7170
7171 // Set up second socket data provider that is used after
7172 // migration. The request is rewritten to this new socket, and the
7173 // response to the request is read on this new socket.
rcha00569732016-08-27 11:09:367174 MockQuicData socket_data2;
7175 socket_data2.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:437176 SYNCHRONOUS, client_maker_.MakePingPacket(3, /*include_version=*/true));
7177 socket_data2.AddRead(
7178 ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
7179 false, false));
rcha00569732016-08-27 11:09:367180 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437181 socket_data2.AddWrite(SYNCHRONOUS,
7182 client_maker_.MakeAckAndRstPacket(
7183 4, false, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:527184 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:177185 socket_data2.AddSocketDataToFactory(socket_factory_.get());
jri217455a12016-07-13 20:15:097186
7187 const uint8_t kTestIpAddress[] = {1, 2, 3, 4};
7188 const uint16_t kTestPort = 123;
Zhongyi Shif124a582017-11-02 00:15:047189 session->Migrate(NetworkChangeNotifier::kInvalidNetworkHandle,
7190 IPEndPoint(IPAddress(kTestIpAddress), kTestPort), true,
7191 net_log_);
jri217455a12016-07-13 20:15:097192
7193 session->GetDefaultSocket()->GetPeerAddress(&ip);
7194 DVLOG(1) << "Socket migrated to: " << ip.address().ToString() << " "
7195 << ip.port();
7196
7197 // The session should be alive and active.
7198 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7199 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7200 EXPECT_EQ(1u, session->GetNumActiveStreams());
7201
7202 // Run the message loop so that data queued in the new socket is read by the
7203 // packet reader.
7204 base::RunLoop().RunUntilIdle();
7205
7206 // Verify that response headers on the migrated socket were delivered to the
7207 // stream.
7208 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
7209 EXPECT_EQ(200, response.headers->response_code());
7210
7211 stream.reset();
7212
7213 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
7214 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
7215 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
7216 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
7217}
7218
jri053fdbd2016-08-19 02:33:057219TEST_P(QuicStreamFactoryTest, ServerMigrationIPv4ToIPv4) {
7220 // Add alternate IPv4 server address to config.
7221 IPEndPoint alt_address = IPEndPoint(IPAddress(1, 2, 3, 4), 123);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527222 quic::QuicConfig config;
fayang91ca2012016-11-22 07:42:467223 config.SetAlternateServerAddressToSend(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527224 quic::QuicSocketAddress(quic::QuicSocketAddressImpl(alt_address)));
jri053fdbd2016-08-19 02:33:057225 VerifyServerMigration(config, alt_address);
7226}
7227
7228TEST_P(QuicStreamFactoryTest, ServerMigrationIPv6ToIPv6) {
7229 // Add a resolver rule to make initial connection to an IPv6 address.
Renjiea0cb4a2c2018-09-26 23:37:307230 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
7231 "fe80::aebc:32ff:febb:1e33", "");
jri053fdbd2016-08-19 02:33:057232 // Add alternate IPv6 server address to config.
7233 IPEndPoint alt_address = IPEndPoint(
7234 IPAddress(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16), 123);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527235 quic::QuicConfig config;
fayang91ca2012016-11-22 07:42:467236 config.SetAlternateServerAddressToSend(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527237 quic::QuicSocketAddress(quic::QuicSocketAddressImpl(alt_address)));
jri053fdbd2016-08-19 02:33:057238 VerifyServerMigration(config, alt_address);
7239}
7240
7241TEST_P(QuicStreamFactoryTest, ServerMigrationIPv6ToIPv4) {
7242 // Add a resolver rule to make initial connection to an IPv6 address.
Renjiea0cb4a2c2018-09-26 23:37:307243 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
7244 "fe80::aebc:32ff:febb:1e33", "");
jri053fdbd2016-08-19 02:33:057245 // Add alternate IPv4 server address to config.
7246 IPEndPoint alt_address = IPEndPoint(IPAddress(1, 2, 3, 4), 123);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527247 quic::QuicConfig config;
fayang91ca2012016-11-22 07:42:467248 config.SetAlternateServerAddressToSend(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527249 quic::QuicSocketAddress(quic::QuicSocketAddressImpl(alt_address)));
jri053fdbd2016-08-19 02:33:057250 IPEndPoint expected_address(
7251 ConvertIPv4ToIPv4MappedIPv6(alt_address.address()), alt_address.port());
7252 VerifyServerMigration(config, expected_address);
7253}
7254
7255TEST_P(QuicStreamFactoryTest, ServerMigrationIPv4ToIPv6Fails) {
7256 allow_server_migration_ = true;
7257 Initialize();
7258
7259 // Add a resolver rule to make initial connection to an IPv4 address.
Renjiea0cb4a2c2018-09-26 23:37:307260 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(), "1.2.3.4",
7261 "");
jri053fdbd2016-08-19 02:33:057262 // Add alternate IPv6 server address to config.
7263 IPEndPoint alt_address = IPEndPoint(
7264 IPAddress(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16), 123);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527265 quic::QuicConfig config;
fayang91ca2012016-11-22 07:42:467266 config.SetAlternateServerAddressToSend(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527267 quic::QuicSocketAddress(quic::QuicSocketAddressImpl(alt_address)));
jri053fdbd2016-08-19 02:33:057268
7269 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7270 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7271 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7272
7273 crypto_client_stream_factory_.SetConfig(config);
7274
7275 // Set up only socket data provider.
rcha00569732016-08-27 11:09:367276 MockQuicData socket_data1;
7277 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437278 socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
7279 socket_data1.AddWrite(
7280 SYNCHRONOUS,
7281 client_maker_.MakeRstPacket(2, true, GetNthClientInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:527282 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:177283 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri053fdbd2016-08-19 02:33:057284
7285 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:457286 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337287 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037288 request.Request(
7289 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7290 SocketTag(),
7291 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7292 failed_on_default_network_callback_, callback_.callback()));
jri053fdbd2016-08-19 02:33:057293 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:247294 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri053fdbd2016-08-19 02:33:057295 EXPECT_TRUE(stream.get());
7296
7297 // Cause QUIC stream to be created.
7298 HttpRequestInfo request_info;
7299 request_info.method = "GET";
7300 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:397301 request_info.traffic_annotation =
7302 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:277303 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:397304 net_log_, CompletionOnceCallback()));
jri053fdbd2016-08-19 02:33:057305
7306 // Ensure that session is alive and active.
7307 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
7308 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7309 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7310
7311 IPEndPoint actual_address;
7312 session->GetDefaultSocket()->GetPeerAddress(&actual_address);
7313 // No migration should have happened.
7314 IPEndPoint expected_address =
7315 IPEndPoint(IPAddress(1, 2, 3, 4), kDefaultServerPort);
7316 EXPECT_EQ(actual_address, expected_address);
7317 DVLOG(1) << "Socket connected to: " << actual_address.address().ToString()
7318 << " " << actual_address.port();
7319 DVLOG(1) << "Expected address: " << expected_address.address().ToString()
7320 << " " << expected_address.port();
7321
7322 stream.reset();
7323 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
7324 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
7325}
7326
rch02d87792015-09-09 09:05:537327TEST_P(QuicStreamFactoryTest, OnSSLConfigChanged) {
jri7046038f2015-10-22 00:29:267328 Initialize();
rch6faa4d42016-01-05 20:48:437329 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7330 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7331 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7332
rcha00569732016-08-27 11:09:367333 MockQuicData socket_data;
7334 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437335 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Ryan Hamilton8d9ee76e2018-05-29 23:52:527336 socket_data.AddWrite(
7337 SYNCHRONOUS, ConstructClientRstPacket(2, quic::QUIC_RST_ACKNOWLEDGEMENT));
Renjieba55fae2018-09-20 03:05:167338 socket_data.AddWrite(
7339 SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
7340 3, true, quic::QUIC_CONNECTION_CANCELLED, "net error"));
Zhongyi Shi5f587cc2017-11-21 23:24:177341 socket_data.AddSocketDataToFactory(socket_factory_.get());
rch02d87792015-09-09 09:05:537342
rcha00569732016-08-27 11:09:367343 MockQuicData socket_data2;
7344 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437345 socket_data2.AddWrite(SYNCHRONOUS,
7346 ConstructInitialSettingsPacket(1, nullptr));
Zhongyi Shi5f587cc2017-11-21 23:24:177347 socket_data2.AddSocketDataToFactory(socket_factory_.get());
rch02d87792015-09-09 09:05:537348
zhongyi98d6a9262017-05-19 02:47:457349 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337350 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037351 request.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());
Yixin Wang7891a39d2017-11-08 20:59:247358 std::unique_ptr<HttpStream> stream = CreateStream(&request);
Cherie Shie615a0842018-02-28 02:01:137359 HttpRequestInfo request_info;
7360 request_info.traffic_annotation =
7361 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
7362 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békyd8a21fc32018-06-27 18:29:587363 net_log_, CompletionOnceCallback()));
rch02d87792015-09-09 09:05:537364
nharper642ae4b2016-06-30 00:40:367365 ssl_config_service_->NotifySSLConfigChange();
Cherie Shie615a0842018-02-28 02:01:137366 EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
7367 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:267368 EXPECT_FALSE(factory_->require_confirmation());
rch02d87792015-09-09 09:05:537369
7370 // Now attempting to request a stream to the same origin should create
7371 // a new session.
Cherie Shie615a0842018-02-28 02:01:137372
zhongyi98d6a9262017-05-19 02:47:457373 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337374 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037375 request2.Request(
7376 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7377 SocketTag(),
7378 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7379 failed_on_default_network_callback_, callback_.callback()));
rch02d87792015-09-09 09:05:537380
robpercival214763f2016-07-01 23:27:017381 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Cherie Shie615a0842018-02-28 02:01:137382 stream = CreateStream(&request2);
7383 stream.reset(); // Will reset stream 3.
rch02d87792015-09-09 09:05:537384
7385 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7386 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7387 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
7388 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
7389}
7390
rsleevi17784692016-10-12 01:36:207391TEST_P(QuicStreamFactoryTest, OnCertDBChanged) {
jri7046038f2015-10-22 00:29:267392 Initialize();
rch6faa4d42016-01-05 20:48:437393 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7394 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7395 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7396
rcha00569732016-08-27 11:09:367397 MockQuicData socket_data;
7398 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437399 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:177400 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]d7d1e50b2013-11-25 22:08:097401
rcha00569732016-08-27 11:09:367402 MockQuicData socket_data2;
7403 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437404 socket_data2.AddWrite(SYNCHRONOUS,
7405 ConstructInitialSettingsPacket(1, nullptr));
Zhongyi Shi5f587cc2017-11-21 23:24:177406 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]d7d1e50b2013-11-25 22:08:097407
zhongyi98d6a9262017-05-19 02:47:457408 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337409 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037410 request.Request(
7411 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7412 SocketTag(),
7413 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7414 failed_on_default_network_callback_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:097415
robpercival214763f2016-07-01 23:27:017416 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:247417 std::unique_ptr<HttpStream> stream = CreateStream(&request);
Charles 'Buck' Krasic71763c9f2018-02-16 02:37:287418 EXPECT_TRUE(stream);
7419 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
[email protected]d7d1e50b2013-11-25 22:08:097420
7421 // Change the CA cert and verify that stream saw the event.
mattmfd05a1f2017-02-18 06:18:447422 factory_->OnCertDBChanged();
Charles 'Buck' Krasic71763c9f2018-02-16 02:37:287423
jri7046038f2015-10-22 00:29:267424 EXPECT_FALSE(factory_->require_confirmation());
Charles 'Buck' Krasic71763c9f2018-02-16 02:37:287425 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7426 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]d7d1e50b2013-11-25 22:08:097427
7428 // Now attempting to request a stream to the same origin should create
7429 // a new session.
7430
zhongyi98d6a9262017-05-19 02:47:457431 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337432 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037433 request2.Request(
7434 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7435 SocketTag(),
7436 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7437 failed_on_default_network_callback_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:097438
robpercival214763f2016-07-01 23:27:017439 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Charles 'Buck' Krasic71763c9f2018-02-16 02:37:287440 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
7441 EXPECT_TRUE(stream2);
7442 QuicChromiumClientSession* session2 = GetActiveSession(host_port_pair_);
7443 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7444 EXPECT_NE(session, session2);
7445 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7446 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
7447
7448 stream2.reset();
7449 stream.reset();
[email protected]d7d1e50b2013-11-25 22:08:097450
rch37de576c2015-05-17 20:28:177451 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7452 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7453 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
7454 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:097455}
7456
[email protected]1e960032013-12-20 19:00:207457TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
jri7046038f2015-10-22 00:29:267458 Initialize();
rch6faa4d42016-01-05 20:48:437459
rch872e00e2016-12-02 02:48:187460 std::vector<string> cannoncial_suffixes;
[email protected]6e12d702013-11-13 00:17:177461 cannoncial_suffixes.push_back(string(".c.youtube.com"));
7462 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]c49ff182013-09-28 08:33:267463
[email protected]6e12d702013-11-13 00:17:177464 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
7465 string r1_host_name("r1");
7466 string r2_host_name("r2");
7467 r1_host_name.append(cannoncial_suffixes[i]);
7468 r2_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:147469
[email protected]bf4ea2f2014-03-10 22:57:537470 HostPortPair host_port_pair1(r1_host_name, 80);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527471 quic::QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:267472 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
Ryan Hamilton4f0b26e2018-06-27 23:52:327473 quic::QuicServerId server_id1(host_port_pair1.host(),
7474 host_port_pair1.port(), privacy_mode_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527475 quic::QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:377476 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:177477 EXPECT_FALSE(cached1->proof_valid());
7478 EXPECT_TRUE(cached1->source_address_token().empty());
7479
7480 // Mutate the cached1 to have different data.
7481 // TODO(rtenneti): mutate other members of CachedState.
7482 cached1->set_source_address_token(r1_host_name);
7483 cached1->SetProofValid();
7484
[email protected]bf4ea2f2014-03-10 22:57:537485 HostPortPair host_port_pair2(r2_host_name, 80);
Ryan Hamilton4f0b26e2018-06-27 23:52:327486 quic::QuicServerId server_id2(host_port_pair2.host(),
7487 host_port_pair2.port(), privacy_mode_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527488 quic::QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:377489 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:177490 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
7491 EXPECT_TRUE(cached2->proof_valid());
7492 }
[email protected]b70fdb792013-10-25 19:04:147493}
7494
[email protected]1e960032013-12-20 19:00:207495TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
jri7046038f2015-10-22 00:29:267496 Initialize();
rch872e00e2016-12-02 02:48:187497 std::vector<string> cannoncial_suffixes;
[email protected]6e12d702013-11-13 00:17:177498 cannoncial_suffixes.push_back(string(".c.youtube.com"));
7499 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]b70fdb792013-10-25 19:04:147500
[email protected]6e12d702013-11-13 00:17:177501 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
7502 string r3_host_name("r3");
7503 string r4_host_name("r4");
7504 r3_host_name.append(cannoncial_suffixes[i]);
7505 r4_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:147506
[email protected]bf4ea2f2014-03-10 22:57:537507 HostPortPair host_port_pair1(r3_host_name, 80);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527508 quic::QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:267509 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
Ryan Hamilton4f0b26e2018-06-27 23:52:327510 quic::QuicServerId server_id1(host_port_pair1.host(),
7511 host_port_pair1.port(), privacy_mode_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527512 quic::QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:377513 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:177514 EXPECT_FALSE(cached1->proof_valid());
7515 EXPECT_TRUE(cached1->source_address_token().empty());
7516
7517 // Mutate the cached1 to have different data.
7518 // TODO(rtenneti): mutate other members of CachedState.
7519 cached1->set_source_address_token(r3_host_name);
7520 cached1->SetProofInvalid();
7521
[email protected]bf4ea2f2014-03-10 22:57:537522 HostPortPair host_port_pair2(r4_host_name, 80);
Ryan Hamilton4f0b26e2018-06-27 23:52:327523 quic::QuicServerId server_id2(host_port_pair2.host(),
7524 host_port_pair2.port(), privacy_mode_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527525 quic::QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:377526 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:177527 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
7528 EXPECT_TRUE(cached2->source_address_token().empty());
7529 EXPECT_FALSE(cached2->proof_valid());
7530 }
[email protected]c49ff182013-09-28 08:33:267531}
7532
rtenneti34dffe752015-02-24 23:27:327533TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) {
jri7046038f2015-10-22 00:29:267534 Initialize();
Ryan Hamiltona12722b2017-08-12 02:23:207535 factory_->set_require_confirmation(false);
rch6faa4d42016-01-05 20:48:437536 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7537 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7538
jri7046038f2015-10-22 00:29:267539 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti34dffe752015-02-24 23:27:327540
rcha00569732016-08-27 11:09:367541 MockQuicData socket_data;
7542 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:177543 socket_data.AddSocketDataToFactory(socket_factory_.get());
rtenneti34dffe752015-02-24 23:27:327544
7545 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:277546 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:307547 host_resolver_->set_synchronous_mode(true);
7548 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
7549 "192.168.0.1", "");
rtenneti34dffe752015-02-24 23:27:327550
zhongyi98d6a9262017-05-19 02:47:457551 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337552 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
7553 DEFAULT_PRIORITY, SocketTag(),
7554 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:037555 &net_error_details_,
7556 failed_on_default_network_callback_,
7557 callback_.callback()));
rtenneti34dffe752015-02-24 23:27:327558
7559 // If we are waiting for disk cache, we would have posted a task. Verify that
7560 // the CancelWaitForDataReady task hasn't been posted.
7561 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
7562
Yixin Wang7891a39d2017-11-08 20:59:247563 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rtenneti34dffe752015-02-24 23:27:327564 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:177565 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7566 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti34dffe752015-02-24 23:27:327567}
7568
dmurph44ca4f42016-09-09 20:39:097569TEST_P(QuicStreamFactoryTest, ReducePingTimeoutOnConnectionTimeOutOpenStreams) {
7570 reduced_ping_timeout_seconds_ = 10;
dmurph44ca4f42016-09-09 20:39:097571 Initialize();
7572 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7573 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7574 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7575
7576 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
zhongyidd1439f62016-09-02 02:02:267577
7578 MockQuicData socket_data;
7579 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437580 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:177581 socket_data.AddSocketDataToFactory(socket_factory_.get());
zhongyidd1439f62016-09-02 02:02:267582
7583 MockQuicData socket_data2;
7584 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437585 socket_data2.AddWrite(SYNCHRONOUS,
7586 ConstructInitialSettingsPacket(1, nullptr));
Zhongyi Shi5f587cc2017-11-21 23:24:177587 socket_data2.AddSocketDataToFactory(socket_factory_.get());
zhongyidd1439f62016-09-02 02:02:267588
7589 HostPortPair server2(kServer2HostName, kDefaultServerPort);
7590
7591 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:277592 MockCryptoClientStream::CONFIRM_HANDSHAKE);
Renjiea0cb4a2c2018-09-26 23:37:307593 host_resolver_->set_synchronous_mode(true);
7594 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
7595 "192.168.0.1", "");
7596 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
zhongyidd1439f62016-09-02 02:02:267597
7598 // Quic should use default PING timeout when no previous connection times out
7599 // with open stream.
Ryan Hamilton8d9ee76e2018-05-29 23:52:527600 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(quic::kPingTimeoutSecs),
zhongyidd1439f62016-09-02 02:02:267601 QuicStreamFactoryPeer::GetPingTimeout(factory_.get()));
zhongyi98d6a9262017-05-19 02:47:457602 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337603 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
7604 DEFAULT_PRIORITY, SocketTag(),
7605 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:037606 &net_error_details_,
7607 failed_on_default_network_callback_,
7608 callback_.callback()));
zhongyidd1439f62016-09-02 02:02:267609
7610 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527611 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(quic::kPingTimeoutSecs),
zhongyidd1439f62016-09-02 02:02:267612 session->connection()->ping_timeout());
7613
Yixin Wang7891a39d2017-11-08 20:59:247614 std::unique_ptr<HttpStream> stream = CreateStream(&request);
zhongyidd1439f62016-09-02 02:02:267615 EXPECT_TRUE(stream.get());
7616 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:397617 request_info.traffic_annotation =
7618 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:277619 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:397620 net_log_, CompletionOnceCallback()));
zhongyidd1439f62016-09-02 02:02:267621
7622 DVLOG(1)
7623 << "Created 1st session and initialized a stream. Now trigger timeout";
Ryan Hamilton8d9ee76e2018-05-29 23:52:527624 session->connection()->CloseConnection(
7625 quic::QUIC_NETWORK_IDLE_TIMEOUT, "test",
7626 quic::ConnectionCloseBehavior::SILENT_CLOSE);
zhongyidd1439f62016-09-02 02:02:267627 // Need to spin the loop now to ensure that
7628 // QuicStreamFactory::OnSessionClosed() runs.
7629 base::RunLoop run_loop;
7630 run_loop.RunUntilIdle();
7631
zhongyidd1439f62016-09-02 02:02:267632 // The first connection times out with open stream, QUIC should reduce initial
7633 // PING time for subsequent connections.
Ryan Hamilton8d9ee76e2018-05-29 23:52:527634 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(10),
zhongyidd1439f62016-09-02 02:02:267635 QuicStreamFactoryPeer::GetPingTimeout(factory_.get()));
7636
7637 // Test two-in-a-row timeouts with open streams.
7638 DVLOG(1) << "Create 2nd session and timeout with open stream";
7639 TestCompletionCallback callback2;
zhongyi98d6a9262017-05-19 02:47:457640 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:037641 EXPECT_EQ(OK,
7642 request2.Request(
7643 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
7644 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
7645 failed_on_default_network_callback_, callback2.callback()));
zhongyidd1439f62016-09-02 02:02:267646 QuicChromiumClientSession* session2 = GetActiveSession(server2);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527647 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(10),
zhongyidd1439f62016-09-02 02:02:267648 session2->connection()->ping_timeout());
7649
Yixin Wang7891a39d2017-11-08 20:59:247650 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
zhongyidd1439f62016-09-02 02:02:267651 EXPECT_TRUE(stream2.get());
Steven Valdezb4ff0412018-01-18 22:39:277652 EXPECT_EQ(OK,
7653 stream2->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:397654 net_log_, CompletionOnceCallback()));
zhongyidd1439f62016-09-02 02:02:267655 session2->connection()->CloseConnection(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527656 quic::QUIC_NETWORK_IDLE_TIMEOUT, "test",
7657 quic::ConnectionCloseBehavior::SILENT_CLOSE);
zhongyidd1439f62016-09-02 02:02:267658 // Need to spin the loop now to ensure that
7659 // QuicStreamFactory::OnSessionClosed() runs.
7660 base::RunLoop run_loop2;
7661 run_loop2.RunUntilIdle();
zhongyidd1439f62016-09-02 02:02:267662
7663 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7664 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7665 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
7666 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
7667}
7668
tbansal3b966952016-10-25 23:25:147669// Verifies that the QUIC stream factory is initialized correctly.
rtenneticd2aaa15b2015-10-10 20:29:337670TEST_P(QuicStreamFactoryTest, MaybeInitialize) {
tbansal9b1cdf32017-05-10 17:28:397671 VerifyInitialization();
rtenneti8a80a6dc2015-09-21 19:51:137672}
7673
rtennetid073dd22016-08-04 01:58:337674TEST_P(QuicStreamFactoryTest, StartCertVerifyJob) {
7675 Initialize();
7676
rcha00569732016-08-27 11:09:367677 MockQuicData socket_data;
7678 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437679 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:177680 socket_data.AddSocketDataToFactory(socket_factory_.get());
rtennetid073dd22016-08-04 01:58:337681
7682 // Save current state of |race_cert_verification|.
7683 bool race_cert_verification =
7684 QuicStreamFactoryPeer::GetRaceCertVerification(factory_.get());
7685
7686 // Load server config.
7687 HostPortPair host_port_pair(kDefaultServerHostName, kDefaultServerPort);
Ryan Hamilton4f0b26e2018-06-27 23:52:327688 quic::QuicServerId quic_server_id(host_port_pair_.host(),
7689 host_port_pair_.port(),
7690 privacy_mode_ == PRIVACY_MODE_ENABLED);
rtennetid073dd22016-08-04 01:58:337691 QuicStreamFactoryPeer::CacheDummyServerConfig(factory_.get(), quic_server_id);
7692
7693 QuicStreamFactoryPeer::SetRaceCertVerification(factory_.get(), true);
7694 EXPECT_FALSE(HasActiveCertVerifierJob(quic_server_id));
7695
7696 // Start CertVerifyJob.
Ryan Hamilton8d9ee76e2018-05-29 23:52:527697 quic::QuicAsyncStatus status = QuicStreamFactoryPeer::StartCertVerifyJob(
rtennetid073dd22016-08-04 01:58:337698 factory_.get(), quic_server_id, /*cert_verify_flags=*/0, net_log_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527699 if (status == quic::QUIC_PENDING) {
rtennetid073dd22016-08-04 01:58:337700 // Verify CertVerifierJob has started.
7701 EXPECT_TRUE(HasActiveCertVerifierJob(quic_server_id));
7702
7703 while (HasActiveCertVerifierJob(quic_server_id)) {
7704 base::RunLoop().RunUntilIdle();
7705 }
7706 }
7707 // Verify CertVerifierJob has finished.
7708 EXPECT_FALSE(HasActiveCertVerifierJob(quic_server_id));
7709
7710 // Start a QUIC request.
zhongyi98d6a9262017-05-19 02:47:457711 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337712 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037713 request.Request(
7714 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7715 SocketTag(),
7716 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7717 failed_on_default_network_callback_, callback_.callback()));
rtennetid073dd22016-08-04 01:58:337718
7719 EXPECT_EQ(OK, callback_.WaitForResult());
7720
Yixin Wang7891a39d2017-11-08 20:59:247721 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rtennetid073dd22016-08-04 01:58:337722 EXPECT_TRUE(stream.get());
7723
7724 // Restore |race_cert_verification|.
7725 QuicStreamFactoryPeer::SetRaceCertVerification(factory_.get(),
7726 race_cert_verification);
7727
7728 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7729 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7730
7731 // Verify there are no outstanding CertVerifierJobs after request has
7732 // finished.
7733 EXPECT_FALSE(HasActiveCertVerifierJob(quic_server_id));
7734}
7735
rtenneti1cd3b162015-09-29 02:58:287736TEST_P(QuicStreamFactoryTest, YieldAfterPackets) {
jri7046038f2015-10-22 00:29:267737 Initialize();
Ryan Hamiltona12722b2017-08-12 02:23:207738 factory_->set_require_confirmation(false);
rch6faa4d42016-01-05 20:48:437739 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7740 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:267741 QuicStreamFactoryPeer::SetYieldAfterPackets(factory_.get(), 0);
rtenneti1cd3b162015-09-29 02:58:287742
rcha00569732016-08-27 11:09:367743 MockQuicData socket_data;
Zhongyi Shi32f2fd02018-04-16 18:23:437744 socket_data.AddRead(SYNCHRONOUS, ConstructClientConnectionClosePacket(0));
rcha00569732016-08-27 11:09:367745 socket_data.AddRead(ASYNC, OK);
Zhongyi Shi5f587cc2017-11-21 23:24:177746 socket_data.AddSocketDataToFactory(socket_factory_.get());
rtenneti1cd3b162015-09-29 02:58:287747
7748 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:277749 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:307750 host_resolver_->set_synchronous_mode(true);
7751 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
7752 "192.168.0.1", "");
rtenneti1cd3b162015-09-29 02:58:287753
rcha02807b42016-01-29 21:56:157754 // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
7755 // posts a task.
rtenneti1cd3b162015-09-29 02:58:287756 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
rcha02807b42016-01-29 21:56:157757 SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
7758 "StartReading");
rtenneti1cd3b162015-09-29 02:58:287759
zhongyi98d6a9262017-05-19 02:47:457760 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337761 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
7762 DEFAULT_PRIORITY, SocketTag(),
7763 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:037764 &net_error_details_,
7765 failed_on_default_network_callback_,
7766 callback_.callback()));
rtenneti1cd3b162015-09-29 02:58:287767
rcha02807b42016-01-29 21:56:157768 // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
7769 // called.
rtenneti1cd3b162015-09-29 02:58:287770 base::RunLoop run_loop;
7771 run_loop.RunUntilIdle();
7772
7773 // Verify task that the observer's executed_count is 1, which indicates
rcha02807b42016-01-29 21:56:157774 // QuicChromiumPacketReader::StartReading() has posted only one task and
7775 // yielded the read.
rtenneti1cd3b162015-09-29 02:58:287776 EXPECT_EQ(1u, observer.executed_count());
7777
Yixin Wang7891a39d2017-11-08 20:59:247778 std::unique_ptr<HttpStream> stream = CreateStream(&request);
xunjieli2608f9b2016-03-14 13:39:237779 EXPECT_FALSE(stream.get()); // Session is already closed.
rtenneti1cd3b162015-09-29 02:58:287780 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7781 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7782}
7783
7784TEST_P(QuicStreamFactoryTest, YieldAfterDuration) {
jri7046038f2015-10-22 00:29:267785 Initialize();
Ryan Hamiltona12722b2017-08-12 02:23:207786 factory_->set_require_confirmation(false);
rch6faa4d42016-01-05 20:48:437787 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7788 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rtenneti1cd3b162015-09-29 02:58:287789 QuicStreamFactoryPeer::SetYieldAfterDuration(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527790 factory_.get(), quic::QuicTime::Delta::FromMilliseconds(-1));
rtenneti1cd3b162015-09-29 02:58:287791
rcha00569732016-08-27 11:09:367792 MockQuicData socket_data;
Zhongyi Shi32f2fd02018-04-16 18:23:437793 socket_data.AddRead(SYNCHRONOUS, ConstructClientConnectionClosePacket(0));
rcha00569732016-08-27 11:09:367794 socket_data.AddRead(ASYNC, OK);
Zhongyi Shi5f587cc2017-11-21 23:24:177795 socket_data.AddSocketDataToFactory(socket_factory_.get());
rtenneti1cd3b162015-09-29 02:58:287796
7797 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:277798 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:307799 host_resolver_->set_synchronous_mode(true);
7800 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
7801 "192.168.0.1", "");
rtenneti1cd3b162015-09-29 02:58:287802
rcha02807b42016-01-29 21:56:157803 // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
7804 // posts a task.
rtenneti1cd3b162015-09-29 02:58:287805 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
rcha02807b42016-01-29 21:56:157806 SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
7807 "StartReading");
rtenneti1cd3b162015-09-29 02:58:287808
zhongyi98d6a9262017-05-19 02:47:457809 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337810 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
7811 DEFAULT_PRIORITY, SocketTag(),
7812 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:037813 &net_error_details_,
7814 failed_on_default_network_callback_,
7815 callback_.callback()));
rtenneti1cd3b162015-09-29 02:58:287816
rcha02807b42016-01-29 21:56:157817 // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
7818 // called.
rtenneti1cd3b162015-09-29 02:58:287819 base::RunLoop run_loop;
7820 run_loop.RunUntilIdle();
7821
7822 // Verify task that the observer's executed_count is 1, which indicates
rcha02807b42016-01-29 21:56:157823 // QuicChromiumPacketReader::StartReading() has posted only one task and
7824 // yielded the read.
rtenneti1cd3b162015-09-29 02:58:287825 EXPECT_EQ(1u, observer.executed_count());
7826
Yixin Wang7891a39d2017-11-08 20:59:247827 std::unique_ptr<HttpStream> stream = CreateStream(&request);
xunjieli2608f9b2016-03-14 13:39:237828 EXPECT_FALSE(stream.get()); // Session is already closed.
rtenneti1cd3b162015-09-29 02:58:287829 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7830 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7831}
7832
ckrasic3865ee0f2016-02-29 22:04:567833TEST_P(QuicStreamFactoryTest, ServerPushSessionAffinity) {
7834 Initialize();
7835 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7836 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7837
rcha00569732016-08-27 11:09:367838 MockQuicData socket_data;
7839 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437840 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:177841 socket_data.AddSocketDataToFactory(socket_factory_.get());
ckrasic3865ee0f2016-02-29 22:04:567842
zhongyi98d6a9262017-05-19 02:47:457843 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337844 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037845 request.Request(
7846 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7847 SocketTag(),
7848 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7849 failed_on_default_network_callback_, callback_.callback()));
ckrasic3865ee0f2016-02-29 22:04:567850
robpercival214763f2016-07-01 23:27:017851 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:247852 std::unique_ptr<HttpStream> stream = CreateStream(&request);
ckrasic3865ee0f2016-02-29 22:04:567853 EXPECT_TRUE(stream.get());
7854
7855 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
7856
bnc5fdc07162016-05-23 17:36:037857 string url = "https://www.example.org/";
ckrasic3865ee0f2016-02-29 22:04:567858
bnc912a04b2016-04-20 14:19:507859 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic3865ee0f2016-02-29 22:04:567860
Ryan Hamilton8d9ee76e2018-05-29 23:52:527861 quic::QuicClientPromisedInfo promised(
7862 session, GetNthServerInitiatedStreamId(0), kDefaultUrl);
ckrasic3865ee0f2016-02-29 22:04:567863 (*QuicStreamFactoryPeer::GetPushPromiseIndex(factory_.get())
bnc3d9035b32016-06-30 18:18:487864 ->promised_by_url())[kDefaultUrl] = &promised;
ckrasic3865ee0f2016-02-29 22:04:567865
zhongyi98d6a9262017-05-19 02:47:457866 QuicStreamRequest request2(factory_.get());
zhongyia00ca012017-07-06 23:36:397867 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:337868 DEFAULT_PRIORITY, SocketTag(),
7869 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:037870 &net_error_details_,
7871 failed_on_default_network_callback_,
7872 callback_.callback()));
ckrasic3865ee0f2016-02-29 22:04:567873
7874 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
7875}
7876
7877TEST_P(QuicStreamFactoryTest, ServerPushPrivacyModeMismatch) {
7878 Initialize();
7879 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7880 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7881 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7882
rcha00569732016-08-27 11:09:367883 MockQuicData socket_data1;
7884 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437885 socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
7886 socket_data1.AddWrite(
7887 SYNCHRONOUS,
7888 client_maker_.MakeRstPacket(2, true, GetNthServerInitiatedStreamId(0),
Ryan Hamilton8d9ee76e2018-05-29 23:52:527889 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:177890 socket_data1.AddSocketDataToFactory(socket_factory_.get());
ckrasic3865ee0f2016-02-29 22:04:567891
rcha00569732016-08-27 11:09:367892 MockQuicData socket_data2;
7893 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437894 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:177895 socket_data2.AddSocketDataToFactory(socket_factory_.get());
ckrasic3865ee0f2016-02-29 22:04:567896
zhongyi98d6a9262017-05-19 02:47:457897 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337898 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037899 request.Request(
7900 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7901 SocketTag(),
7902 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7903 failed_on_default_network_callback_, callback_.callback()));
ckrasic3865ee0f2016-02-29 22:04:567904
robpercival214763f2016-07-01 23:27:017905 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:247906 std::unique_ptr<HttpStream> stream = CreateStream(&request);
ckrasic3865ee0f2016-02-29 22:04:567907 EXPECT_TRUE(stream.get());
7908
7909 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
7910
bnc5fdc07162016-05-23 17:36:037911 string url = "https://www.example.org/";
bnc912a04b2016-04-20 14:19:507912 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic3865ee0f2016-02-29 22:04:567913
Ryan Hamilton8d9ee76e2018-05-29 23:52:527914 quic::QuicClientPromisedInfo promised(
7915 session, GetNthServerInitiatedStreamId(0), kDefaultUrl);
ckrasic3865ee0f2016-02-29 22:04:567916
Ryan Hamilton8d9ee76e2018-05-29 23:52:527917 quic::QuicClientPushPromiseIndex* index =
ckrasic3865ee0f2016-02-29 22:04:567918 QuicStreamFactoryPeer::GetPushPromiseIndex(factory_.get());
7919
bnc3d9035b32016-06-30 18:18:487920 (*index->promised_by_url())[kDefaultUrl] = &promised;
7921 EXPECT_EQ(index->GetPromised(kDefaultUrl), &promised);
ckrasic3865ee0f2016-02-29 22:04:567922
7923 // Doing the request should not use the push stream, but rather
7924 // cancel it because the privacy modes do not match.
zhongyi98d6a9262017-05-19 02:47:457925 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337926 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037927 request2.Request(
7928 host_port_pair_, version_, PRIVACY_MODE_ENABLED,
7929 DEFAULT_PRIORITY, SocketTag(),
7930 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7931 failed_on_default_network_callback_, callback_.callback()));
ckrasic3865ee0f2016-02-29 22:04:567932
7933 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
bnc3d9035b32016-06-30 18:18:487934 EXPECT_EQ(index->GetPromised(kDefaultUrl), nullptr);
ckrasic3865ee0f2016-02-29 22:04:567935
robpercival214763f2016-07-01 23:27:017936 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:247937 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
ckrasic3865ee0f2016-02-29 22:04:567938 EXPECT_TRUE(stream2.get());
7939
7940 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
7941 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
7942 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
7943 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
7944}
7945
Ryan Hamilton8d9ee76e2018-05-29 23:52:527946// Pool to existing session with matching quic::QuicServerId
bnc359ed2a2016-04-29 20:43:457947// even if destination is different.
7948TEST_P(QuicStreamFactoryTest, PoolByOrigin) {
7949 Initialize();
7950
7951 HostPortPair destination1("first.example.com", 443);
7952 HostPortPair destination2("second.example.com", 443);
7953
7954 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7955 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7956
rcha00569732016-08-27 11:09:367957 MockQuicData socket_data;
7958 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437959 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:177960 socket_data.AddSocketDataToFactory(socket_factory_.get());
bnc359ed2a2016-04-29 20:43:457961
zhongyi98d6a9262017-05-19 02:47:457962 QuicStreamRequest request1(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:037963 EXPECT_EQ(
7964 ERR_IO_PENDING,
7965 request1.Request(
7966 destination1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
7967 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7968 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:017969 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:247970 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
bnc359ed2a2016-04-29 20:43:457971 EXPECT_TRUE(stream1.get());
7972 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7973
7974 // Second request returns synchronously because it pools to existing session.
7975 TestCompletionCallback callback2;
zhongyi98d6a9262017-05-19 02:47:457976 QuicStreamRequest request2(factory_.get());
zhongyia00ca012017-07-06 23:36:397977 EXPECT_EQ(OK, request2.Request(destination2, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:337978 DEFAULT_PRIORITY, SocketTag(),
7979 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:037980 &net_error_details_,
7981 failed_on_default_network_callback_,
7982 callback2.callback()));
Yixin Wang7891a39d2017-11-08 20:59:247983 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
bnc359ed2a2016-04-29 20:43:457984 EXPECT_TRUE(stream2.get());
7985
rchf0b18c8a2017-05-05 19:31:577986 QuicChromiumClientSession::Handle* session1 =
7987 QuicHttpStreamPeer::GetSessionHandle(stream1.get());
7988 QuicChromiumClientSession::Handle* session2 =
7989 QuicHttpStreamPeer::GetSessionHandle(stream2.get());
7990 EXPECT_TRUE(session1->SharesSameSession(*session2));
Ryan Hamilton4f0b26e2018-06-27 23:52:327991 EXPECT_EQ(quic::QuicServerId(host_port_pair_.host(), host_port_pair_.port(),
7992 privacy_mode_ == PRIVACY_MODE_ENABLED),
bnc359ed2a2016-04-29 20:43:457993 session1->server_id());
7994
7995 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7996 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7997}
7998
7999class QuicStreamFactoryWithDestinationTest
8000 : public QuicStreamFactoryTestBase,
8001 public ::testing::TestWithParam<PoolingTestParams> {
8002 protected:
8003 QuicStreamFactoryWithDestinationTest()
Yixin Wang079ad542018-01-11 04:06:058004 : QuicStreamFactoryTestBase(
8005 GetParam().version,
8006 GetParam().client_headers_include_h2_stream_dependency),
bnc359ed2a2016-04-29 20:43:458007 destination_type_(GetParam().destination_type),
8008 hanging_read_(SYNCHRONOUS, ERR_IO_PENDING, 0) {}
8009
8010 HostPortPair GetDestination() {
8011 switch (destination_type_) {
8012 case SAME_AS_FIRST:
8013 return origin1_;
8014 case SAME_AS_SECOND:
8015 return origin2_;
8016 case DIFFERENT:
8017 return HostPortPair(kDifferentHostname, 443);
8018 default:
8019 NOTREACHED();
8020 return HostPortPair();
8021 }
8022 }
8023
8024 void AddHangingSocketData() {
8025 std::unique_ptr<SequencedSocketData> sequenced_socket_data(
Ryan Sleevib8d7ea02018-05-07 20:01:018026 new SequencedSocketData(base::make_span(&hanging_read_, 1),
8027 base::span<MockWrite>()));
Zhongyi Shi5f587cc2017-11-21 23:24:178028 socket_factory_->AddSocketDataProvider(sequenced_socket_data.get());
bnc359ed2a2016-04-29 20:43:458029 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
8030 }
8031
8032 bool AllDataConsumed() {
8033 for (const auto& socket_data_ptr : sequenced_socket_data_vector_) {
8034 if (!socket_data_ptr->AllReadDataConsumed() ||
8035 !socket_data_ptr->AllWriteDataConsumed()) {
8036 return false;
8037 }
8038 }
8039 return true;
8040 }
8041
8042 DestinationType destination_type_;
8043 HostPortPair origin1_;
8044 HostPortPair origin2_;
8045 MockRead hanging_read_;
rch872e00e2016-12-02 02:48:188046 std::vector<std::unique_ptr<SequencedSocketData>>
8047 sequenced_socket_data_vector_;
bnc359ed2a2016-04-29 20:43:458048};
8049
Bence Békyce380cb2018-04-26 23:39:558050INSTANTIATE_TEST_CASE_P(VersionIncludeStreamDependencySequence,
bnc359ed2a2016-04-29 20:43:458051 QuicStreamFactoryWithDestinationTest,
8052 ::testing::ValuesIn(GetPoolingTestParams()));
8053
8054// A single QUIC request fails because the certificate does not match the origin
8055// hostname, regardless of whether it matches the alternative service hostname.
8056TEST_P(QuicStreamFactoryWithDestinationTest, InvalidCertificate) {
8057 if (destination_type_ == DIFFERENT)
8058 return;
8059
8060 Initialize();
8061
8062 GURL url("https://mail.example.com/");
8063 origin1_ = HostPortPair::FromURL(url);
8064
8065 // Not used for requests, but this provides a test case where the certificate
8066 // is valid for the hostname of the alternative service.
8067 origin2_ = HostPortPair("mail.example.org", 433);
8068
8069 HostPortPair destination = GetDestination();
8070
8071 scoped_refptr<X509Certificate> cert(
8072 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
Ryan Sleevidef35f62018-01-23 21:12:248073 ASSERT_FALSE(cert->VerifyNameMatch(origin1_.host()));
8074 ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host()));
bnc359ed2a2016-04-29 20:43:458075
8076 ProofVerifyDetailsChromium verify_details;
8077 verify_details.cert_verify_result.verified_cert = cert;
8078 verify_details.cert_verify_result.is_issued_by_known_root = true;
8079 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8080
8081 AddHangingSocketData();
8082
zhongyi98d6a9262017-05-19 02:47:458083 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:038084 EXPECT_EQ(
8085 ERR_IO_PENDING,
8086 request.Request(
8087 destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
8088 /*cert_verify_flags=*/0, url, net_log_, &net_error_details_,
8089 failed_on_default_network_callback_, callback_.callback()));
bnc359ed2a2016-04-29 20:43:458090
robpercival214763f2016-07-01 23:27:018091 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_QUIC_HANDSHAKE_FAILED));
bnc359ed2a2016-04-29 20:43:458092
8093 EXPECT_TRUE(AllDataConsumed());
8094}
8095
8096// QuicStreamRequest is pooled based on |destination| if certificate matches.
8097TEST_P(QuicStreamFactoryWithDestinationTest, SharedCertificate) {
8098 Initialize();
8099
8100 GURL url1("https://www.example.org/");
8101 GURL url2("https://mail.example.org/");
8102 origin1_ = HostPortPair::FromURL(url1);
8103 origin2_ = HostPortPair::FromURL(url2);
8104
8105 HostPortPair destination = GetDestination();
8106
8107 scoped_refptr<X509Certificate> cert(
8108 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
Ryan Sleevidef35f62018-01-23 21:12:248109 ASSERT_TRUE(cert->VerifyNameMatch(origin1_.host()));
8110 ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host()));
8111 ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname));
bnc359ed2a2016-04-29 20:43:458112
8113 ProofVerifyDetailsChromium verify_details;
8114 verify_details.cert_verify_result.verified_cert = cert;
8115 verify_details.cert_verify_result.is_issued_by_known_root = true;
8116 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8117
fayang3bcb8b502016-12-07 21:44:378118 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
Ryan Hamilton8d9ee76e2018-05-29 23:52:528119 std::unique_ptr<quic::QuicEncryptedPacket> settings_packet(
rch5cb522462017-04-25 20:18:368120 client_maker_.MakeInitialSettingsPacket(1, nullptr));
bnceb9aa7112017-01-05 01:03:468121 MockWrite writes[] = {MockWrite(SYNCHRONOUS, settings_packet->data(),
8122 settings_packet->length(), 1)};
fayang3bcb8b502016-12-07 21:44:378123 std::unique_ptr<SequencedSocketData> sequenced_socket_data(
Ryan Sleevib8d7ea02018-05-07 20:01:018124 new SequencedSocketData(reads, writes));
Zhongyi Shi5f587cc2017-11-21 23:24:178125 socket_factory_->AddSocketDataProvider(sequenced_socket_data.get());
fayang3bcb8b502016-12-07 21:44:378126 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
bnc359ed2a2016-04-29 20:43:458127
zhongyi98d6a9262017-05-19 02:47:458128 QuicStreamRequest request1(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:038129 EXPECT_EQ(
8130 ERR_IO_PENDING,
8131 request1.Request(
8132 destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
8133 /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
8134 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:018135 EXPECT_THAT(callback_.WaitForResult(), IsOk());
fayang3bcb8b502016-12-07 21:44:378136
Yixin Wang7891a39d2017-11-08 20:59:248137 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
bnc359ed2a2016-04-29 20:43:458138 EXPECT_TRUE(stream1.get());
8139 EXPECT_TRUE(HasActiveSession(origin1_));
8140
8141 // Second request returns synchronously because it pools to existing session.
8142 TestCompletionCallback callback2;
zhongyi98d6a9262017-05-19 02:47:458143 QuicStreamRequest request2(factory_.get());
zhongyia00ca012017-07-06 23:36:398144 EXPECT_EQ(OK, request2.Request(destination, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:338145 DEFAULT_PRIORITY, SocketTag(),
8146 /*cert_verify_flags=*/0, url2, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:038147 &net_error_details_,
8148 failed_on_default_network_callback_,
8149 callback2.callback()));
Yixin Wang7891a39d2017-11-08 20:59:248150 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
bnc359ed2a2016-04-29 20:43:458151 EXPECT_TRUE(stream2.get());
8152
rchf0b18c8a2017-05-05 19:31:578153 QuicChromiumClientSession::Handle* session1 =
8154 QuicHttpStreamPeer::GetSessionHandle(stream1.get());
8155 QuicChromiumClientSession::Handle* session2 =
8156 QuicHttpStreamPeer::GetSessionHandle(stream2.get());
8157 EXPECT_TRUE(session1->SharesSameSession(*session2));
bnc359ed2a2016-04-29 20:43:458158
Ryan Hamilton4f0b26e2018-06-27 23:52:328159 EXPECT_EQ(quic::QuicServerId(origin1_.host(), origin1_.port(),
8160 privacy_mode_ == PRIVACY_MODE_ENABLED),
8161 session1->server_id());
bnc359ed2a2016-04-29 20:43:458162
8163 EXPECT_TRUE(AllDataConsumed());
8164}
8165
bnc47eba7d2016-07-01 00:43:388166// QuicStreamRequest is not pooled if PrivacyMode differs.
8167TEST_P(QuicStreamFactoryWithDestinationTest, DifferentPrivacyMode) {
8168 Initialize();
8169
8170 GURL url1("https://www.example.org/");
8171 GURL url2("https://mail.example.org/");
8172 origin1_ = HostPortPair::FromURL(url1);
8173 origin2_ = HostPortPair::FromURL(url2);
8174
8175 HostPortPair destination = GetDestination();
8176
8177 scoped_refptr<X509Certificate> cert(
8178 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
Ryan Sleevidef35f62018-01-23 21:12:248179 ASSERT_TRUE(cert->VerifyNameMatch(origin1_.host()));
8180 ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host()));
8181 ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname));
bnc47eba7d2016-07-01 00:43:388182
8183 ProofVerifyDetailsChromium verify_details1;
8184 verify_details1.cert_verify_result.verified_cert = cert;
8185 verify_details1.cert_verify_result.is_issued_by_known_root = true;
8186 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
8187
8188 ProofVerifyDetailsChromium verify_details2;
8189 verify_details2.cert_verify_result.verified_cert = cert;
8190 verify_details2.cert_verify_result.is_issued_by_known_root = true;
8191 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
8192
fayang3bcb8b502016-12-07 21:44:378193 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
Ryan Hamilton8d9ee76e2018-05-29 23:52:528194 std::unique_ptr<quic::QuicEncryptedPacket> settings_packet(
rch5cb522462017-04-25 20:18:368195 client_maker_.MakeInitialSettingsPacket(1, nullptr));
bnceb9aa7112017-01-05 01:03:468196 MockWrite writes[] = {MockWrite(SYNCHRONOUS, settings_packet->data(),
8197 settings_packet->length(), 1)};
fayang3bcb8b502016-12-07 21:44:378198 std::unique_ptr<SequencedSocketData> sequenced_socket_data(
Ryan Sleevib8d7ea02018-05-07 20:01:018199 new SequencedSocketData(reads, writes));
Zhongyi Shi5f587cc2017-11-21 23:24:178200 socket_factory_->AddSocketDataProvider(sequenced_socket_data.get());
fayang3bcb8b502016-12-07 21:44:378201 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
8202 std::unique_ptr<SequencedSocketData> sequenced_socket_data1(
Ryan Sleevib8d7ea02018-05-07 20:01:018203 new SequencedSocketData(reads, writes));
Zhongyi Shi5f587cc2017-11-21 23:24:178204 socket_factory_->AddSocketDataProvider(sequenced_socket_data1.get());
fayang3bcb8b502016-12-07 21:44:378205 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data1));
bnc47eba7d2016-07-01 00:43:388206
zhongyi98d6a9262017-05-19 02:47:458207 QuicStreamRequest request1(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338208 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038209 request1.Request(
8210 destination, version_, PRIVACY_MODE_DISABLED, DEFAULT_PRIORITY,
8211 SocketTag(),
8212 /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
8213 failed_on_default_network_callback_, callback_.callback()));
bnc47eba7d2016-07-01 00:43:388214 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:248215 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
bnc47eba7d2016-07-01 00:43:388216 EXPECT_TRUE(stream1.get());
8217 EXPECT_TRUE(HasActiveSession(origin1_));
8218
8219 TestCompletionCallback callback2;
zhongyi98d6a9262017-05-19 02:47:458220 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338221 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038222 request2.Request(
8223 destination, version_, PRIVACY_MODE_ENABLED, DEFAULT_PRIORITY,
8224 SocketTag(),
8225 /*cert_verify_flags=*/0, url2, net_log_, &net_error_details_,
8226 failed_on_default_network_callback_, callback2.callback()));
bnc47eba7d2016-07-01 00:43:388227 EXPECT_EQ(OK, callback2.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:248228 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
bnc47eba7d2016-07-01 00:43:388229 EXPECT_TRUE(stream2.get());
8230
8231 // |request2| does not pool to the first session, because PrivacyMode does not
8232 // match. Instead, another session is opened to the same destination, but
Ryan Hamilton8d9ee76e2018-05-29 23:52:528233 // with a different quic::QuicServerId.
rchf0b18c8a2017-05-05 19:31:578234 QuicChromiumClientSession::Handle* session1 =
8235 QuicHttpStreamPeer::GetSessionHandle(stream1.get());
8236 QuicChromiumClientSession::Handle* session2 =
8237 QuicHttpStreamPeer::GetSessionHandle(stream2.get());
8238 EXPECT_FALSE(session1->SharesSameSession(*session2));
bnc47eba7d2016-07-01 00:43:388239
Ryan Hamilton4f0b26e2018-06-27 23:52:328240 EXPECT_EQ(quic::QuicServerId(origin1_.host(), origin1_.port(), false),
bnc47eba7d2016-07-01 00:43:388241 session1->server_id());
Ryan Hamilton4f0b26e2018-06-27 23:52:328242 EXPECT_EQ(quic::QuicServerId(origin2_.host(), origin2_.port(), true),
bnc47eba7d2016-07-01 00:43:388243 session2->server_id());
8244
8245 EXPECT_TRUE(AllDataConsumed());
8246}
8247
bnc359ed2a2016-04-29 20:43:458248// QuicStreamRequest is not pooled if certificate does not match its origin.
8249TEST_P(QuicStreamFactoryWithDestinationTest, DisjointCertificate) {
8250 Initialize();
8251
8252 GURL url1("https://news.example.org/");
8253 GURL url2("https://mail.example.com/");
8254 origin1_ = HostPortPair::FromURL(url1);
8255 origin2_ = HostPortPair::FromURL(url2);
8256
8257 HostPortPair destination = GetDestination();
8258
8259 scoped_refptr<X509Certificate> cert1(
8260 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
Ryan Sleevidef35f62018-01-23 21:12:248261 ASSERT_TRUE(cert1->VerifyNameMatch(origin1_.host()));
8262 ASSERT_FALSE(cert1->VerifyNameMatch(origin2_.host()));
8263 ASSERT_FALSE(cert1->VerifyNameMatch(kDifferentHostname));
bnc359ed2a2016-04-29 20:43:458264
8265 ProofVerifyDetailsChromium verify_details1;
8266 verify_details1.cert_verify_result.verified_cert = cert1;
8267 verify_details1.cert_verify_result.is_issued_by_known_root = true;
8268 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
8269
8270 scoped_refptr<X509Certificate> cert2(
8271 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
Ryan Sleevidef35f62018-01-23 21:12:248272 ASSERT_TRUE(cert2->VerifyNameMatch(origin2_.host()));
8273 ASSERT_FALSE(cert2->VerifyNameMatch(kDifferentHostname));
bnc359ed2a2016-04-29 20:43:458274
8275 ProofVerifyDetailsChromium verify_details2;
8276 verify_details2.cert_verify_result.verified_cert = cert2;
8277 verify_details2.cert_verify_result.is_issued_by_known_root = true;
8278 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
8279
fayang3bcb8b502016-12-07 21:44:378280 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
Ryan Hamilton8d9ee76e2018-05-29 23:52:528281 std::unique_ptr<quic::QuicEncryptedPacket> settings_packet(
rch5cb522462017-04-25 20:18:368282 client_maker_.MakeInitialSettingsPacket(1, nullptr));
bnceb9aa7112017-01-05 01:03:468283 MockWrite writes[] = {MockWrite(SYNCHRONOUS, settings_packet->data(),
8284 settings_packet->length(), 1)};
fayang3bcb8b502016-12-07 21:44:378285 std::unique_ptr<SequencedSocketData> sequenced_socket_data(
Ryan Sleevib8d7ea02018-05-07 20:01:018286 new SequencedSocketData(reads, writes));
Zhongyi Shi5f587cc2017-11-21 23:24:178287 socket_factory_->AddSocketDataProvider(sequenced_socket_data.get());
fayang3bcb8b502016-12-07 21:44:378288 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
8289 std::unique_ptr<SequencedSocketData> sequenced_socket_data1(
Ryan Sleevib8d7ea02018-05-07 20:01:018290 new SequencedSocketData(reads, writes));
Zhongyi Shi5f587cc2017-11-21 23:24:178291 socket_factory_->AddSocketDataProvider(sequenced_socket_data1.get());
fayang3bcb8b502016-12-07 21:44:378292 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data1));
bnc359ed2a2016-04-29 20:43:458293
zhongyi98d6a9262017-05-19 02:47:458294 QuicStreamRequest request1(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:038295 EXPECT_EQ(
8296 ERR_IO_PENDING,
8297 request1.Request(
8298 destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
8299 /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
8300 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:018301 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:248302 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
bnc359ed2a2016-04-29 20:43:458303 EXPECT_TRUE(stream1.get());
8304 EXPECT_TRUE(HasActiveSession(origin1_));
8305
8306 TestCompletionCallback callback2;
zhongyi98d6a9262017-05-19 02:47:458307 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:038308 EXPECT_EQ(
8309 ERR_IO_PENDING,
8310 request2.Request(
8311 destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
8312 /*cert_verify_flags=*/0, url2, net_log_, &net_error_details_,
8313 failed_on_default_network_callback_, callback2.callback()));
robpercival214763f2016-07-01 23:27:018314 EXPECT_THAT(callback2.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:248315 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
bnc359ed2a2016-04-29 20:43:458316 EXPECT_TRUE(stream2.get());
8317
8318 // |request2| does not pool to the first session, because the certificate does
8319 // not match. Instead, another session is opened to the same destination, but
Ryan Hamilton8d9ee76e2018-05-29 23:52:528320 // with a different quic::QuicServerId.
rchf0b18c8a2017-05-05 19:31:578321 QuicChromiumClientSession::Handle* session1 =
8322 QuicHttpStreamPeer::GetSessionHandle(stream1.get());
8323 QuicChromiumClientSession::Handle* session2 =
8324 QuicHttpStreamPeer::GetSessionHandle(stream2.get());
8325 EXPECT_FALSE(session1->SharesSameSession(*session2));
bnc359ed2a2016-04-29 20:43:458326
Ryan Hamilton4f0b26e2018-06-27 23:52:328327 EXPECT_EQ(quic::QuicServerId(origin1_.host(), origin1_.port(),
8328 privacy_mode_ == PRIVACY_MODE_ENABLED),
8329 session1->server_id());
8330 EXPECT_EQ(quic::QuicServerId(origin2_.host(), origin2_.port(),
8331 privacy_mode_ == PRIVACY_MODE_ENABLED),
8332 session2->server_id());
bnc359ed2a2016-04-29 20:43:458333
8334 EXPECT_TRUE(AllDataConsumed());
8335}
8336
msramek992625ec2016-08-04 18:33:588337// This test verifies that QuicStreamFactory::ClearCachedStatesInCryptoConfig
8338// correctly transform an origin filter to a ServerIdFilter. Whether the
8339// deletion itself works correctly is tested in QuicCryptoClientConfigTest.
8340TEST_P(QuicStreamFactoryTest, ClearCachedStatesInCryptoConfig) {
8341 Initialize();
Ryan Hamilton8d9ee76e2018-05-29 23:52:528342 quic::QuicCryptoClientConfig* crypto_config =
msramek992625ec2016-08-04 18:33:588343 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
8344
8345 struct TestCase {
8346 TestCase(const std::string& host,
8347 int port,
8348 PrivacyMode privacy_mode,
Ryan Hamilton8d9ee76e2018-05-29 23:52:528349 quic::QuicCryptoClientConfig* crypto_config)
msramek992625ec2016-08-04 18:33:588350 : server_id(host, port, privacy_mode),
8351 state(crypto_config->LookupOrCreate(server_id)) {
rch872e00e2016-12-02 02:48:188352 std::vector<string> certs(1);
msramek992625ec2016-08-04 18:33:588353 certs[0] = "cert";
8354 state->SetProof(certs, "cert_sct", "chlo_hash", "signature");
8355 state->set_source_address_token("TOKEN");
8356 state->SetProofValid();
8357
8358 EXPECT_FALSE(state->certs().empty());
8359 }
8360
Ryan Hamilton8d9ee76e2018-05-29 23:52:528361 quic::QuicServerId server_id;
8362 quic::QuicCryptoClientConfig::CachedState* state;
msramek992625ec2016-08-04 18:33:588363 } test_cases[] = {
8364 TestCase("www.google.com", 443, privacy_mode_, crypto_config),
8365 TestCase("www.example.com", 443, privacy_mode_, crypto_config),
8366 TestCase("www.example.com", 4433, privacy_mode_, crypto_config)};
8367
8368 // Clear cached states for the origin https://www.example.com:4433.
8369 GURL origin("https://www.example.com:4433");
csharrisonebeca8e2016-10-18 02:35:368370 factory_->ClearCachedStatesInCryptoConfig(base::Bind(
8371 static_cast<bool (*)(const GURL&, const GURL&)>(::operator==), origin));
msramek992625ec2016-08-04 18:33:588372 EXPECT_FALSE(test_cases[0].state->certs().empty());
8373 EXPECT_FALSE(test_cases[1].state->certs().empty());
8374 EXPECT_TRUE(test_cases[2].state->certs().empty());
8375
8376 // Clear all cached states.
8377 factory_->ClearCachedStatesInCryptoConfig(
8378 base::Callback<bool(const GURL&)>());
8379 EXPECT_TRUE(test_cases[0].state->certs().empty());
8380 EXPECT_TRUE(test_cases[1].state->certs().empty());
8381 EXPECT_TRUE(test_cases[2].state->certs().empty());
8382}
8383
Yixin Wang46a425f2017-08-10 23:02:208384// Passes connection options and client connection options to QuicStreamFactory,
Ryan Hamilton8d9ee76e2018-05-29 23:52:528385// then checks that its internal quic::QuicConfig is correct.
Yixin Wang46a425f2017-08-10 23:02:208386TEST_P(QuicStreamFactoryTest, ConfigConnectionOptions) {
Ryan Hamilton8d9ee76e2018-05-29 23:52:528387 connection_options_.push_back(quic::kTIME);
8388 connection_options_.push_back(quic::kTBBR);
8389 connection_options_.push_back(quic::kREJ);
Yixin Wang46a425f2017-08-10 23:02:208390
Ryan Hamilton8d9ee76e2018-05-29 23:52:528391 client_connection_options_.push_back(quic::kTBBR);
8392 client_connection_options_.push_back(quic::k1RTT);
Yixin Wang46a425f2017-08-10 23:02:208393
8394 Initialize();
8395
Ryan Hamilton8d9ee76e2018-05-29 23:52:528396 const quic::QuicConfig* config =
8397 QuicStreamFactoryPeer::GetConfig(factory_.get());
Yixin Wang46a425f2017-08-10 23:02:208398 EXPECT_EQ(connection_options_, config->SendConnectionOptions());
8399 EXPECT_TRUE(config->HasClientRequestedIndependentOption(
Ryan Hamilton8d9ee76e2018-05-29 23:52:528400 quic::kTBBR, quic::Perspective::IS_CLIENT));
Yixin Wang46a425f2017-08-10 23:02:208401 EXPECT_TRUE(config->HasClientRequestedIndependentOption(
Ryan Hamilton8d9ee76e2018-05-29 23:52:528402 quic::k1RTT, quic::Perspective::IS_CLIENT));
Yixin Wang46a425f2017-08-10 23:02:208403}
8404
Yixin Wang247ea642017-11-15 01:15:508405// Verifies that the host resolver uses the request priority passed to
8406// QuicStreamRequest::Request().
8407TEST_P(QuicStreamFactoryTest, HostResolverUsesRequestPriority) {
8408 Initialize();
8409 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8410 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8411
8412 MockQuicData socket_data;
8413 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:438414 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:178415 socket_data.AddSocketDataToFactory(socket_factory_.get());
Yixin Wang247ea642017-11-15 01:15:508416
8417 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338418 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038419 request.Request(
8420 host_port_pair_, version_, privacy_mode_, MAXIMUM_PRIORITY,
8421 SocketTag(),
8422 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8423 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang247ea642017-11-15 01:15:508424
8425 EXPECT_THAT(callback_.WaitForResult(), IsOk());
8426 std::unique_ptr<HttpStream> stream = CreateStream(&request);
8427 EXPECT_TRUE(stream.get());
8428
Renjiea0cb4a2c2018-09-26 23:37:308429 EXPECT_EQ(MAXIMUM_PRIORITY, host_resolver_->last_request_priority());
Yixin Wang247ea642017-11-15 01:15:508430
8431 EXPECT_TRUE(socket_data.AllReadDataConsumed());
8432 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
8433}
8434
Yixin Wang469da562017-11-15 21:34:588435// Passes |max_time_before_crypto_handshake_seconds| and
8436// |max_idle_time_before_crypto_handshake_seconds| to QuicStreamFactory, then
Ryan Hamilton8d9ee76e2018-05-29 23:52:528437// checks that its internal quic::QuicConfig is correct.
Yixin Wang469da562017-11-15 21:34:588438TEST_P(QuicStreamFactoryTest, ConfigMaxTimeBeforeCryptoHandshake) {
8439 max_time_before_crypto_handshake_seconds_ = 11;
8440 max_idle_time_before_crypto_handshake_seconds_ = 13;
8441
8442 Initialize();
8443
Ryan Hamilton8d9ee76e2018-05-29 23:52:528444 const quic::QuicConfig* config =
8445 QuicStreamFactoryPeer::GetConfig(factory_.get());
8446 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(11),
Yixin Wang469da562017-11-15 21:34:588447 config->max_time_before_crypto_handshake());
Ryan Hamilton8d9ee76e2018-05-29 23:52:528448 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(13),
Yixin Wang469da562017-11-15 21:34:588449 config->max_idle_time_before_crypto_handshake());
8450}
8451
Yixin Wang7c5d11a82017-12-21 02:40:008452// Verify ResultAfterHostResolutionCallback behavior when host resolution
8453// succeeds asynchronously, then crypto handshake fails synchronously.
8454TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackAsyncSync) {
8455 Initialize();
8456 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8457 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8458
Renjiea0cb4a2c2018-09-26 23:37:308459 host_resolver_->set_ondemand_mode(true);
Yixin Wang7c5d11a82017-12-21 02:40:008460
8461 MockQuicData socket_data;
8462 socket_data.AddRead(SYNCHRONOUS, ERR_FAILED);
8463 socket_data.AddWrite(SYNCHRONOUS, ERR_FAILED);
8464 socket_data.AddSocketDataToFactory(socket_factory_.get());
8465
8466 QuicStreamRequest request(factory_.get());
8467 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038468 request.Request(
8469 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8470 SocketTag(),
8471 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8472 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:008473
8474 TestCompletionCallback host_resolution_callback;
8475 EXPECT_TRUE(
8476 request.WaitForHostResolution(host_resolution_callback.callback()));
8477
8478 // |host_resolver_| has not finished host resolution at this point, so
8479 // |host_resolution_callback| should not have a result.
8480 base::RunLoop().RunUntilIdle();
8481 EXPECT_FALSE(host_resolution_callback.have_result());
8482
8483 // Allow |host_resolver_| to finish host resolution.
8484 // Since the request fails immediately after host resolution (getting
8485 // ERR_FAILED from socket reads/writes), |host_resolution_callback| should be
8486 // called with ERR_QUIC_PROTOCOL_ERROR since that's the next result in
8487 // forming the connection.
Renjiea0cb4a2c2018-09-26 23:37:308488 host_resolver_->ResolveAllPending();
Yixin Wang7c5d11a82017-12-21 02:40:008489 base::RunLoop().RunUntilIdle();
8490 EXPECT_TRUE(host_resolution_callback.have_result());
8491 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, host_resolution_callback.WaitForResult());
8492
8493 // Calling WaitForHostResolution() a second time should return
8494 // false since host resolution has finished already.
8495 EXPECT_FALSE(
8496 request.WaitForHostResolution(host_resolution_callback.callback()));
8497
8498 EXPECT_TRUE(callback_.have_result());
8499 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback_.WaitForResult());
8500}
8501
8502// Verify ResultAfterHostResolutionCallback behavior when host resolution
8503// succeeds asynchronously, then crypto handshake fails asynchronously.
8504TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackAsyncAsync) {
8505 Initialize();
8506 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8507 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8508
Renjiea0cb4a2c2018-09-26 23:37:308509 host_resolver_->set_ondemand_mode(true);
Yixin Wang7c5d11a82017-12-21 02:40:008510 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:278511 MockCryptoClientStream::ZERO_RTT);
Yixin Wang7c5d11a82017-12-21 02:40:008512 factory_->set_require_confirmation(true);
8513
8514 MockQuicData socket_data;
8515 socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
8516 socket_data.AddRead(ASYNC, ERR_FAILED);
8517 socket_data.AddWrite(ASYNC, ERR_FAILED);
8518 socket_data.AddSocketDataToFactory(socket_factory_.get());
8519
8520 QuicStreamRequest request(factory_.get());
8521 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038522 request.Request(
8523 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8524 SocketTag(),
8525 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8526 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:008527
8528 TestCompletionCallback host_resolution_callback;
8529 EXPECT_TRUE(
8530 request.WaitForHostResolution(host_resolution_callback.callback()));
8531
8532 // |host_resolver_| has not finished host resolution at this point, so
8533 // |host_resolution_callback| should not have a result.
8534 base::RunLoop().RunUntilIdle();
8535 EXPECT_FALSE(host_resolution_callback.have_result());
8536
8537 // Allow |host_resolver_| to finish host resolution. Since crypto handshake
8538 // will hang after host resolution, |host_resolution_callback| should run with
8539 // ERR_IO_PENDING since that's the next result in forming the connection.
Renjiea0cb4a2c2018-09-26 23:37:308540 host_resolver_->ResolveAllPending();
Yixin Wang7c5d11a82017-12-21 02:40:008541 base::RunLoop().RunUntilIdle();
8542 EXPECT_TRUE(host_resolution_callback.have_result());
8543 EXPECT_EQ(ERR_IO_PENDING, host_resolution_callback.WaitForResult());
8544
8545 // Calling WaitForHostResolution() a second time should return
8546 // false since host resolution has finished already.
8547 EXPECT_FALSE(
8548 request.WaitForHostResolution(host_resolution_callback.callback()));
8549
8550 EXPECT_FALSE(callback_.have_result());
8551 socket_data.GetSequencedSocketData()->Resume();
8552 base::RunLoop().RunUntilIdle();
8553 EXPECT_TRUE(callback_.have_result());
8554 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback_.WaitForResult());
8555}
8556
8557// Verify ResultAfterHostResolutionCallback behavior when host resolution
8558// succeeds synchronously, then crypto handshake fails synchronously.
8559TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackSyncSync) {
8560 Initialize();
8561 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8562 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8563
Renjiea0cb4a2c2018-09-26 23:37:308564 host_resolver_->set_synchronous_mode(true);
Yixin Wang7c5d11a82017-12-21 02:40:008565
8566 MockQuicData socket_data;
8567 socket_data.AddRead(SYNCHRONOUS, ERR_FAILED);
8568 socket_data.AddWrite(SYNCHRONOUS, ERR_FAILED);
8569 socket_data.AddSocketDataToFactory(socket_factory_.get());
8570
8571 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338572 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR,
Zhongyi Shia6b68d112018-09-24 07:49:038573 request.Request(
8574 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8575 SocketTag(),
8576 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8577 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:008578
8579 // WaitForHostResolution() should return false since host
8580 // resolution has finished already.
8581 TestCompletionCallback host_resolution_callback;
8582 EXPECT_FALSE(
8583 request.WaitForHostResolution(host_resolution_callback.callback()));
8584 base::RunLoop().RunUntilIdle();
8585 EXPECT_FALSE(host_resolution_callback.have_result());
8586 EXPECT_FALSE(callback_.have_result());
8587}
8588
8589// Verify ResultAfterHostResolutionCallback behavior when host resolution
8590// succeeds synchronously, then crypto handshake fails asynchronously.
8591TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackSyncAsync) {
8592 Initialize();
8593 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8594 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8595
8596 // Host resolution will succeed synchronously, but Request() as a whole
8597 // will fail asynchronously.
Renjiea0cb4a2c2018-09-26 23:37:308598 host_resolver_->set_synchronous_mode(true);
Yixin Wang7c5d11a82017-12-21 02:40:008599 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:278600 MockCryptoClientStream::ZERO_RTT);
Yixin Wang7c5d11a82017-12-21 02:40:008601 factory_->set_require_confirmation(true);
8602
8603 MockQuicData socket_data;
8604 socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
8605 socket_data.AddRead(ASYNC, ERR_FAILED);
8606 socket_data.AddWrite(ASYNC, ERR_FAILED);
8607 socket_data.AddSocketDataToFactory(socket_factory_.get());
8608
8609 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338610 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038611 request.Request(
8612 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8613 SocketTag(),
8614 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8615 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:008616
8617 // WaitForHostResolution() should return false since host
8618 // resolution has finished already.
8619 TestCompletionCallback host_resolution_callback;
8620 EXPECT_FALSE(
8621 request.WaitForHostResolution(host_resolution_callback.callback()));
8622 base::RunLoop().RunUntilIdle();
8623 EXPECT_FALSE(host_resolution_callback.have_result());
8624
8625 EXPECT_FALSE(callback_.have_result());
8626 socket_data.GetSequencedSocketData()->Resume();
8627 base::RunLoop().RunUntilIdle();
8628 EXPECT_TRUE(callback_.have_result());
8629 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback_.WaitForResult());
8630}
8631
8632// Verify ResultAfterHostResolutionCallback behavior when host resolution fails
8633// synchronously.
8634TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackFailSync) {
8635 Initialize();
8636 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8637 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8638
8639 // Host resolution will fail synchronously.
Renjiea0cb4a2c2018-09-26 23:37:308640 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
8641 host_resolver_->set_synchronous_mode(true);
Yixin Wang7c5d11a82017-12-21 02:40:008642
8643 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338644 EXPECT_EQ(ERR_NAME_NOT_RESOLVED,
Zhongyi Shia6b68d112018-09-24 07:49:038645 request.Request(
8646 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8647 SocketTag(),
8648 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8649 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:008650
8651 // WaitForHostResolution() should return false since host
8652 // resolution has failed already.
8653 TestCompletionCallback host_resolution_callback;
8654 EXPECT_FALSE(
8655 request.WaitForHostResolution(host_resolution_callback.callback()));
8656 base::RunLoop().RunUntilIdle();
8657 EXPECT_FALSE(host_resolution_callback.have_result());
8658}
8659
8660// Verify ResultAfterHostResolutionCallback behavior when host resolution fails
8661// asynchronously.
8662TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackFailAsync) {
8663 Initialize();
8664 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8665 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8666
Renjiea0cb4a2c2018-09-26 23:37:308667 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
Yixin Wang7c5d11a82017-12-21 02:40:008668
8669 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338670 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038671 request.Request(
8672 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8673 SocketTag(),
8674 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8675 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:008676
8677 TestCompletionCallback host_resolution_callback;
8678 EXPECT_TRUE(
8679 request.WaitForHostResolution(host_resolution_callback.callback()));
8680
8681 // Allow |host_resolver_| to fail host resolution. |host_resolution_callback|
8682 // Should run with ERR_NAME_NOT_RESOLVED since that's the error host
8683 // resolution failed with.
8684 base::RunLoop().RunUntilIdle();
8685 EXPECT_TRUE(host_resolution_callback.have_result());
8686 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, host_resolution_callback.WaitForResult());
8687
8688 EXPECT_TRUE(callback_.have_result());
8689 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
8690}
8691
Renjiea0cb4a2c2018-09-26 23:37:308692// With dns race experiment turned on, and DNS resolve succeeds synchronously,
8693// the final connection is established through the resolved DNS. No racing
8694// connection.
8695TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceAndHostResolutionSync) {
8696 race_stale_dns_on_connection_ = true;
8697 host_resolver_ = std::make_unique<MockCachingHostResolver>();
8698 Initialize();
8699 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8700 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8701
8702 // Set an address in resolver for synchronous return.
8703 host_resolver_->set_synchronous_mode(true);
8704 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
8705 kNonCachedIPAddress, "");
8706
8707 // Set up a different address in stale resolver cache.
8708 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
8709 HostCache::Entry entry(OK,
8710 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
8711 HostCache::Entry::SOURCE_DNS);
8712 base::TimeDelta zero;
8713 HostCache* cache = host_resolver_->GetHostCache();
8714 cache->Set(key, entry, base::TimeTicks::Now(), zero);
8715 // Expire the cache
8716 cache->OnNetworkChange();
Renjie8d2d8d91b2018-09-29 00:29:038717
Renjiea0cb4a2c2018-09-26 23:37:308718 MockQuicData quic_data;
8719 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
8720 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
8721 quic_data.AddSocketDataToFactory(socket_factory_.get());
8722
8723 QuicStreamRequest request(factory_.get());
8724 EXPECT_THAT(request.Request(
8725 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8726 SocketTag(),
8727 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8728 failed_on_default_network_callback_, callback_.callback()),
8729 IsOk());
8730 std::unique_ptr<HttpStream> stream = CreateStream(&request);
8731 EXPECT_TRUE(stream.get());
8732 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
8733 EXPECT_EQ(
8734 session->peer_address().impl().socket_address().ToStringWithoutPort(),
8735 kNonCachedIPAddress);
8736
8737 EXPECT_TRUE(quic_data.AllReadDataConsumed());
8738 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
8739}
8740
8741// With dns race experiment on, DNS resolve returns async, no matching cache in
8742// host resolver, connection should be successful and through resolved DNS. No
8743// racing connection.
8744TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceAndHostResolutionAsync) {
8745 race_stale_dns_on_connection_ = true;
8746 host_resolver_ = std::make_unique<MockCachingHostResolver>();
8747 Initialize();
8748 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8749 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8750
8751 // Set an address in resolver for asynchronous return.
8752 host_resolver_->set_ondemand_mode(true);
8753 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
8754 kNonCachedIPAddress, "");
8755
8756 MockQuicData quic_data;
8757 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
8758 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
8759 quic_data.AddSocketDataToFactory(socket_factory_.get());
8760
8761 QuicStreamRequest request(factory_.get());
8762 EXPECT_EQ(ERR_IO_PENDING,
8763 request.Request(
8764 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8765 SocketTag(),
8766 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8767 failed_on_default_network_callback_, callback_.callback()));
8768 TestCompletionCallback host_resolution_callback;
8769 EXPECT_TRUE(
8770 request.WaitForHostResolution(host_resolution_callback.callback()));
8771 base::RunLoop().RunUntilIdle();
8772 EXPECT_FALSE(host_resolution_callback.have_result());
8773
8774 // Cause the host resolution to return.
8775 host_resolver_->ResolveAllPending();
8776 EXPECT_THAT(host_resolution_callback.WaitForResult(), IsOk());
8777 EXPECT_THAT(callback_.WaitForResult(), IsOk());
8778
8779 std::unique_ptr<HttpStream> stream = CreateStream(&request);
8780 EXPECT_TRUE(stream.get());
8781 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
8782
8783 EXPECT_EQ(
8784 session->peer_address().impl().socket_address().ToStringWithoutPort(),
8785 kNonCachedIPAddress);
8786
8787 EXPECT_TRUE(quic_data.AllReadDataConsumed());
8788 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
8789}
8790
8791// With dns race experiment on, DNS resolve returns async, stale dns used,
8792// connects synchrounously, and then the resolved DNS matches.
8793TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsyncStaleMatch) {
8794 race_stale_dns_on_connection_ = true;
8795 host_resolver_ = std::make_unique<MockCachingHostResolver>();
8796 Initialize();
8797 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8798 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8799
8800 // Set an address in resolver for asynchronous return.
8801 host_resolver_->set_ondemand_mode(true);
8802 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
8803 kCachedIPAddress.ToString(), "");
8804
8805 // Set up the same address in the stale resolver cache.
8806 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
8807 HostCache::Entry entry(OK,
8808 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
8809 HostCache::Entry::SOURCE_DNS);
8810 base::TimeDelta zero;
8811 HostCache* cache = host_resolver_->GetHostCache();
8812 cache->Set(key, entry, base::TimeTicks::Now(), zero);
8813 // Expire the cache
8814 cache->OnNetworkChange();
8815
8816 MockQuicData quic_data;
8817 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
8818 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
8819 quic_data.AddSocketDataToFactory(socket_factory_.get());
8820
8821 QuicStreamRequest request(factory_.get());
8822 EXPECT_EQ(ERR_IO_PENDING,
8823 request.Request(
8824 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8825 SocketTag(),
8826 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8827 failed_on_default_network_callback_, callback_.callback()));
8828
8829 // Check that the racing job is running.
8830 EXPECT_TRUE(HasLiveSession(host_port_pair_));
8831 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
8832
8833 // Resolve dns and return.
8834 host_resolver_->ResolveAllPending();
8835 EXPECT_THAT(callback_.WaitForResult(), IsOk());
8836 std::unique_ptr<HttpStream> stream = CreateStream(&request);
8837 EXPECT_TRUE(stream.get());
8838
8839 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
8840
8841 EXPECT_EQ(
8842 session->peer_address().impl().socket_address().ToStringWithoutPort(),
8843 kCachedIPAddress.ToString());
8844
8845 EXPECT_TRUE(quic_data.AllReadDataConsumed());
8846 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
8847}
8848
8849// With dns race experiment on, dns resolve async, stale dns used, connect
8850// async, and then the result matches.
8851TEST_P(QuicStreamFactoryTest,
8852 ResultAfterDNSRaceHostResolveAsyncConnectAsyncStaleMatch) {
8853 race_stale_dns_on_connection_ = true;
8854 host_resolver_ = std::make_unique<MockCachingHostResolver>();
8855 Initialize();
8856 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8857 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8858
8859 // Set an address in resolver for asynchronous return.
8860 host_resolver_->set_ondemand_mode(true);
8861 factory_->set_require_confirmation(true);
8862 crypto_client_stream_factory_.set_handshake_mode(
8863 MockCryptoClientStream::ZERO_RTT);
8864 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
8865 kCachedIPAddress.ToString(), "");
8866
8867 // Set up the same address in the stale resolver cache.
8868 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
8869 HostCache::Entry entry(OK,
8870 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
8871 HostCache::Entry::SOURCE_DNS);
8872 base::TimeDelta zero;
8873 HostCache* cache = host_resolver_->GetHostCache();
8874 cache->Set(key, entry, base::TimeTicks::Now(), zero);
8875 // Expire the cache
8876 cache->OnNetworkChange();
8877
8878 MockQuicData quic_data;
8879 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
8880 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
8881 quic_data.AddSocketDataToFactory(socket_factory_.get());
8882
8883 QuicStreamRequest request(factory_.get());
8884 EXPECT_EQ(ERR_IO_PENDING,
8885 request.Request(
8886 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8887 SocketTag(),
8888 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8889 failed_on_default_network_callback_, callback_.callback()));
8890
8891 // Send Crypto handshake so connect will call back.
8892 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
8893 quic::QuicSession::HANDSHAKE_CONFIRMED);
8894 base::RunLoop().RunUntilIdle();
8895
8896 // Check that the racing job is running.
8897 EXPECT_TRUE(HasLiveSession(host_port_pair_));
8898 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
8899
8900 // Resolve dns and call back, make sure job finishes.
8901 host_resolver_->ResolveAllPending();
8902 EXPECT_THAT(callback_.WaitForResult(), IsOk());
8903
8904 std::unique_ptr<HttpStream> stream = CreateStream(&request);
8905 EXPECT_TRUE(stream.get());
8906
8907 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
8908
8909 EXPECT_EQ(
8910 session->peer_address().impl().socket_address().ToStringWithoutPort(),
8911 kCachedIPAddress.ToString());
8912
8913 EXPECT_TRUE(quic_data.AllReadDataConsumed());
8914 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
8915}
8916
8917// With dns race experiment on, dns resolve async, stale dns used, dns resolve
8918// return, then connection finishes and matches with the result.
8919TEST_P(QuicStreamFactoryTest,
8920 ResultAfterDNSRaceHostResolveAsyncStaleMatchConnectAsync) {
8921 race_stale_dns_on_connection_ = true;
8922 host_resolver_ = std::make_unique<MockCachingHostResolver>();
8923 Initialize();
8924 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8925 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8926
8927 // Set an address in resolver for asynchronous return.
8928 host_resolver_->set_ondemand_mode(true);
8929 factory_->set_require_confirmation(true);
8930 crypto_client_stream_factory_.set_handshake_mode(
8931 MockCryptoClientStream::ZERO_RTT);
8932 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
8933 kCachedIPAddress.ToString(), "");
8934
8935 // Set up the same address in the stale resolver cache.
8936 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
8937 HostCache::Entry entry(OK,
8938 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
8939 HostCache::Entry::SOURCE_DNS);
8940 base::TimeDelta zero;
8941 HostCache* cache = host_resolver_->GetHostCache();
8942 cache->Set(key, entry, base::TimeTicks::Now(), zero);
8943 // Expire the cache
8944 cache->OnNetworkChange();
8945
8946 MockQuicData quic_data;
8947 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
8948 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
8949 quic_data.AddSocketDataToFactory(socket_factory_.get());
8950
8951 QuicStreamRequest request(factory_.get());
8952 EXPECT_EQ(ERR_IO_PENDING,
8953 request.Request(
8954 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8955 SocketTag(),
8956 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8957 failed_on_default_network_callback_, callback_.callback()));
8958
8959 // Finish dns async, check we still need to wait for stale connection async.
8960 host_resolver_->ResolveAllPending();
8961 base::RunLoop().RunUntilIdle();
8962 EXPECT_FALSE(callback_.have_result());
8963
8964 // Finish stale connection async, and the stale connection should pass dns
8965 // validation.
8966 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
8967 quic::QuicSession::HANDSHAKE_CONFIRMED);
8968 EXPECT_THAT(callback_.WaitForResult(), IsOk());
8969 std::unique_ptr<HttpStream> stream = CreateStream(&request);
8970 EXPECT_TRUE(stream.get());
8971
8972 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
8973 EXPECT_EQ(
8974 session->peer_address().impl().socket_address().ToStringWithoutPort(),
8975 kCachedIPAddress.ToString());
8976
8977 EXPECT_TRUE(quic_data.AllReadDataConsumed());
8978 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
8979}
8980
8981// With dns race experiment on, dns resolve async, stale used and connects
8982// sync, but dns no match
8983TEST_P(QuicStreamFactoryTest,
8984 ResultAfterDNSRaceHostResolveAsyncStaleSyncNoMatch) {
8985 race_stale_dns_on_connection_ = true;
8986 host_resolver_ = std::make_unique<MockCachingHostResolver>();
8987 Initialize();
8988 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8989 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8990
8991 // Set an address in resolver for asynchronous return.
8992 host_resolver_->set_ondemand_mode(true);
8993 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
8994 kNonCachedIPAddress, "");
8995
8996 // Set up a different address in the stale resolver cache.
8997 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
8998 HostCache::Entry entry(OK,
8999 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9000 HostCache::Entry::SOURCE_DNS);
9001 base::TimeDelta zero;
9002 HostCache* cache = host_resolver_->GetHostCache();
9003 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9004 // Expire the cache
9005 cache->OnNetworkChange();
9006
9007 // Socket for the stale connection which will invoke connection closure.
9008 MockQuicData quic_data;
9009 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9010 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9011 quic_data.AddWrite(
9012 SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
9013 2, true, quic::QUIC_CONNECTION_CANCELLED, "net error"));
9014 quic_data.AddSocketDataToFactory(socket_factory_.get());
9015
9016 // Socket for the new connection.
9017 MockQuicData quic_data2;
9018 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9019 quic_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9020 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9021
9022 QuicStreamRequest request(factory_.get());
9023 EXPECT_EQ(ERR_IO_PENDING,
9024 request.Request(
9025 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9026 SocketTag(),
9027 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9028 failed_on_default_network_callback_, callback_.callback()));
9029
9030 // Check the stale connection is running.
9031 EXPECT_TRUE(HasLiveSession(host_port_pair_));
9032 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9033
9034 // Finish dns resolution and check the job has finished.
9035 host_resolver_->ResolveAllPending();
9036 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9037
9038 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9039 EXPECT_TRUE(stream.get());
9040
9041 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9042
9043 EXPECT_EQ(
9044 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9045 kNonCachedIPAddress);
9046
9047 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9048 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9049 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
9050 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
9051}
9052
9053// With dns race experiment on, dns resolve async, stale used and connects
9054// async, finishes before dns, but no match
9055TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleAsyncResolveAsyncNoMatch) {
9056 race_stale_dns_on_connection_ = true;
9057 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9058 Initialize();
9059 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9060 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9061
9062 // Set an address in resolver for asynchronous return.
9063 host_resolver_->set_ondemand_mode(true);
9064 factory_->set_require_confirmation(true);
9065 crypto_client_stream_factory_.set_handshake_mode(
9066 MockCryptoClientStream::ZERO_RTT);
9067 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9068 kNonCachedIPAddress, "");
9069
9070 // Set up a different address in the stale resolvercache.
9071 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9072 HostCache::Entry entry(OK,
9073 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9074 HostCache::Entry::SOURCE_DNS);
9075 base::TimeDelta zero;
9076 HostCache* cache = host_resolver_->GetHostCache();
9077 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9078 // Expire the cache
9079 cache->OnNetworkChange();
9080
9081 MockQuicData quic_data;
9082 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9083 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9084 quic_data.AddWrite(
9085 SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
9086 2, true, quic::QUIC_CONNECTION_CANCELLED, "net error"));
9087 quic_data.AddSocketDataToFactory(socket_factory_.get());
9088
9089 MockQuicData quic_data2;
9090 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9091 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9092
9093 QuicStreamRequest request(factory_.get());
9094 EXPECT_EQ(ERR_IO_PENDING,
9095 request.Request(
9096 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9097 SocketTag(),
9098 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9099 failed_on_default_network_callback_, callback_.callback()));
9100
9101 // Finish the stale connection.
9102 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
9103 quic::QuicSession::HANDSHAKE_CONFIRMED);
9104 base::RunLoop().RunUntilIdle();
9105 EXPECT_TRUE(HasLiveSession(host_port_pair_));
9106 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9107
9108 // Finish host resolution and check the job is done.
9109 host_resolver_->ResolveAllPending();
9110 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9111
9112 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9113 EXPECT_TRUE(stream.get());
9114
9115 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9116 EXPECT_EQ(
9117 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9118 kNonCachedIPAddress);
9119
9120 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9121 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9122 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
9123 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
9124}
9125
9126// With dns race experiment on, dns resolve async, stale used and connects
9127// async, dns finishes first, but no match
9128TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceResolveAsyncStaleAsyncNoMatch) {
9129 race_stale_dns_on_connection_ = true;
9130 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9131 Initialize();
9132 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9133 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9134
9135 // Set an address in resolver for asynchronous return.
9136 host_resolver_->set_ondemand_mode(true);
9137 factory_->set_require_confirmation(true);
9138 crypto_client_stream_factory_.set_handshake_mode(
9139 MockCryptoClientStream::ZERO_RTT);
9140 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9141 kNonCachedIPAddress, "");
9142
9143 // Set up a different address in the stale resolver cache.
9144 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9145 HostCache::Entry entry(OK,
9146 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9147 HostCache::Entry::SOURCE_DNS);
9148 base::TimeDelta zero;
9149 HostCache* cache = host_resolver_->GetHostCache();
9150 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9151 // Expire the cache
9152 cache->OnNetworkChange();
9153
9154 MockQuicData quic_data;
9155 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Renjie8d2d8d91b2018-09-29 00:29:039156 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_INITIAL);
Renjiea0cb4a2c2018-09-26 23:37:309157 quic_data.AddWrite(
9158 SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
Renjie8d2d8d91b2018-09-29 00:29:039159 1, true, quic::QUIC_CONNECTION_CANCELLED, "net error"));
Renjiea0cb4a2c2018-09-26 23:37:309160 quic_data.AddSocketDataToFactory(socket_factory_.get());
9161
9162 MockQuicData quic_data2;
9163 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Renjie8d2d8d91b2018-09-29 00:29:039164 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_FORWARD_SECURE);
9165 quic_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Renjiea0cb4a2c2018-09-26 23:37:309166 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9167
9168 QuicStreamRequest request(factory_.get());
9169 EXPECT_EQ(ERR_IO_PENDING,
9170 request.Request(
9171 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9172 SocketTag(),
9173 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9174 failed_on_default_network_callback_, callback_.callback()));
9175 // Finish dns resolution, but need to wait for stale connection.
9176 host_resolver_->ResolveAllPending();
Renjie8d2d8d91b2018-09-29 00:29:039177 base::RunLoop().RunUntilIdle();
Renjiea0cb4a2c2018-09-26 23:37:309178 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
9179 quic::QuicSession::HANDSHAKE_CONFIRMED);
9180 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9181
9182 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9183 EXPECT_TRUE(stream.get());
9184
9185 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9186 EXPECT_EQ(
9187 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9188 kNonCachedIPAddress);
9189
9190 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9191 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9192 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
9193 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
9194}
9195
9196// With dns race experiment on, dns resolve returns error sync, same behavior
9197// as experiment is not on
9198TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveError) {
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 synchronous failure in resolver.
9206 host_resolver_->set_synchronous_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_NAME_NOT_RESOLVED,
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
9221// With dns race experiment on, no cache available, dns resolve returns error
9222// async
9223TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsyncError) {
9224 race_stale_dns_on_connection_ = true;
9225 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9226 Initialize();
9227 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9228 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9229
9230 // Set asynchronous failure in resolver.
9231 host_resolver_->set_ondemand_mode(true);
9232 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
9233
9234 MockQuicData quic_data;
9235 quic_data.AddSocketDataToFactory(socket_factory_.get());
9236 QuicStreamRequest request(factory_.get());
9237
9238 EXPECT_EQ(ERR_IO_PENDING,
9239 request.Request(
9240 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9241 SocketTag(),
9242 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9243 failed_on_default_network_callback_, callback_.callback()));
9244
9245 // Resolve and expect result that shows the resolution error.
9246 host_resolver_->ResolveAllPending();
9247 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
9248}
9249
9250// With dns race experiment on, dns resolve async, staled used and connects
9251// sync, dns returns error and no connection is established.
9252TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleSyncHostResolveError) {
9253 race_stale_dns_on_connection_ = true;
9254 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9255 Initialize();
9256 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9257 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9258
9259 // Set asynchronous failure in resolver.
9260 host_resolver_->set_ondemand_mode(true);
9261 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
9262
9263 // Set up an address in the stale cache.
9264 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9265 HostCache::Entry entry(OK,
9266 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9267 HostCache::Entry::SOURCE_DNS);
9268 base::TimeDelta zero;
9269 HostCache* cache = host_resolver_->GetHostCache();
9270 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9271 // Expire the cache
9272 cache->OnNetworkChange();
9273
9274 // Socket for the stale connection which is supposed to disconnect.
9275 MockQuicData quic_data;
9276 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9277 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9278 quic_data.AddWrite(
9279 SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
9280 2, true, quic::QUIC_CONNECTION_CANCELLED, "net error"));
9281 quic_data.AddSocketDataToFactory(socket_factory_.get());
9282
9283 QuicStreamRequest request(factory_.get());
9284 EXPECT_EQ(ERR_IO_PENDING,
9285 request.Request(
9286 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9287 SocketTag(),
9288 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9289 failed_on_default_network_callback_, callback_.callback()));
9290
9291 // Check that the stale connection is running.
9292 EXPECT_TRUE(HasLiveSession(host_port_pair_));
9293 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9294
9295 // Finish host resolution.
9296 host_resolver_->ResolveAllPending();
9297 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
9298
Renjiea0cb4a2c2018-09-26 23:37:309299 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9300 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9301}
9302
9303// With dns race experiment on, dns resolve async, stale used and connection
9304// return error, then dns matches
9305TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSMatches) {
9306 race_stale_dns_on_connection_ = true;
9307 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9308 Initialize();
9309 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9310 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9311
9312 // Set an address in host resolver for asynchronous return.
9313 host_resolver_->set_ondemand_mode(true);
9314 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9315 kCachedIPAddress.ToString(), "");
9316
9317 // Set up the same address in the stale resolver cache.
9318 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9319 HostCache::Entry entry(OK,
9320 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9321 HostCache::Entry::SOURCE_DNS);
9322 base::TimeDelta zero;
9323 HostCache* cache = host_resolver_->GetHostCache();
9324 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9325 // Expire the cache
9326 cache->OnNetworkChange();
9327
9328 // Simulate synchronous connect failure.
9329 MockQuicData quic_data;
9330 quic_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
9331 quic_data.AddSocketDataToFactory(socket_factory_.get());
9332
9333 MockQuicData quic_data2;
9334 quic_data2.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
9335 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9336
9337 QuicStreamRequest request(factory_.get());
9338 EXPECT_EQ(ERR_IO_PENDING,
9339 request.Request(
9340 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9341 SocketTag(),
9342 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9343 failed_on_default_network_callback_, callback_.callback()));
9344 EXPECT_FALSE(HasLiveSession(host_port_pair_));
9345 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9346
9347 host_resolver_->ResolveAllPending();
9348 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_ADDRESS_IN_USE));
9349}
9350
9351// With dns race experiment on, dns resolve async, stale used and connection
9352// returns error, dns no match, new connection is established
9353TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSNoMatch) {
9354 race_stale_dns_on_connection_ = true;
9355 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9356 Initialize();
9357 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9358 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9359
9360 // Set an address in host resolver.
9361 host_resolver_->set_ondemand_mode(true);
9362 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9363 kNonCachedIPAddress, "");
9364
9365 // Set up a different address in stale resolver cache.
9366 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9367 HostCache::Entry entry(OK,
9368 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9369 HostCache::Entry::SOURCE_DNS);
9370 base::TimeDelta zero;
9371 HostCache* cache = host_resolver_->GetHostCache();
9372 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9373 // Expire the cache
9374 cache->OnNetworkChange();
9375
9376 // Add failure for the stale connection.
9377 MockQuicData quic_data;
9378 quic_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
9379 quic_data.AddSocketDataToFactory(socket_factory_.get());
9380
9381 MockQuicData quic_data2;
9382 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9383 quic_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9384 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9385
9386 QuicStreamRequest request(factory_.get());
9387 EXPECT_EQ(ERR_IO_PENDING,
9388 request.Request(
9389 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9390 SocketTag(),
9391 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9392 failed_on_default_network_callback_, callback_.callback()));
9393
9394 // Check that the stale connection fails.
9395 EXPECT_FALSE(HasLiveSession(host_port_pair_));
9396 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9397
9398 // Finish host resolution and check the job finishes ok.
9399 host_resolver_->ResolveAllPending();
9400 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9401
9402 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9403 EXPECT_TRUE(stream.get());
9404
9405 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9406
9407 EXPECT_EQ(
9408 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9409 kNonCachedIPAddress);
9410
9411 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
9412 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
9413}
9414
9415// With dns race experiment on, dns resolve async, stale used and connection
9416// returns error, dns no match, new connection error
9417TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSNoMatchError) {
9418 race_stale_dns_on_connection_ = true;
9419 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9420 Initialize();
9421 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9422 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9423
9424 // Set an address in host resolver asynchronously.
9425 host_resolver_->set_ondemand_mode(true);
9426 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9427 kNonCachedIPAddress, "");
9428
9429 // Set up a different address in the stale cache.
9430 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9431 HostCache::Entry entry(OK,
9432 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9433 HostCache::Entry::SOURCE_DNS);
9434 base::TimeDelta zero;
9435 HostCache* cache = host_resolver_->GetHostCache();
9436 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9437 // Expire the cache
9438 cache->OnNetworkChange();
9439
9440 // Add failure for stale connection.
9441 MockQuicData quic_data;
9442 quic_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
9443 quic_data.AddSocketDataToFactory(socket_factory_.get());
9444
9445 // Add failure for resolved dns connection.
9446 MockQuicData quic_data2;
9447 quic_data2.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
9448 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9449
9450 QuicStreamRequest request(factory_.get());
9451 EXPECT_EQ(ERR_IO_PENDING,
9452 request.Request(
9453 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9454 SocketTag(),
9455 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9456 failed_on_default_network_callback_, callback_.callback()));
9457
9458 // Check the stale connection fails.
9459 EXPECT_FALSE(HasLiveSession(host_port_pair_));
9460 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9461
9462 // Check the resolved dns connection fails.
9463 host_resolver_->ResolveAllPending();
9464 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_ADDRESS_IN_USE));
9465}
9466
9467// With dns race experiment on, dns resolve async and stale connect async, dns
9468// resolve returns error and then preconnect finishes
9469TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceResolveAsyncErrorStaleAsync) {
9470 race_stale_dns_on_connection_ = true;
9471 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9472 Initialize();
9473 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9474 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9475
9476 // Add asynchronous failure in host resolver.
9477 host_resolver_->set_ondemand_mode(true);
9478 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
9479 factory_->set_require_confirmation(true);
9480 crypto_client_stream_factory_.set_handshake_mode(
9481 MockCryptoClientStream::ZERO_RTT);
9482
9483 // Set up an address in stale resolver cache.
9484 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9485 HostCache::Entry entry(OK,
9486 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9487 HostCache::Entry::SOURCE_DNS);
9488 base::TimeDelta zero;
9489 HostCache* cache = host_resolver_->GetHostCache();
9490 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9491 // Expire the cache
9492 cache->OnNetworkChange();
9493
9494 // Socket data for stale connection which is supposed to disconnect.
9495 MockQuicData quic_data;
9496 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9497 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_INITIAL);
9498 quic_data.AddWrite(
9499 SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
9500 1, true, quic::QUIC_CONNECTION_CANCELLED, "net error"));
9501 quic_data.AddSocketDataToFactory(socket_factory_.get());
9502
9503 QuicStreamRequest request(factory_.get());
9504 EXPECT_EQ(ERR_IO_PENDING,
9505 request.Request(
9506 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9507 SocketTag(),
9508 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9509 failed_on_default_network_callback_, callback_.callback()));
9510
9511 // host resolution returned but stale connection hasn't finished yet.
9512 host_resolver_->ResolveAllPending();
9513 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
9514
9515 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9516 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9517}
9518
9519// With dns race experiment on, dns resolve async and stale connect async, dns
Renjiea0cb4a2c2018-09-26 23:37:309520// resolve returns error and then preconnect fails.
9521TEST_P(QuicStreamFactoryTest,
9522 ResultAfterDNSRaceResolveAsyncErrorStaleAsyncError) {
9523 race_stale_dns_on_connection_ = true;
9524 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9525 Initialize();
9526 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9527 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9528
9529 // Add asynchronous failure to host resolver.
9530 host_resolver_->set_ondemand_mode(true);
9531 factory_->set_require_confirmation(true);
9532 crypto_client_stream_factory_.set_handshake_mode(
9533 MockCryptoClientStream::ZERO_RTT);
9534 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
9535
9536 // Set up an address in stale resolver cache.
9537 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9538 HostCache::Entry entry(OK,
9539 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9540 HostCache::Entry::SOURCE_DNS);
9541 base::TimeDelta zero;
9542 HostCache* cache = host_resolver_->GetHostCache();
9543 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9544 // Expire the cache
9545 cache->OnNetworkChange();
9546
9547 MockQuicData quic_data;
9548 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9549 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_INITIAL);
9550 quic_data.AddWrite(
9551 SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
9552 1, true, quic::QUIC_CONNECTION_CANCELLED, "net error"));
9553 quic_data.AddSocketDataToFactory(socket_factory_.get());
9554
9555 QuicStreamRequest request(factory_.get());
9556 EXPECT_EQ(ERR_IO_PENDING,
9557 request.Request(
9558 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9559 SocketTag(),
9560 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9561 failed_on_default_network_callback_, callback_.callback()));
9562
9563 // Host Resolution returns failure but stale connection hasn't finished.
9564 host_resolver_->ResolveAllPending();
9565
9566 // Check that the final error is on resolution failure.
9567 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
9568
9569 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9570}
9571
9572// With dns race experiment on, test that host resolution callback behaves
9573// normal as experiment is not on
9574TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsync) {
9575 race_stale_dns_on_connection_ = true;
9576 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9577 Initialize();
9578 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9579 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9580
9581 host_resolver_->set_ondemand_mode(true);
9582 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9583 kNonCachedIPAddress, "");
9584
9585 MockQuicData quic_data;
9586 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9587 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9588 quic_data.AddSocketDataToFactory(socket_factory_.get());
9589
9590 QuicStreamRequest request(factory_.get());
9591 EXPECT_EQ(ERR_IO_PENDING,
9592 request.Request(
9593 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9594 SocketTag(),
9595 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9596 failed_on_default_network_callback_, callback_.callback()));
9597
9598 // Check that expect_on_host_resolution_ is properlly set.
9599 TestCompletionCallback host_resolution_callback;
9600 EXPECT_TRUE(
9601 request.WaitForHostResolution(host_resolution_callback.callback()));
9602 base::RunLoop().RunUntilIdle();
9603 EXPECT_FALSE(host_resolution_callback.have_result());
9604
9605 host_resolver_->ResolveAllPending();
9606 EXPECT_THAT(host_resolution_callback.WaitForResult(), IsOk());
9607
9608 // Check that expect_on_host_resolution_ is flipped back.
9609 EXPECT_FALSE(
9610 request.WaitForHostResolution(host_resolution_callback.callback()));
9611
9612 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9613 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9614}
9615
Paul Jensen8e3c5d32018-02-19 17:06:339616// Test that QuicStreamRequests with similar and different tags results in
9617// reused and unique QUIC streams using appropriately tagged sockets.
9618TEST_P(QuicStreamFactoryTest, Tag) {
9619 MockTaggingClientSocketFactory* socket_factory =
9620 new MockTaggingClientSocketFactory();
9621 socket_factory_.reset(socket_factory);
9622 Initialize();
9623 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9624 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9625
9626 // Prepare to establish two QUIC sessions.
9627 MockQuicData socket_data;
9628 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:439629 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Paul Jensen8e3c5d32018-02-19 17:06:339630 socket_data.AddSocketDataToFactory(socket_factory_.get());
9631 MockQuicData socket_data2;
9632 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:439633 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Paul Jensen8e3c5d32018-02-19 17:06:339634 socket_data2.AddSocketDataToFactory(socket_factory_.get());
9635
9636#if defined(OS_ANDROID)
9637 SocketTag tag1(SocketTag::UNSET_UID, 0x12345678);
9638 SocketTag tag2(getuid(), 0x87654321);
9639#else
9640 // On non-Android platforms we can only use the default constructor.
9641 SocketTag tag1, tag2;
9642#endif
9643
9644 // Request a stream with |tag1|.
9645 QuicStreamRequest request1(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:039646 int rv = request1.Request(
9647 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, tag1,
9648 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9649 failed_on_default_network_callback_, callback_.callback());
Paul Jensen8e3c5d32018-02-19 17:06:339650 EXPECT_THAT(callback_.GetResult(rv), IsOk());
9651 EXPECT_EQ(socket_factory->GetLastProducedUDPSocket()->tag(), tag1);
9652 EXPECT_TRUE(socket_factory->GetLastProducedUDPSocket()
9653 ->tagged_before_data_transferred());
9654 std::unique_ptr<QuicChromiumClientSession::Handle> stream1 =
9655 request1.ReleaseSessionHandle();
9656 EXPECT_TRUE(stream1);
9657 EXPECT_TRUE(stream1->IsConnected());
9658
9659 // Request a stream with |tag1| and verify underlying session is reused.
9660 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:039661 rv = request2.Request(
9662 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, tag1,
9663 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9664 failed_on_default_network_callback_, callback_.callback());
Paul Jensen8e3c5d32018-02-19 17:06:339665 EXPECT_THAT(callback_.GetResult(rv), IsOk());
9666 std::unique_ptr<QuicChromiumClientSession::Handle> stream2 =
9667 request2.ReleaseSessionHandle();
9668 EXPECT_TRUE(stream2);
9669 EXPECT_TRUE(stream2->IsConnected());
9670 EXPECT_TRUE(stream2->SharesSameSession(*stream1));
9671
9672 // Request a stream with |tag2| and verify a new session is created.
9673 QuicStreamRequest request3(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:039674 rv = request3.Request(
9675 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, tag2,
9676 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9677 failed_on_default_network_callback_, callback_.callback());
Paul Jensen8e3c5d32018-02-19 17:06:339678 EXPECT_THAT(callback_.GetResult(rv), IsOk());
9679 EXPECT_EQ(socket_factory->GetLastProducedUDPSocket()->tag(), tag2);
9680 EXPECT_TRUE(socket_factory->GetLastProducedUDPSocket()
9681 ->tagged_before_data_transferred());
9682 std::unique_ptr<QuicChromiumClientSession::Handle> stream3 =
9683 request3.ReleaseSessionHandle();
9684 EXPECT_TRUE(stream3);
9685 EXPECT_TRUE(stream3->IsConnected());
9686#if defined(OS_ANDROID)
9687 EXPECT_FALSE(stream3->SharesSameSession(*stream1));
9688#else
9689 // Same tag should reuse session.
9690 EXPECT_TRUE(stream3->SharesSameSession(*stream1));
9691#endif
9692}
9693
[email protected]e13201d82012-12-12 05:00:329694} // namespace test
[email protected]e13201d82012-12-12 05:00:329695} // namespace net