blob: 39ad1dd33a8711878d68b0d28778cc5095c78c0e [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 Shic16b4102019-02-12 00:37:4016#include "base/test/simple_test_tick_clock.h"
Zhongyi Shic4823bd2018-04-27 00:49:1917#include "base/test/test_mock_time_task_runner.h"
Paul Jensen8e3c5d32018-02-19 17:06:3318#include "build/build_config.h"
mgershaf9a9232017-04-13 20:19:0319#include "net/base/mock_network_change_notifier.h"
rsleevid6de8302016-06-21 01:33:2020#include "net/cert/ct_policy_enforcer.h"
Ryan Sleevi987d2d92017-12-19 19:22:1421#include "net/cert/do_nothing_ct_verifier.h"
22#include "net/cert/mock_cert_verifier.h"
[email protected]f2cb3cf2013-03-21 01:40:5323#include "net/dns/mock_host_resolver.h"
[email protected]e13201d82012-12-12 05:00:3224#include "net/http/http_response_headers.h"
25#include "net/http/http_response_info.h"
rtenneti8332ba52015-09-17 19:33:4126#include "net/http/http_server_properties_impl.h"
[email protected]e13201d82012-12-12 05:00:3227#include "net/http/http_util.h"
[email protected]080b77932014-08-04 01:22:4628#include "net/http/transport_security_state.h"
Matt Mueller230996f12018-10-22 19:39:4429#include "net/http/transport_security_state_test_util.h"
Ryan Hamiltona3ee93a72018-08-01 22:03:0830#include "net/quic/crypto/proof_verifier_chromium.h"
31#include "net/quic/mock_crypto_client_stream_factory.h"
32#include "net/quic/mock_quic_data.h"
33#include "net/quic/properties_based_quic_server_info.h"
34#include "net/quic/quic_http_stream.h"
35#include "net/quic/quic_http_utils.h"
36#include "net/quic/quic_server_info.h"
37#include "net/quic/quic_stream_factory_peer.h"
38#include "net/quic/quic_test_packet_maker.h"
39#include "net/quic/test_task_runner.h"
bnc3472afd2016-11-17 15:27:2140#include "net/socket/next_proto.h"
[email protected]e13201d82012-12-12 05:00:3241#include "net/socket/socket_test_util.h"
Bence Béky94658bf2018-05-11 19:22:5842#include "net/spdy/spdy_session_test_util.h"
43#include "net/spdy/spdy_test_util_common.h"
[email protected]eed749f92013-12-23 18:57:3844#include "net/test/cert_test_util.h"
robpercival214763f2016-07-01 23:27:0145#include "net/test/gtest_util.h"
rsleevia69c79a2016-06-22 03:28:4346#include "net/test/test_data_directory.h"
Bence Béky98447b12018-05-08 03:14:0147#include "net/test/test_with_scoped_task_environment.h"
Ryan Hamilton56b10c5d2018-05-11 13:40:1648#include "net/third_party/quic/core/crypto/crypto_handshake.h"
49#include "net/third_party/quic/core/crypto/quic_crypto_client_config.h"
50#include "net/third_party/quic/core/crypto/quic_decrypter.h"
51#include "net/third_party/quic/core/crypto/quic_encrypter.h"
Victor Vasilievc5b409c22018-07-24 12:23:4652#include "net/third_party/quic/core/http/quic_client_promised_info.h"
David Schinazic8281052019-01-24 06:14:1753#include "net/third_party/quic/core/quic_utils.h"
Ryan Hamilton56b10c5d2018-05-11 13:40:1654#include "net/third_party/quic/platform/api/quic_test.h"
55#include "net/third_party/quic/test_tools/mock_clock.h"
56#include "net/third_party/quic/test_tools/mock_random.h"
57#include "net/third_party/quic/test_tools/quic_config_peer.h"
58#include "net/third_party/quic/test_tools/quic_spdy_session_peer.h"
59#include "net/third_party/quic/test_tools/quic_test_utils.h"
Victor Vasiliev27cc7712019-01-24 11:50:1460#include "net/third_party/quiche/src/spdy/core/spdy_test_utils.h"
Ramin Halavati683bcaa92018-02-14 08:42:3961#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
robpercival214763f2016-07-01 23:27:0162#include "testing/gmock/include/gmock/gmock.h"
[email protected]e13201d82012-12-12 05:00:3263#include "testing/gtest/include/gtest/gtest.h"
msramek992625ec2016-08-04 18:33:5864#include "url/gurl.h"
[email protected]e13201d82012-12-12 05:00:3265
[email protected]6e12d702013-11-13 00:17:1766using std::string;
[email protected]6e12d702013-11-13 00:17:1767
[email protected]e13201d82012-12-12 05:00:3268namespace net {
jri7e636642016-01-14 06:57:0869
nharper642ae4b2016-06-30 00:40:3670namespace {
71
72class MockSSLConfigService : public SSLConfigService {
73 public:
74 MockSSLConfigService() {}
Ryan Sleevib8449e02018-07-15 04:31:0775 ~MockSSLConfigService() override {}
nharper642ae4b2016-06-30 00:40:3676
77 void GetSSLConfig(SSLConfig* config) override { *config = config_; }
78
Nick Harper89bc7212018-07-31 19:07:5779 bool CanShareConnectionWithClientCerts(
80 const std::string& hostname) const override {
81 return false;
82 }
83
nharper642ae4b2016-06-30 00:40:3684 private:
nharper642ae4b2016-06-30 00:40:3685 SSLConfig config_;
86};
87
88} // namespace
89
[email protected]e13201d82012-12-12 05:00:3290namespace test {
91
[email protected]3c772402013-12-18 21:38:1192namespace {
bnc359ed2a2016-04-29 20:43:4593
94enum DestinationType {
95 // In pooling tests with two requests for different origins to the same
96 // destination, the destination should be
97 SAME_AS_FIRST, // the same as the first origin,
98 SAME_AS_SECOND, // the same as the second origin, or
99 DIFFERENT, // different from both.
100};
101
rch6faa4d42016-01-05 20:48:43102const char kDefaultServerHostName[] = "www.example.org";
103const char kServer2HostName[] = "mail.example.org";
bnc359ed2a2016-04-29 20:43:45104const char kDifferentHostname[] = "different.example.com";
[email protected]3c772402013-12-18 21:38:11105const int kDefaultServerPort = 443;
ckrasic3865ee0f2016-02-29 22:04:56106const char kDefaultUrl[] = "https://www.example.org/";
107const char kServer2Url[] = "https://mail.example.org/";
108const char kServer3Url[] = "https://docs.example.org/";
109const char kServer4Url[] = "https://images.example.org/";
Zhongyi Shic4823bd2018-04-27 00:49:19110const int kDefaultRTTMilliSecs = 300;
111const size_t kMinRetryTimeForDefaultNetworkSecs = 1;
Zhongyi Shib1b1fa42018-06-19 23:13:47112const size_t kWaitTimeForNewNetworkSecs = 10;
Renjiea0cb4a2c2018-09-26 23:37:30113const IPAddress kCachedIPAddress = IPAddress(192, 168, 0, 2);
114const char kNonCachedIPAddress[] = "192.168.0.1";
rtenneti14abd312015-02-06 21:56:01115
bnc359ed2a2016-04-29 20:43:45116// Run QuicStreamFactoryTest instances with all value combinations of version
117// and enable_connection_racting.
rtenneti14abd312015-02-06 21:56:01118struct TestParams {
bnc359ed2a2016-04-29 20:43:45119 friend std::ostream& operator<<(std::ostream& os, const TestParams& p) {
Yixin Wang079ad542018-01-11 04:06:05120 os << "{ version: " << QuicVersionToString(p.version)
121 << ", client_headers_include_h2_stream_dependency: "
122 << p.client_headers_include_h2_stream_dependency << " }";
rtenneti14abd312015-02-06 21:56:01123 return os;
124 }
125
Ryan Hamilton8d9ee76e2018-05-29 23:52:52126 quic::QuicTransportVersion version;
Yixin Wang079ad542018-01-11 04:06:05127 bool client_headers_include_h2_stream_dependency;
rtenneti14abd312015-02-06 21:56:01128};
129
rch872e00e2016-12-02 02:48:18130std::vector<TestParams> GetTestParams() {
131 std::vector<TestParams> params;
Ryan Hamilton8d9ee76e2018-05-29 23:52:52132 quic::QuicTransportVersionVector all_supported_versions =
133 quic::AllSupportedTransportVersions();
Yixin Wang079ad542018-01-11 04:06:05134 for (const auto& version : all_supported_versions) {
135 params.push_back(TestParams{version, false});
136 params.push_back(TestParams{version, true});
137 }
bnc359ed2a2016-04-29 20:43:45138 return params;
139}
140
141// Run QuicStreamFactoryWithDestinationTest instances with all value
142// combinations of version, enable_connection_racting, and destination_type.
143struct PoolingTestParams {
144 friend std::ostream& operator<<(std::ostream& os,
145 const PoolingTestParams& p) {
146 os << "{ version: " << QuicVersionToString(p.version)
bnc359ed2a2016-04-29 20:43:45147 << ", destination_type: ";
148 switch (p.destination_type) {
149 case SAME_AS_FIRST:
150 os << "SAME_AS_FIRST";
151 break;
152 case SAME_AS_SECOND:
153 os << "SAME_AS_SECOND";
154 break;
155 case DIFFERENT:
156 os << "DIFFERENT";
157 break;
158 }
Yixin Wang079ad542018-01-11 04:06:05159 os << ", client_headers_include_h2_stream_dependency: "
160 << p.client_headers_include_h2_stream_dependency;
bnc359ed2a2016-04-29 20:43:45161 os << " }";
162 return os;
163 }
164
Ryan Hamilton8d9ee76e2018-05-29 23:52:52165 quic::QuicTransportVersion version;
bnc359ed2a2016-04-29 20:43:45166 DestinationType destination_type;
Yixin Wang079ad542018-01-11 04:06:05167 bool client_headers_include_h2_stream_dependency;
bnc359ed2a2016-04-29 20:43:45168};
169
rch872e00e2016-12-02 02:48:18170std::vector<PoolingTestParams> GetPoolingTestParams() {
171 std::vector<PoolingTestParams> params;
Ryan Hamilton8d9ee76e2018-05-29 23:52:52172 quic::QuicTransportVersionVector all_supported_versions =
173 quic::AllSupportedTransportVersions();
174 for (const quic::QuicTransportVersion version : all_supported_versions) {
Yixin Wang079ad542018-01-11 04:06:05175 params.push_back(PoolingTestParams{version, SAME_AS_FIRST, false});
176 params.push_back(PoolingTestParams{version, SAME_AS_FIRST, true});
177 params.push_back(PoolingTestParams{version, SAME_AS_SECOND, false});
178 params.push_back(PoolingTestParams{version, SAME_AS_SECOND, true});
179 params.push_back(PoolingTestParams{version, DIFFERENT, false});
180 params.push_back(PoolingTestParams{version, DIFFERENT, true});
rtenneti14abd312015-02-06 21:56:01181 }
182 return params;
183}
184
bnc912a04b2016-04-20 14:19:50185} // namespace
[email protected]3c772402013-12-18 21:38:11186
bnc359ed2a2016-04-29 20:43:45187class QuicHttpStreamPeer {
188 public:
rchf0b18c8a2017-05-05 19:31:57189 static QuicChromiumClientSession::Handle* GetSessionHandle(
190 HttpStream* stream) {
191 return static_cast<QuicHttpStream*>(stream)->quic_session();
bnc359ed2a2016-04-29 20:43:45192 }
193};
194
Zhongyi Shi5f587cc2017-11-21 23:24:17195// TestConnectionMigrationSocketFactory will vend sockets with incremental port
196// number.
197class TestConnectionMigrationSocketFactory : public MockClientSocketFactory {
198 public:
199 TestConnectionMigrationSocketFactory() : next_source_port_num_(1u) {}
200 ~TestConnectionMigrationSocketFactory() override {}
201
202 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
203 DatagramSocket::BindType bind_type,
Zhongyi Shi5f587cc2017-11-21 23:24:17204 NetLog* net_log,
205 const NetLogSource& source) override {
206 SocketDataProvider* data_provider = mock_data().GetNext();
207 std::unique_ptr<MockUDPClientSocket> socket(
208 new MockUDPClientSocket(data_provider, net_log));
209 socket->set_source_port(next_source_port_num_++);
210 return std::move(socket);
211 }
212
213 private:
214 uint16_t next_source_port_num_;
215
216 DISALLOW_COPY_AND_ASSIGN(TestConnectionMigrationSocketFactory);
217};
218
Bence Béky98447b12018-05-08 03:14:01219class QuicStreamFactoryTestBase : public WithScopedTaskEnvironment {
[email protected]e13201d82012-12-12 05:00:32220 protected:
Ryan Hamilton8d9ee76e2018-05-29 23:52:52221 QuicStreamFactoryTestBase(quic::QuicTransportVersion version,
Yixin Wang079ad542018-01-11 04:06:05222 bool client_headers_include_h2_stream_dependency)
Renjiea0cb4a2c2018-09-26 23:37:30223 : host_resolver_(new MockHostResolver),
224 ssl_config_service_(new MockSSLConfigService),
Zhongyi Shi5f587cc2017-11-21 23:24:17225 socket_factory_(new MockClientSocketFactory),
nharper642ae4b2016-06-30 00:40:36226 random_generator_(0),
rchbf4c26d2017-04-16 23:17:55227 runner_(new TestTaskRunner(&clock_)),
bnc359ed2a2016-04-29 20:43:45228 version_(version),
David Schinazic8281052019-01-24 06:14:17229 client_maker_(
230 version_,
231 quic::QuicUtils::CreateRandomConnectionId(&random_generator_),
232 &clock_,
233 kDefaultServerHostName,
234 quic::Perspective::IS_CLIENT,
Zhongyi Shi967d2f12019-02-08 20:58:53235 client_headers_include_h2_stream_dependency),
David Schinazic8281052019-01-24 06:14:17236 server_maker_(
237 version_,
238 quic::QuicUtils::CreateRandomConnectionId(&random_generator_),
239 &clock_,
240 kDefaultServerHostName,
241 quic::Perspective::IS_SERVER,
242 false),
Ryan Sleevi987d2d92017-12-19 19:22:14243 cert_verifier_(std::make_unique<MockCertVerifier>()),
Ryan Sleevi987d2d92017-12-19 19:22:14244 cert_transparency_verifier_(std::make_unique<DoNothingCTVerifier>()),
jri7e636642016-01-14 06:57:08245 scoped_mock_network_change_notifier_(nullptr),
jri7046038f2015-10-22 00:29:26246 factory_(nullptr),
[email protected]bf4ea2f2014-03-10 22:57:53247 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
ckrasic3865ee0f2016-02-29 22:04:56248 url_(kDefaultUrl),
249 url2_(kServer2Url),
250 url3_(kServer3Url),
251 url4_(kServer4Url),
jri7046038f2015-10-22 00:29:26252 privacy_mode_(PRIVACY_MODE_DISABLED),
Zhongyi Shia6b68d112018-09-24 07:49:03253 failed_on_default_network_callback_(base::BindRepeating(
254 &QuicStreamFactoryTestBase::OnFailedOnDefaultNetwork,
255 base::Unretained(this))),
256 failed_on_default_network_(false),
Zhongyi Shi967d2f12019-02-08 20:58:53257 store_server_configs_in_properties_(false) {
258 test_params_.quic_headers_include_h2_stream_dependency =
259 client_headers_include_h2_stream_dependency;
Ryan Hamilton8d9ee76e2018-05-29 23:52:52260 clock_.AdvanceTime(quic::QuicTime::Delta::FromSeconds(1));
bnc359ed2a2016-04-29 20:43:45261 }
262
jri7046038f2015-10-22 00:29:26263 void Initialize() {
bnc359ed2a2016-04-29 20:43:45264 DCHECK(!factory_);
jri7046038f2015-10-22 00:29:26265 factory_.reset(new QuicStreamFactory(
Renjiea0cb4a2c2018-09-26 23:37:30266 net_log_.net_log(), host_resolver_.get(), ssl_config_service_.get(),
Zhongyi Shi5f587cc2017-11-21 23:24:17267 socket_factory_.get(), &http_server_properties_, cert_verifier_.get(),
Nick Harperecf319d2018-10-16 07:58:54268 &ct_policy_enforcer_, &transport_security_state_,
269 cert_transparency_verifier_.get(),
jri7046038f2015-10-22 00:29:26270 /*SocketPerformanceWatcherFactory*/ nullptr,
rchbf4c26d2017-04-16 23:17:55271 &crypto_client_stream_factory_, &random_generator_, &clock_,
Zhongyi Shi967d2f12019-02-08 20:58:53272 test_params_.quic_max_packet_length, test_params_.quic_user_agent_id,
273 store_server_configs_in_properties_,
274 test_params_.quic_close_sessions_on_ip_change,
275 test_params_.quic_goaway_sessions_on_ip_change,
276 test_params_.mark_quic_broken_when_network_blackholes,
277 test_params_.quic_idle_connection_timeout_seconds,
278 test_params_.quic_reduced_ping_timeout_seconds,
Zhongyi Shie01f2db2019-02-22 19:53:23279 test_params_.quic_retransmittable_on_wire_timeout_milliseconds,
Zhongyi Shi967d2f12019-02-08 20:58:53280 test_params_.quic_max_time_before_crypto_handshake_seconds,
281 test_params_.quic_max_idle_time_before_crypto_handshake_seconds,
282 test_params_.quic_migrate_sessions_on_network_change_v2,
283 test_params_.quic_migrate_sessions_early_v2,
284 test_params_.quic_retry_on_alternate_network_before_handshake,
Zhongyi Shi32fe14d42019-02-28 00:25:36285 test_params_.quic_migrate_idle_sessions,
Zhongyi Shic16b4102019-02-12 00:37:40286 test_params_.quic_idle_session_migration_period,
Zhongyi Shi967d2f12019-02-08 20:58:53287 test_params_.quic_max_time_on_non_default_network,
288 test_params_.quic_max_migrations_to_non_default_network_on_write_error,
289 test_params_
290 .quic_max_migrations_to_non_default_network_on_path_degrading,
291 test_params_.quic_allow_server_migration,
292 test_params_.quic_race_stale_dns_on_connection,
293 test_params_.quic_go_away_on_path_degrading,
294 test_params_.quic_race_cert_verification,
295 test_params_.quic_estimate_initial_rtt,
296 test_params_.quic_headers_include_h2_stream_dependency,
297 test_params_.quic_connection_options,
298 test_params_.quic_client_connection_options,
299 test_params_.quic_enable_socket_recv_optimization));
[email protected]e13201d82012-12-12 05:00:32300 }
301
Zhongyi Shi5f587cc2017-11-21 23:24:17302 void InitializeConnectionMigrationV2Test(
303 NetworkChangeNotifier::NetworkList connected_networks) {
304 scoped_mock_network_change_notifier_.reset(
305 new ScopedMockNetworkChangeNotifier());
306 MockNetworkChangeNotifier* mock_ncn =
307 scoped_mock_network_change_notifier_->mock_network_change_notifier();
308 mock_ncn->ForceNetworkHandlesSupported();
309 mock_ncn->SetConnectedNetworksList(connected_networks);
Zhongyi Shi967d2f12019-02-08 20:58:53310 test_params_.quic_migrate_sessions_on_network_change_v2 = true;
311 test_params_.quic_migrate_sessions_early_v2 = true;
Zhongyi Shi5f587cc2017-11-21 23:24:17312 socket_factory_.reset(new TestConnectionMigrationSocketFactory);
313 Initialize();
314 }
315
Yixin Wang7891a39d2017-11-08 20:59:24316 std::unique_ptr<HttpStream> CreateStream(QuicStreamRequest* request) {
317 std::unique_ptr<QuicChromiumClientSession::Handle> session =
318 request->ReleaseSessionHandle();
319 if (!session || !session->IsConnected())
320 return nullptr;
321
322 return std::make_unique<QuicHttpStream>(std::move(session));
323 }
324
bnccb7ff3c2015-05-21 20:51:55325 bool HasActiveSession(const HostPortPair& host_port_pair) {
Ryan Hamilton4f0b26e2018-06-27 23:52:32326 quic::QuicServerId server_id(host_port_pair.host(), host_port_pair.port(),
327 false);
bnc5fdc07162016-05-23 17:36:03328 return QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server_id);
bnccb7ff3c2015-05-21 20:51:55329 }
330
Renjiea0cb4a2c2018-09-26 23:37:30331 bool HasLiveSession(const HostPortPair& host_port_pair) {
332 quic::QuicServerId server_id(host_port_pair.host(), host_port_pair.port(),
333 false);
334 return QuicStreamFactoryPeer::HasLiveSession(factory_.get(), host_port_pair,
335 server_id);
336 }
337
zhongyi363c91c2017-03-23 23:16:08338 bool HasActiveJob(const HostPortPair& host_port_pair,
339 const PrivacyMode privacy_mode) {
Ryan Hamilton4f0b26e2018-06-27 23:52:32340 quic::QuicServerId server_id(host_port_pair.host(), host_port_pair.port(),
341 privacy_mode == PRIVACY_MODE_ENABLED);
zhongyi363c91c2017-03-23 23:16:08342 return QuicStreamFactoryPeer::HasActiveJob(factory_.get(), server_id);
343 }
344
Ryan Hamilton8d9ee76e2018-05-29 23:52:52345 bool HasActiveCertVerifierJob(const quic::QuicServerId& server_id) {
rtennetid073dd22016-08-04 01:58:33346 return QuicStreamFactoryPeer::HasActiveCertVerifierJob(factory_.get(),
347 server_id);
348 }
349
Zhongyi Shic1449372018-08-09 09:58:58350 // Get the pending, not activated session, if there is only one session alive.
351 QuicChromiumClientSession* GetPendingSession(
352 const HostPortPair& host_port_pair) {
353 quic::QuicServerId server_id(host_port_pair.host(), host_port_pair.port(),
354 false);
355 return QuicStreamFactoryPeer::GetPendingSession(factory_.get(), server_id,
356 host_port_pair);
357 }
358
bnc912a04b2016-04-20 14:19:50359 QuicChromiumClientSession* GetActiveSession(
360 const HostPortPair& host_port_pair) {
Ryan Hamilton4f0b26e2018-06-27 23:52:32361 quic::QuicServerId server_id(host_port_pair.host(), host_port_pair.port(),
362 false);
bnc5fdc07162016-05-23 17:36:03363 return QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server_id);
bnc912a04b2016-04-20 14:19:50364 }
365
[email protected]bf4ea2f2014-03-10 22:57:53366 int GetSourcePortForNewSession(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10367 return GetSourcePortForNewSessionInner(destination, false);
368 }
369
rjshaded5ced072015-12-18 19:26:02370 int GetSourcePortForNewSessionAndGoAway(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10371 return GetSourcePortForNewSessionInner(destination, true);
372 }
373
[email protected]bf4ea2f2014-03-10 22:57:53374 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
[email protected]d8e2abf82014-03-06 10:30:10375 bool goaway_received) {
[email protected]3c772402013-12-18 21:38:11376 // Should only be called if there is no active session for this destination.
bnccb7ff3c2015-05-21 20:51:55377 EXPECT_FALSE(HasActiveSession(destination));
Zhongyi Shi5f587cc2017-11-21 23:24:17378 size_t socket_count = socket_factory_->udp_client_socket_ports().size();
[email protected]3c772402013-12-18 21:38:11379
rcha00569732016-08-27 11:09:36380 MockQuicData socket_data;
381 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:43382 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:17383 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]3c772402013-12-18 21:38:11384
zhongyi98d6a9262017-05-19 02:47:45385 QuicStreamRequest request(factory_.get());
ckrasic3865ee0f2016-02-29 22:04:56386 GURL url("https://" + destination.host() + "/");
Zhongyi Shia6b68d112018-09-24 07:49:03387 EXPECT_EQ(
388 ERR_IO_PENDING,
389 request.Request(
390 destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
391 /*cert_verify_flags=*/0, url, net_log_, &net_error_details_,
392 failed_on_default_network_callback_, callback_.callback()));
[email protected]3c772402013-12-18 21:38:11393
robpercival214763f2016-07-01 23:27:01394 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:24395 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]3c772402013-12-18 21:38:11396 EXPECT_TRUE(stream.get());
397 stream.reset();
398
bnc912a04b2016-04-20 14:19:50399 QuicChromiumClientSession* session = GetActiveSession(destination);
[email protected]3c772402013-12-18 21:38:11400
Zhongyi Shi5f587cc2017-11-21 23:24:17401 if (socket_count + 1 != socket_factory_->udp_client_socket_ports().size()) {
mmenke651bae7f2015-12-18 21:26:45402 ADD_FAILURE();
[email protected]3c772402013-12-18 21:38:11403 return 0;
404 }
405
[email protected]d8e2abf82014-03-06 10:30:10406 if (goaway_received) {
Ryan Hamilton8d9ee76e2018-05-29 23:52:52407 quic::QuicGoAwayFrame goaway(quic::kInvalidControlFrameId,
408 quic::QUIC_NO_ERROR, 1, "");
rtenneti9bd5d4b2015-08-21 05:44:52409 session->connection()->OnGoAwayFrame(goaway);
[email protected]d8e2abf82014-03-06 10:30:10410 }
[email protected]3c772402013-12-18 21:38:11411
jri7046038f2015-10-22 00:29:26412 factory_->OnSessionClosed(session);
bnccb7ff3c2015-05-21 20:51:55413 EXPECT_FALSE(HasActiveSession(destination));
rch37de576c2015-05-17 20:28:17414 EXPECT_TRUE(socket_data.AllReadDataConsumed());
415 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
Zhongyi Shi5f587cc2017-11-21 23:24:17416 return socket_factory_->udp_client_socket_ports()[socket_count];
[email protected]3c772402013-12-18 21:38:11417 }
418
Ryan Hamilton8d9ee76e2018-05-29 23:52:52419 std::unique_ptr<quic::QuicEncryptedPacket>
Fan Yangac867502019-01-28 21:10:23420 ConstructClientConnectionClosePacket(uint64_t num) {
Bin Wu5311aca2018-01-22 01:19:03421 return client_maker_.MakeConnectionClosePacket(
Ryan Hamilton8d9ee76e2018-05-29 23:52:52422 num, false, quic::QUIC_CRYPTO_VERSION_NOT_SUPPORTED, "Time to panic!");
rtenneti1cd3b162015-09-29 02:58:28423 }
424
Ryan Hamilton8d9ee76e2018-05-29 23:52:52425 std::unique_ptr<quic::QuicEncryptedPacket> ConstructClientRstPacket(
Fan Yangac867502019-01-28 21:10:23426 uint64_t packet_number,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52427 quic::QuicRstStreamErrorCode error_code) {
Fan Yang32c5a112018-12-10 20:06:33428 quic::QuicStreamId stream_id =
429 GetNthClientInitiatedBidirectionalStreamId(0);
fayang3bcb8b502016-12-07 21:44:37430 return client_maker_.MakeRstPacket(packet_number, true, stream_id,
Jana Iyengarba355772017-09-21 22:03:21431 error_code);
fayang3bcb8b502016-12-07 21:44:37432 }
433
bncf8bf0722015-05-19 20:04:13434 static ProofVerifyDetailsChromium DefaultProofVerifyDetails() {
rch6faa4d42016-01-05 20:48:43435 // Load a certificate that is valid for *.example.org
bncf8bf0722015-05-19 20:04:13436 scoped_refptr<X509Certificate> test_cert(
rch6faa4d42016-01-05 20:48:43437 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bncf8bf0722015-05-19 20:04:13438 EXPECT_TRUE(test_cert.get());
439 ProofVerifyDetailsChromium verify_details;
440 verify_details.cert_verify_result.verified_cert = test_cert;
441 verify_details.cert_verify_result.is_issued_by_known_root = true;
442 return verify_details;
443 }
444
jri8c44d692015-10-23 23:53:41445 void NotifyIPAddressChanged() {
446 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
jri7e636642016-01-14 06:57:08447 // Spin the message loop so the notification is delivered.
fdoray92e35a72016-06-10 15:54:55448 base::RunLoop().RunUntilIdle();
jri8c44d692015-10-23 23:53:41449 }
450
Ryan Hamilton8d9ee76e2018-05-29 23:52:52451 std::unique_ptr<quic::QuicEncryptedPacket> ConstructGetRequestPacket(
Fan Yangac867502019-01-28 21:10:23452 uint64_t packet_number,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52453 quic::QuicStreamId stream_id,
jri7e636642016-01-14 06:57:08454 bool should_include_version,
455 bool fin) {
Ryan Hamilton0239aac2018-05-19 00:03:13456 spdy::SpdyHeaderBlock headers =
alyssar2adf3ac2016-05-03 17:12:58457 client_maker_.GetRequestHeaders("GET", "https", "/");
Ryan Hamilton0239aac2018-05-19 00:03:13458 spdy::SpdyPriority priority =
jri7e636642016-01-14 06:57:08459 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
460 size_t spdy_headers_frame_len;
alyssar2adf3ac2016-05-03 17:12:58461 return client_maker_.MakeRequestHeadersPacket(
jri7e636642016-01-14 06:57:08462 packet_number, stream_id, should_include_version, fin, priority,
Yixin Wang7a3f1b8d2018-01-17 21:40:48463 std::move(headers), 0, &spdy_headers_frame_len);
jri7e636642016-01-14 06:57:08464 }
465
Ryan Hamilton8d9ee76e2018-05-29 23:52:52466 std::unique_ptr<quic::QuicEncryptedPacket> ConstructGetRequestPacket(
Fan Yangac867502019-01-28 21:10:23467 uint64_t packet_number,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52468 quic::QuicStreamId stream_id,
Zhongyi Shi3c4c9e92018-07-02 23:16:23469 quic::QuicStreamId parent_stream_id,
fayang3bcb8b502016-12-07 21:44:37470 bool should_include_version,
471 bool fin,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52472 quic::QuicStreamOffset* offset) {
Ryan Hamilton0239aac2018-05-19 00:03:13473 spdy::SpdyHeaderBlock headers =
fayang3bcb8b502016-12-07 21:44:37474 client_maker_.GetRequestHeaders("GET", "https", "/");
Ryan Hamilton0239aac2018-05-19 00:03:13475 spdy::SpdyPriority priority =
fayang3bcb8b502016-12-07 21:44:37476 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
477 size_t spdy_headers_frame_len;
478 return client_maker_.MakeRequestHeadersPacket(
479 packet_number, stream_id, should_include_version, fin, priority,
Zhongyi Shi3c4c9e92018-07-02 23:16:23480 std::move(headers), parent_stream_id, &spdy_headers_frame_len, offset);
481 }
482
483 std::unique_ptr<quic::QuicEncryptedPacket> ConstructGetRequestPacket(
Fan Yangac867502019-01-28 21:10:23484 uint64_t packet_number,
Zhongyi Shi3c4c9e92018-07-02 23:16:23485 quic::QuicStreamId stream_id,
486 bool should_include_version,
487 bool fin,
488 quic::QuicStreamOffset* offset) {
489 return ConstructGetRequestPacket(packet_number, stream_id,
490 /*parent_stream_id=*/0,
491 should_include_version, fin, offset);
fayang3bcb8b502016-12-07 21:44:37492 }
493
Ryan Hamilton8d9ee76e2018-05-29 23:52:52494 std::unique_ptr<quic::QuicEncryptedPacket> ConstructOkResponsePacket(
Fan Yangac867502019-01-28 21:10:23495 uint64_t packet_number,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52496 quic::QuicStreamId stream_id,
jri7e636642016-01-14 06:57:08497 bool should_include_version,
498 bool fin) {
Ryan Hamilton0239aac2018-05-19 00:03:13499 spdy::SpdyHeaderBlock headers = server_maker_.GetResponseHeaders("200 OK");
jri7e636642016-01-14 06:57:08500 size_t spdy_headers_frame_len;
alyssar2adf3ac2016-05-03 17:12:58501 return server_maker_.MakeResponseHeadersPacket(
bnc086b39e12016-06-24 13:05:26502 packet_number, stream_id, should_include_version, fin,
503 std::move(headers), &spdy_headers_frame_len);
jri7e636642016-01-14 06:57:08504 }
505
Ryan Hamilton8d9ee76e2018-05-29 23:52:52506 std::unique_ptr<quic::QuicReceivedPacket> ConstructInitialSettingsPacket() {
rch5cb522462017-04-25 20:18:36507 return client_maker_.MakeInitialSettingsPacket(1, nullptr);
508 }
509
Ryan Hamilton8d9ee76e2018-05-29 23:52:52510 std::unique_ptr<quic::QuicReceivedPacket> ConstructInitialSettingsPacket(
Fan Yangac867502019-01-28 21:10:23511 uint64_t packet_number,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52512 quic::QuicStreamOffset* offset) {
rch5cb522462017-04-25 20:18:36513 return client_maker_.MakeInitialSettingsPacket(packet_number, offset);
fayang3bcb8b502016-12-07 21:44:37514 }
515
jri053fdbd2016-08-19 02:33:05516 // Helper method for server migration tests.
Ryan Hamilton8d9ee76e2018-05-29 23:52:52517 void VerifyServerMigration(const quic::QuicConfig& config,
bnc6a0348c2017-05-22 18:56:19518 IPEndPoint expected_address) {
Zhongyi Shi967d2f12019-02-08 20:58:53519 test_params_.quic_allow_server_migration = true;
jri053fdbd2016-08-19 02:33:05520 Initialize();
521
522 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
523 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri053fdbd2016-08-19 02:33:05524 crypto_client_stream_factory_.SetConfig(config);
525
526 // Set up first socket data provider.
rcha00569732016-08-27 11:09:36527 MockQuicData socket_data1;
528 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:17529 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri053fdbd2016-08-19 02:33:05530
rcha00569732016-08-27 11:09:36531 // Set up second socket data provider that is used after
532 // migration.
533 MockQuicData socket_data2;
534 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:43535 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
fayang3bcb8b502016-12-07 21:44:37536 socket_data2.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:43537 SYNCHRONOUS, client_maker_.MakePingPacket(2, /*include_version=*/true));
538 socket_data2.AddWrite(
Fan Yang32c5a112018-12-10 20:06:33539 SYNCHRONOUS, client_maker_.MakeRstPacket(
540 3, true, GetNthClientInitiatedBidirectionalStreamId(0),
541 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:17542 socket_data2.AddSocketDataToFactory(socket_factory_.get());
jri053fdbd2016-08-19 02:33:05543
544 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:45545 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:33546 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:03547 request.Request(
548 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
549 SocketTag(),
550 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
551 failed_on_default_network_callback_, callback_.callback()));
jri053fdbd2016-08-19 02:33:05552 EXPECT_EQ(OK, callback_.WaitForResult());
bnceb9aa7112017-01-05 01:03:46553
554 // Run QuicChromiumClientSession::WriteToNewSocket()
555 // posted by QuicChromiumClientSession::MigrateToSocket().
556 base::RunLoop().RunUntilIdle();
557
Yixin Wang7891a39d2017-11-08 20:59:24558 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri053fdbd2016-08-19 02:33:05559 EXPECT_TRUE(stream.get());
560
561 // Cause QUIC stream to be created.
562 HttpRequestInfo request_info;
563 request_info.method = "GET";
564 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:39565 request_info.traffic_annotation =
566 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:27567 EXPECT_EQ(OK,
568 stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:39569 net_log_, CompletionOnceCallback()));
jri053fdbd2016-08-19 02:33:05570 // Ensure that session is alive and active.
571 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
572 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
573 EXPECT_TRUE(HasActiveSession(host_port_pair_));
574
575 IPEndPoint actual_address;
576 session->GetDefaultSocket()->GetPeerAddress(&actual_address);
577 EXPECT_EQ(actual_address, expected_address);
578 DVLOG(1) << "Socket connected to: " << actual_address.address().ToString()
579 << " " << actual_address.port();
580 DVLOG(1) << "Expected address: " << expected_address.address().ToString()
581 << " " << expected_address.port();
582
583 stream.reset();
584 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
585 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
586 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
587 }
588
tbansal3b966952016-10-25 23:25:14589 // Verifies that the QUIC stream factory is initialized correctly.
tbansal9b1cdf32017-05-10 17:28:39590 void VerifyInitialization() {
rch431dd4452017-04-19 15:22:35591 store_server_configs_in_properties_ = true;
Zhongyi Shi967d2f12019-02-08 20:58:53592 test_params_.quic_idle_connection_timeout_seconds = 500;
tbansal3b966952016-10-25 23:25:14593 Initialize();
Ryan Hamiltona12722b2017-08-12 02:23:20594 factory_->set_require_confirmation(false);
tbansal3b966952016-10-25 23:25:14595 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
596 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rch431dd4452017-04-19 15:22:35597 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
598 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:27599 MockCryptoClientStream::ZERO_RTT);
Ryan Hamilton8d9ee76e2018-05-29 23:52:52600 const quic::QuicConfig* config =
601 QuicStreamFactoryPeer::GetConfig(factory_.get());
ckrasic32b17dcd2016-10-31 06:15:35602 EXPECT_EQ(500, config->IdleNetworkTimeout().ToSeconds());
tbansal3b966952016-10-25 23:25:14603
604 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
605
bnc3472afd2016-11-17 15:27:21606 const AlternativeService alternative_service1(
607 kProtoQUIC, host_port_pair_.host(), host_port_pair_.port());
tbansal3b966952016-10-25 23:25:14608 AlternativeServiceInfoVector alternative_service_info_vector;
609 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
610 alternative_service_info_vector.push_back(
zhongyie537a002017-06-27 16:48:21611 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
612 alternative_service1, expiration, {version_}));
tbansal3b966952016-10-25 23:25:14613 http_server_properties_.SetAlternativeServices(
614 url::SchemeHostPort(url_), alternative_service_info_vector);
615
616 HostPortPair host_port_pair2(kServer2HostName, kDefaultServerPort);
617 url::SchemeHostPort server2("https", kServer2HostName, kDefaultServerPort);
bnc3472afd2016-11-17 15:27:21618 const AlternativeService alternative_service2(
619 kProtoQUIC, host_port_pair2.host(), host_port_pair2.port());
tbansal3b966952016-10-25 23:25:14620 AlternativeServiceInfoVector alternative_service_info_vector2;
621 alternative_service_info_vector2.push_back(
zhongyie537a002017-06-27 16:48:21622 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
623 alternative_service2, expiration, {version_}));
tbansal9b1cdf32017-05-10 17:28:39624
625 http_server_properties_.SetAlternativeServices(
626 server2, alternative_service_info_vector2);
627 // Verify that the properties of both QUIC servers are stored in the
628 // HTTP properties map.
629 EXPECT_EQ(2U, http_server_properties_.alternative_service_map().size());
tbansal3b966952016-10-25 23:25:14630
631 http_server_properties_.SetMaxServerConfigsStoredInProperties(
Yixin Wang4a227aa22017-11-30 21:33:01632 kDefaultMaxQuicServerEntries);
tbansal3b966952016-10-25 23:25:14633
Ryan Hamilton8d9ee76e2018-05-29 23:52:52634 quic::QuicServerId quic_server_id(kDefaultServerHostName, 443,
635 PRIVACY_MODE_DISABLED);
rch431dd4452017-04-19 15:22:35636 std::unique_ptr<QuicServerInfo> quic_server_info =
Jeremy Roman0579ed62017-08-29 15:56:19637 std::make_unique<PropertiesBasedQuicServerInfo>(
rch431dd4452017-04-19 15:22:35638 quic_server_id, &http_server_properties_);
tbansal3b966952016-10-25 23:25:14639
640 // Update quic_server_info's server_config and persist it.
641 QuicServerInfo::State* state = quic_server_info->mutable_state();
642 // Minimum SCFG that passes config validation checks.
643 const char scfg[] = {// SCFG
644 0x53, 0x43, 0x46, 0x47,
645 // num entries
646 0x01, 0x00,
647 // padding
648 0x00, 0x00,
649 // EXPY
650 0x45, 0x58, 0x50, 0x59,
651 // EXPY end offset
652 0x08, 0x00, 0x00, 0x00,
653 // Value
654 '1', '2', '3', '4', '5', '6', '7', '8'};
655
656 // Create temporary strings becasue Persist() clears string data in |state|.
657 string server_config(reinterpret_cast<const char*>(&scfg), sizeof(scfg));
658 string source_address_token("test_source_address_token");
659 string cert_sct("test_cert_sct");
660 string chlo_hash("test_chlo_hash");
661 string signature("test_signature");
662 string test_cert("test_cert");
rch872e00e2016-12-02 02:48:18663 std::vector<string> certs;
tbansal3b966952016-10-25 23:25:14664 certs.push_back(test_cert);
665 state->server_config = server_config;
666 state->source_address_token = source_address_token;
667 state->cert_sct = cert_sct;
668 state->chlo_hash = chlo_hash;
669 state->server_config_sig = signature;
670 state->certs = certs;
671
672 quic_server_info->Persist();
673
Ryan Hamilton8d9ee76e2018-05-29 23:52:52674 quic::QuicServerId quic_server_id2(kServer2HostName, 443,
675 PRIVACY_MODE_DISABLED);
rch431dd4452017-04-19 15:22:35676 std::unique_ptr<QuicServerInfo> quic_server_info2 =
Jeremy Roman0579ed62017-08-29 15:56:19677 std::make_unique<PropertiesBasedQuicServerInfo>(
rch431dd4452017-04-19 15:22:35678 quic_server_id2, &http_server_properties_);
tbansal3b966952016-10-25 23:25:14679 // Update quic_server_info2's server_config and persist it.
680 QuicServerInfo::State* state2 = quic_server_info2->mutable_state();
681
682 // Minimum SCFG that passes config validation checks.
683 const char scfg2[] = {// SCFG
684 0x53, 0x43, 0x46, 0x47,
685 // num entries
686 0x01, 0x00,
687 // padding
688 0x00, 0x00,
689 // EXPY
690 0x45, 0x58, 0x50, 0x59,
691 // EXPY end offset
692 0x08, 0x00, 0x00, 0x00,
693 // Value
694 '8', '7', '3', '4', '5', '6', '2', '1'};
695
696 // Create temporary strings becasue Persist() clears string data in
697 // |state2|.
698 string server_config2(reinterpret_cast<const char*>(&scfg2), sizeof(scfg2));
699 string source_address_token2("test_source_address_token2");
700 string cert_sct2("test_cert_sct2");
701 string chlo_hash2("test_chlo_hash2");
702 string signature2("test_signature2");
703 string test_cert2("test_cert2");
rch872e00e2016-12-02 02:48:18704 std::vector<string> certs2;
tbansal3b966952016-10-25 23:25:14705 certs2.push_back(test_cert2);
706 state2->server_config = server_config2;
707 state2->source_address_token = source_address_token2;
708 state2->cert_sct = cert_sct2;
709 state2->chlo_hash = chlo_hash2;
710 state2->server_config_sig = signature2;
711 state2->certs = certs2;
712
713 quic_server_info2->Persist();
714
tbansal3b966952016-10-25 23:25:14715 // Verify the MRU order is maintained.
716 const QuicServerInfoMap& quic_server_info_map =
717 http_server_properties_.quic_server_info_map();
718 EXPECT_EQ(2u, quic_server_info_map.size());
jdoerrie22a91d8b92018-10-05 08:43:26719 auto quic_server_info_map_it = quic_server_info_map.begin();
tbansal3b966952016-10-25 23:25:14720 EXPECT_EQ(quic_server_info_map_it->first, quic_server_id2);
721 ++quic_server_info_map_it;
722 EXPECT_EQ(quic_server_info_map_it->first, quic_server_id);
723
Renjiea0cb4a2c2018-09-26 23:37:30724 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
725 "192.168.0.1", "");
rch431dd4452017-04-19 15:22:35726
727 // Create a session and verify that the cached state is loaded.
728 MockQuicData socket_data;
729 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:17730 socket_data.AddSocketDataToFactory(socket_factory_.get());
rch431dd4452017-04-19 15:22:35731
zhongyi98d6a9262017-05-19 02:47:45732 QuicStreamRequest request(factory_.get());
Yixin Wang247ea642017-11-15 01:15:50733 EXPECT_EQ(ERR_IO_PENDING,
Ryan Hamilton4f0b26e2018-06-27 23:52:32734 request.Request(
735 HostPortPair(quic_server_id.host(), quic_server_id.port()),
736 version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
737 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
Zhongyi Shia6b68d112018-09-24 07:49:03738 failed_on_default_network_callback_, callback_.callback()));
rch431dd4452017-04-19 15:22:35739 EXPECT_THAT(callback_.WaitForResult(), IsOk());
740
tbansal3b966952016-10-25 23:25:14741 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(
742 factory_.get(), quic_server_id));
Ryan Hamilton8d9ee76e2018-05-29 23:52:52743 quic::QuicCryptoClientConfig* crypto_config =
tbansal3b966952016-10-25 23:25:14744 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
Ryan Hamilton8d9ee76e2018-05-29 23:52:52745 quic::QuicCryptoClientConfig::CachedState* cached =
tbansal3b966952016-10-25 23:25:14746 crypto_config->LookupOrCreate(quic_server_id);
747 EXPECT_FALSE(cached->server_config().empty());
748 EXPECT_TRUE(cached->GetServerConfig());
749 EXPECT_EQ(server_config, cached->server_config());
750 EXPECT_EQ(source_address_token, cached->source_address_token());
751 EXPECT_EQ(cert_sct, cached->cert_sct());
752 EXPECT_EQ(chlo_hash, cached->chlo_hash());
753 EXPECT_EQ(signature, cached->signature());
754 ASSERT_EQ(1U, cached->certs().size());
755 EXPECT_EQ(test_cert, cached->certs()[0]);
756
rch431dd4452017-04-19 15:22:35757 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
758
759 // Create a session and verify that the cached state is loaded.
760 MockQuicData socket_data2;
761 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:17762 socket_data2.AddSocketDataToFactory(socket_factory_.get());
rch431dd4452017-04-19 15:22:35763
Renjiea0cb4a2c2018-09-26 23:37:30764 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
765 "192.168.0.2", "");
rch431dd4452017-04-19 15:22:35766
zhongyi98d6a9262017-05-19 02:47:45767 QuicStreamRequest request2(factory_.get());
rch431dd4452017-04-19 15:22:35768 EXPECT_EQ(ERR_IO_PENDING,
Ryan Hamilton4f0b26e2018-06-27 23:52:32769 request2.Request(
770 HostPortPair(quic_server_id2.host(), quic_server_id2.port()),
771 version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
772 /*cert_verify_flags=*/0, GURL("https://mail.example.org/"),
Zhongyi Shia6b68d112018-09-24 07:49:03773 net_log_, &net_error_details_,
774 failed_on_default_network_callback_, callback_.callback()));
rch431dd4452017-04-19 15:22:35775 EXPECT_THAT(callback_.WaitForResult(), IsOk());
776
tbansal3b966952016-10-25 23:25:14777 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(
778 factory_.get(), quic_server_id2));
Ryan Hamilton8d9ee76e2018-05-29 23:52:52779 quic::QuicCryptoClientConfig::CachedState* cached2 =
tbansal3b966952016-10-25 23:25:14780 crypto_config->LookupOrCreate(quic_server_id2);
781 EXPECT_FALSE(cached2->server_config().empty());
782 EXPECT_TRUE(cached2->GetServerConfig());
783 EXPECT_EQ(server_config2, cached2->server_config());
784 EXPECT_EQ(source_address_token2, cached2->source_address_token());
785 EXPECT_EQ(cert_sct2, cached2->cert_sct());
786 EXPECT_EQ(chlo_hash2, cached2->chlo_hash());
787 EXPECT_EQ(signature2, cached2->signature());
788 ASSERT_EQ(1U, cached->certs().size());
789 EXPECT_EQ(test_cert2, cached2->certs()[0]);
790 }
791
jri5b785512016-09-13 04:29:11792 void RunTestLoopUntilIdle() {
793 while (!runner_->GetPostedTasks().empty())
794 runner_->RunNextTask();
795 }
796
Fan Yang32c5a112018-12-10 20:06:33797 quic::QuicStreamId GetNthClientInitiatedBidirectionalStreamId(int n) {
798 return quic::test::GetNthClientInitiatedBidirectionalStreamId(version_, n);
ckrasicbf2f59c2017-05-04 23:54:36799 }
800
Fan Yang32c5a112018-12-10 20:06:33801 quic::QuicStreamId GetNthServerInitiatedUnidirectionalStreamId(int n) {
802 return quic::test::GetNthServerInitiatedUnidirectionalStreamId(version_, n);
ckrasicbf2f59c2017-05-04 23:54:36803 }
804
Zhongyi Shia6b68d112018-09-24 07:49:03805 void OnFailedOnDefaultNetwork(int rv) { failed_on_default_network_ = true; }
806
jri9f303712016-09-13 01:10:22807 // Helper methods for tests of connection migration on write error.
Zhongyi Shi32fe14d42019-02-28 00:25:36808 void TestMigrationOnWriteErrorNonMigratableStream(IoMode write_error_mode,
809 bool migrate_idle_sessions);
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);
Zhongyi Shi32fe14d42019-02-28 00:25:36836 void TestOnNetworkMadeDefaultNonMigratableStream(bool migrate_idle_sessions);
837 void TestMigrateSessionEarlyNonMigratableStream(bool migrate_idle_sessions);
838 void TestOnNetworkDisconnectedNoOpenStreams(bool migrate_idle_sessions);
839 void TestOnNetworkMadeDefaultNoOpenStreams(bool migrate_idle_sessions);
840 void TestOnNetworkDisconnectedNonMigratableStream(bool migrate_idle_sessions);
jri9f303712016-09-13 01:10:22841
Jana Iyengarf6b13d82017-09-04 02:09:10842 QuicFlagSaver flags_; // Save/restore all QUIC flag values.
Renjiea0cb4a2c2018-09-26 23:37:30843 std::unique_ptr<MockHostResolverBase> host_resolver_;
Ryan Sleevib8449e02018-07-15 04:31:07844 std::unique_ptr<SSLConfigService> ssl_config_service_;
Zhongyi Shi5f587cc2017-11-21 23:24:17845 std::unique_ptr<MockClientSocketFactory> socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05846 MockCryptoClientStreamFactory crypto_client_stream_factory_;
Ryan Hamilton8d9ee76e2018-05-29 23:52:52847 quic::test::MockRandom random_generator_;
848 quic::MockClock clock_;
rtenneti38f5cd52014-10-28 20:28:28849 scoped_refptr<TestTaskRunner> runner_;
Ryan Hamilton8d9ee76e2018-05-29 23:52:52850 const quic::QuicTransportVersion version_;
alyssar2adf3ac2016-05-03 17:12:58851 QuicTestPacketMaker client_maker_;
852 QuicTestPacketMaker server_maker_;
rtenneticcab42b2015-10-09 06:38:16853 HttpServerPropertiesImpl http_server_properties_;
danakjad1777e2016-04-16 00:56:42854 std::unique_ptr<CertVerifier> cert_verifier_;
[email protected]080b77932014-08-04 01:22:46855 TransportSecurityState transport_security_state_;
danakjad1777e2016-04-16 00:56:42856 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
Ryan Sleevi8a9c9c12018-05-09 02:36:23857 DefaultCTPolicyEnforcer ct_policy_enforcer_;
danakjad1777e2016-04-16 00:56:42858 std::unique_ptr<ScopedMockNetworkChangeNotifier>
jri7e636642016-01-14 06:57:08859 scoped_mock_network_change_notifier_;
danakjad1777e2016-04-16 00:56:42860 std::unique_ptr<QuicStreamFactory> factory_;
[email protected]bf4ea2f2014-03-10 22:57:53861 HostPortPair host_port_pair_;
ckrasic3865ee0f2016-02-29 22:04:56862 GURL url_;
863 GURL url2_;
864 GURL url3_;
865 GURL url4_;
866
[email protected]9dd3ff0f2014-03-26 09:51:28867 PrivacyMode privacy_mode_;
tfarina42834112016-09-22 13:38:20868 NetLogWithSource net_log_;
[email protected]e13201d82012-12-12 05:00:32869 TestCompletionCallback callback_;
Zhongyi Shia6b68d112018-09-24 07:49:03870 const CompletionRepeatingCallback failed_on_default_network_callback_;
871 bool failed_on_default_network_;
Ryan Hamilton75f197262017-08-17 14:00:07872 NetErrorDetails net_error_details_;
jri7046038f2015-10-22 00:29:26873
874 // Variables to configure QuicStreamFactory.
Zhongyi Shi967d2f12019-02-08 20:58:53875 HttpNetworkSession::Params test_params_;
rch431dd4452017-04-19 15:22:35876 bool store_server_configs_in_properties_;
[email protected]e13201d82012-12-12 05:00:32877};
878
bnc359ed2a2016-04-29 20:43:45879class QuicStreamFactoryTest : public QuicStreamFactoryTestBase,
880 public ::testing::TestWithParam<TestParams> {
881 protected:
Yixin Wang079ad542018-01-11 04:06:05882 QuicStreamFactoryTest()
883 : QuicStreamFactoryTestBase(
884 GetParam().version,
885 GetParam().client_headers_include_h2_stream_dependency) {}
bnc359ed2a2016-04-29 20:43:45886};
887
Victor Costane635086f2019-01-27 05:20:30888INSTANTIATE_TEST_SUITE_P(VersionIncludeStreamDependencySequence,
889 QuicStreamFactoryTest,
890 ::testing::ValuesIn(GetTestParams()));
[email protected]1e960032013-12-20 19:00:20891
[email protected]1e960032013-12-20 19:00:20892TEST_P(QuicStreamFactoryTest, Create) {
jri7046038f2015-10-22 00:29:26893 Initialize();
rch6faa4d42016-01-05 20:48:43894 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
895 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26896
rcha00569732016-08-27 11:09:36897 MockQuicData socket_data;
898 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:43899 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:17900 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]e13201d82012-12-12 05:00:32901
zhongyi98d6a9262017-05-19 02:47:45902 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:33903 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:03904 request.Request(
905 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
906 SocketTag(),
907 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
908 failed_on_default_network_callback_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32909
robpercival214763f2016-07-01 23:27:01910 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:24911 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]0edce6a2013-05-08 18:02:40912 EXPECT_TRUE(stream.get());
[email protected]e13201d82012-12-12 05:00:32913
Renjiea0cb4a2c2018-09-26 23:37:30914 EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->last_request_priority());
Yixin Wang247ea642017-11-15 01:15:50915
zhongyi98d6a9262017-05-19 02:47:45916 QuicStreamRequest request2(factory_.get());
zhongyia00ca012017-07-06 23:36:39917 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:33918 DEFAULT_PRIORITY, SocketTag(),
919 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:03920 &net_error_details_,
921 failed_on_default_network_callback_,
922 callback_.callback()));
rch68a80eb2017-04-25 05:24:24923 // Will reset stream 3.
Yixin Wang7891a39d2017-11-08 20:59:24924 stream = CreateStream(&request2);
rch68a80eb2017-04-25 05:24:24925
926 EXPECT_TRUE(stream.get());
927
928 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
929 // in streams on different sessions.
zhongyi98d6a9262017-05-19 02:47:45930 QuicStreamRequest request3(factory_.get());
zhongyia00ca012017-07-06 23:36:39931 EXPECT_EQ(OK, request3.Request(host_port_pair_, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:33932 DEFAULT_PRIORITY, SocketTag(),
933 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:03934 &net_error_details_,
935 failed_on_default_network_callback_,
936 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:24937 stream = CreateStream(&request3); // Will reset stream 5.
Ryan Hamiltona12722b2017-08-12 02:23:20938 stream.reset(); // Will reset stream 7.
[email protected]e13201d82012-12-12 05:00:32939
rch37de576c2015-05-17 20:28:17940 EXPECT_TRUE(socket_data.AllReadDataConsumed());
941 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:32942}
943
[email protected]8bd2b812014-03-26 04:01:17944TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
jri7046038f2015-10-22 00:29:26945 Initialize();
Ryan Hamiltona12722b2017-08-12 02:23:20946 factory_->set_require_confirmation(false);
rch6faa4d42016-01-05 20:48:43947 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
948 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26949
rcha00569732016-08-27 11:09:36950 MockQuicData socket_data;
951 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:17952 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]8bd2b812014-03-26 04:01:17953
954 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:27955 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:30956 host_resolver_->set_synchronous_mode(true);
957 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
958 "192.168.0.1", "");
[email protected]8bd2b812014-03-26 04:01:17959
zhongyi98d6a9262017-05-19 02:47:45960 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:33961 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
962 DEFAULT_PRIORITY, SocketTag(),
963 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:03964 &net_error_details_,
965 failed_on_default_network_callback_,
966 callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17967
Yixin Wang7891a39d2017-11-08 20:59:24968 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]8bd2b812014-03-26 04:01:17969 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17970 EXPECT_TRUE(socket_data.AllReadDataConsumed());
971 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17972}
973
rchd6163f32017-01-30 23:50:38974TEST_P(QuicStreamFactoryTest, DefaultInitialRtt) {
975 Initialize();
976 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
977 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
978
979 MockQuicData socket_data;
980 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:43981 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:17982 socket_data.AddSocketDataToFactory(socket_factory_.get());
rchd6163f32017-01-30 23:50:38983
zhongyi98d6a9262017-05-19 02:47:45984 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:33985 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:03986 request.Request(
987 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
988 SocketTag(),
989 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
990 failed_on_default_network_callback_, callback_.callback()));
rchd6163f32017-01-30 23:50:38991
992 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:24993 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rchd6163f32017-01-30 23:50:38994 EXPECT_TRUE(stream.get());
995
996 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
Ryan Hamiltona12722b2017-08-12 02:23:20997 EXPECT_TRUE(session->require_confirmation());
rchd6163f32017-01-30 23:50:38998 EXPECT_EQ(100000u, session->connection()->GetStats().srtt_us);
999 ASSERT_FALSE(session->config()->HasInitialRoundTripTimeUsToSend());
1000}
1001
Helen Li0e823912017-09-25 19:48:301002TEST_P(QuicStreamFactoryTest, FactoryDestroyedWhenJobPending) {
1003 Initialize();
1004 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1005 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1006
1007 MockQuicData socket_data;
1008 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431009 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171010 socket_data.AddSocketDataToFactory(socket_factory_.get());
Helen Li0e823912017-09-25 19:48:301011
1012 auto request = std::make_unique<QuicStreamRequest>(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331013 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031014 request->Request(
1015 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1016 SocketTag(),
1017 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1018 failed_on_default_network_callback_, callback_.callback()));
Helen Li0e823912017-09-25 19:48:301019 request.reset();
1020 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
1021 // Tearing down a QuicStreamFactory with a pending Job should not cause any
1022 // crash. crbug.com/768343.
1023 factory_.reset();
1024}
1025
Ryan Hamiltona12722b2017-08-12 02:23:201026TEST_P(QuicStreamFactoryTest, RequireConfirmation) {
1027 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:271028 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:301029 host_resolver_->set_synchronous_mode(true);
1030 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1031 "192.168.0.1", "");
Ryan Hamiltona12722b2017-08-12 02:23:201032 Initialize();
1033 factory_->set_require_confirmation(true);
1034 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1035 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1036
1037 MockQuicData socket_data;
1038 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431039 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171040 socket_data.AddSocketDataToFactory(socket_factory_.get());
Ryan Hamiltona12722b2017-08-12 02:23:201041
1042 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331043 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031044 request.Request(
1045 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1046 SocketTag(),
1047 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1048 failed_on_default_network_callback_, callback_.callback()));
Ryan Hamiltona12722b2017-08-12 02:23:201049
Ryan Hamilton8e32a2b2017-08-28 20:06:521050 IPAddress last_address;
1051 EXPECT_FALSE(http_server_properties_.GetSupportsQuic(&last_address));
1052
Ryan Hamiltona12722b2017-08-12 02:23:201053 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521054 quic::QuicSession::HANDSHAKE_CONFIRMED);
Ryan Hamiltona12722b2017-08-12 02:23:201055
Ryan Hamilton8e32a2b2017-08-28 20:06:521056 EXPECT_TRUE(http_server_properties_.GetSupportsQuic(&last_address));
1057
Ryan Hamiltona12722b2017-08-12 02:23:201058 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241059 std::unique_ptr<HttpStream> stream = CreateStream(&request);
Ryan Hamiltona12722b2017-08-12 02:23:201060 EXPECT_TRUE(stream.get());
1061
1062 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1063 EXPECT_TRUE(session->require_confirmation());
1064}
1065
1066TEST_P(QuicStreamFactoryTest, DontRequireConfirmationFromSameIP) {
1067 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:271068 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:301069 host_resolver_->set_synchronous_mode(true);
1070 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1071 "192.168.0.1", "");
Ryan Hamiltona12722b2017-08-12 02:23:201072 Initialize();
1073 factory_->set_require_confirmation(true);
1074 http_server_properties_.SetSupportsQuic(IPAddress(192, 0, 2, 33));
1075
1076 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1077 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1078
1079 MockQuicData socket_data;
1080 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431081 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171082 socket_data.AddSocketDataToFactory(socket_factory_.get());
Ryan Hamiltona12722b2017-08-12 02:23:201083
1084 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031085 EXPECT_THAT(request.Request(
1086 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1087 SocketTag(),
1088 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1089 failed_on_default_network_callback_, callback_.callback()),
Paul Jensen8e3c5d32018-02-19 17:06:331090 IsOk());
Ryan Hamiltona12722b2017-08-12 02:23:201091
Ryan Hamilton8e32a2b2017-08-28 20:06:521092 IPAddress last_address;
1093 EXPECT_FALSE(http_server_properties_.GetSupportsQuic(&last_address));
1094
Yixin Wang7891a39d2017-11-08 20:59:241095 std::unique_ptr<HttpStream> stream = CreateStream(&request);
Ryan Hamiltona12722b2017-08-12 02:23:201096 EXPECT_TRUE(stream.get());
1097
1098 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1099 EXPECT_FALSE(session->require_confirmation());
Ryan Hamilton8e32a2b2017-08-28 20:06:521100
1101 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521102 quic::QuicSession::HANDSHAKE_CONFIRMED);
Ryan Hamilton8e32a2b2017-08-28 20:06:521103
1104 EXPECT_TRUE(http_server_properties_.GetSupportsQuic(&last_address));
Ryan Hamiltona12722b2017-08-12 02:23:201105}
1106
rchd6163f32017-01-30 23:50:381107TEST_P(QuicStreamFactoryTest, CachedInitialRtt) {
1108 ServerNetworkStats stats;
1109 stats.srtt = base::TimeDelta::FromMilliseconds(10);
1110 http_server_properties_.SetServerNetworkStats(url::SchemeHostPort(url_),
1111 stats);
Zhongyi Shi967d2f12019-02-08 20:58:531112 test_params_.quic_estimate_initial_rtt = true;
rchd6163f32017-01-30 23:50:381113
1114 Initialize();
1115 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1116 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1117
1118 MockQuicData socket_data;
1119 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431120 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171121 socket_data.AddSocketDataToFactory(socket_factory_.get());
rchd6163f32017-01-30 23:50:381122
zhongyi98d6a9262017-05-19 02:47:451123 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331124 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031125 request.Request(
1126 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1127 SocketTag(),
1128 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1129 failed_on_default_network_callback_, callback_.callback()));
rchd6163f32017-01-30 23:50:381130
1131 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241132 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rchd6163f32017-01-30 23:50:381133 EXPECT_TRUE(stream.get());
1134
1135 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1136 EXPECT_EQ(10000u, session->connection()->GetStats().srtt_us);
1137 ASSERT_TRUE(session->config()->HasInitialRoundTripTimeUsToSend());
1138 EXPECT_EQ(10000u, session->config()->GetInitialRoundTripTimeUsToSend());
1139}
1140
1141TEST_P(QuicStreamFactoryTest, 2gInitialRtt) {
1142 ScopedMockNetworkChangeNotifier notifier;
1143 notifier.mock_network_change_notifier()->SetConnectionType(
1144 NetworkChangeNotifier::CONNECTION_2G);
Zhongyi Shi967d2f12019-02-08 20:58:531145 test_params_.quic_estimate_initial_rtt = true;
rchd6163f32017-01-30 23:50:381146
1147 Initialize();
1148 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1149 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1150
1151 MockQuicData socket_data;
1152 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431153 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171154 socket_data.AddSocketDataToFactory(socket_factory_.get());
rchd6163f32017-01-30 23:50:381155
zhongyi98d6a9262017-05-19 02:47:451156 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331157 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031158 request.Request(
1159 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1160 SocketTag(),
1161 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1162 failed_on_default_network_callback_, callback_.callback()));
rchd6163f32017-01-30 23:50:381163
1164 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241165 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rchd6163f32017-01-30 23:50:381166 EXPECT_TRUE(stream.get());
1167
1168 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1169 EXPECT_EQ(1200000u, session->connection()->GetStats().srtt_us);
1170 ASSERT_TRUE(session->config()->HasInitialRoundTripTimeUsToSend());
1171 EXPECT_EQ(1200000u, session->config()->GetInitialRoundTripTimeUsToSend());
1172}
1173
1174TEST_P(QuicStreamFactoryTest, 3gInitialRtt) {
1175 ScopedMockNetworkChangeNotifier notifier;
1176 notifier.mock_network_change_notifier()->SetConnectionType(
1177 NetworkChangeNotifier::CONNECTION_3G);
Zhongyi Shi967d2f12019-02-08 20:58:531178 test_params_.quic_estimate_initial_rtt = true;
rchd6163f32017-01-30 23:50:381179
1180 Initialize();
1181 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1182 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1183
1184 MockQuicData socket_data;
1185 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431186 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171187 socket_data.AddSocketDataToFactory(socket_factory_.get());
rchd6163f32017-01-30 23:50:381188
zhongyi98d6a9262017-05-19 02:47:451189 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331190 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031191 request.Request(
1192 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1193 SocketTag(),
1194 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1195 failed_on_default_network_callback_, callback_.callback()));
rchd6163f32017-01-30 23:50:381196
1197 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241198 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rchd6163f32017-01-30 23:50:381199 EXPECT_TRUE(stream.get());
1200
1201 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1202 EXPECT_EQ(400000u, session->connection()->GetStats().srtt_us);
1203 ASSERT_TRUE(session->config()->HasInitialRoundTripTimeUsToSend());
1204 EXPECT_EQ(400000u, session->config()->GetInitialRoundTripTimeUsToSend());
1205}
1206
rch68955482015-09-24 00:14:391207TEST_P(QuicStreamFactoryTest, GoAway) {
jri7046038f2015-10-22 00:29:261208 Initialize();
rch6faa4d42016-01-05 20:48:431209 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1210 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261211
rcha00569732016-08-27 11:09:361212 MockQuicData socket_data;
1213 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431214 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171215 socket_data.AddSocketDataToFactory(socket_factory_.get());
rch68955482015-09-24 00:14:391216
zhongyi98d6a9262017-05-19 02:47:451217 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331218 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031219 request.Request(
1220 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1221 SocketTag(),
1222 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1223 failed_on_default_network_callback_, callback_.callback()));
rch68955482015-09-24 00:14:391224
robpercival214763f2016-07-01 23:27:011225 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241226 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rch68955482015-09-24 00:14:391227 EXPECT_TRUE(stream.get());
1228
bnc912a04b2016-04-20 14:19:501229 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
rch68955482015-09-24 00:14:391230
Ryan Hamilton8d9ee76e2018-05-29 23:52:521231 session->OnGoAway(quic::QuicGoAwayFrame());
rch68955482015-09-24 00:14:391232
bnc912a04b2016-04-20 14:19:501233 EXPECT_FALSE(HasActiveSession(host_port_pair_));
rch68955482015-09-24 00:14:391234
1235 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1236 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1237}
1238
zhongyi6b5a3892016-03-12 04:46:201239TEST_P(QuicStreamFactoryTest, GoAwayForConnectionMigrationWithPortOnly) {
1240 Initialize();
1241 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1242 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1243
rcha00569732016-08-27 11:09:361244 MockQuicData socket_data;
1245 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431246 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171247 socket_data.AddSocketDataToFactory(socket_factory_.get());
zhongyi6b5a3892016-03-12 04:46:201248
zhongyi98d6a9262017-05-19 02:47:451249 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331250 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031251 request.Request(
1252 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1253 SocketTag(),
1254 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1255 failed_on_default_network_callback_, callback_.callback()));
zhongyi6b5a3892016-03-12 04:46:201256
robpercival214763f2016-07-01 23:27:011257 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241258 std::unique_ptr<HttpStream> stream = CreateStream(&request);
zhongyi6b5a3892016-03-12 04:46:201259 EXPECT_TRUE(stream.get());
1260
bnc912a04b2016-04-20 14:19:501261 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
zhongyi6b5a3892016-03-12 04:46:201262
Ryan Hamilton8d9ee76e2018-05-29 23:52:521263 session->OnGoAway(quic::QuicGoAwayFrame(
1264 quic::kInvalidControlFrameId, quic::QUIC_ERROR_MIGRATING_PORT, 0,
1265 "peer connection migration due to port change only"));
zhongyi6b5a3892016-03-12 04:46:201266 NetErrorDetails details;
1267 EXPECT_FALSE(details.quic_port_migration_detected);
1268 session->PopulateNetErrorDetails(&details);
1269 EXPECT_TRUE(details.quic_port_migration_detected);
1270 details.quic_port_migration_detected = false;
1271 stream->PopulateNetErrorDetails(&details);
1272 EXPECT_TRUE(details.quic_port_migration_detected);
1273
bnc912a04b2016-04-20 14:19:501274 EXPECT_FALSE(HasActiveSession(host_port_pair_));
zhongyi6b5a3892016-03-12 04:46:201275
1276 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1277 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1278}
1279
[email protected]5db452202014-08-19 05:22:151280TEST_P(QuicStreamFactoryTest, Pooling) {
jri7046038f2015-10-22 00:29:261281 Initialize();
rch6faa4d42016-01-05 20:48:431282 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1283 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261284
rcha00569732016-08-27 11:09:361285 MockQuicData socket_data;
1286 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431287 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171288 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]eed749f92013-12-23 18:57:381289
rch6faa4d42016-01-05 20:48:431290 HostPortPair server2(kServer2HostName, kDefaultServerPort);
Renjiea0cb4a2c2018-09-26 23:37:301291 host_resolver_->set_synchronous_mode(true);
1292 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1293 "192.168.0.1", "");
1294 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:381295
zhongyi98d6a9262017-05-19 02:47:451296 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331297 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
1298 DEFAULT_PRIORITY, SocketTag(),
1299 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:031300 &net_error_details_,
1301 failed_on_default_network_callback_,
1302 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241303 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]eed749f92013-12-23 18:57:381304 EXPECT_TRUE(stream.get());
1305
1306 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451307 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031308 EXPECT_EQ(OK,
1309 request2.Request(
1310 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1311 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1312 failed_on_default_network_callback_, callback.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241313 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]eed749f92013-12-23 18:57:381314 EXPECT_TRUE(stream2.get());
1315
bnc912a04b2016-04-20 14:19:501316 EXPECT_EQ(GetActiveSession(host_port_pair_), GetActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:381317
rch37de576c2015-05-17 20:28:171318 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1319 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:381320}
1321
jri94ddc3142016-08-26 01:32:431322TEST_P(QuicStreamFactoryTest, PoolingWithServerMigration) {
1323 // Set up session to migrate.
Renjiea0cb4a2c2018-09-26 23:37:301324 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1325 "192.168.0.1", "");
jri94ddc3142016-08-26 01:32:431326 IPEndPoint alt_address = IPEndPoint(IPAddress(1, 2, 3, 4), 443);
Ryan Hamilton8d9ee76e2018-05-29 23:52:521327 quic::QuicConfig config;
fayang91ca2012016-11-22 07:42:461328 config.SetAlternateServerAddressToSend(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521329 quic::QuicSocketAddress(quic::QuicSocketAddressImpl(alt_address)));
jri94ddc3142016-08-26 01:32:431330
1331 VerifyServerMigration(config, alt_address);
1332
1333 // Close server-migrated session.
1334 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
Renjieba55fae2018-09-20 03:05:161335 session->CloseSessionOnError(0u, quic::QUIC_NO_ERROR,
1336 quic::ConnectionCloseBehavior::SILENT_CLOSE);
jri94ddc3142016-08-26 01:32:431337
1338 // Set up server IP, socket, proof, and config for new session.
1339 HostPortPair server2(kServer2HostName, kDefaultServerPort);
Renjiea0cb4a2c2018-09-26 23:37:301340 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
jri94ddc3142016-08-26 01:32:431341
1342 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
Ryan Hamilton8d9ee76e2018-05-29 23:52:521343 std::unique_ptr<quic::QuicEncryptedPacket> settings_packet(
rch5cb522462017-04-25 20:18:361344 client_maker_.MakeInitialSettingsPacket(1, nullptr));
bnceb9aa7112017-01-05 01:03:461345 MockWrite writes[] = {MockWrite(SYNCHRONOUS, settings_packet->data(),
1346 settings_packet->length(), 1)};
fayang3bcb8b502016-12-07 21:44:371347
Ryan Sleevib8d7ea02018-05-07 20:01:011348 SequencedSocketData socket_data(reads, writes);
Zhongyi Shi5f587cc2017-11-21 23:24:171349 socket_factory_->AddSocketDataProvider(&socket_data);
jri94ddc3142016-08-26 01:32:431350
1351 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1352 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
Ryan Hamilton8d9ee76e2018-05-29 23:52:521353 quic::QuicConfig config2;
jri94ddc3142016-08-26 01:32:431354 crypto_client_stream_factory_.SetConfig(config2);
1355
1356 // Create new request to cause new session creation.
1357 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451358 QuicStreamRequest request2(factory_.get());
jri94ddc3142016-08-26 01:32:431359 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031360 request2.Request(
1361 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1362 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1363 failed_on_default_network_callback_, callback.callback()));
jri94ddc3142016-08-26 01:32:431364 EXPECT_EQ(OK, callback.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:241365 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
jri94ddc3142016-08-26 01:32:431366 EXPECT_TRUE(stream2.get());
1367
1368 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1369 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1370 // EXPECT_EQ(GetActiveSession(host_port_pair_), GetActiveSession(server2));
1371}
1372
[email protected]eed749f92013-12-23 18:57:381373TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
jri7046038f2015-10-22 00:29:261374 Initialize();
rch6faa4d42016-01-05 20:48:431375 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1376 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1377 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261378
rcha00569732016-08-27 11:09:361379 MockQuicData socket_data1;
1380 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431381 socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171382 socket_data1.AddSocketDataToFactory(socket_factory_.get());
rcha00569732016-08-27 11:09:361383 MockQuicData socket_data2;
1384 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431385 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171386 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]eed749f92013-12-23 18:57:381387
rch6faa4d42016-01-05 20:48:431388 HostPortPair server2(kServer2HostName, kDefaultServerPort);
Renjiea0cb4a2c2018-09-26 23:37:301389 host_resolver_->set_synchronous_mode(true);
1390 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1391 "192.168.0.1", "");
1392 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:381393
zhongyi98d6a9262017-05-19 02:47:451394 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331395 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
1396 DEFAULT_PRIORITY, SocketTag(),
1397 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:031398 &net_error_details_,
1399 failed_on_default_network_callback_,
1400 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241401 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]eed749f92013-12-23 18:57:381402 EXPECT_TRUE(stream.get());
1403
1404 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451405 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031406 EXPECT_EQ(OK,
1407 request2.Request(
1408 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1409 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1410 failed_on_default_network_callback_, callback.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241411 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]eed749f92013-12-23 18:57:381412 EXPECT_TRUE(stream2.get());
1413
bnc912a04b2016-04-20 14:19:501414 factory_->OnSessionGoingAway(GetActiveSession(host_port_pair_));
1415 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1416 EXPECT_FALSE(HasActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:381417
1418 TestCompletionCallback callback3;
zhongyi98d6a9262017-05-19 02:47:451419 QuicStreamRequest request3(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031420 EXPECT_EQ(OK,
1421 request3.Request(
1422 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1423 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1424 failed_on_default_network_callback_, callback3.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241425 std::unique_ptr<HttpStream> stream3 = CreateStream(&request3);
[email protected]eed749f92013-12-23 18:57:381426 EXPECT_TRUE(stream3.get());
1427
bnc912a04b2016-04-20 14:19:501428 EXPECT_TRUE(HasActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:381429
rch37de576c2015-05-17 20:28:171430 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1431 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1432 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1433 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:381434}
1435
[email protected]5db452202014-08-19 05:22:151436TEST_P(QuicStreamFactoryTest, HttpsPooling) {
jri7046038f2015-10-22 00:29:261437 Initialize();
rch6faa4d42016-01-05 20:48:431438
rcha00569732016-08-27 11:09:361439 MockQuicData socket_data;
1440 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431441 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171442 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]eed749f92013-12-23 18:57:381443
rch6faa4d42016-01-05 20:48:431444 HostPortPair server1(kDefaultServerHostName, 443);
1445 HostPortPair server2(kServer2HostName, 443);
[email protected]eed749f92013-12-23 18:57:381446
bncf8bf0722015-05-19 20:04:131447 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011448 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:381449
Renjiea0cb4a2c2018-09-26 23:37:301450 host_resolver_->set_synchronous_mode(true);
1451 host_resolver_->rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1452 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:381453
zhongyi98d6a9262017-05-19 02:47:451454 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031455 EXPECT_EQ(OK,
1456 request.Request(
1457 server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1458 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1459 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241460 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]eed749f92013-12-23 18:57:381461 EXPECT_TRUE(stream.get());
1462
1463 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451464 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031465 EXPECT_EQ(OK,
1466 request2.Request(
1467 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1468 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1469 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241470 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]eed749f92013-12-23 18:57:381471 EXPECT_TRUE(stream2.get());
1472
bnc912a04b2016-04-20 14:19:501473 EXPECT_EQ(GetActiveSession(server1), GetActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:381474
rch37de576c2015-05-17 20:28:171475 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1476 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:381477}
1478
[email protected]5db452202014-08-19 05:22:151479TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
jri7046038f2015-10-22 00:29:261480 Initialize();
rcha00569732016-08-27 11:09:361481 MockQuicData socket_data;
1482 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431483 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171484 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]5db452202014-08-19 05:22:151485
rch6faa4d42016-01-05 20:48:431486 HostPortPair server1(kDefaultServerHostName, 443);
1487 HostPortPair server2(kServer2HostName, 443);
Matt Mueller230996f12018-10-22 19:39:441488 transport_security_state_.EnableStaticPinsForTesting();
1489 ScopedTransportSecurityStateSource scoped_security_state_source;
[email protected]5db452202014-08-19 05:22:151490
Matt Mueller230996f12018-10-22 19:39:441491 HashValue primary_pin(HASH_VALUE_SHA256);
1492 EXPECT_TRUE(primary_pin.FromString(
1493 "sha256/Nn8jk5By4Vkq6BeOVZ7R7AC6XUUBZsWmUbJR1f1Y5FY="));
bncf8bf0722015-05-19 20:04:131494 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
Matt Mueller230996f12018-10-22 19:39:441495 verify_details.cert_verify_result.public_key_hashes.push_back(primary_pin);
bnc20daf9a2015-05-15 17:11:011496 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]5db452202014-08-19 05:22:151497
Renjiea0cb4a2c2018-09-26 23:37:301498 host_resolver_->set_synchronous_mode(true);
1499 host_resolver_->rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1500 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]5db452202014-08-19 05:22:151501
zhongyi98d6a9262017-05-19 02:47:451502 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031503 EXPECT_EQ(OK,
1504 request.Request(
1505 server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1506 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1507 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241508 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]5db452202014-08-19 05:22:151509 EXPECT_TRUE(stream.get());
1510
1511 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451512 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031513 EXPECT_EQ(OK,
1514 request2.Request(
1515 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1516 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1517 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241518 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]5db452202014-08-19 05:22:151519 EXPECT_TRUE(stream2.get());
1520
bnc912a04b2016-04-20 14:19:501521 EXPECT_EQ(GetActiveSession(server1), GetActiveSession(server2));
[email protected]5db452202014-08-19 05:22:151522
rch37de576c2015-05-17 20:28:171523 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1524 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:151525}
1526
1527TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
jri7046038f2015-10-22 00:29:261528 Initialize();
rcha00569732016-08-27 11:09:361529
1530 MockQuicData socket_data1;
1531 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431532 socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171533 socket_data1.AddSocketDataToFactory(socket_factory_.get());
rcha00569732016-08-27 11:09:361534 MockQuicData socket_data2;
1535 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431536 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171537 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]5db452202014-08-19 05:22:151538
rch6faa4d42016-01-05 20:48:431539 HostPortPair server1(kDefaultServerHostName, 443);
1540 HostPortPair server2(kServer2HostName, 443);
Matt Mueller230996f12018-10-22 19:39:441541 transport_security_state_.EnableStaticPinsForTesting();
1542 ScopedTransportSecurityStateSource scoped_security_state_source;
[email protected]5db452202014-08-19 05:22:151543
bncf8bf0722015-05-19 20:04:131544 ProofVerifyDetailsChromium verify_details1 = DefaultProofVerifyDetails();
Matt Mueller230996f12018-10-22 19:39:441545 uint8_t bad_pin = 3;
bnc20daf9a2015-05-15 17:11:011546 verify_details1.cert_verify_result.public_key_hashes.push_back(
1547 test::GetTestHashValue(bad_pin));
1548 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
1549
Matt Mueller230996f12018-10-22 19:39:441550 HashValue primary_pin(HASH_VALUE_SHA256);
1551 EXPECT_TRUE(primary_pin.FromString(
1552 "sha256/Nn8jk5By4Vkq6BeOVZ7R7AC6XUUBZsWmUbJR1f1Y5FY="));
bncf8bf0722015-05-19 20:04:131553 ProofVerifyDetailsChromium verify_details2 = DefaultProofVerifyDetails();
Matt Mueller230996f12018-10-22 19:39:441554 verify_details2.cert_verify_result.public_key_hashes.push_back(primary_pin);
bnc20daf9a2015-05-15 17:11:011555 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
[email protected]5db452202014-08-19 05:22:151556
Renjiea0cb4a2c2018-09-26 23:37:301557 host_resolver_->set_synchronous_mode(true);
1558 host_resolver_->rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1559 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]5db452202014-08-19 05:22:151560
zhongyi98d6a9262017-05-19 02:47:451561 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031562 EXPECT_EQ(OK,
1563 request.Request(
1564 server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1565 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1566 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241567 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]5db452202014-08-19 05:22:151568 EXPECT_TRUE(stream.get());
1569
1570 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451571 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031572 EXPECT_EQ(OK,
1573 request2.Request(
1574 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1575 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1576 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241577 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]5db452202014-08-19 05:22:151578 EXPECT_TRUE(stream2.get());
1579
bnc912a04b2016-04-20 14:19:501580 EXPECT_NE(GetActiveSession(server1), GetActiveSession(server2));
[email protected]5db452202014-08-19 05:22:151581
rch37de576c2015-05-17 20:28:171582 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1583 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1584 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1585 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:151586}
1587
[email protected]1e960032013-12-20 19:00:201588TEST_P(QuicStreamFactoryTest, Goaway) {
jri7046038f2015-10-22 00:29:261589 Initialize();
rch6faa4d42016-01-05 20:48:431590 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1591 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1592 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1593
rcha00569732016-08-27 11:09:361594 MockQuicData socket_data;
1595 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431596 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171597 socket_data.AddSocketDataToFactory(socket_factory_.get());
rcha00569732016-08-27 11:09:361598 MockQuicData socket_data2;
1599 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431600 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171601 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]4d283b32013-10-17 12:57:271602
zhongyi98d6a9262017-05-19 02:47:451603 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331604 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031605 request.Request(
1606 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1607 SocketTag(),
1608 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1609 failed_on_default_network_callback_, callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271610
robpercival214763f2016-07-01 23:27:011611 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241612 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]4d283b32013-10-17 12:57:271613 EXPECT_TRUE(stream.get());
1614
1615 // Mark the session as going away. Ensure that while it is still alive
1616 // that it is no longer active.
bnc912a04b2016-04-20 14:19:501617 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7046038f2015-10-22 00:29:261618 factory_->OnSessionGoingAway(session);
1619 EXPECT_EQ(true,
1620 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
bnc912a04b2016-04-20 14:19:501621 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]4d283b32013-10-17 12:57:271622
1623 // Create a new request for the same destination and verify that a
1624 // new session is created.
zhongyi98d6a9262017-05-19 02:47:451625 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331626 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031627 request2.Request(
1628 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1629 SocketTag(),
1630 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1631 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:011632 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241633 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]4d283b32013-10-17 12:57:271634 EXPECT_TRUE(stream2.get());
1635
bnc912a04b2016-04-20 14:19:501636 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1637 EXPECT_NE(session, GetActiveSession(host_port_pair_));
jri7046038f2015-10-22 00:29:261638 EXPECT_EQ(true,
1639 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
[email protected]4d283b32013-10-17 12:57:271640
1641 stream2.reset();
1642 stream.reset();
1643
rch37de576c2015-05-17 20:28:171644 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1645 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1646 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1647 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]4d283b32013-10-17 12:57:271648}
1649
[email protected]1e960032013-12-20 19:00:201650TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
jri7046038f2015-10-22 00:29:261651 Initialize();
rch6faa4d42016-01-05 20:48:431652 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1653 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1654
Fan Yang32c5a112018-12-10 20:06:331655 quic::QuicStreamId stream_id = GetNthClientInitiatedBidirectionalStreamId(0);
rcha00569732016-08-27 11:09:361656 MockQuicData socket_data;
Zhongyi Shi32f2fd02018-04-16 18:23:431657 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Frank Kastenholz878763bf2018-11-28 19:14:481658 if (version_ == quic::QUIC_VERSION_99) {
Fan Yang32c5a112018-12-10 20:06:331659 socket_data.AddWrite(
1660 SYNCHRONOUS,
1661 client_maker_.MakeStreamIdBlockedPacket(
1662 2, true, GetNthClientInitiatedBidirectionalStreamId(49)));
Frank Kastenholzc9b9bea2018-12-03 20:13:471663 socket_data.AddWrite(
1664 SYNCHRONOUS, client_maker_.MakeRstPacket(3, true, stream_id,
1665 quic::QUIC_STREAM_CANCELLED));
1666 socket_data.AddRead(
1667 ASYNC, server_maker_.MakeRstPacket(1, false, stream_id,
1668 quic::QUIC_STREAM_CANCELLED));
Fan Yang32c5a112018-12-10 20:06:331669 socket_data.AddRead(
1670 ASYNC, server_maker_.MakeMaxStreamIdPacket(
1671 4, true, GetNthClientInitiatedBidirectionalStreamId(50)));
Frank Kastenholzc9b9bea2018-12-03 20:13:471672 } else {
1673 socket_data.AddWrite(
1674 SYNCHRONOUS, client_maker_.MakeRstPacket(2, true, stream_id,
1675 quic::QUIC_STREAM_CANCELLED));
1676 socket_data.AddRead(
1677 ASYNC, server_maker_.MakeRstPacket(1, false, stream_id,
1678 quic::QUIC_STREAM_CANCELLED));
Frank Kastenholz878763bf2018-11-28 19:14:481679 }
rcha00569732016-08-27 11:09:361680 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:171681 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]0b2294d32013-08-02 00:46:361682
1683 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:391684 request_info.traffic_annotation =
1685 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
1686
xunjieli1d2b4272017-04-25 22:37:171687 std::vector<std::unique_ptr<HttpStream>> streams;
Ryan Hamilton9835e662018-08-02 05:36:271688 // The MockCryptoClientStream sets max_open_streams to be
Ryan Hamilton8d9ee76e2018-05-29 23:52:521689 // quic::kDefaultMaxStreamsPerConnection / 2.
1690 for (size_t i = 0; i < quic::kDefaultMaxStreamsPerConnection / 2; i++) {
zhongyi98d6a9262017-05-19 02:47:451691 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031692 int rv = request.Request(
1693 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1694 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1695 failed_on_default_network_callback_, callback_.callback());
[email protected]0b2294d32013-08-02 00:46:361696 if (i == 0) {
robpercival214763f2016-07-01 23:27:011697 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1698 EXPECT_THAT(callback_.WaitForResult(), IsOk());
[email protected]0b2294d32013-08-02 00:46:361699 } else {
robpercival214763f2016-07-01 23:27:011700 EXPECT_THAT(rv, IsOk());
[email protected]0b2294d32013-08-02 00:46:361701 }
Yixin Wang7891a39d2017-11-08 20:59:241702 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]0b2294d32013-08-02 00:46:361703 EXPECT_TRUE(stream);
Steven Valdezb4ff0412018-01-18 22:39:271704 EXPECT_EQ(OK,
1705 stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:391706 net_log_, CompletionOnceCallback()));
avib3635452016-10-21 18:33:531707 streams.push_back(std::move(stream));
[email protected]0b2294d32013-08-02 00:46:361708 }
1709
zhongyi98d6a9262017-05-19 02:47:451710 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331711 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
1712 DEFAULT_PRIORITY, SocketTag(),
1713 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:031714 &net_error_details_,
1715 failed_on_default_network_callback_,
1716 CompletionOnceCallback()));
Yixin Wang7891a39d2017-11-08 20:59:241717 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]0b2294d32013-08-02 00:46:361718 EXPECT_TRUE(stream);
rjshaded5ced072015-12-18 19:26:021719 EXPECT_EQ(ERR_IO_PENDING,
Steven Valdezb4ff0412018-01-18 22:39:271720 stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
1721 net_log_, callback_.callback()));
[email protected]0b2294d32013-08-02 00:46:361722
1723 // Close the first stream.
1724 streams.front()->Close(false);
ckrasicea295fe2015-10-31 05:03:271725 // Trigger exchange of RSTs that in turn allow progress for the last
1726 // stream.
Frank Kastenholz878763bf2018-11-28 19:14:481727 base::RunLoop().RunUntilIdle();
robpercival214763f2016-07-01 23:27:011728 EXPECT_THAT(callback_.WaitForResult(), IsOk());
[email protected]0b2294d32013-08-02 00:46:361729
rch37de576c2015-05-17 20:28:171730 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1731 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
ckrasicea295fe2015-10-31 05:03:271732
1733 // Force close of the connection to suppress the generation of RST
1734 // packets when streams are torn down, which wouldn't be relevant to
1735 // this test anyway.
bnc912a04b2016-04-20 14:19:501736 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:521737 session->connection()->CloseConnection(
1738 quic::QUIC_PUBLIC_RESET, "test",
1739 quic::ConnectionCloseBehavior::SILENT_CLOSE);
[email protected]0b2294d32013-08-02 00:46:361740}
1741
[email protected]1e960032013-12-20 19:00:201742TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
jri7046038f2015-10-22 00:29:261743 Initialize();
rcha00569732016-08-27 11:09:361744 MockQuicData socket_data;
Zhongyi Shi5f587cc2017-11-21 23:24:171745 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]e13201d82012-12-12 05:00:321746
Renjiea0cb4a2c2018-09-26 23:37:301747 host_resolver_->rules()->AddSimulatedFailure(kDefaultServerHostName);
[email protected]e13201d82012-12-12 05:00:321748
zhongyi98d6a9262017-05-19 02:47:451749 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331750 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031751 request.Request(
1752 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1753 SocketTag(),
1754 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1755 failed_on_default_network_callback_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321756
robpercival214763f2016-07-01 23:27:011757 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
[email protected]e13201d82012-12-12 05:00:321758
rch37de576c2015-05-17 20:28:171759 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1760 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321761}
1762
[email protected]1e960032013-12-20 19:00:201763TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
jri7046038f2015-10-22 00:29:261764 Initialize();
rcha00569732016-08-27 11:09:361765
1766 MockQuicData socket_data;
1767 socket_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
Zhongyi Shi5f587cc2017-11-21 23:24:171768 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]3c772402013-12-18 21:38:111769
zhongyi98d6a9262017-05-19 02:47:451770 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331771 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031772 request.Request(
1773 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1774 SocketTag(),
1775 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1776 failed_on_default_network_callback_, callback_.callback()));
[email protected]3c772402013-12-18 21:38:111777
robpercival214763f2016-07-01 23:27:011778 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_ADDRESS_IN_USE));
[email protected]3c772402013-12-18 21:38:111779
rch37de576c2015-05-17 20:28:171780 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1781 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:111782}
1783
[email protected]1e960032013-12-20 19:00:201784TEST_P(QuicStreamFactoryTest, CancelCreate) {
jri7046038f2015-10-22 00:29:261785 Initialize();
rcha00569732016-08-27 11:09:361786 MockQuicData socket_data;
1787 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431788 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171789 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]e13201d82012-12-12 05:00:321790 {
zhongyi98d6a9262017-05-19 02:47:451791 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331792 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031793 request.Request(
1794 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1795 SocketTag(),
1796 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1797 failed_on_default_network_callback_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321798 }
1799
mmenke651bae7f2015-12-18 21:26:451800 base::RunLoop().RunUntilIdle();
[email protected]e13201d82012-12-12 05:00:321801
zhongyi98d6a9262017-05-19 02:47:451802 QuicStreamRequest request2(factory_.get());
zhongyia00ca012017-07-06 23:36:391803 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:331804 DEFAULT_PRIORITY, SocketTag(),
1805 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:031806 &net_error_details_,
1807 failed_on_default_network_callback_,
1808 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241809 std::unique_ptr<HttpStream> stream = CreateStream(&request2);
rch68a80eb2017-04-25 05:24:241810
[email protected]e13201d82012-12-12 05:00:321811 EXPECT_TRUE(stream.get());
1812 stream.reset();
1813
rch37de576c2015-05-17 20:28:171814 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1815 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321816}
1817
[email protected]1e960032013-12-20 19:00:201818TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
jri7046038f2015-10-22 00:29:261819 Initialize();
rch6faa4d42016-01-05 20:48:431820 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1821 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1822 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1823
rcha00569732016-08-27 11:09:361824 MockQuicData socket_data;
1825 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431826 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Ryan Hamilton8d9ee76e2018-05-29 23:52:521827 socket_data.AddWrite(
1828 SYNCHRONOUS, ConstructClientRstPacket(2, quic::QUIC_RST_ACKNOWLEDGEMENT));
Renjieba55fae2018-09-20 03:05:161829 socket_data.AddWrite(SYNCHRONOUS,
1830 client_maker_.MakeConnectionClosePacket(
1831 3, true, quic::QUIC_INTERNAL_ERROR, "net error"));
Zhongyi Shi5f587cc2017-11-21 23:24:171832 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]56dfb902013-01-03 23:17:551833
rcha00569732016-08-27 11:09:361834 MockQuicData socket_data2;
1835 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431836 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171837 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]56dfb902013-01-03 23:17:551838
zhongyi98d6a9262017-05-19 02:47:451839 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331840 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031841 request.Request(
1842 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1843 SocketTag(),
1844 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1845 failed_on_default_network_callback_, callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551846
robpercival214763f2016-07-01 23:27:011847 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241848 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]0b2294d32013-08-02 00:46:361849 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:391850 request_info.traffic_annotation =
1851 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:271852 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:391853 net_log_, CompletionOnceCallback()));
[email protected]56dfb902013-01-03 23:17:551854
1855 // Close the session and verify that stream saw the error.
Ryan Hamilton8d9ee76e2018-05-29 23:52:521856 factory_->CloseAllSessions(ERR_INTERNET_DISCONNECTED,
1857 quic::QUIC_INTERNAL_ERROR);
[email protected]56dfb902013-01-03 23:17:551858 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1859 stream->ReadResponseHeaders(callback_.callback()));
1860
1861 // Now attempting to request a stream to the same origin should create
1862 // a new session.
1863
zhongyi98d6a9262017-05-19 02:47:451864 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331865 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031866 request2.Request(
1867 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1868 SocketTag(),
1869 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1870 failed_on_default_network_callback_, callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551871
robpercival214763f2016-07-01 23:27:011872 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241873 stream = CreateStream(&request2);
[email protected]56dfb902013-01-03 23:17:551874 stream.reset(); // Will reset stream 3.
1875
rch37de576c2015-05-17 20:28:171876 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1877 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1878 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1879 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]56dfb902013-01-03 23:17:551880}
1881
zhongyi363c91c2017-03-23 23:16:081882// Regression test for crbug.com/700617. Test a write error during the
1883// crypto handshake will not hang QuicStreamFactory::Job and should
1884// report QUIC_HANDSHAKE_FAILED to upper layers. Subsequent
1885// QuicStreamRequest should succeed without hanging.
1886TEST_P(QuicStreamFactoryTest,
1887 WriteErrorInCryptoConnectWithAsyncHostResolution) {
1888 Initialize();
1889 // Use unmocked crypto stream to do crypto connect.
1890 crypto_client_stream_factory_.set_handshake_mode(
Zhongyi Shi879659422018-08-02 17:58:251891 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
zhongyi363c91c2017-03-23 23:16:081892
1893 MockQuicData socket_data;
1894 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1895 // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect.
1896 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:171897 socket_data.AddSocketDataToFactory(socket_factory_.get());
zhongyi363c91c2017-03-23 23:16:081898
1899 // Create request, should fail after the write of the CHLO fails.
zhongyi98d6a9262017-05-19 02:47:451900 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331901 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031902 request.Request(
1903 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1904 SocketTag(),
1905 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1906 failed_on_default_network_callback_, callback_.callback()));
zhongyi363c91c2017-03-23 23:16:081907 EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, callback_.WaitForResult());
1908 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1909 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
1910
1911 // Verify new requests can be sent normally without hanging.
1912 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:271913 MockCryptoClientStream::COLD_START);
zhongyi363c91c2017-03-23 23:16:081914 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1915 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1916 MockQuicData socket_data2;
1917 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431918 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171919 socket_data2.AddSocketDataToFactory(socket_factory_.get());
zhongyi363c91c2017-03-23 23:16:081920
zhongyi98d6a9262017-05-19 02:47:451921 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331922 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031923 request2.Request(
1924 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1925 SocketTag(),
1926 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1927 failed_on_default_network_callback_, callback_.callback()));
zhongyi363c91c2017-03-23 23:16:081928 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1929 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
1930 // Run the message loop to complete host resolution.
1931 base::RunLoop().RunUntilIdle();
1932
1933 // Complete handshake. QuicStreamFactory::Job should complete and succeed.
1934 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521935 quic::QuicSession::HANDSHAKE_CONFIRMED);
zhongyi363c91c2017-03-23 23:16:081936 EXPECT_THAT(callback_.WaitForResult(), IsOk());
1937 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1938 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
1939
1940 // Create QuicHttpStream.
Yixin Wang7891a39d2017-11-08 20:59:241941 std::unique_ptr<HttpStream> stream = CreateStream(&request2);
zhongyi363c91c2017-03-23 23:16:081942 EXPECT_TRUE(stream.get());
1943 stream.reset();
1944 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1945 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1946 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1947 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1948}
1949
1950TEST_P(QuicStreamFactoryTest, WriteErrorInCryptoConnectWithSyncHostResolution) {
1951 Initialize();
1952 // Use unmocked crypto stream to do crypto connect.
1953 crypto_client_stream_factory_.set_handshake_mode(
Zhongyi Shi879659422018-08-02 17:58:251954 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
Renjiea0cb4a2c2018-09-26 23:37:301955 host_resolver_->set_synchronous_mode(true);
1956 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1957 "192.168.0.1", "");
zhongyi363c91c2017-03-23 23:16:081958
1959 MockQuicData socket_data;
1960 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1961 // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect.
1962 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:171963 socket_data.AddSocketDataToFactory(socket_factory_.get());
zhongyi363c91c2017-03-23 23:16:081964
1965 // Create request, should fail immediately.
zhongyi98d6a9262017-05-19 02:47:451966 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331967 EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED,
Zhongyi Shia6b68d112018-09-24 07:49:031968 request.Request(
1969 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1970 SocketTag(),
1971 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1972 failed_on_default_network_callback_, callback_.callback()));
zhongyi363c91c2017-03-23 23:16:081973 // Check no active session, or active jobs left for this server.
1974 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1975 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
1976
1977 // Verify new requests can be sent normally without hanging.
1978 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:271979 MockCryptoClientStream::COLD_START);
zhongyi363c91c2017-03-23 23:16:081980 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1981 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1982 MockQuicData socket_data2;
1983 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431984 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171985 socket_data2.AddSocketDataToFactory(socket_factory_.get());
zhongyi363c91c2017-03-23 23:16:081986
zhongyi98d6a9262017-05-19 02:47:451987 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331988 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031989 request2.Request(
1990 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1991 SocketTag(),
1992 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1993 failed_on_default_network_callback_, callback_.callback()));
zhongyi363c91c2017-03-23 23:16:081994 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1995 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
1996
1997 // Complete handshake.
1998 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521999 quic::QuicSession::HANDSHAKE_CONFIRMED);
zhongyi363c91c2017-03-23 23:16:082000 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2001 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2002 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
2003
2004 // Create QuicHttpStream.
Yixin Wang7891a39d2017-11-08 20:59:242005 std::unique_ptr<HttpStream> stream = CreateStream(&request2);
zhongyi363c91c2017-03-23 23:16:082006 EXPECT_TRUE(stream.get());
2007 stream.reset();
2008 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2009 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2010 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2011 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2012}
2013
Zhongyi Shi63574b72018-06-01 20:22:252014TEST_P(QuicStreamFactoryTest, CloseSessionsOnIPAddressChanged) {
Zhongyi Shi967d2f12019-02-08 20:58:532015 test_params_.quic_close_sessions_on_ip_change = true;
jri7046038f2015-10-22 00:29:262016 Initialize();
rch6faa4d42016-01-05 20:48:432017 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2018 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2019 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri8c44d692015-10-23 23:53:412020
rcha00569732016-08-27 11:09:362021 MockQuicData socket_data;
2022 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432023 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Ryan Hamilton8d9ee76e2018-05-29 23:52:522024 socket_data.AddWrite(
2025 SYNCHRONOUS, ConstructClientRstPacket(2, quic::QUIC_RST_ACKNOWLEDGEMENT));
Renjieba55fae2018-09-20 03:05:162026 socket_data.AddWrite(
2027 SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
2028 3, true, quic::QUIC_IP_ADDRESS_CHANGED, "net error"));
Zhongyi Shi5f587cc2017-11-21 23:24:172029 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]f698a012013-05-06 20:18:592030
rcha00569732016-08-27 11:09:362031 MockQuicData socket_data2;
2032 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432033 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:172034 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]f698a012013-05-06 20:18:592035
zhongyi98d6a9262017-05-19 02:47:452036 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332037 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032038 request.Request(
2039 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2040 SocketTag(),
2041 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2042 failed_on_default_network_callback_, callback_.callback()));
[email protected]f698a012013-05-06 20:18:592043
robpercival214763f2016-07-01 23:27:012044 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242045 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]0b2294d32013-08-02 00:46:362046 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:392047 request_info.traffic_annotation =
2048 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272049 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392050 net_log_, CompletionOnceCallback()));
[email protected]f698a012013-05-06 20:18:592051
Zhongyi Shi63574b72018-06-01 20:22:252052 // Check an active session exisits for the destination.
2053 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2054 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2055 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2056
Ryan Hamilton8e32a2b2017-08-28 20:06:522057 IPAddress last_address;
2058 EXPECT_TRUE(http_server_properties_.GetSupportsQuic(&last_address));
Zhongyi Shi63574b72018-06-01 20:22:252059 // Change the IP address and verify that stream saw the error and the active
2060 // session is closed.
jri8c44d692015-10-23 23:53:412061 NotifyIPAddressChanged();
[email protected]f698a012013-05-06 20:18:592062 EXPECT_EQ(ERR_NETWORK_CHANGED,
2063 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262064 EXPECT_TRUE(factory_->require_confirmation());
Ryan Hamilton8e32a2b2017-08-28 20:06:522065 EXPECT_FALSE(http_server_properties_.GetSupportsQuic(&last_address));
Zhongyi Shi63574b72018-06-01 20:22:252066 // Check no active session exists for the destination.
2067 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]f698a012013-05-06 20:18:592068
2069 // Now attempting to request a stream to the same origin should create
2070 // a new session.
zhongyi98d6a9262017-05-19 02:47:452071 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332072 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032073 request2.Request(
2074 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2075 SocketTag(),
2076 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2077 failed_on_default_network_callback_, callback_.callback()));
[email protected]f698a012013-05-06 20:18:592078
robpercival214763f2016-07-01 23:27:012079 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242080 stream = CreateStream(&request2);
[email protected]f698a012013-05-06 20:18:592081
Zhongyi Shi63574b72018-06-01 20:22:252082 // Check a new active session exisits for the destination and the old session
2083 // is no longer live.
2084 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2085 QuicChromiumClientSession* session2 = GetActiveSession(host_port_pair_);
2086 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
2087
2088 stream.reset(); // Will reset stream 3.
rch37de576c2015-05-17 20:28:172089 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2090 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2091 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2092 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]f698a012013-05-06 20:18:592093}
2094
Zhongyi Shi63574b72018-06-01 20:22:252095// Test that if goaway_session_on_ip_change is set, old sessions will be marked
2096// as going away on IP address change instead of being closed. New requests will
2097// go to a new connection.
2098TEST_P(QuicStreamFactoryTest, GoAwaySessionsOnIPAddressChanged) {
Zhongyi Shi967d2f12019-02-08 20:58:532099 test_params_.quic_goaway_sessions_on_ip_change = true;
Zhongyi Shi63574b72018-06-01 20:22:252100 Initialize();
2101 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2102 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2103 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2104
2105 MockQuicData quic_data1;
2106 quic::QuicStreamOffset header_stream_offset = 0;
2107 quic_data1.AddWrite(SYNCHRONOUS,
2108 ConstructInitialSettingsPacket(1, &header_stream_offset));
Fan Yang32c5a112018-12-10 20:06:332109 quic_data1.AddWrite(
2110 SYNCHRONOUS, ConstructGetRequestPacket(
2111 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
2112 true, &header_stream_offset));
Zhongyi Shi63574b72018-06-01 20:22:252113 quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
2114 quic_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:332115 ASYNC,
2116 ConstructOkResponsePacket(
2117 1, GetNthClientInitiatedBidirectionalStreamId(0), false, true));
Zhongyi Shi63574b72018-06-01 20:22:252118 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
2119 quic_data1.AddSocketDataToFactory(socket_factory_.get());
2120
2121 MockQuicData quic_data2;
2122 quic::QuicStreamOffset header_stream_offset2 = 0;
2123 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
2124 quic_data2.AddWrite(
2125 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset2));
2126 quic_data2.AddSocketDataToFactory(socket_factory_.get());
2127
2128 // Create request and QuicHttpStream.
2129 QuicStreamRequest request(factory_.get());
2130 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032131 request.Request(
2132 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2133 SocketTag(),
2134 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2135 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi63574b72018-06-01 20:22:252136 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2137 std::unique_ptr<HttpStream> stream = CreateStream(&request);
2138 EXPECT_TRUE(stream.get());
2139
2140 // Cause QUIC stream to be created.
2141 HttpRequestInfo request_info;
2142 request_info.method = "GET";
2143 request_info.url = url_;
2144 request_info.traffic_annotation =
2145 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
2146 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
2147 net_log_, CompletionOnceCallback()));
2148
2149 // Ensure that session is alive and active.
2150 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2151 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2152 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2153
2154 // Send GET request on stream.
2155 HttpResponseInfo response;
2156 HttpRequestHeaders request_headers;
2157 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2158 callback_.callback()));
2159
2160 // Receive an IP address change notification.
2161 NotifyIPAddressChanged();
2162
2163 // The connection should still be alive, but marked as going away.
2164 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2165 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2166 EXPECT_EQ(1u, session->GetNumActiveStreams());
2167
2168 // Resume the data, response should be read from the original connection.
2169 quic_data1.Resume();
2170 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
2171 EXPECT_EQ(200, response.headers->response_code());
2172 EXPECT_EQ(0u, session->GetNumActiveStreams());
2173
2174 // Second request should be sent on a new connection.
2175 QuicStreamRequest request2(factory_.get());
2176 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032177 request2.Request(
2178 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2179 SocketTag(),
2180 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2181 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi63574b72018-06-01 20:22:252182 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2183 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
2184 EXPECT_TRUE(stream2.get());
2185
2186 // Check an active session exisits for the destination.
2187 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2188 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2189 QuicChromiumClientSession* session2 = GetActiveSession(host_port_pair_);
2190 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
2191
2192 stream.reset();
2193 stream2.reset();
2194 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
2195 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
2196 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
2197 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
2198}
2199
Jana Iyengarba355772017-09-21 22:03:212200TEST_P(QuicStreamFactoryTest, OnIPAddressChangedWithConnectionMigration) {
Zhongyi Shi1a054612018-06-14 04:59:082201 InitializeConnectionMigrationV2Test(
Jana Iyengarba355772017-09-21 22:03:212202 {kDefaultNetworkForTests, kNewNetworkForTests});
2203 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2204 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2205 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2206
2207 MockQuicData socket_data;
2208 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432209 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Ryan Hamilton8d9ee76e2018-05-29 23:52:522210 socket_data.AddWrite(
2211 SYNCHRONOUS, ConstructClientRstPacket(2, quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:172212 socket_data.AddSocketDataToFactory(socket_factory_.get());
Jana Iyengarba355772017-09-21 22:03:212213
2214 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332215 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032216 request.Request(
2217 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2218 SocketTag(),
2219 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2220 failed_on_default_network_callback_, callback_.callback()));
Jana Iyengarba355772017-09-21 22:03:212221
2222 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242223 std::unique_ptr<HttpStream> stream = CreateStream(&request);
Jana Iyengarba355772017-09-21 22:03:212224 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:392225 request_info.traffic_annotation =
2226 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272227 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392228 net_log_, CompletionOnceCallback()));
Jana Iyengarba355772017-09-21 22:03:212229
2230 IPAddress last_address;
2231 EXPECT_TRUE(http_server_properties_.GetSupportsQuic(&last_address));
2232
2233 // Change the IP address and verify that the connection is unaffected.
2234 NotifyIPAddressChanged();
2235 EXPECT_FALSE(factory_->require_confirmation());
2236 EXPECT_TRUE(http_server_properties_.GetSupportsQuic(&last_address));
2237
2238 // Attempting a new request to the same origin uses the same connection.
2239 QuicStreamRequest request2(factory_.get());
2240 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:332241 DEFAULT_PRIORITY, SocketTag(),
2242 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:032243 &net_error_details_,
2244 failed_on_default_network_callback_,
2245 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:242246 stream = CreateStream(&request2);
Jana Iyengarba355772017-09-21 22:03:212247
2248 stream.reset();
2249 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2250 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2251}
2252
Zhongyi Shia0644e32018-06-21 05:19:522253TEST_P(QuicStreamFactoryTest, MigrateOnNetworkMadeDefaultWithSynchronousWrite) {
2254 TestMigrationOnNetworkMadeDefault(SYNCHRONOUS);
jri9f303712016-09-13 01:10:222255}
2256
Zhongyi Shia0644e32018-06-21 05:19:522257TEST_P(QuicStreamFactoryTest, MigrateOnNetworkMadeDefaultWithAsyncWrite) {
2258 TestMigrationOnNetworkMadeDefault(ASYNC);
jri9f303712016-09-13 01:10:222259}
2260
Zhongyi Shia0644e32018-06-21 05:19:522261// Sets up a test which attempts connection migration successfully after probing
2262// when a new network is made as default and the old default is still available.
2263// |write_mode| specifies the write mode for the last write before
2264// OnNetworkMadeDefault is delivered to session.
2265void QuicStreamFactoryTestBase::TestMigrationOnNetworkMadeDefault(
2266 IoMode write_mode) {
2267 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jri7e636642016-01-14 06:57:082268 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2269 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2270 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2271
Zhongyi Shia0644e32018-06-21 05:19:522272 // Using a testing task runner so that we can control time.
2273 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2274 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
2275
2276 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2277 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
2278
2279 MockQuicData quic_data1;
Ryan Hamilton8d9ee76e2018-05-29 23:52:522280 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shia0644e32018-06-21 05:19:522281 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
2282 quic_data1.AddWrite(SYNCHRONOUS,
2283 ConstructInitialSettingsPacket(1, &header_stream_offset));
2284 quic_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:332285 write_mode, ConstructGetRequestPacket(
2286 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
2287 true, &header_stream_offset));
Zhongyi Shia0644e32018-06-21 05:19:522288 quic_data1.AddSocketDataToFactory(socket_factory_.get());
2289
2290 // Set up the second socket data provider that is used after migration.
2291 // The response to the earlier request is read on the new socket.
2292 MockQuicData quic_data2;
2293 // Connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:252294 quic_data2.AddWrite(SYNCHRONOUS,
2295 client_maker_.MakeConnectivityProbingPacket(3, true));
Zhongyi Shia0644e32018-06-21 05:19:522296 quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
2297 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:252298 quic_data2.AddRead(ASYNC,
2299 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shia0644e32018-06-21 05:19:522300 // Ping packet to send after migration is completed.
2301 quic_data2.AddWrite(ASYNC,
2302 client_maker_.MakeAckAndPingPacket(4, false, 1, 1, 1));
2303 quic_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:332304 ASYNC,
2305 ConstructOkResponsePacket(
2306 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shia0644e32018-06-21 05:19:522307 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:332308 quic_data2.AddWrite(
2309 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
2310 5, false, GetNthClientInitiatedBidirectionalStreamId(0),
2311 quic::QUIC_STREAM_CANCELLED, 2, 2, 1, true));
Zhongyi Shia0644e32018-06-21 05:19:522312 quic_data2.AddSocketDataToFactory(socket_factory_.get());
jri7e636642016-01-14 06:57:082313
2314 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452315 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332316 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032317 request.Request(
2318 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2319 SocketTag(),
2320 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2321 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012322 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242323 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri7e636642016-01-14 06:57:082324 EXPECT_TRUE(stream.get());
2325
2326 // Cause QUIC stream to be created.
2327 HttpRequestInfo request_info;
2328 request_info.method = "GET";
bnc3d9035b32016-06-30 18:18:482329 request_info.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:392330 request_info.traffic_annotation =
2331 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272332 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392333 net_log_, CompletionOnceCallback()));
jri7e636642016-01-14 06:57:082334
2335 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502336 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:082337 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2338 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2339
2340 // Send GET request on stream.
2341 HttpResponseInfo response;
2342 HttpRequestHeaders request_headers;
2343 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2344 callback_.callback()));
2345
Zhongyi Shia0644e32018-06-21 05:19:522346 // Deliver a signal that a alternate network is connected now, this should
2347 // cause the connection to start early migration on path degrading.
2348 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2349 ->SetConnectedNetworksList(
2350 {kDefaultNetworkForTests, kNewNetworkForTests});
2351 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2352 ->NotifyNetworkConnected(kNewNetworkForTests);
jri9f303712016-09-13 01:10:222353
Zhongyi Shia0644e32018-06-21 05:19:522354 // Cause the connection to report path degrading to the session.
2355 // Due to lack of alternate network, session will not mgirate connection.
2356 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
jri7e636642016-01-14 06:57:082357 scoped_mock_network_change_notifier_->mock_network_change_notifier()
jrie2661982016-08-20 08:24:342358 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
jri7e636642016-01-14 06:57:082359
Zhongyi Shia0644e32018-06-21 05:19:522360 // A task will be posted to migrate to the new default network.
2361 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
2362 EXPECT_EQ(base::TimeDelta(), task_runner->NextPendingTaskDelay());
2363
2364 // Execute the posted task to migrate back to the default network.
2365 task_runner->RunUntilIdle();
2366 // Another task to try send a new connectivity probe is posted. And a task to
2367 // retry migrate back to default network is scheduled.
2368 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
2369 // Next connectivity probe is scheduled to be sent in 2 *
2370 // kDefaultRTTMilliSecs.
2371 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
2372 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
2373 next_task_delay);
2374
2375 // The connection should still be alive, and not marked as going away.
jri7e636642016-01-14 06:57:082376 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia0644e32018-06-21 05:19:522377 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2378 EXPECT_EQ(1u, session->GetNumActiveStreams());
2379 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
2380
2381 // Resume quic data and a connectivity probe response will be read on the new
2382 // socket, declare probing as successful. And a new task to WriteToNewSocket
2383 // will be posted to complete migration.
2384 quic_data2.Resume();
2385
2386 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2387 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri7e636642016-01-14 06:57:082388 EXPECT_EQ(1u, session->GetNumActiveStreams());
2389
Zhongyi Shia0644e32018-06-21 05:19:522390 // There should be three pending tasks, the nearest one will complete
2391 // migration to the new network.
2392 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
2393 next_task_delay = task_runner->NextPendingTaskDelay();
2394 EXPECT_EQ(base::TimeDelta(), next_task_delay);
2395 task_runner->FastForwardBy(next_task_delay);
2396
2397 // Response headers are received over the new network.
2398 EXPECT_THAT(callback_.WaitForResult(), IsOk());
jri7e636642016-01-14 06:57:082399 EXPECT_EQ(200, response.headers->response_code());
2400
Zhongyi Shia0644e32018-06-21 05:19:522401 // Now there are two pending tasks, the nearest one was to send connectivity
2402 // probe and has been cancelled due to successful migration.
2403 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
2404 next_task_delay = task_runner->NextPendingTaskDelay();
2405 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
2406 next_task_delay);
2407 task_runner->FastForwardBy(next_task_delay);
jri7e636642016-01-14 06:57:082408
Zhongyi Shia0644e32018-06-21 05:19:522409 // There's one more task to mgirate back to the default network in 0.4s, which
2410 // is also cancelled due to the success migration on the previous trial.
2411 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
2412 next_task_delay = task_runner->NextPendingTaskDelay();
2413 base::TimeDelta expected_delay =
2414 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
2415 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
2416 EXPECT_EQ(expected_delay, next_task_delay);
2417 task_runner->FastForwardBy(next_task_delay);
2418 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
jri7e636642016-01-14 06:57:082419
Zhongyi Shia0644e32018-06-21 05:19:522420 // Verify that the session is still alive.
jri7e636642016-01-14 06:57:082421 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia0644e32018-06-21 05:19:522422 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri7e636642016-01-14 06:57:082423
Zhongyi Shia0644e32018-06-21 05:19:522424 stream.reset();
2425 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
2426 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
2427 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
2428 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
jri7e636642016-01-14 06:57:082429}
2430
Zhongyi Shib3bc982c2018-07-10 19:59:242431// Regression test for http://859674.
2432// This test veries that a writer will not attempt to write packets until being
2433// unblocked on both socket level and network level. In this test, a probing
2434// writer is used to send two connectivity probes to the peer: where the first
2435// one completes successfully, while a connectivity response is received before
2436// completes sending the second one. The connection migration attempt will
2437// proceed while the probing writer is blocked at the socket level, which will
2438// block the writer on the network level. Once connection migration completes
2439// successfully, the probing writer will be unblocked on the network level, it
2440// will not attempt to write new packets until the socket level is unblocked.
2441TEST_P(QuicStreamFactoryTest, MigratedToBlockedSocketAfterProbing) {
2442 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
2443 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2444 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2445 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2446
2447 // Using a testing task runner so that we can control time.
2448 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2449 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
2450
2451 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2452 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
2453
2454 MockQuicData quic_data1;
2455 quic::QuicStreamOffset header_stream_offset = 0;
2456 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
2457 quic_data1.AddWrite(SYNCHRONOUS,
2458 ConstructInitialSettingsPacket(1, &header_stream_offset));
Fan Yang32c5a112018-12-10 20:06:332459 quic_data1.AddWrite(
2460 SYNCHRONOUS, ConstructGetRequestPacket(
2461 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
2462 true, &header_stream_offset));
Zhongyi Shib3bc982c2018-07-10 19:59:242463 quic_data1.AddSocketDataToFactory(socket_factory_.get());
2464
2465 // Set up the second socket data provider that is used after migration.
2466 // The response to the earlier request is read on the new socket.
2467 MockQuicData quic_data2;
2468 // First connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:252469 quic_data2.AddWrite(SYNCHRONOUS,
2470 client_maker_.MakeConnectivityProbingPacket(3, true));
Zhongyi Shib3bc982c2018-07-10 19:59:242471 quic_data2.AddRead(ASYNC,
2472 ERR_IO_PENDING); // Pause so that we can control time.
2473 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:252474 quic_data2.AddRead(ASYNC,
2475 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shib3bc982c2018-07-10 19:59:242476 // Second connectivity probe which will complete asynchronously.
Zhongyi Shi879659422018-08-02 17:58:252477 quic_data2.AddWrite(ASYNC,
2478 client_maker_.MakeConnectivityProbingPacket(4, true));
Zhongyi Shib3bc982c2018-07-10 19:59:242479 quic_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:332480 ASYNC,
2481 ConstructOkResponsePacket(
2482 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shib3bc982c2018-07-10 19:59:242483 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
2484 quic_data2.AddWrite(ASYNC,
2485 client_maker_.MakeAckAndPingPacket(5, false, 1, 1, 1));
Fan Yang32c5a112018-12-10 20:06:332486 quic_data2.AddWrite(
2487 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
2488 6, false, GetNthClientInitiatedBidirectionalStreamId(0),
2489 quic::QUIC_STREAM_CANCELLED, 2, 2, 1, true));
Zhongyi Shib3bc982c2018-07-10 19:59:242490
2491 quic_data2.AddSocketDataToFactory(socket_factory_.get());
2492
2493 // Create request and QuicHttpStream.
2494 QuicStreamRequest request(factory_.get());
2495 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032496 request.Request(
2497 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2498 SocketTag(),
2499 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2500 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shib3bc982c2018-07-10 19:59:242501 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2502 std::unique_ptr<HttpStream> stream = CreateStream(&request);
2503 EXPECT_TRUE(stream.get());
2504
2505 // Cause QUIC stream to be created.
2506 HttpRequestInfo request_info;
2507 request_info.method = "GET";
2508 request_info.url = url_;
2509 request_info.traffic_annotation =
2510 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
2511 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
2512 net_log_, CompletionOnceCallback()));
2513
2514 // Ensure that session is alive and active.
2515 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2516 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2517 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2518
2519 // Send GET request on stream.
2520 HttpResponseInfo response;
2521 HttpRequestHeaders request_headers;
2522 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2523 callback_.callback()));
2524
2525 // Deliver a signal that a alternate network is connected now, this should
2526 // cause the connection to start early migration on path degrading.
2527 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2528 ->SetConnectedNetworksList(
2529 {kDefaultNetworkForTests, kNewNetworkForTests});
2530 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2531 ->NotifyNetworkConnected(kNewNetworkForTests);
2532
2533 // Cause the connection to report path degrading to the session.
2534 // Due to lack of alternate network, session will not mgirate connection.
2535 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
2536 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2537 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
2538
2539 // A task will be posted to migrate to the new default network.
2540 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
2541 EXPECT_EQ(base::TimeDelta(), task_runner->NextPendingTaskDelay());
2542
2543 // Execute the posted task to migrate back to the default network.
2544 task_runner->RunUntilIdle();
2545 // Another task to resend a new connectivity probe is posted. And a task to
2546 // retry migrate back to default network is scheduled.
2547 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
2548 // Next connectivity probe is scheduled to be sent in 2 *
2549 // kDefaultRTTMilliSecs.
2550 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
2551 base::TimeDelta expected_delay =
2552 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
2553 EXPECT_EQ(expected_delay, next_task_delay);
2554
2555 // Fast forward to send the second connectivity probe. The write will be
2556 // asynchronous and complete after the read completes.
2557 task_runner->FastForwardBy(next_task_delay);
2558
2559 // Resume quic data and a connectivity probe response will be read on the new
2560 // socket, declare probing as successful.
2561 quic_data2.Resume();
2562
2563 // The connection should still be alive, and not marked as going away.
2564 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2565 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2566 EXPECT_EQ(1u, session->GetNumActiveStreams());
2567 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
2568
2569 // There should be three pending tasks, the nearest one will complete
2570 // migration to the new network. Second task will retry migrate back to
2571 // default but cancelled, and the third task will retry send connectivity
2572 // probe but also cancelled.
2573 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
2574 EXPECT_EQ(base::TimeDelta(), task_runner->NextPendingTaskDelay());
2575 task_runner->RunUntilIdle();
2576
2577 // Response headers are received over the new network.
2578 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2579 EXPECT_EQ(200, response.headers->response_code());
2580
2581 // Run the message loop to complete the asynchronous write of ack and ping.
2582 base::RunLoop().RunUntilIdle();
2583
2584 // Now there are two pending tasks, the nearest one was to retry migrate back
2585 // to default network and has been cancelled due to successful migration.
2586 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
2587 expected_delay =
2588 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
2589 expected_delay;
2590 next_task_delay = task_runner->NextPendingTaskDelay();
2591 EXPECT_EQ(expected_delay, next_task_delay);
2592 task_runner->FastForwardBy(next_task_delay);
2593
2594 // There's one more task to retry sending connectivity probe in 0.4s and has
2595 // also been cancelled due to the successful probing.
2596 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
2597 next_task_delay = task_runner->NextPendingTaskDelay();
2598 expected_delay =
2599 base::TimeDelta::FromMilliseconds(3 * 2 * kDefaultRTTMilliSecs) -
2600 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs);
2601 EXPECT_EQ(expected_delay, next_task_delay);
2602 task_runner->FastForwardBy(next_task_delay);
2603 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
2604
2605 // Verify that the session is still alive.
2606 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2607 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2608
2609 stream.reset();
2610 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
2611 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
2612 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
2613 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
2614}
2615
Zhongyi Shib1b1fa42018-06-19 23:13:472616// This test verifies that session times out connection migration attempt
2617// with signals delivered in the following order (no alternate network is
2618// available):
2619// - default network disconnected is delivered: session attempts connection
2620// migration but found not alternate network. Session waits for a new network
Zhongyi Shie01f2db2019-02-22 19:53:232621// comes up in the next kWaitTimeForNewNetworkSecs seconds.
Zhongyi Shib1b1fa42018-06-19 23:13:472622// - no new network is connected, migration times out. Session is closed.
2623TEST_P(QuicStreamFactoryTest, MigrationTimeoutWithNoNewNetwork) {
2624 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jri7e636642016-01-14 06:57:082625 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2626 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2627
Zhongyi Shib1b1fa42018-06-19 23:13:472628 // Using a testing task runner so that we can control time.
2629 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2630 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
jri5b785512016-09-13 04:29:112631
rcha00569732016-08-27 11:09:362632 MockQuicData socket_data;
2633 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432634 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:172635 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri7e636642016-01-14 06:57:082636
2637 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452638 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332639 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032640 request.Request(
2641 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2642 SocketTag(),
2643 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2644 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012645 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242646 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri7e636642016-01-14 06:57:082647 EXPECT_TRUE(stream.get());
2648
2649 // Cause QUIC stream to be created.
2650 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:392651 request_info.traffic_annotation =
2652 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272653 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392654 net_log_, CompletionOnceCallback()));
jri7e636642016-01-14 06:57:082655
2656 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502657 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:082658 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2659 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2660
2661 // Trigger connection migration. Since there are no networks
jri5b785512016-09-13 04:29:112662 // to migrate to, this should cause the session to wait for a new network.
jri7e636642016-01-14 06:57:082663 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2664 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2665
jri5b785512016-09-13 04:29:112666 // The migration will not fail until the migration alarm timeout.
2667 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shib1b1fa42018-06-19 23:13:472668 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:112669 EXPECT_EQ(1u, session->GetNumActiveStreams());
2670 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
2671 EXPECT_EQ(true, session->connection()->writer()->IsWriteBlocked());
2672
Zhongyi Shib1b1fa42018-06-19 23:13:472673 // Migration will be timed out after kWaitTimeForNewNetwokSecs.
2674 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
2675 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
2676 EXPECT_EQ(base::TimeDelta::FromSeconds(kWaitTimeForNewNetworkSecs),
2677 next_task_delay);
2678 task_runner->FastForwardBy(next_task_delay);
jri5b785512016-09-13 04:29:112679
2680 // The connection should now be closed. A request for response
2681 // headers should fail.
jri7e636642016-01-14 06:57:082682 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2683 EXPECT_FALSE(HasActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:112684 EXPECT_EQ(ERR_NETWORK_CHANGED, callback_.WaitForResult());
jri7e636642016-01-14 06:57:082685
2686 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2687 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2688}
2689
Zhongyi Shi21e99532018-07-17 22:23:072690// This test verifies that connectivity probes will be sent even if there is
2691// a non-migratable stream. However, when connection migrates to the
Zhongyi Shic16b4102019-02-12 00:37:402692// successfully probed path, any non-migratable streams will be reset.
Zhongyi Shi32fe14d42019-02-28 00:25:362693TEST_P(QuicStreamFactoryTest,
2694 OnNetworkMadeDefaultNonMigratableStream_MigrateIdleSessions) {
2695 TestOnNetworkMadeDefaultNonMigratableStream(true);
2696}
2697
2698// This test verifies that connectivity probes will be sent even if there is
2699// a non-migratable stream. However, when connection migrates to the
2700// successfully probed path, any non-migratable stream will be reset. And if
2701// the connection becomes idle then, close the connection.
2702TEST_P(QuicStreamFactoryTest,
2703 OnNetworkMadeDefaultNonMigratableStream_DoNotMigrateIdleSessions) {
2704 TestOnNetworkMadeDefaultNonMigratableStream(false);
2705}
2706
2707void QuicStreamFactoryTestBase::TestOnNetworkMadeDefaultNonMigratableStream(
2708 bool migrate_idle_sessions) {
2709 test_params_.quic_migrate_idle_sessions = migrate_idle_sessions;
Zhongyi Shi5f587cc2017-11-21 23:24:172710 InitializeConnectionMigrationV2Test(
2711 {kDefaultNetworkForTests, kNewNetworkForTests});
2712 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2713 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2714
2715 MockQuicData socket_data;
2716 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432717 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi32fe14d42019-02-28 00:25:362718 if (!migrate_idle_sessions) {
2719 socket_data.AddWrite(
2720 SYNCHRONOUS,
2721 client_maker_.MakeRstAckAndConnectionClosePacket(
2722 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
2723 quic::QUIC_STREAM_CANCELLED,
2724 quic::QuicTime::Delta::FromMilliseconds(0), 1, 1, 1,
2725 quic::QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS,
2726 "net error"));
2727 }
Renjieba55fae2018-09-20 03:05:162728
Zhongyi Shi5f587cc2017-11-21 23:24:172729 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri231c2972016-03-08 19:50:112730
Zhongyi Shi21e99532018-07-17 22:23:072731 // Set up the second socket data provider that is used for probing.
2732 MockQuicData quic_data1;
2733 // Connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:252734 quic_data1.AddWrite(SYNCHRONOUS,
2735 client_maker_.MakeConnectivityProbingPacket(2, true));
Zhongyi Shi21e99532018-07-17 22:23:072736 quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
2737 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:252738 quic_data1.AddRead(ASYNC,
2739 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shi32fe14d42019-02-28 00:25:362740 if (migrate_idle_sessions) {
2741 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
2742 // A RESET will be sent to the peer to cancel the non-migratable stream.
2743 quic_data1.AddWrite(
2744 SYNCHRONOUS,
2745 client_maker_.MakeRstPacket(
2746 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
2747 quic::QUIC_STREAM_CANCELLED));
2748 // Ping packet to send after migration is completed.
2749 quic_data1.AddWrite(SYNCHRONOUS,
2750 client_maker_.MakeAckAndPingPacket(4, false, 1, 1, 1));
2751 }
Zhongyi Shi21e99532018-07-17 22:23:072752 quic_data1.AddSocketDataToFactory(socket_factory_.get());
2753
jri231c2972016-03-08 19:50:112754 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452755 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332756 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032757 request.Request(
2758 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2759 SocketTag(),
2760 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2761 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012762 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242763 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri231c2972016-03-08 19:50:112764 EXPECT_TRUE(stream.get());
2765
2766 // Cause QUIC stream to be created, but marked as non-migratable.
2767 HttpRequestInfo request_info;
Zhongyi Shibb28b1f2018-07-18 02:41:262768 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
Ramin Halavati683bcaa92018-02-14 08:42:392769 request_info.traffic_annotation =
2770 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272771 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392772 net_log_, CompletionOnceCallback()));
jri231c2972016-03-08 19:50:112773
2774 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502775 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:112776 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2777 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2778
Zhongyi Shi21e99532018-07-17 22:23:072779 // Trigger connection migration. Session will start to probe the alternative
2780 // network. Although there is a non-migratable stream, session will still be
2781 // active until probing is declared as successful.
jri231c2972016-03-08 19:50:112782 scoped_mock_network_change_notifier_->mock_network_change_notifier()
jrie2661982016-08-20 08:24:342783 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
jri231c2972016-03-08 19:50:112784
2785 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shi21e99532018-07-17 22:23:072786 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri231c2972016-03-08 19:50:112787 EXPECT_EQ(1u, session->GetNumActiveStreams());
2788
Zhongyi Shi21e99532018-07-17 22:23:072789 // Resume data to read a connectivity probing response, which will cause
Zhongyi Shic16b4102019-02-12 00:37:402790 // non-migtable streams to be closed.
Zhongyi Shi21e99532018-07-17 22:23:072791 quic_data1.Resume();
2792 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shi32fe14d42019-02-28 00:25:362793 EXPECT_EQ(migrate_idle_sessions, HasActiveSession(host_port_pair_));
Zhongyi Shi21e99532018-07-17 22:23:072794 EXPECT_EQ(0u, session->GetNumActiveStreams());
jri231c2972016-03-08 19:50:112795
Zhongyi Shic16b4102019-02-12 00:37:402796 base::RunLoop().RunUntilIdle();
2797
Zhongyi Shi21e99532018-07-17 22:23:072798 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
2799 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
jri231c2972016-03-08 19:50:112800 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2801 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2802}
2803
jri9f303712016-09-13 01:10:222804TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultConnectionMigrationDisabled) {
Zhongyi Shi5f587cc2017-11-21 23:24:172805 InitializeConnectionMigrationV2Test(
2806 {kDefaultNetworkForTests, kNewNetworkForTests});
2807 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2808 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2809
2810 MockQuicData socket_data;
2811 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432812 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
2813 socket_data.AddWrite(
Fan Yang32c5a112018-12-10 20:06:332814 SYNCHRONOUS, client_maker_.MakeRstPacket(
2815 2, true, GetNthClientInitiatedBidirectionalStreamId(0),
2816 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:172817 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9c541572016-03-29 17:51:482818
2819 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452820 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332821 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032822 request.Request(
2823 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2824 SocketTag(),
2825 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2826 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012827 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242828 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9c541572016-03-29 17:51:482829 EXPECT_TRUE(stream.get());
2830
2831 // Cause QUIC stream to be created.
2832 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:392833 request_info.traffic_annotation =
2834 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272835 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392836 net_log_, CompletionOnceCallback()));
jri9c541572016-03-29 17:51:482837
2838 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502839 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:482840 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2841 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2842
2843 // Set session config to have connection migration disabled.
Ryan Hamilton8d9ee76e2018-05-29 23:52:522844 quic::test::QuicConfigPeer::SetReceivedDisableConnectionMigration(
2845 session->config());
jri9c541572016-03-29 17:51:482846 EXPECT_TRUE(session->config()->DisableConnectionMigration());
2847
2848 // Trigger connection migration. Since there is a non-migratable stream,
2849 // this should cause session to continue but be marked as going away.
2850 scoped_mock_network_change_notifier_->mock_network_change_notifier()
jrie2661982016-08-20 08:24:342851 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
jri9c541572016-03-29 17:51:482852
2853 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2854 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2855 EXPECT_EQ(1u, session->GetNumActiveStreams());
2856
2857 stream.reset();
2858
2859 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2860 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2861}
2862
Zhongyi Shi32fe14d42019-02-28 00:25:362863TEST_P(QuicStreamFactoryTest,
2864 OnNetworkDisconnectedNonMigratableStream_DoNotMigrateIdleSessions) {
2865 TestOnNetworkDisconnectedNonMigratableStream(false);
2866}
2867
2868TEST_P(QuicStreamFactoryTest,
2869 OnNetworkDisconnectedNonMigratableStream_MigrateIdleSessions) {
2870 TestOnNetworkDisconnectedNonMigratableStream(true);
2871}
2872
2873void QuicStreamFactoryTestBase::TestOnNetworkDisconnectedNonMigratableStream(
2874 bool migrate_idle_sessions) {
2875 test_params_.quic_migrate_idle_sessions = migrate_idle_sessions;
Zhongyi Shi5f587cc2017-11-21 23:24:172876 InitializeConnectionMigrationV2Test(
2877 {kDefaultNetworkForTests, kNewNetworkForTests});
2878 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2879 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2880
Zhongyi Shic16b4102019-02-12 00:37:402881 MockQuicData failed_socket_data;
Zhongyi Shic16b4102019-02-12 00:37:402882 MockQuicData socket_data;
Zhongyi Shi32fe14d42019-02-28 00:25:362883 if (migrate_idle_sessions) {
2884 quic::QuicStreamOffset header_stream_offset = 0;
2885 failed_socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
2886 failed_socket_data.AddWrite(
2887 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
2888 // A RESET will be sent to the peer to cancel the non-migratable stream.
2889 failed_socket_data.AddWrite(
2890 SYNCHRONOUS, client_maker_.MakeRstPacket(
2891 2, true, GetNthClientInitiatedBidirectionalStreamId(0),
2892 quic::QUIC_STREAM_CANCELLED));
2893 failed_socket_data.AddSocketDataToFactory(socket_factory_.get());
2894
2895 // Set up second socket data provider that is used after migration.
2896 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
2897 // Ping packet to send after migration.
2898 socket_data.AddWrite(
2899 SYNCHRONOUS, client_maker_.MakePingPacket(3, /*include_version=*/true));
2900 socket_data.AddSocketDataToFactory(socket_factory_.get());
2901 } else {
2902 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
2903 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
2904 socket_data.AddWrite(
2905 SYNCHRONOUS, client_maker_.MakeRstPacket(
2906 2, true, GetNthClientInitiatedBidirectionalStreamId(0),
2907 quic::QUIC_STREAM_CANCELLED));
2908 socket_data.AddSocketDataToFactory(socket_factory_.get());
2909 }
jri231c2972016-03-08 19:50:112910
2911 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452912 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332913 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032914 request.Request(
2915 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2916 SocketTag(),
2917 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2918 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012919 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242920 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri231c2972016-03-08 19:50:112921 EXPECT_TRUE(stream.get());
2922
2923 // Cause QUIC stream to be created, but marked as non-migratable.
2924 HttpRequestInfo request_info;
Zhongyi Shibb28b1f2018-07-18 02:41:262925 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
Ramin Halavati683bcaa92018-02-14 08:42:392926 request_info.traffic_annotation =
2927 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272928 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392929 net_log_, CompletionOnceCallback()));
jri231c2972016-03-08 19:50:112930
2931 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502932 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:112933 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2934 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2935
2936 // Trigger connection migration. Since there is a non-migratable stream,
2937 // this should cause a RST_STREAM frame to be emitted with
Zhongyi Shic16b4102019-02-12 00:37:402938 // quic::QUIC_STREAM_CANCELLED error code.
Zhongyi Shi32fe14d42019-02-28 00:25:362939 // If migate idle session, the connection will then be migrated to the
2940 // alternate network. Otherwise, the connection will be closed.
jri231c2972016-03-08 19:50:112941 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2942 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2943
Zhongyi Shi32fe14d42019-02-28 00:25:362944 EXPECT_EQ(migrate_idle_sessions,
2945 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2946 EXPECT_EQ(migrate_idle_sessions, HasActiveSession(host_port_pair_));
jri231c2972016-03-08 19:50:112947
Zhongyi Shi32fe14d42019-02-28 00:25:362948 if (migrate_idle_sessions) {
2949 EXPECT_EQ(0u, session->GetNumActiveStreams());
2950 base::RunLoop().RunUntilIdle();
Zhongyi Shic16b4102019-02-12 00:37:402951
Zhongyi Shi32fe14d42019-02-28 00:25:362952 EXPECT_TRUE(failed_socket_data.AllReadDataConsumed());
2953 EXPECT_TRUE(failed_socket_data.AllWriteDataConsumed());
2954 }
jri231c2972016-03-08 19:50:112955 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2956 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2957}
2958
jri9c541572016-03-29 17:51:482959TEST_P(QuicStreamFactoryTest,
jri9f303712016-09-13 01:10:222960 OnNetworkDisconnectedConnectionMigrationDisabled) {
Zhongyi Shi5f587cc2017-11-21 23:24:172961 InitializeConnectionMigrationV2Test(
2962 {kDefaultNetworkForTests, kNewNetworkForTests});
2963 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2964 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2965
2966 MockQuicData socket_data;
2967 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432968 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
2969 socket_data.AddWrite(
Fan Yang32c5a112018-12-10 20:06:332970 SYNCHRONOUS, client_maker_.MakeRstPacket(
2971 2, true, GetNthClientInitiatedBidirectionalStreamId(0),
2972 quic::QUIC_RST_ACKNOWLEDGEMENT));
Zhongyi Shi5f587cc2017-11-21 23:24:172973 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9c541572016-03-29 17:51:482974
2975 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452976 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332977 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032978 request.Request(
2979 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2980 SocketTag(),
2981 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2982 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012983 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242984 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9c541572016-03-29 17:51:482985 EXPECT_TRUE(stream.get());
2986
2987 // Cause QUIC stream to be created.
2988 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:392989 request_info.traffic_annotation =
2990 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272991 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392992 net_log_, CompletionOnceCallback()));
jri9c541572016-03-29 17:51:482993
2994 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502995 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:482996 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2997 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2998
2999 // Set session config to have connection migration disabled.
Ryan Hamilton8d9ee76e2018-05-29 23:52:523000 quic::test::QuicConfigPeer::SetReceivedDisableConnectionMigration(
3001 session->config());
jri9c541572016-03-29 17:51:483002 EXPECT_TRUE(session->config()->DisableConnectionMigration());
3003
3004 // Trigger connection migration. Since there is a non-migratable stream,
3005 // this should cause a RST_STREAM frame to be emitted with
Ryan Hamilton8d9ee76e2018-05-29 23:52:523006 // quic::QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed.
jri9c541572016-03-29 17:51:483007 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3008 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
3009
3010 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3011 EXPECT_FALSE(HasActiveSession(host_port_pair_));
3012
3013 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3014 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3015}
3016
Zhongyi Shi32fe14d42019-02-28 00:25:363017TEST_P(QuicStreamFactoryTest,
3018 OnNetworkMadeDefaultNoOpenStreams_DoNotMigrateIdleSessions) {
3019 TestOnNetworkMadeDefaultNoOpenStreams(false);
3020}
3021
3022TEST_P(QuicStreamFactoryTest,
3023 OnNetworkMadeDefaultNoOpenStreams_MigrateIdleSessions) {
3024 TestOnNetworkMadeDefaultNoOpenStreams(true);
3025}
3026
3027void QuicStreamFactoryTestBase::TestOnNetworkMadeDefaultNoOpenStreams(
3028 bool migrate_idle_sessions) {
3029 test_params_.quic_migrate_idle_sessions = migrate_idle_sessions;
Zhongyi Shi5f587cc2017-11-21 23:24:173030 InitializeConnectionMigrationV2Test(
3031 {kDefaultNetworkForTests, kNewNetworkForTests});
3032 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3033 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3034
3035 MockQuicData socket_data;
3036 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:433037 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi32fe14d42019-02-28 00:25:363038 if (!migrate_idle_sessions) {
3039 socket_data.AddWrite(
3040 SYNCHRONOUS,
3041 client_maker_.MakeConnectionClosePacket(
3042 2, true, quic::QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS,
3043 "net error"));
3044 }
Zhongyi Shi5f587cc2017-11-21 23:24:173045 socket_data.AddSocketDataToFactory(socket_factory_.get());
3046
Zhongyi Shic16b4102019-02-12 00:37:403047 MockQuicData quic_data1;
Zhongyi Shi32fe14d42019-02-28 00:25:363048 if (migrate_idle_sessions) {
3049 // Set up the second socket data provider that is used for probing.
3050 // Connectivity probe to be sent on the new path.
3051 quic_data1.AddWrite(SYNCHRONOUS,
3052 client_maker_.MakeConnectivityProbingPacket(2, true));
3053 quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
3054 // Connectivity probe to receive from the server.
3055 quic_data1.AddRead(ASYNC,
3056 server_maker_.MakeConnectivityProbingPacket(1, false));
3057 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
3058 // Ping packet to send after migration is completed.
3059 quic_data1.AddWrite(SYNCHRONOUS,
3060 client_maker_.MakeAckAndPingPacket(3, false, 1, 1, 1));
3061 quic_data1.AddSocketDataToFactory(socket_factory_.get());
3062 }
Zhongyi Shic16b4102019-02-12 00:37:403063
Zhongyi Shi5f587cc2017-11-21 23:24:173064 // Create request and QuicHttpStream.
3065 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:333066 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033067 request.Request(
3068 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3069 SocketTag(),
3070 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3071 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi5f587cc2017-11-21 23:24:173072 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3073 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3074 EXPECT_TRUE(stream.get());
3075
3076 // Ensure that session is alive and active.
3077 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3078 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3079 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shic16b4102019-02-12 00:37:403080 EXPECT_EQ(0u, session->GetNumActiveStreams());
3081 EXPECT_EQ(0u, session->GetNumDrainingStreams());
Zhongyi Shi5f587cc2017-11-21 23:24:173082
3083 // Trigger connection migration.
3084 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3085 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
Zhongyi Shi32fe14d42019-02-28 00:25:363086 EXPECT_EQ(migrate_idle_sessions, HasActiveSession(host_port_pair_));
Zhongyi Shi5f587cc2017-11-21 23:24:173087
Zhongyi Shi32fe14d42019-02-28 00:25:363088 if (migrate_idle_sessions) {
3089 quic_data1.Resume();
3090 base::RunLoop().RunUntilIdle();
3091 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
3092 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
3093 }
Zhongyi Shi5f587cc2017-11-21 23:24:173094 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3095 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3096}
3097
Zhongyi Shi32fe14d42019-02-28 00:25:363098TEST_P(QuicStreamFactoryTest,
3099 OnNetworkDisconnectedNoOpenStreams_DoNotMigateIdleSessions) {
3100 TestOnNetworkDisconnectedNoOpenStreams(false);
3101}
3102
3103TEST_P(QuicStreamFactoryTest,
3104 OnNetworkDisconnectedNoOpenStreams_MigateIdleSessions) {
3105 TestOnNetworkDisconnectedNoOpenStreams(true);
3106}
3107
3108void QuicStreamFactoryTestBase::TestOnNetworkDisconnectedNoOpenStreams(
3109 bool migrate_idle_sessions) {
3110 test_params_.quic_migrate_idle_sessions = migrate_idle_sessions;
Zhongyi Shi5f587cc2017-11-21 23:24:173111 InitializeConnectionMigrationV2Test(
3112 {kDefaultNetworkForTests, kNewNetworkForTests});
3113 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3114 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3115
Zhongyi Shic16b4102019-02-12 00:37:403116 MockQuicData default_socket_data;
3117 default_socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3118 default_socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
3119 default_socket_data.AddSocketDataToFactory(socket_factory_.get());
3120
Zhongyi Shic16b4102019-02-12 00:37:403121 MockQuicData alternate_socket_data;
Zhongyi Shi32fe14d42019-02-28 00:25:363122 if (migrate_idle_sessions) {
3123 // Set up second socket data provider that is used after migration.
3124 alternate_socket_data.AddRead(SYNCHRONOUS,
3125 ERR_IO_PENDING); // Hanging read.
3126 // Ping packet to send after migration.
3127 alternate_socket_data.AddWrite(
3128 SYNCHRONOUS, client_maker_.MakePingPacket(2, /*include_version=*/true));
3129 alternate_socket_data.AddSocketDataToFactory(socket_factory_.get());
3130 }
Zhongyi Shi5f587cc2017-11-21 23:24:173131
3132 // Create request and QuicHttpStream.
3133 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:333134 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033135 request.Request(
3136 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3137 SocketTag(),
3138 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3139 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi5f587cc2017-11-21 23:24:173140 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3141 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3142 EXPECT_TRUE(stream.get());
3143
Zhongyi Shic16b4102019-02-12 00:37:403144 // Ensure that session is active.
Zhongyi Shi5f587cc2017-11-21 23:24:173145 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3146
3147 // Trigger connection migration. Since there are no active streams,
3148 // the session will be closed.
3149 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3150 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
3151
Zhongyi Shi32fe14d42019-02-28 00:25:363152 EXPECT_EQ(migrate_idle_sessions, HasActiveSession(host_port_pair_));
Zhongyi Shi5f587cc2017-11-21 23:24:173153
Zhongyi Shic16b4102019-02-12 00:37:403154 EXPECT_TRUE(default_socket_data.AllReadDataConsumed());
3155 EXPECT_TRUE(default_socket_data.AllWriteDataConsumed());
Zhongyi Shi32fe14d42019-02-28 00:25:363156 if (migrate_idle_sessions) {
3157 EXPECT_TRUE(alternate_socket_data.AllReadDataConsumed());
3158 EXPECT_TRUE(alternate_socket_data.AllWriteDataConsumed());
3159 }
Zhongyi Shi5f587cc2017-11-21 23:24:173160}
3161
Zhongyi Shi9f316b262018-06-18 22:01:163162// This test verifies session migrates to the alternate network immediately when
3163// default network disconnects with a synchronous write before migration.
3164TEST_P(QuicStreamFactoryTest, MigrateOnDefaultNetworkDisconnectedSync) {
3165 TestMigrationOnNetworkDisconnected(/*async_write_before*/ false);
3166}
3167
3168// This test verifies session migrates to the alternate network immediately when
3169// default network disconnects with an asynchronously write before migration.
3170TEST_P(QuicStreamFactoryTest, MigrateOnDefaultNetworkDisconnectedAsync) {
3171 TestMigrationOnNetworkDisconnected(/*async_write_before*/ true);
3172}
3173
3174void QuicStreamFactoryTestBase::TestMigrationOnNetworkDisconnected(
3175 bool async_write_before) {
3176 InitializeConnectionMigrationV2Test(
3177 {kDefaultNetworkForTests, kNewNetworkForTests});
3178 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3179 ->NotifyNetworkMadeDefault(kDefaultNetworkForTests);
3180 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3181 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3182 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3183
3184 // Use the test task runner.
3185 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3186
3187 int packet_number = 1;
3188 MockQuicData socket_data;
3189 quic::QuicStreamOffset header_stream_offset = 0;
3190 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3191 socket_data.AddWrite(
3192 SYNCHRONOUS,
3193 ConstructInitialSettingsPacket(packet_number++, &header_stream_offset));
3194 socket_data.AddWrite(
Fan Yang32c5a112018-12-10 20:06:333195 SYNCHRONOUS,
3196 ConstructGetRequestPacket(packet_number++,
3197 GetNthClientInitiatedBidirectionalStreamId(0),
3198 true, true, &header_stream_offset));
Zhongyi Shi9f316b262018-06-18 22:01:163199 if (async_write_before) {
3200 socket_data.AddWrite(ASYNC, OK);
3201 packet_number++;
3202 }
3203 socket_data.AddSocketDataToFactory(socket_factory_.get());
3204
3205 // Create request and QuicHttpStream.
3206 QuicStreamRequest request(factory_.get());
3207 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033208 request.Request(
3209 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3210 SocketTag(),
3211 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3212 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi9f316b262018-06-18 22:01:163213 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3214 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3215 EXPECT_TRUE(stream.get());
3216
3217 // Cause QUIC stream to be created.
3218 HttpRequestInfo request_info;
3219 request_info.method = "GET";
3220 request_info.url = url_;
3221 request_info.traffic_annotation =
3222 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3223 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3224 net_log_, CompletionOnceCallback()));
3225
3226 // Ensure that session is alive and active.
3227 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3228 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3229 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3230
3231 // Send GET request on stream.
3232 HttpResponseInfo response;
3233 HttpRequestHeaders request_headers;
3234 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3235 callback_.callback()));
3236
Zhongyi Shi22fd5f52018-06-20 17:39:093237 if (async_write_before)
Zhongyi Shi9f316b262018-06-18 22:01:163238 session->SendPing();
Zhongyi Shi9f316b262018-06-18 22:01:163239
3240 // Set up second socket data provider that is used after migration.
3241 // The response to the earlier request is read on this new socket.
3242 MockQuicData socket_data1;
3243 socket_data1.AddWrite(
3244 SYNCHRONOUS,
3245 client_maker_.MakePingPacket(packet_number++, /*include_version=*/true));
3246 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:333247 ASYNC,
3248 ConstructOkResponsePacket(
3249 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shi9f316b262018-06-18 22:01:163250 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3251 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:333252 SYNCHRONOUS,
3253 client_maker_.MakeAckAndRstPacket(
3254 packet_number++, false, GetNthClientInitiatedBidirectionalStreamId(0),
3255 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi9f316b262018-06-18 22:01:163256 socket_data1.AddSocketDataToFactory(socket_factory_.get());
3257
3258 // Trigger connection migration.
3259 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3260 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
3261
3262 // The connection should still be alive, not marked as going away.
3263 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3264 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3265 EXPECT_EQ(1u, session->GetNumActiveStreams());
3266 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
3267
3268 // Ensure that the session is still alive.
3269 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3270 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3271 EXPECT_EQ(1u, session->GetNumActiveStreams());
3272
3273 // Run the message loop so that data queued in the new socket is read by the
3274 // packet reader.
3275 runner_->RunNextTask();
3276
3277 // Response headers are received over the new network.
3278 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3279 EXPECT_EQ(200, response.headers->response_code());
3280
3281 // Check that the session is still alive.
3282 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3283 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3284
3285 // There should be posted tasks not executed, which is to migrate back to
3286 // default network.
3287 EXPECT_FALSE(runner_->GetPostedTasks().empty());
3288
3289 // Receive signal to mark new network as default.
3290 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3291 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
3292
3293 stream.reset();
3294 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3295 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3296 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
3297 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
3298}
3299
Zhongyi Shi5f587cc2017-11-21 23:24:173300// This test receives NCN signals in the following order:
3301// - default network disconnected
3302// - after a pause, new network is connected.
3303// - new network is made default.
3304TEST_P(QuicStreamFactoryTest, NewNetworkConnectedAfterNoNetwork) {
3305 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
3306 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3307 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3308 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3309
3310 // Use the test task runner.
3311 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3312
3313 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:523314 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shi5f587cc2017-11-21 23:24:173315 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3316 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:433317 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
Fan Yang32c5a112018-12-10 20:06:333318 socket_data.AddWrite(
3319 SYNCHRONOUS, ConstructGetRequestPacket(
3320 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
3321 true, &header_stream_offset));
Zhongyi Shi5f587cc2017-11-21 23:24:173322 socket_data.AddSocketDataToFactory(socket_factory_.get());
3323
3324 // Create request and QuicHttpStream.
3325 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:333326 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033327 request.Request(
3328 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3329 SocketTag(),
3330 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3331 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi5f587cc2017-11-21 23:24:173332 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3333 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3334 EXPECT_TRUE(stream.get());
3335
3336 // Cause QUIC stream to be created.
3337 HttpRequestInfo request_info;
3338 request_info.method = "GET";
3339 request_info.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:393340 request_info.traffic_annotation =
3341 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:273342 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:393343 net_log_, CompletionOnceCallback()));
Zhongyi Shi5f587cc2017-11-21 23:24:173344
3345 // Ensure that session is alive and active.
3346 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3347 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3348 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3349
3350 // Send GET request on stream.
3351 HttpResponseInfo response;
3352 HttpRequestHeaders request_headers;
3353 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3354 callback_.callback()));
3355
3356 // Trigger connection migration. Since there are no networks
3357 // to migrate to, this should cause the session to wait for a new network.
3358 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3359 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
3360
3361 // The connection should still be alive, not marked as going away.
3362 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3363 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3364 EXPECT_EQ(1u, session->GetNumActiveStreams());
3365 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
3366
3367 // Set up second socket data provider that is used after migration.
3368 // The response to the earlier request is read on this new socket.
3369 MockQuicData socket_data1;
3370 socket_data1.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:433371 SYNCHRONOUS, client_maker_.MakePingPacket(3, /*include_version=*/true));
3372 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:333373 ASYNC,
3374 ConstructOkResponsePacket(
3375 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shi5f587cc2017-11-21 23:24:173376 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:333377 socket_data1.AddWrite(
3378 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
3379 4, false, GetNthClientInitiatedBidirectionalStreamId(0),
3380 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:173381 socket_data1.AddSocketDataToFactory(socket_factory_.get());
3382
3383 // Add a new network and notify the stream factory of a new connected network.
3384 // This causes a PING packet to be sent over the new network.
3385 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3386 ->SetConnectedNetworksList({kNewNetworkForTests});
3387 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3388 ->NotifyNetworkConnected(kNewNetworkForTests);
3389
3390 // Ensure that the session is still alive.
3391 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3392 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3393 EXPECT_EQ(1u, session->GetNumActiveStreams());
3394
3395 // Run the message loop so that data queued in the new socket is read by the
3396 // packet reader.
3397 runner_->RunNextTask();
3398
3399 // Response headers are received over the new network.
3400 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3401 EXPECT_EQ(200, response.headers->response_code());
3402
3403 // Check that the session is still alive.
3404 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3405 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3406
3407 // There should posted tasks not executed, which is to migrate back to default
3408 // network.
3409 EXPECT_FALSE(runner_->GetPostedTasks().empty());
3410
3411 // Receive signal to mark new network as default.
3412 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3413 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
3414
3415 stream.reset();
3416 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3417 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3418 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
3419 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
3420}
3421
Zhongyi Shid3d5f502018-08-10 00:22:223422// Regression test for http://crbug.com/872011.
3423// This test verifies that migrate to the probing socket will not trigger
3424// new packets being read synchronously and generate ACK frame while
3425// processing the initial connectivity probe response, which may cause a
3426// connection being closed with INTERNAL_ERROR as pending ACK frame is not
3427// allowed when processing a new packet.
Zhongyi Shi6a7323b2018-12-07 01:26:323428TEST_P(QuicStreamFactoryTest, MigrateToProbingSocket) {
Zhongyi Shid3d5f502018-08-10 00:22:223429 InitializeConnectionMigrationV2Test(
3430 {kDefaultNetworkForTests, kNewNetworkForTests});
3431 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3432 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3433 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3434
3435 // Using a testing task runner so that we can control time.
3436 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
3437 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
3438
3439 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3440 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
3441
3442 int packet_number = 1;
3443 MockQuicData quic_data1;
3444 quic::QuicStreamOffset header_stream_offset = 0;
3445 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
3446 quic_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket(
3447 packet_number++, &header_stream_offset));
3448 quic_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:333449 SYNCHRONOUS,
3450 ConstructGetRequestPacket(packet_number++,
3451 GetNthClientInitiatedBidirectionalStreamId(0),
3452 true, true, &header_stream_offset));
Zhongyi Shid3d5f502018-08-10 00:22:223453 quic_data1.AddSocketDataToFactory(socket_factory_.get());
3454
3455 // Set up the second socket data provider that is used for probing on the
3456 // alternate network.
3457 MockQuicData quic_data2;
3458 // Connectivity probe to be sent on the new path.
3459 quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
3460 packet_number++, true));
3461 quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
3462 // First connectivity probe to receive from the server, which will complete
3463 // connection migraiton on path degrading.
3464 quic_data2.AddRead(ASYNC,
3465 server_maker_.MakeConnectivityProbingPacket(1, false));
3466 // Read multiple connectivity probes synchronously.
3467 quic_data2.AddRead(SYNCHRONOUS,
3468 server_maker_.MakeConnectivityProbingPacket(2, false));
3469 quic_data2.AddRead(SYNCHRONOUS,
3470 server_maker_.MakeConnectivityProbingPacket(3, false));
3471 quic_data2.AddRead(SYNCHRONOUS,
3472 server_maker_.MakeConnectivityProbingPacket(4, false));
3473 quic_data2.AddWrite(
3474 ASYNC, client_maker_.MakeAckPacket(packet_number++, 1, 4, 1, 1, true));
3475 quic_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:333476 ASYNC,
3477 ConstructOkResponsePacket(
3478 5, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shid3d5f502018-08-10 00:22:223479 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3480 quic_data2.AddWrite(
Fan Yang32c5a112018-12-10 20:06:333481 SYNCHRONOUS,
3482 client_maker_.MakeAckAndRstPacket(
3483 packet_number++, false, GetNthClientInitiatedBidirectionalStreamId(0),
3484 quic::QUIC_STREAM_CANCELLED, 5, 1, 1, true));
Zhongyi Shid3d5f502018-08-10 00:22:223485 quic_data2.AddSocketDataToFactory(socket_factory_.get());
3486
3487 // Create request and QuicHttpStream.
3488 QuicStreamRequest request(factory_.get());
3489 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033490 request.Request(
3491 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3492 SocketTag(),
3493 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3494 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shid3d5f502018-08-10 00:22:223495 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3496 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3497 EXPECT_TRUE(stream.get());
3498
3499 // Cause QUIC stream to be created.
3500 HttpRequestInfo request_info;
3501 request_info.method = "GET";
3502 request_info.url = url_;
3503 request_info.traffic_annotation =
3504 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3505 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3506 net_log_, CompletionOnceCallback()));
3507
3508 // Ensure that session is alive and active.
3509 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3510 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3511 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3512
3513 // Send GET request on stream.
3514 HttpResponseInfo response;
3515 HttpRequestHeaders request_headers;
3516 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3517 callback_.callback()));
3518
3519 // Cause the connection to report path degrading to the session.
3520 // Session will start to probe the alternate network.
3521 session->connection()->OnPathDegradingTimeout();
3522
3523 // Next connectivity probe is scheduled to be sent in 2 *
3524 // kDefaultRTTMilliSecs.
3525 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3526 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
3527 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3528 next_task_delay);
3529
3530 // The connection should still be alive, and not marked as going away.
3531 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3532 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3533 EXPECT_EQ(1u, session->GetNumActiveStreams());
3534 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
3535
3536 // Resume quic data and a connectivity probe response will be read on the new
3537 // socket.
3538 quic_data2.Resume();
3539
3540 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3541 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3542 EXPECT_EQ(1u, session->GetNumActiveStreams());
3543
3544 // There should be three pending tasks, the nearest one will complete
3545 // migration to the new network.
3546 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
3547 next_task_delay = task_runner->NextPendingTaskDelay();
3548 EXPECT_EQ(base::TimeDelta(), next_task_delay);
3549 task_runner->FastForwardBy(next_task_delay);
3550
3551 // Response headers are received over the new network.
3552 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3553 EXPECT_EQ(200, response.headers->response_code());
3554
3555 // Now there are two pending tasks, the nearest one was to send connectivity
3556 // probe and has been cancelled due to successful migration.
3557 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
3558 next_task_delay = task_runner->NextPendingTaskDelay();
3559 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3560 next_task_delay);
3561 task_runner->FastForwardBy(next_task_delay);
3562
3563 // There's one more task to mgirate back to the default network in 0.4s.
3564 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3565 next_task_delay = task_runner->NextPendingTaskDelay();
3566 base::TimeDelta expected_delay =
3567 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
3568 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
3569 EXPECT_EQ(expected_delay, next_task_delay);
3570
3571 // Deliver a signal that the alternate network now becomes default to session,
3572 // this will cancel mgirate back to default network timer.
3573 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3574 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
3575
3576 task_runner->FastForwardBy(next_task_delay);
3577 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
3578
3579 // Verify that the session is still alive.
3580 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3581 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3582
3583 stream.reset();
3584 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
3585 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
3586 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
3587 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
3588}
3589
Zhongyi Shic4823bd2018-04-27 00:49:193590// This test verifies that the connection migrates to the alternate network
Zhongyi Shi22fd5f52018-06-20 17:39:093591// early when path degrading is detected with an ASYNCHRONOUS write before
3592// migration.
3593TEST_P(QuicStreamFactoryTest, MigrateEarlyOnPathDegradingAysnc) {
3594 TestMigrationOnPathDegrading(/*async_write_before_migration*/ true);
3595}
3596
3597// This test verifies that the connection migrates to the alternate network
3598// early when path degrading is detected with a SYNCHRONOUS write before
3599// migration.
3600TEST_P(QuicStreamFactoryTest, MigrateEarlyOnPathDegradingSync) {
3601 TestMigrationOnPathDegrading(/*async_write_before_migration*/ false);
3602}
3603
3604void QuicStreamFactoryTestBase::TestMigrationOnPathDegrading(
3605 bool async_write_before) {
Zhongyi Shic4823bd2018-04-27 00:49:193606 InitializeConnectionMigrationV2Test(
3607 {kDefaultNetworkForTests, kNewNetworkForTests});
3608 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3609 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3610 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3611
3612 // Using a testing task runner so that we can control time.
3613 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
3614 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
3615
3616 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3617 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
3618
Zhongyi Shi22fd5f52018-06-20 17:39:093619 int packet_number = 1;
Zhongyi Shic4823bd2018-04-27 00:49:193620 MockQuicData quic_data1;
Ryan Hamilton8d9ee76e2018-05-29 23:52:523621 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shic4823bd2018-04-27 00:49:193622 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
Zhongyi Shi22fd5f52018-06-20 17:39:093623 quic_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket(
3624 packet_number++, &header_stream_offset));
3625 quic_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:333626 SYNCHRONOUS,
3627 ConstructGetRequestPacket(packet_number++,
3628 GetNthClientInitiatedBidirectionalStreamId(0),
3629 true, true, &header_stream_offset));
Zhongyi Shi22fd5f52018-06-20 17:39:093630 if (async_write_before) {
3631 quic_data1.AddWrite(ASYNC, OK);
3632 packet_number++;
3633 }
Zhongyi Shic4823bd2018-04-27 00:49:193634 quic_data1.AddSocketDataToFactory(socket_factory_.get());
3635
3636 // Set up the second socket data provider that is used after migration.
3637 // The response to the earlier request is read on the new socket.
3638 MockQuicData quic_data2;
3639 // Connectivity probe to be sent on the new path.
Zhongyi Shi22fd5f52018-06-20 17:39:093640 quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
Zhongyi Shi879659422018-08-02 17:58:253641 packet_number++, true));
Zhongyi Shic4823bd2018-04-27 00:49:193642 quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
3643 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:253644 quic_data2.AddRead(ASYNC,
3645 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shic4823bd2018-04-27 00:49:193646 // Ping packet to send after migration is completed.
Zhongyi Shi22fd5f52018-06-20 17:39:093647 quic_data2.AddWrite(ASYNC, client_maker_.MakeAckAndPingPacket(
3648 packet_number++, false, 1, 1, 1));
Ryan Hamiltona3ee93a72018-08-01 22:03:083649 quic_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:333650 ASYNC,
3651 ConstructOkResponsePacket(
3652 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shic4823bd2018-04-27 00:49:193653 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi22fd5f52018-06-20 17:39:093654 quic_data2.AddWrite(
Fan Yang32c5a112018-12-10 20:06:333655 SYNCHRONOUS,
3656 client_maker_.MakeAckAndRstPacket(
3657 packet_number++, false, GetNthClientInitiatedBidirectionalStreamId(0),
3658 quic::QUIC_STREAM_CANCELLED, 2, 2, 1, true));
Zhongyi Shic4823bd2018-04-27 00:49:193659 quic_data2.AddSocketDataToFactory(socket_factory_.get());
3660
3661 // Create request and QuicHttpStream.
3662 QuicStreamRequest request(factory_.get());
3663 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033664 request.Request(
3665 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3666 SocketTag(),
3667 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3668 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shic4823bd2018-04-27 00:49:193669 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3670 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3671 EXPECT_TRUE(stream.get());
3672
3673 // Cause QUIC stream to be created.
3674 HttpRequestInfo request_info;
3675 request_info.method = "GET";
3676 request_info.url = url_;
3677 request_info.traffic_annotation =
3678 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3679 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3680 net_log_, CompletionOnceCallback()));
3681
3682 // Ensure that session is alive and active.
3683 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3684 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3685 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3686
3687 // Send GET request on stream.
3688 HttpResponseInfo response;
3689 HttpRequestHeaders request_headers;
3690 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3691 callback_.callback()));
3692
Zhongyi Shi22fd5f52018-06-20 17:39:093693 if (async_write_before)
3694 session->SendPing();
3695
Zhongyi Shiaba4a832018-04-30 20:29:083696 // Cause the connection to report path degrading to the session.
3697 // Session will start to probe the alternate network.
3698 session->connection()->OnPathDegradingTimeout();
3699
3700 // Next connectivity probe is scheduled to be sent in 2 *
3701 // kDefaultRTTMilliSecs.
3702 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3703 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
3704 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3705 next_task_delay);
3706
3707 // The connection should still be alive, and not marked as going away.
3708 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3709 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3710 EXPECT_EQ(1u, session->GetNumActiveStreams());
3711 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
3712
3713 // Resume quic data and a connectivity probe response will be read on the new
3714 // socket.
3715 quic_data2.Resume();
3716
3717 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3718 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3719 EXPECT_EQ(1u, session->GetNumActiveStreams());
3720
3721 // There should be three pending tasks, the nearest one will complete
3722 // migration to the new network.
3723 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
3724 next_task_delay = task_runner->NextPendingTaskDelay();
3725 EXPECT_EQ(base::TimeDelta(), next_task_delay);
3726 task_runner->FastForwardBy(next_task_delay);
3727
3728 // Response headers are received over the new network.
3729 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3730 EXPECT_EQ(200, response.headers->response_code());
3731
3732 // Now there are two pending tasks, the nearest one was to send connectivity
3733 // probe and has been cancelled due to successful migration.
3734 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
3735 next_task_delay = task_runner->NextPendingTaskDelay();
3736 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3737 next_task_delay);
3738 task_runner->FastForwardBy(next_task_delay);
3739
3740 // There's one more task to mgirate back to the default network in 0.4s.
3741 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3742 next_task_delay = task_runner->NextPendingTaskDelay();
3743 base::TimeDelta expected_delay =
3744 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
3745 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
3746 EXPECT_EQ(expected_delay, next_task_delay);
3747
3748 // Deliver a signal that the alternate network now becomes default to session,
3749 // this will cancel mgirate back to default network timer.
3750 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3751 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
3752
3753 task_runner->FastForwardBy(next_task_delay);
3754 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
3755
3756 // Verify that the session is still alive.
3757 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3758 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3759
3760 stream.reset();
3761 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
3762 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
3763 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
3764 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
3765}
3766
Renjiea5722ccf2018-08-10 00:18:493767// This test verifies that the session marks itself GOAWAY on path degrading
3768// and it does not receive any new request
3769TEST_P(QuicStreamFactoryTest, GoawayOnPathDegrading) {
Zhongyi Shi967d2f12019-02-08 20:58:533770 test_params_.quic_go_away_on_path_degrading = true;
Renjiea5722ccf2018-08-10 00:18:493771 Initialize();
3772 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3773 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3774 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3775
3776 MockQuicData quic_data1;
3777 quic::QuicStreamOffset header_stream_offset = 0;
3778 quic_data1.AddWrite(SYNCHRONOUS,
3779 ConstructInitialSettingsPacket(1, &header_stream_offset));
Fan Yang32c5a112018-12-10 20:06:333780 quic_data1.AddWrite(
3781 SYNCHRONOUS, ConstructGetRequestPacket(
3782 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
3783 true, &header_stream_offset));
Renjiea5722ccf2018-08-10 00:18:493784 quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
3785 quic_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:333786 ASYNC,
3787 ConstructOkResponsePacket(
3788 1, GetNthClientInitiatedBidirectionalStreamId(0), false, true));
Renjiea5722ccf2018-08-10 00:18:493789 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
3790 quic_data1.AddSocketDataToFactory(socket_factory_.get());
3791
3792 MockQuicData quic_data2;
3793 quic::QuicStreamOffset header_stream_offset2 = 0;
3794 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
3795 quic_data2.AddWrite(
3796 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset2));
3797 quic_data2.AddSocketDataToFactory(socket_factory_.get());
3798
3799 // Creat request and QuicHttpStream.
3800 QuicStreamRequest request(factory_.get());
3801 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033802 request.Request(
3803 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3804 SocketTag(),
3805 /*cerf_verify_flags=*/0, url_, net_log_, &net_error_details_,
3806 failed_on_default_network_callback_, callback_.callback()));
Renjiea5722ccf2018-08-10 00:18:493807 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3808 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3809 EXPECT_TRUE(stream.get());
3810
3811 // Cause QUIC stream to be created.
3812 HttpRequestInfo request_info;
3813 request_info.method = "GET";
3814 request_info.url = url_;
3815 request_info.traffic_annotation =
3816 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3817 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3818 net_log_, CompletionOnceCallback()));
3819
3820 // Ensure that session is alive and active.
3821 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3822 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3823 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3824
3825 // Send GET request on stream.
3826 HttpResponseInfo response;
3827 HttpRequestHeaders request_headers;
3828 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3829 callback_.callback()));
3830
3831 // Trigger the connection to report path degrading to the session.
3832 // Session will mark itself GOAWAY.
3833 session->connection()->OnPathDegradingTimeout();
3834
3835 // The connection should still be alive, but marked as going away.
3836 EXPECT_FALSE(HasActiveSession(host_port_pair_));
3837 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3838 EXPECT_EQ(1u, session->GetNumActiveStreams());
3839
3840 // Second request should be sent on a new connection.
3841 QuicStreamRequest request2(factory_.get());
3842 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033843 request2.Request(
3844 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3845 SocketTag(),
3846 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3847 failed_on_default_network_callback_, callback_.callback()));
Renjiea5722ccf2018-08-10 00:18:493848 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3849 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
3850 EXPECT_TRUE(stream2.get());
3851
3852 // Resume the data, verify old request can read response on the old session
3853 // successfully.
3854 quic_data1.Resume();
3855 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
3856 EXPECT_EQ(200, response.headers->response_code());
3857 EXPECT_EQ(0U, session->GetNumActiveStreams());
3858
3859 // Check an active session exists for the destination.
3860 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3861 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3862 QuicChromiumClientSession* session2 = GetActiveSession(host_port_pair_);
3863 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
3864 EXPECT_NE(session, session2);
3865
3866 stream.reset();
3867 stream2.reset();
3868 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
3869 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
3870 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
3871 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
3872}
3873
Zhongyi Shibb770d92018-06-16 02:07:003874// This test verifies that the connection will not migrate to a bad socket
3875// when path degrading is detected.
3876TEST_P(QuicStreamFactoryTest, DoNotMigrateToBadSocketOnPathDegrading) {
3877 InitializeConnectionMigrationV2Test(
3878 {kDefaultNetworkForTests, kNewNetworkForTests});
3879 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3880 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3881 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3882
3883 // Using a testing task runner so that we can control time.
3884 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
3885 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
3886
3887 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3888 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
3889
3890 MockQuicData quic_data;
3891 quic::QuicStreamOffset header_stream_offset = 0;
3892 quic_data.AddWrite(SYNCHRONOUS,
3893 ConstructInitialSettingsPacket(1, &header_stream_offset));
Zhongyi Shibb770d92018-06-16 02:07:003894 quic_data.AddWrite(SYNCHRONOUS,
Fan Yang32c5a112018-12-10 20:06:333895 ConstructGetRequestPacket(
3896 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
3897 true, &header_stream_offset));
3898 quic_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
3899 quic_data.AddRead(ASYNC, ConstructOkResponsePacket(
3900 1, GetNthClientInitiatedBidirectionalStreamId(0),
3901 false, false));
3902 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3903 quic_data.AddWrite(
3904 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
3905 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
3906 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shibb770d92018-06-16 02:07:003907 quic_data.AddSocketDataToFactory(socket_factory_.get());
3908
3909 // Set up second socket that will immediately return disconnected.
3910 // The stream factory will abort probe the alternate network.
3911 MockConnect bad_connect = MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED);
3912 SequencedSocketData socket_data(bad_connect, base::span<MockRead>(),
3913 base::span<MockWrite>());
3914 socket_factory_->AddSocketDataProvider(&socket_data);
3915
3916 // Create request and QuicHttpStream.
3917 QuicStreamRequest request(factory_.get());
3918 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033919 request.Request(
3920 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3921 SocketTag(),
3922 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3923 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shibb770d92018-06-16 02:07:003924 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3925 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3926 EXPECT_TRUE(stream.get());
3927
3928 // Cause QUIC stream to be created.
3929 HttpRequestInfo request_info;
3930 request_info.method = "GET";
3931 request_info.url = url_;
3932 request_info.traffic_annotation =
3933 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3934 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3935 net_log_, CompletionOnceCallback()));
3936
3937 // Ensure that session is alive and active.
3938 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3939 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3940 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3941
3942 // Send GET request on stream.
3943 HttpResponseInfo response;
3944 HttpRequestHeaders request_headers;
3945 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3946 callback_.callback()));
3947
3948 // Cause the connection to report path degrading to the session.
3949 // Session will start to probe the alternate network.
3950 session->connection()->OnPathDegradingTimeout();
3951
3952 // The connection should still be alive, and not marked as going away.
3953 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3954 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3955 EXPECT_EQ(1u, session->GetNumActiveStreams());
3956 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
3957
3958 // Resume the data, and response header is received over the original network.
3959 quic_data.Resume();
3960 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3961 EXPECT_EQ(200, response.headers->response_code());
3962
3963 // Verify there is no pending task as probing alternate network is halted.
3964 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
3965
3966 // Verify that the session is still alive.
3967 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3968 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3969
3970 stream.reset();
3971 EXPECT_TRUE(quic_data.AllReadDataConsumed());
3972 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
3973}
3974
Zhongyi Shif5cc30392018-05-30 18:25:153975// Regression test for http://crbug.com/847569.
3976// This test verifies that the connection migrates to the alternate network
3977// early when there is no active stream but a draining stream.
Zhongyi Shib3bc982c2018-07-10 19:59:243978// The first packet being written after migration is a synchrnous write, which
3979// will cause a PING packet being sent.
3980TEST_P(QuicStreamFactoryTest, MigrateSessionWithDrainingStreamSync) {
3981 TestMigrateSessionWithDrainingStream(SYNCHRONOUS);
3982}
3983
3984// Regression test for http://crbug.com/847569.
3985// This test verifies that the connection migrates to the alternate network
3986// early when there is no active stream but a draining stream.
3987// The first packet being written after migration is an asynchronous write, no
3988// PING packet will be sent.
3989TEST_P(QuicStreamFactoryTest, MigrateSessionWithDrainingStreamAsync) {
3990 TestMigrateSessionWithDrainingStream(ASYNC);
3991}
3992
3993void QuicStreamFactoryTestBase::TestMigrateSessionWithDrainingStream(
3994 IoMode write_mode_for_queued_packet) {
Zhongyi Shif5cc30392018-05-30 18:25:153995 InitializeConnectionMigrationV2Test(
3996 {kDefaultNetworkForTests, kNewNetworkForTests});
3997 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3998 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3999 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4000
4001 // Using a testing task runner so that we can control time.
4002 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4003 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4004
4005 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4006 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
4007
Zhongyi Shib3bc982c2018-07-10 19:59:244008 int packet_number = 1;
Zhongyi Shif5cc30392018-05-30 18:25:154009 MockQuicData quic_data1;
4010 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shib3bc982c2018-07-10 19:59:244011 quic_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket(
4012 packet_number++, &header_stream_offset));
4013 quic_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:334014 SYNCHRONOUS,
4015 ConstructGetRequestPacket(packet_number++,
4016 GetNthClientInitiatedBidirectionalStreamId(0),
4017 true, true, &header_stream_offset));
Zhongyi Shif5cc30392018-05-30 18:25:154018 // Read an out of order packet with FIN to drain the stream.
4019 quic_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:334020 ASYNC, ConstructOkResponsePacket(
4021 2, GetNthClientInitiatedBidirectionalStreamId(0), false,
4022 true)); // keep sending version.
Zhongyi Shib3bc982c2018-07-10 19:59:244023 quic_data1.AddWrite(SYNCHRONOUS, client_maker_.MakeAckPacket(
4024 packet_number++, 2, 2, 2, 1, true));
Zhongyi Shif5cc30392018-05-30 18:25:154025 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4026 quic_data1.AddSocketDataToFactory(socket_factory_.get());
4027
4028 // Set up the second socket data provider that is used after migration.
4029 MockQuicData quic_data2;
4030 // Connectivity probe to be sent on the new path.
Zhongyi Shib3bc982c2018-07-10 19:59:244031 quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
Zhongyi Shi879659422018-08-02 17:58:254032 packet_number++, false));
Zhongyi Shif5cc30392018-05-30 18:25:154033 quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
4034 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:254035 quic_data2.AddRead(ASYNC,
4036 server_maker_.MakeConnectivityProbingPacket(3, false));
Zhongyi Shif5cc30392018-05-30 18:25:154037 // Ping packet to send after migration is completed.
Zhongyi Shib3bc982c2018-07-10 19:59:244038 quic_data2.AddWrite(
4039 write_mode_for_queued_packet,
4040 client_maker_.MakeAckPacket(packet_number++, 2, 3, 3, 1, true));
4041 if (write_mode_for_queued_packet == SYNCHRONOUS) {
4042 quic_data2.AddWrite(ASYNC,
4043 client_maker_.MakePingPacket(packet_number++, false));
4044 }
Zhongyi Shif5cc30392018-05-30 18:25:154045 quic_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:334046 ASYNC,
4047 ConstructOkResponsePacket(
4048 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shib3bc982c2018-07-10 19:59:244049 quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeAckPacket(
4050 packet_number++, 1, 3, 1, 1, true));
Zhongyi Shif5cc30392018-05-30 18:25:154051 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4052 quic_data2.AddSocketDataToFactory(socket_factory_.get());
4053
4054 // Create request and QuicHttpStream.
4055 QuicStreamRequest request(factory_.get());
4056 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034057 request.Request(
4058 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4059 SocketTag(),
4060 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4061 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shif5cc30392018-05-30 18:25:154062 EXPECT_THAT(callback_.WaitForResult(), IsOk());
4063 std::unique_ptr<HttpStream> stream = CreateStream(&request);
4064 EXPECT_TRUE(stream.get());
4065
4066 // Cause QUIC stream to be created.
4067 HttpRequestInfo request_info;
4068 request_info.method = "GET";
4069 request_info.url = url_;
4070 request_info.traffic_annotation =
4071 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
4072 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
4073 net_log_, CompletionOnceCallback()));
4074
4075 // Ensure that session is alive and active.
4076 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4077 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4078 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4079
4080 // Send GET request on stream.
4081 HttpResponseInfo response;
4082 HttpRequestHeaders request_headers;
4083 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
4084 callback_.callback()));
4085
4086 // Run the message loop to receive the out of order packet which contains a
4087 // FIN and drains the stream.
4088 base::RunLoop().RunUntilIdle();
4089 EXPECT_EQ(0u, session->GetNumActiveStreams());
4090
4091 // Cause the connection to report path degrading to the session.
4092 // Session should still start to probe the alternate network.
4093 session->connection()->OnPathDegradingTimeout();
4094 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4095
4096 // Next connectivity probe is scheduled to be sent in 2 *
4097 // kDefaultRTTMilliSecs.
4098 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4099 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
4100 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
4101 next_task_delay);
4102
4103 // The connection should still be alive, and not marked as going away.
4104 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shif5cc30392018-05-30 18:25:154105
4106 // Resume quic data and a connectivity probe response will be read on the new
4107 // socket.
4108 quic_data2.Resume();
4109
4110 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4111 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi0439ecc72018-07-11 04:41:264112 EXPECT_EQ(0u, session->GetNumActiveStreams());
4113 EXPECT_EQ(1u, session->GetNumDrainingStreams());
Zhongyi Shif5cc30392018-05-30 18:25:154114
4115 // There should be three pending tasks, the nearest one will complete
4116 // migration to the new network.
4117 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
4118 next_task_delay = task_runner->NextPendingTaskDelay();
4119 EXPECT_EQ(base::TimeDelta(), next_task_delay);
4120 task_runner->FastForwardBy(next_task_delay);
4121
4122 // Now there are two pending tasks, the nearest one was to send connectivity
4123 // probe and has been cancelled due to successful migration.
4124 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
4125 next_task_delay = task_runner->NextPendingTaskDelay();
4126 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
4127 next_task_delay);
4128 task_runner->FastForwardBy(next_task_delay);
4129
4130 // There's one more task to mgirate back to the default network in 0.4s.
4131 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4132 next_task_delay = task_runner->NextPendingTaskDelay();
4133 base::TimeDelta expected_delay =
4134 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
4135 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
4136 EXPECT_EQ(expected_delay, next_task_delay);
4137
Zhongyi Shib3bc982c2018-07-10 19:59:244138 base::RunLoop().RunUntilIdle();
4139
Zhongyi Shif5cc30392018-05-30 18:25:154140 // Deliver a signal that the alternate network now becomes default to session,
4141 // this will cancel mgirate back to default network timer.
4142 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4143 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
4144
4145 task_runner->FastForwardBy(next_task_delay);
4146 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4147
4148 // Verify that the session is still alive.
4149 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4150 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi0439ecc72018-07-11 04:41:264151 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
Zhongyi Shif5cc30392018-05-30 18:25:154152
4153 stream.reset();
4154 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
4155 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
4156 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
4157 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
4158}
4159
Zhongyi Shiaba4a832018-04-30 20:29:084160// Regression test for http://crbug.com/835444.
4161// This test verifies that the connection migrates to the alternate network
4162// when the alternate network is connected after path has been degrading.
4163TEST_P(QuicStreamFactoryTest, MigrateOnNewNetworkConnectAfterPathDegrading) {
4164 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
4165 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4166 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4167 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4168
4169 // Using a testing task runner so that we can control time.
4170 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4171 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4172
4173 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4174 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
4175
4176 MockQuicData quic_data1;
Ryan Hamilton8d9ee76e2018-05-29 23:52:524177 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shiaba4a832018-04-30 20:29:084178 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
4179 quic_data1.AddWrite(SYNCHRONOUS,
4180 ConstructInitialSettingsPacket(1, &header_stream_offset));
Fan Yang32c5a112018-12-10 20:06:334181 quic_data1.AddWrite(
4182 SYNCHRONOUS, ConstructGetRequestPacket(
4183 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
4184 true, &header_stream_offset));
Zhongyi Shiaba4a832018-04-30 20:29:084185 quic_data1.AddSocketDataToFactory(socket_factory_.get());
4186
4187 // Set up the second socket data provider that is used after migration.
4188 // The response to the earlier request is read on the new socket.
4189 MockQuicData quic_data2;
4190 // Connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:254191 quic_data2.AddWrite(SYNCHRONOUS,
4192 client_maker_.MakeConnectivityProbingPacket(3, true));
Zhongyi Shiaba4a832018-04-30 20:29:084193 quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
4194 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:254195 quic_data2.AddRead(ASYNC,
4196 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shiaba4a832018-04-30 20:29:084197 // Ping packet to send after migration is completed.
4198 quic_data2.AddWrite(ASYNC,
4199 client_maker_.MakeAckAndPingPacket(4, false, 1, 1, 1));
4200 quic_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:334201 ASYNC,
4202 ConstructOkResponsePacket(
4203 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shiaba4a832018-04-30 20:29:084204 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:334205 quic_data2.AddWrite(
4206 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
4207 5, false, GetNthClientInitiatedBidirectionalStreamId(0),
4208 quic::QUIC_STREAM_CANCELLED, 2, 2, 1, true));
Zhongyi Shiaba4a832018-04-30 20:29:084209 quic_data2.AddSocketDataToFactory(socket_factory_.get());
4210
4211 // Create request and QuicHttpStream.
4212 QuicStreamRequest request(factory_.get());
4213 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034214 request.Request(
4215 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4216 SocketTag(),
4217 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4218 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shiaba4a832018-04-30 20:29:084219 EXPECT_THAT(callback_.WaitForResult(), IsOk());
4220 std::unique_ptr<HttpStream> stream = CreateStream(&request);
4221 EXPECT_TRUE(stream.get());
4222
4223 // Cause QUIC stream to be created.
4224 HttpRequestInfo request_info;
4225 request_info.method = "GET";
4226 request_info.url = url_;
4227 request_info.traffic_annotation =
4228 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
4229 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
4230 net_log_, CompletionOnceCallback()));
4231
4232 // Ensure that session is alive and active.
4233 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4234 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4235 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4236
4237 // Send GET request on stream.
4238 HttpResponseInfo response;
4239 HttpRequestHeaders request_headers;
4240 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
4241 callback_.callback()));
4242
4243 // Cause the connection to report path degrading to the session.
4244 // Due to lack of alternate network, session will not mgirate connection.
4245 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4246 session->connection()->OnPathDegradingTimeout();
4247 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4248
4249 // Deliver a signal that a alternate network is connected now, this should
4250 // cause the connection to start early migration on path degrading.
4251 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4252 ->SetConnectedNetworksList(
4253 {kDefaultNetworkForTests, kNewNetworkForTests});
4254 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4255 ->NotifyNetworkConnected(kNewNetworkForTests);
Zhongyi Shic4823bd2018-04-27 00:49:194256
4257 // Next connectivity probe is scheduled to be sent in 2 *
4258 // kDefaultRTTMilliSecs.
4259 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4260 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
4261 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
4262 next_task_delay);
4263
4264 // The connection should still be alive, and not marked as going away.
4265 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4266 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4267 EXPECT_EQ(1u, session->GetNumActiveStreams());
4268 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
4269
4270 // Resume quic data and a connectivity probe response will be read on the new
4271 // socket.
4272 quic_data2.Resume();
4273
4274 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4275 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4276 EXPECT_EQ(1u, session->GetNumActiveStreams());
4277
4278 // There should be three pending tasks, the nearest one will complete
4279 // migration to the new network.
4280 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
4281 next_task_delay = task_runner->NextPendingTaskDelay();
4282 EXPECT_EQ(base::TimeDelta(), next_task_delay);
4283 task_runner->FastForwardBy(next_task_delay);
4284
4285 // Response headers are received over the new network.
4286 EXPECT_THAT(callback_.WaitForResult(), IsOk());
4287 EXPECT_EQ(200, response.headers->response_code());
4288
4289 // Now there are two pending tasks, the nearest one was to send connectivity
4290 // probe and has been cancelled due to successful migration.
4291 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
4292 next_task_delay = task_runner->NextPendingTaskDelay();
4293 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
4294 next_task_delay);
4295 task_runner->FastForwardBy(next_task_delay);
4296
4297 // There's one more task to mgirate back to the default network in 0.4s.
4298 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4299 next_task_delay = task_runner->NextPendingTaskDelay();
4300 base::TimeDelta expected_delay =
4301 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
4302 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
4303 EXPECT_EQ(expected_delay, next_task_delay);
4304
4305 // Deliver a signal that the alternate network now becomes default to session,
4306 // this will cancel mgirate back to default network timer.
4307 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4308 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
4309
4310 task_runner->FastForwardBy(next_task_delay);
4311 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4312
4313 // Verify that the session is still alive.
4314 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4315 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4316
4317 stream.reset();
4318 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
4319 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
4320 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
4321 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
4322}
4323
Zhongyi Shi28f6e352018-06-20 21:15:434324// This test verifies that multiple sessions are migrated on connection
4325// migration signal.
jrie3d187c2016-09-16 14:29:174326TEST_P(QuicStreamFactoryTest,
Zhongyi Shi28f6e352018-06-20 21:15:434327 MigrateMultipleSessionsToBadSocketsAfterDisconnected) {
4328 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jrie3d187c2016-09-16 14:29:174329
4330 MockQuicData socket_data1;
4331 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:434332 socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
jrie3d187c2016-09-16 14:29:174333 socket_data1.AddWrite(ASYNC, OK);
Zhongyi Shi5f587cc2017-11-21 23:24:174334 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jrie3d187c2016-09-16 14:29:174335 MockQuicData socket_data2;
4336 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:434337 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
jrie3d187c2016-09-16 14:29:174338 socket_data2.AddWrite(ASYNC, OK);
Zhongyi Shi5f587cc2017-11-21 23:24:174339 socket_data2.AddSocketDataToFactory(socket_factory_.get());
jrie3d187c2016-09-16 14:29:174340
4341 HostPortPair server1(kDefaultServerHostName, 443);
4342 HostPortPair server2(kServer2HostName, 443);
4343
4344 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4345 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4346 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4347
Renjiea0cb4a2c2018-09-26 23:37:304348 host_resolver_->set_synchronous_mode(true);
4349 host_resolver_->rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
4350 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.2", "");
jrie3d187c2016-09-16 14:29:174351
4352 // Create request and QuicHttpStream to create session1.
zhongyi98d6a9262017-05-19 02:47:454353 QuicStreamRequest request1(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:034354 EXPECT_EQ(OK,
4355 request1.Request(
4356 server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
4357 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4358 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:244359 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
jrie3d187c2016-09-16 14:29:174360 EXPECT_TRUE(stream1.get());
4361
4362 // Create request and QuicHttpStream to create session2.
zhongyi98d6a9262017-05-19 02:47:454363 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:034364 EXPECT_EQ(OK,
4365 request2.Request(
4366 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
4367 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
4368 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:244369 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
jrie3d187c2016-09-16 14:29:174370 EXPECT_TRUE(stream2.get());
4371
4372 QuicChromiumClientSession* session1 = GetActiveSession(server1);
4373 QuicChromiumClientSession* session2 = GetActiveSession(server2);
4374 EXPECT_NE(session1, session2);
4375
4376 // Cause QUIC stream to be created and send GET so session1 has an open
4377 // stream.
4378 HttpRequestInfo request_info1;
4379 request_info1.method = "GET";
4380 request_info1.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:394381 request_info1.traffic_annotation =
4382 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:274383 EXPECT_EQ(OK,
4384 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:394385 net_log_, CompletionOnceCallback()));
jrie3d187c2016-09-16 14:29:174386 HttpResponseInfo response1;
4387 HttpRequestHeaders request_headers1;
4388 EXPECT_EQ(OK, stream1->SendRequest(request_headers1, &response1,
4389 callback_.callback()));
4390
4391 // Cause QUIC stream to be created and send GET so session2 has an open
4392 // stream.
4393 HttpRequestInfo request_info2;
4394 request_info2.method = "GET";
4395 request_info2.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:394396 request_info2.traffic_annotation =
4397 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:274398 EXPECT_EQ(OK,
4399 stream2->InitializeStream(&request_info2, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:394400 net_log_, CompletionOnceCallback()));
jrie3d187c2016-09-16 14:29:174401 HttpResponseInfo response2;
4402 HttpRequestHeaders request_headers2;
4403 EXPECT_EQ(OK, stream2->SendRequest(request_headers2, &response2,
4404 callback_.callback()));
4405
4406 // Cause both sessions to be paused due to DISCONNECTED.
4407 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4408 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
4409
4410 // Ensure that both sessions are paused but alive.
4411 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session1));
4412 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
4413
Zhongyi Shi28f6e352018-06-20 21:15:434414 // Add new sockets to use post migration. Those are bad sockets and will cause
4415 // migration to fail.
jrie3d187c2016-09-16 14:29:174416 MockConnect connect_result =
4417 MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED);
Ryan Sleevib8d7ea02018-05-07 20:01:014418 SequencedSocketData socket_data3(connect_result, base::span<MockRead>(),
4419 base::span<MockWrite>());
Zhongyi Shi5f587cc2017-11-21 23:24:174420 socket_factory_->AddSocketDataProvider(&socket_data3);
Ryan Sleevib8d7ea02018-05-07 20:01:014421 SequencedSocketData socket_data4(connect_result, base::span<MockRead>(),
4422 base::span<MockWrite>());
Zhongyi Shi5f587cc2017-11-21 23:24:174423 socket_factory_->AddSocketDataProvider(&socket_data4);
jrie3d187c2016-09-16 14:29:174424
Zhongyi Shi28f6e352018-06-20 21:15:434425 // Connect the new network and cause migration to bad sockets, causing
4426 // sessions to close.
jrie3d187c2016-09-16 14:29:174427 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4428 ->SetConnectedNetworksList({kNewNetworkForTests});
4429 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4430 ->NotifyNetworkConnected(kNewNetworkForTests);
4431
4432 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session1));
4433 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
4434
4435 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
4436 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
4437 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
4438 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
4439}
4440
Zhongyi Shi6ec9b36e2018-06-20 20:32:544441// This test verifies that session attempts connection migration with signals
4442// delivered in the following order (no alternate network is available):
4443// - path degrading is detected: session attempts connection migration but no
4444// alternate network is available, session caches path degrading signal in
4445// connection and stays on the original network.
4446// - original network backs up, request is served in the orignal network,
4447// session is not marked as going away.
4448TEST_P(QuicStreamFactoryTest, MigrateOnPathDegradingWithNoNewNetwork) {
4449 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jrid36ada62016-02-06 02:42:084450 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4451 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4452
Zhongyi Shi6ec9b36e2018-06-20 20:32:544453 MockQuicData quic_data;
4454 quic::QuicStreamOffset header_stream_offset = 0;
4455 quic_data.AddWrite(SYNCHRONOUS,
4456 ConstructInitialSettingsPacket(1, &header_stream_offset));
Fan Yang32c5a112018-12-10 20:06:334457 quic_data.AddWrite(SYNCHRONOUS,
4458 ConstructGetRequestPacket(
4459 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
4460 true, &header_stream_offset));
Zhongyi Shi6ec9b36e2018-06-20 20:32:544461 quic_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause for path degrading signal.
4462
4463 // The rest of the data will still flow in the original socket as there is no
4464 // new network after path degrading.
Fan Yang32c5a112018-12-10 20:06:334465 quic_data.AddRead(ASYNC, ConstructOkResponsePacket(
4466 1, GetNthClientInitiatedBidirectionalStreamId(0),
4467 false, false));
Zhongyi Shi6ec9b36e2018-06-20 20:32:544468 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:334469 quic_data.AddWrite(
4470 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
4471 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
4472 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi6ec9b36e2018-06-20 20:32:544473 quic_data.AddSocketDataToFactory(socket_factory_.get());
jrid36ada62016-02-06 02:42:084474
4475 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:454476 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:334477 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034478 request.Request(
4479 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4480 SocketTag(),
4481 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4482 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:014483 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:244484 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jrid36ada62016-02-06 02:42:084485 EXPECT_TRUE(stream.get());
4486
4487 // Cause QUIC stream to be created.
4488 HttpRequestInfo request_info;
Zhongyi Shi6ec9b36e2018-06-20 20:32:544489 request_info.method = "GET";
4490 request_info.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:394491 request_info.traffic_annotation =
4492 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Zhongyi Shi6ec9b36e2018-06-20 20:32:544493 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:394494 net_log_, CompletionOnceCallback()));
jrid36ada62016-02-06 02:42:084495
4496 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:504497 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jrid36ada62016-02-06 02:42:084498 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4499 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4500
Zhongyi Shi6ec9b36e2018-06-20 20:32:544501 // Send GET request on stream.
4502 HttpResponseInfo response;
4503 HttpRequestHeaders request_headers;
4504 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
4505 callback_.callback()));
jrid36ada62016-02-06 02:42:084506
Zhongyi Shi6ec9b36e2018-06-20 20:32:544507 // Trigger connection migration on path degrading. Since there are no networks
4508 // to migrate to, the session will remain on the original network, not marked
4509 // as going away.
4510 session->connection()->OnPathDegradingTimeout();
4511 EXPECT_TRUE(session->connection()->IsPathDegrading());
4512
4513 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4514 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4515 EXPECT_EQ(1u, session->GetNumActiveStreams());
4516 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
4517
4518 // Resume so that rest of the data will flow in the original socket.
4519 quic_data.Resume();
jrid36ada62016-02-06 02:42:084520
4521 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4522 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4523 EXPECT_EQ(1u, session->GetNumActiveStreams());
4524
4525 stream.reset();
Zhongyi Shi6ec9b36e2018-06-20 20:32:544526 EXPECT_TRUE(quic_data.AllReadDataConsumed());
4527 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
jrid36ada62016-02-06 02:42:084528}
4529
Zhongyi Shi21e99532018-07-17 22:23:074530// This test verifies that session with non-migratable stream will probe the
4531// alternate network on path degrading, and close the non-migratable streams
4532// when probe is successful.
Zhongyi Shi32fe14d42019-02-28 00:25:364533TEST_P(QuicStreamFactoryTest,
4534 MigrateSessionEarlyNonMigratableStream_DoNotMigrateIdleSessions) {
4535 TestMigrateSessionEarlyNonMigratableStream(false);
4536}
4537
4538TEST_P(QuicStreamFactoryTest,
4539 MigrateSessionEarlyNonMigratableStream_MigrateIdleSessions) {
4540 TestMigrateSessionEarlyNonMigratableStream(true);
4541}
4542
4543void QuicStreamFactoryTestBase::TestMigrateSessionEarlyNonMigratableStream(
4544 bool migrate_idle_sessions) {
4545 test_params_.quic_migrate_idle_sessions = migrate_idle_sessions;
Zhongyi Shi1a054612018-06-14 04:59:084546 InitializeConnectionMigrationV2Test(
jri231c2972016-03-08 19:50:114547 {kDefaultNetworkForTests, kNewNetworkForTests});
4548 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4549 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4550
rcha00569732016-08-27 11:09:364551 MockQuicData socket_data;
4552 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:434553 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi32fe14d42019-02-28 00:25:364554 if (!migrate_idle_sessions) {
4555 socket_data.AddWrite(
4556 SYNCHRONOUS,
4557 client_maker_.MakeRstAckAndConnectionClosePacket(
4558 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
4559 quic::QUIC_STREAM_CANCELLED,
4560 quic::QuicTime::Delta::FromMilliseconds(0), 1, 1, 1,
4561 quic::QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS,
4562 "net error"));
4563 }
Zhongyi Shi5f587cc2017-11-21 23:24:174564 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri231c2972016-03-08 19:50:114565
Zhongyi Shi21e99532018-07-17 22:23:074566 // Set up the second socket data provider that is used for probing.
4567 MockQuicData quic_data1;
4568 // Connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:254569 quic_data1.AddWrite(SYNCHRONOUS,
4570 client_maker_.MakeConnectivityProbingPacket(2, true));
Zhongyi Shi21e99532018-07-17 22:23:074571 quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
4572 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:254573 quic_data1.AddRead(ASYNC,
4574 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shi32fe14d42019-02-28 00:25:364575 if (migrate_idle_sessions) {
4576 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
4577 // A RESET will be sent to the peer to cancel the non-migratable stream.
4578 quic_data1.AddWrite(
4579 SYNCHRONOUS,
4580 client_maker_.MakeRstPacket(
4581 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
4582 quic::QUIC_STREAM_CANCELLED));
4583 // Ping packet to send after migration is completed.
4584 quic_data1.AddWrite(SYNCHRONOUS,
4585 client_maker_.MakeAckAndPingPacket(4, false, 1, 1, 1));
4586 }
Zhongyi Shi21e99532018-07-17 22:23:074587 quic_data1.AddSocketDataToFactory(socket_factory_.get());
4588
jri231c2972016-03-08 19:50:114589 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:454590 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:334591 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034592 request.Request(
4593 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4594 SocketTag(),
4595 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4596 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:014597 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:244598 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri231c2972016-03-08 19:50:114599 EXPECT_TRUE(stream.get());
4600
4601 // Cause QUIC stream to be created, but marked as non-migratable.
4602 HttpRequestInfo request_info;
Zhongyi Shibb28b1f2018-07-18 02:41:264603 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
Ramin Halavati683bcaa92018-02-14 08:42:394604 request_info.traffic_annotation =
4605 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:274606 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:394607 net_log_, CompletionOnceCallback()));
jri231c2972016-03-08 19:50:114608
4609 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:504610 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:114611 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4612 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4613
4614 // Trigger connection migration. Since there is a non-migratable stream,
Zhongyi Shic16b4102019-02-12 00:37:404615 // this should cause session to migrate.
jri231c2972016-03-08 19:50:114616 session->OnPathDegrading();
4617
4618 // Run the message loop so that data queued in the new socket is read by the
4619 // packet reader.
4620 base::RunLoop().RunUntilIdle();
4621
jri231c2972016-03-08 19:50:114622 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4623 EXPECT_EQ(1u, session->GetNumActiveStreams());
4624
Zhongyi Shi21e99532018-07-17 22:23:074625 // Resume the data to read the connectivity probing response to declare probe
4626 // as successful. Non-migratable streams will be closed.
4627 quic_data1.Resume();
Zhongyi Shi32fe14d42019-02-28 00:25:364628 if (migrate_idle_sessions)
4629 base::RunLoop().RunUntilIdle();
Zhongyi Shic16b4102019-02-12 00:37:404630
Zhongyi Shi32fe14d42019-02-28 00:25:364631 EXPECT_EQ(migrate_idle_sessions, HasActiveSession(host_port_pair_));
Zhongyi Shi21e99532018-07-17 22:23:074632 EXPECT_EQ(0u, session->GetNumActiveStreams());
jri231c2972016-03-08 19:50:114633
Zhongyi Shi21e99532018-07-17 22:23:074634 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
4635 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
jri231c2972016-03-08 19:50:114636 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4637 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4638}
4639
jri9c541572016-03-29 17:51:484640TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyConnectionMigrationDisabled) {
Zhongyi Shi1a054612018-06-14 04:59:084641 InitializeConnectionMigrationV2Test(
jri9c541572016-03-29 17:51:484642 {kDefaultNetworkForTests, kNewNetworkForTests});
4643 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4644 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4645
rcha00569732016-08-27 11:09:364646 MockQuicData socket_data;
4647 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:434648 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
4649 socket_data.AddWrite(
Fan Yang32c5a112018-12-10 20:06:334650 SYNCHRONOUS, client_maker_.MakeRstPacket(
4651 2, true, GetNthClientInitiatedBidirectionalStreamId(0),
4652 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:174653 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9c541572016-03-29 17:51:484654
4655 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:454656 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:334657 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034658 request.Request(
4659 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4660 SocketTag(),
4661 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4662 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:014663 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:244664 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9c541572016-03-29 17:51:484665 EXPECT_TRUE(stream.get());
4666
4667 // Cause QUIC stream to be created.
4668 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:394669 request_info.traffic_annotation =
4670 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:274671 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:394672 net_log_, CompletionOnceCallback()));
jri9c541572016-03-29 17:51:484673
4674 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:504675 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:484676 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4677 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4678
4679 // Set session config to have connection migration disabled.
Ryan Hamilton8d9ee76e2018-05-29 23:52:524680 quic::test::QuicConfigPeer::SetReceivedDisableConnectionMigration(
4681 session->config());
jri9c541572016-03-29 17:51:484682 EXPECT_TRUE(session->config()->DisableConnectionMigration());
4683
4684 // Trigger connection migration. Since there is a non-migratable stream,
4685 // this should cause session to be continue without migrating.
4686 session->OnPathDegrading();
4687
4688 // Run the message loop so that data queued in the new socket is read by the
4689 // packet reader.
4690 base::RunLoop().RunUntilIdle();
4691
4692 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4693 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4694 EXPECT_EQ(1u, session->GetNumActiveStreams());
4695
4696 stream.reset();
4697
4698 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4699 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4700}
4701
Zhongyi Shi3c4c9e92018-07-02 23:16:234702// Regression test for http://crbug.com/791886.
4703// This test verifies that the old packet writer which encountered an
4704// asynchronous write error will be blocked during migration on write error. New
4705// packets would not be written until the one with write error is rewritten on
4706// the new network.
4707TEST_P(QuicStreamFactoryTest, MigrateSessionOnAysncWriteError) {
4708 InitializeConnectionMigrationV2Test(
4709 {kDefaultNetworkForTests, kNewNetworkForTests});
4710 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4711 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4712 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4713
4714 // Using a testing task runner so that we can control time.
4715 // base::RunLoop() controls mocked socket writes and reads.
4716 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4717 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4718
4719 MockQuicData socket_data;
4720 quic::QuicStreamOffset header_stream_offset = 0;
4721 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4722 socket_data.AddWrite(
4723 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
4724 socket_data.AddWrite(ASYNC, ERR_ADDRESS_UNREACHABLE);
4725 socket_data.AddSocketDataToFactory(socket_factory_.get());
4726
4727 // Set up second socket data provider that is used after
4728 // migration. The request is rewritten to this new socket, and the
4729 // response to the request is read on this new socket.
4730 MockQuicData socket_data1;
Zhongyi Shi3c4c9e92018-07-02 23:16:234731 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:334732 SYNCHRONOUS, ConstructGetRequestPacket(
4733 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
4734 true, &header_stream_offset));
4735 socket_data1.AddWrite(SYNCHRONOUS,
4736 ConstructGetRequestPacket(
4737 3, GetNthClientInitiatedBidirectionalStreamId(1),
4738 GetNthClientInitiatedBidirectionalStreamId(0), true,
4739 true, &header_stream_offset));
4740 socket_data1.AddRead(
4741 ASYNC,
4742 ConstructOkResponsePacket(
4743 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
4744 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4745 socket_data1.AddWrite(
4746 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
4747 4, false, GetNthClientInitiatedBidirectionalStreamId(0),
4748 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
4749 socket_data1.AddWrite(
4750 SYNCHRONOUS, client_maker_.MakeRstPacket(
4751 5, false, GetNthClientInitiatedBidirectionalStreamId(1),
Frank Kastenholz684ea412019-02-13 18:48:184752 quic::QUIC_STREAM_CANCELLED, 0,
4753 /*include_stop_sending_if_v99=*/true));
Zhongyi Shi3c4c9e92018-07-02 23:16:234754
4755 socket_data1.AddSocketDataToFactory(socket_factory_.get());
4756
4757 // Create request #1 and QuicHttpStream.
4758 QuicStreamRequest request1(factory_.get());
4759 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034760 request1.Request(
4761 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4762 SocketTag(),
4763 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4764 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi3c4c9e92018-07-02 23:16:234765 EXPECT_THAT(callback_.WaitForResult(), IsOk());
4766 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
4767 EXPECT_TRUE(stream1.get());
4768
4769 HttpRequestInfo request_info1;
4770 request_info1.method = "GET";
4771 request_info1.url = GURL("https://www.example.org/");
4772 request_info1.traffic_annotation =
4773 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
4774 EXPECT_EQ(OK,
4775 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
4776 net_log_, CompletionOnceCallback()));
4777
4778 // Request #2 returns synchronously because it pools to existing session.
4779 TestCompletionCallback callback2;
4780 QuicStreamRequest request2(factory_.get());
4781 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
4782 DEFAULT_PRIORITY, SocketTag(),
4783 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:034784 &net_error_details_,
4785 failed_on_default_network_callback_,
4786 callback2.callback()));
Zhongyi Shi3c4c9e92018-07-02 23:16:234787 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
4788 EXPECT_TRUE(stream2.get());
4789
4790 HttpRequestInfo request_info2;
4791 request_info2.method = "GET";
4792 request_info2.url = GURL("https://www.example.org/");
4793 request_info2.traffic_annotation =
4794 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
4795 EXPECT_EQ(OK,
4796 stream2->InitializeStream(&request_info2, true, DEFAULT_PRIORITY,
4797 net_log_, CompletionOnceCallback()));
4798
4799 // Ensure that session is alive and active.
4800 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4801 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4802 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4803 EXPECT_EQ(2u, session->GetNumActiveStreams());
4804
4805 // Send GET request on stream1. This should cause an async write error.
4806 HttpResponseInfo response;
4807 HttpRequestHeaders request_headers;
4808 EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
4809 callback_.callback()));
4810 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4811
4812 // Run the message loop so that asynchronous write completes and a connection
4813 // migration on write error attempt is posted in QuicStreamFactory's task
4814 // runner.
4815 base::RunLoop().RunUntilIdle();
4816 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4817
4818 // Send GET request on stream. This will cause another write attempt before
4819 // migration on write error is exectued.
4820 HttpResponseInfo response2;
4821 HttpRequestHeaders request_headers2;
4822 EXPECT_EQ(OK, stream2->SendRequest(request_headers2, &response2,
4823 callback2.callback()));
4824
4825 // Run the task runner so that migration on write error is finally executed.
4826 task_runner->RunUntilIdle();
4827
Zhongyi Shia7dd46b2018-07-12 22:59:294828 // Verify the session is still alive and not marked as going away.
Zhongyi Shi3c4c9e92018-07-02 23:16:234829 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:294830 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi3c4c9e92018-07-02 23:16:234831 EXPECT_EQ(2u, session->GetNumActiveStreams());
Zhongyi Shia7dd46b2018-07-12 22:59:294832 // There should be one task posted to migrate back to the default network in
4833 // kMinRetryTimeForDefaultNetworkSecs.
4834 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4835 EXPECT_EQ(base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs),
4836 task_runner->NextPendingTaskDelay());
Zhongyi Shi3c4c9e92018-07-02 23:16:234837
4838 // Verify that response headers on the migrated socket were delivered to the
4839 // stream.
4840 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
4841 EXPECT_EQ(200, response.headers->response_code());
4842
4843 stream1.reset();
4844 stream2.reset();
4845
4846 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4847 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4848 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
4849 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
4850}
4851
Zhongyi Shia7dd46b2018-07-12 22:59:294852// Verify session is not marked as going away after connection migration on
4853// write error and migrate back to default network logic is applied to bring the
4854// migrated session back to the default network. Migration singals delivered
4855// in the following order (alternate network is always availabe):
4856// - session on the default network encountered a write error;
4857// - session successfully migrated to the non-default network;
4858// - session attempts to migrate back to default network post migration;
4859// - migration back to the default network is successful.
4860TEST_P(QuicStreamFactoryTest, MigrateBackToDefaultPostMigrationOnWriteError) {
4861 InitializeConnectionMigrationV2Test(
4862 {kDefaultNetworkForTests, kNewNetworkForTests});
4863 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4864 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4865 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4866
4867 // Using a testing task runner so that we can control time.
4868 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4869 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4870
4871 MockQuicData socket_data;
4872 quic::QuicStreamOffset header_stream_offset = 0;
4873 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4874 socket_data.AddWrite(
4875 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
4876 socket_data.AddWrite(ASYNC, ERR_ADDRESS_UNREACHABLE);
4877 socket_data.AddSocketDataToFactory(socket_factory_.get());
4878
4879 // Set up second socket data provider that is used after
4880 // migration. The request is rewritten to this new socket, and the
4881 // response to the request is read on this new socket.
4882 MockQuicData quic_data2;
Fan Yang32c5a112018-12-10 20:06:334883 quic_data2.AddWrite(
4884 SYNCHRONOUS, ConstructGetRequestPacket(
4885 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
4886 true, &header_stream_offset));
Zhongyi Shia7dd46b2018-07-12 22:59:294887 quic_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:334888 ASYNC,
4889 ConstructOkResponsePacket(
4890 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shia7dd46b2018-07-12 22:59:294891 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4892 quic_data2.AddSocketDataToFactory(socket_factory_.get());
4893
4894 // Create request QuicHttpStream.
4895 QuicStreamRequest request1(factory_.get());
4896 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034897 request1.Request(
4898 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4899 SocketTag(),
4900 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4901 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shia7dd46b2018-07-12 22:59:294902 EXPECT_THAT(callback_.WaitForResult(), IsOk());
4903 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
4904 EXPECT_TRUE(stream1.get());
4905
4906 HttpRequestInfo request_info1;
4907 request_info1.method = "GET";
4908 request_info1.url = GURL("https://www.example.org/");
4909 request_info1.traffic_annotation =
4910 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
4911 EXPECT_EQ(OK,
4912 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
4913 net_log_, CompletionOnceCallback()));
4914
4915 // Ensure that session is alive and active.
4916 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4917 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4918 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4919 EXPECT_EQ(1u, session->GetNumActiveStreams());
4920
4921 // Send GET request. This should cause an async write error.
4922 HttpResponseInfo response;
4923 HttpRequestHeaders request_headers;
4924 EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
4925 callback_.callback()));
4926 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4927
4928 // Run the message loop so that asynchronous write completes and a connection
4929 // migration on write error attempt is posted in QuicStreamFactory's task
4930 // runner.
4931 base::RunLoop().RunUntilIdle();
4932 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4933
4934 // Run the task runner so that migration on write error is finally executed.
4935 task_runner->RunUntilIdle();
4936
4937 // Verify the session is still alive and not marked as going away.
4938 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4939 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4940 EXPECT_EQ(1u, session->GetNumActiveStreams());
4941 // There should be one task posted to migrate back to the default network in
4942 // kMinRetryTimeForDefaultNetworkSecs.
4943 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4944 base::TimeDelta expected_delay =
4945 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs);
4946 EXPECT_EQ(expected_delay, task_runner->NextPendingTaskDelay());
4947
4948 // Verify that response headers on the migrated socket were delivered to the
4949 // stream.
4950 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
4951 EXPECT_EQ(200, response.headers->response_code());
4952
4953 // Set up the third socket data provider for migrate back to default network.
4954 MockQuicData quic_data3;
4955 // Connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:254956 quic_data3.AddWrite(SYNCHRONOUS,
4957 client_maker_.MakeConnectivityProbingPacket(3, false));
Zhongyi Shia7dd46b2018-07-12 22:59:294958 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:254959 quic_data3.AddRead(ASYNC,
4960 server_maker_.MakeConnectivityProbingPacket(2, false));
Zhongyi Shia7dd46b2018-07-12 22:59:294961 quic_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4962 quic_data3.AddWrite(ASYNC, client_maker_.MakeAckPacket(4, 1, 2, 1, 1, true));
4963 quic_data3.AddWrite(
Fan Yang32c5a112018-12-10 20:06:334964 SYNCHRONOUS, client_maker_.MakeRstPacket(
4965 5, false, GetNthClientInitiatedBidirectionalStreamId(0),
Frank Kastenholz684ea412019-02-13 18:48:184966 quic::QUIC_STREAM_CANCELLED, 0,
4967 /*include_stop_sending_if_v99=*/true));
Zhongyi Shia7dd46b2018-07-12 22:59:294968 quic_data3.AddSocketDataToFactory(socket_factory_.get());
4969
4970 // Fast forward to fire the migrate back timer and verify the session
4971 // successfully migrates back to the default network.
4972 task_runner->FastForwardBy(expected_delay);
4973
4974 // Verify the session is still alive and not marked as going away.
4975 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4976 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4977 EXPECT_EQ(1u, session->GetNumActiveStreams());
4978
4979 // There should be one task posted to one will resend a connectivity probe and
4980 // the other will retry migrate back, both are cancelled.
4981 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
4982 task_runner->FastForwardBy(
4983 base::TimeDelta::FromSeconds(2 * kMinRetryTimeForDefaultNetworkSecs));
4984 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4985
4986 stream1.reset();
4987 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4988 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4989 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
4990 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
4991 EXPECT_TRUE(quic_data3.AllReadDataConsumed());
4992 EXPECT_TRUE(quic_data3.AllWriteDataConsumed());
4993}
4994
Zhongyi Shic1449372018-08-09 09:58:584995// This test verifies that the connection will not attempt connection migration
4996// (send connectivity probes on alternate path) when path degrading is detected
4997// and handshake is not confirmed.
4998TEST_P(QuicStreamFactoryTest,
4999 NoMigrationOnPathDegradingBeforeHandshakeConfirmed) {
5000 InitializeConnectionMigrationV2Test(
5001 {kDefaultNetworkForTests, kNewNetworkForTests});
5002
5003 // Using a testing task runner.
5004 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
5005 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
5006
5007 // Use cold start mode to send crypto message for handshake.
5008 crypto_client_stream_factory_.set_handshake_mode(
5009 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
5010
5011 MockQuicData socket_data;
5012 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5013 socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
5014 socket_data.AddSocketDataToFactory(socket_factory_.get());
5015
5016 // Create request and QuicHttpStream.
5017 QuicStreamRequest request(factory_.get());
5018 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035019 request.Request(
5020 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5021 SocketTag(),
5022 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5023 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shic1449372018-08-09 09:58:585024
5025 base::RunLoop().RunUntilIdle();
5026
5027 // Ensure that session is alive but not active.
5028 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5029 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
5030 QuicChromiumClientSession* session = GetPendingSession(host_port_pair_);
5031 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5032 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
5033
5034 // Cause the connection to report path degrading to the session.
5035 // Session will ignore the signal as handshake is not completed.
5036 session->connection()->OnPathDegradingTimeout();
5037 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
5038
5039 EXPECT_FALSE(HasActiveSession(host_port_pair_));
Zhongyi Shi8de43832018-08-15 23:40:005040 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
Zhongyi Shic1449372018-08-09 09:58:585041 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5042 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5043}
5044
Zhongyi Shi634c1882018-08-16 04:05:595045// This test verifies that if a connection is closed with
5046// QUIC_NETWORK_IDLE_TIMEOUT before handshake is completed and there is no
5047// alternate network, no new connection will be created.
5048TEST_P(QuicStreamFactoryTest, NoAlternateNetworkBeforeHandshakeOnIdleTimeout) {
5049 TestNoAlternateNetworkBeforeHandshake(quic::QUIC_NETWORK_IDLE_TIMEOUT);
5050}
5051
5052// This test verifies that if a connection is closed with QUIC_HANDSHAKE_TIMEOUT
5053// and there is no alternate network, no new connection will be created.
5054TEST_P(QuicStreamFactoryTest, NoAlternateNetworkOnHandshakeTimeout) {
5055 TestNoAlternateNetworkBeforeHandshake(quic::QUIC_HANDSHAKE_TIMEOUT);
5056}
5057
5058void QuicStreamFactoryTestBase::TestNoAlternateNetworkBeforeHandshake(
5059 quic::QuicErrorCode quic_error) {
5060 DCHECK(quic_error == quic::QUIC_NETWORK_IDLE_TIMEOUT ||
5061 quic_error == quic::QUIC_HANDSHAKE_TIMEOUT);
5062 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
5063
5064 // Using a testing task runner.
5065 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
5066 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
5067
5068 // Use cold start mode to send crypto message for handshake.
5069 crypto_client_stream_factory_.set_handshake_mode(
5070 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
5071
5072 MockQuicData socket_data;
5073 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5074 socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
5075 socket_data.AddSocketDataToFactory(socket_factory_.get());
5076
5077 // Create request.
5078 QuicStreamRequest request(factory_.get());
5079 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035080 request.Request(
5081 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5082 SocketTag(),
5083 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5084 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi634c1882018-08-16 04:05:595085
5086 base::RunLoop().RunUntilIdle();
5087
5088 // Ensure that session is alive but not active.
5089 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5090 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
5091 QuicChromiumClientSession* session = GetPendingSession(host_port_pair_);
5092 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5093 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
5094
5095 // Cause the connection to report path degrading to the session.
5096 // Session will ignore the signal as handshake is not completed.
5097 session->connection()->OnPathDegradingTimeout();
5098 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
5099 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5100 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
5101
5102 // Cause the connection to close due to |quic_error| before handshake.
5103 quic::QuicString error_details;
5104 if (quic_error == quic::QUIC_NETWORK_IDLE_TIMEOUT) {
5105 error_details = "No recent network activity.";
5106 } else {
5107 error_details = "Handshake timeout expired.";
5108 }
5109 session->connection()->CloseConnection(
5110 quic_error, error_details, quic::ConnectionCloseBehavior::SILENT_CLOSE);
5111
5112 // A task will be posted to clean up the session in the factory.
5113 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
5114 task_runner->FastForwardUntilNoTasksRemain();
5115
5116 // No new session should be created as there is no alternate network.
5117 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5118 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
5119 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5120 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5121}
5122
Zhongyi Shi8de43832018-08-15 23:40:005123TEST_P(QuicStreamFactoryTest, NewConnectionBeforeHandshakeAfterIdleTimeout) {
5124 TestNewConnectionOnAlternateNetworkBeforeHandshake(
5125 quic::QUIC_NETWORK_IDLE_TIMEOUT);
5126}
5127
5128TEST_P(QuicStreamFactoryTest, NewConnectionAfterHandshakeTimeout) {
5129 TestNewConnectionOnAlternateNetworkBeforeHandshake(
5130 quic::QUIC_HANDSHAKE_TIMEOUT);
5131}
5132
Zhongyi Shif3fcbbe62018-08-16 22:52:085133// Sets up a test to verify that a new connection will be created on the
5134// alternate network after the initial connection fails before handshake with
5135// signals delivered in the following order (alternate network is available):
5136// - the default network is not able to complete crypto handshake;
5137// - the original connection is closed with |quic_error|;
5138// - a new connection is created on the alternate network and is able to finish
5139// crypto handshake;
5140// - the new session on the alternate network attempts to migrate back to the
5141// default network by sending probes;
5142// - default network being disconnected is delivered: session will stop probing
5143// the original network.
5144// - alternate network is made by default.
Zhongyi Shi8de43832018-08-15 23:40:005145void QuicStreamFactoryTestBase::
5146 TestNewConnectionOnAlternateNetworkBeforeHandshake(
5147 quic::QuicErrorCode quic_error) {
5148 DCHECK(quic_error == quic::QUIC_NETWORK_IDLE_TIMEOUT ||
5149 quic_error == quic::QUIC_HANDSHAKE_TIMEOUT);
Zhongyi Shi967d2f12019-02-08 20:58:535150 test_params_.quic_retry_on_alternate_network_before_handshake = true;
Zhongyi Shi8de43832018-08-15 23:40:005151 InitializeConnectionMigrationV2Test(
5152 {kDefaultNetworkForTests, kNewNetworkForTests});
5153
5154 // Using a testing task runner.
5155 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
5156 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
5157
5158 // Use cold start mode to send crypto message for handshake.
5159 crypto_client_stream_factory_.set_handshake_mode(
5160 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
5161
5162 // Socket data for connection on the default network.
5163 MockQuicData socket_data;
5164 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5165 socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
5166 socket_data.AddSocketDataToFactory(socket_factory_.get());
5167
5168 // Socket data for connection on the alternate network.
5169 MockQuicData socket_data2;
5170 quic::QuicStreamOffset header_stream_offset = 0;
5171 socket_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeDummyCHLOPacket(1));
5172 socket_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
5173 // Change the encryption level after handshake is confirmed.
5174 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_FORWARD_SECURE);
5175 socket_data2.AddWrite(
5176 ASYNC, ConstructInitialSettingsPacket(2, &header_stream_offset));
5177 socket_data2.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335178 ASYNC, ConstructGetRequestPacket(
5179 3, GetNthClientInitiatedBidirectionalStreamId(0), true, true,
5180 &header_stream_offset));
Zhongyi Shi8de43832018-08-15 23:40:005181 socket_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:335182 ASYNC,
5183 ConstructOkResponsePacket(
5184 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shi8de43832018-08-15 23:40:005185 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:335186 socket_data2.AddWrite(
5187 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
5188 5, false, GetNthClientInitiatedBidirectionalStreamId(0),
5189 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi8de43832018-08-15 23:40:005190 socket_data2.AddSocketDataToFactory(socket_factory_.get());
5191
Zhongyi Shif3fcbbe62018-08-16 22:52:085192 // Socket data for probing on the default network.
5193 MockQuicData probing_data;
5194 probing_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
5195 probing_data.AddWrite(SYNCHRONOUS,
5196 client_maker_.MakeConnectivityProbingPacket(4, false));
5197 probing_data.AddSocketDataToFactory(socket_factory_.get());
5198
Zhongyi Shi8de43832018-08-15 23:40:005199 // Create request and QuicHttpStream.
5200 QuicStreamRequest request(factory_.get());
5201 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035202 request.Request(
5203 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5204 SocketTag(),
5205 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5206 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi8de43832018-08-15 23:40:005207
5208 base::RunLoop().RunUntilIdle();
5209
5210 // Ensure that session is alive but not active.
5211 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5212 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
5213 QuicChromiumClientSession* session = GetPendingSession(host_port_pair_);
5214 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5215 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
Zhongyi Shia6b68d112018-09-24 07:49:035216 EXPECT_FALSE(failed_on_default_network_);
Zhongyi Shi8de43832018-08-15 23:40:005217
5218 quic::QuicString error_details;
5219 if (quic_error == quic::QUIC_NETWORK_IDLE_TIMEOUT) {
5220 error_details = "No recent network activity.";
5221 } else {
5222 error_details = "Handshake timeout expired.";
5223 }
5224 session->connection()->CloseConnection(
5225 quic_error, error_details, quic::ConnectionCloseBehavior::SILENT_CLOSE);
5226
5227 // A task will be posted to clean up the session in the factory.
5228 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
5229 task_runner->FastForwardUntilNoTasksRemain();
5230
5231 // Verify a new session is created on the alternate network.
5232 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
5233 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5234 QuicChromiumClientSession* session2 = GetPendingSession(host_port_pair_);
5235 EXPECT_NE(session, session2);
Zhongyi Shia6b68d112018-09-24 07:49:035236 EXPECT_TRUE(failed_on_default_network_);
Zhongyi Shi8de43832018-08-15 23:40:005237
5238 // Confirm the handshake on the alternate network.
5239 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
5240 quic::QuicSession::HANDSHAKE_CONFIRMED);
5241 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5242 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5243 // Resume the data now so that data can be sent and read.
5244 socket_data2.Resume();
5245
5246 // Create the stream.
5247 std::unique_ptr<HttpStream> stream = CreateStream(&request);
5248 EXPECT_TRUE(stream.get());
5249 HttpRequestInfo request_info;
5250 request_info.method = "GET";
5251 request_info.url = GURL("https://www.example.org/");
5252 request_info.traffic_annotation =
5253 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5254 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
5255 net_log_, CompletionOnceCallback()));
5256 // Send the request.
5257 HttpResponseInfo response;
5258 HttpRequestHeaders request_headers;
5259 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
5260 callback_.callback()));
5261 // Run the message loop to finish asynchronous mock write.
5262 base::RunLoop().RunUntilIdle();
5263 // Read the response.
5264 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
5265 EXPECT_EQ(200, response.headers->response_code());
5266
Zhongyi Shif3fcbbe62018-08-16 22:52:085267 // There should be a new task posted to migrate back to the default network.
5268 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
5269 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
5270 EXPECT_EQ(base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs),
5271 next_task_delay);
5272 task_runner->FastForwardBy(next_task_delay);
5273
5274 // There should be two tasks posted. One will retry probing and the other
5275 // will retry migrate back.
5276 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
5277 next_task_delay = task_runner->NextPendingTaskDelay();
5278 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
5279 next_task_delay);
5280
5281 // Deliver the signal that the default network is disconnected.
5282 scoped_mock_network_change_notifier_->mock_network_change_notifier()
5283 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
5284 // Verify no connectivity probes will be sent as probing will be cancelled.
5285 task_runner->FastForwardUntilNoTasksRemain();
5286 // Deliver the signal that the alternate network is made default.
5287 scoped_mock_network_change_notifier_->mock_network_change_notifier()
5288 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
5289 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
5290
Zhongyi Shi8de43832018-08-15 23:40:005291 stream.reset();
5292 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5293 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5294 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
5295 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
5296}
5297
Zhongyi Shi247d6322018-07-24 07:03:355298// Test that connection will be closed with PACKET_WRITE_ERROR if a write error
5299// is triggered before handshake is confirmed and connection migration is turned
5300// on.
5301TEST_P(QuicStreamFactoryTest, MigrationOnWriteErrorBeforeHandshakeConfirmed) {
Zhongyi Shi967d2f12019-02-08 20:58:535302 DCHECK(!test_params_.quic_retry_on_alternate_network_before_handshake);
Zhongyi Shi247d6322018-07-24 07:03:355303 InitializeConnectionMigrationV2Test(
5304 {kDefaultNetworkForTests, kNewNetworkForTests});
5305
5306 // Use unmocked crypto stream to do crypto connect.
5307 crypto_client_stream_factory_.set_handshake_mode(
Zhongyi Shi879659422018-08-02 17:58:255308 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
Zhongyi Shi247d6322018-07-24 07:03:355309
5310 MockQuicData socket_data;
5311 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5312 // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect.
5313 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
5314 socket_data.AddSocketDataToFactory(socket_factory_.get());
5315
5316 // Create request, should fail after the write of the CHLO fails.
5317 QuicStreamRequest request(factory_.get());
5318 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035319 request.Request(
5320 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5321 SocketTag(),
5322 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5323 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi247d6322018-07-24 07:03:355324 EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, callback_.WaitForResult());
5325 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5326 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
5327
5328 // Verify new requests can be sent normally.
5329 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:275330 MockCryptoClientStream::COLD_START);
Zhongyi Shi247d6322018-07-24 07:03:355331 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5332 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5333 MockQuicData socket_data2;
5334 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5335 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
5336 socket_data2.AddSocketDataToFactory(socket_factory_.get());
5337
5338 QuicStreamRequest request2(factory_.get());
5339 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035340 request2.Request(
5341 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5342 SocketTag(),
5343 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5344 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi247d6322018-07-24 07:03:355345 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5346 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
5347 // Run the message loop to complete host resolution.
5348 base::RunLoop().RunUntilIdle();
5349
5350 // Complete handshake. QuicStreamFactory::Job should complete and succeed.
5351 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
5352 quic::QuicSession::HANDSHAKE_CONFIRMED);
5353 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5354 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5355 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
5356
5357 // Create QuicHttpStream.
5358 std::unique_ptr<HttpStream> stream = CreateStream(&request2);
5359 EXPECT_TRUE(stream.get());
5360 stream.reset();
5361 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5362 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5363 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
5364 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
5365}
5366
Zhongyi Shif2524bf2019-01-27 07:44:035367// Test that if the original connection is closed with QUIC_PACKET_WRITE_ERROR
5368// before handshake is confirmed and new connection before handshake is turned
5369// on, a new connection will be retried on the alternate network.
5370TEST_P(QuicStreamFactoryTest,
5371 RetryConnectionOnWriteErrorBeforeHandshakeConfirmed) {
Zhongyi Shi967d2f12019-02-08 20:58:535372 test_params_.quic_retry_on_alternate_network_before_handshake = true;
Zhongyi Shif2524bf2019-01-27 07:44:035373 InitializeConnectionMigrationV2Test(
5374 {kDefaultNetworkForTests, kNewNetworkForTests});
5375
5376 // Use unmocked crypto stream to do crypto connect.
5377 crypto_client_stream_factory_.set_handshake_mode(
5378 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
5379
5380 // Socket data for connection on the default network.
5381 MockQuicData socket_data;
5382 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5383 // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect.
5384 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
5385 socket_data.AddSocketDataToFactory(socket_factory_.get());
5386
5387 // Socket data for connection on the alternate network.
5388 MockQuicData socket_data2;
5389 quic::QuicStreamOffset header_stream_offset = 0;
5390 socket_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeDummyCHLOPacket(1));
5391 socket_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
5392 // Change the encryption level after handshake is confirmed.
5393 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_FORWARD_SECURE);
5394 socket_data2.AddWrite(
5395 ASYNC, ConstructInitialSettingsPacket(2, &header_stream_offset));
5396 socket_data2.AddWrite(
5397 ASYNC, ConstructGetRequestPacket(
5398 3, GetNthClientInitiatedBidirectionalStreamId(0), true, true,
5399 &header_stream_offset));
5400 socket_data2.AddRead(
5401 ASYNC,
5402 ConstructOkResponsePacket(
5403 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
5404 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5405 socket_data2.AddWrite(
5406 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
5407 4, false, GetNthClientInitiatedBidirectionalStreamId(0),
5408 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
5409 socket_data2.AddSocketDataToFactory(socket_factory_.get());
5410
5411 // Create request, should fail after the write of the CHLO fails.
5412 QuicStreamRequest request(factory_.get());
5413 EXPECT_EQ(ERR_IO_PENDING,
5414 request.Request(
5415 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5416 SocketTag(),
5417 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5418 failed_on_default_network_callback_, callback_.callback()));
5419 // Ensure that the session is alive but not active.
5420 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5421 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
5422 base::RunLoop().RunUntilIdle();
5423 QuicChromiumClientSession* session = GetPendingSession(host_port_pair_);
5424 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5425
5426 // Confirm the handshake on the alternate network.
5427 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
5428 quic::QuicSession::HANDSHAKE_CONFIRMED);
5429 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5430 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5431
5432 // Resume the data now so that data can be sent and read.
5433 socket_data2.Resume();
5434
5435 // Create the stream.
5436 std::unique_ptr<HttpStream> stream = CreateStream(&request);
5437 EXPECT_TRUE(stream.get());
5438 HttpRequestInfo request_info;
5439 request_info.method = "GET";
5440 request_info.url = GURL("https://www.example.org/");
5441 request_info.traffic_annotation =
5442 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5443 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
5444 net_log_, CompletionOnceCallback()));
5445 // Send the request.
5446 HttpResponseInfo response;
5447 HttpRequestHeaders request_headers;
5448 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
5449 callback_.callback()));
5450 // Run the message loop to finish asynchronous mock write.
5451 base::RunLoop().RunUntilIdle();
5452 // Read the response.
5453 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
5454 EXPECT_EQ(200, response.headers->response_code());
5455
5456 stream.reset();
5457 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5458 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5459 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
5460 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
5461}
5462
jri9f303712016-09-13 01:10:225463void QuicStreamFactoryTestBase::TestMigrationOnWriteError(
5464 IoMode write_error_mode) {
Zhongyi Shi1a054612018-06-14 04:59:085465 InitializeConnectionMigrationV2Test(
jri9f303712016-09-13 01:10:225466 {kDefaultNetworkForTests, kNewNetworkForTests});
5467 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5468 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5469 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5470
Zhongyi Shi3c4c9e92018-07-02 23:16:235471 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
5472
jri9f303712016-09-13 01:10:225473 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:525474 quic::QuicStreamOffset header_stream_offset = 0;
jri9f303712016-09-13 01:10:225475 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
rch5cb522462017-04-25 20:18:365476 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:435477 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
jri9f303712016-09-13 01:10:225478 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:175479 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:225480
5481 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:455482 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:335483 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035484 request.Request(
5485 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5486 SocketTag(),
5487 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5488 failed_on_default_network_callback_, callback_.callback()));
jri9f303712016-09-13 01:10:225489 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:245490 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9f303712016-09-13 01:10:225491 EXPECT_TRUE(stream.get());
5492
5493 // Cause QUIC stream to be created.
5494 HttpRequestInfo request_info;
5495 request_info.method = "GET";
5496 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:395497 request_info.traffic_annotation =
5498 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:275499 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:395500 net_log_, CompletionOnceCallback()));
jri9f303712016-09-13 01:10:225501
5502 // Ensure that session is alive and active.
5503 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5504 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5505 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5506
5507 // Set up second socket data provider that is used after
5508 // migration. The request is rewritten to this new socket, and the
5509 // response to the request is read on this new socket.
5510 MockQuicData socket_data1;
Fan Yang32c5a112018-12-10 20:06:335511 socket_data1.AddWrite(
5512 SYNCHRONOUS, ConstructGetRequestPacket(
5513 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
5514 true, &header_stream_offset));
Zhongyi Shi32f2fd02018-04-16 18:23:435515 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:335516 ASYNC,
5517 ConstructOkResponsePacket(
5518 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
jri9f303712016-09-13 01:10:225519 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:335520 socket_data1.AddWrite(
5521 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
5522 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
5523 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:175524 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:225525
5526 // Send GET request on stream. This should cause a write error, which triggers
5527 // a connection migration attempt.
5528 HttpResponseInfo response;
5529 HttpRequestHeaders request_headers;
5530 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
5531 callback_.callback()));
5532
5533 // Run the message loop so that the migration attempt is executed and
5534 // data queued in the new socket is read by the packet reader.
5535 base::RunLoop().RunUntilIdle();
5536
Zhongyi Shia7dd46b2018-07-12 22:59:295537 // Verify that session is alive and not marked as going awya.
jri9f303712016-09-13 01:10:225538 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:295539 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri9f303712016-09-13 01:10:225540 EXPECT_EQ(1u, session->GetNumActiveStreams());
5541
5542 // Verify that response headers on the migrated socket were delivered to the
5543 // stream.
5544 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
5545 EXPECT_EQ(200, response.headers->response_code());
5546
5547 stream.reset();
5548
5549 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5550 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5551 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
5552 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
5553}
5554
5555TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorSynchronous) {
5556 TestMigrationOnWriteError(SYNCHRONOUS);
5557}
5558
5559TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorAsync) {
5560 TestMigrationOnWriteError(ASYNC);
5561}
5562
5563void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorNoNewNetwork(
5564 IoMode write_error_mode) {
Zhongyi Shi1a054612018-06-14 04:59:085565 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jri9f303712016-09-13 01:10:225566 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5567 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5568
jri5b785512016-09-13 04:29:115569 // Use the test task runner, to force the migration alarm timeout later.
5570 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
5571
jri9f303712016-09-13 01:10:225572 MockQuicData socket_data;
5573 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:435574 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
jri9f303712016-09-13 01:10:225575 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:175576 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:225577
5578 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:455579 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:335580 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035581 request.Request(
5582 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5583 SocketTag(),
5584 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5585 failed_on_default_network_callback_, callback_.callback()));
jri9f303712016-09-13 01:10:225586 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:245587 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9f303712016-09-13 01:10:225588 EXPECT_TRUE(stream.get());
5589
5590 // Cause QUIC stream to be created.
5591 HttpRequestInfo request_info;
5592 request_info.method = "GET";
5593 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:395594 request_info.traffic_annotation =
5595 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:275596 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:395597 net_log_, CompletionOnceCallback()));
jri9f303712016-09-13 01:10:225598
5599 // Ensure that session is alive and active.
5600 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5601 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5602 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5603
jri5b785512016-09-13 04:29:115604 // Send GET request on stream. This causes a write error, which triggers
5605 // a connection migration attempt. Since there are no networks
5606 // to migrate to, this causes the session to wait for a new network.
jri9f303712016-09-13 01:10:225607 HttpResponseInfo response;
5608 HttpRequestHeaders request_headers;
5609 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
5610 callback_.callback()));
jri5b785512016-09-13 04:29:115611
5612 // Complete any pending writes. Pending async MockQuicData writes
5613 // are run on the message loop, not on the test runner.
jri9f303712016-09-13 01:10:225614 base::RunLoop().RunUntilIdle();
jri5b785512016-09-13 04:29:115615
5616 // Write error causes migration task to be posted. Spin the loop.
5617 if (write_error_mode == ASYNC)
5618 runner_->RunNextTask();
5619
5620 // Migration has not yet failed. The session should be alive and active.
5621 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5622 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5623 EXPECT_EQ(1u, session->GetNumActiveStreams());
5624 EXPECT_TRUE(session->connection()->writer()->IsWriteBlocked());
5625
5626 // The migration will not fail until the migration alarm timeout.
5627 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5628 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5629 EXPECT_EQ(1u, session->GetNumActiveStreams());
5630 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
5631
5632 // Force migration alarm timeout to run.
5633 RunTestLoopUntilIdle();
5634
5635 // The connection should be closed. A request for response headers
5636 // should fail.
jri9f303712016-09-13 01:10:225637 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5638 EXPECT_FALSE(HasActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:115639 EXPECT_EQ(ERR_NETWORK_CHANGED, callback_.WaitForResult());
5640 EXPECT_EQ(ERR_NETWORK_CHANGED,
5641 stream->ReadResponseHeaders(callback_.callback()));
jri9f303712016-09-13 01:10:225642
Zhongyi Shi59aaf072019-01-17 03:32:135643 NetErrorDetails error_details;
5644 stream->PopulateNetErrorDetails(&error_details);
5645 EXPECT_EQ(error_details.quic_connection_error,
5646 quic::QUIC_CONNECTION_MIGRATION_NO_NEW_NETWORK);
5647
jri9f303712016-09-13 01:10:225648 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5649 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5650}
5651
5652TEST_P(QuicStreamFactoryTest,
5653 MigrateSessionOnWriteErrorNoNewNetworkSynchronous) {
5654 TestMigrationOnWriteErrorNoNewNetwork(SYNCHRONOUS);
5655}
5656
5657TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorNoNewNetworkAsync) {
5658 TestMigrationOnWriteErrorNoNewNetwork(ASYNC);
5659}
5660
Zhongyi Shi0439ecc72018-07-11 04:41:265661TEST_P(QuicStreamFactoryTest,
5662 MigrateSessionOnWriteErrorWithMultipleRequestsSync) {
5663 TestMigrationOnWriteErrorWithMultipleRequests(SYNCHRONOUS);
5664}
5665
5666TEST_P(QuicStreamFactoryTest,
5667 MigrateSessionOnWriteErrorWithMultipleRequestsAsync) {
5668 TestMigrationOnWriteErrorWithMultipleRequests(ASYNC);
5669}
5670
5671// Sets up a test which verifies that connection migration on write error can
5672// eventually succeed and rewrite the packet on the new network with *multiple*
5673// migratable streams.
5674void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorWithMultipleRequests(
5675 IoMode write_error_mode) {
5676 InitializeConnectionMigrationV2Test(
5677 {kDefaultNetworkForTests, kNewNetworkForTests});
5678 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5679 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5680 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5681
5682 MockQuicData socket_data;
5683 quic::QuicStreamOffset header_stream_offset = 0;
5684 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5685 socket_data.AddWrite(
5686 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
5687 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
5688 socket_data.AddSocketDataToFactory(socket_factory_.get());
5689
5690 // Set up second socket data provider that is used after
5691 // migration. The request is rewritten to this new socket, and the
5692 // response to the request is read on this new socket.
5693 MockQuicData socket_data1;
Zhongyi Shi0439ecc72018-07-11 04:41:265694 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335695 SYNCHRONOUS, ConstructGetRequestPacket(
5696 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
5697 true, &header_stream_offset));
5698 socket_data1.AddRead(
5699 ASYNC,
5700 ConstructOkResponsePacket(
5701 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
5702 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5703 socket_data1.AddWrite(
5704 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
5705 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
5706 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
5707 socket_data1.AddWrite(
5708 SYNCHRONOUS, client_maker_.MakeRstPacket(
5709 4, false, GetNthClientInitiatedBidirectionalStreamId(1),
Frank Kastenholz684ea412019-02-13 18:48:185710 quic::QUIC_STREAM_CANCELLED, 0,
5711 /*include_stop_sending_if_v99=*/true));
Zhongyi Shi0439ecc72018-07-11 04:41:265712
5713 socket_data1.AddSocketDataToFactory(socket_factory_.get());
5714
5715 // Create request #1 and QuicHttpStream.
5716 QuicStreamRequest request1(factory_.get());
5717 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035718 request1.Request(
5719 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5720 SocketTag(),
5721 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5722 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265723 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5724 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
5725 EXPECT_TRUE(stream1.get());
5726
5727 HttpRequestInfo request_info1;
5728 request_info1.method = "GET";
5729 request_info1.url = GURL("https://www.example.org/");
5730 request_info1.traffic_annotation =
5731 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5732 EXPECT_EQ(OK,
5733 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
5734 net_log_, CompletionOnceCallback()));
5735
5736 // Second request returns synchronously because it pools to existing session.
5737 TestCompletionCallback callback2;
5738 QuicStreamRequest request2(factory_.get());
5739 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
5740 DEFAULT_PRIORITY, SocketTag(),
5741 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:035742 &net_error_details_,
5743 failed_on_default_network_callback_,
5744 callback2.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265745 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
5746 EXPECT_TRUE(stream2.get());
5747 HttpRequestInfo request_info2;
5748 request_info2.method = "GET";
5749 request_info2.url = GURL("https://www.example.org/");
5750 request_info2.traffic_annotation =
5751 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5752 EXPECT_EQ(OK,
5753 stream2->InitializeStream(&request_info2, true, DEFAULT_PRIORITY,
5754 net_log_, CompletionOnceCallback()));
5755
5756 // Ensure that session is alive and active.
5757 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5758 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5759 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5760 EXPECT_EQ(2u, session->GetNumActiveStreams());
5761
5762 // Send GET request on stream. This should cause a write error, which triggers
5763 // a connection migration attempt.
5764 HttpResponseInfo response;
5765 HttpRequestHeaders request_headers;
5766 EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
5767 callback_.callback()));
5768
5769 // Run the message loop so that the migration attempt is executed and
5770 // data queued in the new socket is read by the packet reader.
5771 base::RunLoop().RunUntilIdle();
5772
Zhongyi Shia7dd46b2018-07-12 22:59:295773 // Verify session is still alive and not marked as going away.
Zhongyi Shi0439ecc72018-07-11 04:41:265774 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:295775 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi0439ecc72018-07-11 04:41:265776 EXPECT_EQ(2u, session->GetNumActiveStreams());
5777
5778 // Verify that response headers on the migrated socket were delivered to the
5779 // stream.
5780 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
5781 EXPECT_EQ(200, response.headers->response_code());
5782
5783 stream1.reset();
5784 stream2.reset();
5785
5786 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5787 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5788 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
5789 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
5790}
5791
5792TEST_P(QuicStreamFactoryTest, MigrateOnWriteErrorWithMixedRequestsSync) {
5793 TestMigrationOnWriteErrorMixedStreams(SYNCHRONOUS);
5794}
5795
5796TEST_P(QuicStreamFactoryTest, MigrateOnWriteErrorWithMixedRequestsAsync) {
5797 TestMigrationOnWriteErrorMixedStreams(ASYNC);
5798}
5799
5800// Sets up a test that verifies connection migration manages to migrate to
5801// alternate network after encountering a SYNC/ASYNC write error based on
5802// |write_error_mode| on the original network.
5803// Note there are mixed types of unfinished requests before migration: one
5804// migratable and one non-migratable. The *migratable* one triggers write
5805// error.
5806void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorMixedStreams(
5807 IoMode write_error_mode) {
5808 InitializeConnectionMigrationV2Test(
5809 {kDefaultNetworkForTests, kNewNetworkForTests});
5810 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5811 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5812 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5813
5814 int packet_number = 1;
5815 MockQuicData socket_data;
5816 quic::QuicStreamOffset header_stream_offset = 0;
5817 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5818 socket_data.AddWrite(
5819 SYNCHRONOUS,
5820 ConstructInitialSettingsPacket(packet_number++, &header_stream_offset));
5821 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
5822 socket_data.AddSocketDataToFactory(socket_factory_.get());
5823
5824 // Set up second socket data provider that is used after
5825 // migration. The request is rewritten to this new socket, and the
5826 // response to the request is read on this new socket.
5827 MockQuicData socket_data1;
5828 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335829 SYNCHRONOUS,
5830 ConstructGetRequestPacket(packet_number++,
5831 GetNthClientInitiatedBidirectionalStreamId(0),
5832 true, true, &header_stream_offset));
Zhongyi Shi0439ecc72018-07-11 04:41:265833 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335834 SYNCHRONOUS,
5835 client_maker_.MakeRstPacket(packet_number++, true,
5836 GetNthClientInitiatedBidirectionalStreamId(1),
Frank Kastenholz684ea412019-02-13 18:48:185837 quic::QUIC_STREAM_CANCELLED, 0,
5838 /*include_stop_sending_if_v99=*/true));
Zhongyi Shi0439ecc72018-07-11 04:41:265839 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:335840 ASYNC,
5841 ConstructOkResponsePacket(
5842 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shi0439ecc72018-07-11 04:41:265843 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5844 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335845 SYNCHRONOUS,
5846 client_maker_.MakeAckAndRstPacket(
5847 packet_number++, false, GetNthClientInitiatedBidirectionalStreamId(0),
5848 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi0439ecc72018-07-11 04:41:265849 socket_data1.AddSocketDataToFactory(socket_factory_.get());
5850
5851 // Create request #1 and QuicHttpStream.
5852 QuicStreamRequest request1(factory_.get());
5853 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035854 request1.Request(
5855 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5856 SocketTag(),
5857 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5858 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265859 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5860 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
5861 EXPECT_TRUE(stream1.get());
5862
5863 HttpRequestInfo request_info1;
5864 request_info1.method = "GET";
5865 request_info1.url = GURL("https://www.example.org/");
5866 request_info1.traffic_annotation =
5867 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5868 EXPECT_EQ(OK,
5869 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
5870 net_log_, CompletionOnceCallback()));
5871
5872 // Second request returns synchronously because it pools to existing session.
5873 TestCompletionCallback callback2;
5874 QuicStreamRequest request2(factory_.get());
5875 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
5876 DEFAULT_PRIORITY, SocketTag(),
5877 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:035878 &net_error_details_,
5879 failed_on_default_network_callback_,
5880 callback2.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265881 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
5882 EXPECT_TRUE(stream2.get());
5883
5884 HttpRequestInfo request_info2;
5885 request_info2.method = "GET";
Zhongyi Shibb28b1f2018-07-18 02:41:265886 request_info2.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
Zhongyi Shi0439ecc72018-07-11 04:41:265887 request_info2.url = GURL("https://www.example.org/");
5888 request_info2.traffic_annotation =
5889 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5890 EXPECT_EQ(OK,
5891 stream2->InitializeStream(&request_info2, true, DEFAULT_PRIORITY,
5892 net_log_, CompletionOnceCallback()));
5893
5894 // Ensure that session is alive and active.
5895 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5896 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5897 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5898 EXPECT_EQ(2u, session->GetNumActiveStreams());
5899
5900 // Send GET request on stream 1. This should cause a write error, which
5901 // triggers a connection migration attempt.
5902 HttpResponseInfo response;
5903 HttpRequestHeaders request_headers;
5904 EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
5905 callback_.callback()));
5906
5907 // Run the message loop so that the migration attempt is executed and
5908 // data queued in the new socket is read by the packet reader.
5909 base::RunLoop().RunUntilIdle();
5910
Zhongyi Shia7dd46b2018-07-12 22:59:295911 // Verify that the session is still alive and not marked as going away.
5912 // Non-migratable stream should be closed due to migration.
Zhongyi Shi0439ecc72018-07-11 04:41:265913 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:295914 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi0439ecc72018-07-11 04:41:265915 EXPECT_EQ(1u, session->GetNumActiveStreams());
5916
5917 // Verify that response headers on the migrated socket were delivered to the
5918 // stream.
5919 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
5920 EXPECT_EQ(200, response.headers->response_code());
5921
5922 stream1.reset();
5923
5924 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5925 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5926 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
5927 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
5928}
5929
5930TEST_P(QuicStreamFactoryTest, MigrateOnWriteErrorWithMixedRequests2Sync) {
5931 TestMigrationOnWriteErrorMixedStreams2(SYNCHRONOUS);
5932}
5933
5934TEST_P(QuicStreamFactoryTest, MigrateOnWriteErrorWithMixedRequests2Async) {
5935 TestMigrationOnWriteErrorMixedStreams2(ASYNC);
5936}
5937
5938// The one triggers write error is a non-migratable stream.
5939// Sets up a test that verifies connection migration manages to migrate to
5940// alternate network after encountering a SYNC/ASYNC write error based on
5941// |write_error_mode| on the original network.
5942// Note there are mixed types of unfinished requests before migration: one
5943// migratable and one non-migratable. The *non-migratable* one triggers write
5944// error.
5945void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorMixedStreams2(
5946 IoMode write_error_mode) {
5947 InitializeConnectionMigrationV2Test(
5948 {kDefaultNetworkForTests, kNewNetworkForTests});
5949 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5950 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5951 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5952
5953 int packet_number = 1;
5954 MockQuicData socket_data;
5955 quic::QuicStreamOffset header_stream_offset = 0;
5956 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5957 socket_data.AddWrite(
5958 SYNCHRONOUS,
5959 ConstructInitialSettingsPacket(packet_number++, &header_stream_offset));
5960 socket_data.AddWrite(write_error_mode,
5961 ERR_ADDRESS_UNREACHABLE); // Write error.
5962 socket_data.AddSocketDataToFactory(socket_factory_.get());
5963
5964 // Set up second socket data provider that is used after
5965 // migration. The request is rewritten to this new socket, and the
5966 // response to the request is read on this new socket.
5967 MockQuicData socket_data1;
5968 // The packet triggered writer error will be sent anyway even if the stream
5969 // will be cancelled later.
5970 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335971 SYNCHRONOUS,
5972 ConstructGetRequestPacket(packet_number++,
5973 GetNthClientInitiatedBidirectionalStreamId(1),
5974 true, true, &header_stream_offset));
Zhongyi Shi0439ecc72018-07-11 04:41:265975 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335976 SYNCHRONOUS,
5977 client_maker_.MakeRstPacket(packet_number++, true,
5978 GetNthClientInitiatedBidirectionalStreamId(1),
Frank Kastenholz684ea412019-02-13 18:48:185979 quic::QUIC_STREAM_CANCELLED, 0,
5980 /*include_stop_sending_if_v99=*/true));
Zhongyi Shi0439ecc72018-07-11 04:41:265981 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335982 SYNCHRONOUS,
5983 ConstructGetRequestPacket(packet_number++,
5984 GetNthClientInitiatedBidirectionalStreamId(0),
5985 true, true, &header_stream_offset));
Zhongyi Shi0439ecc72018-07-11 04:41:265986 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:335987 ASYNC,
5988 ConstructOkResponsePacket(
5989 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shi0439ecc72018-07-11 04:41:265990 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5991 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335992 SYNCHRONOUS,
5993 client_maker_.MakeAckAndRstPacket(
5994 packet_number++, false, GetNthClientInitiatedBidirectionalStreamId(0),
5995 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi0439ecc72018-07-11 04:41:265996 socket_data1.AddSocketDataToFactory(socket_factory_.get());
5997
5998 // Create request #1 and QuicHttpStream.
5999 QuicStreamRequest request1(factory_.get());
6000 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036001 request1.Request(
6002 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6003 SocketTag(),
6004 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6005 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:266006 EXPECT_THAT(callback_.WaitForResult(), IsOk());
6007 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
6008 EXPECT_TRUE(stream1.get());
6009
6010 HttpRequestInfo request_info1;
6011 request_info1.method = "GET";
6012 request_info1.url = GURL("https://www.example.org/");
6013 request_info1.traffic_annotation =
6014 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
6015 EXPECT_EQ(OK,
6016 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
6017 net_log_, CompletionOnceCallback()));
6018
6019 // Second request returns synchronously because it pools to existing session.
6020 TestCompletionCallback callback2;
6021 QuicStreamRequest request2(factory_.get());
6022 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
6023 DEFAULT_PRIORITY, SocketTag(),
6024 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:036025 &net_error_details_,
6026 failed_on_default_network_callback_,
6027 callback2.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:266028 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
6029 EXPECT_TRUE(stream2.get());
6030
6031 HttpRequestInfo request_info2;
6032 request_info2.method = "GET";
Zhongyi Shibb28b1f2018-07-18 02:41:266033 request_info2.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
Zhongyi Shi0439ecc72018-07-11 04:41:266034 request_info2.url = GURL("https://www.example.org/");
6035 request_info2.traffic_annotation =
6036 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
6037 EXPECT_EQ(OK,
6038 stream2->InitializeStream(&request_info2, true, DEFAULT_PRIORITY,
6039 net_log_, CompletionOnceCallback()));
6040
6041 // Ensure that session is alive and active.
6042 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6043 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6044 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6045 EXPECT_EQ(2u, session->GetNumActiveStreams());
6046
6047 // Send GET request on stream 2 which is non-migratable. This should cause a
6048 // write error, which triggers a connection migration attempt.
6049 HttpResponseInfo response2;
6050 HttpRequestHeaders request_headers2;
6051 EXPECT_EQ(OK, stream2->SendRequest(request_headers2, &response2,
6052 callback2.callback()));
6053
6054 // Run the message loop so that the migration attempt is executed and
Zhongyi Shia7dd46b2018-07-12 22:59:296055 // data queued in the new socket is read by the packet reader. Session is
6056 // still alive and not marked as going away, non-migratable stream will be
6057 // closed.
Zhongyi Shi0439ecc72018-07-11 04:41:266058 base::RunLoop().RunUntilIdle();
6059 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:296060 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi0439ecc72018-07-11 04:41:266061 EXPECT_EQ(1u, session->GetNumActiveStreams());
6062
6063 // Send GET request on stream 1.
6064 HttpResponseInfo response;
6065 HttpRequestHeaders request_headers;
6066 EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
6067 callback_.callback()));
6068
6069 base::RunLoop().RunUntilIdle();
6070
6071 // Verify that response headers on the migrated socket were delivered to the
6072 // stream.
6073 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
6074 EXPECT_EQ(200, response.headers->response_code());
6075
6076 stream1.reset();
6077
6078 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6079 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6080 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6081 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
6082}
6083
Zhongyi Shic16b4102019-02-12 00:37:406084// This test verifies that when a connection encounters a packet write error, it
6085// will cancel non-migratable streams, and migrate to the alternate network.
jri9f303712016-09-13 01:10:226086void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorNonMigratableStream(
Zhongyi Shi32fe14d42019-02-28 00:25:366087 IoMode write_error_mode,
6088 bool migrate_idle_sessions) {
Zhongyi Shic16b4102019-02-12 00:37:406089 DVLOG(1) << "Write error mode: "
jri9f303712016-09-13 01:10:226090 << ((write_error_mode == SYNCHRONOUS) ? "SYNCHRONOUS" : "ASYNC");
Zhongyi Shi32fe14d42019-02-28 00:25:366091 DVLOG(1) << "Migrate idle sessions: " << migrate_idle_sessions;
6092 test_params_.quic_migrate_idle_sessions = migrate_idle_sessions;
Zhongyi Shi1a054612018-06-14 04:59:086093 InitializeConnectionMigrationV2Test(
jri9f303712016-09-13 01:10:226094 {kDefaultNetworkForTests, kNewNetworkForTests});
6095 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6096 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6097
Zhongyi Shic16b4102019-02-12 00:37:406098 MockQuicData failed_socket_data;
jri9f303712016-09-13 01:10:226099 MockQuicData socket_data;
Zhongyi Shi32fe14d42019-02-28 00:25:366100 if (migrate_idle_sessions) {
6101 quic::QuicStreamOffset header_stream_offset = 0;
6102 // The socket data provider for the original socket before migration.
6103 failed_socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
6104 failed_socket_data.AddWrite(
6105 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
6106 failed_socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
6107 failed_socket_data.AddSocketDataToFactory(socket_factory_.get());
6108
6109 // Set up second socket data provider that is used after migration.
6110 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
6111 // Although the write error occurs when writing a packet for the
6112 // non-migratable stream and the stream will be cancelled during migration,
6113 // the packet will still be retransimitted at the connection level.
6114 socket_data.AddWrite(
6115 SYNCHRONOUS, ConstructGetRequestPacket(
6116 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
6117 true, &header_stream_offset));
6118 // A RESET will be sent to the peer to cancel the non-migratable stream.
6119 socket_data.AddWrite(
6120 SYNCHRONOUS, client_maker_.MakeRstPacket(
6121 3, true, GetNthClientInitiatedBidirectionalStreamId(0),
6122 quic::QUIC_STREAM_CANCELLED));
6123 socket_data.AddSocketDataToFactory(socket_factory_.get());
6124 } else {
6125 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
6126 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
6127 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
6128 socket_data.AddSocketDataToFactory(socket_factory_.get());
6129 }
jri9f303712016-09-13 01:10:226130
6131 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:456132 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:336133 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036134 request.Request(
6135 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6136 SocketTag(),
6137 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6138 failed_on_default_network_callback_, callback_.callback()));
jri9f303712016-09-13 01:10:226139 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:246140 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9f303712016-09-13 01:10:226141 EXPECT_TRUE(stream.get());
6142
6143 // Cause QUIC stream to be created, but marked as non-migratable.
6144 HttpRequestInfo request_info;
Zhongyi Shibb28b1f2018-07-18 02:41:266145 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
jri9f303712016-09-13 01:10:226146 request_info.method = "GET";
6147 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:396148 request_info.traffic_annotation =
6149 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:276150 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:396151 net_log_, CompletionOnceCallback()));
jri9f303712016-09-13 01:10:226152
6153 // Ensure that session is alive and active.
6154 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6155 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6156 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6157
6158 // Send GET request on stream. This should cause a write error, which triggers
6159 // a connection migration attempt.
6160 HttpResponseInfo response;
6161 HttpRequestHeaders request_headers;
6162 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6163 callback_.callback()));
6164
6165 // Run message loop to execute migration attempt.
6166 base::RunLoop().RunUntilIdle();
6167
Zhongyi Shi32fe14d42019-02-28 00:25:366168 // Migration closes the non-migratable stream and:
6169 // if migrate idle session is enabled, it migrates to the alternate network
6170 // successfully; otherwise the connection is closed.
6171 EXPECT_EQ(migrate_idle_sessions,
6172 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6173 EXPECT_EQ(migrate_idle_sessions, HasActiveSession(host_port_pair_));
jri9f303712016-09-13 01:10:226174
Zhongyi Shi32fe14d42019-02-28 00:25:366175 if (migrate_idle_sessions) {
6176 EXPECT_TRUE(failed_socket_data.AllReadDataConsumed());
6177 EXPECT_TRUE(failed_socket_data.AllWriteDataConsumed());
6178 }
jri9f303712016-09-13 01:10:226179 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6180 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6181}
6182
Zhongyi Shi32fe14d42019-02-28 00:25:366183TEST_P(
6184 QuicStreamFactoryTest,
6185 MigrateSessionOnWriteErrorNonMigratableStreamSync_DoNotMigrateIdleSessions) {
6186 TestMigrationOnWriteErrorNonMigratableStream(SYNCHRONOUS, false);
6187}
6188
6189TEST_P(
6190 QuicStreamFactoryTest,
6191 MigrateSessionOnWriteErrorNonMigratableStreamAsync_DoNotMigrateIdleSessions) {
6192 TestMigrationOnWriteErrorNonMigratableStream(ASYNC, false);
jri9f303712016-09-13 01:10:226193}
6194
6195TEST_P(QuicStreamFactoryTest,
Zhongyi Shi32fe14d42019-02-28 00:25:366196 MigrateSessionOnWriteErrorNonMigratableStreamSync_MigrateIdleSessions) {
6197 TestMigrationOnWriteErrorNonMigratableStream(SYNCHRONOUS, true);
6198}
6199
6200TEST_P(QuicStreamFactoryTest,
6201 MigrateSessionOnWriteErrorNonMigratableStreamAsync_MigrateIdleSessions) {
6202 TestMigrationOnWriteErrorNonMigratableStream(ASYNC, true);
jri9f303712016-09-13 01:10:226203}
6204
6205void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorMigrationDisabled(
6206 IoMode write_error_mode) {
Zhongyi Shi1a054612018-06-14 04:59:086207 InitializeConnectionMigrationV2Test(
jri9f303712016-09-13 01:10:226208 {kDefaultNetworkForTests, kNewNetworkForTests});
6209 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6210 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6211
6212 MockQuicData socket_data;
6213 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:436214 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
jri9f303712016-09-13 01:10:226215 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:176216 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:226217
6218 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:456219 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:336220 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036221 request.Request(
6222 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6223 SocketTag(),
6224 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6225 failed_on_default_network_callback_, callback_.callback()));
jri9f303712016-09-13 01:10:226226 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:246227 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9f303712016-09-13 01:10:226228 EXPECT_TRUE(stream.get());
6229
6230 // Cause QUIC stream to be created.
6231 HttpRequestInfo request_info;
6232 request_info.method = "GET";
6233 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:396234 request_info.traffic_annotation =
6235 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:276236 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:396237 net_log_, CompletionOnceCallback()));
jri9f303712016-09-13 01:10:226238
6239 // Ensure that session is alive and active.
6240 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6241 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6242 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6243
6244 // Set session config to have connection migration disabled.
Ryan Hamilton8d9ee76e2018-05-29 23:52:526245 quic::test::QuicConfigPeer::SetReceivedDisableConnectionMigration(
6246 session->config());
jri9f303712016-09-13 01:10:226247 EXPECT_TRUE(session->config()->DisableConnectionMigration());
6248
6249 // Send GET request on stream. This should cause a write error, which triggers
6250 // a connection migration attempt.
6251 HttpResponseInfo response;
6252 HttpRequestHeaders request_headers;
6253 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6254 callback_.callback()));
6255 // Run message loop to execute migration attempt.
6256 base::RunLoop().RunUntilIdle();
6257 // Migration fails, and session is closed and deleted.
6258 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6259 EXPECT_FALSE(HasActiveSession(host_port_pair_));
6260 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6261 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6262}
6263
6264TEST_P(QuicStreamFactoryTest,
6265 MigrateSessionOnWriteErrorMigrationDisabledSynchronous) {
6266 TestMigrationOnWriteErrorMigrationDisabled(SYNCHRONOUS);
6267}
6268
6269TEST_P(QuicStreamFactoryTest,
6270 MigrateSessionOnWriteErrorMigrationDisabledAsync) {
6271 TestMigrationOnWriteErrorMigrationDisabled(ASYNC);
6272}
6273
Zhongyi Shi7f1d9212018-06-22 23:24:366274// Sets up a test which verifies that connection migration on write error can
6275// eventually succeed and rewrite the packet on the new network with singals
6276// delivered in the following order (alternate network is always availabe):
6277// - original network encounters a SYNC/ASYNC write error based on
6278// |write_error_mode_on_old_network|, the packet failed to be written is
6279// cached, session migrates immediately to the alternate network.
6280// - an immediate SYNC/ASYNC write error based on
6281// |write_error_mode_on_new_network| is encountered after migration to the
6282// alternate network, session migrates immediately to the original network.
6283// - an immediate SYNC/ASYNC write error based on
6284// |write_error_mode_on_old_network| is encountered after migration to the
6285// original network, session migrates immediately to the alternate network.
6286// - finally, session successfully sends the packet and reads the response on
6287// the alternate network.
6288// TODO(zhongyi): once https://crbug.com/855666 is fixed, this test should be
6289// modified to test that session is closed early if hopping between networks
6290// with consecutive write errors is detected.
jri9f303712016-09-13 01:10:226291void QuicStreamFactoryTestBase::TestMigrationOnMultipleWriteErrors(
Zhongyi Shi7f1d9212018-06-22 23:24:366292 IoMode write_error_mode_on_old_network,
6293 IoMode write_error_mode_on_new_network) {
6294 InitializeConnectionMigrationV2Test(
jri9f303712016-09-13 01:10:226295 {kDefaultNetworkForTests, kNewNetworkForTests});
6296 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6297 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6298 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6299
Zhongyi Shi7f1d9212018-06-22 23:24:366300 // Set up the socket data used by the original network, which encounters a
6301 // write erorr.
6302 MockQuicData socket_data1;
6303 quic::QuicStreamOffset header_stream_offset = 0;
6304 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
6305 socket_data1.AddWrite(
6306 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
6307 socket_data1.AddWrite(write_error_mode_on_old_network,
6308 ERR_ADDRESS_UNREACHABLE); // Write Error
6309 socket_data1.AddSocketDataToFactory(socket_factory_.get());
6310
6311 // Set up the socket data used by the alternate network, which also
6312 // encounters a write error.
6313 MockQuicData failed_quic_data2;
6314 failed_quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
6315 failed_quic_data2.AddWrite(write_error_mode_on_new_network, ERR_FAILED);
6316 failed_quic_data2.AddSocketDataToFactory(socket_factory_.get());
6317
6318 // Set up the third socket data used by original network, which encounters a
6319 // write error again.
6320 MockQuicData failed_quic_data1;
6321 failed_quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
6322 failed_quic_data1.AddWrite(write_error_mode_on_old_network, ERR_FAILED);
6323 failed_quic_data1.AddSocketDataToFactory(socket_factory_.get());
6324
6325 // Set up the last socket data used by the alternate network, which will
6326 // finish migration successfully. The request is rewritten to this new socket,
6327 // and the response to the request is read on this socket.
6328 MockQuicData socket_data2;
Fan Yang32c5a112018-12-10 20:06:336329 socket_data2.AddWrite(
6330 SYNCHRONOUS, ConstructGetRequestPacket(
6331 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
6332 true, &header_stream_offset));
Zhongyi Shi7f1d9212018-06-22 23:24:366333 socket_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:336334 ASYNC,
6335 ConstructOkResponsePacket(
6336 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shi7f1d9212018-06-22 23:24:366337 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:336338 socket_data2.AddWrite(
6339 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
6340 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
6341 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi7f1d9212018-06-22 23:24:366342 socket_data2.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:226343
6344 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:456345 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:336346 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036347 request.Request(
6348 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6349 SocketTag(),
6350 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6351 failed_on_default_network_callback_, callback_.callback()));
jri9f303712016-09-13 01:10:226352 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:246353 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9f303712016-09-13 01:10:226354 EXPECT_TRUE(stream.get());
6355
6356 // Cause QUIC stream to be created.
6357 HttpRequestInfo request_info;
6358 request_info.method = "GET";
6359 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:396360 request_info.traffic_annotation =
6361 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:276362 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:396363 net_log_, CompletionOnceCallback()));
jri9f303712016-09-13 01:10:226364
6365 // Ensure that session is alive and active.
6366 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6367 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6368 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6369
Zhongyi Shi7f1d9212018-06-22 23:24:366370 // Send GET request on stream.
6371 // This should encounter a write error on network 1,
6372 // then migrate to network 2, which encounters another write error,
6373 // and migrate again to network 1, which encoutners one more write error.
6374 // Finally the session migrates to network 2 successfully.
jri9f303712016-09-13 01:10:226375 HttpResponseInfo response;
6376 HttpRequestHeaders request_headers;
6377 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6378 callback_.callback()));
jri9f303712016-09-13 01:10:226379
jri9f303712016-09-13 01:10:226380 base::RunLoop().RunUntilIdle();
Zhongyi Shi7f1d9212018-06-22 23:24:366381 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6382 EXPECT_EQ(1u, session->GetNumActiveStreams());
jri9f303712016-09-13 01:10:226383
Zhongyi Shi7f1d9212018-06-22 23:24:366384 // Verify that response headers on the migrated socket were delivered to the
6385 // stream.
6386 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
6387 EXPECT_EQ(200, response.headers->response_code());
jri9f303712016-09-13 01:10:226388
6389 stream.reset();
Zhongyi Shi7f1d9212018-06-22 23:24:366390 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6391 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
6392 EXPECT_TRUE(failed_quic_data2.AllReadDataConsumed());
6393 EXPECT_TRUE(failed_quic_data2.AllWriteDataConsumed());
6394 EXPECT_TRUE(failed_quic_data1.AllReadDataConsumed());
6395 EXPECT_TRUE(failed_quic_data1.AllWriteDataConsumed());
6396 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
6397 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri9f303712016-09-13 01:10:226398}
6399
6400TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsSyncSync) {
Zhongyi Shi7f1d9212018-06-22 23:24:366401 TestMigrationOnMultipleWriteErrors(
6402 /*write_error_mode_on_old_network*/ SYNCHRONOUS,
6403 /*write_error_mode_on_new_network*/ SYNCHRONOUS);
jri9f303712016-09-13 01:10:226404}
6405
6406TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsSyncAsync) {
Zhongyi Shi7f1d9212018-06-22 23:24:366407 TestMigrationOnMultipleWriteErrors(
6408 /*write_error_mode_on_old_network*/ SYNCHRONOUS,
6409 /*write_error_mode_on_new_network*/ ASYNC);
jri9f303712016-09-13 01:10:226410}
6411
6412TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsAsyncSync) {
Zhongyi Shi7f1d9212018-06-22 23:24:366413 TestMigrationOnMultipleWriteErrors(
6414 /*write_error_mode_on_old_network*/ ASYNC,
6415 /*write_error_mode_on_new_network*/ SYNCHRONOUS);
jri9f303712016-09-13 01:10:226416}
6417
6418TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsAsyncAsync) {
Zhongyi Shi7f1d9212018-06-22 23:24:366419 TestMigrationOnMultipleWriteErrors(
6420 /*write_error_mode_on_old_network*/ ASYNC,
6421 /*write_error_mode_on_new_network*/ ASYNC);
jri9f303712016-09-13 01:10:226422}
6423
Zhongyi Shi6abe33812018-07-24 19:43:116424// Verifies that a connection is closed when connection migration is triggered
6425// on network being disconnected and the handshake is not confirmed.
6426TEST_P(QuicStreamFactoryTest, NoMigrationBeforeHandshakeOnNetworkDisconnected) {
6427 InitializeConnectionMigrationV2Test(
6428 {kDefaultNetworkForTests, kNewNetworkForTests});
6429
Zhongyi Shi879659422018-08-02 17:58:256430 // Use cold start mode to do crypto connect, and send CHLO packet on wire.
Zhongyi Shi6abe33812018-07-24 19:43:116431 crypto_client_stream_factory_.set_handshake_mode(
Zhongyi Shi879659422018-08-02 17:58:256432 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
Zhongyi Shi6abe33812018-07-24 19:43:116433
Zhongyi Shi6abe33812018-07-24 19:43:116434 MockQuicData socket_data;
Zhongyi Shi879659422018-08-02 17:58:256435 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5068bb02018-08-03 02:44:096436 socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
Zhongyi Shi6abe33812018-07-24 19:43:116437 socket_data.AddSocketDataToFactory(socket_factory_.get());
6438
6439 // Create request and QuicHttpStream.
6440 QuicStreamRequest request(factory_.get());
6441 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036442 request.Request(
6443 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6444 SocketTag(),
6445 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6446 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi6abe33812018-07-24 19:43:116447 // Deliver the network notification, which should cause the connection to be
6448 // closed.
6449 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6450 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
6451 EXPECT_EQ(ERR_NETWORK_CHANGED, callback_.WaitForResult());
Zhongyi Shi4293b142018-07-25 00:33:576452
Zhongyi Shi6abe33812018-07-24 19:43:116453 EXPECT_FALSE(HasActiveSession(host_port_pair_));
6454 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
Zhongyi Shi4293b142018-07-25 00:33:576455 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6456 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
Zhongyi Shi6abe33812018-07-24 19:43:116457}
6458
Zhongyi Shib24001c02018-06-18 20:01:526459// Sets up the connection migration test where network change notification is
6460// queued BEFORE connection migration attempt on write error is posted.
6461void QuicStreamFactoryTestBase::
6462 TestMigrationOnNetworkNotificationWithWriteErrorQueuedLater(
6463 bool disconnected) {
6464 InitializeConnectionMigrationV2Test(
jried79618b2016-07-02 03:18:526465 {kDefaultNetworkForTests, kNewNetworkForTests});
6466 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6467 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6468 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6469
rcha00569732016-08-27 11:09:366470 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:526471 quic::QuicStreamOffset header_stream_offset = 0;
rcha00569732016-08-27 11:09:366472 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
rch5cb522462017-04-25 20:18:366473 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:436474 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
rcha00569732016-08-27 11:09:366475 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:176476 socket_data.AddSocketDataToFactory(socket_factory_.get());
jried79618b2016-07-02 03:18:526477
6478 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:456479 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:336480 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036481 request.Request(
6482 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6483 SocketTag(),
6484 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6485 failed_on_default_network_callback_, callback_.callback()));
jried79618b2016-07-02 03:18:526486 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:246487 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jried79618b2016-07-02 03:18:526488 EXPECT_TRUE(stream.get());
6489
6490 // Cause QUIC stream to be created.
6491 HttpRequestInfo request_info;
6492 request_info.method = "GET";
6493 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:396494 request_info.traffic_annotation =
6495 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:276496 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:396497 net_log_, CompletionOnceCallback()));
jried79618b2016-07-02 03:18:526498
6499 // Ensure that session is alive and active.
6500 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6501 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6502 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6503
6504 // Set up second socket data provider that is used after
6505 // migration. The request is rewritten to this new socket, and the
6506 // response to the request is read on this new socket.
rcha00569732016-08-27 11:09:366507 MockQuicData socket_data1;
Fan Yang32c5a112018-12-10 20:06:336508 socket_data1.AddWrite(
6509 SYNCHRONOUS, ConstructGetRequestPacket(
6510 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
6511 true, &header_stream_offset));
Zhongyi Shi32f2fd02018-04-16 18:23:436512 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:336513 ASYNC,
6514 ConstructOkResponsePacket(
6515 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
rcha00569732016-08-27 11:09:366516 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:336517 socket_data1.AddWrite(
6518 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
6519 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
6520 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:176521 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jried79618b2016-07-02 03:18:526522
jri9f303712016-09-13 01:10:226523 // First queue a network change notification in the message loop.
6524 if (disconnected) {
6525 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6526 ->QueueNetworkDisconnected(kDefaultNetworkForTests);
6527 } else {
6528 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6529 ->QueueNetworkMadeDefault(kNewNetworkForTests);
6530 }
6531 // Send GET request on stream. This should cause a write error,
6532 // which triggers a connection migration attempt. This will queue a
6533 // migration attempt behind the notification in the message loop.
jried79618b2016-07-02 03:18:526534 HttpResponseInfo response;
6535 HttpRequestHeaders request_headers;
6536 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6537 callback_.callback()));
6538
jried79618b2016-07-02 03:18:526539 base::RunLoop().RunUntilIdle();
Zhongyi Shia7dd46b2018-07-12 22:59:296540 // Verify the session is still alive and not marked as going away post
6541 // migration.
jried79618b2016-07-02 03:18:526542 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:296543 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jried79618b2016-07-02 03:18:526544 EXPECT_EQ(1u, session->GetNumActiveStreams());
6545
6546 // Verify that response headers on the migrated socket were delivered to the
6547 // stream.
6548 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
6549 EXPECT_EQ(200, response.headers->response_code());
6550
6551 stream.reset();
6552
6553 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6554 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6555 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6556 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
6557}
6558
Zhongyi Shib24001c02018-06-18 20:01:526559// This test verifies that session attempts connection migration successfully
6560// with signals delivered in the following order (alternate network is always
6561// available):
6562// - a notification that default network is disconnected is queued.
6563// - write error is triggered: session posts a task to attempt connection
6564// migration, |migration_pending_| set to true.
6565// - default network disconnected is delivered: session immediately migrates to
6566// the alternate network, |migration_pending_| set to false.
Zhongyi Shif3d6cddb2018-07-11 03:30:026567// - connection migration on write error attempt aborts: writer encountered
6568// error is no longer in active use.
jri9f303712016-09-13 01:10:226569TEST_P(QuicStreamFactoryTest,
Zhongyi Shib24001c02018-06-18 20:01:526570 MigrateOnNetworkDisconnectedWithWriteErrorQueuedLater) {
6571 TestMigrationOnNetworkNotificationWithWriteErrorQueuedLater(
6572 /*disconnected=*/true);
jri9f303712016-09-13 01:10:226573}
6574
Zhongyi Shib24001c02018-06-18 20:01:526575// This test verifies that session attempts connection migration successfully
6576// with signals delivered in the following order (alternate network is always
6577// available):
6578// - a notification that alternate network is made default is queued.
6579// - write error is triggered: session posts a task to attempt connection
6580// migration, block future migrations.
6581// - new default notification is delivered: migrate back timer spins and task is
6582// posted to migrate to the new default network.
6583// - connection migration on write error attempt proceeds successfully: session
6584// is
6585// marked as going away, future migrations unblocked.
6586// - migrate back to default network task executed: session is already on the
6587// default network, no-op.
jri9f303712016-09-13 01:10:226588TEST_P(QuicStreamFactoryTest,
Zhongyi Shib24001c02018-06-18 20:01:526589 MigrateOnWriteErrorWithNetworkMadeDefaultQueuedEarlier) {
6590 TestMigrationOnNetworkNotificationWithWriteErrorQueuedLater(
6591 /*disconnected=*/false);
jri9f303712016-09-13 01:10:226592}
6593
Zhongyi Shi1e2bc742018-06-16 02:06:076594// Sets up the connection migration test where network change notification is
6595// queued AFTER connection migration attempt on write error is posted.
6596void QuicStreamFactoryTestBase::
6597 TestMigrationOnWriteErrorWithNotificationQueuedLater(bool disconnected) {
Zhongyi Shi1a054612018-06-14 04:59:086598 InitializeConnectionMigrationV2Test(
jri9f303712016-09-13 01:10:226599 {kDefaultNetworkForTests, kNewNetworkForTests});
jried79618b2016-07-02 03:18:526600 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6601 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri9f303712016-09-13 01:10:226602 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jried79618b2016-07-02 03:18:526603
rcha00569732016-08-27 11:09:366604 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:526605 quic::QuicStreamOffset header_stream_offset = 0;
rcha00569732016-08-27 11:09:366606 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
rch5cb522462017-04-25 20:18:366607 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:436608 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
rcha00569732016-08-27 11:09:366609 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:176610 socket_data.AddSocketDataToFactory(socket_factory_.get());
jried79618b2016-07-02 03:18:526611
6612 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:456613 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:336614 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036615 request.Request(
6616 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6617 SocketTag(),
6618 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6619 failed_on_default_network_callback_, callback_.callback()));
jried79618b2016-07-02 03:18:526620 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:246621 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jried79618b2016-07-02 03:18:526622 EXPECT_TRUE(stream.get());
6623
6624 // Cause QUIC stream to be created.
6625 HttpRequestInfo request_info;
6626 request_info.method = "GET";
6627 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:396628 request_info.traffic_annotation =
6629 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:276630 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:396631 net_log_, CompletionOnceCallback()));
jried79618b2016-07-02 03:18:526632
6633 // Ensure that session is alive and active.
6634 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6635 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6636 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6637
jri9f303712016-09-13 01:10:226638 // Set up second socket data provider that is used after
6639 // migration. The request is rewritten to this new socket, and the
6640 // response to the request is read on this new socket.
6641 MockQuicData socket_data1;
Fan Yang32c5a112018-12-10 20:06:336642 socket_data1.AddWrite(
6643 SYNCHRONOUS, ConstructGetRequestPacket(
6644 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
6645 true, &header_stream_offset));
Zhongyi Shi32f2fd02018-04-16 18:23:436646 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:336647 ASYNC,
6648 ConstructOkResponsePacket(
6649 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
jri9f303712016-09-13 01:10:226650 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:336651 socket_data1.AddWrite(
6652 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
6653 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
6654 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:176655 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:226656
6657 // Send GET request on stream. This should cause a write error,
6658 // which triggers a connection migration attempt. This will queue a
6659 // migration attempt in the message loop.
jried79618b2016-07-02 03:18:526660 HttpResponseInfo response;
6661 HttpRequestHeaders request_headers;
jri9f303712016-09-13 01:10:226662 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6663 callback_.callback()));
jried79618b2016-07-02 03:18:526664
jri9f303712016-09-13 01:10:226665 // Now queue a network change notification in the message loop behind
6666 // the migration attempt.
6667 if (disconnected) {
6668 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6669 ->QueueNetworkDisconnected(kDefaultNetworkForTests);
6670 } else {
6671 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6672 ->QueueNetworkMadeDefault(kNewNetworkForTests);
6673 }
6674
6675 base::RunLoop().RunUntilIdle();
Zhongyi Shia7dd46b2018-07-12 22:59:296676 // Verify session is still alive and not marked as going away.
jri9f303712016-09-13 01:10:226677 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:296678 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri9f303712016-09-13 01:10:226679 EXPECT_EQ(1u, session->GetNumActiveStreams());
6680
6681 // Verify that response headers on the migrated socket were delivered to the
6682 // stream.
6683 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
6684 EXPECT_EQ(200, response.headers->response_code());
6685
6686 stream.reset();
jried79618b2016-07-02 03:18:526687
6688 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6689 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
jri9f303712016-09-13 01:10:226690 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6691 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
jried79618b2016-07-02 03:18:526692}
6693
Zhongyi Shi1e2bc742018-06-16 02:06:076694// This test verifies that session attempts connection migration successfully
6695// with signals delivered in the following order (alternate network is always
6696// available):
6697// - write error is triggered: session posts a task to complete connection
6698// migration.
6699// - a notification that alternate network is made default is queued.
6700// - connection migration attempt proceeds successfully, session is marked as
6701// going away.
6702// - new default notification is delivered after connection migration has been
6703// completed.
jri9f303712016-09-13 01:10:226704TEST_P(QuicStreamFactoryTest,
Zhongyi Shi1e2bc742018-06-16 02:06:076705 MigrateOnWriteErrorWithNetworkMadeDefaultQueuedLater) {
6706 TestMigrationOnWriteErrorWithNotificationQueuedLater(/*disconnected=*/false);
jried79618b2016-07-02 03:18:526707}
6708
Zhongyi Shi1e2bc742018-06-16 02:06:076709// This test verifies that session attempts connection migration successfully
6710// with signals delivered in the following order (alternate network is always
6711// available):
6712// - write error is triggered: session posts a task to complete connection
6713// migration.
6714// - a notification that default network is diconnected is queued.
6715// - connection migration attempt proceeds successfully, session is marked as
6716// going away.
6717// - disconnect notification is delivered after connection migration has been
6718// completed.
jri9f303712016-09-13 01:10:226719TEST_P(QuicStreamFactoryTest,
Zhongyi Shi1e2bc742018-06-16 02:06:076720 MigrateOnWriteErrorWithNetworkDisconnectedQueuedLater) {
6721 TestMigrationOnWriteErrorWithNotificationQueuedLater(/*disconnected=*/true);
jried79618b2016-07-02 03:18:526722}
6723
Zhongyi Shia3810c52018-06-15 23:07:196724// This tests connection migration on write error with signals delivered in the
6725// following order:
6726// - a synchronous/asynchronous write error is triggered base on
Zhongyi Shif3d6cddb2018-07-11 03:30:026727// |write_error_mode|: connection migration attempt is posted.
6728// - old default network disconnects, migration waits for a new network.
Zhongyi Shia3810c52018-06-15 23:07:196729// - after a pause, new network is connected: session will migrate to new
6730// network immediately.
Zhongyi Shif3d6cddb2018-07-11 03:30:026731// - migration on writer error is exectued and aborts as writer passed in is no
6732// longer active in use.
Zhongyi Shia3810c52018-06-15 23:07:196733// - new network is made default.
jri5b785512016-09-13 04:29:116734void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorPauseBeforeConnected(
6735 IoMode write_error_mode) {
Zhongyi Shia3810c52018-06-15 23:07:196736 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jri5b785512016-09-13 04:29:116737 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6738 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6739 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6740
Zhongyi Shia3810c52018-06-15 23:07:196741 // Use the test task runner.
6742 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
6743
jri5b785512016-09-13 04:29:116744 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:526745 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shia3810c52018-06-15 23:07:196746 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
rch5cb522462017-04-25 20:18:366747 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:436748 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
Zhongyi Shia3810c52018-06-15 23:07:196749 socket_data.AddWrite(write_error_mode, ERR_FAILED);
Zhongyi Shi5f587cc2017-11-21 23:24:176750 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri5b785512016-09-13 04:29:116751
6752 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:456753 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:336754 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036755 request.Request(
6756 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6757 SocketTag(),
6758 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6759 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shia3810c52018-06-15 23:07:196760 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:246761 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri5b785512016-09-13 04:29:116762 EXPECT_TRUE(stream.get());
6763
6764 // Cause QUIC stream to be created.
6765 HttpRequestInfo request_info;
6766 request_info.method = "GET";
Zhongyi Shia3810c52018-06-15 23:07:196767 request_info.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:396768 request_info.traffic_annotation =
6769 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:276770 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:396771 net_log_, CompletionOnceCallback()));
jri5b785512016-09-13 04:29:116772
6773 // Ensure that session is alive and active.
6774 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6775 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6776 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6777
Zhongyi Shia3810c52018-06-15 23:07:196778 // Send GET request on stream.
jri5b785512016-09-13 04:29:116779 HttpResponseInfo response;
6780 HttpRequestHeaders request_headers;
6781 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6782 callback_.callback()));
6783
Zhongyi Shia3810c52018-06-15 23:07:196784 // The connection should still be alive, not marked as going away.
jri5b785512016-09-13 04:29:116785 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6786 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6787 EXPECT_EQ(1u, session->GetNumActiveStreams());
6788 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
6789
Zhongyi Shia3810c52018-06-15 23:07:196790 // Set up second socket data provider that is used after migration.
6791 // The response to the earlier request is read on this new socket.
jri5b785512016-09-13 04:29:116792 MockQuicData socket_data1;
Fan Yang32c5a112018-12-10 20:06:336793 socket_data1.AddWrite(
6794 SYNCHRONOUS, ConstructGetRequestPacket(
6795 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
6796 true, &header_stream_offset));
Zhongyi Shi32f2fd02018-04-16 18:23:436797 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:336798 ASYNC,
6799 ConstructOkResponsePacket(
6800 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
jri5b785512016-09-13 04:29:116801 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:336802 socket_data1.AddWrite(
6803 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
6804 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
6805 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:176806 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri5b785512016-09-13 04:29:116807
Zhongyi Shia3810c52018-06-15 23:07:196808 // On a DISCONNECTED notification, nothing happens.
6809 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6810 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
6811 // Add a new network and notify the stream factory of a new connected network.
6812 // This causes a PING packet to be sent over the new network.
jri5b785512016-09-13 04:29:116813 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6814 ->SetConnectedNetworksList({kNewNetworkForTests});
6815 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6816 ->NotifyNetworkConnected(kNewNetworkForTests);
6817
Zhongyi Shia3810c52018-06-15 23:07:196818 // Ensure that the session is still alive.
jri5b785512016-09-13 04:29:116819 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia3810c52018-06-15 23:07:196820 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:116821 EXPECT_EQ(1u, session->GetNumActiveStreams());
6822
Zhongyi Shia3810c52018-06-15 23:07:196823 // Run the message loop migration for write error can finish.
6824 runner_->RunUntilIdle();
6825
6826 // Response headers are received over the new network.
jri5b785512016-09-13 04:29:116827 EXPECT_THAT(callback_.WaitForResult(), IsOk());
6828 EXPECT_EQ(200, response.headers->response_code());
6829
Zhongyi Shia3810c52018-06-15 23:07:196830 // Check that the session is still alive.
6831 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
jri5b785512016-09-13 04:29:116832 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shia3810c52018-06-15 23:07:196833
6834 // There should be no posted tasks not executed, no way to migrate back to
6835 // default network.
6836 EXPECT_TRUE(runner_->GetPostedTasks().empty());
6837
6838 // Receive signal to mark new network as default.
6839 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6840 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
jri5b785512016-09-13 04:29:116841
6842 stream.reset();
jri5b785512016-09-13 04:29:116843 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6844 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6845 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6846 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
jri5b785512016-09-13 04:29:116847}
6848
6849TEST_P(QuicStreamFactoryTest,
Zhongyi Shia3810c52018-06-15 23:07:196850 MigrateSessionOnSyncWriteErrorPauseBeforeConnected) {
jri5b785512016-09-13 04:29:116851 TestMigrationOnWriteErrorPauseBeforeConnected(SYNCHRONOUS);
6852}
6853
6854TEST_P(QuicStreamFactoryTest,
Zhongyi Shia3810c52018-06-15 23:07:196855 MigrateSessionOnAsyncWriteErrorPauseBeforeConnected) {
jri5b785512016-09-13 04:29:116856 TestMigrationOnWriteErrorPauseBeforeConnected(ASYNC);
6857}
6858
Zhongyi Shif3d6cddb2018-07-11 03:30:026859// This test verifies that when session successfully migrate to the alternate
6860// network, packet write error on the old writer will be ignored and will not
6861// trigger connection migration on write error.
6862TEST_P(QuicStreamFactoryTest, IgnoreWriteErrorFromOldWriterAfterMigration) {
6863 InitializeConnectionMigrationV2Test(
6864 {kDefaultNetworkForTests, kNewNetworkForTests});
6865 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6866 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6867 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6868
6869 // Using a testing task runner so that we can verify whether the migrate on
6870 // write error task is posted.
6871 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
6872 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
6873
6874 MockQuicData socket_data;
6875 quic::QuicStreamOffset header_stream_offset = 0;
6876 socket_data.AddWrite(
6877 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
6878 socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
6879 socket_data.AddWrite(ASYNC, ERR_ADDRESS_UNREACHABLE);
6880 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
6881 socket_data.AddSocketDataToFactory(socket_factory_.get());
6882
6883 // Create request and QuicHttpStream.
6884 QuicStreamRequest request(factory_.get());
6885 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036886 request.Request(
6887 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6888 SocketTag(),
6889 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6890 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shif3d6cddb2018-07-11 03:30:026891 EXPECT_EQ(OK, callback_.WaitForResult());
6892 std::unique_ptr<HttpStream> stream = CreateStream(&request);
6893 EXPECT_TRUE(stream.get());
6894
6895 // Cause QUIC stream to be created.
6896 HttpRequestInfo request_info;
6897 request_info.method = "GET";
6898 request_info.url = GURL("https://www.example.org/");
6899 request_info.traffic_annotation =
6900 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
6901 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
6902 net_log_, CompletionOnceCallback()));
6903
6904 // Ensure that session is alive and active.
6905 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6906 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6907 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6908
6909 // Set up second socket data provider that is used after
6910 // migration. The response to the request is read on this new socket.
6911 MockQuicData socket_data1;
6912 socket_data1.AddWrite(
6913 SYNCHRONOUS, client_maker_.MakePingPacket(3, /*include_version=*/true));
6914 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:336915 ASYNC,
6916 ConstructOkResponsePacket(
6917 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shif3d6cddb2018-07-11 03:30:026918 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:336919 socket_data1.AddWrite(
6920 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
6921 4, false, GetNthClientInitiatedBidirectionalStreamId(0),
6922 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shif3d6cddb2018-07-11 03:30:026923 socket_data1.AddSocketDataToFactory(socket_factory_.get());
6924
6925 // Send GET request on stream.
6926 HttpResponseInfo response;
6927 HttpRequestHeaders request_headers;
6928 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6929 callback_.callback()));
6930
6931 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
6932 // Now notify network is disconnected, cause the migration to complete
6933 // immediately.
6934 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6935 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
6936 // There will be two pending task, one will complete migration with no delay
6937 // and the other will attempt to migrate back to the default network with
6938 // delay.
6939 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
6940
6941 // Complete migration.
6942 task_runner->RunUntilIdle();
6943 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
6944
6945 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6946 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6947 EXPECT_EQ(1u, session->GetNumActiveStreams());
6948
6949 // Verify that response headers on the migrated socket were delivered to the
6950 // stream.
6951 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
6952 EXPECT_EQ(200, response.headers->response_code());
6953
6954 // Resume the old socket data, a write error will be delivered to the old
6955 // packet writer. Verify no additional task is posted.
6956 socket_data.Resume();
6957 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
6958
6959 stream.reset();
6960 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6961 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6962 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
6963}
6964
6965// This test verifies that when session successfully migrate to the alternate
6966// network, packet read error on the old reader will be ignored and will not
6967// close the connection.
6968TEST_P(QuicStreamFactoryTest, IgnoreReadErrorFromOldReaderAfterMigration) {
6969 InitializeConnectionMigrationV2Test(
6970 {kDefaultNetworkForTests, kNewNetworkForTests});
6971 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6972 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6973 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6974
6975 // Using a testing task runner.
6976 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
6977 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
6978
6979 MockQuicData socket_data;
6980 quic::QuicStreamOffset header_stream_offset = 0;
6981 socket_data.AddWrite(
6982 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
6983 socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
6984 socket_data.AddRead(ASYNC, ERR_ADDRESS_UNREACHABLE);
6985 socket_data.AddSocketDataToFactory(socket_factory_.get());
6986
6987 // Create request and QuicHttpStream.
6988 QuicStreamRequest request(factory_.get());
6989 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036990 request.Request(
6991 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6992 SocketTag(),
6993 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6994 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shif3d6cddb2018-07-11 03:30:026995 EXPECT_EQ(OK, callback_.WaitForResult());
6996 std::unique_ptr<HttpStream> stream = CreateStream(&request);
6997 EXPECT_TRUE(stream.get());
6998
6999 // Cause QUIC stream to be created.
7000 HttpRequestInfo request_info;
7001 request_info.method = "GET";
7002 request_info.url = GURL("https://www.example.org/");
7003 request_info.traffic_annotation =
7004 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
7005 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
7006 net_log_, CompletionOnceCallback()));
7007
7008 // Ensure that session is alive and active.
7009 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
7010 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7011 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7012
7013 // Set up second socket data provider that is used after
7014 // migration. The request is written to this new socket, and the
7015 // response to the request is read on this new socket.
7016 MockQuicData socket_data1;
7017 socket_data1.AddWrite(
7018 SYNCHRONOUS, client_maker_.MakePingPacket(2, /*include_version=*/true));
Fan Yang32c5a112018-12-10 20:06:337019 socket_data1.AddWrite(
7020 SYNCHRONOUS, ConstructGetRequestPacket(
7021 3, GetNthClientInitiatedBidirectionalStreamId(0), true,
7022 true, &header_stream_offset));
Zhongyi Shif3d6cddb2018-07-11 03:30:027023 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:337024 ASYNC,
7025 ConstructOkResponsePacket(
7026 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shif3d6cddb2018-07-11 03:30:027027 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:337028 socket_data1.AddWrite(
7029 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
7030 4, false, GetNthClientInitiatedBidirectionalStreamId(0),
7031 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shif3d6cddb2018-07-11 03:30:027032 socket_data1.AddSocketDataToFactory(socket_factory_.get());
7033
7034 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
7035 // Now notify network is disconnected, cause the migration to complete
7036 // immediately.
7037 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7038 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
7039 // There will be two pending task, one will complete migration with no delay
7040 // and the other will attempt to migrate back to the default network with
7041 // delay.
7042 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
7043
7044 // Complete migration.
7045 task_runner->RunUntilIdle();
7046 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
7047
7048 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7049 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7050 EXPECT_EQ(1u, session->GetNumActiveStreams());
7051
7052 // Send GET request on stream.
7053 HttpResponseInfo response;
7054 HttpRequestHeaders request_headers;
7055 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
7056 callback_.callback()));
7057
7058 // Verify that response headers on the migrated socket were delivered to the
7059 // stream.
7060 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
7061 EXPECT_EQ(OK, callback_.WaitForResult());
7062 EXPECT_EQ(200, response.headers->response_code());
7063
7064 // Resume the old socket data, a read error will be delivered to the old
7065 // packet reader. Verify that the session is not affected.
7066 socket_data.Resume();
7067 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
7068 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7069 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7070 EXPECT_EQ(1u, session->GetNumActiveStreams());
7071
7072 stream.reset();
7073 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7074 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7075 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
7076 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
7077}
7078
7079// This test verifies that after migration on network is executed, packet
7080// read error on the old reader will be ignored and will not close the
7081// connection.
7082TEST_P(QuicStreamFactoryTest, IgnoreReadErrorOnOldReaderDuringMigration) {
7083 InitializeConnectionMigrationV2Test(
7084 {kDefaultNetworkForTests, kNewNetworkForTests});
7085 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7086 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7087 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7088
7089 // Using a testing task runner.
7090 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
7091 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
7092
7093 MockQuicData socket_data;
7094 quic::QuicStreamOffset header_stream_offset = 0;
7095 socket_data.AddWrite(
7096 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
7097 socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
7098 socket_data.AddRead(ASYNC, ERR_ADDRESS_UNREACHABLE);
7099 socket_data.AddSocketDataToFactory(socket_factory_.get());
7100
7101 // Create request and QuicHttpStream.
7102 QuicStreamRequest request(factory_.get());
7103 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037104 request.Request(
7105 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7106 SocketTag(),
7107 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7108 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shif3d6cddb2018-07-11 03:30:027109 EXPECT_EQ(OK, callback_.WaitForResult());
7110 std::unique_ptr<HttpStream> stream = CreateStream(&request);
7111 EXPECT_TRUE(stream.get());
7112
7113 // Cause QUIC stream to be created.
7114 HttpRequestInfo request_info;
7115 request_info.method = "GET";
7116 request_info.url = GURL("https://www.example.org/");
7117 request_info.traffic_annotation =
7118 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
7119 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
7120 net_log_, CompletionOnceCallback()));
7121
7122 // Ensure that session is alive and active.
7123 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
7124 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7125 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7126
7127 // Set up second socket data provider that is used after
7128 // migration. The request is written to this new socket, and the
7129 // response to the request is read on this new socket.
7130 MockQuicData socket_data1;
7131 socket_data1.AddWrite(
7132 SYNCHRONOUS, client_maker_.MakePingPacket(2, /*include_version=*/true));
Fan Yang32c5a112018-12-10 20:06:337133 socket_data1.AddWrite(
7134 SYNCHRONOUS, ConstructGetRequestPacket(
7135 3, GetNthClientInitiatedBidirectionalStreamId(0), true,
7136 true, &header_stream_offset));
Zhongyi Shif3d6cddb2018-07-11 03:30:027137 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:337138 ASYNC,
7139 ConstructOkResponsePacket(
7140 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shif3d6cddb2018-07-11 03:30:027141 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:337142 socket_data1.AddWrite(
7143 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
7144 4, false, GetNthClientInitiatedBidirectionalStreamId(0),
7145 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shif3d6cddb2018-07-11 03:30:027146 socket_data1.AddSocketDataToFactory(socket_factory_.get());
7147
7148 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
7149 // Now notify network is disconnected, cause the migration to complete
7150 // immediately.
7151 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7152 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
7153 // There will be two pending task, one will complete migration with no delay
7154 // and the other will attempt to migrate back to the default network with
7155 // delay.
7156 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
7157
7158 // Resume the old socket data, a read error will be delivered to the old
7159 // packet reader. Verify that the session is not affected.
7160 socket_data.Resume();
7161 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
7162 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7163 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7164 EXPECT_EQ(1u, session->GetNumActiveStreams());
7165
7166 // Complete migration.
7167 task_runner->RunUntilIdle();
7168 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
7169
7170 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7171 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7172 EXPECT_EQ(1u, session->GetNumActiveStreams());
7173
7174 // Send GET request on stream.
7175 HttpResponseInfo response;
7176 HttpRequestHeaders request_headers;
7177 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
7178 callback_.callback()));
7179
7180 // Verify that response headers on the migrated socket were delivered to the
7181 // stream.
7182 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
7183 EXPECT_EQ(OK, callback_.WaitForResult());
7184 EXPECT_EQ(200, response.headers->response_code());
7185
7186 stream.reset();
7187 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7188 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7189 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
7190 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
7191}
7192
7193// This test verifies that after migration on write error is posted, packet
7194// read error on the old reader will be ignored and will not close the
7195// connection.
7196TEST_P(QuicStreamFactoryTest,
7197 IgnoreReadErrorOnOldReaderDuringPendingMigrationOnWriteError) {
7198 InitializeConnectionMigrationV2Test(
7199 {kDefaultNetworkForTests, kNewNetworkForTests});
7200 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7201 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7202 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7203
7204 // Using a testing task runner.
7205 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
7206 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
7207
7208 MockQuicData socket_data;
7209 quic::QuicStreamOffset header_stream_offset = 0;
7210 socket_data.AddWrite(
7211 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
7212 socket_data.AddWrite(ASYNC, ERR_FAILED); // Write error.
7213 socket_data.AddRead(ASYNC, ERR_ADDRESS_UNREACHABLE); // Read error.
7214 socket_data.AddSocketDataToFactory(socket_factory_.get());
7215
7216 // Create request and QuicHttpStream.
7217 QuicStreamRequest request(factory_.get());
7218 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037219 request.Request(
7220 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7221 SocketTag(),
7222 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7223 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shif3d6cddb2018-07-11 03:30:027224 EXPECT_EQ(OK, callback_.WaitForResult());
7225 std::unique_ptr<HttpStream> stream = CreateStream(&request);
7226 EXPECT_TRUE(stream.get());
7227
7228 // Cause QUIC stream to be created.
7229 HttpRequestInfo request_info;
7230 request_info.method = "GET";
7231 request_info.url = GURL("https://www.example.org/");
7232 request_info.traffic_annotation =
7233 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
7234 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
7235 net_log_, CompletionOnceCallback()));
7236
7237 // Ensure that session is alive and active.
7238 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
7239 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7240 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7241
7242 // Set up second socket data provider that is used after
7243 // migration. The request is written to this new socket, and the
7244 // response to the request is read on this new socket.
7245 MockQuicData socket_data1;
Fan Yang32c5a112018-12-10 20:06:337246 socket_data1.AddWrite(
7247 SYNCHRONOUS, ConstructGetRequestPacket(
7248 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
7249 true, &header_stream_offset));
Zhongyi Shif3d6cddb2018-07-11 03:30:027250 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:337251 ASYNC,
7252 ConstructOkResponsePacket(
7253 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shif3d6cddb2018-07-11 03:30:027254
7255 socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
7256 socket_data1.AddRead(ASYNC, ERR_FAILED); // Read error to close connection.
7257 socket_data1.AddSocketDataToFactory(socket_factory_.get());
7258
7259 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
7260 // Send GET request on stream.
7261 HttpResponseInfo response;
7262 HttpRequestHeaders request_headers;
7263 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
7264 callback_.callback()));
7265 // Run the message loop to complete asynchronous write and read with errors.
7266 base::RunLoop().RunUntilIdle();
7267 // There will be one pending task to complete migration on write error.
7268 // Verify session is not closed with read error.
7269 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
7270 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7271 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7272 EXPECT_EQ(1u, session->GetNumActiveStreams());
7273
7274 // Complete migration.
7275 task_runner->RunUntilIdle();
Zhongyi Shia7dd46b2018-07-12 22:59:297276 // There will be one more task posted attempting to migrate back to the
7277 // default network.
7278 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
Zhongyi Shif3d6cddb2018-07-11 03:30:027279 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:297280 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shif3d6cddb2018-07-11 03:30:027281 EXPECT_EQ(1u, session->GetNumActiveStreams());
7282
7283 // Verify that response headers on the migrated socket were delivered to the
7284 // stream.
7285 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
7286 EXPECT_EQ(200, response.headers->response_code());
7287
7288 // Resume to consume the read error on new socket, which will close
7289 // the connection.
7290 socket_data1.Resume();
7291
7292 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7293 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7294 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
7295 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
7296}
7297
Zhongyi Shi4ac9e1f2018-06-21 05:21:477298// Migrate on asynchronous write error, old network disconnects after alternate
7299// network connects.
7300TEST_P(QuicStreamFactoryTest,
7301 MigrateSessionOnWriteErrorWithDisconnectAfterConnectAysnc) {
7302 TestMigrationOnWriteErrorWithMultipleNotifications(
7303 ASYNC, /*disconnect_before_connect*/ false);
7304}
7305
7306// Migrate on synchronous write error, old network disconnects after alternate
7307// network connects.
7308TEST_P(QuicStreamFactoryTest,
7309 MigrateSessionOnWriteErrorWithDisconnectAfterConnectSync) {
7310 TestMigrationOnWriteErrorWithMultipleNotifications(
7311 SYNCHRONOUS, /*disconnect_before_connect*/ false);
7312}
7313
7314// Migrate on asynchronous write error, old network disconnects before alternate
7315// network connects.
7316TEST_P(QuicStreamFactoryTest,
7317 MigrateSessionOnWriteErrorWithDisconnectBeforeConnectAysnc) {
7318 TestMigrationOnWriteErrorWithMultipleNotifications(
7319 ASYNC, /*disconnect_before_connect*/ true);
7320}
7321
7322// Migrate on synchronous write error, old network disconnects before alternate
7323// network connects.
7324TEST_P(QuicStreamFactoryTest,
7325 MigrateSessionOnWriteErrorWithDisconnectBeforeConnectSync) {
7326 TestMigrationOnWriteErrorWithMultipleNotifications(
7327 SYNCHRONOUS, /*disconnect_before_connect*/ true);
7328}
7329
7330// Setps up test which verifies that session successfully migrate to alternate
7331// network with signals delivered in the following order:
7332// *NOTE* Signal (A) and (B) can reverse order based on
7333// |disconnect_before_connect|.
7334// - (No alternate network is connected) session connects to
7335// kDefaultNetworkForTests.
7336// - An async/sync write error is encountered based on |write_error_mode|:
7337// session posted task to migrate session on write error.
7338// - Posted task is executed, miration moves to pending state due to lack of
7339// alternate network.
7340// - (A) An alternate network is connected, pending migration completes.
7341// - (B) Old default network disconnects, no migration will be attempted as
Zhongyi Shi329f5cbd2018-06-22 23:51:187342// session has already migrate to the alternate network.
Zhongyi Shi4ac9e1f2018-06-21 05:21:477343// - The alternate network is made default.
jri5b785512016-09-13 04:29:117344void QuicStreamFactoryTestBase::
Zhongyi Shi4ac9e1f2018-06-21 05:21:477345 TestMigrationOnWriteErrorWithMultipleNotifications(
jri5b785512016-09-13 04:29:117346 IoMode write_error_mode,
Zhongyi Shi4ac9e1f2018-06-21 05:21:477347 bool disconnect_before_connect) {
Zhongyi Shi329f5cbd2018-06-22 23:51:187348 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jri5b785512016-09-13 04:29:117349 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7350 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7351 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7352
7353 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:527354 quic::QuicStreamOffset header_stream_offset = 0;
jri5b785512016-09-13 04:29:117355 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
rch5cb522462017-04-25 20:18:367356 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:437357 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
Zhongyi Shi4ac9e1f2018-06-21 05:21:477358 socket_data.AddWrite(write_error_mode, ERR_FAILED); // Write error.
Zhongyi Shi5f587cc2017-11-21 23:24:177359 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri5b785512016-09-13 04:29:117360
7361 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:457362 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337363 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037364 request.Request(
7365 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7366 SocketTag(),
7367 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7368 failed_on_default_network_callback_, callback_.callback()));
jri5b785512016-09-13 04:29:117369 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:247370 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri5b785512016-09-13 04:29:117371 EXPECT_TRUE(stream.get());
7372
7373 // Cause QUIC stream to be created.
7374 HttpRequestInfo request_info;
7375 request_info.method = "GET";
7376 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:397377 request_info.traffic_annotation =
7378 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:277379 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:397380 net_log_, CompletionOnceCallback()));
jri5b785512016-09-13 04:29:117381
7382 // Ensure that session is alive and active.
7383 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
7384 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7385 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7386
7387 // Send GET request on stream. This should cause a write error, which triggers
7388 // a connection migration attempt.
7389 HttpResponseInfo response;
7390 HttpRequestHeaders request_headers;
7391 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
7392 callback_.callback()));
Zhongyi Shi4ac9e1f2018-06-21 05:21:477393 // Run the message loop so that posted task to migrate to socket will be
7394 // executed. A new task will be posted to wait for a new network.
jri5b785512016-09-13 04:29:117395 base::RunLoop().RunUntilIdle();
7396
7397 // In this particular code path, the network will not yet be marked
7398 // as going away and the session will still be alive.
7399 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7400 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7401 EXPECT_EQ(1u, session->GetNumActiveStreams());
7402 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
7403
7404 // Set up second socket data provider that is used after
7405 // migration. The request is rewritten to this new socket, and the
7406 // response to the request is read on this new socket.
7407 MockQuicData socket_data1;
Fan Yang32c5a112018-12-10 20:06:337408 socket_data1.AddWrite(
7409 SYNCHRONOUS, ConstructGetRequestPacket(
7410 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
7411 true, &header_stream_offset));
Zhongyi Shi32f2fd02018-04-16 18:23:437412 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:337413 ASYNC,
7414 ConstructOkResponsePacket(
7415 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
jri5b785512016-09-13 04:29:117416 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:337417 socket_data1.AddWrite(
7418 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
7419 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
7420 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:177421 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri5b785512016-09-13 04:29:117422
7423 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7424 ->SetConnectedNetworksList(
7425 {kDefaultNetworkForTests, kNewNetworkForTests});
Zhongyi Shi4ac9e1f2018-06-21 05:21:477426 if (disconnect_before_connect) {
7427 // Now deliver a DISCONNECT notification.
jri5b785512016-09-13 04:29:117428 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7429 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
Zhongyi Shi4ac9e1f2018-06-21 05:21:477430
7431 // Now deliver a CONNECTED notification and completes migration.
jri5b785512016-09-13 04:29:117432 scoped_mock_network_change_notifier_->mock_network_change_notifier()
Zhongyi Shi4ac9e1f2018-06-21 05:21:477433 ->NotifyNetworkConnected(kNewNetworkForTests);
7434 } else {
7435 // Now deliver a CONNECTED notification and completes migration.
7436 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7437 ->NotifyNetworkConnected(kNewNetworkForTests);
7438
7439 // Now deliver a DISCONNECT notification.
7440 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7441 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
jri5b785512016-09-13 04:29:117442 }
jri5b785512016-09-13 04:29:117443 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shi329f5cbd2018-06-22 23:51:187444 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:117445 EXPECT_EQ(1u, session->GetNumActiveStreams());
7446
7447 // This is the callback for the response headers that returned
7448 // pending previously, because no result was available. Check that
7449 // the result is now available due to the successful migration.
7450 EXPECT_THAT(callback_.WaitForResult(), IsOk());
7451 EXPECT_EQ(200, response.headers->response_code());
7452
Zhongyi Shi4ac9e1f2018-06-21 05:21:477453 // Deliver a MADEDEFAULT notification.
jri5b785512016-09-13 04:29:117454 scoped_mock_network_change_notifier_->mock_network_change_notifier()
Zhongyi Shi4ac9e1f2018-06-21 05:21:477455 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
jri5b785512016-09-13 04:29:117456
zhongyi98d6a9262017-05-19 02:47:457457 QuicStreamRequest request2(factory_.get());
Zhongyi Shi329f5cbd2018-06-22 23:51:187458 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
7459 DEFAULT_PRIORITY, SocketTag(),
7460 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:037461 &net_error_details_,
7462 failed_on_default_network_callback_,
7463 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:247464 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
jri5b785512016-09-13 04:29:117465 EXPECT_TRUE(stream2.get());
7466
7467 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi329f5cbd2018-06-22 23:51:187468 EXPECT_EQ(session, GetActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:117469
7470 stream.reset();
7471 stream2.reset();
7472
7473 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7474 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7475 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
7476 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
jri5b785512016-09-13 04:29:117477}
7478
Zhongyi Shic16b4102019-02-12 00:37:407479// This test verifies after session migrates off the default network, it keeps
7480// retrying migrate back to the default network until successfully gets on the
7481// default network or the idle migration period threshold is exceeded.
7482// The default threshold is 30s.
7483TEST_P(QuicStreamFactoryTest, DefaultIdleMigrationPeriod) {
Zhongyi Shi32fe14d42019-02-28 00:25:367484 test_params_.quic_migrate_idle_sessions = true;
Zhongyi Shic16b4102019-02-12 00:37:407485 InitializeConnectionMigrationV2Test(
7486 {kDefaultNetworkForTests, kNewNetworkForTests});
7487 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7488 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7489
7490 // Using a testing task runner and a test tick tock.
7491 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
7492 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
7493 QuicStreamFactoryPeer::SetTickClock(factory_.get(),
7494 task_runner->GetMockTickClock());
7495
7496 MockQuicData default_socket_data;
7497 default_socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
7498 default_socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
7499 default_socket_data.AddSocketDataToFactory(socket_factory_.get());
7500
7501 // Set up second socket data provider that is used after migration.
7502 MockQuicData alternate_socket_data;
7503 alternate_socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7504 // Ping packet to send after migration.
7505 alternate_socket_data.AddWrite(
7506 SYNCHRONOUS, client_maker_.MakePingPacket(2, /*include_version=*/true));
7507 alternate_socket_data.AddSocketDataToFactory(socket_factory_.get());
7508
7509 // Set up probing socket for migrating back to the default network.
7510 MockQuicData quic_data; // retry count: 0.
7511 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7512 quic_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
7513 quic_data.AddSocketDataToFactory(socket_factory_.get());
7514
7515 MockQuicData quic_data1; // retry count: 1
7516 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7517 quic_data1.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
7518 quic_data1.AddSocketDataToFactory(socket_factory_.get());
7519
7520 MockQuicData quic_data2; // retry count: 2
7521 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7522 quic_data2.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
7523 quic_data2.AddSocketDataToFactory(socket_factory_.get());
7524
7525 MockQuicData quic_data3; // retry count: 3
7526 quic_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7527 quic_data3.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
7528 quic_data3.AddSocketDataToFactory(socket_factory_.get());
7529
7530 MockQuicData quic_data4; // retry count: 4
7531 quic_data4.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7532 quic_data4.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
7533 quic_data4.AddSocketDataToFactory(socket_factory_.get());
7534
7535 MockQuicData quic_data5; // retry count: 5
7536 quic_data5.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7537 quic_data5.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
7538 quic_data5.AddSocketDataToFactory(socket_factory_.get());
7539
7540 // Create request and QuicHttpStream.
7541 QuicStreamRequest request(factory_.get());
7542 EXPECT_EQ(ERR_IO_PENDING,
7543 request.Request(
7544 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7545 SocketTag(),
7546 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7547 failed_on_default_network_callback_, callback_.callback()));
7548 EXPECT_THAT(callback_.WaitForResult(), IsOk());
7549 std::unique_ptr<HttpStream> stream = CreateStream(&request);
7550 EXPECT_TRUE(stream.get());
7551
7552 // Ensure that session is active.
7553 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7554
7555 // Trigger connection migration. Since there are no active streams,
7556 // the session will be closed.
7557 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7558 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
7559
7560 // The nearest task will complete migration.
7561 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
7562 EXPECT_EQ(base::TimeDelta(), task_runner->NextPendingTaskDelay());
7563 task_runner->FastForwardBy(base::TimeDelta());
7564
7565 // The migrate back timer will fire. Due to default network
7566 // being disconnected, no attempt will be exercised to migrate back.
7567 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
7568 EXPECT_EQ(base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs),
7569 task_runner->NextPendingTaskDelay());
7570 task_runner->FastForwardBy(task_runner->NextPendingTaskDelay());
7571 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
7572
7573 // Deliver the signal that the old default network now backs up.
7574 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7575 ->NotifyNetworkMadeDefault(kDefaultNetworkForTests);
7576
7577 // A task is posted to migrate back to the default network immediately.
7578 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
7579 EXPECT_EQ(base::TimeDelta(), task_runner->NextPendingTaskDelay());
7580 task_runner->FastForwardBy(base::TimeDelta());
7581
7582 // Retry migrate back in 1, 2, 4, 8, 16s.
7583 // Session will be closed due to idle migration timeout.
7584 for (int i = 0; i < 5; i++) {
7585 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7586 // A task is posted to migrate back to the default network in 2^i seconds.
7587 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
7588 EXPECT_EQ(base::TimeDelta::FromSeconds(UINT64_C(1) << i),
7589 task_runner->NextPendingTaskDelay());
7590 task_runner->FastForwardBy(task_runner->NextPendingTaskDelay());
7591 }
7592
7593 EXPECT_TRUE(default_socket_data.AllReadDataConsumed());
7594 EXPECT_TRUE(default_socket_data.AllWriteDataConsumed());
7595 EXPECT_TRUE(alternate_socket_data.AllReadDataConsumed());
7596 EXPECT_TRUE(alternate_socket_data.AllWriteDataConsumed());
7597}
7598
7599TEST_P(QuicStreamFactoryTest, CustomIdleMigrationPeriod) {
7600 // The customized threshold is 15s.
Zhongyi Shi32fe14d42019-02-28 00:25:367601 test_params_.quic_migrate_idle_sessions = true;
Zhongyi Shic16b4102019-02-12 00:37:407602 test_params_.quic_idle_session_migration_period =
7603 base::TimeDelta::FromSeconds(15);
7604 InitializeConnectionMigrationV2Test(
7605 {kDefaultNetworkForTests, kNewNetworkForTests});
7606 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7607 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7608
7609 // Using a testing task runner and a test tick tock.
7610 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
7611 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
7612 QuicStreamFactoryPeer::SetTickClock(factory_.get(),
7613 task_runner->GetMockTickClock());
7614
7615 MockQuicData default_socket_data;
7616 default_socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
7617 default_socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
7618 default_socket_data.AddSocketDataToFactory(socket_factory_.get());
7619
7620 // Set up second socket data provider that is used after migration.
7621 MockQuicData alternate_socket_data;
7622 alternate_socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7623 // Ping packet to send after migration.
7624 alternate_socket_data.AddWrite(
7625 SYNCHRONOUS, client_maker_.MakePingPacket(2, /*include_version=*/true));
7626 alternate_socket_data.AddSocketDataToFactory(socket_factory_.get());
7627
7628 // Set up probing socket for migrating back to the default network.
7629 MockQuicData quic_data; // retry count: 0.
7630 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7631 quic_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
7632 quic_data.AddSocketDataToFactory(socket_factory_.get());
7633
7634 MockQuicData quic_data1; // retry count: 1
7635 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7636 quic_data1.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
7637 quic_data1.AddSocketDataToFactory(socket_factory_.get());
7638
7639 MockQuicData quic_data2; // retry count: 2
7640 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7641 quic_data2.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
7642 quic_data2.AddSocketDataToFactory(socket_factory_.get());
7643
7644 MockQuicData quic_data3; // retry count: 3
7645 quic_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7646 quic_data3.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
7647 quic_data3.AddSocketDataToFactory(socket_factory_.get());
7648
7649 MockQuicData quic_data4; // retry count: 4
7650 quic_data4.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7651 quic_data4.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
7652 quic_data4.AddSocketDataToFactory(socket_factory_.get());
7653
7654 // Create request and QuicHttpStream.
7655 QuicStreamRequest request(factory_.get());
7656 EXPECT_EQ(ERR_IO_PENDING,
7657 request.Request(
7658 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7659 SocketTag(),
7660 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7661 failed_on_default_network_callback_, callback_.callback()));
7662 EXPECT_THAT(callback_.WaitForResult(), IsOk());
7663 std::unique_ptr<HttpStream> stream = CreateStream(&request);
7664 EXPECT_TRUE(stream.get());
7665
7666 // Ensure that session is active.
7667 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7668
7669 // Trigger connection migration. Since there are no active streams,
7670 // the session will be closed.
7671 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7672 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
7673
7674 // The nearest task will complete migration.
7675 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
7676 EXPECT_EQ(base::TimeDelta(), task_runner->NextPendingTaskDelay());
7677 task_runner->FastForwardBy(base::TimeDelta());
7678
7679 // The migrate back timer will fire. Due to default network
7680 // being disconnected, no attempt will be exercised to migrate back.
7681 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
7682 EXPECT_EQ(base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs),
7683 task_runner->NextPendingTaskDelay());
7684 task_runner->FastForwardBy(task_runner->NextPendingTaskDelay());
7685 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
7686
7687 // Deliver the signal that the old default network now backs up.
7688 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7689 ->NotifyNetworkMadeDefault(kDefaultNetworkForTests);
7690
7691 // A task is posted to migrate back to the default network immediately.
7692 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
7693 EXPECT_EQ(base::TimeDelta(), task_runner->NextPendingTaskDelay());
7694 task_runner->FastForwardBy(base::TimeDelta());
7695
7696 // Retry migrate back in 1, 2, 4, 8s.
7697 // Session will be closed due to idle migration timeout.
7698 for (int i = 0; i < 4; i++) {
7699 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7700 // A task is posted to migrate back to the default network in 2^i seconds.
7701 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
7702 EXPECT_EQ(base::TimeDelta::FromSeconds(UINT64_C(1) << i),
7703 task_runner->NextPendingTaskDelay());
7704 task_runner->FastForwardBy(task_runner->NextPendingTaskDelay());
7705 }
7706
7707 EXPECT_TRUE(default_socket_data.AllReadDataConsumed());
7708 EXPECT_TRUE(default_socket_data.AllWriteDataConsumed());
7709 EXPECT_TRUE(alternate_socket_data.AllReadDataConsumed());
7710 EXPECT_TRUE(alternate_socket_data.AllWriteDataConsumed());
7711}
7712
jri217455a12016-07-13 20:15:097713TEST_P(QuicStreamFactoryTest, ServerMigration) {
Zhongyi Shi967d2f12019-02-08 20:58:537714 test_params_.quic_allow_server_migration = true;
jri217455a12016-07-13 20:15:097715 Initialize();
7716
7717 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7718 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7719 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7720
rcha00569732016-08-27 11:09:367721 MockQuicData socket_data1;
Ryan Hamilton8d9ee76e2018-05-29 23:52:527722 quic::QuicStreamOffset header_stream_offset = 0;
rcha00569732016-08-27 11:09:367723 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
rch5cb522462017-04-25 20:18:367724 socket_data1.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:437725 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
Fan Yang32c5a112018-12-10 20:06:337726 socket_data1.AddWrite(
7727 SYNCHRONOUS, ConstructGetRequestPacket(
7728 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
7729 true, &header_stream_offset));
Zhongyi Shi5f587cc2017-11-21 23:24:177730 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri217455a12016-07-13 20:15:097731
7732 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:457733 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337734 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037735 request.Request(
7736 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7737 SocketTag(),
7738 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7739 failed_on_default_network_callback_, callback_.callback()));
jri217455a12016-07-13 20:15:097740 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:247741 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri217455a12016-07-13 20:15:097742 EXPECT_TRUE(stream.get());
7743
7744 // Cause QUIC stream to be created.
7745 HttpRequestInfo request_info;
7746 request_info.method = "GET";
7747 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:397748 request_info.traffic_annotation =
7749 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:277750 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:397751 net_log_, CompletionOnceCallback()));
jri217455a12016-07-13 20:15:097752
7753 // Ensure that session is alive and active.
7754 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
7755 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7756 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7757
7758 // Send GET request on stream.
7759 HttpResponseInfo response;
7760 HttpRequestHeaders request_headers;
7761 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
7762 callback_.callback()));
7763
7764 IPEndPoint ip;
7765 session->GetDefaultSocket()->GetPeerAddress(&ip);
7766 DVLOG(1) << "Socket connected to: " << ip.address().ToString() << " "
7767 << ip.port();
7768
7769 // Set up second socket data provider that is used after
7770 // migration. The request is rewritten to this new socket, and the
7771 // response to the request is read on this new socket.
rcha00569732016-08-27 11:09:367772 MockQuicData socket_data2;
7773 socket_data2.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:437774 SYNCHRONOUS, client_maker_.MakePingPacket(3, /*include_version=*/true));
7775 socket_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:337776 ASYNC,
7777 ConstructOkResponsePacket(
7778 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
rcha00569732016-08-27 11:09:367779 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:337780 socket_data2.AddWrite(
7781 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
7782 4, false, GetNthClientInitiatedBidirectionalStreamId(0),
7783 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:177784 socket_data2.AddSocketDataToFactory(socket_factory_.get());
jri217455a12016-07-13 20:15:097785
7786 const uint8_t kTestIpAddress[] = {1, 2, 3, 4};
7787 const uint16_t kTestPort = 123;
Zhongyi Shif124a582017-11-02 00:15:047788 session->Migrate(NetworkChangeNotifier::kInvalidNetworkHandle,
7789 IPEndPoint(IPAddress(kTestIpAddress), kTestPort), true,
7790 net_log_);
jri217455a12016-07-13 20:15:097791
7792 session->GetDefaultSocket()->GetPeerAddress(&ip);
7793 DVLOG(1) << "Socket migrated to: " << ip.address().ToString() << " "
7794 << ip.port();
7795
7796 // The session should be alive and active.
7797 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7798 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7799 EXPECT_EQ(1u, session->GetNumActiveStreams());
7800
7801 // Run the message loop so that data queued in the new socket is read by the
7802 // packet reader.
7803 base::RunLoop().RunUntilIdle();
7804
7805 // Verify that response headers on the migrated socket were delivered to the
7806 // stream.
7807 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
7808 EXPECT_EQ(200, response.headers->response_code());
7809
7810 stream.reset();
7811
7812 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
7813 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
7814 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
7815 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
7816}
7817
jri053fdbd2016-08-19 02:33:057818TEST_P(QuicStreamFactoryTest, ServerMigrationIPv4ToIPv4) {
7819 // Add alternate IPv4 server address to config.
7820 IPEndPoint alt_address = IPEndPoint(IPAddress(1, 2, 3, 4), 123);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527821 quic::QuicConfig config;
fayang91ca2012016-11-22 07:42:467822 config.SetAlternateServerAddressToSend(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527823 quic::QuicSocketAddress(quic::QuicSocketAddressImpl(alt_address)));
jri053fdbd2016-08-19 02:33:057824 VerifyServerMigration(config, alt_address);
7825}
7826
7827TEST_P(QuicStreamFactoryTest, ServerMigrationIPv6ToIPv6) {
7828 // Add a resolver rule to make initial connection to an IPv6 address.
Renjiea0cb4a2c2018-09-26 23:37:307829 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
7830 "fe80::aebc:32ff:febb:1e33", "");
jri053fdbd2016-08-19 02:33:057831 // Add alternate IPv6 server address to config.
7832 IPEndPoint alt_address = IPEndPoint(
7833 IPAddress(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16), 123);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527834 quic::QuicConfig config;
fayang91ca2012016-11-22 07:42:467835 config.SetAlternateServerAddressToSend(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527836 quic::QuicSocketAddress(quic::QuicSocketAddressImpl(alt_address)));
jri053fdbd2016-08-19 02:33:057837 VerifyServerMigration(config, alt_address);
7838}
7839
7840TEST_P(QuicStreamFactoryTest, ServerMigrationIPv6ToIPv4) {
7841 // Add a resolver rule to make initial connection to an IPv6 address.
Renjiea0cb4a2c2018-09-26 23:37:307842 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
7843 "fe80::aebc:32ff:febb:1e33", "");
jri053fdbd2016-08-19 02:33:057844 // Add alternate IPv4 server address to config.
7845 IPEndPoint alt_address = IPEndPoint(IPAddress(1, 2, 3, 4), 123);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527846 quic::QuicConfig config;
fayang91ca2012016-11-22 07:42:467847 config.SetAlternateServerAddressToSend(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527848 quic::QuicSocketAddress(quic::QuicSocketAddressImpl(alt_address)));
jri053fdbd2016-08-19 02:33:057849 IPEndPoint expected_address(
7850 ConvertIPv4ToIPv4MappedIPv6(alt_address.address()), alt_address.port());
7851 VerifyServerMigration(config, expected_address);
7852}
7853
7854TEST_P(QuicStreamFactoryTest, ServerMigrationIPv4ToIPv6Fails) {
Zhongyi Shi967d2f12019-02-08 20:58:537855 test_params_.quic_allow_server_migration = true;
jri053fdbd2016-08-19 02:33:057856 Initialize();
7857
7858 // Add a resolver rule to make initial connection to an IPv4 address.
Renjiea0cb4a2c2018-09-26 23:37:307859 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(), "1.2.3.4",
7860 "");
jri053fdbd2016-08-19 02:33:057861 // Add alternate IPv6 server address to config.
7862 IPEndPoint alt_address = IPEndPoint(
7863 IPAddress(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16), 123);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527864 quic::QuicConfig config;
fayang91ca2012016-11-22 07:42:467865 config.SetAlternateServerAddressToSend(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527866 quic::QuicSocketAddress(quic::QuicSocketAddressImpl(alt_address)));
jri053fdbd2016-08-19 02:33:057867
7868 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7869 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7870 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7871
7872 crypto_client_stream_factory_.SetConfig(config);
7873
7874 // Set up only socket data provider.
rcha00569732016-08-27 11:09:367875 MockQuicData socket_data1;
7876 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437877 socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
7878 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:337879 SYNCHRONOUS, client_maker_.MakeRstPacket(
7880 2, true, GetNthClientInitiatedBidirectionalStreamId(0),
7881 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:177882 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri053fdbd2016-08-19 02:33:057883
7884 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:457885 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337886 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037887 request.Request(
7888 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7889 SocketTag(),
7890 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7891 failed_on_default_network_callback_, callback_.callback()));
jri053fdbd2016-08-19 02:33:057892 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:247893 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri053fdbd2016-08-19 02:33:057894 EXPECT_TRUE(stream.get());
7895
7896 // Cause QUIC stream to be created.
7897 HttpRequestInfo request_info;
7898 request_info.method = "GET";
7899 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:397900 request_info.traffic_annotation =
7901 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:277902 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:397903 net_log_, CompletionOnceCallback()));
jri053fdbd2016-08-19 02:33:057904
7905 // Ensure that session is alive and active.
7906 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
7907 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7908 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7909
7910 IPEndPoint actual_address;
7911 session->GetDefaultSocket()->GetPeerAddress(&actual_address);
7912 // No migration should have happened.
7913 IPEndPoint expected_address =
7914 IPEndPoint(IPAddress(1, 2, 3, 4), kDefaultServerPort);
7915 EXPECT_EQ(actual_address, expected_address);
7916 DVLOG(1) << "Socket connected to: " << actual_address.address().ToString()
7917 << " " << actual_address.port();
7918 DVLOG(1) << "Expected address: " << expected_address.address().ToString()
7919 << " " << expected_address.port();
7920
7921 stream.reset();
7922 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
7923 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
7924}
7925
rsleevi17784692016-10-12 01:36:207926TEST_P(QuicStreamFactoryTest, OnCertDBChanged) {
jri7046038f2015-10-22 00:29:267927 Initialize();
rch6faa4d42016-01-05 20:48:437928 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7929 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7930 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7931
rcha00569732016-08-27 11:09:367932 MockQuicData socket_data;
7933 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437934 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:177935 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]d7d1e50b2013-11-25 22:08:097936
rcha00569732016-08-27 11:09:367937 MockQuicData socket_data2;
7938 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437939 socket_data2.AddWrite(SYNCHRONOUS,
7940 ConstructInitialSettingsPacket(1, nullptr));
Zhongyi Shi5f587cc2017-11-21 23:24:177941 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]d7d1e50b2013-11-25 22:08:097942
zhongyi98d6a9262017-05-19 02:47:457943 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337944 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037945 request.Request(
7946 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7947 SocketTag(),
7948 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7949 failed_on_default_network_callback_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:097950
robpercival214763f2016-07-01 23:27:017951 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:247952 std::unique_ptr<HttpStream> stream = CreateStream(&request);
Charles 'Buck' Krasic71763c9f2018-02-16 02:37:287953 EXPECT_TRUE(stream);
7954 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
[email protected]d7d1e50b2013-11-25 22:08:097955
7956 // Change the CA cert and verify that stream saw the event.
mattmfd05a1f2017-02-18 06:18:447957 factory_->OnCertDBChanged();
Charles 'Buck' Krasic71763c9f2018-02-16 02:37:287958
jri7046038f2015-10-22 00:29:267959 EXPECT_FALSE(factory_->require_confirmation());
Charles 'Buck' Krasic71763c9f2018-02-16 02:37:287960 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7961 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]d7d1e50b2013-11-25 22:08:097962
7963 // Now attempting to request a stream to the same origin should create
7964 // a new session.
7965
zhongyi98d6a9262017-05-19 02:47:457966 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337967 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037968 request2.Request(
7969 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7970 SocketTag(),
7971 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7972 failed_on_default_network_callback_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:097973
robpercival214763f2016-07-01 23:27:017974 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Charles 'Buck' Krasic71763c9f2018-02-16 02:37:287975 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
7976 EXPECT_TRUE(stream2);
7977 QuicChromiumClientSession* session2 = GetActiveSession(host_port_pair_);
7978 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7979 EXPECT_NE(session, session2);
7980 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7981 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
7982
7983 stream2.reset();
7984 stream.reset();
[email protected]d7d1e50b2013-11-25 22:08:097985
rch37de576c2015-05-17 20:28:177986 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7987 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7988 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
7989 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:097990}
7991
[email protected]1e960032013-12-20 19:00:207992TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
jri7046038f2015-10-22 00:29:267993 Initialize();
rch6faa4d42016-01-05 20:48:437994
rch872e00e2016-12-02 02:48:187995 std::vector<string> cannoncial_suffixes;
[email protected]6e12d702013-11-13 00:17:177996 cannoncial_suffixes.push_back(string(".c.youtube.com"));
7997 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]c49ff182013-09-28 08:33:267998
[email protected]6e12d702013-11-13 00:17:177999 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
8000 string r1_host_name("r1");
8001 string r2_host_name("r2");
8002 r1_host_name.append(cannoncial_suffixes[i]);
8003 r2_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:148004
[email protected]bf4ea2f2014-03-10 22:57:538005 HostPortPair host_port_pair1(r1_host_name, 80);
Ryan Hamilton8d9ee76e2018-05-29 23:52:528006 quic::QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:268007 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
Ryan Hamilton4f0b26e2018-06-27 23:52:328008 quic::QuicServerId server_id1(host_port_pair1.host(),
8009 host_port_pair1.port(), privacy_mode_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:528010 quic::QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:378011 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:178012 EXPECT_FALSE(cached1->proof_valid());
8013 EXPECT_TRUE(cached1->source_address_token().empty());
8014
8015 // Mutate the cached1 to have different data.
8016 // TODO(rtenneti): mutate other members of CachedState.
8017 cached1->set_source_address_token(r1_host_name);
8018 cached1->SetProofValid();
8019
[email protected]bf4ea2f2014-03-10 22:57:538020 HostPortPair host_port_pair2(r2_host_name, 80);
Ryan Hamilton4f0b26e2018-06-27 23:52:328021 quic::QuicServerId server_id2(host_port_pair2.host(),
8022 host_port_pair2.port(), privacy_mode_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:528023 quic::QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:378024 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:178025 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
8026 EXPECT_TRUE(cached2->proof_valid());
8027 }
[email protected]b70fdb792013-10-25 19:04:148028}
8029
[email protected]1e960032013-12-20 19:00:208030TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
jri7046038f2015-10-22 00:29:268031 Initialize();
rch872e00e2016-12-02 02:48:188032 std::vector<string> cannoncial_suffixes;
[email protected]6e12d702013-11-13 00:17:178033 cannoncial_suffixes.push_back(string(".c.youtube.com"));
8034 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]b70fdb792013-10-25 19:04:148035
[email protected]6e12d702013-11-13 00:17:178036 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
8037 string r3_host_name("r3");
8038 string r4_host_name("r4");
8039 r3_host_name.append(cannoncial_suffixes[i]);
8040 r4_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:148041
[email protected]bf4ea2f2014-03-10 22:57:538042 HostPortPair host_port_pair1(r3_host_name, 80);
Ryan Hamilton8d9ee76e2018-05-29 23:52:528043 quic::QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:268044 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
Ryan Hamilton4f0b26e2018-06-27 23:52:328045 quic::QuicServerId server_id1(host_port_pair1.host(),
8046 host_port_pair1.port(), privacy_mode_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:528047 quic::QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:378048 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:178049 EXPECT_FALSE(cached1->proof_valid());
8050 EXPECT_TRUE(cached1->source_address_token().empty());
8051
8052 // Mutate the cached1 to have different data.
8053 // TODO(rtenneti): mutate other members of CachedState.
8054 cached1->set_source_address_token(r3_host_name);
8055 cached1->SetProofInvalid();
8056
[email protected]bf4ea2f2014-03-10 22:57:538057 HostPortPair host_port_pair2(r4_host_name, 80);
Ryan Hamilton4f0b26e2018-06-27 23:52:328058 quic::QuicServerId server_id2(host_port_pair2.host(),
8059 host_port_pair2.port(), privacy_mode_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:528060 quic::QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:378061 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:178062 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
8063 EXPECT_TRUE(cached2->source_address_token().empty());
8064 EXPECT_FALSE(cached2->proof_valid());
8065 }
[email protected]c49ff182013-09-28 08:33:268066}
8067
rtenneti34dffe752015-02-24 23:27:328068TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) {
jri7046038f2015-10-22 00:29:268069 Initialize();
Ryan Hamiltona12722b2017-08-12 02:23:208070 factory_->set_require_confirmation(false);
rch6faa4d42016-01-05 20:48:438071 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8072 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8073
jri7046038f2015-10-22 00:29:268074 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti34dffe752015-02-24 23:27:328075
rcha00569732016-08-27 11:09:368076 MockQuicData socket_data;
8077 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:178078 socket_data.AddSocketDataToFactory(socket_factory_.get());
rtenneti34dffe752015-02-24 23:27:328079
8080 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:278081 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:308082 host_resolver_->set_synchronous_mode(true);
8083 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
8084 "192.168.0.1", "");
rtenneti34dffe752015-02-24 23:27:328085
zhongyi98d6a9262017-05-19 02:47:458086 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338087 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
8088 DEFAULT_PRIORITY, SocketTag(),
8089 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:038090 &net_error_details_,
8091 failed_on_default_network_callback_,
8092 callback_.callback()));
rtenneti34dffe752015-02-24 23:27:328093
8094 // If we are waiting for disk cache, we would have posted a task. Verify that
8095 // the CancelWaitForDataReady task hasn't been posted.
8096 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
8097
Yixin Wang7891a39d2017-11-08 20:59:248098 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rtenneti34dffe752015-02-24 23:27:328099 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:178100 EXPECT_TRUE(socket_data.AllReadDataConsumed());
8101 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti34dffe752015-02-24 23:27:328102}
8103
dmurph44ca4f42016-09-09 20:39:098104TEST_P(QuicStreamFactoryTest, ReducePingTimeoutOnConnectionTimeOutOpenStreams) {
Zhongyi Shi967d2f12019-02-08 20:58:538105 test_params_.quic_reduced_ping_timeout_seconds = 10;
dmurph44ca4f42016-09-09 20:39:098106 Initialize();
8107 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8108 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8109 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8110
8111 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
zhongyidd1439f62016-09-02 02:02:268112
8113 MockQuicData socket_data;
8114 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:438115 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:178116 socket_data.AddSocketDataToFactory(socket_factory_.get());
zhongyidd1439f62016-09-02 02:02:268117
8118 MockQuicData socket_data2;
8119 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:438120 socket_data2.AddWrite(SYNCHRONOUS,
8121 ConstructInitialSettingsPacket(1, nullptr));
Zhongyi Shi5f587cc2017-11-21 23:24:178122 socket_data2.AddSocketDataToFactory(socket_factory_.get());
zhongyidd1439f62016-09-02 02:02:268123
8124 HostPortPair server2(kServer2HostName, kDefaultServerPort);
8125
8126 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:278127 MockCryptoClientStream::CONFIRM_HANDSHAKE);
Renjiea0cb4a2c2018-09-26 23:37:308128 host_resolver_->set_synchronous_mode(true);
8129 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
8130 "192.168.0.1", "");
8131 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
zhongyidd1439f62016-09-02 02:02:268132
8133 // Quic should use default PING timeout when no previous connection times out
8134 // with open stream.
Ryan Hamilton8d9ee76e2018-05-29 23:52:528135 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(quic::kPingTimeoutSecs),
zhongyidd1439f62016-09-02 02:02:268136 QuicStreamFactoryPeer::GetPingTimeout(factory_.get()));
zhongyi98d6a9262017-05-19 02:47:458137 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338138 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
8139 DEFAULT_PRIORITY, SocketTag(),
8140 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:038141 &net_error_details_,
8142 failed_on_default_network_callback_,
8143 callback_.callback()));
zhongyidd1439f62016-09-02 02:02:268144
8145 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:528146 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(quic::kPingTimeoutSecs),
zhongyidd1439f62016-09-02 02:02:268147 session->connection()->ping_timeout());
8148
Yixin Wang7891a39d2017-11-08 20:59:248149 std::unique_ptr<HttpStream> stream = CreateStream(&request);
zhongyidd1439f62016-09-02 02:02:268150 EXPECT_TRUE(stream.get());
8151 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:398152 request_info.traffic_annotation =
8153 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:278154 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:398155 net_log_, CompletionOnceCallback()));
zhongyidd1439f62016-09-02 02:02:268156
8157 DVLOG(1)
8158 << "Created 1st session and initialized a stream. Now trigger timeout";
Ryan Hamilton8d9ee76e2018-05-29 23:52:528159 session->connection()->CloseConnection(
8160 quic::QUIC_NETWORK_IDLE_TIMEOUT, "test",
8161 quic::ConnectionCloseBehavior::SILENT_CLOSE);
zhongyidd1439f62016-09-02 02:02:268162 // Need to spin the loop now to ensure that
8163 // QuicStreamFactory::OnSessionClosed() runs.
8164 base::RunLoop run_loop;
8165 run_loop.RunUntilIdle();
8166
zhongyidd1439f62016-09-02 02:02:268167 // The first connection times out with open stream, QUIC should reduce initial
8168 // PING time for subsequent connections.
Ryan Hamilton8d9ee76e2018-05-29 23:52:528169 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(10),
zhongyidd1439f62016-09-02 02:02:268170 QuicStreamFactoryPeer::GetPingTimeout(factory_.get()));
8171
8172 // Test two-in-a-row timeouts with open streams.
8173 DVLOG(1) << "Create 2nd session and timeout with open stream";
8174 TestCompletionCallback callback2;
zhongyi98d6a9262017-05-19 02:47:458175 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:038176 EXPECT_EQ(OK,
8177 request2.Request(
8178 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
8179 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
8180 failed_on_default_network_callback_, callback2.callback()));
zhongyidd1439f62016-09-02 02:02:268181 QuicChromiumClientSession* session2 = GetActiveSession(server2);
Ryan Hamilton8d9ee76e2018-05-29 23:52:528182 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(10),
zhongyidd1439f62016-09-02 02:02:268183 session2->connection()->ping_timeout());
8184
Yixin Wang7891a39d2017-11-08 20:59:248185 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
zhongyidd1439f62016-09-02 02:02:268186 EXPECT_TRUE(stream2.get());
Steven Valdezb4ff0412018-01-18 22:39:278187 EXPECT_EQ(OK,
8188 stream2->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:398189 net_log_, CompletionOnceCallback()));
zhongyidd1439f62016-09-02 02:02:268190 session2->connection()->CloseConnection(
Ryan Hamilton8d9ee76e2018-05-29 23:52:528191 quic::QUIC_NETWORK_IDLE_TIMEOUT, "test",
8192 quic::ConnectionCloseBehavior::SILENT_CLOSE);
zhongyidd1439f62016-09-02 02:02:268193 // Need to spin the loop now to ensure that
8194 // QuicStreamFactory::OnSessionClosed() runs.
8195 base::RunLoop run_loop2;
8196 run_loop2.RunUntilIdle();
zhongyidd1439f62016-09-02 02:02:268197
8198 EXPECT_TRUE(socket_data.AllReadDataConsumed());
8199 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
8200 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
8201 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
8202}
8203
tbansal3b966952016-10-25 23:25:148204// Verifies that the QUIC stream factory is initialized correctly.
rtenneticd2aaa15b2015-10-10 20:29:338205TEST_P(QuicStreamFactoryTest, MaybeInitialize) {
tbansal9b1cdf32017-05-10 17:28:398206 VerifyInitialization();
rtenneti8a80a6dc2015-09-21 19:51:138207}
8208
rtennetid073dd22016-08-04 01:58:338209TEST_P(QuicStreamFactoryTest, StartCertVerifyJob) {
8210 Initialize();
8211
rcha00569732016-08-27 11:09:368212 MockQuicData socket_data;
8213 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:438214 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:178215 socket_data.AddSocketDataToFactory(socket_factory_.get());
rtennetid073dd22016-08-04 01:58:338216
8217 // Save current state of |race_cert_verification|.
8218 bool race_cert_verification =
8219 QuicStreamFactoryPeer::GetRaceCertVerification(factory_.get());
8220
8221 // Load server config.
8222 HostPortPair host_port_pair(kDefaultServerHostName, kDefaultServerPort);
Ryan Hamilton4f0b26e2018-06-27 23:52:328223 quic::QuicServerId quic_server_id(host_port_pair_.host(),
8224 host_port_pair_.port(),
8225 privacy_mode_ == PRIVACY_MODE_ENABLED);
rtennetid073dd22016-08-04 01:58:338226 QuicStreamFactoryPeer::CacheDummyServerConfig(factory_.get(), quic_server_id);
8227
8228 QuicStreamFactoryPeer::SetRaceCertVerification(factory_.get(), true);
8229 EXPECT_FALSE(HasActiveCertVerifierJob(quic_server_id));
8230
8231 // Start CertVerifyJob.
Ryan Hamilton8d9ee76e2018-05-29 23:52:528232 quic::QuicAsyncStatus status = QuicStreamFactoryPeer::StartCertVerifyJob(
rtennetid073dd22016-08-04 01:58:338233 factory_.get(), quic_server_id, /*cert_verify_flags=*/0, net_log_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:528234 if (status == quic::QUIC_PENDING) {
rtennetid073dd22016-08-04 01:58:338235 // Verify CertVerifierJob has started.
8236 EXPECT_TRUE(HasActiveCertVerifierJob(quic_server_id));
8237
8238 while (HasActiveCertVerifierJob(quic_server_id)) {
8239 base::RunLoop().RunUntilIdle();
8240 }
8241 }
8242 // Verify CertVerifierJob has finished.
8243 EXPECT_FALSE(HasActiveCertVerifierJob(quic_server_id));
8244
8245 // Start a QUIC request.
zhongyi98d6a9262017-05-19 02:47:458246 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338247 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038248 request.Request(
8249 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8250 SocketTag(),
8251 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8252 failed_on_default_network_callback_, callback_.callback()));
rtennetid073dd22016-08-04 01:58:338253
8254 EXPECT_EQ(OK, callback_.WaitForResult());
8255
Yixin Wang7891a39d2017-11-08 20:59:248256 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rtennetid073dd22016-08-04 01:58:338257 EXPECT_TRUE(stream.get());
8258
8259 // Restore |race_cert_verification|.
8260 QuicStreamFactoryPeer::SetRaceCertVerification(factory_.get(),
8261 race_cert_verification);
8262
8263 EXPECT_TRUE(socket_data.AllReadDataConsumed());
8264 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
8265
8266 // Verify there are no outstanding CertVerifierJobs after request has
8267 // finished.
8268 EXPECT_FALSE(HasActiveCertVerifierJob(quic_server_id));
8269}
8270
rtenneti1cd3b162015-09-29 02:58:288271TEST_P(QuicStreamFactoryTest, YieldAfterPackets) {
jri7046038f2015-10-22 00:29:268272 Initialize();
Ryan Hamiltona12722b2017-08-12 02:23:208273 factory_->set_require_confirmation(false);
rch6faa4d42016-01-05 20:48:438274 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8275 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:268276 QuicStreamFactoryPeer::SetYieldAfterPackets(factory_.get(), 0);
rtenneti1cd3b162015-09-29 02:58:288277
rcha00569732016-08-27 11:09:368278 MockQuicData socket_data;
Fan Yangac867502019-01-28 21:10:238279 socket_data.AddRead(SYNCHRONOUS, ConstructClientConnectionClosePacket(1));
rcha00569732016-08-27 11:09:368280 socket_data.AddRead(ASYNC, OK);
Zhongyi Shi5f587cc2017-11-21 23:24:178281 socket_data.AddSocketDataToFactory(socket_factory_.get());
rtenneti1cd3b162015-09-29 02:58:288282
8283 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:278284 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:308285 host_resolver_->set_synchronous_mode(true);
8286 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
8287 "192.168.0.1", "");
rtenneti1cd3b162015-09-29 02:58:288288
rcha02807b42016-01-29 21:56:158289 // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
8290 // posts a task.
rtenneti1cd3b162015-09-29 02:58:288291 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
rcha02807b42016-01-29 21:56:158292 SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
8293 "StartReading");
rtenneti1cd3b162015-09-29 02:58:288294
zhongyi98d6a9262017-05-19 02:47:458295 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338296 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
8297 DEFAULT_PRIORITY, SocketTag(),
8298 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:038299 &net_error_details_,
8300 failed_on_default_network_callback_,
8301 callback_.callback()));
rtenneti1cd3b162015-09-29 02:58:288302
rcha02807b42016-01-29 21:56:158303 // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
8304 // called.
rtenneti1cd3b162015-09-29 02:58:288305 base::RunLoop run_loop;
8306 run_loop.RunUntilIdle();
8307
8308 // Verify task that the observer's executed_count is 1, which indicates
rcha02807b42016-01-29 21:56:158309 // QuicChromiumPacketReader::StartReading() has posted only one task and
8310 // yielded the read.
rtenneti1cd3b162015-09-29 02:58:288311 EXPECT_EQ(1u, observer.executed_count());
8312
Yixin Wang7891a39d2017-11-08 20:59:248313 std::unique_ptr<HttpStream> stream = CreateStream(&request);
xunjieli2608f9b2016-03-14 13:39:238314 EXPECT_FALSE(stream.get()); // Session is already closed.
rtenneti1cd3b162015-09-29 02:58:288315 EXPECT_TRUE(socket_data.AllReadDataConsumed());
8316 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
8317}
8318
8319TEST_P(QuicStreamFactoryTest, YieldAfterDuration) {
jri7046038f2015-10-22 00:29:268320 Initialize();
Ryan Hamiltona12722b2017-08-12 02:23:208321 factory_->set_require_confirmation(false);
rch6faa4d42016-01-05 20:48:438322 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8323 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rtenneti1cd3b162015-09-29 02:58:288324 QuicStreamFactoryPeer::SetYieldAfterDuration(
Ryan Hamilton8d9ee76e2018-05-29 23:52:528325 factory_.get(), quic::QuicTime::Delta::FromMilliseconds(-1));
rtenneti1cd3b162015-09-29 02:58:288326
rcha00569732016-08-27 11:09:368327 MockQuicData socket_data;
Fan Yangac867502019-01-28 21:10:238328 socket_data.AddRead(SYNCHRONOUS, ConstructClientConnectionClosePacket(1));
rcha00569732016-08-27 11:09:368329 socket_data.AddRead(ASYNC, OK);
Zhongyi Shi5f587cc2017-11-21 23:24:178330 socket_data.AddSocketDataToFactory(socket_factory_.get());
rtenneti1cd3b162015-09-29 02:58:288331
8332 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:278333 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:308334 host_resolver_->set_synchronous_mode(true);
8335 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
8336 "192.168.0.1", "");
rtenneti1cd3b162015-09-29 02:58:288337
rcha02807b42016-01-29 21:56:158338 // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
8339 // posts a task.
rtenneti1cd3b162015-09-29 02:58:288340 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
rcha02807b42016-01-29 21:56:158341 SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
8342 "StartReading");
rtenneti1cd3b162015-09-29 02:58:288343
zhongyi98d6a9262017-05-19 02:47:458344 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338345 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
8346 DEFAULT_PRIORITY, SocketTag(),
8347 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:038348 &net_error_details_,
8349 failed_on_default_network_callback_,
8350 callback_.callback()));
rtenneti1cd3b162015-09-29 02:58:288351
rcha02807b42016-01-29 21:56:158352 // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
8353 // called.
rtenneti1cd3b162015-09-29 02:58:288354 base::RunLoop run_loop;
8355 run_loop.RunUntilIdle();
8356
8357 // Verify task that the observer's executed_count is 1, which indicates
rcha02807b42016-01-29 21:56:158358 // QuicChromiumPacketReader::StartReading() has posted only one task and
8359 // yielded the read.
rtenneti1cd3b162015-09-29 02:58:288360 EXPECT_EQ(1u, observer.executed_count());
8361
Yixin Wang7891a39d2017-11-08 20:59:248362 std::unique_ptr<HttpStream> stream = CreateStream(&request);
xunjieli2608f9b2016-03-14 13:39:238363 EXPECT_FALSE(stream.get()); // Session is already closed.
rtenneti1cd3b162015-09-29 02:58:288364 EXPECT_TRUE(socket_data.AllReadDataConsumed());
8365 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
8366}
8367
ckrasic3865ee0f2016-02-29 22:04:568368TEST_P(QuicStreamFactoryTest, ServerPushSessionAffinity) {
8369 Initialize();
8370 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8371 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8372
rcha00569732016-08-27 11:09:368373 MockQuicData socket_data;
8374 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:438375 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:178376 socket_data.AddSocketDataToFactory(socket_factory_.get());
ckrasic3865ee0f2016-02-29 22:04:568377
zhongyi98d6a9262017-05-19 02:47:458378 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338379 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038380 request.Request(
8381 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8382 SocketTag(),
8383 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8384 failed_on_default_network_callback_, callback_.callback()));
ckrasic3865ee0f2016-02-29 22:04:568385
robpercival214763f2016-07-01 23:27:018386 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:248387 std::unique_ptr<HttpStream> stream = CreateStream(&request);
ckrasic3865ee0f2016-02-29 22:04:568388 EXPECT_TRUE(stream.get());
8389
8390 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
8391
bnc5fdc07162016-05-23 17:36:038392 string url = "https://www.example.org/";
ckrasic3865ee0f2016-02-29 22:04:568393
bnc912a04b2016-04-20 14:19:508394 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic3865ee0f2016-02-29 22:04:568395
Ryan Hamilton8d9ee76e2018-05-29 23:52:528396 quic::QuicClientPromisedInfo promised(
Fan Yang32c5a112018-12-10 20:06:338397 session, GetNthServerInitiatedUnidirectionalStreamId(0), kDefaultUrl);
ckrasic3865ee0f2016-02-29 22:04:568398 (*QuicStreamFactoryPeer::GetPushPromiseIndex(factory_.get())
bnc3d9035b32016-06-30 18:18:488399 ->promised_by_url())[kDefaultUrl] = &promised;
ckrasic3865ee0f2016-02-29 22:04:568400
zhongyi98d6a9262017-05-19 02:47:458401 QuicStreamRequest request2(factory_.get());
zhongyia00ca012017-07-06 23:36:398402 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:338403 DEFAULT_PRIORITY, SocketTag(),
8404 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:038405 &net_error_details_,
8406 failed_on_default_network_callback_,
8407 callback_.callback()));
ckrasic3865ee0f2016-02-29 22:04:568408
8409 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
8410}
8411
8412TEST_P(QuicStreamFactoryTest, ServerPushPrivacyModeMismatch) {
8413 Initialize();
8414 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8415 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8416 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8417
rcha00569732016-08-27 11:09:368418 MockQuicData socket_data1;
8419 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:438420 socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
8421 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:338422 SYNCHRONOUS, client_maker_.MakeRstPacket(
8423 2, true, GetNthServerInitiatedUnidirectionalStreamId(0),
8424 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:178425 socket_data1.AddSocketDataToFactory(socket_factory_.get());
ckrasic3865ee0f2016-02-29 22:04:568426
rcha00569732016-08-27 11:09:368427 MockQuicData socket_data2;
8428 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:438429 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:178430 socket_data2.AddSocketDataToFactory(socket_factory_.get());
ckrasic3865ee0f2016-02-29 22:04:568431
zhongyi98d6a9262017-05-19 02:47:458432 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338433 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038434 request.Request(
8435 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8436 SocketTag(),
8437 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8438 failed_on_default_network_callback_, callback_.callback()));
ckrasic3865ee0f2016-02-29 22:04:568439
robpercival214763f2016-07-01 23:27:018440 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:248441 std::unique_ptr<HttpStream> stream = CreateStream(&request);
ckrasic3865ee0f2016-02-29 22:04:568442 EXPECT_TRUE(stream.get());
8443
8444 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
8445
bnc5fdc07162016-05-23 17:36:038446 string url = "https://www.example.org/";
bnc912a04b2016-04-20 14:19:508447 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic3865ee0f2016-02-29 22:04:568448
Ryan Hamilton8d9ee76e2018-05-29 23:52:528449 quic::QuicClientPromisedInfo promised(
Fan Yang32c5a112018-12-10 20:06:338450 session, GetNthServerInitiatedUnidirectionalStreamId(0), kDefaultUrl);
ckrasic3865ee0f2016-02-29 22:04:568451
Ryan Hamilton8d9ee76e2018-05-29 23:52:528452 quic::QuicClientPushPromiseIndex* index =
ckrasic3865ee0f2016-02-29 22:04:568453 QuicStreamFactoryPeer::GetPushPromiseIndex(factory_.get());
8454
bnc3d9035b32016-06-30 18:18:488455 (*index->promised_by_url())[kDefaultUrl] = &promised;
8456 EXPECT_EQ(index->GetPromised(kDefaultUrl), &promised);
ckrasic3865ee0f2016-02-29 22:04:568457
8458 // Doing the request should not use the push stream, but rather
8459 // cancel it because the privacy modes do not match.
zhongyi98d6a9262017-05-19 02:47:458460 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338461 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038462 request2.Request(
8463 host_port_pair_, version_, PRIVACY_MODE_ENABLED,
8464 DEFAULT_PRIORITY, SocketTag(),
8465 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8466 failed_on_default_network_callback_, callback_.callback()));
ckrasic3865ee0f2016-02-29 22:04:568467
8468 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
bnc3d9035b32016-06-30 18:18:488469 EXPECT_EQ(index->GetPromised(kDefaultUrl), nullptr);
ckrasic3865ee0f2016-02-29 22:04:568470
robpercival214763f2016-07-01 23:27:018471 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:248472 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
ckrasic3865ee0f2016-02-29 22:04:568473 EXPECT_TRUE(stream2.get());
8474
8475 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
8476 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
8477 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
8478 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
8479}
8480
Ryan Hamilton8d9ee76e2018-05-29 23:52:528481// Pool to existing session with matching quic::QuicServerId
bnc359ed2a2016-04-29 20:43:458482// even if destination is different.
8483TEST_P(QuicStreamFactoryTest, PoolByOrigin) {
8484 Initialize();
8485
8486 HostPortPair destination1("first.example.com", 443);
8487 HostPortPair destination2("second.example.com", 443);
8488
8489 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8490 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8491
rcha00569732016-08-27 11:09:368492 MockQuicData socket_data;
8493 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:438494 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:178495 socket_data.AddSocketDataToFactory(socket_factory_.get());
bnc359ed2a2016-04-29 20:43:458496
zhongyi98d6a9262017-05-19 02:47:458497 QuicStreamRequest request1(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:038498 EXPECT_EQ(
8499 ERR_IO_PENDING,
8500 request1.Request(
8501 destination1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
8502 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8503 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:018504 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:248505 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
bnc359ed2a2016-04-29 20:43:458506 EXPECT_TRUE(stream1.get());
8507 EXPECT_TRUE(HasActiveSession(host_port_pair_));
8508
8509 // Second request returns synchronously because it pools to existing session.
8510 TestCompletionCallback callback2;
zhongyi98d6a9262017-05-19 02:47:458511 QuicStreamRequest request2(factory_.get());
zhongyia00ca012017-07-06 23:36:398512 EXPECT_EQ(OK, request2.Request(destination2, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:338513 DEFAULT_PRIORITY, SocketTag(),
8514 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:038515 &net_error_details_,
8516 failed_on_default_network_callback_,
8517 callback2.callback()));
Yixin Wang7891a39d2017-11-08 20:59:248518 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
bnc359ed2a2016-04-29 20:43:458519 EXPECT_TRUE(stream2.get());
8520
rchf0b18c8a2017-05-05 19:31:578521 QuicChromiumClientSession::Handle* session1 =
8522 QuicHttpStreamPeer::GetSessionHandle(stream1.get());
8523 QuicChromiumClientSession::Handle* session2 =
8524 QuicHttpStreamPeer::GetSessionHandle(stream2.get());
8525 EXPECT_TRUE(session1->SharesSameSession(*session2));
Ryan Hamilton4f0b26e2018-06-27 23:52:328526 EXPECT_EQ(quic::QuicServerId(host_port_pair_.host(), host_port_pair_.port(),
8527 privacy_mode_ == PRIVACY_MODE_ENABLED),
bnc359ed2a2016-04-29 20:43:458528 session1->server_id());
8529
8530 EXPECT_TRUE(socket_data.AllReadDataConsumed());
8531 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
8532}
8533
8534class QuicStreamFactoryWithDestinationTest
8535 : public QuicStreamFactoryTestBase,
8536 public ::testing::TestWithParam<PoolingTestParams> {
8537 protected:
8538 QuicStreamFactoryWithDestinationTest()
Yixin Wang079ad542018-01-11 04:06:058539 : QuicStreamFactoryTestBase(
8540 GetParam().version,
8541 GetParam().client_headers_include_h2_stream_dependency),
bnc359ed2a2016-04-29 20:43:458542 destination_type_(GetParam().destination_type),
8543 hanging_read_(SYNCHRONOUS, ERR_IO_PENDING, 0) {}
8544
8545 HostPortPair GetDestination() {
8546 switch (destination_type_) {
8547 case SAME_AS_FIRST:
8548 return origin1_;
8549 case SAME_AS_SECOND:
8550 return origin2_;
8551 case DIFFERENT:
8552 return HostPortPair(kDifferentHostname, 443);
8553 default:
8554 NOTREACHED();
8555 return HostPortPair();
8556 }
8557 }
8558
8559 void AddHangingSocketData() {
8560 std::unique_ptr<SequencedSocketData> sequenced_socket_data(
Ryan Sleevib8d7ea02018-05-07 20:01:018561 new SequencedSocketData(base::make_span(&hanging_read_, 1),
8562 base::span<MockWrite>()));
Zhongyi Shi5f587cc2017-11-21 23:24:178563 socket_factory_->AddSocketDataProvider(sequenced_socket_data.get());
bnc359ed2a2016-04-29 20:43:458564 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
8565 }
8566
8567 bool AllDataConsumed() {
8568 for (const auto& socket_data_ptr : sequenced_socket_data_vector_) {
8569 if (!socket_data_ptr->AllReadDataConsumed() ||
8570 !socket_data_ptr->AllWriteDataConsumed()) {
8571 return false;
8572 }
8573 }
8574 return true;
8575 }
8576
8577 DestinationType destination_type_;
8578 HostPortPair origin1_;
8579 HostPortPair origin2_;
8580 MockRead hanging_read_;
rch872e00e2016-12-02 02:48:188581 std::vector<std::unique_ptr<SequencedSocketData>>
8582 sequenced_socket_data_vector_;
bnc359ed2a2016-04-29 20:43:458583};
8584
Victor Costane635086f2019-01-27 05:20:308585INSTANTIATE_TEST_SUITE_P(VersionIncludeStreamDependencySequence,
8586 QuicStreamFactoryWithDestinationTest,
8587 ::testing::ValuesIn(GetPoolingTestParams()));
bnc359ed2a2016-04-29 20:43:458588
8589// A single QUIC request fails because the certificate does not match the origin
8590// hostname, regardless of whether it matches the alternative service hostname.
8591TEST_P(QuicStreamFactoryWithDestinationTest, InvalidCertificate) {
8592 if (destination_type_ == DIFFERENT)
8593 return;
8594
8595 Initialize();
8596
8597 GURL url("https://mail.example.com/");
8598 origin1_ = HostPortPair::FromURL(url);
8599
8600 // Not used for requests, but this provides a test case where the certificate
8601 // is valid for the hostname of the alternative service.
8602 origin2_ = HostPortPair("mail.example.org", 433);
8603
8604 HostPortPair destination = GetDestination();
8605
8606 scoped_refptr<X509Certificate> cert(
8607 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
Ryan Sleevidef35f62018-01-23 21:12:248608 ASSERT_FALSE(cert->VerifyNameMatch(origin1_.host()));
8609 ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host()));
bnc359ed2a2016-04-29 20:43:458610
8611 ProofVerifyDetailsChromium verify_details;
8612 verify_details.cert_verify_result.verified_cert = cert;
8613 verify_details.cert_verify_result.is_issued_by_known_root = true;
8614 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8615
8616 AddHangingSocketData();
8617
zhongyi98d6a9262017-05-19 02:47:458618 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:038619 EXPECT_EQ(
8620 ERR_IO_PENDING,
8621 request.Request(
8622 destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
8623 /*cert_verify_flags=*/0, url, net_log_, &net_error_details_,
8624 failed_on_default_network_callback_, callback_.callback()));
bnc359ed2a2016-04-29 20:43:458625
robpercival214763f2016-07-01 23:27:018626 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_QUIC_HANDSHAKE_FAILED));
bnc359ed2a2016-04-29 20:43:458627
8628 EXPECT_TRUE(AllDataConsumed());
8629}
8630
8631// QuicStreamRequest is pooled based on |destination| if certificate matches.
8632TEST_P(QuicStreamFactoryWithDestinationTest, SharedCertificate) {
8633 Initialize();
8634
8635 GURL url1("https://www.example.org/");
8636 GURL url2("https://mail.example.org/");
8637 origin1_ = HostPortPair::FromURL(url1);
8638 origin2_ = HostPortPair::FromURL(url2);
8639
8640 HostPortPair destination = GetDestination();
8641
8642 scoped_refptr<X509Certificate> cert(
8643 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
Ryan Sleevidef35f62018-01-23 21:12:248644 ASSERT_TRUE(cert->VerifyNameMatch(origin1_.host()));
8645 ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host()));
8646 ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname));
bnc359ed2a2016-04-29 20:43:458647
8648 ProofVerifyDetailsChromium verify_details;
8649 verify_details.cert_verify_result.verified_cert = cert;
8650 verify_details.cert_verify_result.is_issued_by_known_root = true;
8651 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8652
fayang3bcb8b502016-12-07 21:44:378653 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
Ryan Hamilton8d9ee76e2018-05-29 23:52:528654 std::unique_ptr<quic::QuicEncryptedPacket> settings_packet(
rch5cb522462017-04-25 20:18:368655 client_maker_.MakeInitialSettingsPacket(1, nullptr));
bnceb9aa7112017-01-05 01:03:468656 MockWrite writes[] = {MockWrite(SYNCHRONOUS, settings_packet->data(),
8657 settings_packet->length(), 1)};
fayang3bcb8b502016-12-07 21:44:378658 std::unique_ptr<SequencedSocketData> sequenced_socket_data(
Ryan Sleevib8d7ea02018-05-07 20:01:018659 new SequencedSocketData(reads, writes));
Zhongyi Shi5f587cc2017-11-21 23:24:178660 socket_factory_->AddSocketDataProvider(sequenced_socket_data.get());
fayang3bcb8b502016-12-07 21:44:378661 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
bnc359ed2a2016-04-29 20:43:458662
zhongyi98d6a9262017-05-19 02:47:458663 QuicStreamRequest request1(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:038664 EXPECT_EQ(
8665 ERR_IO_PENDING,
8666 request1.Request(
8667 destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
8668 /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
8669 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:018670 EXPECT_THAT(callback_.WaitForResult(), IsOk());
fayang3bcb8b502016-12-07 21:44:378671
Yixin Wang7891a39d2017-11-08 20:59:248672 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
bnc359ed2a2016-04-29 20:43:458673 EXPECT_TRUE(stream1.get());
8674 EXPECT_TRUE(HasActiveSession(origin1_));
8675
8676 // Second request returns synchronously because it pools to existing session.
8677 TestCompletionCallback callback2;
zhongyi98d6a9262017-05-19 02:47:458678 QuicStreamRequest request2(factory_.get());
zhongyia00ca012017-07-06 23:36:398679 EXPECT_EQ(OK, request2.Request(destination, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:338680 DEFAULT_PRIORITY, SocketTag(),
8681 /*cert_verify_flags=*/0, url2, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:038682 &net_error_details_,
8683 failed_on_default_network_callback_,
8684 callback2.callback()));
Yixin Wang7891a39d2017-11-08 20:59:248685 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
bnc359ed2a2016-04-29 20:43:458686 EXPECT_TRUE(stream2.get());
8687
rchf0b18c8a2017-05-05 19:31:578688 QuicChromiumClientSession::Handle* session1 =
8689 QuicHttpStreamPeer::GetSessionHandle(stream1.get());
8690 QuicChromiumClientSession::Handle* session2 =
8691 QuicHttpStreamPeer::GetSessionHandle(stream2.get());
8692 EXPECT_TRUE(session1->SharesSameSession(*session2));
bnc359ed2a2016-04-29 20:43:458693
Ryan Hamilton4f0b26e2018-06-27 23:52:328694 EXPECT_EQ(quic::QuicServerId(origin1_.host(), origin1_.port(),
8695 privacy_mode_ == PRIVACY_MODE_ENABLED),
8696 session1->server_id());
bnc359ed2a2016-04-29 20:43:458697
8698 EXPECT_TRUE(AllDataConsumed());
8699}
8700
bnc47eba7d2016-07-01 00:43:388701// QuicStreamRequest is not pooled if PrivacyMode differs.
8702TEST_P(QuicStreamFactoryWithDestinationTest, DifferentPrivacyMode) {
8703 Initialize();
8704
8705 GURL url1("https://www.example.org/");
8706 GURL url2("https://mail.example.org/");
8707 origin1_ = HostPortPair::FromURL(url1);
8708 origin2_ = HostPortPair::FromURL(url2);
8709
8710 HostPortPair destination = GetDestination();
8711
8712 scoped_refptr<X509Certificate> cert(
8713 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
Ryan Sleevidef35f62018-01-23 21:12:248714 ASSERT_TRUE(cert->VerifyNameMatch(origin1_.host()));
8715 ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host()));
8716 ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname));
bnc47eba7d2016-07-01 00:43:388717
8718 ProofVerifyDetailsChromium verify_details1;
8719 verify_details1.cert_verify_result.verified_cert = cert;
8720 verify_details1.cert_verify_result.is_issued_by_known_root = true;
8721 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
8722
8723 ProofVerifyDetailsChromium verify_details2;
8724 verify_details2.cert_verify_result.verified_cert = cert;
8725 verify_details2.cert_verify_result.is_issued_by_known_root = true;
8726 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
8727
fayang3bcb8b502016-12-07 21:44:378728 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
Ryan Hamilton8d9ee76e2018-05-29 23:52:528729 std::unique_ptr<quic::QuicEncryptedPacket> settings_packet(
rch5cb522462017-04-25 20:18:368730 client_maker_.MakeInitialSettingsPacket(1, nullptr));
bnceb9aa7112017-01-05 01:03:468731 MockWrite writes[] = {MockWrite(SYNCHRONOUS, settings_packet->data(),
8732 settings_packet->length(), 1)};
fayang3bcb8b502016-12-07 21:44:378733 std::unique_ptr<SequencedSocketData> sequenced_socket_data(
Ryan Sleevib8d7ea02018-05-07 20:01:018734 new SequencedSocketData(reads, writes));
Zhongyi Shi5f587cc2017-11-21 23:24:178735 socket_factory_->AddSocketDataProvider(sequenced_socket_data.get());
fayang3bcb8b502016-12-07 21:44:378736 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
8737 std::unique_ptr<SequencedSocketData> sequenced_socket_data1(
Ryan Sleevib8d7ea02018-05-07 20:01:018738 new SequencedSocketData(reads, writes));
Zhongyi Shi5f587cc2017-11-21 23:24:178739 socket_factory_->AddSocketDataProvider(sequenced_socket_data1.get());
fayang3bcb8b502016-12-07 21:44:378740 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data1));
bnc47eba7d2016-07-01 00:43:388741
zhongyi98d6a9262017-05-19 02:47:458742 QuicStreamRequest request1(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338743 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038744 request1.Request(
8745 destination, version_, PRIVACY_MODE_DISABLED, DEFAULT_PRIORITY,
8746 SocketTag(),
8747 /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
8748 failed_on_default_network_callback_, callback_.callback()));
bnc47eba7d2016-07-01 00:43:388749 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:248750 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
bnc47eba7d2016-07-01 00:43:388751 EXPECT_TRUE(stream1.get());
8752 EXPECT_TRUE(HasActiveSession(origin1_));
8753
8754 TestCompletionCallback callback2;
zhongyi98d6a9262017-05-19 02:47:458755 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338756 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038757 request2.Request(
8758 destination, version_, PRIVACY_MODE_ENABLED, DEFAULT_PRIORITY,
8759 SocketTag(),
8760 /*cert_verify_flags=*/0, url2, net_log_, &net_error_details_,
8761 failed_on_default_network_callback_, callback2.callback()));
bnc47eba7d2016-07-01 00:43:388762 EXPECT_EQ(OK, callback2.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:248763 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
bnc47eba7d2016-07-01 00:43:388764 EXPECT_TRUE(stream2.get());
8765
8766 // |request2| does not pool to the first session, because PrivacyMode does not
8767 // match. Instead, another session is opened to the same destination, but
Ryan Hamilton8d9ee76e2018-05-29 23:52:528768 // with a different quic::QuicServerId.
rchf0b18c8a2017-05-05 19:31:578769 QuicChromiumClientSession::Handle* session1 =
8770 QuicHttpStreamPeer::GetSessionHandle(stream1.get());
8771 QuicChromiumClientSession::Handle* session2 =
8772 QuicHttpStreamPeer::GetSessionHandle(stream2.get());
8773 EXPECT_FALSE(session1->SharesSameSession(*session2));
bnc47eba7d2016-07-01 00:43:388774
Ryan Hamilton4f0b26e2018-06-27 23:52:328775 EXPECT_EQ(quic::QuicServerId(origin1_.host(), origin1_.port(), false),
bnc47eba7d2016-07-01 00:43:388776 session1->server_id());
Ryan Hamilton4f0b26e2018-06-27 23:52:328777 EXPECT_EQ(quic::QuicServerId(origin2_.host(), origin2_.port(), true),
bnc47eba7d2016-07-01 00:43:388778 session2->server_id());
8779
8780 EXPECT_TRUE(AllDataConsumed());
8781}
8782
bnc359ed2a2016-04-29 20:43:458783// QuicStreamRequest is not pooled if certificate does not match its origin.
8784TEST_P(QuicStreamFactoryWithDestinationTest, DisjointCertificate) {
8785 Initialize();
8786
8787 GURL url1("https://news.example.org/");
8788 GURL url2("https://mail.example.com/");
8789 origin1_ = HostPortPair::FromURL(url1);
8790 origin2_ = HostPortPair::FromURL(url2);
8791
8792 HostPortPair destination = GetDestination();
8793
8794 scoped_refptr<X509Certificate> cert1(
8795 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
Ryan Sleevidef35f62018-01-23 21:12:248796 ASSERT_TRUE(cert1->VerifyNameMatch(origin1_.host()));
8797 ASSERT_FALSE(cert1->VerifyNameMatch(origin2_.host()));
8798 ASSERT_FALSE(cert1->VerifyNameMatch(kDifferentHostname));
bnc359ed2a2016-04-29 20:43:458799
8800 ProofVerifyDetailsChromium verify_details1;
8801 verify_details1.cert_verify_result.verified_cert = cert1;
8802 verify_details1.cert_verify_result.is_issued_by_known_root = true;
8803 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
8804
8805 scoped_refptr<X509Certificate> cert2(
8806 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
Ryan Sleevidef35f62018-01-23 21:12:248807 ASSERT_TRUE(cert2->VerifyNameMatch(origin2_.host()));
8808 ASSERT_FALSE(cert2->VerifyNameMatch(kDifferentHostname));
bnc359ed2a2016-04-29 20:43:458809
8810 ProofVerifyDetailsChromium verify_details2;
8811 verify_details2.cert_verify_result.verified_cert = cert2;
8812 verify_details2.cert_verify_result.is_issued_by_known_root = true;
8813 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
8814
fayang3bcb8b502016-12-07 21:44:378815 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
Ryan Hamilton8d9ee76e2018-05-29 23:52:528816 std::unique_ptr<quic::QuicEncryptedPacket> settings_packet(
rch5cb522462017-04-25 20:18:368817 client_maker_.MakeInitialSettingsPacket(1, nullptr));
bnceb9aa7112017-01-05 01:03:468818 MockWrite writes[] = {MockWrite(SYNCHRONOUS, settings_packet->data(),
8819 settings_packet->length(), 1)};
fayang3bcb8b502016-12-07 21:44:378820 std::unique_ptr<SequencedSocketData> sequenced_socket_data(
Ryan Sleevib8d7ea02018-05-07 20:01:018821 new SequencedSocketData(reads, writes));
Zhongyi Shi5f587cc2017-11-21 23:24:178822 socket_factory_->AddSocketDataProvider(sequenced_socket_data.get());
fayang3bcb8b502016-12-07 21:44:378823 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
8824 std::unique_ptr<SequencedSocketData> sequenced_socket_data1(
Ryan Sleevib8d7ea02018-05-07 20:01:018825 new SequencedSocketData(reads, writes));
Zhongyi Shi5f587cc2017-11-21 23:24:178826 socket_factory_->AddSocketDataProvider(sequenced_socket_data1.get());
fayang3bcb8b502016-12-07 21:44:378827 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data1));
bnc359ed2a2016-04-29 20:43:458828
zhongyi98d6a9262017-05-19 02:47:458829 QuicStreamRequest request1(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:038830 EXPECT_EQ(
8831 ERR_IO_PENDING,
8832 request1.Request(
8833 destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
8834 /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
8835 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:018836 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:248837 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
bnc359ed2a2016-04-29 20:43:458838 EXPECT_TRUE(stream1.get());
8839 EXPECT_TRUE(HasActiveSession(origin1_));
8840
8841 TestCompletionCallback callback2;
zhongyi98d6a9262017-05-19 02:47:458842 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:038843 EXPECT_EQ(
8844 ERR_IO_PENDING,
8845 request2.Request(
8846 destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
8847 /*cert_verify_flags=*/0, url2, net_log_, &net_error_details_,
8848 failed_on_default_network_callback_, callback2.callback()));
robpercival214763f2016-07-01 23:27:018849 EXPECT_THAT(callback2.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:248850 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
bnc359ed2a2016-04-29 20:43:458851 EXPECT_TRUE(stream2.get());
8852
8853 // |request2| does not pool to the first session, because the certificate does
8854 // not match. Instead, another session is opened to the same destination, but
Ryan Hamilton8d9ee76e2018-05-29 23:52:528855 // with a different quic::QuicServerId.
rchf0b18c8a2017-05-05 19:31:578856 QuicChromiumClientSession::Handle* session1 =
8857 QuicHttpStreamPeer::GetSessionHandle(stream1.get());
8858 QuicChromiumClientSession::Handle* session2 =
8859 QuicHttpStreamPeer::GetSessionHandle(stream2.get());
8860 EXPECT_FALSE(session1->SharesSameSession(*session2));
bnc359ed2a2016-04-29 20:43:458861
Ryan Hamilton4f0b26e2018-06-27 23:52:328862 EXPECT_EQ(quic::QuicServerId(origin1_.host(), origin1_.port(),
8863 privacy_mode_ == PRIVACY_MODE_ENABLED),
8864 session1->server_id());
8865 EXPECT_EQ(quic::QuicServerId(origin2_.host(), origin2_.port(),
8866 privacy_mode_ == PRIVACY_MODE_ENABLED),
8867 session2->server_id());
bnc359ed2a2016-04-29 20:43:458868
8869 EXPECT_TRUE(AllDataConsumed());
8870}
8871
msramek992625ec2016-08-04 18:33:588872// This test verifies that QuicStreamFactory::ClearCachedStatesInCryptoConfig
8873// correctly transform an origin filter to a ServerIdFilter. Whether the
8874// deletion itself works correctly is tested in QuicCryptoClientConfigTest.
8875TEST_P(QuicStreamFactoryTest, ClearCachedStatesInCryptoConfig) {
8876 Initialize();
Ryan Hamilton8d9ee76e2018-05-29 23:52:528877 quic::QuicCryptoClientConfig* crypto_config =
msramek992625ec2016-08-04 18:33:588878 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
8879
8880 struct TestCase {
8881 TestCase(const std::string& host,
8882 int port,
8883 PrivacyMode privacy_mode,
Ryan Hamilton8d9ee76e2018-05-29 23:52:528884 quic::QuicCryptoClientConfig* crypto_config)
msramek992625ec2016-08-04 18:33:588885 : server_id(host, port, privacy_mode),
8886 state(crypto_config->LookupOrCreate(server_id)) {
rch872e00e2016-12-02 02:48:188887 std::vector<string> certs(1);
msramek992625ec2016-08-04 18:33:588888 certs[0] = "cert";
8889 state->SetProof(certs, "cert_sct", "chlo_hash", "signature");
8890 state->set_source_address_token("TOKEN");
8891 state->SetProofValid();
8892
8893 EXPECT_FALSE(state->certs().empty());
8894 }
8895
Ryan Hamilton8d9ee76e2018-05-29 23:52:528896 quic::QuicServerId server_id;
8897 quic::QuicCryptoClientConfig::CachedState* state;
msramek992625ec2016-08-04 18:33:588898 } test_cases[] = {
8899 TestCase("www.google.com", 443, privacy_mode_, crypto_config),
8900 TestCase("www.example.com", 443, privacy_mode_, crypto_config),
8901 TestCase("www.example.com", 4433, privacy_mode_, crypto_config)};
8902
8903 // Clear cached states for the origin https://www.example.com:4433.
8904 GURL origin("https://www.example.com:4433");
csharrisonebeca8e2016-10-18 02:35:368905 factory_->ClearCachedStatesInCryptoConfig(base::Bind(
8906 static_cast<bool (*)(const GURL&, const GURL&)>(::operator==), origin));
msramek992625ec2016-08-04 18:33:588907 EXPECT_FALSE(test_cases[0].state->certs().empty());
8908 EXPECT_FALSE(test_cases[1].state->certs().empty());
8909 EXPECT_TRUE(test_cases[2].state->certs().empty());
8910
8911 // Clear all cached states.
8912 factory_->ClearCachedStatesInCryptoConfig(
8913 base::Callback<bool(const GURL&)>());
8914 EXPECT_TRUE(test_cases[0].state->certs().empty());
8915 EXPECT_TRUE(test_cases[1].state->certs().empty());
8916 EXPECT_TRUE(test_cases[2].state->certs().empty());
8917}
8918
Yixin Wang46a425f2017-08-10 23:02:208919// Passes connection options and client connection options to QuicStreamFactory,
Ryan Hamilton8d9ee76e2018-05-29 23:52:528920// then checks that its internal quic::QuicConfig is correct.
Yixin Wang46a425f2017-08-10 23:02:208921TEST_P(QuicStreamFactoryTest, ConfigConnectionOptions) {
Zhongyi Shi967d2f12019-02-08 20:58:538922 test_params_.quic_connection_options.push_back(quic::kTIME);
8923 test_params_.quic_connection_options.push_back(quic::kTBBR);
8924 test_params_.quic_connection_options.push_back(quic::kREJ);
Yixin Wang46a425f2017-08-10 23:02:208925
Zhongyi Shi967d2f12019-02-08 20:58:538926 test_params_.quic_client_connection_options.push_back(quic::kTBBR);
8927 test_params_.quic_client_connection_options.push_back(quic::k1RTT);
Yixin Wang46a425f2017-08-10 23:02:208928
8929 Initialize();
8930
Ryan Hamilton8d9ee76e2018-05-29 23:52:528931 const quic::QuicConfig* config =
8932 QuicStreamFactoryPeer::GetConfig(factory_.get());
Zhongyi Shi967d2f12019-02-08 20:58:538933 EXPECT_EQ(test_params_.quic_connection_options,
8934 config->SendConnectionOptions());
Yixin Wang46a425f2017-08-10 23:02:208935 EXPECT_TRUE(config->HasClientRequestedIndependentOption(
Ryan Hamilton8d9ee76e2018-05-29 23:52:528936 quic::kTBBR, quic::Perspective::IS_CLIENT));
Yixin Wang46a425f2017-08-10 23:02:208937 EXPECT_TRUE(config->HasClientRequestedIndependentOption(
Ryan Hamilton8d9ee76e2018-05-29 23:52:528938 quic::k1RTT, quic::Perspective::IS_CLIENT));
Yixin Wang46a425f2017-08-10 23:02:208939}
8940
Yixin Wang247ea642017-11-15 01:15:508941// Verifies that the host resolver uses the request priority passed to
8942// QuicStreamRequest::Request().
8943TEST_P(QuicStreamFactoryTest, HostResolverUsesRequestPriority) {
8944 Initialize();
8945 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8946 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8947
8948 MockQuicData socket_data;
8949 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:438950 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:178951 socket_data.AddSocketDataToFactory(socket_factory_.get());
Yixin Wang247ea642017-11-15 01:15:508952
8953 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338954 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038955 request.Request(
8956 host_port_pair_, version_, privacy_mode_, MAXIMUM_PRIORITY,
8957 SocketTag(),
8958 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8959 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang247ea642017-11-15 01:15:508960
8961 EXPECT_THAT(callback_.WaitForResult(), IsOk());
8962 std::unique_ptr<HttpStream> stream = CreateStream(&request);
8963 EXPECT_TRUE(stream.get());
8964
Renjiea0cb4a2c2018-09-26 23:37:308965 EXPECT_EQ(MAXIMUM_PRIORITY, host_resolver_->last_request_priority());
Yixin Wang247ea642017-11-15 01:15:508966
8967 EXPECT_TRUE(socket_data.AllReadDataConsumed());
8968 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
8969}
8970
Lily Chenf11e1292018-11-29 16:42:098971TEST_P(QuicStreamFactoryTest, HostResolverRequestReprioritizedOnSetPriority) {
8972 Initialize();
8973 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8974 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8975
8976 MockQuicData socket_data;
8977 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
8978 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
8979 socket_data.AddSocketDataToFactory(socket_factory_.get());
8980
8981 QuicStreamRequest request(factory_.get());
8982 EXPECT_EQ(ERR_IO_PENDING,
8983 request.Request(
8984 host_port_pair_, version_, privacy_mode_, MAXIMUM_PRIORITY,
8985 SocketTag(),
8986 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8987 failed_on_default_network_callback_, callback_.callback()));
8988
8989 EXPECT_EQ(MAXIMUM_PRIORITY, host_resolver_->last_request_priority());
8990 EXPECT_EQ(MAXIMUM_PRIORITY, host_resolver_->request_priority(1));
8991
8992 QuicStreamRequest request2(factory_.get());
8993 EXPECT_EQ(ERR_IO_PENDING,
8994 request2.Request(
8995 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8996 SocketTag(),
8997 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
8998 failed_on_default_network_callback_, callback_.callback()));
8999 EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->last_request_priority());
9000 EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->request_priority(2));
9001
9002 request.SetPriority(LOWEST);
9003 EXPECT_EQ(LOWEST, host_resolver_->request_priority(1));
9004 EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->request_priority(2));
9005}
9006
Zhongyi Shi967d2f12019-02-08 20:58:539007// Passes |quic_max_time_before_crypto_handshake_seconds| and
9008// |quic_max_idle_time_before_crypto_handshake_seconds| to QuicStreamFactory,
Ryan Hamilton8d9ee76e2018-05-29 23:52:529009// checks that its internal quic::QuicConfig is correct.
Yixin Wang469da562017-11-15 21:34:589010TEST_P(QuicStreamFactoryTest, ConfigMaxTimeBeforeCryptoHandshake) {
Zhongyi Shi967d2f12019-02-08 20:58:539011 test_params_.quic_max_time_before_crypto_handshake_seconds = 11;
9012 test_params_.quic_max_idle_time_before_crypto_handshake_seconds = 13;
Yixin Wang469da562017-11-15 21:34:589013 Initialize();
9014
Ryan Hamilton8d9ee76e2018-05-29 23:52:529015 const quic::QuicConfig* config =
9016 QuicStreamFactoryPeer::GetConfig(factory_.get());
9017 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(11),
Yixin Wang469da562017-11-15 21:34:589018 config->max_time_before_crypto_handshake());
Ryan Hamilton8d9ee76e2018-05-29 23:52:529019 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(13),
Yixin Wang469da562017-11-15 21:34:589020 config->max_idle_time_before_crypto_handshake());
9021}
9022
Yixin Wang7c5d11a82017-12-21 02:40:009023// Verify ResultAfterHostResolutionCallback behavior when host resolution
9024// succeeds asynchronously, then crypto handshake fails synchronously.
9025TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackAsyncSync) {
9026 Initialize();
9027 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9028 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9029
Renjiea0cb4a2c2018-09-26 23:37:309030 host_resolver_->set_ondemand_mode(true);
Yixin Wang7c5d11a82017-12-21 02:40:009031
9032 MockQuicData socket_data;
9033 socket_data.AddRead(SYNCHRONOUS, ERR_FAILED);
9034 socket_data.AddWrite(SYNCHRONOUS, ERR_FAILED);
9035 socket_data.AddSocketDataToFactory(socket_factory_.get());
9036
9037 QuicStreamRequest request(factory_.get());
9038 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:039039 request.Request(
9040 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9041 SocketTag(),
9042 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9043 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:009044
9045 TestCompletionCallback host_resolution_callback;
9046 EXPECT_TRUE(
9047 request.WaitForHostResolution(host_resolution_callback.callback()));
9048
9049 // |host_resolver_| has not finished host resolution at this point, so
9050 // |host_resolution_callback| should not have a result.
9051 base::RunLoop().RunUntilIdle();
9052 EXPECT_FALSE(host_resolution_callback.have_result());
9053
9054 // Allow |host_resolver_| to finish host resolution.
9055 // Since the request fails immediately after host resolution (getting
9056 // ERR_FAILED from socket reads/writes), |host_resolution_callback| should be
9057 // called with ERR_QUIC_PROTOCOL_ERROR since that's the next result in
9058 // forming the connection.
Renjiea0cb4a2c2018-09-26 23:37:309059 host_resolver_->ResolveAllPending();
Yixin Wang7c5d11a82017-12-21 02:40:009060 base::RunLoop().RunUntilIdle();
9061 EXPECT_TRUE(host_resolution_callback.have_result());
9062 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, host_resolution_callback.WaitForResult());
9063
9064 // Calling WaitForHostResolution() a second time should return
9065 // false since host resolution has finished already.
9066 EXPECT_FALSE(
9067 request.WaitForHostResolution(host_resolution_callback.callback()));
9068
9069 EXPECT_TRUE(callback_.have_result());
9070 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback_.WaitForResult());
9071}
9072
9073// Verify ResultAfterHostResolutionCallback behavior when host resolution
9074// succeeds asynchronously, then crypto handshake fails asynchronously.
9075TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackAsyncAsync) {
9076 Initialize();
9077 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9078 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9079
Renjiea0cb4a2c2018-09-26 23:37:309080 host_resolver_->set_ondemand_mode(true);
Yixin Wang7c5d11a82017-12-21 02:40:009081 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:279082 MockCryptoClientStream::ZERO_RTT);
Yixin Wang7c5d11a82017-12-21 02:40:009083 factory_->set_require_confirmation(true);
9084
9085 MockQuicData socket_data;
9086 socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
9087 socket_data.AddRead(ASYNC, ERR_FAILED);
9088 socket_data.AddWrite(ASYNC, ERR_FAILED);
9089 socket_data.AddSocketDataToFactory(socket_factory_.get());
9090
9091 QuicStreamRequest request(factory_.get());
9092 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:039093 request.Request(
9094 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9095 SocketTag(),
9096 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9097 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:009098
9099 TestCompletionCallback host_resolution_callback;
9100 EXPECT_TRUE(
9101 request.WaitForHostResolution(host_resolution_callback.callback()));
9102
9103 // |host_resolver_| has not finished host resolution at this point, so
9104 // |host_resolution_callback| should not have a result.
9105 base::RunLoop().RunUntilIdle();
9106 EXPECT_FALSE(host_resolution_callback.have_result());
9107
9108 // Allow |host_resolver_| to finish host resolution. Since crypto handshake
9109 // will hang after host resolution, |host_resolution_callback| should run with
9110 // ERR_IO_PENDING since that's the next result in forming the connection.
Renjiea0cb4a2c2018-09-26 23:37:309111 host_resolver_->ResolveAllPending();
Yixin Wang7c5d11a82017-12-21 02:40:009112 base::RunLoop().RunUntilIdle();
9113 EXPECT_TRUE(host_resolution_callback.have_result());
9114 EXPECT_EQ(ERR_IO_PENDING, host_resolution_callback.WaitForResult());
9115
9116 // Calling WaitForHostResolution() a second time should return
9117 // false since host resolution has finished already.
9118 EXPECT_FALSE(
9119 request.WaitForHostResolution(host_resolution_callback.callback()));
9120
9121 EXPECT_FALSE(callback_.have_result());
9122 socket_data.GetSequencedSocketData()->Resume();
9123 base::RunLoop().RunUntilIdle();
9124 EXPECT_TRUE(callback_.have_result());
9125 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback_.WaitForResult());
9126}
9127
9128// Verify ResultAfterHostResolutionCallback behavior when host resolution
9129// succeeds synchronously, then crypto handshake fails synchronously.
9130TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackSyncSync) {
9131 Initialize();
9132 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9133 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9134
Renjiea0cb4a2c2018-09-26 23:37:309135 host_resolver_->set_synchronous_mode(true);
Yixin Wang7c5d11a82017-12-21 02:40:009136
9137 MockQuicData socket_data;
9138 socket_data.AddRead(SYNCHRONOUS, ERR_FAILED);
9139 socket_data.AddWrite(SYNCHRONOUS, ERR_FAILED);
9140 socket_data.AddSocketDataToFactory(socket_factory_.get());
9141
9142 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:339143 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR,
Zhongyi Shia6b68d112018-09-24 07:49:039144 request.Request(
9145 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9146 SocketTag(),
9147 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9148 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:009149
9150 // WaitForHostResolution() should return false since host
9151 // resolution has finished already.
9152 TestCompletionCallback host_resolution_callback;
9153 EXPECT_FALSE(
9154 request.WaitForHostResolution(host_resolution_callback.callback()));
9155 base::RunLoop().RunUntilIdle();
9156 EXPECT_FALSE(host_resolution_callback.have_result());
9157 EXPECT_FALSE(callback_.have_result());
9158}
9159
9160// Verify ResultAfterHostResolutionCallback behavior when host resolution
9161// succeeds synchronously, then crypto handshake fails asynchronously.
9162TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackSyncAsync) {
9163 Initialize();
9164 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9165 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9166
9167 // Host resolution will succeed synchronously, but Request() as a whole
9168 // will fail asynchronously.
Renjiea0cb4a2c2018-09-26 23:37:309169 host_resolver_->set_synchronous_mode(true);
Yixin Wang7c5d11a82017-12-21 02:40:009170 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:279171 MockCryptoClientStream::ZERO_RTT);
Yixin Wang7c5d11a82017-12-21 02:40:009172 factory_->set_require_confirmation(true);
9173
9174 MockQuicData socket_data;
9175 socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
9176 socket_data.AddRead(ASYNC, ERR_FAILED);
9177 socket_data.AddWrite(ASYNC, ERR_FAILED);
9178 socket_data.AddSocketDataToFactory(socket_factory_.get());
9179
9180 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:339181 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:039182 request.Request(
9183 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9184 SocketTag(),
9185 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9186 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:009187
9188 // WaitForHostResolution() should return false since host
9189 // resolution has finished already.
9190 TestCompletionCallback host_resolution_callback;
9191 EXPECT_FALSE(
9192 request.WaitForHostResolution(host_resolution_callback.callback()));
9193 base::RunLoop().RunUntilIdle();
9194 EXPECT_FALSE(host_resolution_callback.have_result());
9195
9196 EXPECT_FALSE(callback_.have_result());
9197 socket_data.GetSequencedSocketData()->Resume();
9198 base::RunLoop().RunUntilIdle();
9199 EXPECT_TRUE(callback_.have_result());
9200 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback_.WaitForResult());
9201}
9202
9203// Verify ResultAfterHostResolutionCallback behavior when host resolution fails
9204// synchronously.
9205TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackFailSync) {
9206 Initialize();
9207 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9208 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9209
9210 // Host resolution will fail synchronously.
Renjiea0cb4a2c2018-09-26 23:37:309211 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
9212 host_resolver_->set_synchronous_mode(true);
Yixin Wang7c5d11a82017-12-21 02:40:009213
9214 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:339215 EXPECT_EQ(ERR_NAME_NOT_RESOLVED,
Zhongyi Shia6b68d112018-09-24 07:49:039216 request.Request(
9217 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9218 SocketTag(),
9219 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9220 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:009221
9222 // WaitForHostResolution() should return false since host
9223 // resolution has failed already.
9224 TestCompletionCallback host_resolution_callback;
9225 EXPECT_FALSE(
9226 request.WaitForHostResolution(host_resolution_callback.callback()));
9227 base::RunLoop().RunUntilIdle();
9228 EXPECT_FALSE(host_resolution_callback.have_result());
9229}
9230
9231// Verify ResultAfterHostResolutionCallback behavior when host resolution fails
9232// asynchronously.
9233TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackFailAsync) {
9234 Initialize();
9235 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9236 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9237
Renjiea0cb4a2c2018-09-26 23:37:309238 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
Yixin Wang7c5d11a82017-12-21 02:40:009239
9240 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:339241 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:039242 request.Request(
9243 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9244 SocketTag(),
9245 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9246 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:009247
9248 TestCompletionCallback host_resolution_callback;
9249 EXPECT_TRUE(
9250 request.WaitForHostResolution(host_resolution_callback.callback()));
9251
9252 // Allow |host_resolver_| to fail host resolution. |host_resolution_callback|
9253 // Should run with ERR_NAME_NOT_RESOLVED since that's the error host
9254 // resolution failed with.
9255 base::RunLoop().RunUntilIdle();
9256 EXPECT_TRUE(host_resolution_callback.have_result());
9257 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, host_resolution_callback.WaitForResult());
9258
9259 EXPECT_TRUE(callback_.have_result());
9260 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
9261}
9262
Renjiea0cb4a2c2018-09-26 23:37:309263// With dns race experiment turned on, and DNS resolve succeeds synchronously,
9264// the final connection is established through the resolved DNS. No racing
9265// connection.
9266TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceAndHostResolutionSync) {
Zhongyi Shi967d2f12019-02-08 20:58:539267 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309268 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9269 Initialize();
9270 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9271 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9272
9273 // Set an address in resolver for synchronous return.
9274 host_resolver_->set_synchronous_mode(true);
9275 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9276 kNonCachedIPAddress, "");
9277
9278 // Set up a different address in stale resolver cache.
9279 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9280 HostCache::Entry entry(OK,
9281 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9282 HostCache::Entry::SOURCE_DNS);
9283 base::TimeDelta zero;
9284 HostCache* cache = host_resolver_->GetHostCache();
9285 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9286 // Expire the cache
9287 cache->OnNetworkChange();
Renjie8d2d8d91b2018-09-29 00:29:039288
Renjiea0cb4a2c2018-09-26 23:37:309289 MockQuicData quic_data;
9290 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9291 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9292 quic_data.AddSocketDataToFactory(socket_factory_.get());
9293
9294 QuicStreamRequest request(factory_.get());
9295 EXPECT_THAT(request.Request(
9296 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9297 SocketTag(),
9298 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9299 failed_on_default_network_callback_, callback_.callback()),
9300 IsOk());
9301 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9302 EXPECT_TRUE(stream.get());
9303 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9304 EXPECT_EQ(
9305 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9306 kNonCachedIPAddress);
9307
9308 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9309 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9310}
9311
9312// With dns race experiment on, DNS resolve returns async, no matching cache in
9313// host resolver, connection should be successful and through resolved DNS. No
9314// racing connection.
9315TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceAndHostResolutionAsync) {
Renjiea0cb4a2c2018-09-26 23:37:309316 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9317 Initialize();
9318 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9319 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9320
9321 // Set an address in resolver for asynchronous return.
9322 host_resolver_->set_ondemand_mode(true);
9323 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9324 kNonCachedIPAddress, "");
9325
9326 MockQuicData quic_data;
9327 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9328 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9329 quic_data.AddSocketDataToFactory(socket_factory_.get());
9330
9331 QuicStreamRequest request(factory_.get());
9332 EXPECT_EQ(ERR_IO_PENDING,
9333 request.Request(
9334 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9335 SocketTag(),
9336 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9337 failed_on_default_network_callback_, callback_.callback()));
9338 TestCompletionCallback host_resolution_callback;
9339 EXPECT_TRUE(
9340 request.WaitForHostResolution(host_resolution_callback.callback()));
9341 base::RunLoop().RunUntilIdle();
9342 EXPECT_FALSE(host_resolution_callback.have_result());
9343
9344 // Cause the host resolution to return.
9345 host_resolver_->ResolveAllPending();
9346 EXPECT_THAT(host_resolution_callback.WaitForResult(), IsOk());
9347 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9348
9349 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9350 EXPECT_TRUE(stream.get());
9351 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9352
9353 EXPECT_EQ(
9354 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9355 kNonCachedIPAddress);
9356
9357 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9358 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9359}
9360
9361// With dns race experiment on, DNS resolve returns async, stale dns used,
9362// connects synchrounously, and then the resolved DNS matches.
9363TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsyncStaleMatch) {
Zhongyi Shi967d2f12019-02-08 20:58:539364 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309365 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9366 Initialize();
9367 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9368 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9369
9370 // Set an address in resolver for asynchronous return.
9371 host_resolver_->set_ondemand_mode(true);
9372 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9373 kCachedIPAddress.ToString(), "");
9374
9375 // Set up the same address in the stale resolver cache.
9376 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9377 HostCache::Entry entry(OK,
9378 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9379 HostCache::Entry::SOURCE_DNS);
9380 base::TimeDelta zero;
9381 HostCache* cache = host_resolver_->GetHostCache();
9382 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9383 // Expire the cache
9384 cache->OnNetworkChange();
9385
9386 MockQuicData quic_data;
9387 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9388 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9389 quic_data.AddSocketDataToFactory(socket_factory_.get());
9390
9391 QuicStreamRequest request(factory_.get());
9392 EXPECT_EQ(ERR_IO_PENDING,
9393 request.Request(
9394 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9395 SocketTag(),
9396 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9397 failed_on_default_network_callback_, callback_.callback()));
9398
9399 // Check that the racing job is running.
9400 EXPECT_TRUE(HasLiveSession(host_port_pair_));
9401 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9402
9403 // Resolve dns and return.
9404 host_resolver_->ResolveAllPending();
9405 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9406 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9407 EXPECT_TRUE(stream.get());
9408
9409 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9410
9411 EXPECT_EQ(
9412 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9413 kCachedIPAddress.ToString());
9414
9415 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9416 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9417}
9418
9419// With dns race experiment on, dns resolve async, stale dns used, connect
9420// async, and then the result matches.
9421TEST_P(QuicStreamFactoryTest,
9422 ResultAfterDNSRaceHostResolveAsyncConnectAsyncStaleMatch) {
Zhongyi Shi967d2f12019-02-08 20:58:539423 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309424 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9425 Initialize();
9426 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9427 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9428
9429 // Set an address in resolver for asynchronous return.
9430 host_resolver_->set_ondemand_mode(true);
9431 factory_->set_require_confirmation(true);
9432 crypto_client_stream_factory_.set_handshake_mode(
9433 MockCryptoClientStream::ZERO_RTT);
9434 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9435 kCachedIPAddress.ToString(), "");
9436
9437 // Set up the same address in the stale resolver cache.
9438 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9439 HostCache::Entry entry(OK,
9440 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9441 HostCache::Entry::SOURCE_DNS);
9442 base::TimeDelta zero;
9443 HostCache* cache = host_resolver_->GetHostCache();
9444 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9445 // Expire the cache
9446 cache->OnNetworkChange();
9447
9448 MockQuicData quic_data;
9449 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9450 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9451 quic_data.AddSocketDataToFactory(socket_factory_.get());
9452
9453 QuicStreamRequest request(factory_.get());
9454 EXPECT_EQ(ERR_IO_PENDING,
9455 request.Request(
9456 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9457 SocketTag(),
9458 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9459 failed_on_default_network_callback_, callback_.callback()));
9460
9461 // Send Crypto handshake so connect will call back.
9462 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
9463 quic::QuicSession::HANDSHAKE_CONFIRMED);
9464 base::RunLoop().RunUntilIdle();
9465
9466 // Check that the racing job is running.
9467 EXPECT_TRUE(HasLiveSession(host_port_pair_));
9468 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9469
9470 // Resolve dns and call back, make sure job finishes.
9471 host_resolver_->ResolveAllPending();
9472 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9473
9474 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9475 EXPECT_TRUE(stream.get());
9476
9477 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9478
9479 EXPECT_EQ(
9480 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9481 kCachedIPAddress.ToString());
9482
9483 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9484 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9485}
9486
9487// With dns race experiment on, dns resolve async, stale dns used, dns resolve
9488// return, then connection finishes and matches with the result.
9489TEST_P(QuicStreamFactoryTest,
9490 ResultAfterDNSRaceHostResolveAsyncStaleMatchConnectAsync) {
Zhongyi Shi967d2f12019-02-08 20:58:539491 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309492 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9493 Initialize();
9494 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9495 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9496
9497 // Set an address in resolver for asynchronous return.
9498 host_resolver_->set_ondemand_mode(true);
9499 factory_->set_require_confirmation(true);
9500 crypto_client_stream_factory_.set_handshake_mode(
9501 MockCryptoClientStream::ZERO_RTT);
9502 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9503 kCachedIPAddress.ToString(), "");
9504
9505 // Set up the same address in the stale resolver cache.
9506 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9507 HostCache::Entry entry(OK,
9508 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9509 HostCache::Entry::SOURCE_DNS);
9510 base::TimeDelta zero;
9511 HostCache* cache = host_resolver_->GetHostCache();
9512 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9513 // Expire the cache
9514 cache->OnNetworkChange();
9515
9516 MockQuicData quic_data;
9517 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9518 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9519 quic_data.AddSocketDataToFactory(socket_factory_.get());
9520
9521 QuicStreamRequest request(factory_.get());
9522 EXPECT_EQ(ERR_IO_PENDING,
9523 request.Request(
9524 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9525 SocketTag(),
9526 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9527 failed_on_default_network_callback_, callback_.callback()));
9528
9529 // Finish dns async, check we still need to wait for stale connection async.
9530 host_resolver_->ResolveAllPending();
9531 base::RunLoop().RunUntilIdle();
9532 EXPECT_FALSE(callback_.have_result());
9533
9534 // Finish stale connection async, and the stale connection should pass dns
9535 // validation.
9536 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
9537 quic::QuicSession::HANDSHAKE_CONFIRMED);
9538 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9539 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9540 EXPECT_TRUE(stream.get());
9541
9542 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9543 EXPECT_EQ(
9544 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9545 kCachedIPAddress.ToString());
9546
9547 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9548 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9549}
9550
9551// With dns race experiment on, dns resolve async, stale used and connects
9552// sync, but dns no match
9553TEST_P(QuicStreamFactoryTest,
9554 ResultAfterDNSRaceHostResolveAsyncStaleSyncNoMatch) {
Zhongyi Shi967d2f12019-02-08 20:58:539555 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309556 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9557 Initialize();
9558 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9559 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9560
9561 // Set an address in resolver for asynchronous return.
9562 host_resolver_->set_ondemand_mode(true);
9563 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9564 kNonCachedIPAddress, "");
9565
9566 // Set up a different address in the stale resolver cache.
9567 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9568 HostCache::Entry entry(OK,
9569 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9570 HostCache::Entry::SOURCE_DNS);
9571 base::TimeDelta zero;
9572 HostCache* cache = host_resolver_->GetHostCache();
9573 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9574 // Expire the cache
9575 cache->OnNetworkChange();
9576
9577 // Socket for the stale connection which will invoke connection closure.
9578 MockQuicData quic_data;
9579 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9580 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9581 quic_data.AddWrite(
Renjief5fcb172019-02-05 01:59:339582 SYNCHRONOUS,
9583 client_maker_.MakeConnectionClosePacket(
9584 2, true, quic::QUIC_STALE_CONNECTION_CANCELLED, "net error"));
Renjiea0cb4a2c2018-09-26 23:37:309585 quic_data.AddSocketDataToFactory(socket_factory_.get());
9586
9587 // Socket for the new connection.
9588 MockQuicData quic_data2;
9589 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9590 quic_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9591 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9592
9593 QuicStreamRequest request(factory_.get());
9594 EXPECT_EQ(ERR_IO_PENDING,
9595 request.Request(
9596 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9597 SocketTag(),
9598 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9599 failed_on_default_network_callback_, callback_.callback()));
9600
9601 // Check the stale connection is running.
9602 EXPECT_TRUE(HasLiveSession(host_port_pair_));
9603 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9604
9605 // Finish dns resolution and check the job has finished.
9606 host_resolver_->ResolveAllPending();
9607 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9608
9609 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9610 EXPECT_TRUE(stream.get());
9611
9612 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9613
9614 EXPECT_EQ(
9615 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9616 kNonCachedIPAddress);
9617
9618 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9619 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9620 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
9621 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
9622}
9623
9624// With dns race experiment on, dns resolve async, stale used and connects
9625// async, finishes before dns, but no match
9626TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleAsyncResolveAsyncNoMatch) {
Zhongyi Shi967d2f12019-02-08 20:58:539627 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309628 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9629 Initialize();
9630 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9631 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9632
9633 // Set an address in resolver for asynchronous return.
9634 host_resolver_->set_ondemand_mode(true);
9635 factory_->set_require_confirmation(true);
9636 crypto_client_stream_factory_.set_handshake_mode(
9637 MockCryptoClientStream::ZERO_RTT);
9638 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9639 kNonCachedIPAddress, "");
9640
9641 // Set up a different address in the stale resolvercache.
9642 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9643 HostCache::Entry entry(OK,
9644 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9645 HostCache::Entry::SOURCE_DNS);
9646 base::TimeDelta zero;
9647 HostCache* cache = host_resolver_->GetHostCache();
9648 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9649 // Expire the cache
9650 cache->OnNetworkChange();
9651
9652 MockQuicData quic_data;
9653 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9654 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9655 quic_data.AddWrite(
Renjief5fcb172019-02-05 01:59:339656 SYNCHRONOUS,
9657 client_maker_.MakeConnectionClosePacket(
9658 2, true, quic::QUIC_STALE_CONNECTION_CANCELLED, "net error"));
Renjiea0cb4a2c2018-09-26 23:37:309659 quic_data.AddSocketDataToFactory(socket_factory_.get());
9660
9661 MockQuicData quic_data2;
9662 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9663 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9664
9665 QuicStreamRequest request(factory_.get());
9666 EXPECT_EQ(ERR_IO_PENDING,
9667 request.Request(
9668 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9669 SocketTag(),
9670 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9671 failed_on_default_network_callback_, callback_.callback()));
9672
9673 // Finish the stale connection.
9674 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
9675 quic::QuicSession::HANDSHAKE_CONFIRMED);
9676 base::RunLoop().RunUntilIdle();
9677 EXPECT_TRUE(HasLiveSession(host_port_pair_));
9678 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9679
9680 // Finish host resolution and check the job is done.
9681 host_resolver_->ResolveAllPending();
9682 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9683
9684 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9685 EXPECT_TRUE(stream.get());
9686
9687 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9688 EXPECT_EQ(
9689 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9690 kNonCachedIPAddress);
9691
9692 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9693 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9694 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
9695 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
9696}
9697
9698// With dns race experiment on, dns resolve async, stale used and connects
9699// async, dns finishes first, but no match
9700TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceResolveAsyncStaleAsyncNoMatch) {
Zhongyi Shi967d2f12019-02-08 20:58:539701 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309702 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9703 Initialize();
9704 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9705 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9706
9707 // Set an address in resolver for asynchronous return.
9708 host_resolver_->set_ondemand_mode(true);
9709 factory_->set_require_confirmation(true);
9710 crypto_client_stream_factory_.set_handshake_mode(
9711 MockCryptoClientStream::ZERO_RTT);
9712 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9713 kNonCachedIPAddress, "");
9714
9715 // Set up a different address in the stale resolver cache.
9716 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9717 HostCache::Entry entry(OK,
9718 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9719 HostCache::Entry::SOURCE_DNS);
9720 base::TimeDelta zero;
9721 HostCache* cache = host_resolver_->GetHostCache();
9722 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9723 // Expire the cache
9724 cache->OnNetworkChange();
9725
9726 MockQuicData quic_data;
9727 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Renjie8d2d8d91b2018-09-29 00:29:039728 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_INITIAL);
Renjiea0cb4a2c2018-09-26 23:37:309729 quic_data.AddWrite(
Renjief5fcb172019-02-05 01:59:339730 SYNCHRONOUS,
9731 client_maker_.MakeConnectionClosePacket(
9732 1, true, quic::QUIC_STALE_CONNECTION_CANCELLED, "net error"));
Renjiea0cb4a2c2018-09-26 23:37:309733 quic_data.AddSocketDataToFactory(socket_factory_.get());
9734
9735 MockQuicData quic_data2;
9736 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Renjie8d2d8d91b2018-09-29 00:29:039737 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_FORWARD_SECURE);
9738 quic_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Renjiea0cb4a2c2018-09-26 23:37:309739 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9740
9741 QuicStreamRequest request(factory_.get());
9742 EXPECT_EQ(ERR_IO_PENDING,
9743 request.Request(
9744 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9745 SocketTag(),
9746 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9747 failed_on_default_network_callback_, callback_.callback()));
9748 // Finish dns resolution, but need to wait for stale connection.
9749 host_resolver_->ResolveAllPending();
Renjie8d2d8d91b2018-09-29 00:29:039750 base::RunLoop().RunUntilIdle();
Renjiea0cb4a2c2018-09-26 23:37:309751 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
9752 quic::QuicSession::HANDSHAKE_CONFIRMED);
9753 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9754
9755 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9756 EXPECT_TRUE(stream.get());
9757
9758 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9759 EXPECT_EQ(
9760 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9761 kNonCachedIPAddress);
9762
9763 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9764 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9765 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
9766 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
9767}
9768
9769// With dns race experiment on, dns resolve returns error sync, same behavior
9770// as experiment is not on
9771TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveError) {
Zhongyi Shi967d2f12019-02-08 20:58:539772 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309773 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9774 Initialize();
9775 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9776 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9777
9778 // Set synchronous failure in resolver.
9779 host_resolver_->set_synchronous_mode(true);
9780 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
9781
9782 MockQuicData quic_data;
9783 quic_data.AddSocketDataToFactory(socket_factory_.get());
9784 QuicStreamRequest request(factory_.get());
9785
9786 EXPECT_EQ(ERR_NAME_NOT_RESOLVED,
9787 request.Request(
9788 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9789 SocketTag(),
9790 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9791 failed_on_default_network_callback_, callback_.callback()));
9792}
9793
9794// With dns race experiment on, no cache available, dns resolve returns error
9795// async
9796TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsyncError) {
Zhongyi Shi967d2f12019-02-08 20:58:539797 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309798 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9799 Initialize();
9800 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9801 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9802
9803 // Set asynchronous failure in resolver.
9804 host_resolver_->set_ondemand_mode(true);
9805 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
9806
9807 MockQuicData quic_data;
9808 quic_data.AddSocketDataToFactory(socket_factory_.get());
9809 QuicStreamRequest request(factory_.get());
9810
9811 EXPECT_EQ(ERR_IO_PENDING,
9812 request.Request(
9813 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9814 SocketTag(),
9815 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9816 failed_on_default_network_callback_, callback_.callback()));
9817
9818 // Resolve and expect result that shows the resolution error.
9819 host_resolver_->ResolveAllPending();
9820 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
9821}
9822
9823// With dns race experiment on, dns resolve async, staled used and connects
9824// sync, dns returns error and no connection is established.
9825TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleSyncHostResolveError) {
Zhongyi Shi967d2f12019-02-08 20:58:539826 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309827 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9828 Initialize();
9829 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9830 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9831
9832 // Set asynchronous failure in resolver.
9833 host_resolver_->set_ondemand_mode(true);
9834 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
9835
9836 // Set up an address in the stale cache.
9837 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9838 HostCache::Entry entry(OK,
9839 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9840 HostCache::Entry::SOURCE_DNS);
9841 base::TimeDelta zero;
9842 HostCache* cache = host_resolver_->GetHostCache();
9843 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9844 // Expire the cache
9845 cache->OnNetworkChange();
9846
9847 // Socket for the stale connection which is supposed to disconnect.
9848 MockQuicData quic_data;
9849 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9850 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9851 quic_data.AddWrite(
Renjief5fcb172019-02-05 01:59:339852 SYNCHRONOUS,
9853 client_maker_.MakeConnectionClosePacket(
9854 2, true, quic::QUIC_STALE_CONNECTION_CANCELLED, "net error"));
Renjiea0cb4a2c2018-09-26 23:37:309855 quic_data.AddSocketDataToFactory(socket_factory_.get());
9856
9857 QuicStreamRequest request(factory_.get());
9858 EXPECT_EQ(ERR_IO_PENDING,
9859 request.Request(
9860 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9861 SocketTag(),
9862 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9863 failed_on_default_network_callback_, callback_.callback()));
9864
9865 // Check that the stale connection is running.
9866 EXPECT_TRUE(HasLiveSession(host_port_pair_));
9867 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9868
9869 // Finish host resolution.
9870 host_resolver_->ResolveAllPending();
9871 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
9872
Renjiea0cb4a2c2018-09-26 23:37:309873 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9874 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9875}
9876
9877// With dns race experiment on, dns resolve async, stale used and connection
9878// return error, then dns matches
9879TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSMatches) {
Zhongyi Shi967d2f12019-02-08 20:58:539880 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309881 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9882 Initialize();
9883 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9884 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9885
9886 // Set an address in host resolver for asynchronous return.
9887 host_resolver_->set_ondemand_mode(true);
9888 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9889 kCachedIPAddress.ToString(), "");
9890
9891 // Set up the same address in the stale resolver cache.
9892 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9893 HostCache::Entry entry(OK,
9894 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9895 HostCache::Entry::SOURCE_DNS);
9896 base::TimeDelta zero;
9897 HostCache* cache = host_resolver_->GetHostCache();
9898 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9899 // Expire the cache
9900 cache->OnNetworkChange();
9901
9902 // Simulate synchronous connect failure.
9903 MockQuicData quic_data;
9904 quic_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
9905 quic_data.AddSocketDataToFactory(socket_factory_.get());
9906
9907 MockQuicData quic_data2;
9908 quic_data2.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
9909 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9910
9911 QuicStreamRequest request(factory_.get());
9912 EXPECT_EQ(ERR_IO_PENDING,
9913 request.Request(
9914 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9915 SocketTag(),
9916 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9917 failed_on_default_network_callback_, callback_.callback()));
9918 EXPECT_FALSE(HasLiveSession(host_port_pair_));
9919 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9920
9921 host_resolver_->ResolveAllPending();
9922 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_ADDRESS_IN_USE));
9923}
9924
9925// With dns race experiment on, dns resolve async, stale used and connection
9926// returns error, dns no match, new connection is established
9927TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSNoMatch) {
Zhongyi Shi967d2f12019-02-08 20:58:539928 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309929 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9930 Initialize();
9931 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9932 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9933
9934 // Set an address in host resolver.
9935 host_resolver_->set_ondemand_mode(true);
9936 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9937 kNonCachedIPAddress, "");
9938
9939 // Set up a different address in stale resolver cache.
9940 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9941 HostCache::Entry entry(OK,
9942 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9943 HostCache::Entry::SOURCE_DNS);
9944 base::TimeDelta zero;
9945 HostCache* cache = host_resolver_->GetHostCache();
9946 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9947 // Expire the cache
9948 cache->OnNetworkChange();
9949
9950 // Add failure for the stale connection.
9951 MockQuicData quic_data;
9952 quic_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
9953 quic_data.AddSocketDataToFactory(socket_factory_.get());
9954
9955 MockQuicData quic_data2;
9956 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9957 quic_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9958 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9959
9960 QuicStreamRequest request(factory_.get());
9961 EXPECT_EQ(ERR_IO_PENDING,
9962 request.Request(
9963 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9964 SocketTag(),
9965 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9966 failed_on_default_network_callback_, callback_.callback()));
9967
9968 // Check that the stale connection fails.
9969 EXPECT_FALSE(HasLiveSession(host_port_pair_));
9970 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9971
9972 // Finish host resolution and check the job finishes ok.
9973 host_resolver_->ResolveAllPending();
9974 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9975
9976 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9977 EXPECT_TRUE(stream.get());
9978
9979 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9980
9981 EXPECT_EQ(
9982 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9983 kNonCachedIPAddress);
9984
9985 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
9986 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
9987}
9988
9989// With dns race experiment on, dns resolve async, stale used and connection
9990// returns error, dns no match, new connection error
9991TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSNoMatchError) {
Zhongyi Shi967d2f12019-02-08 20:58:539992 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309993 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9994 Initialize();
9995 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9996 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9997
9998 // Set an address in host resolver asynchronously.
9999 host_resolver_->set_ondemand_mode(true);
10000 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
10001 kNonCachedIPAddress, "");
10002
10003 // Set up a different address in the stale cache.
10004 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
10005 HostCache::Entry entry(OK,
10006 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
10007 HostCache::Entry::SOURCE_DNS);
10008 base::TimeDelta zero;
10009 HostCache* cache = host_resolver_->GetHostCache();
10010 cache->Set(key, entry, base::TimeTicks::Now(), zero);
10011 // Expire the cache
10012 cache->OnNetworkChange();
10013
10014 // Add failure for stale connection.
10015 MockQuicData quic_data;
10016 quic_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
10017 quic_data.AddSocketDataToFactory(socket_factory_.get());
10018
10019 // Add failure for resolved dns connection.
10020 MockQuicData quic_data2;
10021 quic_data2.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
10022 quic_data2.AddSocketDataToFactory(socket_factory_.get());
10023
10024 QuicStreamRequest request(factory_.get());
10025 EXPECT_EQ(ERR_IO_PENDING,
10026 request.Request(
10027 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
10028 SocketTag(),
10029 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
10030 failed_on_default_network_callback_, callback_.callback()));
10031
10032 // Check the stale connection fails.
10033 EXPECT_FALSE(HasLiveSession(host_port_pair_));
10034 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
10035
10036 // Check the resolved dns connection fails.
10037 host_resolver_->ResolveAllPending();
10038 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_ADDRESS_IN_USE));
10039}
10040
10041// With dns race experiment on, dns resolve async and stale connect async, dns
10042// resolve returns error and then preconnect finishes
10043TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceResolveAsyncErrorStaleAsync) {
Zhongyi Shi967d2f12019-02-08 20:58:5310044 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:3010045 host_resolver_ = std::make_unique<MockCachingHostResolver>();
10046 Initialize();
10047 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
10048 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
10049
10050 // Add asynchronous failure in host resolver.
10051 host_resolver_->set_ondemand_mode(true);
10052 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
10053 factory_->set_require_confirmation(true);
10054 crypto_client_stream_factory_.set_handshake_mode(
10055 MockCryptoClientStream::ZERO_RTT);
10056
10057 // Set up an address in stale resolver cache.
10058 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
10059 HostCache::Entry entry(OK,
10060 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
10061 HostCache::Entry::SOURCE_DNS);
10062 base::TimeDelta zero;
10063 HostCache* cache = host_resolver_->GetHostCache();
10064 cache->Set(key, entry, base::TimeTicks::Now(), zero);
10065 // Expire the cache
10066 cache->OnNetworkChange();
10067
10068 // Socket data for stale connection which is supposed to disconnect.
10069 MockQuicData quic_data;
10070 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
10071 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_INITIAL);
10072 quic_data.AddWrite(
Renjief5fcb172019-02-05 01:59:3310073 SYNCHRONOUS,
10074 client_maker_.MakeConnectionClosePacket(
10075 1, true, quic::QUIC_STALE_CONNECTION_CANCELLED, "net error"));
Renjiea0cb4a2c2018-09-26 23:37:3010076 quic_data.AddSocketDataToFactory(socket_factory_.get());
10077
10078 QuicStreamRequest request(factory_.get());
10079 EXPECT_EQ(ERR_IO_PENDING,
10080 request.Request(
10081 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
10082 SocketTag(),
10083 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
10084 failed_on_default_network_callback_, callback_.callback()));
10085
10086 // host resolution returned but stale connection hasn't finished yet.
10087 host_resolver_->ResolveAllPending();
10088 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
10089
10090 EXPECT_TRUE(quic_data.AllReadDataConsumed());
10091 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
10092}
10093
10094// With dns race experiment on, dns resolve async and stale connect async, dns
Renjiea0cb4a2c2018-09-26 23:37:3010095// resolve returns error and then preconnect fails.
10096TEST_P(QuicStreamFactoryTest,
10097 ResultAfterDNSRaceResolveAsyncErrorStaleAsyncError) {
Zhongyi Shi967d2f12019-02-08 20:58:5310098 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:3010099 host_resolver_ = std::make_unique<MockCachingHostResolver>();
10100 Initialize();
10101 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
10102 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
10103
10104 // Add asynchronous failure to host resolver.
10105 host_resolver_->set_ondemand_mode(true);
10106 factory_->set_require_confirmation(true);
10107 crypto_client_stream_factory_.set_handshake_mode(
10108 MockCryptoClientStream::ZERO_RTT);
10109 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
10110
10111 // Set up an address in stale resolver cache.
10112 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
10113 HostCache::Entry entry(OK,
10114 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
10115 HostCache::Entry::SOURCE_DNS);
10116 base::TimeDelta zero;
10117 HostCache* cache = host_resolver_->GetHostCache();
10118 cache->Set(key, entry, base::TimeTicks::Now(), zero);
10119 // Expire the cache
10120 cache->OnNetworkChange();
10121
10122 MockQuicData quic_data;
10123 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
10124 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_INITIAL);
10125 quic_data.AddWrite(
Renjief5fcb172019-02-05 01:59:3310126 SYNCHRONOUS,
10127 client_maker_.MakeConnectionClosePacket(
10128 1, true, quic::QUIC_STALE_CONNECTION_CANCELLED, "net error"));
Renjiea0cb4a2c2018-09-26 23:37:3010129 quic_data.AddSocketDataToFactory(socket_factory_.get());
10130
10131 QuicStreamRequest request(factory_.get());
10132 EXPECT_EQ(ERR_IO_PENDING,
10133 request.Request(
10134 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
10135 SocketTag(),
10136 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
10137 failed_on_default_network_callback_, callback_.callback()));
10138
10139 // Host Resolution returns failure but stale connection hasn't finished.
10140 host_resolver_->ResolveAllPending();
10141
10142 // Check that the final error is on resolution failure.
10143 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
10144
10145 EXPECT_TRUE(quic_data.AllReadDataConsumed());
10146}
10147
10148// With dns race experiment on, test that host resolution callback behaves
10149// normal as experiment is not on
10150TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsync) {
Zhongyi Shi967d2f12019-02-08 20:58:5310151 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:3010152 host_resolver_ = std::make_unique<MockCachingHostResolver>();
10153 Initialize();
10154 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
10155 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
10156
10157 host_resolver_->set_ondemand_mode(true);
10158 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
10159 kNonCachedIPAddress, "");
10160
10161 MockQuicData quic_data;
10162 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
10163 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
10164 quic_data.AddSocketDataToFactory(socket_factory_.get());
10165
10166 QuicStreamRequest request(factory_.get());
10167 EXPECT_EQ(ERR_IO_PENDING,
10168 request.Request(
10169 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
10170 SocketTag(),
10171 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
10172 failed_on_default_network_callback_, callback_.callback()));
10173
10174 // Check that expect_on_host_resolution_ is properlly set.
10175 TestCompletionCallback host_resolution_callback;
10176 EXPECT_TRUE(
10177 request.WaitForHostResolution(host_resolution_callback.callback()));
10178 base::RunLoop().RunUntilIdle();
10179 EXPECT_FALSE(host_resolution_callback.have_result());
10180
10181 host_resolver_->ResolveAllPending();
10182 EXPECT_THAT(host_resolution_callback.WaitForResult(), IsOk());
10183
10184 // Check that expect_on_host_resolution_ is flipped back.
10185 EXPECT_FALSE(
10186 request.WaitForHostResolution(host_resolution_callback.callback()));
10187
10188 EXPECT_TRUE(quic_data.AllReadDataConsumed());
10189 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
10190}
10191
Paul Jensen8e3c5d32018-02-19 17:06:3310192// Test that QuicStreamRequests with similar and different tags results in
10193// reused and unique QUIC streams using appropriately tagged sockets.
10194TEST_P(QuicStreamFactoryTest, Tag) {
10195 MockTaggingClientSocketFactory* socket_factory =
10196 new MockTaggingClientSocketFactory();
10197 socket_factory_.reset(socket_factory);
10198 Initialize();
10199 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
10200 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
10201
10202 // Prepare to establish two QUIC sessions.
10203 MockQuicData socket_data;
10204 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:4310205 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Paul Jensen8e3c5d32018-02-19 17:06:3310206 socket_data.AddSocketDataToFactory(socket_factory_.get());
10207 MockQuicData socket_data2;
10208 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:4310209 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Paul Jensen8e3c5d32018-02-19 17:06:3310210 socket_data2.AddSocketDataToFactory(socket_factory_.get());
10211
10212#if defined(OS_ANDROID)
10213 SocketTag tag1(SocketTag::UNSET_UID, 0x12345678);
10214 SocketTag tag2(getuid(), 0x87654321);
10215#else
10216 // On non-Android platforms we can only use the default constructor.
10217 SocketTag tag1, tag2;
10218#endif
10219
10220 // Request a stream with |tag1|.
10221 QuicStreamRequest request1(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:0310222 int rv = request1.Request(
10223 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, tag1,
10224 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
10225 failed_on_default_network_callback_, callback_.callback());
Paul Jensen8e3c5d32018-02-19 17:06:3310226 EXPECT_THAT(callback_.GetResult(rv), IsOk());
10227 EXPECT_EQ(socket_factory->GetLastProducedUDPSocket()->tag(), tag1);
10228 EXPECT_TRUE(socket_factory->GetLastProducedUDPSocket()
10229 ->tagged_before_data_transferred());
10230 std::unique_ptr<QuicChromiumClientSession::Handle> stream1 =
10231 request1.ReleaseSessionHandle();
10232 EXPECT_TRUE(stream1);
10233 EXPECT_TRUE(stream1->IsConnected());
10234
10235 // Request a stream with |tag1| and verify underlying session is reused.
10236 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:0310237 rv = request2.Request(
10238 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, tag1,
10239 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
10240 failed_on_default_network_callback_, callback_.callback());
Paul Jensen8e3c5d32018-02-19 17:06:3310241 EXPECT_THAT(callback_.GetResult(rv), IsOk());
10242 std::unique_ptr<QuicChromiumClientSession::Handle> stream2 =
10243 request2.ReleaseSessionHandle();
10244 EXPECT_TRUE(stream2);
10245 EXPECT_TRUE(stream2->IsConnected());
10246 EXPECT_TRUE(stream2->SharesSameSession(*stream1));
10247
10248 // Request a stream with |tag2| and verify a new session is created.
10249 QuicStreamRequest request3(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:0310250 rv = request3.Request(
10251 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, tag2,
10252 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
10253 failed_on_default_network_callback_, callback_.callback());
Paul Jensen8e3c5d32018-02-19 17:06:3310254 EXPECT_THAT(callback_.GetResult(rv), IsOk());
10255 EXPECT_EQ(socket_factory->GetLastProducedUDPSocket()->tag(), tag2);
10256 EXPECT_TRUE(socket_factory->GetLastProducedUDPSocket()
10257 ->tagged_before_data_transferred());
10258 std::unique_ptr<QuicChromiumClientSession::Handle> stream3 =
10259 request3.ReleaseSessionHandle();
10260 EXPECT_TRUE(stream3);
10261 EXPECT_TRUE(stream3->IsConnected());
10262#if defined(OS_ANDROID)
10263 EXPECT_FALSE(stream3->SharesSameSession(*stream1));
10264#else
10265 // Same tag should reuse session.
10266 EXPECT_TRUE(stream3->SharesSameSession(*stream1));
10267#endif
10268}
10269
[email protected]e13201d82012-12-12 05:00:3210270} // namespace test
[email protected]e13201d82012-12-12 05:00:3210271} // namespace net